f-spot-0.8.2/0000777000175000017500000000000011503407371013246 5ustar00rubenruben00000000000000f-spot-0.8.2/config.sub0000755000175000017500000010224011503362263015224 0ustar00rubenruben00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2009-04-17' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: f-spot-0.8.2/config.h.in0000644000175000017500000000445111503407370015270 0ustar00rubenruben00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* always defined to indicate that i18n is enabled */ #undef ENABLE_NLS /* Gettext package */ #undef GETTEXT_PACKAGE /* Define to 1 if you have the `bind_textdomain_codeset' function. */ #undef HAVE_BIND_TEXTDOMAIN_CODESET /* Define to 1 if you have the `dcgettext' function. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if your file defines LC_MESSAGES. */ #undef HAVE_LC_MESSAGES /* Define to 1 if you have the `jpeg' library (-ljpeg). */ #undef HAVE_LIBJPEG /* Define to 1 if you have the `lcms' library (-llcms). */ #undef HAVE_LIBLCMS /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION f-spot-0.8.2/install-sh0000755000175000017500000003253711503362263015260 0ustar00rubenruben00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: f-spot-0.8.2/docs/0000777000175000017500000000000011503407426014177 5ustar00rubenruben00000000000000f-spot-0.8.2/docs/Makefile.in0000644000175000017500000003356411503407230016244 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = docs DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign docs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/docs/Makefile.am0000644000175000017500000000000011417267574016231 0ustar00rubenruben00000000000000f-spot-0.8.2/gnome-doc-utils.make0000644000175000017500000005410611256066522017121 0ustar00rubenruben00000000000000# gnome-doc-utils.make - make magic for building documentation # Copyright (C) 2004-2005 Shaun McCance # # 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. ################################################################################ ## @@ Generating Header Files ## @ DOC_H_FILE ## The name of the header file to generate DOC_H_FILE ?= ## @ DOC_H_DOCS ## The input DocBook files for generating the header file DOC_H_DOCS ?= $(DOC_H_FILE): $(DOC_H_DOCS); @rm -f $@.tmp; touch $@.tmp; echo 'const gchar* documentation_credits[] = {' >> $@.tmp list='$(DOC_H_DOCS)'; for doc in $$list; do \ xmlpath="`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`:$(srcdir)/`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`"; \ if ! test -f "$$doc"; then doc="$(srcdir)/$$doc"; fi; \ xsltproc --path "$$xmlpath" $(_credits) $$doc; \ done | sort | uniq \ | awk 'BEGIN{s=""}{n=split($$0,w,"<");if(s!=""&&s!=substr(w[1],1,length(w[1])-1)){print s};if(n>1){print $$0;s=""}else{s=$$0}};END{if(s!=""){print s}}' \ | sed -e 's/\\/\\\\/' -e 's/"/\\"/' -e 's/\(.*\)/\t"\1",/' >> $@.tmp echo ' NULL' >> $@.tmp echo '};' >> $@.tmp echo >> $@.tmp list='$(DOC_H_DOCS)'; for doc in $$list; do \ xmlpath="`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`:$(srcdir)/`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`"; \ if ! test -f "$$doc"; then doc="$(srcdir)/$$doc"; fi; \ docid=`echo "$$doc" | sed -e 's/.*\/\([^/]*\)\.xml/\1/' \ | sed -e 's/[^a-zA-Z_]/_/g' | tr 'a-z' 'A-Z'`; \ echo $$xmlpath; \ ids=`xsltproc --xinclude --path "$$xmlpath" $(_ids) $$doc`; \ for id in $$ids; do \ echo '#define HELP_'`echo $$docid`'_'`echo $$id \ | sed -e 's/[^a-zA-Z_]/_/g' | tr 'a-z' 'A-Z'`' "'$$id'"' >> $@.tmp; \ done; \ echo >> $@.tmp; \ done; cp $@.tmp $@ && rm -f $@.tmp dist-check-gdu: if !HAVE_GNOME_DOC_UTILS @echo "*** GNOME Doc Utils must be installed in order to make dist" @false endif .PHONY: dist-doc-header dist-doc-header: $(DOC_H_FILE) @if test -f "$(DOC_H_FILE)"; then d=; else d="$(srcdir)/"; fi; \ echo "$(INSTALL_DATA) $${d}$(DOC_H_FILE) $(distdir)/$(DOC_H_FILE)"; \ $(INSTALL_DATA) "$${d}$(DOC_H_FILE)" "$(distdir)/$(DOC_H_FILE)"; doc-dist-hook: dist-check-gdu $(if $(DOC_H_FILE),dist-doc-header) .PHONY: clean-doc-header _clean_doc_header = $(if $(DOC_H_FILE),clean-doc-header) clean-local: $(_clean_doc_header) distclean-local: $(_clean_doc_header) mostlyclean-local: $(_clean_doc_header) maintainer-clean-local: $(_clean_doc_header) clean-doc-header: rm -f $(DOC_H_FILE) all: $(DOC_H_FILE) ################################################################################ ## @@ Generating Documentation Files ## @ DOC_MODULE ## The name of the document being built DOC_MODULE ?= ## @ DOC_ID ## The unique identifier for a Mallard document DOC_ID ?= ## @ DOC_PAGES ## Page files in a Mallard document DOC_PAGES ?= ## @ DOC_ENTITIES ## Files included with a SYSTEM entity DOC_ENTITIES ?= ## @ DOC_INCLUDES ## Files included with XInclude DOC_INCLUDES ?= ## @ DOC_FIGURES ## Figures and other external data DOC_FIGURES ?= ## @ DOC_FORMATS ## The default formats to be built and installed DOC_FORMATS ?= docbook _DOC_REAL_FORMATS = $(if $(DOC_USER_FORMATS),$(DOC_USER_FORMATS),$(DOC_FORMATS)) ## @ DOC_LINGUAS ## The languages this document is translated into DOC_LINGUAS ?= _DOC_REAL_LINGUAS = $(if $(filter environment,$(origin LINGUAS)), \ $(filter $(LINGUAS),$(DOC_LINGUAS)), \ $(DOC_LINGUAS)) _DOC_ABS_SRCDIR = @abs_srcdir@ ################################################################################ ## Variables for Bootstrapping _xml2po ?= `which xml2po` _xml2po_mode = $(if $(DOC_ID),mallard,docbook) _db2html ?= `$(PKG_CONFIG) --variable db2html gnome-doc-utils` _db2omf ?= `$(PKG_CONFIG) --variable db2omf gnome-doc-utils` _malrng ?= `$(PKG_CONFIG) --variable malrng gnome-doc-utils` _chunks ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/chunks.xsl _credits ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/credits.xsl _ids ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/ids.xsl if ENABLE_SK _ENABLE_SK = true _skpkgdatadir ?= `scrollkeeper-config --pkgdatadir` _sklocalstatedir ?= `scrollkeeper-config --pkglocalstatedir` _skcontentslist ?= $(_skpkgdatadir)/Templates/C/scrollkeeper_cl.xml endif ################################################################################ ## @@ Rules for OMF Files db2omf_args = \ --stringparam db2omf.basename $(DOC_MODULE) \ --stringparam db2omf.format $(3) \ --stringparam db2omf.dtd \ $(shell xmllint --format $(2) | grep -h PUBLIC | head -n 1 \ | sed -e 's/.*PUBLIC \(\"[^\"]*\"\).*/\1/') \ --stringparam db2omf.lang $(notdir $(patsubst %/$(notdir $(2)),%,$(2))) \ --stringparam db2omf.omf_dir "$(OMF_DIR)" \ --stringparam db2omf.help_dir "$(HELP_DIR)" \ --stringparam db2omf.omf_in "$(_DOC_OMF_IN)" \ $(if $(_ENABLE_SK), \ --stringparam db2omf.scrollkeeper_cl "$(_skcontentslist)") \ $(_db2omf) $(2) ## @ _DOC_OMF_IN ## The OMF input file _DOC_OMF_IN = $(if $(DOC_MODULE),$(wildcard $(_DOC_ABS_SRCDIR)/$(DOC_MODULE).omf.in)) ## @ _DOC_OMF_DB ## The OMF files for DocBook output _DOC_OMF_DB = $(if $(_DOC_OMF_IN), \ $(foreach lc,C $(_DOC_REAL_LINGUAS),$(DOC_MODULE)-$(lc).omf)) $(_DOC_OMF_DB) : $(_DOC_OMF_IN) $(_DOC_OMF_DB) : $(DOC_MODULE)-%.omf : %/$(DOC_MODULE).xml @test "x$(_ENABLE_SK)" != "xtrue" -o -f "$(_skcontentslist)" || { \ echo "The file '$(_skcontentslist)' does not exist." >&2; \ echo "Please check your ScrollKeeper installation." >&2; \ exit 1; } xsltproc -o $@ $(call db2omf_args,$@,$<,'docbook') || { rm -f "$@"; exit 1; } ## @ _DOC_OMF_HTML ## The OMF files for HTML output _DOC_OMF_HTML = $(if $(_DOC_OMF_IN), \ $(foreach lc,C $(_DOC_REAL_LINGUAS),$(DOC_MODULE)-html-$(lc).omf)) $(_DOC_OMF_HTML) : $(_DOC_OMF_IN) $(_DOC_OMF_HTML) : $(DOC_MODULE)-html-%.omf : %/$(DOC_MODULE).xml if ENABLE_SK @test "x$(_ENABLE_SK)" != "xtrue" -o -f "$(_skcontentslist)" || { \ echo "The file '$(_skcontentslist)' does not exist" >&2; \ echo "Please check your ScrollKeeper installation." >&2; \ exit 1; } endif xsltproc -o $@ $(call db2omf_args,$@,$<,'xhtml') || { rm -f "$@"; exit 1; } ## @ _DOC_OMF_ALL ## All OMF output files to be built # FIXME _DOC_OMF_ALL = \ $(if $(filter docbook,$(_DOC_REAL_FORMATS)),$(_DOC_OMF_DB)) \ $(if $(filter html HTML,$(_DOC_REAL_FORMATS)),$(_DOC_OMF_HTML)) .PHONY: omf omf: $(_DOC_OMF_ALL) ################################################################################ ## @@ C Locale Documents ## @ _DOC_C_MODULE ## The top-level documentation file in the C locale _DOC_C_MODULE = $(if $(DOC_MODULE),C/$(DOC_MODULE).xml) ## @ _DOC_C_PAGES ## Page files in a Mallard document in the C locale _DOC_C_PAGES = $(foreach page,$(DOC_PAGES),C/$(page)) ## @ _DOC_C_ENTITIES ## Files included with a SYSTEM entity in the C locale _DOC_C_ENTITIES = $(foreach ent,$(DOC_ENTITIES),C/$(ent)) ## @ _DOC_C_XINCLUDES ## Files included with XInclude in the C locale _DOC_C_INCLUDES = $(foreach inc,$(DOC_INCLUDES),C/$(inc)) ## @ _DOC_C_DOCS ## All documentation files in the C locale _DOC_C_DOCS = \ $(_DOC_C_ENTITIES) $(_DOC_C_INCLUDES) \ $(_DOC_C_PAGES) $(_DOC_C_MODULE) ## @ _DOC_C_DOCS_NOENT ## All documentation files in the C locale, ## except files included with a SYSTEM entity _DOC_C_DOCS_NOENT = \ $(_DOC_C_MODULE) $(_DOC_C_INCLUDES) \ $(_DOC_C_PAGES) ## @ _DOC_C_FIGURES ## All figures and other external data in the C locale _DOC_C_FIGURES = $(if $(DOC_FIGURES), \ $(foreach fig,$(DOC_FIGURES),C/$(fig)), \ $(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/C/figures/*.png))) ## @ _DOC_C_HTML ## All HTML documentation in the C locale # FIXME: probably have to shell escape to determine the file names _DOC_C_HTML = $(foreach f, \ $(shell xsltproc --xinclude \ --stringparam db.chunk.basename "$(DOC_MODULE)" \ $(_chunks) "C/$(DOC_MODULE).xml"), \ C/$(f).xhtml) ############################################################################### ## @@ Other Locale Documentation ## @ _DOC_POFILES ## The .po files used for translating the document _DOC_POFILES = $(if $(DOC_MODULE)$(DOC_ID), \ $(foreach lc,$(_DOC_REAL_LINGUAS),$(lc)/$(lc).po)) .PHONY: po po: $(_DOC_POFILES) ## @ _DOC_LC_MODULES ## The top-level documentation files in all other locales _DOC_LC_MODULES = $(if $(DOC_MODULE), \ $(foreach lc,$(_DOC_REAL_LINGUAS),$(lc)/$(DOC_MODULE).xml)) ## @ _DOC_LC_PAGES ## Page files in a Mallard document in all other locales _DOC_LC_PAGES = \ $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach page,$(_DOC_C_PAGES), \ $(lc)/$(notdir $(page)) )) ## @ _DOC_LC_XINCLUDES ## Files included with XInclude in all other locales _DOC_LC_INCLUDES = \ $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach inc,$(_DOC_C_INCLUDES), \ $(lc)/$(notdir $(inc)) )) ## @ _DOC_LC_HTML ## All HTML documentation in all other locales # FIXME: probably have to shell escape to determine the file names _DOC_LC_HTML = \ $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach doc,$(_DOC_C_HTML), \ $(lc)/$(notdir $(doc)) )) ## @ _DOC_LC_DOCS ## All documentation files in all other locales _DOC_LC_DOCS = \ $(_DOC_LC_MODULES) $(_DOC_LC_INCLUDES) $(_DOC_LC_PAGES) \ $(if $(filter html HTML,$(_DOC_REAL_FORMATS)),$(_DOC_LC_HTML)) ## @ _DOC_LC_FIGURES ## All figures and other external data in all other locales _DOC_LC_FIGURES = $(foreach lc,$(_DOC_REAL_LINGUAS), \ $(patsubst C/%,$(lc)/%,$(_DOC_C_FIGURES)) ) _DOC_SRC_FIGURES = \ $(foreach fig,$(_DOC_C_FIGURES), $(foreach lc,C $(_DOC_REAL_LINGUAS), \ $(wildcard $(srcdir)/$(lc)/$(patsubst C/%,%,$(fig))) )) $(_DOC_POFILES): @if ! test -d $(dir $@); then \ echo "mkdir $(dir $@)"; \ mkdir "$(dir $@)"; \ fi @if test ! -f $@ -a -f $(srcdir)/$@; then \ echo "cp $(srcdir)/$@ $@"; \ cp "$(srcdir)/$@" "$@"; \ fi; @docs=; \ list='$(_DOC_C_DOCS_NOENT)'; for doc in $$list; do \ docs="$$docs $(_DOC_ABS_SRCDIR)/$$doc"; \ done; \ if ! test -f $@; then \ echo "(cd $(dir $@) && \ $(_xml2po) -m $(_xml2po_mode) -e $$docs > $(notdir $@).tmp && \ cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp)"; \ (cd $(dir $@) && \ $(_xml2po) -m $(_xml2po_mode) -e $$docs > $(notdir $@).tmp && \ cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp); \ else \ echo "(cd $(dir $@) && \ $(_xml2po) -m $(_xml2po_mode) -e -u $(notdir $@) $$docs)"; \ (cd $(dir $@) && \ $(_xml2po) -m $(_xml2po_mode) -e -u $(notdir $@) $$docs); \ fi # FIXME: fix the dependancy # FIXME: hook xml2po up $(_DOC_LC_DOCS) : $(_DOC_POFILES) $(_DOC_LC_DOCS) : $(_DOC_C_DOCS) if ! test -d $(dir $@); then mkdir $(dir $@); fi if [ -f "C/$(notdir $@)" ]; then d="../"; else d="$(_DOC_ABS_SRCDIR)/"; fi; \ po="$(dir $@)$(patsubst %/$(notdir $@),%,$@).po"; \ if [ -f "$${po}" ]; then po="../$${po}"; else po="$(_DOC_ABS_SRCDIR)/$${po}"; fi; \ (cd $(dir $@) && \ $(_xml2po) -m $(_xml2po_mode) -e -p "$${po}" \ "$${d}C/$(notdir $@)" > $(notdir $@).tmp && \ cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp) ## @ _DOC_POT ## A pot file _DOC_POT = $(if $(DOC_MODULE),$(DOC_MODULE).pot) .PHONY: pot pot: $(_DOC_POT) $(_DOC_POT): $(_DOC_C_DOCS_NOENT) $(_xml2po) -m $(_xml2po_mode) -e -o $@ $^ ################################################################################ ## @@ All Documentation ## @ _DOC_HTML_ALL ## All HTML documentation, only if it's built _DOC_HTML_ALL = $(if $(filter html HTML,$(_DOC_REAL_FORMATS)), \ $(_DOC_C_HTML) $(_DOC_LC_HTML)) _DOC_HTML_TOPS = $(foreach lc,C $(_DOC_REAL_LINGUAS),$(lc)/$(DOC_MODULE).xhtml) $(_DOC_HTML_TOPS): $(_DOC_C_DOCS) $(_DOC_LC_DOCS) xsltproc -o $@ --xinclude --param db.chunk.chunk_top "false()" --stringparam db.chunk.basename "$(DOC_MODULE)" --stringparam db.chunk.extension ".xhtml" $(_db2html) $(patsubst %.xhtml,%.xml,$@) ################################################################################ ## All all: \ $(_DOC_C_DOCS) $(_DOC_LC_DOCS) \ $(_DOC_OMF_ALL) $(_DOC_DSK_ALL) \ $(_DOC_HTML_ALL) $(_DOC_POFILES) ################################################################################ ## Clean .PHONY: clean-doc-omf clean-doc-dsk clean-doc-lc clean-doc-dir clean-doc-omf: ; rm -f $(_DOC_OMF_DB) $(_DOC_OMF_HTML) clean-doc-dsk: ; rm -f $(_DOC_DSK_DB) $(_DOC_DSK_HTML) clean-doc-lc: rm -f $(_DOC_LC_DOCS) @list='$(_DOC_POFILES)'; for po in $$list; do \ if ! test "$$po" -ef "$(srcdir)/$$po"; then \ echo "rm -f $$po"; \ rm -f "$$po"; \ fi; \ done @for lc in C $(_DOC_REAL_LINGUAS); do \ if test -f "$$lc/.xml2po.mo"; then \ echo "rm -f $$lc/.xml2po.mo"; \ rm -f "$$lc/.xml2po.mo"; \ fi; \ done clean-doc-dir: clean-doc-lc @for lc in C $(_DOC_REAL_LINGUAS); do \ for dir in `find $$lc -depth -type d`; do \ if ! test $$dir -ef $(srcdir)/$$dir; then \ echo "rmdir $$dir"; \ rmdir "$$dir"; \ fi; \ done; \ done _clean_omf = $(if $(_DOC_OMF_IN),clean-doc-omf) _clean_dsk = $(if $(_DOC_DSK_IN),clean-doc-dsk) _clean_lc = $(if $(_DOC_REAL_LINGUAS),clean-doc-lc) _clean_dir = $(if $(DOC_MODULE)$(DOC_ID),clean-doc-dir) clean-local: \ $(_clean_omf) $(_clean_dsk) \ $(_clean_lc) $(_clean_dir) distclean-local: \ $(_clean_omf) $(_clean_dsk) \ $(_clean_lc) $(_clean_dir) mostlyclean-local: \ $(_clean_omf) $(_clean_dsk) \ $(_clean_lc) $(_clean_dir) maintainer-clean-local: \ $(_clean_omf) $(_clean_dsk) \ $(_clean_lc) $(_clean_dir) ################################################################################ ## Dist .PHONY: dist-doc-docs dist-doc-pages dist-doc-figs dist-doc-omf dist-doc-dsk doc-dist-hook: \ $(if $(DOC_MODULE)$(DOC_ID),dist-doc-docs) \ $(if $(_DOC_C_FIGURES),dist-doc-figs) \ $(if $(_DOC_OMF_IN),dist-doc-omf) # $(if $(_DOC_DSK_IN),dist-doc-dsk) dist-doc-docs: $(_DOC_C_DOCS) $(_DOC_LC_DOCS) $(_DOC_POFILES) @for lc in C $(_DOC_REAL_LINGUAS); do \ echo " $(mkinstalldirs) $(distdir)/$$lc"; \ $(mkinstalldirs) "$(distdir)/$$lc"; \ done @list='$(_DOC_C_DOCS) $(_DOC_LC_DOCS) $(_DOC_POFILES)'; \ for doc in $$list; do \ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ docdir=`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ if ! test -d "$(distdir)/$$docdir"; then \ echo "$(mkinstalldirs) $(distdir)/$$docdir"; \ $(mkinstalldirs) "$(distdir)/$$docdir"; \ fi; \ echo "$(INSTALL_DATA) $$d$$doc $(distdir)/$$doc"; \ $(INSTALL_DATA) "$$d$$doc" "$(distdir)/$$doc"; \ done dist-doc-figs: $(_DOC_SRC_FIGURES) @list='$(_DOC_C_FIGURES) $(_DOC_LC_FIGURES)'; \ for fig in $$list; do \ if test -f "$$fig"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$fig"; then \ figdir=`echo $$fig | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ if ! test -d "$(distdir)/$$figdir"; then \ echo "$(mkinstalldirs) $(distdir)/$$figdir"; \ $(mkinstalldirs) "$(distdir)/$$figdir"; \ fi; \ echo "$(INSTALL_DATA) $$d$$fig $(distdir)/$$fig"; \ $(INSTALL_DATA) "$$d$$fig" "$(distdir)/$$fig"; \ fi; \ done; dist-doc-omf: @if test -f "$(_DOC_OMF_IN)"; then d=; else d="$(srcdir)/"; fi; \ echo "$(INSTALL_DATA) $$d$(_DOC_OMF_IN) $(distdir)/$(notdir $(_DOC_OMF_IN))"; \ $(INSTALL_DATA) "$$d$(_DOC_OMF_IN)" "$(distdir)/$(notdir $(_DOC_OMF_IN))" dist-doc-dsk: @if test -f "$(_DOC_DSK_IN)"; then d=; else d="$(srcdir)/"; fi; \ echo "$(INSTALL_DATA) $$d$(_DOC_DSK_IN) $(distdir)/$(notdir $(_DOC_DSK_IN))"; \ $(INSTALL_DATA) "$$d$(_DOC_DSK_IN)" "$(distdir)/$(notdir $(_DOC_DSK_IN))" ################################################################################ ## Check .PHONY: check-doc-docs check-doc-omf check: \ $(if $(DOC_MODULE),check-doc-docs) \ $(if $(DOC_ID),check-doc-pages) \ $(if $(_DOC_OMF_IN),check-doc-omf) check-doc-docs: $(_DOC_C_DOCS) $(_DOC_LC_DOCS) @for lc in C $(_DOC_REAL_LINGUAS); do \ if test -f "$$lc"; \ then d=; \ xmlpath="$$lc"; \ else \ d="$(srcdir)/"; \ xmlpath="$$lc:$(srcdir)/$$lc"; \ fi; \ echo "xmllint --noout --noent --path $$xmlpath --xinclude --postvalid $$d$$lc/$(DOC_MODULE).xml"; \ xmllint --noout --noent --path "$$xmlpath" --xinclude --postvalid "$$d$$lc/$(DOC_MODULE).xml"; \ done check-doc-pages: $(_DOC_C_PAGES) $(_DOC_LC_PAGES) for lc in C $(_DOC_REAL_LINGUAS); do \ if test -f "$$lc"; \ then d=; \ xmlpath="$$lc"; \ else \ d="$(srcdir)/"; \ xmlpath="$$lc:$(srcdir)/$$lc"; \ fi; \ for page in $(DOC_PAGES); do \ echo "xmllint --noout --noent --path $$xmlpath --xinclude --relaxng $(_malrng) $$d$$lc/$$page"; \ xmllint --noout --noent --path "$$xmlpath" --xinclude --relaxng "$(_malrng)" "$$d$$lc/$$page"; \ done; \ done check-doc-omf: $(_DOC_OMF_ALL) @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ echo "xmllint --noout --xinclude --dtdvalid 'http://scrollkeeper.sourceforge.net/dtds/scrollkeeper-omf-1.0/scrollkeeper-omf.dtd' $$omf"; \ xmllint --noout --xinclude --dtdvalid 'http://scrollkeeper.sourceforge.net/dtds/scrollkeeper-omf-1.0/scrollkeeper-omf.dtd' $$omf; \ done ################################################################################ ## Install .PHONY: install-doc-docs install-doc-html install-doc-figs install-doc-omf install-doc-dsk _doc_install_dir = $(if $(DOC_ID),$(DOC_ID),$(DOC_MODULE)) install-data-local: \ $(if $(DOC_MODULE)$(DOC_ID),install-doc-docs) \ $(if $(_DOC_HTML_ALL),install-doc-html) \ $(if $(_DOC_C_FIGURES),install-doc-figs) \ $(if $(_DOC_OMF_IN),install-doc-omf) # $(if $(_DOC_DSK_IN),install-doc-dsk) install-doc-docs: @for lc in C $(_DOC_REAL_LINGUAS); do \ echo "$(mkinstalldirs) $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$lc"; \ $(mkinstalldirs) $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$lc; \ done @list='$(_DOC_C_DOCS) $(_DOC_LC_DOCS)'; for doc in $$list; do \ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ docdir="$$lc/"`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ docdir="$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$docdir"; \ if ! test -d "$$docdir"; then \ echo "$(mkinstalldirs) $$docdir"; \ $(mkinstalldirs) "$$docdir"; \ fi; \ echo "$(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ $(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc; \ done install-doc-figs: @list='$(patsubst C/%,%,$(_DOC_C_FIGURES))'; for fig in $$list; do \ for lc in C $(_DOC_REAL_LINGUAS); do \ figsymlink=false; \ if test -f "$$lc/$$fig"; then \ figfile="$$lc/$$fig"; \ elif test -f "$(srcdir)/$$lc/$$fig"; then \ figfile="$(srcdir)/$$lc/$$fig"; \ else \ figsymlink=true; \ fi; \ figdir="$$lc/"`echo $$fig | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ figdir="$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$figdir"; \ if ! test -d "$$figdir"; then \ echo "$(mkinstalldirs) $$figdir"; \ $(mkinstalldirs) "$$figdir"; \ fi; \ figbase=`echo $$fig | sed -e 's/^.*\///'`; \ if $$figsymlink; then \ echo "cd $$figdir && $(LN_S) -f ../../C/$$fig $$figbase"; \ ( cd "$$figdir" && $(LN_S) -f "../../C/$$fig" "$$figbase" ); \ else \ echo "$(INSTALL_DATA) $$figfile $$figdir$$figbase"; \ $(INSTALL_DATA) "$$figfile" "$$figdir$$figbase"; \ fi; \ done; \ done install-doc-html: echo install-html install-doc-omf: $(mkinstalldirs) $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir) @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ echo "$(INSTALL_DATA) $$omf $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ $(INSTALL_DATA) $$omf $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf; \ done @if test "x$(_ENABLE_SK)" = "xtrue"; then \ echo "scrollkeeper-update -p $(DESTDIR)$(_sklocalstatedir) -o $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)"; \ scrollkeeper-update -p "$(DESTDIR)$(_sklocalstatedir)" -o "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)"; \ fi; install-doc-dsk: echo install-dsk ################################################################################ ## Uninstall .PHONY: uninstall-doc-docs uninstall-doc-html uninstall-doc-figs uninstall-doc-omf uninstall-doc-dsk uninstall-local: \ $(if $(DOC_MODULE)$(DOC_ID),uninstall-doc-docs) \ $(if $(_DOC_HTML_ALL),uninstall-doc-html) \ $(if $(_DOC_C_FIGURES),uninstall-doc-figs) \ $(if $(_DOC_OMF_IN),uninstall-doc-omf) # $(if $(_DOC_DSK_IN),uninstall-doc-dsk) uninstall-doc-docs: @list='$(_DOC_C_DOCS) $(_DOC_LC_DOCS)'; for doc in $$list; do \ echo " rm -f $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ rm -f "$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ done uninstall-doc-figs: @list='$(_DOC_C_FIGURES) $(_DOC_LC_FIGURES)'; for fig in $$list; do \ echo "rm -f $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$fig"; \ rm -f "$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$fig"; \ done; uninstall-doc-omf: @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ if test "x$(_ENABLE_SK)" = "xtrue"; then \ echo "scrollkeeper-uninstall -p $(_sklocalstatedir) $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ scrollkeeper-uninstall -p "$(_sklocalstatedir)" "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ fi; \ echo "rm -f $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ rm -f "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ done f-spot-0.8.2/f-spot.schemas.in0000644000175000017500000002445011417267576016450 0ustar00rubenruben00000000000000 /schemas/desktop/gnome/f-spot/ui/gtkrc /desktop/gnome/f-spot/ui/gtkrc string Path to custom gtkrc for theming F-Spot. Path to custom gtkrc for theming F-Spot. /schemas/desktop/gnome/f-spot/ui/maximized /desktop/gnome/f-spot/ui/maximized bool false Maximize the main window. Maximize the main window. /schemas/desktop/gnome/f-spot/ui/main_window_width /desktop/gnome/f-spot/ui/main_window_width int 640 Width of the main window. The width dimension to use for the main window. /schemas/desktop/gnome/f-spot/ui/main_window_height /desktop/gnome/f-spot/ui/main_window_height int 480 Height of the main window. The height dimension to use for the main window. /schemas/desktop/gnome/f-spot/ui/main_window_x /desktop/gnome/f-spot/ui/main_window_x int X position of the main window. The X position to use for the main window. /schemas/desktop/gnome/f-spot/ui/main_window_y /desktop/gnome/f-spot/ui/main_window_y int Y position of the main window. The Y position to use for the main window. /schemas/desktop/gnome/f-spot/ui/show_dates /desktop/gnome/f-spot/ui/show_dates bool true Show dates in the thumbnail view. Show dates in the thumbnail view. /schemas/desktop/gnome/f-spot/ui/show_tags /desktop/gnome/f-spot/ui/show_tags bool true Show tags in the thumbnail view. Show tags in the thumbnail view. /schemas/desktop/gnome/f-spot/ui/tag_icon_size /desktop/gnome/f-spot/ui/tag_icon_size int 24 Size of the tag icons shown in the sidebar. Size of the tag icons shown in the sidebar. /schemas/desktop/gnome/f-spot/ui/show_ratings /desktop/gnome/f-spot/ui/show_ratings bool true Show ratings in the thumbnail view. Show ratings in the thumbnail view. /schemas/desktop/gnome/f-spot/ui/show_filmstrip /desktop/gnome/f-spot/ui/show_filmstrip bool true Show the filmstrip in the main window. Show the filmstrip in the main window. /schemas/desktop/gnome/f-spot/ui/filmstrip_orientation /desktop/gnome/f-spot/ui/filmstrip_orientation int 0 The orientation of the filmstrip. The orientation of the filmstrip, if shown. /schemas/desktop/gnome/f-spot/ui/show_timeline /desktop/gnome/f-spot/ui/show_timeline bool true Show the timeline in the main window. Show the timeline in the main window. /schemas/desktop/gnome/f-spot/ui/show_toolbar /desktop/gnome/f-spot/ui/show_toolbar bool true Show the toolbar in the main window. Show the toolbar in the main window. /schemas/desktop/gnome/f-spot/ui/show_sidebar /desktop/gnome/f-spot/ui/show_sidebar bool true Show the sidebar in the main window. Show the sidebar in the main window. /schemas/desktop/gnome/f-spot/ui/sidebar_size /desktop/gnome/f-spot/ui/sidebar_size int 130 The size of the sidebar in the main window. The size (width) of the sidebar in the main window. /schemas/desktop/gnome/f-spot/ui/import_window_width /desktop/gnome/f-spot/ui/import_window_width int 640 Width of the import dialog. The width dimension to use for the import dialog. /schemas/desktop/gnome/f-spot/ui/import_window_height /desktop/gnome/f-spot/ui/import_window_height int 480 Height of the import dialog. The height dimension to use for the import dialog. /schemas/desktop/gnome/f-spot/ui/import_window_pane_position /desktop/gnome/f-spot/ui/import_window_pane_position int 400 Width of the preview image pane in the import dialog. Width of the preview image pane in the import dialog. /schemas/desktop/gnome/f-spot/ui/viewer_maximized /desktop/gnome/f-spot/ui/viewer_maximized bool false Maximize the photo viewer window. Maximize the photo viewer window. /schemas/desktop/gnome/f-spot/ui/viewer_width /desktop/gnome/f-spot/ui/viewer_width int 640 Width of the photo viewer window. The width dimension to use for the photo viewer window. /schemas/desktop/gnome/f-spot/ui/viewer_height /desktop/gnome/f-spot/ui/viewer_height int 480 Height of the photo viewer window. The height dimension to use for the photo viewer window. /schemas/desktop/gnome/f-spot/ui/viewer_x /desktop/gnome/f-spot/ui/viewer_x int X position of the photo viewer window. The X position to use for the photo viewer window. /schemas/desktop/gnome/f-spot/ui/viewer_y /desktop/gnome/f-spot/ui/viewer_y int Y position of the photo viewer window. The Y position to use for the photo viewer window. /schemas/desktop/gnome/f-spot/ui/viewer_show_toolbar /desktop/gnome/f-spot/ui/viewer_show_toolbar bool true Show the toolbar in the photo viewer window. Show the toolbar in the photo viewer window. /schemas/desktop/gnome/f-spot/ui/viewer_show_filenames /desktop/gnome/f-spot/ui/viewer_show_filenames bool true Show the filename in the viewer window. Use the current photo's filename as the viewer window's title. /schemas/desktop/gnome/f-spot/viewer/interpolation /desktop/gnome/f-spot/viewer/interpolation bool true Interpolate image on zoom. Enable this to allow interpolation on zoomed images. /schemas/desktop/gnome/f-spot/viewer/transparency /desktop/gnome/f-spot/viewer/transparency string NONE Display of transparent parts. You can choose how to display transparent parts in images. This option has no effect on photos but setting this value to CHECK_PATTERN or CUSTOM_COLOR could be useful when viewing icons or other artwork with transparent parts. /schemas/desktop/gnome/f-spot/viewer/trans_color /desktop/gnome/f-spot/viewer/trans_color string #000000 The color to use for transparent parts. If the 'transparency' option is set, the color specified in this option will be used as the transparent color when viewing images. f-spot-0.8.2/MAINTAINERS0000644000175000017500000000044311417267574014755 0ustar00rubenruben00000000000000Ruben Vermeersch E-mail: ruben@savanne.be Userid: rubenv Larry Ewing E-mail: lewing@novell.com Userid: lewing Stephane Delcroix E-mail: stephane@delcroix.org Userid: sdelcroix Gabriel Burt E-mail: gabriel.burt@gmail.com Userid: gburt In memory of Ettore Perazzoli f-spot-0.8.2/intltool-extract.in0000644000175000017500000000000011503362226017073 0ustar00rubenruben00000000000000f-spot-0.8.2/icon-theme-installer0000755000175000017500000001224411417267576017235 0ustar00rubenruben00000000000000#!/bin/bash # icon-theme-installer # Copyright (C) 2006 Novell, Inc. # Written by Aaron Bockover # Licensed under the MIT/X11 license # # This script is meant to be invoked from within a Makefile/Makefile.am # in the install-data-local and uninstall-data sections. It handles the # task of properly installing icons into the icon theme. It requires a # few arguments to set up its environment, and a list of files to be # installed. The format of the file list is critical: # # , # # apps,music-player-banshee.svg # apps,music-player-banshee-16.png # apps,music-player-banshee-22.png # # is the icon theme category, for instance, apps, devices, # actions, emblems... # # must have a basename in the form of: # # proper-theme-name[-]. # # Where should be either nothing, which will default to scalable # or \-[0-9]{2}, which will expand to x. For example: # # music-player-banshee-16.png # # The here is -16 and will expand to 16x16 per the icon theme spec # # What follows is an example Makefile.am for icon theme installation: # # --------------- # theme=hicolor # themedir=$(datadir)/icons/$(theme) # theme_icons = \ # apps,music-player-banshee.svg \ # apps,music-player-banshee-16.png \ # apps,music-player-banshee-22.png \ # apps,music-player-banshee-24.png \ # apps,music-player-banshee-32.png # # install_icon_exec = $(top_srcdir)/build/icon-theme-installer -t $(theme) -s $(srcdir) -d "x$(DESTDIR)" -b $(themedir) -m "$(mkinstalldirs)" -x "$(INSTALL_DATA)" # install-data-local: # $(install_icon_exec) -i $(theme_icons) # # uninstall-hook: # $(install_icon_exec) -u $(theme_icons) # # MAINTAINERCLEANFILES = Makefile.in # EXTRA_DIST = $(wildcard *.svg *.png) # --------------- # # Arguments to this program: # # -i : Install # -u : Uninstall # -t : Theme name (hicolor) # -b : Theme installation dest directory [x$(DESTDIR)] - Always prefix # this argument with x; it will be stripped but will act as a # placeholder for zero $DESTDIRs (only set by packagers) # -d : Theme installation directory [$(hicolordir)] # -s : Source directory [$(srcdir)] # -m : Command to exec for directory creation [$(mkinstalldirs)] # -x : Command to exec for single file installation [$(INSTALL_DATA)] # : All remainging should be category,filename pairs while getopts "iut:b:d:s:m:x:" flag; do case "$flag" in i) INSTALL=yes ;; u) UNINSTALL=yes ;; t) THEME_NAME=$OPTARG ;; d) INSTALL_DEST_DIR=${OPTARG##x} ;; b) INSTALL_BASE_DIR=$OPTARG ;; s) SRC_DIR=$OPTARG ;; m) MKINSTALLDIRS_EXEC=$OPTARG ;; x) INSTALL_DATA_EXEC=$OPTARG ;; esac done shift $(($OPTIND - 1)) if test "x$INSTALL" = "xyes" -a "x$UNINSTALL" = "xyes"; then echo "Cannot pass both -i and -u" exit 1 elif test "x$INSTALL" = "x" -a "x$UNINSTALL" = "x"; then echo "Must path either -i or -u" exit 1 fi if test -z "$THEME_NAME"; then echo "Theme name required (-t hicolor)" exit 1 fi if test -z "$INSTALL_BASE_DIR"; then echo "Base theme directory required [-d \$(hicolordir)]" exit 1 fi if test ! -x $(echo "$MKINSTALLDIRS_EXEC" | cut -f1 -d' '); then echo "Cannot find '$MKINSTALLDIRS_EXEC'; You probably want to pass -m \$(mkinstalldirs)" exit 1 fi if test ! -x $(echo "$INSTALL_DATA_EXEC" | cut -f1 -d' '); then echo "Cannot find '$INSTALL_DATA_EXEC'; You probably want to pass -x \$(INSTALL_DATA)" exit 1 fi if test -z "$SRC_DIR"; then SRC_DIR=. fi for icon in $@; do size=$(echo $icon | sed s/[^0-9]*//g) category=$(echo $icon | cut -d, -f1) build_name=$(echo $icon | cut -d, -f2) install_name=$(echo $build_name | sed "s/[0-9]//g; s/-\././") install_name=$(basename $install_name) if test -z $size; then size=scalable; else size=${size}x${size}; fi install_dir=${INSTALL_DEST_DIR}${INSTALL_BASE_DIR}/$size/$category install_path=$install_dir/$install_name if test "x$INSTALL" = "xyes"; then echo "Installing $size $install_name into $THEME_NAME icon theme" $($MKINSTALLDIRS_EXEC $install_dir) || { echo "Failed to create directory $install_dir" exit 1 } $($INSTALL_DATA_EXEC $SRC_DIR/$build_name $install_path) || { echo "Failed to install $SRC_DIR/$build_name into $install_path" exit 1 } if test ! -e $install_path; then echo "Failed to install $SRC_DIR/$build_name into $install_path" exit 1 fi else if test -e $install_path; then echo "Removing $size $install_name from $THEME_NAME icon theme" rm $install_path || { echo "Failed to remove $install_path" exit 1 } fi fi done if test "x$INSTALL" = "xyes"; then gtk_update_icon_cache_bin="$((which gtk-update-icon-cache || echo /opt/gnome/bin/gtk-update-icon-cache)2>/dev/null)" gtk_update_icon_cache="$gtk_update_icon_cache_bin -f -t $INSTALL_BASE_DIR" if test -z "$INSTALL_DEST_DIR"; then if test -x $gtk_update_icon_cache_bin; then echo "Updating GTK icon cache" $gtk_update_icon_cache else echo "*** Icon cache not updated. Could not execute $gtk_update_icon_cache_bin" fi else echo "*** Icon cache not updated. After install, run this:" echo "*** $gtk_update_icon_cache" fi fi f-spot-0.8.2/configure.ac0000644000175000017500000002736511503407135015543 0ustar00rubenruben00000000000000dnl Granularly define the version components dnl Remember to also update the Display Version m4_define([fspot_version_major], [0]) m4_define([fspot_version_minor], [8]) m4_define([fspot_version_micro], [2]) dnl set to 0 when doing an official release m4_define([fspot_version_pre_release], [0]) m4_define([concat], $1$2$3$4) dnl create base version string m4_define([fspot_version], concat( fspot_version_major., fspot_version_minor., fspot_version_micro)) dnl create the release version m4_define([fspot_version], m4_if(fspot_version_pre_release, [0], fspot_version, concat(fspot_version, fspot_version_pre_release))) dnl this can sometimes differ manually m4_define([fspot_display_version], ["0.8.2"]) m4_define([fspot_api_version], [fspot_version_major.fspot_version_minor]) m4_define([fspot_asm_version], [fspot_api_version.0.0]) AC_PREREQ(2.52) AC_INIT([f-spot], fspot_version, [http://bugzilla.gnome.org/enter_bug.cgi?product=f-spot]) AM_INIT_AUTOMAKE([1.9 dist-bzip2 tar-ustar dist-zip foreign]) AM_MAINTAINER_MODE AM_CONFIG_HEADER([config.h]) AC_CONFIG_MACRO_DIR([build/m4]) AC_SUBST([ACLOCAL_AMFLAGS], ["-I build/m4/shamrock -I build/m4/f-spot -I build/m4/shave \${ACLOCAL_FLAGS}"]) IT_PROG_INTLTOOL([0.35.0]) AC_PROG_LIBTOOL AC_PROG_INSTALL dnl How to configure for distcheck DISTCHECK_CONFIGURE_FLAGS="--disable-docs --enable-release" AC_SUBST(DISTCHECK_CONFIGURE_FLAGS) dnl Export Version Info AC_SUBST([API_VERSION], [fspot_api_version]) AC_SUBST([ASM_VERSION], [fspot_asm_version]) AC_SUBST([DISPLAY_VERSION], [fspot_display_version]) dnl Expansions SHAMROCK_EXPAND_LIBDIR SHAMROCK_EXPAND_BINDIR SHAMROCK_EXPAND_DATADIR dnl User help SHAMROCK_CHECK_GNOME_DOC_UTILS(0.17.3) dnl Mono and gmcs SHAMROCK_CHECK_MONO_MODULE(2.2) SHAMROCK_FIND_MONO_2_0_COMPILER SHAMROCK_FIND_MONO_RUNTIME SHAMROCK_CHECK_MONO_2_0_GAC_ASSEMBLIES([ Mono.Posix Mono.Simd System System.Runtime.Remoting System.Web System.Web.Services System.Data Mono.Cairo ICSharpCode.SharpZipLib ]) FSPOT_CHECK_LIBFSPOT FSPOT_CHECK_GTK_SHARP FSPOT_CHECK_GNOME_KEYRING_SHARP FSPOT_CHECK_FLICKRNET SHAMROCK_CHECK_NUNIT # ---------------------------------- dnl --- Check for mono and gmcs AC_PATH_PROG(MONO, mono) AC_PATH_PROG(MCS, gmcs) CS="C#" if test ! -x "$MCS"; then AC_MSG_ERROR([No $CS compiler found]) fi dnl --- Check for gapi programs AC_PATH_PROG(GAPI2FIXUP, gapi2-fixup, no) if test ! -x "$GAPI2FIXUP"; then AC_MSG_ERROR([No gapi post-processor found]) fi AC_PATH_PROG(GAPI2PARSER, gapi2-parser, no) if test ! -x "$GAPI2PARSER"; then AC_MSG_ERROR([No gapi parser found]) fi AC_PATH_PROG(GAPI2CODEGEN, gapi2-codegen, no) if test ! -x "$GAPI2CODEGEN"; then AC_MSG_ERROR([No gapi code generator found]) fi dnl -- Check for mono pc file AC_MSG_CHECKING([for mono.pc]) if test -z `$PKG_CONFIG --variable=prefix mono`; then AC_MSG_ERROR([missing the mono.pc file, usually found in the mono-devel package]) else AC_MSG_RESULT([found]) fi dnl --- Required libraries LIBGNOME_REQUIRED=2.2 LIBGNOMEUI_REQUIRED=2.2 GIO_REQUIRED=2.22.0 GTKSHARPBEANS_REQUIRED=2.13.92 GTKSHARP_REQUIRED=2.12.2 GTK_REQUIRED=2.14 NDESK_DBUS_REQUIRED=0.4.2 NDESK_DBUS_GLIB_REQUIRED=0.3.0 MONO_CAIRO_REQUIRED=1.2.5 CAIRO_REQUIRED=1.4.0 LCMS_REQUIRED=1.12 MONOADDINS_REQUIRED=0.3 PKG_CHECK_MODULES(F, libgnome-2.0 >= $LIBGNOME_REQUIRED libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED gtk+-2.0 >= $GTK_REQUIRED mono-cairo >= $MONO_CAIRO_REQUIRED cairo >= $CAIRO_REQUIRED mono-addins >= $MONOADDINS_REQUIRED mono-addins-gui >= $MONOADDINS_REQUIRED mono-addins-setup >= $MONOADDINS_REQUIRED) AC_SUBST(F_CFLAGS) AC_SUBST(F_LIBS) PKG_CHECK_MODULES(GIO, gio-2.0 >= $GIO_REQUIRED) AC_SUBST(GIO_CFLAGS) AC_SUBST(GIO_LIBS) CSC_DEFINES="" PKG_CHECK_MODULES(GNOME_SHARP, gnome-sharp-2.0 >= 2.8) PKG_CHECK_MODULES(GLIBSHARP, glib-sharp-2.0 >= 2.12) if pkg-config --atleast-version=2.13.0 gtk-sharp-2.0 && pkg-config --max-version=2.14 gtk-sharp-2.0; then AC_MSG_ERROR([There's a svn version of gtk-sharp 2.13.x installed. Uninstall it.]) fi dnl --- GConf AC_PATH_PROG(GCONFTOOL, gconftool-2) AM_GCONF_SOURCE_2 PKG_CHECK_MODULES(GCONF_SHARP, gconf-sharp-2.0 >= $GTKSHARP_REQUIRED) if pkg-config --atleast-version=2.18 gconf-sharp-2.0; then CSC_DEFINES="$CSC_DEFINES -d:GCONF_SHARP_2_18" fi if pkg-config --atleast-version=2.20.2 gconf-sharp-2.0; then CSC_DEFINES="$CSC_DEFINES -d:GCONF_SHARP_2_20_2" fi if pkg-config --atleast-version=2.16 gtk+-2.0; then CSC_DEFINES="$CSC_DEFINES -d:GTK_2_16" fi AC_SUBST(CSC_DEFINES) dnl Mono.Addins libraries FSPOT_CHECK_MONO_ADDINS dnl -- dbus-sharp PKG_CHECK_MODULES(NDESK_DBUS, ndesk-dbus-1.0 >= $NDESK_DBUS_REQUIRED ndesk-dbus-glib-1.0 >= $NDESK_DBUS_GLIB_REQUIRED) AC_SUBST(NDESK_DBUS_LIBS) dnl --- libjpeg AC_CHECK_LIB(jpeg, jpeg_start_decompress, [], [AC_MSG_ERROR([libjpeg not found])], -lm) AC_CHECK_HEADER(jpeglib.h, , [AC_MSG_ERROR([libjpeg not found])]) LIBJPEG='-ljpeg' dnl --- lcms PKG_CHECK_MODULES(LCMS, lcms >= $LCMS_REQUIRED, [], [AC_CHECK_LIB(lcms, cmsCreateBCHSWabstractProfile, [], [AC_MSG_ERROR([liblcms not found])], -lm) AC_CHECK_HEADER(lcms.h, , [AC_MSG_ERROR([liblcms not found])]) LCMS_LIBS='-llcms' LCMS_CFLAGS='']) dnl --- libunique check PKG_CHECK_MODULES(UNIQUE, unique-1.0 >= 1.0) dnl --- Set up paths AC_ARG_WITH(turtle, [ --with-turtle=DIR set path to source directory for turtle]) AM_CONDITIONAL(WITH_TURTLE, test "x$with_turtle" != "xno") if test "x$with_turtle" != "xno"; then TURTLEDIR=$with_turtle AC_SUBST(TURTLEDIR) fi AC_ARG_WITH(gnome-screensaver, [ --with-gnome-screensaver=PREFIX set gnome gnome-screensaver prefix], gnome_screensaver_prefix=$with_gnome_screensaver, gnome_screensaver_prefix=$prefix) AC_ARG_WITH(gnome-screensaver-privlibexecdir, [ --with-gnome-screensaver-privlibexecdir=DIR set gnome-screensaver privlibexecdir], GNOME_SCREENSAVER_SAVERDIR=$with_gnome_screensaver_privlibexecdir, if test -d $gnome_screensaver_prefix/lib/gnome-screensaver; then GNOME_SCREENSAVER_SAVERDIR=$gnome_screensaver_prefix/lib/gnome-screensaver else GNOME_SCREENSAVER_SAVERDIR=$gnome_screensaver_prefix/libexec/gnome-screensaver fi) AC_ARG_WITH(gnome-screensaver-themesdir, [ --with-gnome-screensaver-themesdir=DIR set gnome-screensaver themesdir], GNOME_SCREENSAVER_THEMESDIR=$with_gnome_screensaver_themesdir, GNOME_SCREENSAVER_THEMESDIR=$gnome_screensaver_prefix/share/applications/screensavers ) AC_SUBST(GNOME_SCREENSAVER_SAVERDIR) AC_SUBST(GNOME_SCREENSAVER_THEMESDIR) ICONS_DIRECTORY=${datadir}/${PACKAGE}-${VERSION} AC_SUBST(ICONS_DIRECTORY) dnl -- Intl GETTEXT_PACKAGE=f-spot AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Gettext package]) AM_GLIB_GNU_GETTEXT dnl --- Prologue AC_SUBST(LIBJPEG) AC_SUBST(LCMS_LIBS) AC_SUBST(LCMS_CFLAGS) AC_SUBST(CFLAGS) AC_SUBST(CPPFLAGS) AC_SUBST(LDFLAGS) AC_CONFIG_FILES([src/Clients/MainApp/f-spot],[chmod +x src/Clients/MainApp/f-spot]) GNOME_ICON_THEME_PREFIX=`$PKG_CONFIG --variable=prefix gnome-icon-theme` AC_SUBST(GNOME_ICON_THEME_PREFIX) # ---------------------------------- AC_ARG_ENABLE(release, AC_HELP_STRING([--enable-release], [Use release configuration]), enable_release=yes, enable_release=`(test ! -d .svn && test ! -d .git) && echo "yes" || echo "no"`) AM_CONDITIONAL(ENABLE_RELEASE, test "x$enable_release" = "xyes") ENABLE_RELEASE=$enable_release AC_SUBST(ENABLE_RELEASE) if test "x$enable_release" = "xyes"; then GMCS_FLAGS="-define:RELEASE" # FIXME: Enable as soon as we rock sufficiently #else # GMCS_FLAGS="-warnaserror" fi AC_SUBST(GMCS_FLAGS) AM_CONDITIONAL(HYENA_PKG_CONFIG, false) AC_ARG_WITH(vendor-build-id, AC_HELP_STRING([--with-vendor-build-id=], [Set a vendor build ID, recommended for packagers]), [vendor_build_id="$withval"], [ test -d .git \ && vendor_build_id="git-checkout" \ || vendor_build_id="source-tarball" ]) BUILD_VENDOR_ID="$vendor_build_id" BUILD_HOST_OS="$host_os" BUILD_HOST_CPU="$host_cpu" BUILD_TIME=`date +"%F %T %Z"` AC_SUBST(BUILD_VENDOR_ID) AC_SUBST(BUILD_HOST_OS) AC_SUBST(BUILD_HOST_CPU) AC_SUBST(BUILD_TIME) SHAVE_INIT([build/m4/shave], [enable]) dnl generated files AC_OUTPUT([ Makefile build/Makefile build/m4/Makefile build/m4/shave/shave build/m4/shave/shave-libtool build/pkg-config/Makefile data/Makefile data/desktop-files/Makefile data/desktop-files/f-spot.desktop.in data/desktop-files/f-spot-view.desktop.in data/desktop-files/f-spot-import.desktop.in help/Makefile lib/gio-sharp/generator/Makefile lib/gio-sharp/gio/Makefile lib/gio-sharp/Makefile lib/GKeyFile/Makefile lib/gtk-sharp-beans/Makefile lib/Hyena/build/m4/Makefile lib/Hyena/build/Makefile lib/Hyena/build/pkg-config/Makefile lib/Hyena/Hyena.Data.Sqlite/Makefile lib/Hyena/Hyena.Gui/Makefile lib/Hyena/Hyena/Makefile lib/Hyena/Makefile lib/libfspot/Makefile lib/Makefile lib/Mono.Google/Makefile lib/Mono.Tabblo/Makefile lib/SmugMugNet/Makefile lib/TagLib/Makefile lib/unique-sharp/generator/Makefile lib/unique-sharp/Makefile lib/unique-sharp/unique/Makefile src/AssemblyInfo.cs src/Makefile src/Core/Makefile src/Core/FSpot.Bling/Makefile src/Core/FSpot.Cms/Makefile src/Core/FSpot.Cms/FSpot.Cms.dll.config src/Core/FSpot.Core/Makefile src/Core/FSpot.Core/FSpot.Core.dll.config src/Core/FSpot.Core/FSpot.Core/Defines.cs src/Core/FSpot.JobScheduler/Makefile src/Core/FSpot.Utils/Makefile src/Core/FSpot.Utils/FSpot.Utils.dll.config src/Core/FSpot.Query/Makefile src/Core/FSpot.Gui/Makefile src/Core/FSpot.Gui/FSpot.Gui.dll.config src/Core/FSpot.Platform/Makefile src/Clients/Makefile src/Clients/MainApp/Makefile src/Clients/MainApp/f-spot.exe.config src/Extensions/Makefile src/Extensions/Editors/Makefile src/Extensions/Editors/FSpot.Editors.Blackout/Makefile src/Extensions/Editors/FSpot.Editors.BW/Makefile src/Extensions/Editors/FSpot.Editors.Flip/Makefile src/Extensions/Editors/FSpot.Editors.Pixelate/Makefile src/Extensions/Editors/FSpot.Editors.Resize/Makefile src/Extensions/Exporters/Makefile src/Extensions/Exporters/FSpot.Exporters.CD/Makefile src/Extensions/Exporters/FSpot.Exporters.Flickr/Makefile src/Extensions/Exporters/FSpot.Exporters.Gallery/Makefile src/Extensions/Exporters/FSpot.Exporters.Facebook/Makefile src/Extensions/Exporters/FSpot.Exporters.Folder/Makefile src/Extensions/Exporters/FSpot.Exporters.SmugMug/Makefile src/Extensions/Exporters/FSpot.Exporters.Tabblo/Makefile src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/Makefile src/Extensions/Exporters/FSpot.Exporters.Zip/Makefile src/Extensions/Tools/Makefile src/Extensions/Tools/FSpot.Tools.RawPlusJpeg/Makefile src/Extensions/Tools/FSpot.Tools.ChangePhotoPath/Makefile src/Extensions/Tools/FSpot.Tools.DevelopInUFraw/Makefile src/Extensions/Tools/FSpot.Tools.LiveWebGallery/Makefile src/Extensions/Tools/FSpot.Tools.MergeDb/Makefile src/Extensions/Tools/FSpot.Tools.RetroactiveRoll/Makefile src/Extensions/Tools/FSpot.Tools.ScreensaverConfig/Makefile src/Extensions/Transitions/Makefile src/Extensions/Transitions/FSpot.Transitions.Cover/Makefile docs/Makefile icons/Makefile tools/Makefile po/Makefile.in tests/Makefile ]) cat <= 0.17.3) Run 'make' to build F-Spot. EOF if test -d ${expanded_libdir}/${PACKAGE}; then if test x$br = xyes; then echo; fi echo " WARNING: An existing F-Spot install is in ${expanded_libdir}/${PACKAGE}" echo " Remove the existing install before installing this build." echo " Installing over an existing install will cause conflicts!" echo fi f-spot-0.8.2/data/0000777000175000017500000000000011503407372014160 5ustar00rubenruben00000000000000f-spot-0.8.2/data/desktop-files/0000777000175000017500000000000011503407374016733 5ustar00rubenruben00000000000000f-spot-0.8.2/data/desktop-files/f-spot-view.desktop.in.in0000644000175000017500000000137611417267574023535 0ustar00rubenruben00000000000000[Desktop Entry] Version=1.0 _Name=F-Spot _GenericName=Photo Viewer _X-GNOME-FullName=F-Spot Photo Viewer TryExec=f-spot Exec=f-spot --view %U NoDisplay=true Icon=f-spot StartupNotify=false Terminal=false Type=Application X-GNOME-Bugzilla-Bugzilla=GNOME X-GNOME-Bugzilla-Product=f-spot X-GNOME-Bugzilla-Component=General X-GNOME-Bugzilla-Version=@VERSION@ MimeType=image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-dcraw;image/x-ciff;image/x-mrw;image/x-x3f;image/x-orf;image/x-nef;image/x-cr2;image/x-raf; f-spot-0.8.2/data/desktop-files/f-spot-import.desktop0000644000175000017500000002216311503407374023046 0ustar00rubenruben00000000000000[Desktop Entry] Version=1.0 Name=F-Spot Name[ar]=Ø¥Ù-سبوت Name[ast]=F-Spot Name[be@latin]=F-Spot Name[bg]=F-Spot Name[bn_IN]=F-Spot Name[ca]=F-Spot Name[ca@valencia]=F-Spot Name[cs]=F-Spot Name[da]=F-Spot Name[de]=F-Spot Name[dz]=ཨེཕ་-ཨིསི་པོཊི་ Name[el]=F-Spot Name[en_CA]=F-Spot Name[en_GB]=F-Spot Name[es]=F-Spot Name[et]=F-Spot Name[eu]=F-Spot Name[fa]=اÙÙ- Ø§ÙØ³Ù¾Ø§Øª Name[fi]=F-Spot Name[fr]=F-Spot Name[gl]=F-Spot Name[he]=F-Spot Name[hi]=à¤à¤«à¤¼ सà¥à¤ªà¥‰à¤Ÿ Name[hu]=F-Spot Name[id]=F-Spot Name[it]=F-Spot Name[ja]=F-Spot Name[ka]=F-სპáƒáƒ¢ Name[kn]=F-Spot Name[ko]=F-Spot Name[lt]=F-Spot Name[lv]=F-Spot Name[mk]=F-Spot Name[mr]=F-Spot Name[nb]=F-Spot Name[nds]=F-Spot Name[nl]=F-Spot Name[or]=F-Spot Name[pa]=F-ਸਪੋਟ Name[pl]=F-Spot Name[pt]=F-Spot Name[pt_BR]=F-Spot Name[ro]=F-Spot Name[ru]=F-Spot Name[sk]=F-Spot Name[sl]=F-Spot Name[sr]=Ф-број Name[sr@latin]=F-broj Name[sv]=F-Spot Name[ta]=F-Spot Name[te]=F-Spot Name[th]=F-Spot Name[uk]=F-Spot Name[vi]=F-Spot Name[zh_CN]=F-Spot Name[zh_HK]=F-Spot Name[zh_TW]=F-Spot GenericName=Photo Manager GenericName[ar]=مدير الصور GenericName[as]=ফটো মেনেজাৰ GenericName[ast]=Xestor Semeyes GenericName[be@latin]=KiraÅ­nik zdymkaÅ­ GenericName[bg]=Управление на Ñнимки GenericName[bn_IN]=ফটো পরিচালন বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾ GenericName[ca]=Gestor fotogràfic GenericName[ca@valencia]=Gestor fotogràfic GenericName[cs]=Správce fotografií GenericName[da]=FotohÃ¥ndtering GenericName[de]=Fotoverwaltung GenericName[dz]=དཔར་འཛིན་སà¾à¾±à½¼à½„་པ་ GenericName[el]=ΔιαχείÏιση φωτογÏαφιών GenericName[en_CA]=Photo Manager GenericName[en_GB]=Photo Manager GenericName[es]=Gestor de fotografías GenericName[et]=Fotode haldaja GenericName[eu]=Argazki-kudeatzailea GenericName[fa]=مدیر عکس GenericName[fi]=Valokuvien hallinta GenericName[fr]=Gestionnaire de photos GenericName[gl]=Xestor de fotos GenericName[gu]=ફોટો વà«àª¯àªµàª¸à«àª¥àª¾àªªàª• GenericName[he]=מנהל תמונות GenericName[hi]=फोटो पà¥à¤°à¤¬à¤‚धक GenericName[hu]=FényképkezelÅ‘ GenericName[id]=Manajer Foto GenericName[it]=Gestore di fotografie GenericName[ja]=写真マãƒãƒ¼ã‚¸ãƒ£ GenericName[ka]=ფáƒáƒ¢áƒ მენეჯერი GenericName[kn]=ಫೋಟೊ ವà³à²¯à²µà²¸à³à²¥à²¾à²ªà²• GenericName[ko]=사진 ê´€ë¦¬ìž GenericName[lt]=Fotografijų tvarkymo programa GenericName[lv]=FotogrÄfiju pÄrvaldnieks GenericName[mk]=Менаџер за Ñлики GenericName[mr]=फोटो वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤• GenericName[nb]=Fotobehandler GenericName[nl]=Fotobeheer GenericName[or]=ଫୋଟୋ ପରିଚାଳକ GenericName[pa]=ਫੋਟੋ ਮੈਨੇਜਰ GenericName[pl]=Menedżer zdjęć GenericName[pt]=Gestor de Fotografias GenericName[pt_BR]=Gerenciador de fotos GenericName[ro]=Manager Foto GenericName[ru]=Управление фотографиÑми GenericName[sk]=Správca fotiek GenericName[sl]=Upravljalnik fotografij GenericName[sr]=Фото албум GenericName[sr@latin]=Foto album GenericName[sv]=Fotohanterare GenericName[ta]=நிழறà¯à®ªà®Ÿ மேலாளர௠GenericName[te]=ఛాయాచితà±à°° నిరà±à°µà°¾à°¹à°¿à°• GenericName[th]=โปรà¹à¸à¸£à¸¡à¸ˆà¸±à¸”à¸à¸²à¸£à¸ à¸²à¸žà¸–่าย GenericName[uk]=ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ñ–Ñми GenericName[vi]=Bá»™ Quản Lý Ảnh Chụp GenericName[zh_CN]=照片管ç†å™¨ GenericName[zh_HK]=相片管ç†å“¡ GenericName[zh_TW]=相片管ç†å“¡ X-GNOME-FullName=F-Spot Photo Manager X-GNOME-FullName[ar]=مدير الصور Ø¥Ù-سبوت X-GNOME-FullName[as]=F-Spot ফটো মেনেজাৰ X-GNOME-FullName[ast]=Xestor Semeyes F-Spot X-GNOME-FullName[be@latin]=KiraÅ­nik zdymkaÅ­ F-Spot X-GNOME-FullName[bg]=Управление на Ñнимки (F-Spot) X-GNOME-FullName[bn_IN]=F-Spot ফটো পরিচালন বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾ X-GNOME-FullName[ca]=Gestor fotogràfic F-Spot X-GNOME-FullName[ca@valencia]=Gestor fotogràfic F-Spot X-GNOME-FullName[cs]=Správce fotografií F-Spot X-GNOME-FullName[da]=F-Spot - fotohÃ¥ndtering X-GNOME-FullName[de]=F-Spot Fotoverwaltung X-GNOME-FullName[dz]=ཨེཕ་-ཨིསི་པོཊི་ དཔར་འཛིན་སà¾à¾±à½¼à½„་པ་ X-GNOME-FullName[el]=ΔιαχείÏιση φωτογÏαφιών X-GNOME-FullName[en_CA]=F-Spot Photo Manager X-GNOME-FullName[en_GB]=F-Spot Photo Manager X-GNOME-FullName[es]=Gestor de fotos F-Spot X-GNOME-FullName[et]=F-Spot fotoalbum X-GNOME-FullName[eu]=F-Spot argazki-kudeatzailea X-GNOME-FullName[fa]=مدیر عکس اÙÙ‌-Ø§ÙØ³Ù¾Ø§Øª X-GNOME-FullName[fi]=F-Spot - valokuvien hallinta X-GNOME-FullName[fr]=Gestionnaire de photos F-Spot X-GNOME-FullName[gl]=Xestor de fotos F-Spot X-GNOME-FullName[gu]=F-Spot ફોટો વà«àª¯àªµàª¸à«àª¥àª¾àªªàª• X-GNOME-FullName[he]=מנהל התמונות F-Spot X-GNOME-FullName[hi]=à¤à¤«à¤¼ सà¥à¤ªà¥‰à¤Ÿ फोटो पà¥à¤°à¤¬à¤‚धक X-GNOME-FullName[hu]=F-Spot fotókezelÅ‘ X-GNOME-FullName[id]=F-Spot Photo Manager X-GNOME-FullName[it]=Gestore di fotografie F-spot X-GNOME-FullName[ja]=F-Spot 写真マãƒãƒ¼ã‚¸ãƒ£ X-GNOME-FullName[ka]=F-სპáƒáƒ¢ ფáƒáƒ¢áƒ მენეჯერი X-GNOME-FullName[kn]=F-Spot ಫೋಟೋ ವà³à²¯à²µà²¸à³à²¥à²¾à²ªà²• X-GNOME-FullName[ko]=F-Spot 사진 ê´€ë¦¬ìž X-GNOME-FullName[lt]=Fotografijų tvarkymo programa F-Spot X-GNOME-FullName[lv]=F-Spot fotogrÄfiju pÄrvaldnieks X-GNOME-FullName[mk]=F-Spot Менаџер за Ñлики X-GNOME-FullName[mr]=F-Spot फोटो वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤• X-GNOME-FullName[nb]=F-Spot bildebehandling X-GNOME-FullName[nl]=F-Spot fotobeheer X-GNOME-FullName[or]=F-Spot ଫୋଟୋ ପରିଚାଳକ X-GNOME-FullName[pa]=F-ਸਪੋਟ ਫੋਟੋ ਮੈਨੇਜਰ X-GNOME-FullName[pl]=Menedżer zdjęć F-Spot X-GNOME-FullName[pt]=Gestor de Fotografias do F-Spot X-GNOME-FullName[pt_BR]=Gerenciador de fotos F-Spot X-GNOME-FullName[ro]=Manager Foto F-Spot X-GNOME-FullName[ru]=Управление фотографиÑми в F-Spot X-GNOME-FullName[sk]=Správca fotiek F-Spot X-GNOME-FullName[sl]=F-spot upravljalnik fotografij X-GNOME-FullName[sr]=Ф-број фото албум X-GNOME-FullName[sr@latin]=F-broj foto album X-GNOME-FullName[sv]=Fotohanteraren F-Spot X-GNOME-FullName[ta]=F-Spot நிழறà¯à®ªà®Ÿ மேலாளர௠X-GNOME-FullName[te]=F-Spot ఛాయాచితà±à°° నిరà±à°µà°¾à°¹à°¿à°• X-GNOME-FullName[th]=F-Spot: โปรà¹à¸à¸£à¸¡à¸ˆà¸±à¸”à¸à¸²à¸£à¸ à¸²à¸žà¸–่าย X-GNOME-FullName[uk]=ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ñ–Ñми у F-Spot X-GNOME-FullName[vi]=Bá»™ Quản Lý Ảnh Chụp F-Spot X-GNOME-FullName[zh_CN]=F-Spot 照片管ç†å™¨ X-GNOME-FullName[zh_HK]=F-Spot 相片管ç†å“¡ X-GNOME-FullName[zh_TW]=F-Spot 相片管ç†å“¡ Comment=Import into F-Spot Comment[ar]=استيراد إلى Ø¥Ù-سبوت Comment[as]=F-Spot লৈ আমদানি কৰক Comment[ast]=Importar en F-Spot Comment[bg]=ВнаÑÑне в F-Spot Comment[bn_IN]=F-Spot-ঠইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨ Comment[ca]=Importa a l'F-Spot Comment[ca@valencia]=Importa a l'F-Spot Comment[cs]=Importovat do F-Spot Comment[da]=Importér til F-Spot Comment[de]=In F-Spot importieren Comment[el]=Εισαγωγή στο F-Spot Comment[en_GB]=Import into F-Spot Comment[es]=Importar en F-Spot Comment[et]=Impordi F-Spot'i Comment[eu]=Inportatu 'F-Spot'-era Comment[fi]=Tuo F-Spotiin Comment[fr]=Importer dans F-Spot Comment[gl]=Importar a F-Spot Comment[gu]=F-Spot માં આયાત કરો Comment[he]=×™×‘×•× ×œ×ª×•×š F-Spot Comment[hi]=F-Spot में लाà¤à¤ Comment[hu]=Importálás az F-Spotba Comment[id]=Impor ke F-Spot Comment[it]=Importa in F-Spot Comment[ja]=F-Spot ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆ Comment[kn]=F-Spot ಗೆ ಆಮದೠಮಾಡಿಕೊಳà³à²³à²¿ Comment[ko]=F-스팟으로 가져오기 Comment[lt]=Importuoti į F-Spot Comment[mk]=Увези во F-Spot Comment[mr]=F-Spot अंतरà¥à¤—त आयात करा Comment[nb]=Importer til F-Spot Comment[nl]=In F-Spot importeren Comment[or]=F-Spot ଭିତରେ ଆମଦାନୀ କରନà­à¬¤à­ Comment[pa]=F-ਸਪੋਟ ਵਿੱਚ ਇੰਪੋਰਟ ਕਰੋ Comment[pl]=Importowanie do programu F-Spot Comment[pt]=Importar para o F-Spot Comment[pt_BR]=Importar para o F-Spot Comment[ro]=Importă în F-Spot Comment[ru]=Импортировать в F-Spot Comment[sk]=ImportovaÅ¥ do F-Spot Comment[sl]=Uvozi v F-Spot Comment[sr]=Увези у Ф-број Comment[sr@latin]=Uvezi u F-broj Comment[sv]=Importera till F-Spot Comment[ta]=F-Spotல௠இறகà¯à®•வà¯à®®à¯ Comment[te]=F-Spotనకౠదిగà±à°®à°¤à°¿ చేయà±à°®à± Comment[th]=นำเข้าสู่ F-Spot Comment[uk]=Імпортувати до F-Spot Comment[zh_CN]=导入到 F-Spot Comment[zh_HK]=匯入至 F-Spot Comment[zh_TW]=匯入至 F-Spot NoDisplay=true Exec=f-spot-import %u Icon=f-spot MimeType=x-content/image-dcf;x-content/image-picturecd; StartupNotify=true Terminal=false Type=Application X-GNOME-Bugzilla-Bugzilla=GNOME X-GNOME-Bugzilla-Product=f-spot X-GNOME-Bugzilla-Component=General X-GNOME-Bugzilla-Version=0.8.2 X-GNOME-DocPath=f-spot/f-spot.xml f-spot-0.8.2/data/desktop-files/f-spot-view.desktop0000644000175000017500000001650411503407373022507 0ustar00rubenruben00000000000000[Desktop Entry] Version=1.0 Name=F-Spot Name[ar]=Ø¥Ù-سبوت Name[ast]=F-Spot Name[be@latin]=F-Spot Name[bg]=F-Spot Name[bn_IN]=F-Spot Name[ca]=F-Spot Name[ca@valencia]=F-Spot Name[cs]=F-Spot Name[da]=F-Spot Name[de]=F-Spot Name[dz]=ཨེཕ་-ཨིསི་པོཊི་ Name[el]=F-Spot Name[en_CA]=F-Spot Name[en_GB]=F-Spot Name[es]=F-Spot Name[et]=F-Spot Name[eu]=F-Spot Name[fa]=اÙÙ- Ø§ÙØ³Ù¾Ø§Øª Name[fi]=F-Spot Name[fr]=F-Spot Name[gl]=F-Spot Name[he]=F-Spot Name[hi]=à¤à¤«à¤¼ सà¥à¤ªà¥‰à¤Ÿ Name[hu]=F-Spot Name[id]=F-Spot Name[it]=F-Spot Name[ja]=F-Spot Name[ka]=F-სპáƒáƒ¢ Name[kn]=F-Spot Name[ko]=F-Spot Name[lt]=F-Spot Name[lv]=F-Spot Name[mk]=F-Spot Name[mr]=F-Spot Name[nb]=F-Spot Name[nds]=F-Spot Name[nl]=F-Spot Name[or]=F-Spot Name[pa]=F-ਸਪੋਟ Name[pl]=F-Spot Name[pt]=F-Spot Name[pt_BR]=F-Spot Name[ro]=F-Spot Name[ru]=F-Spot Name[sk]=F-Spot Name[sl]=F-Spot Name[sr]=Ф-број Name[sr@latin]=F-broj Name[sv]=F-Spot Name[ta]=F-Spot Name[te]=F-Spot Name[th]=F-Spot Name[uk]=F-Spot Name[vi]=F-Spot Name[zh_CN]=F-Spot Name[zh_HK]=F-Spot Name[zh_TW]=F-Spot GenericName=Photo Viewer GenericName[ar]=عارض الصور GenericName[as]=ফ'টো ভিৱাৰ GenericName[ast]=Visor Semeyes GenericName[be@latin]=Prahladalnik zdymkaÅ­ GenericName[bg]=Преглед на Ñнимки GenericName[bn_IN]=ফটো পà§à¦°à¦¦à¦°à§à¦¶à¦¨ বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾ GenericName[ca]=Visualitzador fotogràfic GenericName[ca@valencia]=Visualitzador fotogràfic GenericName[cs]=ProhlížeÄ fotografií GenericName[da]=Fotofremviser GenericName[de]=Fotobetrachter GenericName[dz]=དཔར་མà½à½¼à½„་བྱེད་ GenericName[el]=ΠÏοβολή φωτογÏαφιών GenericName[en_CA]=Photo Viewer GenericName[en_GB]=Photo Viewer GenericName[es]=Visor de fotos GenericName[et]=Fotovaatur GenericName[eu]=Argazki-ikustailea GenericName[fa]=نمایش‌دهندهٔ عکس GenericName[fi]=Valokuvien katselin GenericName[fr]=Visionneur de photos GenericName[gl]=Visor de fotos GenericName[gu]=ફોટો દરà«àª¶àª• GenericName[he]=מציג התמונות GenericName[hi]=फोटो पà¥à¤°à¤¦à¤°à¥à¤¶à¤• GenericName[hu]=FotómegjelenítÅ‘ GenericName[id]=Penilik Foto GenericName[it]=Visualizzatore di fotografie GenericName[ja]=写真ビューア GenericName[ka]=ფáƒáƒ¢áƒ დáƒáƒ›áƒ—ვáƒáƒšáƒ˜áƒ”რებელი GenericName[kn]=ಫೋಟೋ ವೀಕà³à²·à²• GenericName[ko]=사진 보기 GenericName[lt]=Fotografijų peržiÅ«ros programa GenericName[lv]=Bilžu skatÄ«tÄjs GenericName[mk]=Прегледувач за Ñлики GenericName[mr]=फोटो पà¥à¤°à¤¦à¤°à¥à¤¶à¤• GenericName[nb]=Fotovisning GenericName[nl]=Fotoweergave GenericName[or]=ଫୋଟୋ ପà­à¬°à¬¦à¬°à­à¬¶à¬• GenericName[pa]=ਤਸਵੀਰ ਦਰਸ਼ਕ GenericName[pl]=PrzeglÄ…darka zdjęć GenericName[pt]=Visualizador de Fotografias GenericName[pt_BR]=Visualizador de fotos GenericName[ro]=Vizualizator de fotografii GenericName[ru]=ПроÑмотр фотографий GenericName[sk]=PrehliadaÄ fotiek GenericName[sl]=Pregledovalnik fotografij GenericName[sr]=Прегледник фотографија GenericName[sr@latin]=Preglednik fotografija GenericName[sv]=Fotovisare GenericName[ta]=நிழறà¯à®ªà®Ÿ காடà¯à®Ÿà®¿ GenericName[te]=ఛాయాచితà±à°° దరà±à°¶à°¿à°¨à°¿ GenericName[uk]=ПереглÑд фотографій GenericName[vi]=Bá»™ Xem Ảnh Chụp GenericName[zh_CN]=照片查看器 GenericName[zh_HK]=相片檢視器 GenericName[zh_TW]=相片檢視器 X-GNOME-FullName=F-Spot Photo Viewer X-GNOME-FullName[ar]=عارض صور Ø¥Ù-سبوت X-GNOME-FullName[as]=F-Spot ফ'টো পà§à§°à¦¦à§°à§à¦¶à¦• X-GNOME-FullName[ast]=Visor Semeyes F-Spot X-GNOME-FullName[be@latin]=Prahladalnik zdymkaÅ­ F-Spot X-GNOME-FullName[bg]=Преглед на Ñнимки Ñ F-Spot X-GNOME-FullName[bn_IN]=F-Spot ফটো পà§à¦°à¦¦à¦°à§à¦¶à¦¨ বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾ X-GNOME-FullName[ca]=Visualitzador fotogràfic F-Spot X-GNOME-FullName[ca@valencia]=Visualitzador fotogràfic F-Spot X-GNOME-FullName[cs]=ProhlížeÄ fotografií F-Spot X-GNOME-FullName[da]=F-Spot fotofremviser X-GNOME-FullName[de]=F-Spot Fotobetrachter X-GNOME-FullName[dz]=ཨེཕ་-ཨིསི་པོཊི་ དཔར་མà½à½¼à½„་བྱེད་ X-GNOME-FullName[el]=F-Spot Ï€Ïοβολή φωτογÏαφιών X-GNOME-FullName[en_CA]=F-Spot Photo Viewer X-GNOME-FullName[en_GB]=F-Spot Photo Viewer X-GNOME-FullName[es]=Visor de fotos F-Spot X-GNOME-FullName[et]=F-Spot fotovaatur X-GNOME-FullName[eu]=F-Spot argazki-ikustailea X-GNOME-FullName[fa]=نمایش‌دهندهٔ عکس اÙÙ‌-Ø§ÙØ³Ù¾Ø§Øª X-GNOME-FullName[fi]=F-Spot - valokuvien hallinta X-GNOME-FullName[fr]=Visionneur de photos F-Spot X-GNOME-FullName[gl]=Visor de fotos F-Spot X-GNOME-FullName[gu]=F-Spot ફોટો દરà«àª¶àª• X-GNOME-FullName[he]=מציג התמונות F-Spot X-GNOME-FullName[hi]=à¤à¤«à¤¼ सà¥à¤ªà¥‰à¤Ÿ फोटो पà¥à¤°à¤¦à¤°à¥à¤¶à¤• X-GNOME-FullName[hu]=F-Spot fotómegjelenítÅ‘ X-GNOME-FullName[id]=F-Spot Photo Viewer X-GNOME-FullName[it]=Visualizzatore di fotografie F-Spot X-GNOME-FullName[ja]=F-Spot 写真ビューア X-GNOME-FullName[ka]=F-სპáƒáƒ¢ ფáƒáƒ¢áƒ დáƒáƒ›áƒ—ვáƒáƒšáƒ˜áƒ”რებელი X-GNOME-FullName[kn]=F-Spot ಫೋಟೋ ವೀಕà³à²·à²• X-GNOME-FullName[ko]=F-Spot 사진 보기 X-GNOME-FullName[lt]=Fotografijų peržiÅ«ros programa F-Spot X-GNOME-FullName[lv]=F-Spot bilžu skatÄ«tÄjs X-GNOME-FullName[mk]=F-Spot Прегледувач за Ñлики X-GNOME-FullName[mr]=F-Spot फोटो पà¥à¤°à¤¦à¤°à¥à¤¶à¤• X-GNOME-FullName[nb]=F-spot bildebehandling X-GNOME-FullName[nl]=F-Spot fotoweergave X-GNOME-FullName[or]=F-Spot ଫୋଟୋ ପà­à¬°à¬¦à¬°à­à¬¶à¬• X-GNOME-FullName[pa]=F-ਸਪੋਟ ਫੋਟੋ ਦਰਸ਼ਕ X-GNOME-FullName[pl]=PrzeglÄ…darka zdjęć F-Spot X-GNOME-FullName[pt]=Visualizador de Fotografias do F-Spot X-GNOME-FullName[pt_BR]=Visualizador de fotos F-Spot X-GNOME-FullName[ro]=Vizualizatorul de fotografii F-Spot X-GNOME-FullName[ru]=ПроÑмотр фотографий в F-Spot X-GNOME-FullName[sk]=PrehliadaÄ fotiek F-Spot X-GNOME-FullName[sl]=F-_Spot pregledovalnik fotografij X-GNOME-FullName[sr]=Ф-број прегледач фотографија X-GNOME-FullName[sr@latin]=F-broj pregledaÄ fotografija X-GNOME-FullName[sv]=Fotovisaren F-Spot X-GNOME-FullName[ta]=F-Spot நிழறà¯à®ªà®Ÿà®•௠காடà¯à®Ÿà®¿ X-GNOME-FullName[te]=F-Spot ఛాయాచితà±à°° దరà±à°¶à°¨à°¿ X-GNOME-FullName[uk]=ПереглÑд фотографій F-Spot X-GNOME-FullName[vi]=Bá»™ xem ảnh chụp F-Spot X-GNOME-FullName[zh_CN]=F-Spot 照片查看器 X-GNOME-FullName[zh_HK]=F-Spot 相片檢視器 X-GNOME-FullName[zh_TW]=F-Spot 相片檢視器 TryExec=f-spot Exec=f-spot --view %U NoDisplay=true Icon=f-spot StartupNotify=false Terminal=false Type=Application X-GNOME-Bugzilla-Bugzilla=GNOME X-GNOME-Bugzilla-Product=f-spot X-GNOME-Bugzilla-Component=General X-GNOME-Bugzilla-Version=0.8.2 MimeType=image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-dcraw;image/x-ciff;image/x-mrw;image/x-x3f;image/x-orf;image/x-nef;image/x-cr2;image/x-raf; f-spot-0.8.2/data/desktop-files/Makefile.in0000644000175000017500000004304111503407230020765 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = data/desktop-files DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/f-spot-import.desktop.in.in \ $(srcdir)/f-spot-view.desktop.in.in \ $(srcdir)/f-spot.desktop.in.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = f-spot.desktop.in f-spot-view.desktop.in \ f-spot-import.desktop.in CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(Applicationsdir)" DATA = $(Applications_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ desktop_in_files = \ f-spot.desktop.in \ f-spot-view.desktop.in \ f-spot-import.desktop.in Applicationsdir = $(datadir)/applications Applications_DATA = $(desktop_files) desktop_files = $(desktop_in_files:.desktop.in=.desktop) CLEANFILES = \ $(desktop_DATA) EXTRA_DIST = \ $(desktop_in_files) \ $(desktop_files) DISTCLEANFILES = \ $(desktop_files) UPDATE_DESKTOP = \ if [ -f $(DESTDIR)$(datadir)/applications/defaults.list ] ; then \ if which update-desktop-database>/dev/null 2>&1 ; then \ update-desktop-database $(DESTDIR)$(datadir)/applications; \ fi \ fi all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign data/desktop-files/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign data/desktop-files/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): f-spot.desktop.in: $(top_builddir)/config.status $(srcdir)/f-spot.desktop.in.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ f-spot-view.desktop.in: $(top_builddir)/config.status $(srcdir)/f-spot-view.desktop.in.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ f-spot-import.desktop.in: $(top_builddir)/config.status $(srcdir)/f-spot-import.desktop.in.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-ApplicationsDATA: $(Applications_DATA) @$(NORMAL_INSTALL) test -z "$(Applicationsdir)" || $(MKDIR_P) "$(DESTDIR)$(Applicationsdir)" @list='$(Applications_DATA)'; test -n "$(Applicationsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(Applicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(Applicationsdir)" || exit $$?; \ done uninstall-ApplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(Applications_DATA)'; test -n "$(Applicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(Applicationsdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(Applicationsdir)" && rm -f $$files tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(Applicationsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-ApplicationsDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-ApplicationsDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: install-am install-data-am install-strip uninstall-am .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install \ install-ApplicationsDATA install-am install-data \ install-data-am install-data-hook install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall \ uninstall-ApplicationsDATA uninstall-am uninstall-hook @INTLTOOL_DESKTOP_RULE@ install-data-hook: $(UPDATE_DESKTOP) uninstall-hook: $(UPDATE_DESKTOP) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/data/desktop-files/f-spot.desktop.in.in0000644000175000017500000000067111417267574022562 0ustar00rubenruben00000000000000[Desktop Entry] Version=1.0 _Name=F-Spot _GenericName=Photo Manager _X-GNOME-FullName=F-Spot Photo Manager _Comment=Organize, enjoy, and share your photos Exec=f-spot Icon=f-spot StartupNotify=true Terminal=false Type=Application Categories=Graphics;Photography;GNOME;GTK; X-GNOME-Bugzilla-Bugzilla=GNOME X-GNOME-Bugzilla-Product=f-spot X-GNOME-Bugzilla-Component=General X-GNOME-Bugzilla-Version=@VERSION@ X-GNOME-DocPath=f-spot/f-spot.xml f-spot-0.8.2/data/desktop-files/f-spot-view.desktop.in0000644000175000017500000000137211503407345023110 0ustar00rubenruben00000000000000[Desktop Entry] Version=1.0 _Name=F-Spot _GenericName=Photo Viewer _X-GNOME-FullName=F-Spot Photo Viewer TryExec=f-spot Exec=f-spot --view %U NoDisplay=true Icon=f-spot StartupNotify=false Terminal=false Type=Application X-GNOME-Bugzilla-Bugzilla=GNOME X-GNOME-Bugzilla-Product=f-spot X-GNOME-Bugzilla-Component=General X-GNOME-Bugzilla-Version=0.8.2 MimeType=image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-dcraw;image/x-ciff;image/x-mrw;image/x-x3f;image/x-orf;image/x-nef;image/x-cr2;image/x-raf; f-spot-0.8.2/data/desktop-files/f-spot.desktop.in0000644000175000017500000000066511503407345022144 0ustar00rubenruben00000000000000[Desktop Entry] Version=1.0 _Name=F-Spot _GenericName=Photo Manager _X-GNOME-FullName=F-Spot Photo Manager _Comment=Organize, enjoy, and share your photos Exec=f-spot Icon=f-spot StartupNotify=true Terminal=false Type=Application Categories=Graphics;Photography;GNOME;GTK; X-GNOME-Bugzilla-Bugzilla=GNOME X-GNOME-Bugzilla-Product=f-spot X-GNOME-Bugzilla-Component=General X-GNOME-Bugzilla-Version=0.8.2 X-GNOME-DocPath=f-spot/f-spot.xml f-spot-0.8.2/data/desktop-files/Makefile.am0000644000175000017500000000126011430555233020757 0ustar00rubenruben00000000000000desktop_in_files= \ f-spot.desktop.in \ f-spot-view.desktop.in \ f-spot-import.desktop.in Applicationsdir = $(datadir)/applications Applications_DATA = $(desktop_files) desktop_files=$(desktop_in_files:.desktop.in=.desktop) @INTLTOOL_DESKTOP_RULE@ CLEANFILES = \ $(desktop_DATA) EXTRA_DIST = \ $(desktop_in_files) \ $(desktop_files) DISTCLEANFILES = \ $(desktop_files) UPDATE_DESKTOP = \ if [ -f $(DESTDIR)$(datadir)/applications/defaults.list ] ; then \ if which update-desktop-database>/dev/null 2>&1 ; then \ update-desktop-database $(DESTDIR)$(datadir)/applications; \ fi \ fi install-data-hook: $(UPDATE_DESKTOP) uninstall-hook: $(UPDATE_DESKTOP) f-spot-0.8.2/data/desktop-files/f-spot-import.desktop.in0000644000175000017500000000070711503407345023451 0ustar00rubenruben00000000000000[Desktop Entry] Version=1.0 _Name=F-Spot _GenericName=Photo Manager _X-GNOME-FullName=F-Spot Photo Manager _Comment=Import into F-Spot NoDisplay=true Exec=f-spot-import %u Icon=f-spot MimeType=x-content/image-dcf;x-content/image-picturecd; StartupNotify=true Terminal=false Type=Application X-GNOME-Bugzilla-Bugzilla=GNOME X-GNOME-Bugzilla-Product=f-spot X-GNOME-Bugzilla-Component=General X-GNOME-Bugzilla-Version=0.8.2 X-GNOME-DocPath=f-spot/f-spot.xml f-spot-0.8.2/data/desktop-files/f-spot-import.desktop.in.in0000644000175000017500000000071311417267574024067 0ustar00rubenruben00000000000000[Desktop Entry] Version=1.0 _Name=F-Spot _GenericName=Photo Manager _X-GNOME-FullName=F-Spot Photo Manager _Comment=Import into F-Spot NoDisplay=true Exec=f-spot-import %u Icon=f-spot MimeType=x-content/image-dcf;x-content/image-picturecd; StartupNotify=true Terminal=false Type=Application X-GNOME-Bugzilla-Bugzilla=GNOME X-GNOME-Bugzilla-Product=f-spot X-GNOME-Bugzilla-Component=General X-GNOME-Bugzilla-Version=@VERSION@ X-GNOME-DocPath=f-spot/f-spot.xml f-spot-0.8.2/data/desktop-files/f-spot.desktop0000644000175000017500000002766011503407373021544 0ustar00rubenruben00000000000000[Desktop Entry] Version=1.0 Name=F-Spot Name[ar]=Ø¥Ù-سبوت Name[ast]=F-Spot Name[be@latin]=F-Spot Name[bg]=F-Spot Name[bn_IN]=F-Spot Name[ca]=F-Spot Name[ca@valencia]=F-Spot Name[cs]=F-Spot Name[da]=F-Spot Name[de]=F-Spot Name[dz]=ཨེཕ་-ཨིསི་པོཊི་ Name[el]=F-Spot Name[en_CA]=F-Spot Name[en_GB]=F-Spot Name[es]=F-Spot Name[et]=F-Spot Name[eu]=F-Spot Name[fa]=اÙÙ- Ø§ÙØ³Ù¾Ø§Øª Name[fi]=F-Spot Name[fr]=F-Spot Name[gl]=F-Spot Name[he]=F-Spot Name[hi]=à¤à¤«à¤¼ सà¥à¤ªà¥‰à¤Ÿ Name[hu]=F-Spot Name[id]=F-Spot Name[it]=F-Spot Name[ja]=F-Spot Name[ka]=F-სპáƒáƒ¢ Name[kn]=F-Spot Name[ko]=F-Spot Name[lt]=F-Spot Name[lv]=F-Spot Name[mk]=F-Spot Name[mr]=F-Spot Name[nb]=F-Spot Name[nds]=F-Spot Name[nl]=F-Spot Name[or]=F-Spot Name[pa]=F-ਸਪੋਟ Name[pl]=F-Spot Name[pt]=F-Spot Name[pt_BR]=F-Spot Name[ro]=F-Spot Name[ru]=F-Spot Name[sk]=F-Spot Name[sl]=F-Spot Name[sr]=Ф-број Name[sr@latin]=F-broj Name[sv]=F-Spot Name[ta]=F-Spot Name[te]=F-Spot Name[th]=F-Spot Name[uk]=F-Spot Name[vi]=F-Spot Name[zh_CN]=F-Spot Name[zh_HK]=F-Spot Name[zh_TW]=F-Spot GenericName=Photo Manager GenericName[ar]=مدير الصور GenericName[as]=ফটো মেনেজাৰ GenericName[ast]=Xestor Semeyes GenericName[be@latin]=KiraÅ­nik zdymkaÅ­ GenericName[bg]=Управление на Ñнимки GenericName[bn_IN]=ফটো পরিচালন বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾ GenericName[ca]=Gestor fotogràfic GenericName[ca@valencia]=Gestor fotogràfic GenericName[cs]=Správce fotografií GenericName[da]=FotohÃ¥ndtering GenericName[de]=Fotoverwaltung GenericName[dz]=དཔར་འཛིན་སà¾à¾±à½¼à½„་པ་ GenericName[el]=ΔιαχείÏιση φωτογÏαφιών GenericName[en_CA]=Photo Manager GenericName[en_GB]=Photo Manager GenericName[es]=Gestor de fotografías GenericName[et]=Fotode haldaja GenericName[eu]=Argazki-kudeatzailea GenericName[fa]=مدیر عکس GenericName[fi]=Valokuvien hallinta GenericName[fr]=Gestionnaire de photos GenericName[gl]=Xestor de fotos GenericName[gu]=ફોટો વà«àª¯àªµàª¸à«àª¥àª¾àªªàª• GenericName[he]=מנהל תמונות GenericName[hi]=फोटो पà¥à¤°à¤¬à¤‚धक GenericName[hu]=FényképkezelÅ‘ GenericName[id]=Manajer Foto GenericName[it]=Gestore di fotografie GenericName[ja]=写真マãƒãƒ¼ã‚¸ãƒ£ GenericName[ka]=ფáƒáƒ¢áƒ მენეჯერი GenericName[kn]=ಫೋಟೊ ವà³à²¯à²µà²¸à³à²¥à²¾à²ªà²• GenericName[ko]=사진 ê´€ë¦¬ìž GenericName[lt]=Fotografijų tvarkymo programa GenericName[lv]=FotogrÄfiju pÄrvaldnieks GenericName[mk]=Менаџер за Ñлики GenericName[mr]=फोटो वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤• GenericName[nb]=Fotobehandler GenericName[nl]=Fotobeheer GenericName[or]=ଫୋଟୋ ପରିଚାଳକ GenericName[pa]=ਫੋਟੋ ਮੈਨੇਜਰ GenericName[pl]=Menedżer zdjęć GenericName[pt]=Gestor de Fotografias GenericName[pt_BR]=Gerenciador de fotos GenericName[ro]=Manager Foto GenericName[ru]=Управление фотографиÑми GenericName[sk]=Správca fotiek GenericName[sl]=Upravljalnik fotografij GenericName[sr]=Фото албум GenericName[sr@latin]=Foto album GenericName[sv]=Fotohanterare GenericName[ta]=நிழறà¯à®ªà®Ÿ மேலாளர௠GenericName[te]=ఛాయాచితà±à°° నిరà±à°µà°¾à°¹à°¿à°• GenericName[th]=โปรà¹à¸à¸£à¸¡à¸ˆà¸±à¸”à¸à¸²à¸£à¸ à¸²à¸žà¸–่าย GenericName[uk]=ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ñ–Ñми GenericName[vi]=Bá»™ Quản Lý Ảnh Chụp GenericName[zh_CN]=照片管ç†å™¨ GenericName[zh_HK]=相片管ç†å“¡ GenericName[zh_TW]=相片管ç†å“¡ X-GNOME-FullName=F-Spot Photo Manager X-GNOME-FullName[ar]=مدير الصور Ø¥Ù-سبوت X-GNOME-FullName[as]=F-Spot ফটো মেনেজাৰ X-GNOME-FullName[ast]=Xestor Semeyes F-Spot X-GNOME-FullName[be@latin]=KiraÅ­nik zdymkaÅ­ F-Spot X-GNOME-FullName[bg]=Управление на Ñнимки (F-Spot) X-GNOME-FullName[bn_IN]=F-Spot ফটো পরিচালন বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾ X-GNOME-FullName[ca]=Gestor fotogràfic F-Spot X-GNOME-FullName[ca@valencia]=Gestor fotogràfic F-Spot X-GNOME-FullName[cs]=Správce fotografií F-Spot X-GNOME-FullName[da]=F-Spot - fotohÃ¥ndtering X-GNOME-FullName[de]=F-Spot Fotoverwaltung X-GNOME-FullName[dz]=ཨེཕ་-ཨིསི་པོཊི་ དཔར་འཛིན་སà¾à¾±à½¼à½„་པ་ X-GNOME-FullName[el]=ΔιαχείÏιση φωτογÏαφιών X-GNOME-FullName[en_CA]=F-Spot Photo Manager X-GNOME-FullName[en_GB]=F-Spot Photo Manager X-GNOME-FullName[es]=Gestor de fotos F-Spot X-GNOME-FullName[et]=F-Spot fotoalbum X-GNOME-FullName[eu]=F-Spot argazki-kudeatzailea X-GNOME-FullName[fa]=مدیر عکس اÙÙ‌-Ø§ÙØ³Ù¾Ø§Øª X-GNOME-FullName[fi]=F-Spot - valokuvien hallinta X-GNOME-FullName[fr]=Gestionnaire de photos F-Spot X-GNOME-FullName[gl]=Xestor de fotos F-Spot X-GNOME-FullName[gu]=F-Spot ફોટો વà«àª¯àªµàª¸à«àª¥àª¾àªªàª• X-GNOME-FullName[he]=מנהל התמונות F-Spot X-GNOME-FullName[hi]=à¤à¤«à¤¼ सà¥à¤ªà¥‰à¤Ÿ फोटो पà¥à¤°à¤¬à¤‚धक X-GNOME-FullName[hu]=F-Spot fotókezelÅ‘ X-GNOME-FullName[id]=F-Spot Photo Manager X-GNOME-FullName[it]=Gestore di fotografie F-spot X-GNOME-FullName[ja]=F-Spot 写真マãƒãƒ¼ã‚¸ãƒ£ X-GNOME-FullName[ka]=F-სპáƒáƒ¢ ფáƒáƒ¢áƒ მენეჯერი X-GNOME-FullName[kn]=F-Spot ಫೋಟೋ ವà³à²¯à²µà²¸à³à²¥à²¾à²ªà²• X-GNOME-FullName[ko]=F-Spot 사진 ê´€ë¦¬ìž X-GNOME-FullName[lt]=Fotografijų tvarkymo programa F-Spot X-GNOME-FullName[lv]=F-Spot fotogrÄfiju pÄrvaldnieks X-GNOME-FullName[mk]=F-Spot Менаџер за Ñлики X-GNOME-FullName[mr]=F-Spot फोटो वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤• X-GNOME-FullName[nb]=F-Spot bildebehandling X-GNOME-FullName[nl]=F-Spot fotobeheer X-GNOME-FullName[or]=F-Spot ଫୋଟୋ ପରିଚାଳକ X-GNOME-FullName[pa]=F-ਸਪੋਟ ਫੋਟੋ ਮੈਨੇਜਰ X-GNOME-FullName[pl]=Menedżer zdjęć F-Spot X-GNOME-FullName[pt]=Gestor de Fotografias do F-Spot X-GNOME-FullName[pt_BR]=Gerenciador de fotos F-Spot X-GNOME-FullName[ro]=Manager Foto F-Spot X-GNOME-FullName[ru]=Управление фотографиÑми в F-Spot X-GNOME-FullName[sk]=Správca fotiek F-Spot X-GNOME-FullName[sl]=F-spot upravljalnik fotografij X-GNOME-FullName[sr]=Ф-број фото албум X-GNOME-FullName[sr@latin]=F-broj foto album X-GNOME-FullName[sv]=Fotohanteraren F-Spot X-GNOME-FullName[ta]=F-Spot நிழறà¯à®ªà®Ÿ மேலாளர௠X-GNOME-FullName[te]=F-Spot ఛాయాచితà±à°° నిరà±à°µà°¾à°¹à°¿à°• X-GNOME-FullName[th]=F-Spot: โปรà¹à¸à¸£à¸¡à¸ˆà¸±à¸”à¸à¸²à¸£à¸ à¸²à¸žà¸–่าย X-GNOME-FullName[uk]=ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ñ–Ñми у F-Spot X-GNOME-FullName[vi]=Bá»™ Quản Lý Ảnh Chụp F-Spot X-GNOME-FullName[zh_CN]=F-Spot 照片管ç†å™¨ X-GNOME-FullName[zh_HK]=F-Spot 相片管ç†å“¡ X-GNOME-FullName[zh_TW]=F-Spot 相片管ç†å“¡ Comment=Organize, enjoy, and share your photos Comment[ar]=نظم, تمتع, وقم بمشاركة الصور Comment[as]=আপোনাৰ ফটোবোৰ সজাওক, ভাগ বতৰা কৰক আৰৠউপভোগ কৰক Comment[ast]=Organiza, esfruta, y comparte les tos semeyes Comment[be@latin]=Kiruj svaimi zdymkami i dzialisia imi Comment[bg]=Организирайте, наÑлаждавайте Ñе и Ñподелете Ñнимките Ñи Comment[bn_IN]=আপনার ফটোর সংকলন সà§à¦¬à¦¿à¦¨à§à¦¯à¦¸à§à¦¤, উপভোগ ও বিনিময় করà§à¦¨ Comment[ca]=Organitzeu, visualitzeu i compartiu fotografies Comment[ca@valencia]=Organitzeu, visualitzeu i compartiu fotografies Comment[cs]=Organizuje, prohlíží a sdílí vaÅ¡e fotografie Comment[da]=Organisér, nyd og del dine fotos Comment[de]=Fotos anschauen, sortieren und weitergeben Comment[dz]=à½à¾±à½¼à½‘་ཀྱི་དཔར་ཚུ་ འགོ་འདྲེན་འà½à½–་ སྤྲོ་བ་སྟོན་ དེ་ལས་ རུབ་སྤྱོད་འབད་ Comment[el]=ΟÏγανώστε, απολαÏστε και μοιÏαστείτε τις φωτογÏαφίες σας με το F-Spot Comment[en_CA]=Organize, enjoy, and share your photos Comment[en_GB]=Organise, enjoy, and share your photos Comment[es]=Organice, diviértase y comparta sus fotografías Comment[et]=Naudi fotoalbumi korrastamist ning fotode jagamist Comment[eu]=Antolatu, ikusi eta partekatu zure argazkiak Comment[fa]=عکس‌های خود را سازمان‌دهی کنید، از آنها لذت ببرید، Ùˆ با دیگران قسمت کنید Comment[fi]=Järjestele ja jaa valokuviasi Comment[fr]=Organisez, partagez et profitez de vos photos Comment[gl]=Organice, comparta e divírtase coas súas fotos Comment[gu]=તમારા ફોટોને સંચાલિત, આનંદ માણો, અને વહેંચો Comment[he]=×רגן, תהנה ושתף ×ת התמונות שלך. Comment[hi]=संगठित करें, आनंद लें, और अपने फोटो को साà¤à¤¾ करें Comment[hu]=Fényképek rendszerezése, megjelenítése és megosztása Comment[id]=Atur, nikmati, dan berbagi foto Anda Comment[it]=Organizza, mostra e condivide le proprie fotografie Comment[ja]=写真を整ç†ã—ã€æ¥½ã—ã¿ã€å…±æœ‰ã—ã¾ã™ Comment[ka]=áƒáƒ áƒ’áƒáƒœáƒ˜áƒ–ირებáƒ, დáƒáƒ—ვáƒáƒšáƒ˜áƒ”რებრდრგáƒáƒ–იáƒáƒ áƒ”ბრComment[kn]=ನಿಮà³à²® ಫೋಟೊಗಳನà³à²¨à³ ವà³à²¯à²µà²¸à³à²¥à²¿à²¤à²µà²¾à²—ಿ ಜೋಡಿಸಿ, ಆನಂದಿಸಿ ಹಾಗೠಇತರರೊಂದಿಗೆ ಹಂಚಿಕೊಳà³à²³à²¿ Comment[ko]=ì—¬ëŸ¬ë¶„ì˜ ì‚¬ì§„ì„ ê´€ë¦¬í•˜ê³  공유하세요 Comment[lt]=Rūšiuokite, mÄ—gaukitÄ—s ir dalinkitÄ—s savo fotografijomis Comment[lv]=SarÄ«kojoiet, baudiet un dalaties ar savÄm bildem Comment[mk]=Организирајте ги, Ñподелете ги и уживајте во Вашите Ñлики Comment[mr]=तà¥à¤®à¤šà¥‡ फोटो आयोजीत करा, मजा लूटा व सहभागीय करा Comment[nb]=Organiser, verdsett og del bildene dine Comment[nl]=Beheer, deel en geniet van uw foto's Comment[or]=ଆପଣଙà­à¬• ଫୋଟୋଗà­à¬¡à¬¼à¬¿à¬•ୠସà­à¬¸à¬‚ଗଠନ କରନà­à¬¤à­, ଉପଭୋଗ କରନà­à¬¤à­, à¬à¬¬à¬‚ ସହଭାଗ କରନà­à¬¤à­ Comment[pa]=ਆਪਣੀਆਂ ਫੋਟੋ ਵੇਖੋ, ਸਾਂà¨à©€à¨†à¨‚ ਕਰੋ Comment[pl]=Organizowanie i dzielenie siÄ™ zdjÄ™ciami Comment[pt]=Organize, divirta-se e partilhe as suas fotos Comment[pt_BR]=Organize, compartilhe e divirta-se com suas fotos Comment[ro]=OrganizaÈ›i, priviÈ›i È™i partajaÈ›i fotografii Comment[ru]=Организуйте, проÑматривайте и делитеÑÑŒ вашими фотографиÑми Comment[sk]=OrganizovaÅ¥, maÅ¥ poteÅ¡enie a zdielaÅ¥ vaÅ¡e fotky Comment[sl]=Urejajte, uživajte in dajte svoje fotografije v souporabo. Comment[sr]=Организујте, уживајте и поделите ваше фотографије Comment[sr@latin]=Organizujte, uživajte i podelite vaÅ¡e fotografije Comment[sv]=Organisera, njut av, och dela med dig av dina foton Comment[ta]=உஙà¯à®•ள௠நிழறà¯à®ªà®Ÿà®™à¯à®•ளை à®’à®´à¯à®™à¯à®•à¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿, பகிரà¯à®¨à¯à®¤à¯, மகிழவà¯à®®à¯ Comment[te]=నిరà±à°µà°¹à°¿à°‚à°šà±, ఆనందించà±, మరియౠమీ ఛాయాచితà±à°°à°®à±à°²à°¨à± పంచà±à°•ొనà±à°®à± Comment[uk]=ОрганізаціÑ, переглÑд та передача фотографій Comment[vi]=Tổ chức, thích thú và chia ra các ảnh chụp cá»§a bạn Comment[zh_CN]=ç»„ç»‡ã€æ¬£èµåŠå…±äº«æ‚¨çš„照片 Comment[zh_HK]=組織ã€äº«å—ã€ä¸¦åˆ†äº«ä½ çš„相片 Comment[zh_TW]=組織ã€äº«å—ã€ä¸¦åˆ†äº«æ‚¨çš„相片 Exec=f-spot Icon=f-spot StartupNotify=true Terminal=false Type=Application Categories=Graphics;Photography;GNOME;GTK; X-GNOME-Bugzilla-Bugzilla=GNOME X-GNOME-Bugzilla-Product=f-spot X-GNOME-Bugzilla-Component=General X-GNOME-Bugzilla-Version=0.8.2 X-GNOME-DocPath=f-spot/f-spot.xml f-spot-0.8.2/data/Makefile.in0000644000175000017500000005171611503407230016224 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = data DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = desktop-files all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign data/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign data/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/data/Makefile.am0000644000175000017500000000003011503404760016177 0ustar00rubenruben00000000000000SUBDIRS = desktop-files f-spot-0.8.2/configure0000755000175000017500000214520711503407313015160 0ustar00rubenruben00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.64 for f-spot 0.8.2. # # Report bugs to . # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software # Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: http://bugzilla.gnome.org/enter_bug.cgi?product=f-spot $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$lt_ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` ;; esac ECHO=${lt_ECHO-echo} if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then # Yippee, $ECHO works! : else # Restart under the correct shell. exec $SHELL "$0" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat <<_LT_EOF $* _LT_EOF exit 0 fi # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test -z "$lt_ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if { echo_test_string=`eval $cmd`; } 2>/dev/null && { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null then break fi done fi if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then ECHO="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$ECHO" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. ECHO='print -r' elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} else # Try using printf. ECHO='printf %s\n' if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL ECHO="$CONFIG_SHELL $0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then ECHO="$CONFIG_SHELL $0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "$0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} else # Oops. We lost completely, so just stick with echo. ECHO=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. lt_ECHO=$ECHO if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" fi exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='f-spot' PACKAGE_TARNAME='f-spot' PACKAGE_VERSION='0.8.2' PACKAGE_STRING='f-spot 0.8.2' PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=f-spot' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS Q V OBJC F77 FC CXX AM_MAKEFLAGS MAKEFLAGS shavedir BUILD_TIME BUILD_HOST_CPU BUILD_HOST_OS BUILD_VENDOR_ID HYENA_PKG_CONFIG_FALSE HYENA_PKG_CONFIG_TRUE GMCS_FLAGS ENABLE_RELEASE ENABLE_RELEASE_FALSE ENABLE_RELEASE_TRUE GNOME_ICON_THEME_PREFIX LIBJPEG MKINSTALLDIRS POSUB POFILES PO_IN_DATADIR_FALSE PO_IN_DATADIR_TRUE INTLLIBS INSTOBJEXT GMOFILES CATOBJEXT CATALOGS MSGFMT_OPTS GETTEXT_PACKAGE ICONS_DIRECTORY GNOME_SCREENSAVER_THEMESDIR GNOME_SCREENSAVER_SAVERDIR TURTLEDIR WITH_TURTLE_FALSE WITH_TURTLE_TRUE UNIQUE_LIBS UNIQUE_CFLAGS LCMS_LIBS LCMS_CFLAGS NDESK_DBUS_LIBS NDESK_DBUS_CFLAGS MONO_ADDINS_GUI_LIBS MONO_ADDINS_GUI_CFLAGS MONO_ADDINS_SETUP_LIBS MONO_ADDINS_SETUP_CFLAGS MONO_ADDINS_LIBS MONO_ADDINS_CFLAGS CSC_DEFINES GCONF_SHARP_LIBS GCONF_SHARP_CFLAGS GCONF_SCHEMAS_INSTALL_FALSE GCONF_SCHEMAS_INSTALL_TRUE GCONF_SCHEMA_FILE_DIR GCONF_SCHEMA_CONFIG_SOURCE GCONFTOOL GNOME_SHARP_LIBS GNOME_SHARP_CFLAGS GIO_LIBS GIO_CFLAGS F_LIBS F_CFLAGS GAPI2CODEGEN GAPI2PARSER GAPI2FIXUP NUNIT_LIBS NUNIT_CFLAGS ENABLE_TESTS_FALSE ENABLE_TESTS_TRUE FLICKRNET_LIBS FLICKRNET_CFLAGS KEYRINGSHARP_LIBS KEYRINGSHARP_CFLAGS ENABLE_ATK_FALSE ENABLE_ATK_TRUE GTKSHARP_A11Y_LIBS GTKSHARP_A11Y_CFLAGS HAVE_GLIBSHARP_2_12_7_FALSE HAVE_GLIBSHARP_2_12_7_TRUE GLIBSHARP_2_12_7_LIBS GLIBSHARP_2_12_7_CFLAGS GLIBSHARP_LIBS GLIBSHARP_CFLAGS GTKSHARP_LIBS GTKSHARP_CFLAGS GLIB_MKENUMS GOBJECT_QUERY GLIB_GENMARSHAL GLIB_LIBS GLIB_CFLAGS MONO MCS MONO_MODULE_LIBS MONO_MODULE_CFLAGS HAVE_GNOME_DOC_UTILS_FALSE HAVE_GNOME_DOC_UTILS_TRUE ENABLE_SK_FALSE ENABLE_SK_TRUE DOC_USER_FORMATS OMF_DIR HELP_DIR GNOME_DOC_UTILS_LIBS GNOME_DOC_UTILS_CFLAGS PKG_CONFIG expanded_datadir expanded_bindir expanded_libdir DISPLAY_VERSION ASM_VERSION API_VERSION DISTCHECK_CONFIGURE_FLAGS CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL lt_ECHO RANLIB AR OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL DATADIRNAME am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC ALL_LINGUAS INTLTOOL_PERL GMSGFMT MSGFMT MSGMERGE XGETTEXT INTLTOOL_POLICY_RULE INTLTOOL_SERVICE_RULE INTLTOOL_THEME_RULE INTLTOOL_SCHEMAS_RULE INTLTOOL_CAVES_RULE INTLTOOL_XML_NOMERGE_RULE INTLTOOL_XML_RULE INTLTOOL_KBD_RULE INTLTOOL_XAM_RULE INTLTOOL_UI_RULE INTLTOOL_SOUNDLIST_RULE INTLTOOL_SHEET_RULE INTLTOOL_SERVER_RULE INTLTOOL_PONG_RULE INTLTOOL_OAF_RULE INTLTOOL_PROP_RULE INTLTOOL_KEYS_RULE INTLTOOL_DIRECTORY_RULE INTLTOOL_DESKTOP_RULE INTLTOOL_EXTRACT INTLTOOL_MERGE INTLTOOL_UPDATE USE_NLS ACLOCAL_AMFLAGS MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_maintainer_mode enable_nls enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld enable_libtool_lock enable_user_help with_help_dir with_omf_dir with_help_formats enable_scrollkeeper enable_glibtest enable_tests with_gconf_source with_gconf_schema_file_dir enable_schemas_install with_turtle with_gnome_screensaver with_gnome_screensaver_privlibexecdir with_gnome_screensaver_themesdir enable_release with_vendor_build_id enable_shave ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP PKG_CONFIG GNOME_DOC_UTILS_CFLAGS GNOME_DOC_UTILS_LIBS MONO_MODULE_CFLAGS MONO_MODULE_LIBS GTKSHARP_CFLAGS GTKSHARP_LIBS GLIBSHARP_CFLAGS GLIBSHARP_LIBS GLIBSHARP_2_12_7_CFLAGS GLIBSHARP_2_12_7_LIBS GTKSHARP_A11Y_CFLAGS GTKSHARP_A11Y_LIBS KEYRINGSHARP_CFLAGS KEYRINGSHARP_LIBS FLICKRNET_CFLAGS FLICKRNET_LIBS NUNIT_CFLAGS NUNIT_LIBS F_CFLAGS F_LIBS GIO_CFLAGS GIO_LIBS GNOME_SHARP_CFLAGS GNOME_SHARP_LIBS GCONF_SHARP_CFLAGS GCONF_SHARP_LIBS MONO_ADDINS_CFLAGS MONO_ADDINS_LIBS MONO_ADDINS_SETUP_CFLAGS MONO_ADDINS_SETUP_LIBS MONO_ADDINS_GUI_CFLAGS MONO_ADDINS_GUI_LIBS NDESK_DBUS_CFLAGS NDESK_DBUS_LIBS LCMS_CFLAGS LCMS_LIBS UNIQUE_CFLAGS UNIQUE_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error "unrecognized option: \`$ac_option' Try \`$0 --help' for more information." ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures f-spot 0.8.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/f-spot] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of f-spot 0.8.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --disable-nls do not use Native Language Support --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-user-help Enable building the user-help [default=auto] --disable-scrollkeeper do not make updates to the scrollkeeper database --disable-glibtest do not try to compile and run a test GLIB program --enable-tests Enable NUnit tests --disable-schemas-install Disable the schemas installation --enable-release Use release configuration --enable-shave use shave to make the build pretty [default=yes] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-help-dir=DIR path to help docs --with-omf-dir=DIR path to OMF files --with-help-formats=FORMATS list of formats --with-gconf-source=sourceaddress Config database for installing schema files. --with-gconf-schema-file-dir=dir Directory for installing schema files. --with-turtle=DIR set path to source directory for turtle --with-gnome-screensaver=PREFIX set gnome gnome-screensaver prefix --with-gnome-screensaver-privlibexecdir=DIR set gnome-screensaver privlibexecdir --with-gnome-screensaver-themesdir=DIR set gnome-screensaver themesdir --with-vendor-build-id= Set a vendor build ID, recommended for packagers Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor PKG_CONFIG path to pkg-config utility GNOME_DOC_UTILS_CFLAGS C compiler flags for GNOME_DOC_UTILS, overriding pkg-config GNOME_DOC_UTILS_LIBS linker flags for GNOME_DOC_UTILS, overriding pkg-config MONO_MODULE_CFLAGS C compiler flags for MONO_MODULE, overriding pkg-config MONO_MODULE_LIBS linker flags for MONO_MODULE, overriding pkg-config GTKSHARP_CFLAGS C compiler flags for GTKSHARP, overriding pkg-config GTKSHARP_LIBS linker flags for GTKSHARP, overriding pkg-config GLIBSHARP_CFLAGS C compiler flags for GLIBSHARP, overriding pkg-config GLIBSHARP_LIBS linker flags for GLIBSHARP, overriding pkg-config GLIBSHARP_2_12_7_CFLAGS C compiler flags for GLIBSHARP_2_12_7, overriding pkg-config GLIBSHARP_2_12_7_LIBS linker flags for GLIBSHARP_2_12_7, overriding pkg-config GTKSHARP_A11Y_CFLAGS C compiler flags for GTKSHARP_A11Y, overriding pkg-config GTKSHARP_A11Y_LIBS linker flags for GTKSHARP_A11Y, overriding pkg-config KEYRINGSHARP_CFLAGS C compiler flags for KEYRINGSHARP, overriding pkg-config KEYRINGSHARP_LIBS linker flags for KEYRINGSHARP, overriding pkg-config FLICKRNET_CFLAGS C compiler flags for FLICKRNET, overriding pkg-config FLICKRNET_LIBS linker flags for FLICKRNET, overriding pkg-config NUNIT_CFLAGS C compiler flags for NUNIT, overriding pkg-config NUNIT_LIBS linker flags for NUNIT, overriding pkg-config F_CFLAGS C compiler flags for F, overriding pkg-config F_LIBS linker flags for F, overriding pkg-config GIO_CFLAGS C compiler flags for GIO, overriding pkg-config GIO_LIBS linker flags for GIO, overriding pkg-config GNOME_SHARP_CFLAGS C compiler flags for GNOME_SHARP, overriding pkg-config GNOME_SHARP_LIBS linker flags for GNOME_SHARP, overriding pkg-config GCONF_SHARP_CFLAGS C compiler flags for GCONF_SHARP, overriding pkg-config GCONF_SHARP_LIBS linker flags for GCONF_SHARP, overriding pkg-config MONO_ADDINS_CFLAGS C compiler flags for MONO_ADDINS, overriding pkg-config MONO_ADDINS_LIBS linker flags for MONO_ADDINS, overriding pkg-config MONO_ADDINS_SETUP_CFLAGS C compiler flags for MONO_ADDINS_SETUP, overriding pkg-config MONO_ADDINS_SETUP_LIBS linker flags for MONO_ADDINS_SETUP, overriding pkg-config MONO_ADDINS_GUI_CFLAGS C compiler flags for MONO_ADDINS_GUI, overriding pkg-config MONO_ADDINS_GUI_LIBS linker flags for MONO_ADDINS_GUI, overriding pkg-config NDESK_DBUS_CFLAGS C compiler flags for NDESK_DBUS, overriding pkg-config NDESK_DBUS_LIBS linker flags for NDESK_DBUS, overriding pkg-config LCMS_CFLAGS C compiler flags for LCMS, overriding pkg-config LCMS_LIBS linker flags for LCMS, overriding pkg-config UNIQUE_CFLAGS C compiler flags for UNIQUE, overriding pkg-config UNIQUE_LIBS linker flags for UNIQUE, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF f-spot configure 0.8.2 generated by GNU Autoconf 2.64 Copyright (C) 2009 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_func # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( cat <<\_ASBOX ## --------------------------------------------------------------------- ## ## Report this to http://bugzilla.gnome.org/enter_bug.cgi?product=f-spot ## ## --------------------------------------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by f-spot $as_me 0.8.2, which was generated by GNU Autoconf 2.64. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do for ac_t in install-sh install.sh shtool; do if test -f "$ac_dir/$ac_t"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/$ac_t -c" break 2 fi done done if test -z "$ac_aux_dir"; then as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test "${ac_cv_path_mkdir+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AWK+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='f-spot' VERSION='0.8.2' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5 $as_echo_n "checking how to create a ustar tar archive... " >&6; } # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar plaintar pax cpio none' _am_tools=${am_cv_prog_tar_ustar-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do { echo "$as_me:$LINENO: $_am_tar --version" >&5 ($_am_tar --version) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && break done am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"' am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x ustar -w "$$tardir"' am__tar_='pax -L -x ustar -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H ustar -L' am__tar_='find "$tardir" -print | cpio -o -H ustar -L' am__untar='cpio -i -H ustar -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_ustar}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -rf conftest.dir if test -s conftest.tar; then { echo "$as_me:$LINENO: $am__untar &5 ($am__untar &5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } grep GrepMe conftest.dir/file >/dev/null 2>&1 && break fi done rm -rf conftest.dir if test "${am_cv_prog_tar_ustar+set}" = set; then : $as_echo_n "(cached) " >&6 else am_cv_prog_tar_ustar=$_am_tool fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5 $as_echo "$am_cv_prog_tar_ustar" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE ac_config_headers="$ac_config_headers config.h" ACLOCAL_AMFLAGS="-I build/m4/shamrock -I build/m4/f-spot -I build/m4/shave \${ACLOCAL_FLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "no acceptable C compiler found in \$PATH See \`config.log' for more details." "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 rm -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out conftest.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } if test -z "$ac_file"; then : $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { as_fn_set_status 77 as_fn_error "C compiler cannot create executables See \`config.log' for more details." "$LINENO" 5; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of object files: cannot compile See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi case "$am__api_version" in 1.01234) as_fn_error "Automake 1.5 or newer is required to use intltool" "$LINENO" 5 ;; *) ;; esac if test -n "0.35.0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intltool >= 0.35.0" >&5 $as_echo_n "checking for intltool >= 0.35.0... " >&6; } INTLTOOL_REQUIRED_VERSION_AS_INT=`echo 0.35.0 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5 $as_echo "$INTLTOOL_APPLIED_VERSION found" >&6; } test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || as_fn_error "Your intltool is too old. You need intltool 0.35.0 or later." "$LINENO" 5 fi # Extract the first word of "intltool-update", so it can be a program name with args. set dummy intltool-update; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_INTLTOOL_UPDATE+set}" = set; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_UPDATE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_UPDATE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE if test -n "$INTLTOOL_UPDATE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5 $as_echo "$INTLTOOL_UPDATE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-merge", so it can be a program name with args. set dummy intltool-merge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_INTLTOOL_MERGE+set}" = set; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_MERGE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_MERGE="$INTLTOOL_MERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_MERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE if test -n "$INTLTOOL_MERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5 $as_echo "$INTLTOOL_MERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-extract", so it can be a program name with args. set dummy intltool-extract; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_INTLTOOL_EXTRACT+set}" = set; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_EXTRACT in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_EXTRACT="$INTLTOOL_EXTRACT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_EXTRACT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT if test -n "$INTLTOOL_EXTRACT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5 $as_echo "$INTLTOOL_EXTRACT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then as_fn_error "The intltool scripts were not found. Please install intltool." "$LINENO" 5 fi INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -p $(top_srcdir)/po $< $@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u /tmp $< $@' INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' # Check the gettext tools to make sure they are GNU # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_XGETTEXT+set}" = set; then : $as_echo_n "(cached) " >&6 else case $XGETTEXT in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_XGETTEXT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi XGETTEXT=$ac_cv_path_XGETTEXT if test -n "$XGETTEXT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_MSGMERGE+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MSGMERGE in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MSGMERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGMERGE=$ac_cv_path_MSGMERGE if test -n "$MSGMERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_MSGFMT+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGFMT=$ac_cv_path_MSGFMT if test -n "$MSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_GMSGFMT+set}" = set; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then as_fn_error "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then as_fn_error "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_INTLTOOL_PERL+set}" = set; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_PERL in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_PERL="$INTLTOOL_PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL if test -n "$INTLTOOL_PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_PERL" >&5 $as_echo "$INTLTOOL_PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_PERL"; then as_fn_error "perl not found; required for intltool" "$LINENO" 5 fi if test -z "`$INTLTOOL_PERL -v | fgrep '5.' 2> /dev/null`"; then as_fn_error "perl 5.x required for intltool" "$LINENO" 5 fi if test "x" != "xno-xml"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML::Parser" >&5 $as_echo_n "checking for XML::Parser... " >&6; } if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } else as_fn_error "XML::Parser perl module is required for intltool" "$LINENO" 5 fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = x""yes; then : DATADIRNAME=share else DATADIRNAME=lib fi ;; *) DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.2.6' macro_revision='1.3012' ltmain="$ac_aux_dir/ltmain.sh" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if test "${ac_cv_build+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if test "${ac_cv_host+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if test "${ac_cv_path_SED+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if test "${ac_cv_path_GREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if test "${ac_cv_path_EGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if test "${ac_cv_path_FGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if test "${lt_cv_path_LD+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if test "${lt_cv_path_NM+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$ac_tool_prefix"; then for ac_prog in "dumpbin -symbols" "link -dump -symbols" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_DUMPBIN+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in "dumpbin -symbols" "link -dump -symbols" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if test "${lt_cv_nm_interface+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:5324: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:5327: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:5330: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if test "${lt_cv_sys_max_cmd_len+set}" = set; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ = "XX$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if test "${lt_cv_ld_reload_flag+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OBJDUMP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if test "${lt_cv_deplibs_check_method+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AR+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ const struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line 6535 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if test "${lt_cv_cc_needs_belf+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_DSYMUTIL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_NMEDIT+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_LIPO+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OTOOL64+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if test "${lt_cv_apple_cc_single_mod+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if test "${lt_cv_ld_exported_symbols_list+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; pic_mode="$withval" else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if test "${lt_cv_objdir+set}" = set; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8061: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:8065: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl*) # IBM XL C 8.0/Fortran 10.1 on PPC lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5 $as_echo "$lt_prog_compiler_pic" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if test "${lt_cv_prog_compiler_pic_works+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8400: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:8404: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test "${lt_cv_prog_compiler_static_works+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8505: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:8509: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8560: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:8564: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu) link_all_deplibs=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag= tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld='-rpath $libdir' archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes=yes ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported whole_archive_flag_spec='' link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=echo archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; freebsd1*) ld_shlibs=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo(void) {} _ACEOF if ac_fn_c_try_link "$LINENO"; then : archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then archive_cmds_need_lc=no else archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5 $as_echo "$archive_cmds_need_lc" >&6; } ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` else lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if test "${ac_cv_lib_dld_shl_load+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if test "${ac_cv_lib_svld_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if test "${ac_cv_lib_dld_dld_link+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if test "${lt_cv_dlopen_self+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line 10943 "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if test "${lt_cv_dlopen_self_static+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line 11039 "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_config_commands="$ac_config_commands libtool" # Only expand once: DISTCHECK_CONFIGURE_FLAGS="--disable-docs --enable-release" API_VERSION=0.8 ASM_VERSION=0.8.0.0 DISPLAY_VERSION="0.8.2" expanded_libdir=`( case $prefix in NONE) prefix=$ac_default_prefix ;; *) ;; esac case $exec_prefix in NONE) exec_prefix=$prefix ;; *) ;; esac eval echo $libdir )` expanded_bindir=`( case $prefix in NONE) prefix=$ac_default_prefix ;; *) ;; esac case $exec_prefix in NONE) exec_prefix=$prefix ;; *) ;; esac eval echo $bindir )` case $prefix in NONE) prefix=$ac_default_prefix ;; *) ;; esac case $exec_prefix in NONE) exec_prefix=$prefix ;; *) ;; esac expanded_datadir=`(eval echo $datadir)` expanded_datadir=`(eval echo $expanded_datadir)` if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi # Check whether --enable-user-help was given. if test "${enable_user_help+set}" = set; then : enableval=$enable_user_help; else enable_user_help=auto fi if test "x$enable_user_help" = "xauto"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNOME_DOC_UTILS" >&5 $as_echo_n "checking for GNOME_DOC_UTILS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GNOME_DOC_UTILS_CFLAGS"; then pkg_cv_GNOME_DOC_UTILS_CFLAGS="$GNOME_DOC_UTILS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnome-doc-utils\""; } >&5 ($PKG_CONFIG --exists --print-errors "gnome-doc-utils") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GNOME_DOC_UTILS_CFLAGS=`$PKG_CONFIG --cflags "gnome-doc-utils" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GNOME_DOC_UTILS_LIBS"; then pkg_cv_GNOME_DOC_UTILS_LIBS="$GNOME_DOC_UTILS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnome-doc-utils\""; } >&5 ($PKG_CONFIG --exists --print-errors "gnome-doc-utils") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GNOME_DOC_UTILS_LIBS=`$PKG_CONFIG --libs "gnome-doc-utils" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GNOME_DOC_UTILS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gnome-doc-utils"` else GNOME_DOC_UTILS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gnome-doc-utils"` fi # Put the nasty error message in config.log where it belongs echo "$GNOME_DOC_UTILS_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } enable_user_help=no elif test $pkg_failed = untried; then enable_user_help=no else GNOME_DOC_UTILS_CFLAGS=$pkg_cv_GNOME_DOC_UTILS_CFLAGS GNOME_DOC_UTILS_LIBS=$pkg_cv_GNOME_DOC_UTILS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_user_help=yes fi elif test "x$enable_user_help" = "xyes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNOME_DOC_UTILS" >&5 $as_echo_n "checking for GNOME_DOC_UTILS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GNOME_DOC_UTILS_CFLAGS"; then pkg_cv_GNOME_DOC_UTILS_CFLAGS="$GNOME_DOC_UTILS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnome-doc-utils\""; } >&5 ($PKG_CONFIG --exists --print-errors "gnome-doc-utils") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GNOME_DOC_UTILS_CFLAGS=`$PKG_CONFIG --cflags "gnome-doc-utils" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GNOME_DOC_UTILS_LIBS"; then pkg_cv_GNOME_DOC_UTILS_LIBS="$GNOME_DOC_UTILS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnome-doc-utils\""; } >&5 ($PKG_CONFIG --exists --print-errors "gnome-doc-utils") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GNOME_DOC_UTILS_LIBS=`$PKG_CONFIG --libs "gnome-doc-utils" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GNOME_DOC_UTILS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gnome-doc-utils"` else GNOME_DOC_UTILS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gnome-doc-utils"` fi # Put the nasty error message in config.log where it belongs echo "$GNOME_DOC_UTILS_PKG_ERRORS" >&5 as_fn_error "Package requirements (gnome-doc-utils) were not met: $GNOME_DOC_UTILS_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GNOME_DOC_UTILS_CFLAGS and GNOME_DOC_UTILS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GNOME_DOC_UTILS_CFLAGS and GNOME_DOC_UTILS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else GNOME_DOC_UTILS_CFLAGS=$pkg_cv_GNOME_DOC_UTILS_CFLAGS GNOME_DOC_UTILS_LIBS=$pkg_cv_GNOME_DOC_UTILS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi fi if test "x$enable_user_help" = "xyes"; then gdu_cv_version_required=0.17.3 if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnome-doc-utils >= \$gdu_cv_version_required\""; } >&5 ($PKG_CONFIG --exists --print-errors "gnome-doc-utils >= $gdu_cv_version_required") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then gdu_cv_have_gdu=yes else gdu_cv_have_gdu=no fi if test "$gdu_cv_have_gdu" = "yes"; then enable_user_help=yes else enable_user_help=no fi # Check whether --with-help-dir was given. if test "${with_help_dir+set}" = set; then : withval=$with_help_dir; else with_help_dir='${datadir}/gnome/help' fi HELP_DIR="$with_help_dir" # Check whether --with-omf-dir was given. if test "${with_omf_dir+set}" = set; then : withval=$with_omf_dir; else with_omf_dir='${datadir}/omf' fi OMF_DIR="$with_omf_dir" # Check whether --with-help-formats was given. if test "${with_help_formats+set}" = set; then : withval=$with_help_formats; else with_help_formats='' fi DOC_USER_FORMATS="$with_help_formats" # Check whether --enable-scrollkeeper was given. if test "${enable_scrollkeeper+set}" = set; then : enableval=$enable_scrollkeeper; else enable_scrollkeeper=yes fi if test "$gdu_cv_have_gdu" = "yes" -a "$enable_scrollkeeper" = "yes"; then ENABLE_SK_TRUE= ENABLE_SK_FALSE='#' else ENABLE_SK_TRUE='#' ENABLE_SK_FALSE= fi DISTCHECK_CONFIGURE_FLAGS="--disable-scrollkeeper $DISTCHECK_CONFIGURE_FLAGS" if test "$gdu_cv_have_gdu" = "yes"; then HAVE_GNOME_DOC_UTILS_TRUE= HAVE_GNOME_DOC_UTILS_FALSE='#' else HAVE_GNOME_DOC_UTILS_TRUE='#' HAVE_GNOME_DOC_UTILS_FALSE= fi else if false; then ENABLE_SK_TRUE= ENABLE_SK_FALSE='#' else ENABLE_SK_TRUE='#' ENABLE_SK_FALSE= fi fi if test "x$enable_user_help" = "xyes"; then HAVE_GNOME_DOC_UTILS_TRUE= HAVE_GNOME_DOC_UTILS_FALSE='#' else HAVE_GNOME_DOC_UTILS_TRUE='#' HAVE_GNOME_DOC_UTILS_FALSE= fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MONO_MODULE" >&5 $as_echo_n "checking for MONO_MODULE... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$MONO_MODULE_CFLAGS"; then pkg_cv_MONO_MODULE_CFLAGS="$MONO_MODULE_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mono >= 2.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "mono >= 2.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MONO_MODULE_CFLAGS=`$PKG_CONFIG --cflags "mono >= 2.2" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$MONO_MODULE_LIBS"; then pkg_cv_MONO_MODULE_LIBS="$MONO_MODULE_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mono >= 2.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "mono >= 2.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MONO_MODULE_LIBS=`$PKG_CONFIG --libs "mono >= 2.2" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then MONO_MODULE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "mono >= 2.2"` else MONO_MODULE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "mono >= 2.2"` fi # Put the nasty error message in config.log where it belongs echo "$MONO_MODULE_PKG_ERRORS" >&5 as_fn_error "Package requirements (mono >= 2.2) were not met: $MONO_MODULE_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables MONO_MODULE_CFLAGS and MONO_MODULE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables MONO_MODULE_CFLAGS and MONO_MODULE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else MONO_MODULE_CFLAGS=$pkg_cv_MONO_MODULE_CFLAGS MONO_MODULE_LIBS=$pkg_cv_MONO_MODULE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi # Extract the first word of "gmcs", so it can be a program name with args. set dummy gmcs; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_MCS+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MCS in [\\/]* | ?:[\\/]*) ac_cv_path_MCS="$MCS" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MCS="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_MCS" && ac_cv_path_MCS="no" ;; esac fi MCS=$ac_cv_path_MCS if test -n "$MCS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MCS" >&5 $as_echo "$MCS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$MCS" = "xno"; then as_fn_error "You need to install 'gmcs'" "$LINENO" 5 fi # Extract the first word of "mono", so it can be a program name with args. set dummy mono; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_MONO+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MONO in [\\/]* | ?:[\\/]*) ac_cv_path_MONO="$MONO" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MONO="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_MONO" && ac_cv_path_MONO="no" ;; esac fi MONO=$ac_cv_path_MONO if test -n "$MONO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MONO" >&5 $as_echo "$MONO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$MONO" = "xno"; then as_fn_error "You need to install 'mono'" "$LINENO" 5 fi for asm in $(echo "mono,2.0,Mono.Posix Mono.Simd System System.Runtime.Remoting System.Web System.Web.Services System.Data Mono.Cairo ICSharpCode.SharpZipLib " | cut -d, -f3- | sed 's/\,/ /g') do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mono 2.0 GAC for $asm.dll" >&5 $as_echo_n "checking for Mono 2.0 GAC for $asm.dll... " >&6; } if test \ -e "$($PKG_CONFIG --variable=libdir mono)/mono/2.0/$asm.dll" -o \ -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/2.0/$asm.dll"; \ then \ { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error "missing required Mono 2.0 assembly: $asm.dll" "$LINENO" 5 fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5 $as_echo_n "checking for library containing strerror... " >&6; } if test "${ac_cv_search_strerror+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strerror (); int main () { return strerror (); ; return 0; } _ACEOF for ac_lib in '' cposix; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_strerror=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_strerror+set}" = set; then : break fi done if test "${ac_cv_search_strerror+set}" = set; then : else ac_cv_search_strerror=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5 $as_echo "$ac_cv_search_strerror" >&6; } ac_res=$ac_cv_search_strerror if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "no acceptable C compiler found in \$PATH See \`config.log' for more details." "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 rm -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # Check whether --enable-glibtest was given. if test "${enable_glibtest+set}" = set; then : enableval=$enable_glibtest; else enable_glibtest=yes fi pkg_config_args=glib-2.0 for module in . do case "$module" in gmodule) pkg_config_args="$pkg_config_args gmodule-2.0" ;; gmodule-no-export) pkg_config_args="$pkg_config_args gmodule-no-export-2.0" ;; gobject) pkg_config_args="$pkg_config_args gobject-2.0" ;; gthread) pkg_config_args="$pkg_config_args gthread-2.0" ;; gio*) pkg_config_args="$pkg_config_args $module-2.0" ;; esac done if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.16 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi no_glib="" if test "x$PKG_CONFIG" = x ; then no_glib=yes PKG_CONFIG=no fi min_glib_version=2.0.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB - version >= $min_glib_version" >&5 $as_echo_n "checking for GLIB - version >= $min_glib_version... " >&6; } if test x$PKG_CONFIG != xno ; then ## don't try to run the test against uninstalled libtool libs if $PKG_CONFIG --uninstalled $pkg_config_args; then echo "Will use uninstalled version of GLib found in PKG_CONFIG_PATH" enable_glibtest=no fi if $PKG_CONFIG --atleast-version $min_glib_version $pkg_config_args; then : else no_glib=yes fi fi if test x"$no_glib" = x ; then GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0` GOBJECT_QUERY=`$PKG_CONFIG --variable=gobject_query glib-2.0` GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0` GLIB_CFLAGS=`$PKG_CONFIG --cflags $pkg_config_args` GLIB_LIBS=`$PKG_CONFIG --libs $pkg_config_args` glib_config_major_version=`$PKG_CONFIG --modversion glib-2.0 | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` glib_config_minor_version=`$PKG_CONFIG --modversion glib-2.0 | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` glib_config_micro_version=`$PKG_CONFIG --modversion glib-2.0 | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_glibtest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GLIB_CFLAGS" LIBS="$GLIB_LIBS $LIBS" rm -f conf.glibtest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { int major, minor, micro; char *tmp_version; fclose (fopen ("conf.glibtest", "w")); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = g_strdup("$min_glib_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_glib_version"); exit(1); } if ((glib_major_version != $glib_config_major_version) || (glib_minor_version != $glib_config_minor_version) || (glib_micro_version != $glib_config_micro_version)) { printf("\n*** 'pkg-config --modversion glib-2.0' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version, glib_major_version, glib_minor_version, glib_micro_version); printf ("*** was found! If pkg-config was correct, then it is best\n"); printf ("*** to remove the old version of GLib. You may also be able to fix the error\n"); printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); printf("*** required on your system.\n"); printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n"); printf("*** to point to the correct configuration files\n"); } else if ((glib_major_version != GLIB_MAJOR_VERSION) || (glib_minor_version != GLIB_MINOR_VERSION) || (glib_micro_version != GLIB_MICRO_VERSION)) { printf("*** GLIB header files (version %d.%d.%d) do not match\n", GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); printf("*** library (version %d.%d.%d)\n", glib_major_version, glib_minor_version, glib_micro_version); } else { if ((glib_major_version > major) || ((glib_major_version == major) && (glib_minor_version > minor)) || ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of GLIB (%d.%d.%d) was found.\n", glib_major_version, glib_minor_version, glib_micro_version); printf("*** You need a version of GLIB newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** GLIB is always available from ftp://ftp.gtk.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the pkg-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of GLIB, but you can also set the PKG_CONFIG environment to point to the\n"); printf("*** correct copy of pkg-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_glib=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_glib" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version)" >&5 $as_echo "yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version)" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$PKG_CONFIG" = "no" ; then echo "*** A new enough version of pkg-config was not found." echo "*** See http://www.freedesktop.org/software/pkgconfig/" else if test -f conf.glibtest ; then : else echo "*** Could not run GLIB test program, checking why..." ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GLIB_CFLAGS" LIBS="$LIBS $GLIB_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding GLIB or finding the wrong" echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means GLIB is incorrectly installed." fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi GLIB_CFLAGS="" GLIB_LIBS="" GLIB_GENMARSHAL="" GOBJECT_QUERY="" GLIB_MKENUMS="" : fi rm -f conf.glibtest GTKSHARP_REQUIRED=2.12.2 pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKSHARP" >&5 $as_echo_n "checking for GTKSHARP... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GTKSHARP_CFLAGS"; then pkg_cv_GTKSHARP_CFLAGS="$GTKSHARP_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-sharp-2.0 >= \$GTKSHARP_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk-sharp-2.0 >= $GTKSHARP_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKSHARP_CFLAGS=`$PKG_CONFIG --cflags "gtk-sharp-2.0 >= $GTKSHARP_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GTKSHARP_LIBS"; then pkg_cv_GTKSHARP_LIBS="$GTKSHARP_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-sharp-2.0 >= \$GTKSHARP_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk-sharp-2.0 >= $GTKSHARP_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKSHARP_LIBS=`$PKG_CONFIG --libs "gtk-sharp-2.0 >= $GTKSHARP_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTKSHARP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk-sharp-2.0 >= $GTKSHARP_REQUIRED"` else GTKSHARP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk-sharp-2.0 >= $GTKSHARP_REQUIRED"` fi # Put the nasty error message in config.log where it belongs echo "$GTKSHARP_PKG_ERRORS" >&5 as_fn_error "Package requirements (gtk-sharp-2.0 >= $GTKSHARP_REQUIRED) were not met: $GTKSHARP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTKSHARP_CFLAGS and GTKSHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTKSHARP_CFLAGS and GTKSHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else GTKSHARP_CFLAGS=$pkg_cv_GTKSHARP_CFLAGS GTKSHARP_LIBS=$pkg_cv_GTKSHARP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIBSHARP" >&5 $as_echo_n "checking for GLIBSHARP... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GLIBSHARP_CFLAGS"; then pkg_cv_GLIBSHARP_CFLAGS="$GLIBSHARP_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-sharp-2.0 >= \$GTKSHARP_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-sharp-2.0 >= $GTKSHARP_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIBSHARP_CFLAGS=`$PKG_CONFIG --cflags "glib-sharp-2.0 >= $GTKSHARP_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GLIBSHARP_LIBS"; then pkg_cv_GLIBSHARP_LIBS="$GLIBSHARP_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-sharp-2.0 >= \$GTKSHARP_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-sharp-2.0 >= $GTKSHARP_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIBSHARP_LIBS=`$PKG_CONFIG --libs "glib-sharp-2.0 >= $GTKSHARP_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLIBSHARP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "glib-sharp-2.0 >= $GTKSHARP_REQUIRED"` else GLIBSHARP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "glib-sharp-2.0 >= $GTKSHARP_REQUIRED"` fi # Put the nasty error message in config.log where it belongs echo "$GLIBSHARP_PKG_ERRORS" >&5 as_fn_error "Package requirements (glib-sharp-2.0 >= $GTKSHARP_REQUIRED) were not met: $GLIBSHARP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GLIBSHARP_CFLAGS and GLIBSHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GLIBSHARP_CFLAGS and GLIBSHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else GLIBSHARP_CFLAGS=$pkg_cv_GLIBSHARP_CFLAGS GLIBSHARP_LIBS=$pkg_cv_GLIBSHARP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIBSHARP_2_12_7" >&5 $as_echo_n "checking for GLIBSHARP_2_12_7... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GLIBSHARP_2_12_7_CFLAGS"; then pkg_cv_GLIBSHARP_2_12_7_CFLAGS="$GLIBSHARP_2_12_7_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-sharp-2.0 >= 2.12.7\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-sharp-2.0 >= 2.12.7") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIBSHARP_2_12_7_CFLAGS=`$PKG_CONFIG --cflags "glib-sharp-2.0 >= 2.12.7" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GLIBSHARP_2_12_7_LIBS"; then pkg_cv_GLIBSHARP_2_12_7_LIBS="$GLIBSHARP_2_12_7_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-sharp-2.0 >= 2.12.7\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-sharp-2.0 >= 2.12.7") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIBSHARP_2_12_7_LIBS=`$PKG_CONFIG --libs "glib-sharp-2.0 >= 2.12.7" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLIBSHARP_2_12_7_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "glib-sharp-2.0 >= 2.12.7"` else GLIBSHARP_2_12_7_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "glib-sharp-2.0 >= 2.12.7"` fi # Put the nasty error message in config.log where it belongs echo "$GLIBSHARP_2_12_7_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GLIBSHARP_2_12_7=no elif test $pkg_failed = untried; then HAVE_GLIBSHARP_2_12_7=no else GLIBSHARP_2_12_7_CFLAGS=$pkg_cv_GLIBSHARP_2_12_7_CFLAGS GLIBSHARP_2_12_7_LIBS=$pkg_cv_GLIBSHARP_2_12_7_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GLIBSHARP_2_12_7=yes fi if test "$HAVE_GLIBSHARP_2_12_7" = "yes"; then HAVE_GLIBSHARP_2_12_7_TRUE= HAVE_GLIBSHARP_2_12_7_FALSE='#' else HAVE_GLIBSHARP_2_12_7_TRUE='#' HAVE_GLIBSHARP_2_12_7_FALSE= fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKSHARP_A11Y" >&5 $as_echo_n "checking for GTKSHARP_A11Y... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GTKSHARP_A11Y_CFLAGS"; then pkg_cv_GTKSHARP_A11Y_CFLAGS="$GTKSHARP_A11Y_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-sharp-2.0 >= 2.12.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk-sharp-2.0 >= 2.12.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKSHARP_A11Y_CFLAGS=`$PKG_CONFIG --cflags "gtk-sharp-2.0 >= 2.12.10" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GTKSHARP_A11Y_LIBS"; then pkg_cv_GTKSHARP_A11Y_LIBS="$GTKSHARP_A11Y_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-sharp-2.0 >= 2.12.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk-sharp-2.0 >= 2.12.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKSHARP_A11Y_LIBS=`$PKG_CONFIG --libs "gtk-sharp-2.0 >= 2.12.10" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTKSHARP_A11Y_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk-sharp-2.0 >= 2.12.10"` else GTKSHARP_A11Y_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk-sharp-2.0 >= 2.12.10"` fi # Put the nasty error message in config.log where it belongs echo "$GTKSHARP_A11Y_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } gtksharp_with_a11y=no elif test $pkg_failed = untried; then gtksharp_with_a11y=no else GTKSHARP_A11Y_CFLAGS=$pkg_cv_GTKSHARP_A11Y_CFLAGS GTKSHARP_A11Y_LIBS=$pkg_cv_GTKSHARP_A11Y_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } gtksharp_with_a11y=yes fi if test "x$gtksharp_with_a11y" = "xyes"; then ENABLE_ATK_TRUE= ENABLE_ATK_FALSE='#' else ENABLE_ATK_TRUE='#' ENABLE_ATK_FALSE= fi GNOMEKEYRINGSHARP_REQUIRED=1.0 pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for KEYRINGSHARP" >&5 $as_echo_n "checking for KEYRINGSHARP... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$KEYRINGSHARP_CFLAGS"; then pkg_cv_KEYRINGSHARP_CFLAGS="$KEYRINGSHARP_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnome-keyring-sharp-1.0 >= \$GNOMEKEYRINGSHARP_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "gnome-keyring-sharp-1.0 >= $GNOMEKEYRINGSHARP_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_KEYRINGSHARP_CFLAGS=`$PKG_CONFIG --cflags "gnome-keyring-sharp-1.0 >= $GNOMEKEYRINGSHARP_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$KEYRINGSHARP_LIBS"; then pkg_cv_KEYRINGSHARP_LIBS="$KEYRINGSHARP_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnome-keyring-sharp-1.0 >= \$GNOMEKEYRINGSHARP_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "gnome-keyring-sharp-1.0 >= $GNOMEKEYRINGSHARP_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_KEYRINGSHARP_LIBS=`$PKG_CONFIG --libs "gnome-keyring-sharp-1.0 >= $GNOMEKEYRINGSHARP_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then KEYRINGSHARP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gnome-keyring-sharp-1.0 >= $GNOMEKEYRINGSHARP_REQUIRED"` else KEYRINGSHARP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gnome-keyring-sharp-1.0 >= $GNOMEKEYRINGSHARP_REQUIRED"` fi # Put the nasty error message in config.log where it belongs echo "$KEYRINGSHARP_PKG_ERRORS" >&5 as_fn_error "Package requirements (gnome-keyring-sharp-1.0 >= $GNOMEKEYRINGSHARP_REQUIRED) were not met: $KEYRINGSHARP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables KEYRINGSHARP_CFLAGS and KEYRINGSHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables KEYRINGSHARP_CFLAGS and KEYRINGSHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else KEYRINGSHARP_CFLAGS=$pkg_cv_KEYRINGSHARP_CFLAGS KEYRINGSHARP_LIBS=$pkg_cv_KEYRINGSHARP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi FLICKRNET_REQUIRED=2.0 pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FLICKRNET" >&5 $as_echo_n "checking for FLICKRNET... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$FLICKRNET_CFLAGS"; then pkg_cv_FLICKRNET_CFLAGS="$FLICKRNET_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"flickrnet >= \$FLICKRNET_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "flickrnet >= $FLICKRNET_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FLICKRNET_CFLAGS=`$PKG_CONFIG --cflags "flickrnet >= $FLICKRNET_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$FLICKRNET_LIBS"; then pkg_cv_FLICKRNET_LIBS="$FLICKRNET_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"flickrnet >= \$FLICKRNET_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "flickrnet >= $FLICKRNET_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FLICKRNET_LIBS=`$PKG_CONFIG --libs "flickrnet >= $FLICKRNET_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FLICKRNET_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "flickrnet >= $FLICKRNET_REQUIRED"` else FLICKRNET_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "flickrnet >= $FLICKRNET_REQUIRED"` fi # Put the nasty error message in config.log where it belongs echo "$FLICKRNET_PKG_ERRORS" >&5 as_fn_error "Package requirements (flickrnet >= $FLICKRNET_REQUIRED) were not met: $FLICKRNET_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables FLICKRNET_CFLAGS and FLICKRNET_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables FLICKRNET_CFLAGS and FLICKRNET_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else FLICKRNET_CFLAGS=$pkg_cv_FLICKRNET_CFLAGS FLICKRNET_LIBS=$pkg_cv_FLICKRNET_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi NUNIT_REQUIRED=2.4.7 # Check whether --enable-tests was given. if test "${enable_tests+set}" = set; then : enableval=$enable_tests; enable_tests=$enableval else enable_tests="no" fi if test "x$enable_tests" = "xno"; then do_tests=no if false; then ENABLE_TESTS_TRUE= ENABLE_TESTS_FALSE='#' else ENABLE_TESTS_TRUE='#' ENABLE_TESTS_FALSE= fi else pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NUNIT" >&5 $as_echo_n "checking for NUNIT... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$NUNIT_CFLAGS"; then pkg_cv_NUNIT_CFLAGS="$NUNIT_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nunit >= \$NUNIT_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "nunit >= $NUNIT_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NUNIT_CFLAGS=`$PKG_CONFIG --cflags "nunit >= $NUNIT_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$NUNIT_LIBS"; then pkg_cv_NUNIT_LIBS="$NUNIT_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nunit >= \$NUNIT_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "nunit >= $NUNIT_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NUNIT_LIBS=`$PKG_CONFIG --libs "nunit >= $NUNIT_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then NUNIT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "nunit >= $NUNIT_REQUIRED"` else NUNIT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "nunit >= $NUNIT_REQUIRED"` fi # Put the nasty error message in config.log where it belongs echo "$NUNIT_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } do_tests="no" elif test $pkg_failed = untried; then do_tests="no" else NUNIT_CFLAGS=$pkg_cv_NUNIT_CFLAGS NUNIT_LIBS=$pkg_cv_NUNIT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } do_tests="yes" fi if test "x$do_tests" = "xyes"; then ENABLE_TESTS_TRUE= ENABLE_TESTS_FALSE='#' else ENABLE_TESTS_TRUE='#' ENABLE_TESTS_FALSE= fi if test "x$do_tests" = "xno"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NUNIT" >&5 $as_echo_n "checking for NUNIT... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$NUNIT_CFLAGS"; then pkg_cv_NUNIT_CFLAGS="$NUNIT_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mono-nunit >= 2.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "mono-nunit >= 2.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NUNIT_CFLAGS=`$PKG_CONFIG --cflags "mono-nunit >= 2.4" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$NUNIT_LIBS"; then pkg_cv_NUNIT_LIBS="$NUNIT_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mono-nunit >= 2.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "mono-nunit >= 2.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NUNIT_LIBS=`$PKG_CONFIG --libs "mono-nunit >= 2.4" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then NUNIT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "mono-nunit >= 2.4"` else NUNIT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "mono-nunit >= 2.4"` fi # Put the nasty error message in config.log where it belongs echo "$NUNIT_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } do_tests="no" elif test $pkg_failed = untried; then do_tests="no" else NUNIT_CFLAGS=$pkg_cv_NUNIT_CFLAGS NUNIT_LIBS=$pkg_cv_NUNIT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } do_tests="yes" fi if test "x$do_tests" = "xyes"; then ENABLE_TESTS_TRUE= ENABLE_TESTS_FALSE='#' else ENABLE_TESTS_TRUE='#' ENABLE_TESTS_FALSE= fi if test "x$do_tests" = "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find nunit: tests will not be available" >&5 $as_echo "$as_me: WARNING: Could not find nunit: tests will not be available" >&2;} fi fi fi # ---------------------------------- # Extract the first word of "mono", so it can be a program name with args. set dummy mono; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_MONO+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MONO in [\\/]* | ?:[\\/]*) ac_cv_path_MONO="$MONO" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MONO="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MONO=$ac_cv_path_MONO if test -n "$MONO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MONO" >&5 $as_echo "$MONO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmcs", so it can be a program name with args. set dummy gmcs; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_MCS+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MCS in [\\/]* | ?:[\\/]*) ac_cv_path_MCS="$MCS" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MCS="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MCS=$ac_cv_path_MCS if test -n "$MCS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MCS" >&5 $as_echo "$MCS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi CS="C#" if test ! -x "$MCS"; then as_fn_error "No $CS compiler found" "$LINENO" 5 fi # Extract the first word of "gapi2-fixup", so it can be a program name with args. set dummy gapi2-fixup; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_GAPI2FIXUP+set}" = set; then : $as_echo_n "(cached) " >&6 else case $GAPI2FIXUP in [\\/]* | ?:[\\/]*) ac_cv_path_GAPI2FIXUP="$GAPI2FIXUP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GAPI2FIXUP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GAPI2FIXUP" && ac_cv_path_GAPI2FIXUP="no" ;; esac fi GAPI2FIXUP=$ac_cv_path_GAPI2FIXUP if test -n "$GAPI2FIXUP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GAPI2FIXUP" >&5 $as_echo "$GAPI2FIXUP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test ! -x "$GAPI2FIXUP"; then as_fn_error "No gapi post-processor found" "$LINENO" 5 fi # Extract the first word of "gapi2-parser", so it can be a program name with args. set dummy gapi2-parser; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_GAPI2PARSER+set}" = set; then : $as_echo_n "(cached) " >&6 else case $GAPI2PARSER in [\\/]* | ?:[\\/]*) ac_cv_path_GAPI2PARSER="$GAPI2PARSER" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GAPI2PARSER="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GAPI2PARSER" && ac_cv_path_GAPI2PARSER="no" ;; esac fi GAPI2PARSER=$ac_cv_path_GAPI2PARSER if test -n "$GAPI2PARSER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GAPI2PARSER" >&5 $as_echo "$GAPI2PARSER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test ! -x "$GAPI2PARSER"; then as_fn_error "No gapi parser found" "$LINENO" 5 fi # Extract the first word of "gapi2-codegen", so it can be a program name with args. set dummy gapi2-codegen; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_GAPI2CODEGEN+set}" = set; then : $as_echo_n "(cached) " >&6 else case $GAPI2CODEGEN in [\\/]* | ?:[\\/]*) ac_cv_path_GAPI2CODEGEN="$GAPI2CODEGEN" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GAPI2CODEGEN="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GAPI2CODEGEN" && ac_cv_path_GAPI2CODEGEN="no" ;; esac fi GAPI2CODEGEN=$ac_cv_path_GAPI2CODEGEN if test -n "$GAPI2CODEGEN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GAPI2CODEGEN" >&5 $as_echo "$GAPI2CODEGEN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test ! -x "$GAPI2CODEGEN"; then as_fn_error "No gapi code generator found" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mono.pc" >&5 $as_echo_n "checking for mono.pc... " >&6; } if test -z `$PKG_CONFIG --variable=prefix mono`; then as_fn_error "missing the mono.pc file, usually found in the mono-devel package" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } fi LIBGNOME_REQUIRED=2.2 LIBGNOMEUI_REQUIRED=2.2 GIO_REQUIRED=2.22.0 GTKSHARPBEANS_REQUIRED=2.13.92 GTKSHARP_REQUIRED=2.12.2 GTK_REQUIRED=2.14 NDESK_DBUS_REQUIRED=0.4.2 NDESK_DBUS_GLIB_REQUIRED=0.3.0 MONO_CAIRO_REQUIRED=1.2.5 CAIRO_REQUIRED=1.4.0 LCMS_REQUIRED=1.12 MONOADDINS_REQUIRED=0.3 pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for F" >&5 $as_echo_n "checking for F... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$F_CFLAGS"; then pkg_cv_F_CFLAGS="$F_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgnome-2.0 >= \$LIBGNOME_REQUIRED libgnomeui-2.0 >= \$LIBGNOMEUI_REQUIRED gtk+-2.0 >= \$GTK_REQUIRED mono-cairo >= \$MONO_CAIRO_REQUIRED cairo >= \$CAIRO_REQUIRED mono-addins >= \$MONOADDINS_REQUIRED mono-addins-gui >= \$MONOADDINS_REQUIRED mono-addins-setup >= \$MONOADDINS_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "libgnome-2.0 >= $LIBGNOME_REQUIRED libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED gtk+-2.0 >= $GTK_REQUIRED mono-cairo >= $MONO_CAIRO_REQUIRED cairo >= $CAIRO_REQUIRED mono-addins >= $MONOADDINS_REQUIRED mono-addins-gui >= $MONOADDINS_REQUIRED mono-addins-setup >= $MONOADDINS_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_F_CFLAGS=`$PKG_CONFIG --cflags "libgnome-2.0 >= $LIBGNOME_REQUIRED libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED gtk+-2.0 >= $GTK_REQUIRED mono-cairo >= $MONO_CAIRO_REQUIRED cairo >= $CAIRO_REQUIRED mono-addins >= $MONOADDINS_REQUIRED mono-addins-gui >= $MONOADDINS_REQUIRED mono-addins-setup >= $MONOADDINS_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$F_LIBS"; then pkg_cv_F_LIBS="$F_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgnome-2.0 >= \$LIBGNOME_REQUIRED libgnomeui-2.0 >= \$LIBGNOMEUI_REQUIRED gtk+-2.0 >= \$GTK_REQUIRED mono-cairo >= \$MONO_CAIRO_REQUIRED cairo >= \$CAIRO_REQUIRED mono-addins >= \$MONOADDINS_REQUIRED mono-addins-gui >= \$MONOADDINS_REQUIRED mono-addins-setup >= \$MONOADDINS_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "libgnome-2.0 >= $LIBGNOME_REQUIRED libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED gtk+-2.0 >= $GTK_REQUIRED mono-cairo >= $MONO_CAIRO_REQUIRED cairo >= $CAIRO_REQUIRED mono-addins >= $MONOADDINS_REQUIRED mono-addins-gui >= $MONOADDINS_REQUIRED mono-addins-setup >= $MONOADDINS_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_F_LIBS=`$PKG_CONFIG --libs "libgnome-2.0 >= $LIBGNOME_REQUIRED libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED gtk+-2.0 >= $GTK_REQUIRED mono-cairo >= $MONO_CAIRO_REQUIRED cairo >= $CAIRO_REQUIRED mono-addins >= $MONOADDINS_REQUIRED mono-addins-gui >= $MONOADDINS_REQUIRED mono-addins-setup >= $MONOADDINS_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then F_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libgnome-2.0 >= $LIBGNOME_REQUIRED libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED gtk+-2.0 >= $GTK_REQUIRED mono-cairo >= $MONO_CAIRO_REQUIRED cairo >= $CAIRO_REQUIRED mono-addins >= $MONOADDINS_REQUIRED mono-addins-gui >= $MONOADDINS_REQUIRED mono-addins-setup >= $MONOADDINS_REQUIRED"` else F_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libgnome-2.0 >= $LIBGNOME_REQUIRED libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED gtk+-2.0 >= $GTK_REQUIRED mono-cairo >= $MONO_CAIRO_REQUIRED cairo >= $CAIRO_REQUIRED mono-addins >= $MONOADDINS_REQUIRED mono-addins-gui >= $MONOADDINS_REQUIRED mono-addins-setup >= $MONOADDINS_REQUIRED"` fi # Put the nasty error message in config.log where it belongs echo "$F_PKG_ERRORS" >&5 as_fn_error "Package requirements (libgnome-2.0 >= $LIBGNOME_REQUIRED libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED gtk+-2.0 >= $GTK_REQUIRED mono-cairo >= $MONO_CAIRO_REQUIRED cairo >= $CAIRO_REQUIRED mono-addins >= $MONOADDINS_REQUIRED mono-addins-gui >= $MONOADDINS_REQUIRED mono-addins-setup >= $MONOADDINS_REQUIRED) were not met: $F_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables F_CFLAGS and F_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables F_CFLAGS and F_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else F_CFLAGS=$pkg_cv_F_CFLAGS F_LIBS=$pkg_cv_F_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GIO" >&5 $as_echo_n "checking for GIO... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GIO_CFLAGS"; then pkg_cv_GIO_CFLAGS="$GIO_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-2.0 >= \$GIO_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "gio-2.0 >= $GIO_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GIO_CFLAGS=`$PKG_CONFIG --cflags "gio-2.0 >= $GIO_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GIO_LIBS"; then pkg_cv_GIO_LIBS="$GIO_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-2.0 >= \$GIO_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "gio-2.0 >= $GIO_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GIO_LIBS=`$PKG_CONFIG --libs "gio-2.0 >= $GIO_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GIO_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gio-2.0 >= $GIO_REQUIRED"` else GIO_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gio-2.0 >= $GIO_REQUIRED"` fi # Put the nasty error message in config.log where it belongs echo "$GIO_PKG_ERRORS" >&5 as_fn_error "Package requirements (gio-2.0 >= $GIO_REQUIRED) were not met: $GIO_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GIO_CFLAGS and GIO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GIO_CFLAGS and GIO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else GIO_CFLAGS=$pkg_cv_GIO_CFLAGS GIO_LIBS=$pkg_cv_GIO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi CSC_DEFINES="" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNOME_SHARP" >&5 $as_echo_n "checking for GNOME_SHARP... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GNOME_SHARP_CFLAGS"; then pkg_cv_GNOME_SHARP_CFLAGS="$GNOME_SHARP_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnome-sharp-2.0 >= 2.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "gnome-sharp-2.0 >= 2.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GNOME_SHARP_CFLAGS=`$PKG_CONFIG --cflags "gnome-sharp-2.0 >= 2.8" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GNOME_SHARP_LIBS"; then pkg_cv_GNOME_SHARP_LIBS="$GNOME_SHARP_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnome-sharp-2.0 >= 2.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "gnome-sharp-2.0 >= 2.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GNOME_SHARP_LIBS=`$PKG_CONFIG --libs "gnome-sharp-2.0 >= 2.8" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GNOME_SHARP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gnome-sharp-2.0 >= 2.8"` else GNOME_SHARP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gnome-sharp-2.0 >= 2.8"` fi # Put the nasty error message in config.log where it belongs echo "$GNOME_SHARP_PKG_ERRORS" >&5 as_fn_error "Package requirements (gnome-sharp-2.0 >= 2.8) were not met: $GNOME_SHARP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GNOME_SHARP_CFLAGS and GNOME_SHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GNOME_SHARP_CFLAGS and GNOME_SHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else GNOME_SHARP_CFLAGS=$pkg_cv_GNOME_SHARP_CFLAGS GNOME_SHARP_LIBS=$pkg_cv_GNOME_SHARP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIBSHARP" >&5 $as_echo_n "checking for GLIBSHARP... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GLIBSHARP_CFLAGS"; then pkg_cv_GLIBSHARP_CFLAGS="$GLIBSHARP_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-sharp-2.0 >= 2.12\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-sharp-2.0 >= 2.12") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIBSHARP_CFLAGS=`$PKG_CONFIG --cflags "glib-sharp-2.0 >= 2.12" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GLIBSHARP_LIBS"; then pkg_cv_GLIBSHARP_LIBS="$GLIBSHARP_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-sharp-2.0 >= 2.12\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-sharp-2.0 >= 2.12") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIBSHARP_LIBS=`$PKG_CONFIG --libs "glib-sharp-2.0 >= 2.12" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLIBSHARP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "glib-sharp-2.0 >= 2.12"` else GLIBSHARP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "glib-sharp-2.0 >= 2.12"` fi # Put the nasty error message in config.log where it belongs echo "$GLIBSHARP_PKG_ERRORS" >&5 as_fn_error "Package requirements (glib-sharp-2.0 >= 2.12) were not met: $GLIBSHARP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GLIBSHARP_CFLAGS and GLIBSHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GLIBSHARP_CFLAGS and GLIBSHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else GLIBSHARP_CFLAGS=$pkg_cv_GLIBSHARP_CFLAGS GLIBSHARP_LIBS=$pkg_cv_GLIBSHARP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi if pkg-config --atleast-version=2.13.0 gtk-sharp-2.0 && pkg-config --max-version=2.14 gtk-sharp-2.0; then as_fn_error "There's a svn version of gtk-sharp 2.13.x installed. Uninstall it." "$LINENO" 5 fi # Extract the first word of "gconftool-2", so it can be a program name with args. set dummy gconftool-2; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_GCONFTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else case $GCONFTOOL in [\\/]* | ?:[\\/]*) ac_cv_path_GCONFTOOL="$GCONFTOOL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GCONFTOOL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GCONFTOOL=$ac_cv_path_GCONFTOOL if test -n "$GCONFTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCONFTOOL" >&5 $as_echo "$GCONFTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$GCONF_SCHEMA_INSTALL_SOURCE" = "x"; then GCONF_SCHEMA_CONFIG_SOURCE=`gconftool-2 --get-default-source` else GCONF_SCHEMA_CONFIG_SOURCE=$GCONF_SCHEMA_INSTALL_SOURCE fi # Check whether --with-gconf-source was given. if test "${with_gconf_source+set}" = set; then : withval=$with_gconf_source; GCONF_SCHEMA_CONFIG_SOURCE="$withval" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using config source $GCONF_SCHEMA_CONFIG_SOURCE for schema installation" >&5 $as_echo "Using config source $GCONF_SCHEMA_CONFIG_SOURCE for schema installation" >&6; } if test "x$GCONF_SCHEMA_FILE_DIR" = "x"; then GCONF_SCHEMA_FILE_DIR='$(sysconfdir)/gconf/schemas' fi # Check whether --with-gconf-schema-file-dir was given. if test "${with_gconf_schema_file_dir+set}" = set; then : withval=$with_gconf_schema_file_dir; GCONF_SCHEMA_FILE_DIR="$withval" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $GCONF_SCHEMA_FILE_DIR as install directory for schema files" >&5 $as_echo "Using $GCONF_SCHEMA_FILE_DIR as install directory for schema files" >&6; } # Check whether --enable-schemas-install was given. if test "${enable_schemas_install+set}" = set; then : enableval=$enable_schemas_install; case ${enableval} in yes|no) ;; *) as_fn_error "bad value ${enableval} for --enable-schemas-install" "$LINENO" 5 ;; esac fi if test "$enable_schemas_install" != no; then GCONF_SCHEMAS_INSTALL_TRUE= GCONF_SCHEMAS_INSTALL_FALSE='#' else GCONF_SCHEMAS_INSTALL_TRUE='#' GCONF_SCHEMAS_INSTALL_FALSE= fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GCONF_SHARP" >&5 $as_echo_n "checking for GCONF_SHARP... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GCONF_SHARP_CFLAGS"; then pkg_cv_GCONF_SHARP_CFLAGS="$GCONF_SHARP_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gconf-sharp-2.0 >= \$GTKSHARP_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "gconf-sharp-2.0 >= $GTKSHARP_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GCONF_SHARP_CFLAGS=`$PKG_CONFIG --cflags "gconf-sharp-2.0 >= $GTKSHARP_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GCONF_SHARP_LIBS"; then pkg_cv_GCONF_SHARP_LIBS="$GCONF_SHARP_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gconf-sharp-2.0 >= \$GTKSHARP_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "gconf-sharp-2.0 >= $GTKSHARP_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GCONF_SHARP_LIBS=`$PKG_CONFIG --libs "gconf-sharp-2.0 >= $GTKSHARP_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GCONF_SHARP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gconf-sharp-2.0 >= $GTKSHARP_REQUIRED"` else GCONF_SHARP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gconf-sharp-2.0 >= $GTKSHARP_REQUIRED"` fi # Put the nasty error message in config.log where it belongs echo "$GCONF_SHARP_PKG_ERRORS" >&5 as_fn_error "Package requirements (gconf-sharp-2.0 >= $GTKSHARP_REQUIRED) were not met: $GCONF_SHARP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GCONF_SHARP_CFLAGS and GCONF_SHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GCONF_SHARP_CFLAGS and GCONF_SHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else GCONF_SHARP_CFLAGS=$pkg_cv_GCONF_SHARP_CFLAGS GCONF_SHARP_LIBS=$pkg_cv_GCONF_SHARP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi if pkg-config --atleast-version=2.18 gconf-sharp-2.0; then CSC_DEFINES="$CSC_DEFINES -d:GCONF_SHARP_2_18" fi if pkg-config --atleast-version=2.20.2 gconf-sharp-2.0; then CSC_DEFINES="$CSC_DEFINES -d:GCONF_SHARP_2_20_2" fi if pkg-config --atleast-version=2.16 gtk+-2.0; then CSC_DEFINES="$CSC_DEFINES -d:GTK_2_16" fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MONO_ADDINS" >&5 $as_echo_n "checking for MONO_ADDINS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$MONO_ADDINS_CFLAGS"; then pkg_cv_MONO_ADDINS_CFLAGS="$MONO_ADDINS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mono-addins >= 0.3.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "mono-addins >= 0.3.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MONO_ADDINS_CFLAGS=`$PKG_CONFIG --cflags "mono-addins >= 0.3.1" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$MONO_ADDINS_LIBS"; then pkg_cv_MONO_ADDINS_LIBS="$MONO_ADDINS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mono-addins >= 0.3.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "mono-addins >= 0.3.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MONO_ADDINS_LIBS=`$PKG_CONFIG --libs "mono-addins >= 0.3.1" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then MONO_ADDINS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "mono-addins >= 0.3.1"` else MONO_ADDINS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "mono-addins >= 0.3.1"` fi # Put the nasty error message in config.log where it belongs echo "$MONO_ADDINS_PKG_ERRORS" >&5 as_fn_error "Package requirements (mono-addins >= 0.3.1) were not met: $MONO_ADDINS_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables MONO_ADDINS_CFLAGS and MONO_ADDINS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables MONO_ADDINS_CFLAGS and MONO_ADDINS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else MONO_ADDINS_CFLAGS=$pkg_cv_MONO_ADDINS_CFLAGS MONO_ADDINS_LIBS=$pkg_cv_MONO_ADDINS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MONO_ADDINS_SETUP" >&5 $as_echo_n "checking for MONO_ADDINS_SETUP... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$MONO_ADDINS_SETUP_CFLAGS"; then pkg_cv_MONO_ADDINS_SETUP_CFLAGS="$MONO_ADDINS_SETUP_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mono-addins-setup >= 0.3.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "mono-addins-setup >= 0.3.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MONO_ADDINS_SETUP_CFLAGS=`$PKG_CONFIG --cflags "mono-addins-setup >= 0.3.1" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$MONO_ADDINS_SETUP_LIBS"; then pkg_cv_MONO_ADDINS_SETUP_LIBS="$MONO_ADDINS_SETUP_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mono-addins-setup >= 0.3.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "mono-addins-setup >= 0.3.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MONO_ADDINS_SETUP_LIBS=`$PKG_CONFIG --libs "mono-addins-setup >= 0.3.1" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then MONO_ADDINS_SETUP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "mono-addins-setup >= 0.3.1"` else MONO_ADDINS_SETUP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "mono-addins-setup >= 0.3.1"` fi # Put the nasty error message in config.log where it belongs echo "$MONO_ADDINS_SETUP_PKG_ERRORS" >&5 as_fn_error "Package requirements (mono-addins-setup >= 0.3.1) were not met: $MONO_ADDINS_SETUP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables MONO_ADDINS_SETUP_CFLAGS and MONO_ADDINS_SETUP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables MONO_ADDINS_SETUP_CFLAGS and MONO_ADDINS_SETUP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else MONO_ADDINS_SETUP_CFLAGS=$pkg_cv_MONO_ADDINS_SETUP_CFLAGS MONO_ADDINS_SETUP_LIBS=$pkg_cv_MONO_ADDINS_SETUP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MONO_ADDINS_GUI" >&5 $as_echo_n "checking for MONO_ADDINS_GUI... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$MONO_ADDINS_GUI_CFLAGS"; then pkg_cv_MONO_ADDINS_GUI_CFLAGS="$MONO_ADDINS_GUI_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mono-addins-gui >= 0.3.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "mono-addins-gui >= 0.3.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MONO_ADDINS_GUI_CFLAGS=`$PKG_CONFIG --cflags "mono-addins-gui >= 0.3.1" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$MONO_ADDINS_GUI_LIBS"; then pkg_cv_MONO_ADDINS_GUI_LIBS="$MONO_ADDINS_GUI_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mono-addins-gui >= 0.3.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "mono-addins-gui >= 0.3.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MONO_ADDINS_GUI_LIBS=`$PKG_CONFIG --libs "mono-addins-gui >= 0.3.1" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then MONO_ADDINS_GUI_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "mono-addins-gui >= 0.3.1"` else MONO_ADDINS_GUI_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "mono-addins-gui >= 0.3.1"` fi # Put the nasty error message in config.log where it belongs echo "$MONO_ADDINS_GUI_PKG_ERRORS" >&5 as_fn_error "Package requirements (mono-addins-gui >= 0.3.1) were not met: $MONO_ADDINS_GUI_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables MONO_ADDINS_GUI_CFLAGS and MONO_ADDINS_GUI_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables MONO_ADDINS_GUI_CFLAGS and MONO_ADDINS_GUI_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else MONO_ADDINS_GUI_CFLAGS=$pkg_cv_MONO_ADDINS_GUI_CFLAGS MONO_ADDINS_GUI_LIBS=$pkg_cv_MONO_ADDINS_GUI_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NDESK_DBUS" >&5 $as_echo_n "checking for NDESK_DBUS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$NDESK_DBUS_CFLAGS"; then pkg_cv_NDESK_DBUS_CFLAGS="$NDESK_DBUS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ndesk-dbus-1.0 >= \$NDESK_DBUS_REQUIRED ndesk-dbus-glib-1.0 >= \$NDESK_DBUS_GLIB_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "ndesk-dbus-1.0 >= $NDESK_DBUS_REQUIRED ndesk-dbus-glib-1.0 >= $NDESK_DBUS_GLIB_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NDESK_DBUS_CFLAGS=`$PKG_CONFIG --cflags "ndesk-dbus-1.0 >= $NDESK_DBUS_REQUIRED ndesk-dbus-glib-1.0 >= $NDESK_DBUS_GLIB_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$NDESK_DBUS_LIBS"; then pkg_cv_NDESK_DBUS_LIBS="$NDESK_DBUS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ndesk-dbus-1.0 >= \$NDESK_DBUS_REQUIRED ndesk-dbus-glib-1.0 >= \$NDESK_DBUS_GLIB_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "ndesk-dbus-1.0 >= $NDESK_DBUS_REQUIRED ndesk-dbus-glib-1.0 >= $NDESK_DBUS_GLIB_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NDESK_DBUS_LIBS=`$PKG_CONFIG --libs "ndesk-dbus-1.0 >= $NDESK_DBUS_REQUIRED ndesk-dbus-glib-1.0 >= $NDESK_DBUS_GLIB_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then NDESK_DBUS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "ndesk-dbus-1.0 >= $NDESK_DBUS_REQUIRED ndesk-dbus-glib-1.0 >= $NDESK_DBUS_GLIB_REQUIRED"` else NDESK_DBUS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "ndesk-dbus-1.0 >= $NDESK_DBUS_REQUIRED ndesk-dbus-glib-1.0 >= $NDESK_DBUS_GLIB_REQUIRED"` fi # Put the nasty error message in config.log where it belongs echo "$NDESK_DBUS_PKG_ERRORS" >&5 as_fn_error "Package requirements (ndesk-dbus-1.0 >= $NDESK_DBUS_REQUIRED ndesk-dbus-glib-1.0 >= $NDESK_DBUS_GLIB_REQUIRED) were not met: $NDESK_DBUS_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables NDESK_DBUS_CFLAGS and NDESK_DBUS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables NDESK_DBUS_CFLAGS and NDESK_DBUS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else NDESK_DBUS_CFLAGS=$pkg_cv_NDESK_DBUS_CFLAGS NDESK_DBUS_LIBS=$pkg_cv_NDESK_DBUS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_start_decompress in -ljpeg" >&5 $as_echo_n "checking for jpeg_start_decompress in -ljpeg... " >&6; } if test "${ac_cv_lib_jpeg_jpeg_start_decompress+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljpeg -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jpeg_start_decompress (); int main () { return jpeg_start_decompress (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_jpeg_jpeg_start_decompress=yes else ac_cv_lib_jpeg_jpeg_start_decompress=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_start_decompress" >&5 $as_echo "$ac_cv_lib_jpeg_jpeg_start_decompress" >&6; } if test "x$ac_cv_lib_jpeg_jpeg_start_decompress" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBJPEG 1 _ACEOF LIBS="-ljpeg $LIBS" else as_fn_error "libjpeg not found" "$LINENO" 5 fi ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" if test "x$ac_cv_header_jpeglib_h" = x""yes; then : else as_fn_error "libjpeg not found" "$LINENO" 5 fi LIBJPEG='-ljpeg' pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LCMS" >&5 $as_echo_n "checking for LCMS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$LCMS_CFLAGS"; then pkg_cv_LCMS_CFLAGS="$LCMS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms >= \$LCMS_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "lcms >= $LCMS_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LCMS_CFLAGS=`$PKG_CONFIG --cflags "lcms >= $LCMS_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$LCMS_LIBS"; then pkg_cv_LCMS_LIBS="$LCMS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms >= \$LCMS_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "lcms >= $LCMS_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LCMS_LIBS=`$PKG_CONFIG --libs "lcms >= $LCMS_REQUIRED" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LCMS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lcms >= $LCMS_REQUIRED"` else LCMS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lcms >= $LCMS_REQUIRED"` fi # Put the nasty error message in config.log where it belongs echo "$LCMS_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cmsCreateBCHSWabstractProfile in -llcms" >&5 $as_echo_n "checking for cmsCreateBCHSWabstractProfile in -llcms... " >&6; } if test "${ac_cv_lib_lcms_cmsCreateBCHSWabstractProfile+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-llcms -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cmsCreateBCHSWabstractProfile (); int main () { return cmsCreateBCHSWabstractProfile (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lcms_cmsCreateBCHSWabstractProfile=yes else ac_cv_lib_lcms_cmsCreateBCHSWabstractProfile=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lcms_cmsCreateBCHSWabstractProfile" >&5 $as_echo "$ac_cv_lib_lcms_cmsCreateBCHSWabstractProfile" >&6; } if test "x$ac_cv_lib_lcms_cmsCreateBCHSWabstractProfile" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBLCMS 1 _ACEOF LIBS="-llcms $LIBS" else as_fn_error "liblcms not found" "$LINENO" 5 fi ac_fn_c_check_header_mongrel "$LINENO" "lcms.h" "ac_cv_header_lcms_h" "$ac_includes_default" if test "x$ac_cv_header_lcms_h" = x""yes; then : else as_fn_error "liblcms not found" "$LINENO" 5 fi LCMS_LIBS='-llcms' LCMS_CFLAGS='' elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cmsCreateBCHSWabstractProfile in -llcms" >&5 $as_echo_n "checking for cmsCreateBCHSWabstractProfile in -llcms... " >&6; } if test "${ac_cv_lib_lcms_cmsCreateBCHSWabstractProfile+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-llcms -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cmsCreateBCHSWabstractProfile (); int main () { return cmsCreateBCHSWabstractProfile (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lcms_cmsCreateBCHSWabstractProfile=yes else ac_cv_lib_lcms_cmsCreateBCHSWabstractProfile=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lcms_cmsCreateBCHSWabstractProfile" >&5 $as_echo "$ac_cv_lib_lcms_cmsCreateBCHSWabstractProfile" >&6; } if test "x$ac_cv_lib_lcms_cmsCreateBCHSWabstractProfile" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBLCMS 1 _ACEOF LIBS="-llcms $LIBS" else as_fn_error "liblcms not found" "$LINENO" 5 fi ac_fn_c_check_header_mongrel "$LINENO" "lcms.h" "ac_cv_header_lcms_h" "$ac_includes_default" if test "x$ac_cv_header_lcms_h" = x""yes; then : else as_fn_error "liblcms not found" "$LINENO" 5 fi LCMS_LIBS='-llcms' LCMS_CFLAGS='' else LCMS_CFLAGS=$pkg_cv_LCMS_CFLAGS LCMS_LIBS=$pkg_cv_LCMS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for UNIQUE" >&5 $as_echo_n "checking for UNIQUE... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$UNIQUE_CFLAGS"; then pkg_cv_UNIQUE_CFLAGS="$UNIQUE_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"unique-1.0 >= 1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "unique-1.0 >= 1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_UNIQUE_CFLAGS=`$PKG_CONFIG --cflags "unique-1.0 >= 1.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$UNIQUE_LIBS"; then pkg_cv_UNIQUE_LIBS="$UNIQUE_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"unique-1.0 >= 1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "unique-1.0 >= 1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_UNIQUE_LIBS=`$PKG_CONFIG --libs "unique-1.0 >= 1.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then UNIQUE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "unique-1.0 >= 1.0"` else UNIQUE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "unique-1.0 >= 1.0"` fi # Put the nasty error message in config.log where it belongs echo "$UNIQUE_PKG_ERRORS" >&5 as_fn_error "Package requirements (unique-1.0 >= 1.0) were not met: $UNIQUE_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables UNIQUE_CFLAGS and UNIQUE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables UNIQUE_CFLAGS and UNIQUE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else UNIQUE_CFLAGS=$pkg_cv_UNIQUE_CFLAGS UNIQUE_LIBS=$pkg_cv_UNIQUE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi # Check whether --with-turtle was given. if test "${with_turtle+set}" = set; then : withval=$with_turtle; fi if test "x$with_turtle" != "xno"; then WITH_TURTLE_TRUE= WITH_TURTLE_FALSE='#' else WITH_TURTLE_TRUE='#' WITH_TURTLE_FALSE= fi if test "x$with_turtle" != "xno"; then TURTLEDIR=$with_turtle fi # Check whether --with-gnome-screensaver was given. if test "${with_gnome_screensaver+set}" = set; then : withval=$with_gnome_screensaver; gnome_screensaver_prefix=$with_gnome_screensaver else gnome_screensaver_prefix=$prefix fi # Check whether --with-gnome-screensaver-privlibexecdir was given. if test "${with_gnome_screensaver_privlibexecdir+set}" = set; then : withval=$with_gnome_screensaver_privlibexecdir; GNOME_SCREENSAVER_SAVERDIR=$with_gnome_screensaver_privlibexecdir else if test -d $gnome_screensaver_prefix/lib/gnome-screensaver; then GNOME_SCREENSAVER_SAVERDIR=$gnome_screensaver_prefix/lib/gnome-screensaver else GNOME_SCREENSAVER_SAVERDIR=$gnome_screensaver_prefix/libexec/gnome-screensaver fi fi # Check whether --with-gnome-screensaver-themesdir was given. if test "${with_gnome_screensaver_themesdir+set}" = set; then : withval=$with_gnome_screensaver_themesdir; GNOME_SCREENSAVER_THEMESDIR=$with_gnome_screensaver_themesdir else GNOME_SCREENSAVER_THEMESDIR=$gnome_screensaver_prefix/share/applications/screensavers fi ICONS_DIRECTORY=${datadir}/${PACKAGE}-${VERSION} GETTEXT_PACKAGE=f-spot cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" _ACEOF for ac_header in locale.h do : ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" if test "x$ac_cv_header_locale_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LOCALE_H 1 _ACEOF fi done if test $ac_cv_header_locale_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 $as_echo_n "checking for LC_MESSAGES... " >&6; } if test "${am_cv_val_LC_MESSAGES+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return LC_MESSAGES ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_val_LC_MESSAGES=yes else am_cv_val_LC_MESSAGES=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5 $as_echo "$am_cv_val_LC_MESSAGES" >&6; } if test $am_cv_val_LC_MESSAGES = yes; then $as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h fi fi USE_NLS=yes gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" if test "x$ac_cv_header_libintl_h" = x""yes; then : gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in libc" >&5 $as_echo_n "checking for ngettext in libc... " >&6; } if test "${gt_cv_func_ngettext_libc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !ngettext ("","", 1) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_ngettext_libc=yes else gt_cv_func_ngettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_ngettext_libc" >&5 $as_echo "$gt_cv_func_ngettext_libc" >&6; } if test "$gt_cv_func_ngettext_libc" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in libc" >&5 $as_echo_n "checking for dgettext in libc... " >&6; } if test "${gt_cv_func_dgettext_libc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !dgettext ("","") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_dgettext_libc=yes else gt_cv_func_dgettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_dgettext_libc" >&5 $as_echo "$gt_cv_func_dgettext_libc" >&6; } fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bindtextdomain in -lintl" >&5 $as_echo_n "checking for bindtextdomain in -lintl... " >&6; } if test "${ac_cv_lib_intl_bindtextdomain+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bindtextdomain (); int main () { return bindtextdomain (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_bindtextdomain=yes else ac_cv_lib_intl_bindtextdomain=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_bindtextdomain" >&5 $as_echo "$ac_cv_lib_intl_bindtextdomain" >&6; } if test "x$ac_cv_lib_intl_bindtextdomain" = x""yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if test "${ac_cv_lib_intl_ngettext+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = x""yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in -lintl" >&5 $as_echo_n "checking for dgettext in -lintl... " >&6; } if test "${ac_cv_lib_intl_dgettext+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dgettext (); int main () { return dgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dgettext=yes else ac_cv_lib_intl_dgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dgettext" >&5 $as_echo "$ac_cv_lib_intl_dgettext" >&6; } if test "x$ac_cv_lib_intl_dgettext" = x""yes; then : gt_cv_func_dgettext_libintl=yes fi fi fi if test "$gt_cv_func_dgettext_libintl" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext" >&5 $as_echo_n "checking if -liconv is needed to use gettext... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if test "${ac_cv_lib_intl_ngettext+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = x""yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dcgettext in -lintl" >&5 $as_echo_n "checking for dcgettext in -lintl... " >&6; } if test "${ac_cv_lib_intl_dcgettext+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dcgettext (); int main () { return dcgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dcgettext=yes else ac_cv_lib_intl_dcgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dcgettext" >&5 $as_echo "$ac_cv_lib_intl_dcgettext" >&6; } if test "x$ac_cv_lib_intl_dcgettext" = x""yes; then : gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv else : fi else : fi fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_MSGFMT+set}" = set; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in /*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then ac_cv_path_MSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" for ac_func in dcgettext do : ac_fn_c_check_func "$LINENO" "dcgettext" "ac_cv_func_dcgettext" if test "x$ac_cv_func_dcgettext" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DCGETTEXT 1 _ACEOF fi done MSGFMT_OPTS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking if msgfmt accepts -c" >&5 $as_echo_n "checking if msgfmt accepts -c... " >&6; } cat >conftest.foo <<_ACEOF msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" _ACEOF if { { $as_echo "$as_me:${as_lineno-$LINENO}: \$MSGFMT -c -o /dev/null conftest.foo"; } >&5 ($MSGFMT -c -o /dev/null conftest.foo) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then MSGFMT_OPTS=-c; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } echo "$as_me: failed input was:" >&5 sed 's/^/| /' conftest.foo >&5 fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_GMSGFMT+set}" = set; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_XGETTEXT+set}" = set; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : CATOBJEXT=.gmo DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = x""yes; then : CATOBJEXT=.gmo DATADIRNAME=share else CATOBJEXT=.mo DATADIRNAME=lib fi ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi fi if test "$gt_cv_have_gettext" = "yes" ; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 $as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po ac_config_commands="$ac_config_commands default-1" for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for catalogs to be installed" >&5 $as_echo_n "checking for catalogs to be installed... " >&6; } NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINGUAS" >&5 $as_echo "$LINGUAS" >&6; } fi if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES ac_config_files="$ac_config_files src/Clients/MainApp/f-spot" GNOME_ICON_THEME_PREFIX=`$PKG_CONFIG --variable=prefix gnome-icon-theme` # ---------------------------------- # Check whether --enable-release was given. if test "${enable_release+set}" = set; then : enableval=$enable_release; enable_release=yes else enable_release=`(test ! -d .svn && test ! -d .git) && echo "yes" || echo "no"` fi if test "x$enable_release" = "xyes"; then ENABLE_RELEASE_TRUE= ENABLE_RELEASE_FALSE='#' else ENABLE_RELEASE_TRUE='#' ENABLE_RELEASE_FALSE= fi ENABLE_RELEASE=$enable_release if test "x$enable_release" = "xyes"; then GMCS_FLAGS="-define:RELEASE" # FIXME: Enable as soon as we rock sufficiently #else # GMCS_FLAGS="-warnaserror" fi if false; then HYENA_PKG_CONFIG_TRUE= HYENA_PKG_CONFIG_FALSE='#' else HYENA_PKG_CONFIG_TRUE='#' HYENA_PKG_CONFIG_FALSE= fi # Check whether --with-vendor-build-id was given. if test "${with_vendor_build_id+set}" = set; then : withval=$with_vendor_build_id; vendor_build_id="$withval" else test -d .git \ && vendor_build_id="git-checkout" \ || vendor_build_id="source-tarball" fi BUILD_VENDOR_ID="$vendor_build_id" BUILD_HOST_OS="$host_os" BUILD_HOST_CPU="$host_cpu" BUILD_TIME=`date +"%F %T %Z"` # Check whether --enable-shave was given. if test "${enable_shave+set}" = set; then : enableval=$enable_shave; else enable_shave=yes fi if test x"$enable_shave" = xyes; then shavedir="$ac_pwd/build/m4/shave" MAKEFLAGS=-s AM_MAKEFLAGS='`test -z $V && echo -s`' # Extract the first word of "sed", so it can be a program name with args. set dummy sed; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_SED+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$SED"; then ac_cv_prog_SED="$SED" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_SED="sed" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_SED" && ac_cv_prog_SED="false" fi fi SED=$ac_cv_prog_SED if test -n "$SED"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SED" >&5 $as_echo "$SED" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi SHAVE_SAVED_LIBTOOL=$LIBTOOL LIBTOOL="${SHELL} ${shavedir}/shave-libtool '${SHAVE_SAVED_LIBTOOL}'" SHAVE_SAVED_CC=$CC SHAVE_SAVED_CXX=$CXX SHAVE_SAVED_FC=$FC SHAVE_SAVED_F77=$F77 SHAVE_SAVED_OBJC=$OBJC SHAVE_SAVED_MCS=$MCS CC="${SHELL} ${shavedir}/shave cc ${SHAVE_SAVED_CC}" CXX="${SHELL} ${shavedir}/shave cxx ${SHAVE_SAVED_CXX}" FC="${SHELL} ${shavedir}/shave fc ${SHAVE_SAVED_FC}" F77="${SHELL} ${shavedir}/shave f77 ${SHAVE_SAVED_F77}" OBJC="${SHELL} ${shavedir}/shave objc ${SHAVE_SAVED_OBJC}" MCS="${SHELL} ${shavedir}/shave mcs ${SHAVE_SAVED_MCS}" V=@ else V=1 fi Q='$(V:1=)' ac_config_files="$ac_config_files Makefile build/Makefile build/m4/Makefile build/m4/shave/shave build/m4/shave/shave-libtool build/pkg-config/Makefile data/Makefile data/desktop-files/Makefile data/desktop-files/f-spot.desktop.in data/desktop-files/f-spot-view.desktop.in data/desktop-files/f-spot-import.desktop.in help/Makefile lib/gio-sharp/generator/Makefile lib/gio-sharp/gio/Makefile lib/gio-sharp/Makefile lib/GKeyFile/Makefile lib/gtk-sharp-beans/Makefile lib/Hyena/build/m4/Makefile lib/Hyena/build/Makefile lib/Hyena/build/pkg-config/Makefile lib/Hyena/Hyena.Data.Sqlite/Makefile lib/Hyena/Hyena.Gui/Makefile lib/Hyena/Hyena/Makefile lib/Hyena/Makefile lib/libfspot/Makefile lib/Makefile lib/Mono.Google/Makefile lib/Mono.Tabblo/Makefile lib/SmugMugNet/Makefile lib/TagLib/Makefile lib/unique-sharp/generator/Makefile lib/unique-sharp/Makefile lib/unique-sharp/unique/Makefile src/AssemblyInfo.cs src/Makefile src/Core/Makefile src/Core/FSpot.Bling/Makefile src/Core/FSpot.Cms/Makefile src/Core/FSpot.Cms/FSpot.Cms.dll.config src/Core/FSpot.Core/Makefile src/Core/FSpot.Core/FSpot.Core.dll.config src/Core/FSpot.Core/FSpot.Core/Defines.cs src/Core/FSpot.JobScheduler/Makefile src/Core/FSpot.Utils/Makefile src/Core/FSpot.Utils/FSpot.Utils.dll.config src/Core/FSpot.Query/Makefile src/Core/FSpot.Gui/Makefile src/Core/FSpot.Gui/FSpot.Gui.dll.config src/Core/FSpot.Platform/Makefile src/Clients/Makefile src/Clients/MainApp/Makefile src/Clients/MainApp/f-spot.exe.config src/Extensions/Makefile src/Extensions/Editors/Makefile src/Extensions/Editors/FSpot.Editors.Blackout/Makefile src/Extensions/Editors/FSpot.Editors.BW/Makefile src/Extensions/Editors/FSpot.Editors.Flip/Makefile src/Extensions/Editors/FSpot.Editors.Pixelate/Makefile src/Extensions/Editors/FSpot.Editors.Resize/Makefile src/Extensions/Exporters/Makefile src/Extensions/Exporters/FSpot.Exporters.CD/Makefile src/Extensions/Exporters/FSpot.Exporters.Flickr/Makefile src/Extensions/Exporters/FSpot.Exporters.Gallery/Makefile src/Extensions/Exporters/FSpot.Exporters.Facebook/Makefile src/Extensions/Exporters/FSpot.Exporters.Folder/Makefile src/Extensions/Exporters/FSpot.Exporters.SmugMug/Makefile src/Extensions/Exporters/FSpot.Exporters.Tabblo/Makefile src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/Makefile src/Extensions/Exporters/FSpot.Exporters.Zip/Makefile src/Extensions/Tools/Makefile src/Extensions/Tools/FSpot.Tools.RawPlusJpeg/Makefile src/Extensions/Tools/FSpot.Tools.ChangePhotoPath/Makefile src/Extensions/Tools/FSpot.Tools.DevelopInUFraw/Makefile src/Extensions/Tools/FSpot.Tools.LiveWebGallery/Makefile src/Extensions/Tools/FSpot.Tools.MergeDb/Makefile src/Extensions/Tools/FSpot.Tools.RetroactiveRoll/Makefile src/Extensions/Tools/FSpot.Tools.ScreensaverConfig/Makefile src/Extensions/Transitions/Makefile src/Extensions/Transitions/FSpot.Transitions.Cover/Makefile docs/Makefile icons/Makefile tools/Makefile po/Makefile.in tests/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi ac_config_commands="$ac_config_commands po/stamp-it" if test -z "${ENABLE_SK_TRUE}" && test -z "${ENABLE_SK_FALSE}"; then as_fn_error "conditional \"ENABLE_SK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GNOME_DOC_UTILS_TRUE}" && test -z "${HAVE_GNOME_DOC_UTILS_FALSE}"; then as_fn_error "conditional \"HAVE_GNOME_DOC_UTILS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SK_TRUE}" && test -z "${ENABLE_SK_FALSE}"; then as_fn_error "conditional \"ENABLE_SK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GNOME_DOC_UTILS_TRUE}" && test -z "${HAVE_GNOME_DOC_UTILS_FALSE}"; then as_fn_error "conditional \"HAVE_GNOME_DOC_UTILS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GLIBSHARP_2_12_7_TRUE}" && test -z "${HAVE_GLIBSHARP_2_12_7_FALSE}"; then as_fn_error "conditional \"HAVE_GLIBSHARP_2_12_7\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_ATK_TRUE}" && test -z "${ENABLE_ATK_FALSE}"; then as_fn_error "conditional \"ENABLE_ATK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_TESTS_TRUE}" && test -z "${ENABLE_TESTS_FALSE}"; then as_fn_error "conditional \"ENABLE_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_TESTS_TRUE}" && test -z "${ENABLE_TESTS_FALSE}"; then as_fn_error "conditional \"ENABLE_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_TESTS_TRUE}" && test -z "${ENABLE_TESTS_FALSE}"; then as_fn_error "conditional \"ENABLE_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GCONF_SCHEMAS_INSTALL_TRUE}" && test -z "${GCONF_SCHEMAS_INSTALL_FALSE}"; then as_fn_error "conditional \"GCONF_SCHEMAS_INSTALL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_TURTLE_TRUE}" && test -z "${WITH_TURTLE_FALSE}"; then as_fn_error "conditional \"WITH_TURTLE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_RELEASE_TRUE}" && test -z "${ENABLE_RELEASE_FALSE}"; then as_fn_error "conditional \"ENABLE_RELEASE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HYENA_PKG_CONFIG_TRUE}" && test -z "${HYENA_PKG_CONFIG_FALSE}"; then as_fn_error "conditional \"HYENA_PKG_CONFIG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by f-spot $as_me 0.8.2, which was generated by GNU Autoconf 2.64. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ f-spot config.status 0.8.2 configured by $0, generated by GNU Autoconf 2.64, with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2009 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # Quote evaled strings. for var in SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ AR \ AR_FLAGS \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ SHELL \ ECHO \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_wl \ lt_prog_compiler_pic \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ fix_srcfile_path \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec; do case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Fix-up fallback echo if it was mangled by the above quoting rules. case \$lt_ECHO in *'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` ;; esac ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "src/Clients/MainApp/f-spot") CONFIG_FILES="$CONFIG_FILES src/Clients/MainApp/f-spot" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "build/Makefile") CONFIG_FILES="$CONFIG_FILES build/Makefile" ;; "build/m4/Makefile") CONFIG_FILES="$CONFIG_FILES build/m4/Makefile" ;; "build/m4/shave/shave") CONFIG_FILES="$CONFIG_FILES build/m4/shave/shave" ;; "build/m4/shave/shave-libtool") CONFIG_FILES="$CONFIG_FILES build/m4/shave/shave-libtool" ;; "build/pkg-config/Makefile") CONFIG_FILES="$CONFIG_FILES build/pkg-config/Makefile" ;; "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;; "data/desktop-files/Makefile") CONFIG_FILES="$CONFIG_FILES data/desktop-files/Makefile" ;; "data/desktop-files/f-spot.desktop.in") CONFIG_FILES="$CONFIG_FILES data/desktop-files/f-spot.desktop.in" ;; "data/desktop-files/f-spot-view.desktop.in") CONFIG_FILES="$CONFIG_FILES data/desktop-files/f-spot-view.desktop.in" ;; "data/desktop-files/f-spot-import.desktop.in") CONFIG_FILES="$CONFIG_FILES data/desktop-files/f-spot-import.desktop.in" ;; "help/Makefile") CONFIG_FILES="$CONFIG_FILES help/Makefile" ;; "lib/gio-sharp/generator/Makefile") CONFIG_FILES="$CONFIG_FILES lib/gio-sharp/generator/Makefile" ;; "lib/gio-sharp/gio/Makefile") CONFIG_FILES="$CONFIG_FILES lib/gio-sharp/gio/Makefile" ;; "lib/gio-sharp/Makefile") CONFIG_FILES="$CONFIG_FILES lib/gio-sharp/Makefile" ;; "lib/GKeyFile/Makefile") CONFIG_FILES="$CONFIG_FILES lib/GKeyFile/Makefile" ;; "lib/gtk-sharp-beans/Makefile") CONFIG_FILES="$CONFIG_FILES lib/gtk-sharp-beans/Makefile" ;; "lib/Hyena/build/m4/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Hyena/build/m4/Makefile" ;; "lib/Hyena/build/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Hyena/build/Makefile" ;; "lib/Hyena/build/pkg-config/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Hyena/build/pkg-config/Makefile" ;; "lib/Hyena/Hyena.Data.Sqlite/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Hyena/Hyena.Data.Sqlite/Makefile" ;; "lib/Hyena/Hyena.Gui/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Hyena/Hyena.Gui/Makefile" ;; "lib/Hyena/Hyena/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Hyena/Hyena/Makefile" ;; "lib/Hyena/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Hyena/Makefile" ;; "lib/libfspot/Makefile") CONFIG_FILES="$CONFIG_FILES lib/libfspot/Makefile" ;; "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; "lib/Mono.Google/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Mono.Google/Makefile" ;; "lib/Mono.Tabblo/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Mono.Tabblo/Makefile" ;; "lib/SmugMugNet/Makefile") CONFIG_FILES="$CONFIG_FILES lib/SmugMugNet/Makefile" ;; "lib/TagLib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/TagLib/Makefile" ;; "lib/unique-sharp/generator/Makefile") CONFIG_FILES="$CONFIG_FILES lib/unique-sharp/generator/Makefile" ;; "lib/unique-sharp/Makefile") CONFIG_FILES="$CONFIG_FILES lib/unique-sharp/Makefile" ;; "lib/unique-sharp/unique/Makefile") CONFIG_FILES="$CONFIG_FILES lib/unique-sharp/unique/Makefile" ;; "src/AssemblyInfo.cs") CONFIG_FILES="$CONFIG_FILES src/AssemblyInfo.cs" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/Core/Makefile") CONFIG_FILES="$CONFIG_FILES src/Core/Makefile" ;; "src/Core/FSpot.Bling/Makefile") CONFIG_FILES="$CONFIG_FILES src/Core/FSpot.Bling/Makefile" ;; "src/Core/FSpot.Cms/Makefile") CONFIG_FILES="$CONFIG_FILES src/Core/FSpot.Cms/Makefile" ;; "src/Core/FSpot.Cms/FSpot.Cms.dll.config") CONFIG_FILES="$CONFIG_FILES src/Core/FSpot.Cms/FSpot.Cms.dll.config" ;; "src/Core/FSpot.Core/Makefile") CONFIG_FILES="$CONFIG_FILES src/Core/FSpot.Core/Makefile" ;; "src/Core/FSpot.Core/FSpot.Core.dll.config") CONFIG_FILES="$CONFIG_FILES src/Core/FSpot.Core/FSpot.Core.dll.config" ;; "src/Core/FSpot.Core/FSpot.Core/Defines.cs") CONFIG_FILES="$CONFIG_FILES src/Core/FSpot.Core/FSpot.Core/Defines.cs" ;; "src/Core/FSpot.JobScheduler/Makefile") CONFIG_FILES="$CONFIG_FILES src/Core/FSpot.JobScheduler/Makefile" ;; "src/Core/FSpot.Utils/Makefile") CONFIG_FILES="$CONFIG_FILES src/Core/FSpot.Utils/Makefile" ;; "src/Core/FSpot.Utils/FSpot.Utils.dll.config") CONFIG_FILES="$CONFIG_FILES src/Core/FSpot.Utils/FSpot.Utils.dll.config" ;; "src/Core/FSpot.Query/Makefile") CONFIG_FILES="$CONFIG_FILES src/Core/FSpot.Query/Makefile" ;; "src/Core/FSpot.Gui/Makefile") CONFIG_FILES="$CONFIG_FILES src/Core/FSpot.Gui/Makefile" ;; "src/Core/FSpot.Gui/FSpot.Gui.dll.config") CONFIG_FILES="$CONFIG_FILES src/Core/FSpot.Gui/FSpot.Gui.dll.config" ;; "src/Core/FSpot.Platform/Makefile") CONFIG_FILES="$CONFIG_FILES src/Core/FSpot.Platform/Makefile" ;; "src/Clients/Makefile") CONFIG_FILES="$CONFIG_FILES src/Clients/Makefile" ;; "src/Clients/MainApp/Makefile") CONFIG_FILES="$CONFIG_FILES src/Clients/MainApp/Makefile" ;; "src/Clients/MainApp/f-spot.exe.config") CONFIG_FILES="$CONFIG_FILES src/Clients/MainApp/f-spot.exe.config" ;; "src/Extensions/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Makefile" ;; "src/Extensions/Editors/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Editors/Makefile" ;; "src/Extensions/Editors/FSpot.Editors.Blackout/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Editors/FSpot.Editors.Blackout/Makefile" ;; "src/Extensions/Editors/FSpot.Editors.BW/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Editors/FSpot.Editors.BW/Makefile" ;; "src/Extensions/Editors/FSpot.Editors.Flip/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Editors/FSpot.Editors.Flip/Makefile" ;; "src/Extensions/Editors/FSpot.Editors.Pixelate/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Editors/FSpot.Editors.Pixelate/Makefile" ;; "src/Extensions/Editors/FSpot.Editors.Resize/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Editors/FSpot.Editors.Resize/Makefile" ;; "src/Extensions/Exporters/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Exporters/Makefile" ;; "src/Extensions/Exporters/FSpot.Exporters.CD/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Exporters/FSpot.Exporters.CD/Makefile" ;; "src/Extensions/Exporters/FSpot.Exporters.Flickr/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Exporters/FSpot.Exporters.Flickr/Makefile" ;; "src/Extensions/Exporters/FSpot.Exporters.Gallery/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Exporters/FSpot.Exporters.Gallery/Makefile" ;; "src/Extensions/Exporters/FSpot.Exporters.Facebook/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Exporters/FSpot.Exporters.Facebook/Makefile" ;; "src/Extensions/Exporters/FSpot.Exporters.Folder/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Exporters/FSpot.Exporters.Folder/Makefile" ;; "src/Extensions/Exporters/FSpot.Exporters.SmugMug/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Exporters/FSpot.Exporters.SmugMug/Makefile" ;; "src/Extensions/Exporters/FSpot.Exporters.Tabblo/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Exporters/FSpot.Exporters.Tabblo/Makefile" ;; "src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/Makefile" ;; "src/Extensions/Exporters/FSpot.Exporters.Zip/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Exporters/FSpot.Exporters.Zip/Makefile" ;; "src/Extensions/Tools/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Tools/Makefile" ;; "src/Extensions/Tools/FSpot.Tools.RawPlusJpeg/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Tools/FSpot.Tools.RawPlusJpeg/Makefile" ;; "src/Extensions/Tools/FSpot.Tools.ChangePhotoPath/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Tools/FSpot.Tools.ChangePhotoPath/Makefile" ;; "src/Extensions/Tools/FSpot.Tools.DevelopInUFraw/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Tools/FSpot.Tools.DevelopInUFraw/Makefile" ;; "src/Extensions/Tools/FSpot.Tools.LiveWebGallery/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Tools/FSpot.Tools.LiveWebGallery/Makefile" ;; "src/Extensions/Tools/FSpot.Tools.MergeDb/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Tools/FSpot.Tools.MergeDb/Makefile" ;; "src/Extensions/Tools/FSpot.Tools.RetroactiveRoll/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Tools/FSpot.Tools.RetroactiveRoll/Makefile" ;; "src/Extensions/Tools/FSpot.Tools.ScreensaverConfig/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Tools/FSpot.Tools.ScreensaverConfig/Makefile" ;; "src/Extensions/Transitions/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Transitions/Makefile" ;; "src/Extensions/Transitions/FSpot.Transitions.Cover/Makefile") CONFIG_FILES="$CONFIG_FILES src/Extensions/Transitions/FSpot.Transitions.Cover/Makefile" ;; "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;; "icons/Makefile") CONFIG_FILES="$CONFIG_FILES icons/Makefile" ;; "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;; *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\).*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\).*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || as_fn_error "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_t=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_t"; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ || as_fn_error "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="" # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == "file_magic". file_magic_cmd=$lt_file_magic_cmd # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name of the directory that contains temporary libtool files. objdir=$objdir # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that does not interpret backslashes. ECHO=$lt_ECHO # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # If ld is used when linking, flag to hardcode \$libdir into a binary # during linking. This must work even if \$libdir does not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) case $xsi_shell in yes) cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac } # func_basename file func_basename () { func_basename_result="${1##*/}" } # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}" } # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). func_stripname () { # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"} } # func_opt_split func_opt_split () { func_opt_split_opt=${1%%=*} func_opt_split_arg=${1#*=} } # func_lo2o object func_lo2o () { case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac } # func_xform libobj-or-source func_xform () { func_xform_result=${1%.*}.lo } # func_arith arithmetic-term... func_arith () { func_arith_result=$(( $* )) } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=${#1} } _LT_EOF ;; *) # Bourne compatible functions. cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_basename file func_basename () { func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` } # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; esac } # sed scripts: my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^-[^=]*=//' # func_opt_split func_opt_split () { func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` } # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` } # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` } # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "$@"` } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } _LT_EOF esac case $lt_shell_append in yes) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$1+=\$2" } _LT_EOF ;; *) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$1=\$$1\$2" } _LT_EOF ;; esac sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ;; "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac ;; "src/Clients/MainApp/f-spot":F) chmod +x src/Clients/MainApp/f-spot ;; "po/stamp-it":C) if ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" ; then as_fn_error "po/Makefile.in.in was not created by intltoolize." "$LINENO" 5 fi rm -f "po/stamp-it" "po/stamp-it.tmp" "po/POTFILES" "po/Makefile.tmp" >"po/stamp-it.tmp" sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/po/POTFILES.in" | sed '$!s/$/ \\/' >"po/POTFILES" sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r po/POTFILES } ' "po/Makefile.in" >"po/Makefile" rm -f "po/Makefile.tmp" mv "po/stamp-it.tmp" "po/stamp-it" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit $? fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi cat <= 0.17.3) Run 'make' to build F-Spot. EOF if test -d ${expanded_libdir}/${PACKAGE}; then if test x$br = xyes; then echo; fi echo " WARNING: An existing F-Spot install is in ${expanded_libdir}/${PACKAGE}" echo " Remove the existing install before installing this build." echo " Installing over an existing install will cause conflicts!" echo fi f-spot-0.8.2/missing0000755000175000017500000002623311503362263014647 0ustar00rubenruben00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2009-04-28.21; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; tar*) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar*) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: f-spot-0.8.2/Makefile.include0000644000175000017500000000054311417267574016343 0ustar00rubenruben00000000000000# Makefile.include # FSpot wide helper # Directories DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio ## Links LINK_GIOSHARP = -r:$(DIR_GIOSHARP)/gio-sharp.dll ## Build CSC_FLAGS = -debug CSC = $(MCS) $(CSC_FLAGS) -target:exe CSC_LIB = $(MCS) $(CSC_FLAGS) -target:library ## Runtime MONO_DEBUGFLAGS = --debug RUNTIME = mono $(MONO_DEBUGFLAGS) f-spot-0.8.2/ltmain.sh0000755000175000017500000073337411503362227015106 0ustar00rubenruben00000000000000# Generated from ltmain.m4sh. # ltmain.sh (GNU libtool) 2.2.6 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print informational messages (default) # --version print version information # -h, --help print short or long help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.2.6 Debian-2.2.6a-4 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . PROGRAM=ltmain.sh PACKAGE=libtool VERSION="2.2.6 Debian-2.2.6a-4" TIMESTAMP="" package_revision=1.3012 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # NLS nuisances: We save the old values to restore during execute mode. # Only set LANG and LC_ALL to C if already set. # These must not be set unconditionally because not all systems understand # e.g. LANG=C (notably SCO). lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done $lt_unset CDPATH : ${CP="cp -f"} : ${ECHO="echo"} : ${EGREP="/bin/grep -E"} : ${FGREP="/bin/grep -F"} : ${GREP="/bin/grep"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SED="/bin/sed"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` } # Generated shell functions inserted here. # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" # The name of this program: # In the unlikely event $progname began with a '-', it would play havoc with # func_echo (imagine progname=-n), so we prepend ./ in that case: func_dirname_and_basename "$progpath" progname=$func_basename_result case $progname in -*) progname=./$progname ;; esac # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=: for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname${mode+: }$mode: $*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"` done my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "X$my_tmpdir" | $Xsed } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "X$1" | $Xsed \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_version # Echo version message to standard output and exit. func_version () { $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $SED -n '/^# Usage:/,/# -h/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" $ECHO $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help # Echo long help message to standard output and exit. func_help () { $SED -n '/^# Usage:/,/# Report bugs to/ { s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ p }' < "$progpath" exit $? } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { func_error "missing argument for $1" exit_cmd=exit } exit_cmd=: # Check that we have a working $ECHO. if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then # Yippee, $ECHO works! : else # Restart under the correct shell, and then maybe $ECHO will work. exec $SHELL "$progpath" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # Parse options once, thoroughly. This comes as soon as possible in # the script to make things like `libtool --version' happen quickly. { # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Parse non-mode specific arguments: while test "$#" -gt 0; do opt="$1" shift case $opt in --config) func_config ;; --debug) preserve_args="$preserve_args $opt" func_echo "enabling shell trace mode" opt_debug='set -x' $opt_debug ;; -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break execute_dlfiles="$execute_dlfiles $1" shift ;; --dry-run | -n) opt_dry_run=: ;; --features) func_features ;; --finish) mode="finish" ;; --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break case $1 in # Valid mode arguments: clean) ;; compile) ;; execute) ;; finish) ;; install) ;; link) ;; relink) ;; uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac mode="$1" shift ;; --preserve-dup-deps) opt_duplicate_deps=: ;; --quiet|--silent) preserve_args="$preserve_args $opt" opt_silent=: ;; --verbose| -v) preserve_args="$preserve_args $opt" opt_silent=false ;; --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break preserve_args="$preserve_args $opt $1" func_enable_tag "$1" # tagname is set here shift ;; # Separate optargs to long options: -dlopen=*|--mode=*|--tag=*) func_opt_split "$opt" set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} shift ;; -\?|-h) func_usage ;; --help) opt_help=: ;; --version) func_version ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) nonopt="$opt" break ;; esac done case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_duplicate_deps ;; esac # Having warned about all mis-specified options, bail out if # anything was wrong. $exit_cmd $EXIT_FAILURE } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } ## ----------- ## ## Main. ## ## ----------- ## $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi test -z "$mode" && func_fatal_error "error: you must specify a MODE." # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$execute_dlfiles" && test "$mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$mode' for more information." } # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_ltwrapper_scriptname_result="" if func_ltwrapper_executable_p "$1"; then func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" fi } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_quote_for_eval "$arg" CC_quoted="$CC_quoted $func_quote_for_eval_result" done case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_quote_for_eval "$arg" CC_quoted="$CC_quoted $func_quote_for_eval_result" done case "$@ " in " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T <?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi removelist="$removelist $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist removelist="$removelist $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 if test -n "$fix_srcfile_path"; then eval srcfile=\"$fix_srcfile_path\" fi func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir command="$command -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then command="$command -o $obj" fi # Suppress compiler output if we already did a PIC compilation. command="$command$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to building PIC objects only -prefer-non-pic try to building non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$mode'" ;; esac $ECHO $ECHO "Try \`$progname --help' for more information about other modes." exit $? } # Now that we've collected a possible --mode arg, show help if necessary $opt_help && func_mode_help # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $execute_dlfiles; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then dir="$dir/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -*) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_quote_for_eval "$file" args="$args $func_quote_for_eval_result" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" $ECHO "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libdirs="$nonopt" admincmds= if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for dir do libdirs="$libdirs $dir" done for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || admincmds="$admincmds $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS $ECHO "X----------------------------------------------------------------------" | $Xsed $ECHO "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done $ECHO $ECHO "If you ever happen to want to link against installed libraries" $ECHO "in a given directory, LIBDIR, you must either use libtool, and" $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'" $ECHO "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then $ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable" $ECHO " during execution" fi if test -n "$runpath_var"; then $ECHO " - add LIBDIR to the \`$runpath_var' environment variable" $ECHO " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then $ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi $ECHO $ECHO "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual" $ECHO "pages." ;; *) $ECHO "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac $ECHO "X----------------------------------------------------------------------" | $Xsed exit $EXIT_SUCCESS } test "$mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. $ECHO "X$nonopt" | $GREP shtool >/dev/null; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" install_prog="$install_prog$func_quote_for_eval_result" # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= for arg do if test -n "$dest"; then files="$files $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) case " $install_prog " in *[\\\ /]cp\ *) ;; *) prev=$arg ;; esac ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" install_prog="$install_prog $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. staticlibs="$staticlibs $file" ;; *.la) # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) current_libdirs="$current_libdirs $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) future_libdirs="$future_libdirs $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" dir="$dir$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` for progfile in $progfiles; do func_verbose "extracting global C symbols from \`$progfile'" $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" } done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms" fi $ECHO >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; " case $host in *cygwin* | *mingw* | *cegcc* ) $ECHO >> "$output_objdir/$my_dlsyms" "\ /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */" lt_dlsym_const= ;; *osf5*) echo >> "$output_objdir/$my_dlsyms" "\ /* This system does not cope well with relocations in const data */" lt_dlsym_const= ;; *) lt_dlsym_const=const ;; esac $ECHO >> "$output_objdir/$my_dlsyms" "\ extern $lt_dlsym_const lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; $lt_dlsym_const lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac $ECHO >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) symtab_cflags="$symtab_cflags $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then win32_nmres=`eval $NM -f posix -A $1 | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper_part1 [arg=no] # # Emit the first part of a libtool wrapper script on stdout. # For more information, see the description associated with # func_emit_wrapper(), below. func_emit_wrapper_part1 () { func_emit_wrapper_part1_arg1=no if test -n "$1" ; then func_emit_wrapper_part1_arg1=$1 fi $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='${SED} -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then ECHO=\"$qecho\" file=\"\$0\" # Make sure echo works. if test \"X\$1\" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then # Yippee, \$ECHO works! : else # Restart under the correct shell, and then maybe \$ECHO will work. exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} fi fi\ " $ECHO "\ # Find the directory that this script lives in. thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` done " } # end: func_emit_wrapper_part1 # func_emit_wrapper_part2 [arg=no] # # Emit the second part of a libtool wrapper script on stdout. # For more information, see the description associated with # func_emit_wrapper(), below. func_emit_wrapper_part2 () { func_emit_wrapper_part2_arg1=no if test -n "$1" ; then func_emit_wrapper_part2_arg1=$1 fi $ECHO "\ # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` export $shlibpath_var " fi # fixup the dll searchpath if we need to. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # end: func_emit_wrapper_part2 # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=no if test -n "$1" ; then func_emit_wrapper_arg1=$1 fi # split this up so that func_emit_cwrapperexe_src # can call each part independently. func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" } # func_to_host_path arg # # Convert paths to host format when used with build tools. # Intended for use with "native" mingw (where libtool itself # is running under the msys shell), or in the following cross- # build environments: # $build $host # mingw (msys) mingw [e.g. native] # cygwin mingw # *nix + wine mingw # where wine is equipped with the `winepath' executable. # In the native mingw case, the (msys) shell automatically # converts paths for any non-msys applications it launches, # but that facility isn't available from inside the cwrapper. # Similar accommodations are necessary for $host mingw and # $build cygwin. Calling this function does no harm for other # $host/$build combinations not listed above. # # ARG is the path (on $build) that should be converted to # the proper representation for $host. The result is stored # in $func_to_host_path_result. func_to_host_path () { func_to_host_path_result="$1" if test -n "$1" ; then case $host in *mingw* ) lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' case $build in *mingw* ) # actually, msys # awkward: cmd appends spaces to result lt_sed_strip_trailing_spaces="s/[ ]*\$//" func_to_host_path_tmp1=`( cmd //c echo "$1" |\ $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ $SED -e "$lt_sed_naive_backslashify"` ;; *cygwin* ) func_to_host_path_tmp1=`cygpath -w "$1"` func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ $SED -e "$lt_sed_naive_backslashify"` ;; * ) # Unfortunately, winepath does not exit with a non-zero # error code, so we are forced to check the contents of # stdout. On the other hand, if the command is not # found, the shell will set an exit code of 127 and print # *an error message* to stdout. So we must check for both # error code of zero AND non-empty stdout, which explains # the odd construction: func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ $SED -e "$lt_sed_naive_backslashify"` else # Allow warning below. func_to_host_path_result="" fi ;; esac if test -z "$func_to_host_path_result" ; then func_error "Could not determine host path corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_path_result="$1" fi ;; esac fi } # end: func_to_host_path # func_to_host_pathlist arg # # Convert pathlists to host format when used with build tools. # See func_to_host_path(), above. This function supports the # following $build/$host combinations (but does no harm for # combinations not listed here): # $build $host # mingw (msys) mingw [e.g. native] # cygwin mingw # *nix + wine mingw # # Path separators are also converted from $build format to # $host format. If ARG begins or ends with a path separator # character, it is preserved (but converted to $host format) # on output. # # ARG is a pathlist (on $build) that should be converted to # the proper representation on $host. The result is stored # in $func_to_host_pathlist_result. func_to_host_pathlist () { func_to_host_pathlist_result="$1" if test -n "$1" ; then case $host in *mingw* ) lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_to_host_pathlist_tmp2="$1" # Once set for this call, this variable should not be # reassigned. It is used in tha fallback case. func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ $SED -e 's|^:*||' -e 's|:*$||'` case $build in *mingw* ) # Actually, msys. # Awkward: cmd appends spaces to result. lt_sed_strip_trailing_spaces="s/[ ]*\$//" func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ $SED -e "$lt_sed_naive_backslashify"` ;; *cygwin* ) func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ $SED -e "$lt_sed_naive_backslashify"` ;; * ) # unfortunately, winepath doesn't convert pathlists func_to_host_pathlist_result="" func_to_host_pathlist_oldIFS=$IFS IFS=: for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do IFS=$func_to_host_pathlist_oldIFS if test -n "$func_to_host_pathlist_f" ; then func_to_host_path "$func_to_host_pathlist_f" if test -n "$func_to_host_path_result" ; then if test -z "$func_to_host_pathlist_result" ; then func_to_host_pathlist_result="$func_to_host_path_result" else func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" fi fi fi IFS=: done IFS=$func_to_host_pathlist_oldIFS ;; esac if test -z "$func_to_host_pathlist_result" ; then func_error "Could not determine the host path(s) corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This may break if $1 contains DOS-style drive # specifications. The fix is not to complicate the expression # below, but for the user to provide a working wine installation # with winepath so that path translation in the cross-to-mingw # case works properly. lt_replace_pathsep_nix_to_dos="s|:|;|g" func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ $SED -e "$lt_replace_pathsep_nix_to_dos"` fi # Now, add the leading and trailing path separators back case "$1" in :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" ;; esac case "$1" in *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" ;; esac ;; esac fi } # end: func_to_host_pathlist # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include # define setmode _setmode #else # include # include # ifdef __CYGWIN__ # include # define HAVE_SETENV # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif # endif #endif #include #include #include #include #include #include #include #include #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif #ifdef _MSC_VER # define S_IXUSR _S_IEXEC # define stat _stat # ifndef _INTPTR_T_DEFINED # define intptr_t int # endif #endif #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifdef __CYGWIN__ # define FOPEN_WB "wb" #endif #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #undef LTWRAPPER_DEBUGPRINTF #if defined DEBUGWRAPPER # define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args static void ltwrapper_debugprintf (const char *fmt, ...) { va_list args; va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } #else # define LTWRAPPER_DEBUGPRINTF(args) #endif const char *program_name = NULL; void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_fatal (const char *message, ...); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_opt_process_env_set (const char *arg); void lt_opt_process_env_prepend (const char *arg); void lt_opt_process_env_append (const char *arg); int lt_split_name_value (const char *arg, char** name, char** value); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); static const char *script_text_part1 = EOF func_emit_wrapper_part1 yes | $SED -e 's/\([\\"]\)/\\\1/g' \ -e 's/^/ "/' -e 's/$/\\n"/' echo ";" cat <"))); for (i = 0; i < newargc; i++) { LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); } EOF case $host_os in mingw*) cat <<"EOF" /* execv doesn't actually work on mingw as expected on unix */ rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); if (rval == -1) { /* failed to start process */ LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno)); return 127; } return rval; EOF ;; *) cat <<"EOF" execv (lt_argv_zero, newargz); return rval; /* =127, but avoids unused variable warning */ EOF ;; esac cat <<"EOF" } void * xmalloc (size_t num) { void *p = (void *) malloc (num); if (!p) lt_fatal ("Memory exhausted"); return p; } char * xstrdup (const char *string) { return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL; } const char * base_name (const char *name) { const char *base; #if defined (HAVE_DOS_BASED_FILE_SYSTEM) /* Skip over the disk name in MSDOS pathnames. */ if (isalpha ((unsigned char) name[0]) && name[1] == ':') name += 2; #endif for (base = name; *name; name++) if (IS_DIR_SEPARATOR (*name)) base = name + 1; return base; } int check_executable (const char *path) { struct stat st; LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!")); if ((!path) || (!*path)) return 0; if ((stat (path, &st) >= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!")); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n", tmp_pathspec)); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { char *errstr = strerror (errno); lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal ("Could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } static void lt_error_core (int exit_status, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s: %s: ", program_name, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, "FATAL", message, ap); va_end (ap); } void lt_setenv (const char *name, const char *value) { LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", (name ? name : ""), (value ? value : ""))); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } int lt_split_name_value (const char *arg, char** name, char** value) { const char *p; int len; if (!arg || !*arg) return 1; p = strchr (arg, (int)'='); if (!p) return 1; *value = xstrdup (++p); len = strlen (arg) - strlen (*value); *name = XMALLOC (char, len); strncpy (*name, arg, len-1); (*name)[len - 1] = '\0'; return 0; } void lt_opt_process_env_set (const char *arg) { char *name = NULL; char *value = NULL; if (lt_split_name_value (arg, &name, &value) != 0) { XFREE (name); XFREE (value); lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); } lt_setenv (name, value); XFREE (name); XFREE (value); } void lt_opt_process_env_prepend (const char *arg) { char *name = NULL; char *value = NULL; char *new_value = NULL; if (lt_split_name_value (arg, &name, &value) != 0) { XFREE (name); XFREE (value); lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); } new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); XFREE (name); XFREE (value); } void lt_opt_process_env_append (const char *arg) { char *name = NULL; char *value = NULL; char *new_value = NULL; if (lt_split_name_value (arg, &name, &value) != 0) { XFREE (name); XFREE (value); lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); } new_value = lt_extend_str (getenv (name), value, 1); lt_setenv (name, new_value); XFREE (new_value); XFREE (name); XFREE (value); } void lt_update_exe_path (const char *name, const char *value) { LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", (name ? name : ""), (value ? value : ""))); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", (name ? name : ""), (value ? value : ""))); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF } # end: func_emit_cwrapperexe_src # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then dlfiles="$dlfiles $arg" else dlprefiles="$dlprefiles $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) deplibs="$deplibs $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # moreargs="$moreargs $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) rpath="$rpath $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) xrpath="$xrpath $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) weak_libs="$weak_libs $arg" prev= continue ;; xcclinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) compiler_flags="$compiler_flags $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname '-L' '' "$arg" dir=$func_stripname_result if test -z "$dir"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "*) ;; *) deplibs="$deplibs -L$dir" lib_search_path="$lib_search_path $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) dllsearchpath="$dllsearchpath:$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework deplibs="$deplibs System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi deplibs="$deplibs $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot) compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" arg="$arg $wl$func_quote_for_eval_result" compiler_flags="$compiler_flags $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" arg="$arg $wl$func_quote_for_eval_result" compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" linker_flags="$linker_flags $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # -64, -mips[0-9] enable 64-bit mode on the SGI compiler # -r[0-9][0-9]* specifies the processor on the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler # +DA*, +DD* enable 64-bit mode on the HP compiler # -q* pass through compiler args for the IBM compiler # -m*, -t[45]*, -txscale* pass through architecture-specific # compiler args for GCC # -F/path gives path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC # @file GCC response files -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" compiler_flags="$compiler_flags $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. objs="$objs $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. deplibs="$deplibs $arg" old_deplibs="$old_deplibs $arg" continue ;; *.la) # A libtool-controlled library. if test "$prev" = dlfiles; then # This library was specified with -dlopen. dlfiles="$dlfiles $arg" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. dlprefiles="$dlprefiles $arg" prev= else deplibs="$deplibs $arg" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_duplicate_deps ; then case "$libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi libs="$libs $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; esac pre_post_deps="$pre_post_deps $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= case $lib in *.la) func_source "$lib" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` case " $weak_libs " in *" $deplib_base "*) ;; *) deplibs="$deplibs $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else compiler_flags="$compiler_flags $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" newlib_search_path="$newlib_search_path $func_stripname_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" newlib_search_path="$newlib_search_path $func_stripname_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" dir=$func_stripname_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) lib="$deplib" ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then $ECHO $ECHO "*** Warning: Trying to link with static lib archive $deplib." $ECHO "*** I have the capability to make that library automatically link in when" $ECHO "*** you link to this library. But I can only do this if you have a" $ECHO "*** shared version of the library, which you do not appear to have" $ECHO "*** because the file extensions .$libext of this argument makes me believe" $ECHO "*** that it is just a static archive that I should not use here." else $ECHO $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. newdlprefiles="$newdlprefiles $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else newdlfiles="$newdlfiles $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && dlfiles="$dlfiles $dlopen" test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. convenience="$convenience $ladir/$objdir/$old_library" old_convenience="$old_convenience $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_duplicate_deps ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= for l in $old_library $library_names; do linklib="$l" done if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. dlprefiles="$dlprefiles $lib $dependency_libs" else newdlfiles="$newdlfiles $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$libdir" absdir="$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then newdlprefiles="$newdlprefiles $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then newdlprefiles="$newdlprefiles $dir/$dlname" else newdlprefiles="$newdlprefiles $dir/$linklib" fi fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then newlib_search_path="$newlib_search_path $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" newlib_search_path="$newlib_search_path $func_stripname_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_duplicate_deps ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) temp_rpath="$temp_rpath$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded notinst_deplibs="$notinst_deplibs $lib" need_relink=no ;; *) if test "$installed" = no; then notinst_deplibs="$notinst_deplibs $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then $ECHO if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then $ECHO $ECHO "*** And there doesn't seem to be a static archive available" $ECHO "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. $ECHO $ECHO "*** Warning: This system can not link to static lib archive $lib." $ECHO "*** I have the capability to make that library automatically link in when" $ECHO "*** you link to this library. But I can only do this if you have a" $ECHO "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then $ECHO "*** But as you try to build a module library, libtool will still create " $ECHO "*** a static module, that should work as long as the dlopening application" $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then $ECHO $ECHO "*** However, this would only work if libtool was able to extract symbol" $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" $ECHO "*** not find such a program. So, this module is probably useless." $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) xrpath="$xrpath $temp_xrpath";; esac;; *) temp_deplibs="$temp_deplibs $libdir";; esac done dependency_libs="$temp_deplibs" fi newlib_search_path="$newlib_search_path $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" if $opt_duplicate_deps ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_dirname "$deplib" "" "." dir="$func_dirname_result" # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) lib_search_path="$lib_search_path $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) tmp_libs="$tmp_libs $deplib" ;; esac ;; *) tmp_libs="$tmp_libs $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then tmp_libs="$tmp_libs $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" objs="$objs$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else $ECHO $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" libobjs="$libobjs $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type \`$version_type'" ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. verstring="$verstring:${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" libobjs="$libobjs $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi removelist="$removelist $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then oldlibs="$oldlibs $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do temp_xrpath="$temp_xrpath -R$libdir" case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) dlfiles="$dlfiles $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) dlprefiles="$dlprefiles $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework deplibs="$deplibs System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then deplibs="$deplibs -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $ECHO $ECHO "*** Warning: linker path does not have real file for library $a_deplib." $ECHO "*** I have the capability to make that library automatically link in when" $ECHO "*** you link to this library. But I can only do this if you have a" $ECHO "*** shared version of the library, which you do not appear to have" $ECHO "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) newdeplibs="$newdeplibs $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $ECHO $ECHO "*** Warning: linker path does not have real file for library $a_deplib." $ECHO "*** I have the capability to make that library automatically link in when" $ECHO "*** you link to this library. But I can only do this if you have a" $ECHO "*** shared version of the library, which you do not appear to have" $ECHO "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"` done fi if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | $GREP . >/dev/null; then $ECHO if test "X$deplibs_check_method" = "Xnone"; then $ECHO "*** Warning: inter-library dependencies are not supported in this platform." else $ECHO "*** Warning: inter-library dependencies are not known to be supported." fi $ECHO "*** All declared inter-library dependencies are being dropped." droppeddeps=yes fi ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then $ECHO $ECHO "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" $ECHO "*** a static module, that should work as long as the dlopening" $ECHO "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then $ECHO $ECHO "*** However, this would only work if libtool was able to extract symbol" $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" $ECHO "*** not find such a program. So, this module is probably useless." $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else $ECHO "*** The inter-library dependencies that have been dropped here will be" $ECHO "*** automatically added whenever a program is linked with this library" $ECHO "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then $ECHO $ECHO "*** Since this library must not contain undefined symbols," $ECHO "*** because either the platform does not support them or" $ECHO "*** it was explicitly requested with -no-undefined," $ECHO "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" dep_rpath="$dep_rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" if test -n "$hardcode_libdir_flag_spec_ld"; then eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" else eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do linknames="$linknames $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" delfiles="$delfiles $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" func_len " $cmd" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then func_show_eval "$cmd" 'exit $?' skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) tmp_deplibs="$tmp_deplibs $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $convenience libobjs="$libobjs $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" linker_flags="$linker_flags $flag" fi # Make a backup of the uninstalled library when relinking if test "$mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output output_la=`$ECHO "X$output" | $Xsed -e "$basename"` # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" $ECHO 'INPUT (' > $output for obj in $save_libobjs do $ECHO "$obj" >> $output done $ECHO ')' >> $output delfiles="$delfiles $output" elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do $ECHO "$obj" >> $output done delfiles="$delfiles $output" output=$firstobj\"$file_list_spec$output\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. eval concat_cmds=\"$reload_cmds $objlist $last_robj\" else # All subsequent reloadable object files will link in # the last one created. eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=$obj func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi delfiles="$delfiles $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $dlprefiles libobjs="$libobjs $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` else gentop="$output_objdir/${obj}x" generated="$generated $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) compile_command="$compile_command ${wl}-bind_at_load" finalize_command="$finalize_command ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done compile_deplibs="$new_libs" compile_command="$compile_command $compile_deplibs" finalize_command="$finalize_command $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) dllsearchpath="$dllsearchpath:$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *cegcc) # Disable wrappers for cegcc, we are cross compiling anyway. wrappers_required=no ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do rpath="$rpath$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` fi # Quote $ECHO for shipping. if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then case $progpath in [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; esac qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` else qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then oldobjs="$oldobjs $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $addlibs oldobjs="$oldobjs $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $dlprefiles oldobjs="$oldobjs $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else $ECHO "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" oldobjs="$oldobjs $gentop/$newobj" ;; *) oldobjs="$oldobjs $obj" ;; esac done fi eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" newdependency_libs="$newdependency_libs $libdir/$name" ;; *) newdependency_libs="$newdependency_libs $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" newdlfiles="$newdlfiles $libdir/$name" ;; *) newdlfiles="$newdlfiles $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" newdlprefiles="$newdlprefiles $libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlfiles="$newdlfiles $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlprefiles="$newdlprefiles $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$mode" = link || test "$mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) RM="$RM $arg"; rmforce=yes ;; -*) RM="$RM $arg" ;; *) files="$files $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= origobjdir="$objdir" for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then objdir="$origobjdir" else objdir="$dir/$origobjdir" fi func_basename "$file" name="$func_basename_result" test "$mode" = uninstall && objdir="$dir" # Remember objdir for removal later, being careful to avoid duplicates if test "$mode" = clean; then case " $rmdirs " in *" $objdir "*) ;; *) rmdirs="$rmdirs $objdir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do rmfiles="$rmfiles $objdir/$n" done test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" case "$mode" in clean) case " $library_names " in # " " in the beginning catches empty $dlname *" $dlname "*) ;; *) rmfiles="$rmfiles $objdir/$dlname" ;; esac test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then rmfiles="$rmfiles $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then rmfiles="$rmfiles $dir/$non_pic_object" fi fi ;; *) if test "$mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe rmfiles="$rmfiles $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result rmfiles="$rmfiles $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then rmfiles="$rmfiles $objdir/lt-$name" fi if test "X$noexename" != "X$name" ; then rmfiles="$rmfiles $objdir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done objdir="$origobjdir" # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$mode" = uninstall || test "$mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 f-spot-0.8.2/config.guess0000755000175000017500000013226411503362263015572 0ustar00rubenruben00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2009-04-27' # This file 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd | genuineintel) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: f-spot-0.8.2/help/0000777000175000017500000000000011503407427014200 5ustar00rubenruben00000000000000f-spot-0.8.2/help/de/0000777000175000017500000000000011503407433014565 5ustar00rubenruben00000000000000f-spot-0.8.2/help/de/facebook.page0000644000175000017500000000260511503407430017170 0ustar00rubenruben00000000000000 Fotos zu Facebook übertragen Facebook

Um Fotos zu Facebook hochzuladen, benötigen Sie ein Facebook-Konto sowie einen aktiven Internetzugang. Außerdem muss die Facebook-Erweiterung installiert und aktiviert sein.

So senden Sie die gewählten Fotos an Facebook:

Wählen Sie FotoExportieren nachFacebook.

Klicken Sie auf Anmelden. Ein Browser-Fenster wird geöffnet. Melden Sie sich bei Facebook an und klicken Sie dort auf »Zulassen«, um F-Spot zu erlauben, auf Ihr Facebook-Profil zuzugreifen.

Wählen Sie, ob ein neues Album erstellt werden soll oder zu einem vorhandenen Album hinzugefügt werden soll. Wenn Sie ein neues Album erstellen, dann geben Sie die erforderlichen Informationen ein.

Bearbeiten Sie die Beschriftung für jedes Foto, falls gewünscht.

Sobald Sie fertig sind, klicken Sie auf Hinzufügen.

f-spot-0.8.2/help/de/folder.page0000644000175000017500000000260011503407430016665 0ustar00rubenruben00000000000000 Fotos an einen Ordner senden Ordner-Export

F-Spot ermöglicht Ihnen den Export in einen Ordner. Dazu muss die Ordner-Export-Erweiterung installiert und aktiviert sein.

So exportieren Sie Fotos in einen Ordner:

Wählen Sie FotoExportieren nachOrdner ….

Wählen Sie einen Ordner.

Benennen Sie die Galerie und versehen Sie sie mit einer Beschreibung.

Wählen Sie eine Exportmethode. Eigenständige Web-Galerie anlegen erstellt einen Ordner, der inhaltlich direkt auf einen Webserver geladen und als Web-Galerie dargestellt werden kann. Nur die Dateien speichern kopiert die Fotos in den gewählten Ordner. Galerie unter Verwendung von »Original« anlegen erstellt einen Ordner, dessen Inhalt für die Nutzung mit der originalen Fotogalerie geeignet ist.

Klicken Sie auf Exportieren.

f-spot-0.8.2/help/de/introduction.page0000644000175000017500000000130411503407430020133 0ustar00rubenruben00000000000000 Eine kurze Einführung in F-Spot Einführung

F-Spot ist eine umfassend ausgestattete Fotoverwaltung für die GNOME-Arbeitsumgebung. Es ermöglicht Ihnen das Markieren, Bewerten und Datieren von Fotos und die Bearbeitung von Metadaten. Darüber hinaus enthält F-Spot ein einfaches eingebautes Bildbearbeitungsprogramm.

Hilfe beim Einstieg in F-Spot erhalten Sie im Abschnitt Grundlegende Funktionen der Hilfe.

f-spot-0.8.2/help/de/tag-remove.page0000644000175000017500000000234011503407431017462 0ustar00rubenruben00000000000000 Markierungen von Fotos entfernen Entfernen

Wie beim Hinzufügen von Markierungen gibt es zwei grundlegende Methoden, um Markierungen von Ihren Fotos zu entfernen.

Erste Methode:

Wählen Sie die Fotos aus, von denen Sie eine Markierung entfernen wollen.

Wählen Sie in der Markierungsleiste eine Markierung aus, die Sie von den von Ihnen ausgewählten Fotos entfernen wollen.

Klicken Sie auf MarkierungenMarkierung aus der Auswahl entfernen.

Zweite Methode:

Wählen Sie die Fotos aus, von denen Sie eine Markierung entfernen wollen.

Klicken Sie mit der rechten Maustaste auf die Fotos.

Wählen Sie Markierung entfernen und danach die Markierung, die Sie entfernen wollen.

f-spot-0.8.2/help/de/picasa.page0000644000175000017500000000205711503407430016660 0ustar00rubenruben00000000000000 Hochladen Ihrer Bilder zum PicasaWeb-Bilderdienst Picasa

Um Fotos zu Picasa hochzuladen, benötigen Sie ein Picasa-Konto sowie einen aktiven Internetzugang. Außerdem muss die Picasa-Erweiterung installiert und aktiviert sein.

Select the photos you wish to upload.

Click PhotoExport To PicasaWeb....

Add a gallery by clicking Add and supplying a username and password.

j

Select a gallery to export to, or click Add to create a new gallery.

Click Export.

f-spot-0.8.2/help/de/general-editing.page0000644000175000017500000000360011503407430020451 0ustar00rubenruben00000000000000 Einfache Bearbeitungsmöglichkeiten für Ihre Fotos Allgemeine Bearbeitung

F-Spot ermöglicht Ihnen einfache Bearbeitungen Ihrer Fotos, wie Begradigen, Zuschneiden oder Drehen.

Sie haben drei Möglichkeiten zum Drehen eines ausgewählten Fotos:

Klicken Sie auf den entsprechenden Drehungsknopf rechts neben dem Importknopf.

Wählen Sie die entsprechende Option im Bearbeiten-Menü.

Verwenden Sie die Klammer-Tasten, um das Foto zu drehen.

So begradigen Sie ein gewähltes Foto:

Wählen Sie Begradigung im Bearbeitungsfenster.

Wählen Sie den Drehwinkel im Bereich von -45 bis 45 Grad.

Klicken Sie auf Begradigung.

So schneiden Sie ein gewähltes Foto zu:

Klicken Sie auf den Zuschneiden-Knopf in der Bearbeitungsleiste.

Wählen Sie ein Seitenverhältnis, also ein Verhältnis zwischen Höhe und Breite, dem das neue Foto entsprechen soll. Beispiele für Seitenverhältnisse sind 4x3, 4x6 und 5x7.

Klicken und ziehen Sie, um den zu erhaltenden Bereich zu wählen. Dieses Rechteck können Sie noch als Ganzes verschieben, nachdem die Größe gewählt wurde.

Wenn Sie den gewünschten Bereich zum Zuschneiden gewählt haben, klicken Sie auf Zuschneiden.

f-spot-0.8.2/help/de/extensions.page0000644000175000017500000000435211503407430017617 0ustar00rubenruben00000000000000 Arbeiten mit F-Spot-Erweiterungen Erweiterungen

F-Spot ermöglicht die Nutzung von Erweiterungen, um zusätzliche Funktionalität bereitzustellen.

Um die Erweiterungsverwaltung zu öffnen, wählen Sie BearbeitenErweiterungen verwalten.

So installieren Sie Erweiterungen:

Öffnen Sie die Erweiterungsverwaltung.

Klicken Sie auf Install Add-ins....

Wählen Sie aus der Liste eine zu installierende Erweiterung aus.

Klicken Sie auf Vor.

Überprüfen Sie alle Informationen und klicken Sie erneut auf Vor.

Klicken Sie auf OK.

So aktivieren Sie Plugins, die bereits installiert sind:

Öffnen Sie die Erweiterungsverwaltung.

Wählen Sie die Erweiterung, die Sie aktivieren wollen.

Klicken Sie auf Aktivieren.

So deaktivieren Sie Plugins, die bereits installiert sind:

Öffnen Sie die Erweiterungsverwaltung.

Wählen Sie die Erweiterung, die Sie deaktivieren wollen.

Klicken Sie auf Deaktivieren.

So deinstallieren Sie Plugins:

Öffnen Sie die Erweiterungsverwaltung.

Wählen Sie die Erweiterung, die Sie deinstallieren wollen.

Klicken Sie auf Deinstallieren.

Klicken Sie auf Vor.

Klicken Sie auf OK.

f-spot-0.8.2/help/de/23hq.page0000644000175000017500000000076711503407430016203 0ustar00rubenruben00000000000000 Fotos zu 23hq übertragen 23hq

Um Fotos zu 23hq hochzuladen, benötigen Sie ein 23hq-Konto sowie einen aktiven Internetzugang. Außerdem muss die 23hq-Erweiterung installiert und aktiviert sein.

f-spot-0.8.2/help/de/zooomr.page0000644000175000017500000000100311503407431016734 0ustar00rubenruben00000000000000 Fotos zu Zooomr übertragen Zooomr

Um Fotos zu Zooomr hochzuladen, benötigen Sie ein Zooomr-Konto sowie einen aktiven Internetzugang. Außerdem muss die Zooomr-Erweiterung installiert und aktiviert sein.

f-spot-0.8.2/help/de/de.po0000644000175000017500000013342611503407433015522 0ustar00rubenruben00000000000000# German translation for f-spot. # Copyright (C) 2010 f-spot's COPYRIGHT HOLDER # This file is distributed under the same license as the f-spot package. # Mario Blättermann , 2010. # Wolfgang Stoeggl , 2010. # msgid "" msgstr "" "Project-Id-Version: f-spot master\n" "POT-Creation-Date: 2010-10-21 11:49+0000\n" "PO-Revision-Date: 2010-10-24 14:30+0100\n" "Last-Translator: Mario Blättermann \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-Language: German\n" "X-Poedit-Country: GERMANY\n" #: C/zooomr.page:8(desc) msgid "Upload photos to Zooomr" msgstr "Fotos zu Zooomr übertragen" #: C/zooomr.page:11(title) msgid "Zooomr" msgstr "Zooomr" #: C/zooomr.page:15(p) msgid "" "To upload photos to Zooomr you will need a Zooomr account, as well as " "internet access. Also, the Zooomr extension " "must be installed and enabled." msgstr "" "Um Fotos zu Zooomr hochzuladen, benötigen Sie ein Zooomr-Konto sowie einen " "aktiven Internetzugang. Außerdem muss die Zooomr-Erweiterung installiert und aktiviert sein." #: C/versioning.page:8(desc) msgid "Track different versions of your photos" msgstr "Verschiedene Versionen Ihrer Fotos bewahren" #: C/versioning.page:11(title) msgid "Versioning" msgstr "Versionierung" #: C/versioning.page:14(p) msgid "" "F-Spot allows you to keep multiple versions of your photos. This " "is especially useful when editing photos, as you can quickly see the " "difference between the edited version and the original." msgstr "" "F-Spot ermöglicht es Ihnen, verschiedene Versionen Ihrer Bilder " "zu bewahren. Dies ist insbesondere beim Bearbeiten von Fotos nützlich, da " "Sie auf diese Weise schnell die Unterschiede zwischen der bearbeiteten " "Version und dem Original erkennen können." #: C/versioning.page:17(p) msgid "To switch between versions while editing:" msgstr "So wechseln Sie zwischen verschiedenen Versionen bei der Bearbeitung:" #: C/versioning.page:20(p) msgid "Double-click the photo you wish to edit." msgstr "Doppelklicken Sie auf das Foto, das Sie bearbeiten wollen." #: C/versioning.page:23(p) msgid "" "In the sidebar, you will see a drop-down box labeled Version:. To " "select a version to view, select it in the drop-down box." msgstr "" "In der Seitenleiste finden Sie ein Auswahlfeld mit der Beschriftung " "Version:. Um eine anzuzeigende Version auszuwählen, wählen Sie " "sie in der Auswahlliste aus." #: C/upload-to-web.page:8(desc) msgid "Upload photos to various web services" msgstr "Übertragen von Fotos zu verschiedenen Bilderdiensten" #: C/upload-to-web.page:11(title) msgid "Upload to Web" msgstr "Übertragen zu Bilderdiensten" #: C/upload-to-web.page:14(p) msgid "" "F-Spot allows you to upload photos to popular web services, " "including Google's PicasaWeb and Flickr." msgstr "" "F-Spot ermöglicht Ihnen das Hochladen von Fotos zu populären " "Webdiensten wie PicasaWeb von Google oder Flickr." #: C/tags.page:6(desc) msgid "A brief introduction to the tagging capabilities of F-Spot" msgstr "Eine kurze Einführung in die Möglichkeiten der Markierung mit F-Spot" #: C/tags.page:9(title) msgid "Tags" msgstr "Markierungen" #: C/tags.page:12(p) msgid "" "Like certain other photo managers, F-Spot lets you tag your " "photos, allowing for quick, easy content-based searching of your photos. You " "can tag people, events, places, favorite things, or even make your own " "groups of tags." msgstr "" "Wie von anderen Fotoverwaltungen bereits bekannt, können Sie auch in F-" "Spot Ihre Fotos mit Markierungen versehen, wodurch inhaltsbasiertes " "Durchsuchen Ihrer Fotos erleichtert wird. Sie können Personen, Ereignisse, " "Orte, Vorlieben als Markierungen nutzen oder auch Ihre eigenen " "Markierungsgruppen erstellen." #: C/tags.page:17(title) msgid "Working with Tags" msgstr "Arbeiten mit Markierungen" #: C/tag-search.page:8(desc) msgid "Search photos using tags" msgstr "Fotos anhand von Markierungen durchsuchen" #: C/tag-search.page:11(title) msgid "Search by Tag" msgstr "Nach Markierungen suchen" #: C/tag-search.page:15(p) msgid "There are several methods to search by tags." msgstr "Es gibt verschiedene Methoden, nach Markierungen zu suchen." #: C/tag-search.page:16(p) msgid "Method One: Double-click the tags you wish to search for." msgstr "" "Erste Methode: Doppelklicken Sie auf die Markierungen, nach denen Sie suchen " "wollen." #: C/tag-search.page:17(p) C/tag-remove.page:28(p) C/tag-creation.page:32(p) #: C/tag-attach.page:29(p) C/ratings.page:25(p) msgid "Method Two:" msgstr "Zweite Methode:" #: C/tag-search.page:20(p) msgid "" "Enable the Find bar by clicking FindShow Find bar." msgstr "" "Aktivieren Sie das Suchfeld mittels SuchenSuchfeld " "anzeigen." #: C/tag-search.page:24(p) msgid "Drag the tags you wish to search for into the newly-enabled Find bar." msgstr "" "Ziehen Sie die Markierungen, nach denen Sie suchen wollen, in das soeben " "aktivierte Suchfeld." #: C/tag-search.page:27(p) msgid "" "To remove a tag from your search, right-click the tag in the Find bar and " "click Remove From Search." msgstr "" "Um eine Markierung aus Ihrer Suche zu entfernen, klicken Sie mit der rechten " "Maustaste in das Suchfeld und klicken Sie auf Aus der Suche entfernen." #: C/tag-search.page:30(p) msgid "To exclude a tag from your search:" msgstr "So schließen Sie eine Markierung von Ihrer Suche aus:" #: C/tag-search.page:33(p) msgid "" "In the tag pane, double-click the tag you wish to exclude. This will add it " "to the Find bar." msgstr "" "Doppelklicken Sie in der Markierungsleiste auf die Markierung, die Sie " "ausschließen wollen. Dadurch wird sie zunächst zur Suchleiste hinzugefügt." #: C/tag-search.page:37(p) msgid "In the Find bar, double-click the tag you wish to exclude." msgstr "" "Doppelklicken Sie anschließend in der Suchleiste auf die Markierung, die Sie " "ausschließen wollen." #: C/tag-remove.page:6(desc) msgid "Removing tags from photos" msgstr "Markierungen von Fotos entfernen" #: C/tag-remove.page:9(title) msgid "Removing" msgstr "Entfernen" #: C/tag-remove.page:12(p) msgid "" "As with attaching tags, there are two main methods of removing tags from " "photos." msgstr "" "Wie beim Hinzufügen von Markierungen gibt es zwei grundlegende Methoden, um " "Markierungen von Ihren Fotos zu entfernen." #: C/tag-remove.page:14(p) C/tag-creation.page:14(p) C/tag-attach.page:15(p) #: C/ratings.page:14(p) msgid "Method One:" msgstr "Erste Methode:" #: C/tag-remove.page:17(p) C/tag-remove.page:31(p) msgid "Select photos from which to remove a tag." msgstr "" "Wählen Sie die Fotos aus, von denen Sie eine Markierung entfernen wollen." #: C/tag-remove.page:20(p) msgid "" "In the tag pane, select a tag to remove from the photos you have selected." msgstr "" "Wählen Sie in der Markierungsleiste eine Markierung aus, die Sie von den von " "Ihnen ausgewählten Fotos entfernen wollen." #: C/tag-remove.page:24(p) msgid "" "Click TagsRemove Tag From Selection." msgstr "" "Klicken Sie auf MarkierungenMarkierung aus der " "Auswahl entfernen." #: C/tag-remove.page:34(p) C/tag-attach.page:35(p) msgid "Right click the photos." msgstr "Klicken Sie mit der rechten Maustaste auf die Fotos." #: C/tag-remove.page:37(p) msgid "Select Remove Tag and select the tag you wish to remove." msgstr "" "Wählen Sie Markierung entfernen und danach die Markierung, die " "Sie entfernen wollen." #: C/tag-delete.page:6(desc) msgid "Deleting tags from the system" msgstr "Löschen von Markierungen aus dem System" #: C/tag-delete.page:9(title) msgid "Deleting" msgstr "Löschen" #: C/tag-delete.page:12(p) msgid "" "Deleting tags removes them entirely from your system, but leaves behind any " "photos to which that tag is attached." msgstr "" "Das Löschen von Markierungen entfernt diese vollständig aus dem System, aber " "lässt die Fotos zurück, denen diese Markierung zugeordnet ist." #: C/tag-delete.page:14(p) msgid "To delete a tag:" msgstr "So löschen Sie eine Markierung:" #: C/tag-delete.page:17(p) msgid "Select the tag you wish to delete from within the tag pane." msgstr "Wählen Sie die zu entfernende Markierung in der Markierungsleiste aus." #: C/tag-delete.page:20(p) msgid "" "Click TagsDelete Selected Tag. " "Alternatively, right click the tag within the pane, and click Delete " "Tag." msgstr "" "Klicken Sie auf MarkierungenAusgewählte Markierung " "löschen. Wahlweise können Sie mit der rechten Maustaste in " "die Markierungsleiste klicken. Anschließend klicken Sie auf Markierung " "löschen." #: C/tag-creation.page:6(desc) msgid "Creating tags to be attached to photos" msgstr "Erstellen von Markierungen, die Fotos zugeordnet werden können" #: C/tag-creation.page:9(title) msgid "Creating" msgstr "Erstellen" #: C/tag-creation.page:12(p) msgid "" "In order to use tags, you need to first create a set of tags which you wish " "to use. There are three main methods to create tags." msgstr "" "Um überhaupt Markierungen benutzen zu können, müssen Sie zunächst eine Reihe " "von Markierungen erstellen. Es gibt drei grundlegende Methoden zum Erstellen " "von Markierungen." #: C/tag-creation.page:17(p) msgid "Select TagsCreate New Tag...." msgstr "" "Wählen Sie MarkierungenNeue Markierung erstellen …." #: C/tag-creation.page:21(p) C/tag-creation.page:39(p) #: C/tag-creation.page:61(p) msgid "" "Select a parent tag for the new tag to appear under, such as people or " "events. If you wish to create a new tag without a parent, select (None)" "." msgstr "" "Wählen Sie eine übergeordnete Markierung, unter der die neue Markierung " "eingeordnet werden soll, wie beispielsweise »Personen« oder »Ereignisse«. " "Falls Sie eine neue Markierung ohne übergeordnete Markierung erstellen " "wollen, wählen Sie (Keine)." #: C/tag-creation.page:26(p) C/tag-creation.page:44(p) #: C/tag-creation.page:66(p) msgid "Name the tag." msgstr "Benennen Sie die Markierung." #: C/tag-creation.page:29(p) C/tag-creation.page:47(p) #: C/tag-creation.page:69(p) msgid "Click Create" msgstr "Klicken Sie auf Erstellen." #: C/tag-creation.page:35(p) msgid "In the tags page, right click, and select Create New Tag..." msgstr "" "Klicken Sie mit der rechten Maustaste in die Markierungsleiste und wählen " "Sie Neue Markierung erstellen …" #: C/tag-creation.page:50(p) msgid "" "Method three has the advantage of also attaching the new tag to the photos selected. To do this:" msgstr "" "Die dritte Methode hat den Vorteil, dass die neue Markierung auch zu den " "gewählten Fotos hinzugefügt wird. Gehen Sie " "folgendermaßen vor:" #: C/tag-creation.page:54(p) msgid "Select the photos to which you wish to attach the new tag." msgstr "" "Wählen Sie die Fotos aus, denen Sie die neue Markierung zuordnen wollen." #: C/tag-creation.page:57(p) msgid "" "Right-click on the photos, and select Attach TagCreate New Tag...." msgstr "" "Klicken Sie mit der rechten Maustaste auf die Fotos und wählen Sie " "Markierung hinzufügenNeue Markierung erstellen …." #: C/tag-attach.page:6(desc) msgid "Attaching tags to photos" msgstr "Zuordnen von Markierungen zu Fotos" #: C/tag-attach.page:9(title) msgid "Attaching" msgstr "Zuordnen" #: C/tag-attach.page:12(p) msgid "" "By attaching tags you have created you " "make it easier to search through your photos. As with creating tags, there " "is more than one method of attaching tags to photos." msgstr "" "Das Hinzufügen von erstellten " "Markierungen erleichtert das Durchsuchen Ihrer Fotos. Wie beim Erstellen von " "Markierungen gibt es mehrere Methoden, diese Markierungen zu Fotos " "hinzuzufügen." #: C/tag-attach.page:18(p) C/tag-attach.page:32(p) msgid "Select photos to which to attach a tag." msgstr "Wählen Sie Fotos aus, denen Sie eine Markierung zuordnen wollen." #: C/tag-attach.page:21(p) msgid "" "In the tag pane, select a tag to attach to the photos you have selected." msgstr "" "Wählen Sie in der Markierungsleiste eine Markierung aus, die Sie zu den " "gewählten Fotos hinzufügen wollen." #: C/tag-attach.page:25(p) msgid "" "Click TagsAttach Tag to Selection. " "Alternatively, press Ctrl+T." msgstr "" "Klicken Sie auf MarkierungenMarkierung zur Auswahl " "hinzufügen oder drücken Sie Strg+T." #: C/tag-attach.page:38(p) msgid "Select Attach Tag and select the tag you wish to attach." msgstr "" "Wählen Sie Markierung hinzufügen und wählen Sie die Markierung " "aus, die Sie hinzufügen wollen." #: C/smugmug.page:8(desc) msgid "Upload photos to SmugMug" msgstr "Fotos zu SmugMug übertragen" #: C/smugmug.page:11(title) msgid "SmugMug" msgstr "SmugMug" #: C/smugmug.page:15(p) msgid "" "To upload photos to SmugMug you will need a SmugMug account, as well as " "internet access. Also, the SmugMug extension must be installed and enabled." msgstr "" "Um Fotos zu SmugMug hochzuladen, benötigen Sie ein SmugMug-Konto sowie einen " "aktiven Internetzugang. Außerdem muss die SmugMug-Erweiterung installiert und aktiviert sein." #: C/ratings.page:6(desc) msgid "Rate your photos from one to five stars" msgstr "Bewerten Sie Ihre Fotos mit einem bis fünf Sternen" #: C/ratings.page:9(title) msgid "Rating your photos" msgstr "Bewerten Ihrer Fotos" #: C/ratings.page:12(p) msgid "" "F-Spot allows you to rate your photos from one to five stars. " "There are two ways to rate photos." msgstr "" "F-Spot ermöglicht Ihnen die Bewertung Ihrer Fotos mit einem bis " "fünf Sternen. Es gibt zwei Möglichkeiten, Fotos zu bewerten." #: C/ratings.page:17(p) msgid "By double-clicking, select the photo you wish to rate." msgstr "Wählen Sie mittels Doppelklick das Foto aus, das Sie bewerten wollen." #: C/ratings.page:20(p) msgid "" "In the lower-right corner, you will see five dots, corresponding to the " "rating you wish to give; to give a rating of one star, for example, click " "the first dot." msgstr "" "In der unteren rechten Ecke sehen Sie fünf Punkte, die sich auf die zu " "vergebende Bewertung beziehen. Um beispielsweise einen Stern zu vergeben, " "klicken Sie auf den ersten Punkt." #: C/ratings.page:28(p) msgid "Select the photo(s) you wish to rate." msgstr "Wählen Sie das/die Foto(s) zur Bewertung aus." #: C/ratings.page:31(p) msgid "" "Right-click the photo(s) you wish to rate, and select a rating at the bottom " "of the right-click menu by clicking the corresponding dot." msgstr "" "Klicken Sie mit der rechten Maustaste auf das oder die zu bewertenden Foto" "(s) und wählen Sie eine Bewertung unten im Kontextmenü aus, indem Sie auf " "den entsprechenden Punkt klicken." #: C/rate-search.page:8(desc) msgid "Search photos by star rating" msgstr "Suchen nach Fotos anhand von Bewertungssternen" #: C/rate-search.page:11(title) msgid "Search by Rating" msgstr "Suche nach Bewertung" #: C/rate-search.page:15(p) msgid "To search by rating:" msgstr "So suchen Sie nach Fotos anhand von Bewertungssternen:" # In der GUI-Übersetzung findet man »Bewertungsfilter einstellen …« #: C/rate-search.page:18(p) msgid "" "Select FindBy RatingSet Rating Filter...." msgstr "" "Wählen Sie SuchenNach BewertungBewertungsfilter setzen." #: C/rate-search.page:22(p) msgid "Select the rating range which you wish to view." msgstr "Wählen Sie den Bereich der Bewertungen der zu betrachtenden Fotos." #: C/rate-search.page:25(p) C/extensions.page:39(p) C/extensions.page:82(p) #: C/date-search.page:27(p) msgid "Click Ok." msgstr "Klicken Sie auf OK." #: C/rate-search.page:28(p) msgid "To stop searching by rating:" msgstr "So halten Sie die Suche nach Bewertungssternen an:" #: C/rate-search.page:31(p) msgid "" "Select FindBy RatingSet Rating Filter." msgstr "" "Wählen Sie SuchenNach BewertungBewertungsfilter setzen." #: C/picasa.page:8(desc) msgid "Upload photos to Google's PicasaWeb" msgstr "Hochladen Ihrer Bilder zum PicasaWeb-Bilderdienst" #: C/picasa.page:11(title) msgid "Picasa" msgstr "Picasa" #: C/picasa.page:15(p) msgid "" "To upload photos to Picasa you will need a Picasa account, as well as " "internet access. Also, the PicasaWeb extension must be installed and enabled." msgstr "" "Um Fotos zu Picasa hochzuladen, benötigen Sie ein Picasa-Konto sowie einen " "aktiven Internetzugang. Außerdem muss die Picasa-Erweiterung installiert und aktiviert sein." #: C/picasa.page:21(p) msgid "Select the photos you wish to upload." msgstr "Wählen Sie die Fotos aus, die Sie hochladen wollen." #: C/picasa.page:24(p) msgid "" "Click PhotoExport ToPicasaWeb...." msgstr "" "Klicken Sie auf FotoExportieren nachPicasaWeb …." #: C/picasa.page:28(p) msgid "" "Add a gallery by clicking Add and supplying a username and " "password." msgstr "" "Fügen Sie eine Galerie hinzu, indem Sie auf Hinzufügen klicken " "und einen Benutzernamen und ein Passwort angeben." #: C/picasa.page:32(p) msgid "" "Select a gallery to export to, or click Add to create a new " "gallery." msgstr "" "Wählen Sie eine Galerie für den Export aus oder klicken Sie auf " "Hinzufügen, um eine neue Galerie zu erstellen." #: C/picasa.page:36(p) C/folder.page:39(p) msgid "Click Export." msgstr "Klicken Sie auf Exportieren." #: C/picasa.page:19(steps) msgid "" "j " msgstr "" "j " #: C/introduction.page:6(desc) msgid "A brief introduction to F-Spot" msgstr "Eine kurze Einführung in F-Spot" #: C/introduction.page:9(title) msgid "Introduction" msgstr "Einführung" #: C/introduction.page:12(p) msgid "" "F-Spot is a full-featured photo manager for the GNOME Desktop, " "allowing you to tag, rate, and date photos, edit photo metadata, and even " "includes a simple in-program photo editor." msgstr "" "F-Spot ist eine umfassend ausgestattete Fotoverwaltung für die " "GNOME-Arbeitsumgebung. Es ermöglicht Ihnen das Markieren, Bewerten und " "Datieren von Fotos und die Bearbeitung von Metadaten. Darüber hinaus enthält " "F-Spot ein einfaches eingebautes Bildbearbeitungsprogramm." #: C/introduction.page:15(p) msgid "" "For help getting started using F-Spot, check out the basic functions of the help file." msgstr "" "Hilfe beim Einstieg in F-Spot erhalten Sie im Abschnitt Grundlegende Funktionen der Hilfe." #: C/index.page:7(title) C/index.page:8(title) C/index.page:11(title) msgid "F-Spot photo manager" msgstr "F-Spot Fotoverwaltung" #: C/index.page:16(title) msgid "Basic Functions" msgstr "Grundlegende Funktionen" #: C/index.page:20(title) msgid "Searching" msgstr "Suchen" #: C/index.page:24(title) msgid "Photo Editing" msgstr "Fotobearbeitung" #: C/index.page:28(title) msgid "Sharing" msgstr "Freigeben" #: C/index.page:32(title) msgid "Advanced Options" msgstr "Erweiterte Optionen" #: C/import-roll-search.page:8(desc) msgid "Searching by date of import" msgstr "Suchen anhand des Importdatums" #: C/import-roll-search.page:11(title) msgid "Search by Import Roll" msgstr "Suchen anhand von importierten Rollen" #: C/import-roll-search.page:15(p) msgid "" "Import rolls are \"batches\" of imported photos. Regardless of the date the " "photo was taken, the import roll timestamp is decided when you import photos." msgstr "" "Importierte Rollen sind »Stapel« von importierten Fotos. Unabhängig vom " "eigentlichen Aufnahmedatum des Bildes ist hier der Zeitstempel des Imports " "der Fotos entscheidend." #: C/import-roll-search.page:18(p) msgid "To search by latest import roll:" msgstr "So suchen Sie nach der neuesten importierten Rolle:" #: C/import-roll-search.page:21(p) msgid "" "Select FindBy Import RollLast Import " "Roll." msgstr "" "Wählen Sie SuchenNach ImportenLetzter " "Import." #: C/import-roll-search.page:25(p) msgid "To select a previous import roll:" msgstr "So wählen Sie einen früheren Import:" #: C/import-roll-search.page:28(p) msgid "" "Select FindBy Import RollSelect Import " "Rolls." msgstr "" "Wählen Sie SuchenNach ImportenImporte " "auswählen." #: C/import-roll-search.page:32(p) msgid "" "Select an import roll to search, or select a range by choosing Between and select the dates you wish to include." msgstr "" "Wählen Sie einen zu durchsuchenden Import aus oder wählen Sie mit " "zwischen einen Datumsbereich aus, in welchem die Suche ausgeführt " "werden soll." #: C/import-roll-search.page:36(p) msgid "" "To stop searching by import rolls, select FindBy " "Import RollClear Roll Filter." msgstr "" "Um die Suche nach Importen zu beenden, wählen Sie SuchenNach ImportenImportfilter zurücksetzen." #: C/import-photos.page:6(desc) msgid "Import photos to be managed" msgstr "Importieren zu verwaltender Fotos" #: C/import-photos.page:9(title) msgid "Importing Photos" msgstr "Importieren von Fotos" #: C/import-photos.page:12(p) msgid "Chances are, the first thing you will want to do is import photos." msgstr "Als erstes werden Sie vermutlich Fotos importieren wollen." #: C/import-photos.page:15(p) msgid "To import photos:" msgstr "So importieren Sie Fotos:" #: C/import-photos.page:20(p) msgid "" "Select PhotoImport.... Alternatively, " "click the Import button." msgstr "" "Wählen Sie FotoImportieren …. " "Wahlweise können Sie auch auf den Import-Knopf klicken." #: C/import-photos.page:24(p) msgid "Select a source from which to import, such as a device or a folder." msgstr "" "Wählen Sie eine Quelle für den Import aus, wie ein Gerät oder einen Ordner." #: C/import-photos.page:27(p) msgid "" "It may take a while for F-Spot to index the files. When it is done indexing, " "your photos will be presented to you. At this time, you can attach tags to all photos, or you can leave that task for " "later." msgstr "" "F-Spot kann eine gewisse Zeit brauchen, um die Dateien zu indizieren. Wenn " "die Indizierung abgeschlossen ist, werden Ihnen die Fotos präsentiert. Nun " "können Sie Markierungen zu den Fotos hinzufügen. " "Dies ist jedoch später auch noch möglich." #: C/import-photos.page:33(p) msgid "When you are ready to finish importing photos, click Import." msgstr "" "Wenn Sie bereit zum Importieren der Fotos sind, klicken Sie auf " "Importieren." #: C/general-editing.page:6(desc) msgid "Make simple edits to your photos" msgstr "Einfache Bearbeitungsmöglichkeiten für Ihre Fotos" #: C/general-editing.page:9(title) msgid "General Editing" msgstr "Allgemeine Bearbeitung" #: C/general-editing.page:13(p) msgid "" "F-Spot allows you to make simple general edits, including " "straightening, cropping, and rotating your photos." msgstr "" "F-Spot ermöglicht Ihnen einfache Bearbeitungen Ihrer Fotos, wie " "Begradigen, Zuschneiden oder Drehen." #: C/general-editing.page:15(p) msgid "There are three ways to rotate a selected photo:" msgstr "Sie haben drei Möglichkeiten zum Drehen eines ausgewählten Fotos:" #: C/general-editing.page:18(p) msgid "Click the appropriate rotate button, to the right of the import button." msgstr "" "Klicken Sie auf den entsprechenden Drehungsknopf rechts neben dem " "Importknopf." #: C/general-editing.page:22(p) msgid "Select the appropriate option from within the Edit menu." msgstr "Wählen Sie die entsprechende Option im Bearbeiten-Menü." #: C/general-editing.page:26(p) msgid "Use the bracket keys to rotate the photo." msgstr "Verwenden Sie die Klammer-Tasten, um das Foto zu drehen." #: C/general-editing.page:29(p) msgid "To straighten a selected photo:" msgstr "So begradigen Sie ein gewähltes Foto:" #: C/general-editing.page:32(p) msgid "From within the editing pane, select Straighten." msgstr "Wählen Sie Begradigung im Bearbeitungsfenster." #: C/general-editing.page:35(p) msgid "Select a rotation, ranging from -45 to 45 degrees." msgstr "Wählen Sie den Drehwinkel im Bereich von -45 bis 45 Grad." #: C/general-editing.page:38(p) msgid "Click Straighten." msgstr "Klicken Sie auf Begradigung." #: C/general-editing.page:41(p) msgid "To crop a selected photo:" msgstr "So schneiden Sie ein gewähltes Foto zu:" #: C/general-editing.page:44(p) msgid "Click the Crop button in the Edit pane." msgstr "" "Klicken Sie auf den Zuschneiden-Knopf in der Bearbeitungsleiste." # Hier ist vermutlich ein Tippfehler im Originaltext: 'contraining' #: C/general-editing.page:47(p) msgid "" "Select a contraining aspect ratio, that is, a proportion of height to width " "to which the new photo must fit. Examples of contraining aspect ratios " "include 4x3, 4x6, and 5x7." msgstr "" "Wählen Sie ein Seitenverhältnis, also ein Verhältnis zwischen Höhe und " "Breite, dem das neue Foto entsprechen soll. Beispiele für Seitenverhältnisse " "sind 4x3, 4x6 und 5x7." #: C/general-editing.page:52(p) msgid "" "Click and drag to select the desired area to keep. This box can be dragged " "around after being sized." msgstr "" "Klicken und ziehen Sie, um den zu erhaltenden Bereich zu wählen. Dieses " "Rechteck können Sie noch als Ganzes verschieben, nachdem die Größe gewählt " "wurde." #: C/general-editing.page:56(p) msgid "When you have selected your area to crop to, click Crop." msgstr "" "Wenn Sie den gewünschten Bereich zum Zuschneiden gewählt haben, klicken Sie " "auf Zuschneiden." #: C/folder.page:8(desc) msgid "Send photos to a folder" msgstr "Fotos an einen Ordner senden" #: C/folder.page:11(title) msgid "Folder Export" msgstr "Ordner-Export" #: C/folder.page:15(p) msgid "" "F-Spot allows you to export to a folder. In order to do so, " "however, you will need to have the folder export extension installed and enabled." msgstr "" "F-Spot ermöglicht Ihnen den Export in einen Ordner. Dazu muss die " "Ordner-Export-Erweiterung installiert und " "aktiviert sein." #: C/folder.page:18(p) msgid "To export selected photos to a folder:" msgstr "So exportieren Sie Fotos in einen Ordner:" #: C/folder.page:21(p) msgid "" "Select PhotoExport ToFolder...." msgstr "" "Wählen Sie FotoExportieren nachOrdner …." #: C/folder.page:25(p) msgid "Select a folder." msgstr "Wählen Sie einen Ordner." #: C/folder.page:28(p) msgid "Name the gallery and give it a description." msgstr "Benennen Sie die Galerie und versehen Sie sie mit einer Beschreibung." #: C/folder.page:31(p) msgid "" "Select an export method. Create Standalone Web Gallery will " "create a folder with contents fit to be uploaded to a web server to present " "pictures in a gallery. Save the files only will only move photos " "to the selected folder. Create gallery using \"Original\" will " "create a folder with contents suitable for using with Original Photo Gallery." msgstr "" "Wählen Sie eine Exportmethode. Eigenständige Web-Galerie anlegen " "erstellt einen Ordner, der inhaltlich direkt auf einen Webserver geladen und " "als Web-Galerie dargestellt werden kann. Nur die Dateien speichern kopiert die Fotos in den gewählten Ordner. Galerie unter " "Verwendung von »Original« anlegen erstellt einen Ordner, dessen Inhalt " "für die Nutzung mit der originalen Fotogalerie geeignet ist." #: C/flickr.page:8(desc) msgid "Upload photos to Flickr" msgstr "Fotos zu Flickr übertragen" #: C/flickr.page:11(title) msgid "Flickr" msgstr "Flickr" #: C/flickr.page:15(p) msgid "" "To upload photos to Flickr you will need a Flickr account, as well as " "internet access. Also, the Flickr extension " "must be installed and enabled." msgstr "" "Um Fotos zu Flickr hochzuladen, benötigen Sie ein Flickr-Konto sowie einen " "aktiven Internetzugang. Außerdem muss die Flickr-Erweiterung installiert und aktiviert sein." #: C/file-management.page:8(desc) msgid "Manage files already imported" msgstr "Verwalten bereits importierter Dateien" #: C/file-management.page:11(title) msgid "File Management" msgstr "Dateiverwaltung" #: C/file-management.page:15(p) msgid "" "F-Spot allows for some control over the contents of your catalog, " "that is, removing files from your catalog as well as deleting files from " "your catalog." msgstr "" "F-Spot ermöglicht Ihnen, den Inhalt des Kataloges zu bearbeiten. " "Dazu zählt das Entfernen aus dem Katalog oder auch das Löschen von Dateien." #: C/file-management.page:18(p) msgid "To remove files from your catalog:" msgstr "So löschen Sie Dateien aus Ihrem Katalog:" #: C/file-management.page:21(p) msgid "Select the photos you wish to remove from the catalog." msgstr "Wählen Sie die Fotos, die Sie aus dem Katalog entfernen wollen." #: C/file-management.page:24(p) msgid "" "Right-click the photos, select Remove From Catalog. " "Alternatively, select EditRemove From Catalog or press the Delete key on your keyboard." msgstr "" "Klicken Sie mit der rechten Maustaste auf die Fotos und wählen Sie Aus " "dem Katalog entfernen. Alternativ wählen Sie BearbeitenAus dem Katalog entfernen oder drücken Sie die Entf-" "Taste auf Ihrer Tastatur." #: C/file-management.page:29(p) msgid "To delete photos from your computer:" msgstr "So löschen Sie Fotos von Ihrem Rechner:" #: C/file-management.page:32(p) msgid "Select the photos you wish to delete." msgstr "Wählen Sie die Fotos, die Sie löschen wollen." #: C/file-management.page:35(p) msgid "" "Right-click the photos, select Delete From Drive. Alternatively, " "select EditDelete From Drive or press " "Shift+Delete on your keyboard." msgstr "" "Klicken Sie mit der rechten Maustaste auf die Fotos und wählen Sie Vom " "Laufwerk löschen. Alternativ wählen Sie BearbeitenVom Laufwerk löschen oder drücken Sie Umschalttaste" "+Entf auf Ihrer Tastatur." #: C/facebook.page:8(desc) msgid "Upload photos to Facebook" msgstr "Fotos zu Facebook übertragen" #: C/facebook.page:11(title) msgid "Facebook" msgstr "Facebook" #: C/facebook.page:15(p) msgid "" "To upload photos to Facebook you will need a Facebook account, as well as " "internet access. Also, the Facebook extension must be installed and enabled." msgstr "" "Um Fotos zu Facebook hochzuladen, benötigen Sie ein Facebook-Konto sowie " "einen aktiven Internetzugang. Außerdem muss die Facebook-Erweiterung installiert und aktiviert sein." #: C/facebook.page:20(p) msgid "To post selected photos to Facebook:" msgstr "So senden Sie die gewählten Fotos an Facebook:" #: C/facebook.page:23(p) msgid "" "Select PhotoExport ToFacebook." msgstr "" "Wählen Sie FotoExportieren nachFacebook." #: C/facebook.page:27(p) msgid "" "Click Login. A browser window will be brought up. Log in to " "Facebook and click \"Allow\" to allow F-Spot access to your Facebook profile." msgstr "" "Klicken Sie auf Anmelden. Ein Browser-Fenster wird geöffnet. " "Melden Sie sich bei Facebook an und klicken Sie dort auf »Zulassen«, um F-" "Spot zu erlauben, auf Ihr Facebook-Profil zuzugreifen." #: C/facebook.page:32(p) msgid "" "Select whether to create a new album or add to an existing album. If you are " "creating a new album, fill in the relevant information." msgstr "" "Wählen Sie, ob ein neues Album erstellt werden soll oder zu einem " "vorhandenen Album hinzugefügt werden soll. Wenn Sie ein neues Album " "erstellen, dann geben Sie die erforderlichen Informationen ein." #: C/facebook.page:36(p) msgid "Edit captions for each photo, if so desired." msgstr "Bearbeiten Sie die Beschriftung für jedes Foto, falls gewünscht." #: C/facebook.page:39(p) msgid "When finished, click Add." msgstr "Sobald Sie fertig sind, klicken Sie auf Hinzufügen." #: C/extensions.page:8(desc) msgid "Working with F-Spot extensions" msgstr "Arbeiten mit F-Spot-Erweiterungen" #: C/extensions.page:11(title) msgid "Extensions" msgstr "Erweiterungen" #: C/extensions.page:15(p) msgid "" "F-Spot allows for the use of extensions to provide additional " "functionality." msgstr "" "F-Spot ermöglicht die Nutzung von Erweiterungen, um zusätzliche " "Funktionalität bereitzustellen." #: C/extensions.page:18(p) msgid "" "To open the extension manager, select EditManage " "Extensions." msgstr "" "Um die Erweiterungsverwaltung zu öffnen, wählen Sie BearbeitenErweiterungen verwalten." #: C/extensions.page:21(p) msgid "To install extensions:" msgstr "So installieren Sie Erweiterungen:" #: C/extensions.page:24(p) C/extensions.page:46(p) C/extensions.page:58(p) #: C/extensions.page:70(p) msgid "Open the extension manager." msgstr "Öffnen Sie die Erweiterungsverwaltung." # Die Erweiterungsverwaltung ist derzeit noch englisch. #: C/extensions.page:27(p) msgid "Click Install Add-ins." msgstr "Klicken Sie auf Install Add-ins...." #: C/extensions.page:30(p) msgid "Select an add-on to install from the list." msgstr "Wählen Sie aus der Liste eine zu installierende Erweiterung aus." #: C/extensions.page:33(p) C/extensions.page:79(p) msgid "Click Forward." msgstr "Klicken Sie auf Vor." #: C/extensions.page:36(p) msgid "Verify all information, and click Forward again." msgstr "" "Überprüfen Sie alle Informationen und klicken Sie erneut auf Vor." #: C/extensions.page:43(p) msgid "To enable plugins that are already installed:" msgstr "So aktivieren Sie Plugins, die bereits installiert sind:" #: C/extensions.page:49(p) msgid "Select the extension you wish to enable." msgstr "Wählen Sie die Erweiterung, die Sie aktivieren wollen." #: C/extensions.page:52(p) msgid "Click Enable." msgstr "Klicken Sie auf Aktivieren." #: C/extensions.page:55(p) msgid "To disable plugins that are installed:" msgstr "So deaktivieren Sie Plugins, die bereits installiert sind:" #: C/extensions.page:61(p) msgid "Select the extension you wish to disable." msgstr "Wählen Sie die Erweiterung, die Sie deaktivieren wollen." #: C/extensions.page:64(p) msgid "Click Disable." msgstr "Klicken Sie auf Deaktivieren." #: C/extensions.page:67(p) msgid "To uninstall plugins:" msgstr "So deinstallieren Sie Plugins:" #: C/extensions.page:73(p) msgid "Select the extension you wish to uninstall." msgstr "Wählen Sie die Erweiterung, die Sie deinstallieren wollen." #: C/extensions.page:76(p) msgid "Click Uninstall." msgstr "Klicken Sie auf Deinstallieren." #: C/enhancements.page:6(desc) msgid "Simple enhancements for your photos" msgstr "Einfache Verbesserungen für Ihre Fotos" #: C/enhancements.page:9(title) msgid "Enhancements" msgstr "Verbesserungen" #: C/enhancements.page:13(p) msgid "" "Currently, there are two main enhancements that F-Spot supports: " "red-eye removal and the automatic enhancement of color." msgstr "" "Im Wesentlichen unterstützt F-Spot derzeit zwei " "Verbesserungsmöglichkeiten: die Entfernung roter Augen und die automatische " "Farbanpassung." #: C/enhancements.page:15(p) msgid "To remove red-eye:" msgstr "So entfernen Sie rote Augen:" #: C/enhancements.page:18(p) msgid "" "By double-clicking, select the photo on which you wish to use the red-eye " "removal tool." msgstr "" "Wählen Sie mittels Doppelklick das Foto aus, welches Sie mit dem Rote-Augen-" "Entfernungswerkzeug bearbeiten wollen." #: C/enhancements.page:22(p) msgid "Click Red-Eye Removal in the Edit panel." msgstr "" "Klicken Sie auf Rote-Augen-Reduzierung in der Bearbeitungsleiste." #: C/enhancements.page:25(p) msgid "" "Select the area from which you wish to remove red-eye. Note: If the contains " "many red areas, you may wish to select each eye individually." msgstr "" "Wählen Sie den Bereich aus, in dem Sie rote Augen entfernen wollen. Falls " "der Bereich viele rote Bereiche enthält, müssen Sie möglicherweise jedes " "Auge einzeln auswählen." #: C/enhancements.page:30(p) msgid "Click Fix!." msgstr "Klicken Sie auf Korrigieren!." #: C/enhancements.page:33(p) msgid "To automatically enhance the colors of the photo:" msgstr "So verbessern Sie automatisch die Farben eines Fotos:" #: C/enhancements.page:36(p) msgid "By double-clicking, select the photo which you wish to enhance." msgstr "" "Wählen Sie mittels Doppelklick das Foto aus, das Sie verbessern wollen." #: C/enhancements.page:39(p) msgid "Click Auto Color." msgstr "Klicken Sie auf Automatischer Farbabgleich." #: C/date-search.page:8(desc) msgid "Search photos by date" msgstr "Durchsuchen von Fotos anhand des Datums" #: C/date-search.page:11(title) msgid "Search by Date" msgstr "Suchen nach Datum" #: C/date-search.page:15(p) msgid "To search by date:" msgstr "So suchen Sie anhand des Datums:" #: C/date-search.page:18(p) msgid "" "Select FindBy DateSet Date Range...." msgstr "" "Wählen Sie SuchenNach DatumDatumsbereich " "einstellen …." #: C/date-search.page:22(p) msgid "" "Select a time period to from which to view photos. This can by done by " "selecting a set period, such as a week, or by specifying dates." msgstr "" "Wählen Sie einen Zeitabschnitt, aus dem Sie Fotos betrachten wollen. Wählen " "Sie hierzu einen gesetzten Zeitabschnitt aus oder verwenden Sie " "Datumsangaben." #: C/date-search.page:30(p) msgid "Alternatively, you can use the timeline. To use the timeline:" msgstr "" "Alternativ können Sie die Zeitlinie verwenden. So verwenden Sie die " "Zeitlinie:" #: C/date-search.page:33(p) msgid "" "Make sure the timeline is enabled by selecting ViewComponents and making sure that Timeline " "is checked." msgstr "" "Stellen Sie sicher, dass die Zeitlinie aktiviert ist. Wählen Sie " "AnsichtKomponenten und überprüfen " "Sie, ob das Ankreuzfeld Zeitlinie aktiviert ist." #: C/date-search.page:38(p) msgid "" "In the timeline, click the bar corresponding to the time period you wish to " "look at." msgstr "" "Klicken Sie in der Zeitlinie auf den Balken des Zeitabschnitts, den Sie " "betrachten wollen." #: C/date-search.page:42(p) msgid "To stop searching by date:" msgstr "So beenden Sie die Suche nach Datum:" #: C/date-search.page:45(p) msgid "" "Select FindBy DateClear Date Range." msgstr "" "Wählen Sie SuchenNach DatumDatumsspanne " "zurücksetzen." #: C/colors.page:6(desc) msgid "Edit the colors of your photos" msgstr "Bearbeiten der Farben Ihrer Fotos" #: C/colors.page:9(title) msgid "Color Editing" msgstr "Bearbeiten von Farben" #: C/colors.page:12(p) msgid "F-Spot supports several modes of color manipulation." msgstr "F-Spot unterstützt verschiedene Modi der Farbanpassung." #: C/colors.page:15(title) msgid "Desaturate" msgstr "Entsättigen" # »entfernt die Farbsättigung« würde doch bescheuert klingen, oder nicht? #: C/colors.page:16(p) msgid "" "This mode eliminates all saturation, turning a color image into a black and " "white image." msgstr "" "Dieser Modus entfernt die Farben, wodurch ein farbiges Bild in ein " "Schwarzweißbild umgewandelt wird." #: C/colors.page:20(title) msgid "Sepia Tone" msgstr "Sepiafarben" #: C/colors.page:21(p) msgid "This mode simulates a photo being created with sepia toner." msgstr "Dieser Modus simuliert ein Foto, das mit Sepia-Tönung erstellt wurde." #: C/colors.page:24(title) msgid "Auto Color" msgstr "Automatischer Farbabgleich" #: C/colors.page:25(p) msgid "This mode automatically adjusts the colors to a set profile." msgstr "" "Dieser Modus gleicht die Farben automatisch mit einem gesetzten Profil ab." #: C/cd.page:8(desc) msgid "Burn photos to a CD" msgstr "Fotos auf eine CD brennen" #: C/cd.page:11(title) msgid "CD Export" msgstr "CD-Export" #: C/adjust-color.page:6(desc) msgid "Adjusting the colors of a photo" msgstr "Anpassen der Farben eines Fotos" #: C/adjust-color.page:9(title) msgid "Adjust Color" msgstr "Farbe einstellen" #: C/adjust-color.page:12(p) msgid "" "As far as the editing tools in F-Spot, adjusting the color is easily the " "most powerful. The color editor allows you to adjust:" msgstr "" "Von den Bearbeitungswerkzeugen in F-Spot ist die Farbanpassung wohl das " "mächtigste Werkzeug. Die Farbanpassung ermöglicht Ihnen Folgendes:" #: C/adjust-color.page:16(title) msgid "Exposure" msgstr "Belichtung" #: C/adjust-color.page:17(p) msgid "This adjustment simulates lengthening or shortening the exposure time." msgstr "" "Hierdurch wird die Verlängerung oder Verkürzung der Belichtungszeit " "simuliert." #: C/adjust-color.page:21(title) msgid "Saturation" msgstr "Sättigung" #: C/adjust-color.page:22(p) msgid "" "This adjustment simulates adjusting the amount of color in the image, i.e. " "sliding it to the left decrease color, making it black and white, while " "sliding it to the right will increase the vibrancy of colors." msgstr "" "Diese Einstellung erlaubt das Anpassen der Farbintensität in einem Bild. " "Verschieben nach links verringert die Farben bis hin zum Schwarzweißbild, " "wogegen Verschieben nach rechts die Farben intensiviert." #: C/adjust-color.page:28(title) msgid "Brightness" msgstr "Helligkeit" #: C/adjust-color.page:29(p) msgid "" "This adjustment increase the brightness of colors. Increasing this too much " "will make colors appear \"washed out\", while decreasing it too much will " "make the image too dark and lacking in contrast." msgstr "" "Diese Einstellung verstärkt die Helligkeit der Farben. Ein zu hoher Wert " "lässt Farben »verwaschen« erscheinen, während ein zu geringer Wert das Bild " "zu dunkel und kontrastarm darstellt." #: C/adjust-color.page:34(title) msgid "Hue" msgstr "Farbton" #: C/adjust-color.page:35(p) msgid "This adjustment causes colors to \"rotate\" along the color wheel." msgstr "Diese Einstellung lässt Farben entlang des Farbrades »rotieren«." #: C/adjust-color.page:38(title) msgid "Contrast" msgstr "Kontrast" #: C/adjust-color.page:39(p) msgid "" "This adjustment adjusts the contrast ratio, that is, the ratio of difference " "between dark and light pixels. Sliding to the left decreases contrast, while " "sliding to the right will increase contrast." msgstr "" "Diese Einstellung passt das Kontrastverhältnis an, also den Unterschied " "zwischen den hellen und den dunklen Bildpunkten. Verschieben nach links " "verringert den Kontrast, während Verschieben nach rechts den Kontrast erhöht." #: C/adjust-color.page:45(title) msgid "Temp" msgstr "Temp" #: C/adjust-color.page:46(p) msgid "This adjust changes the color temperature, measured in degrees Kelvin." msgstr "Diese Einstellung ändert die Farbtemperatur, gemessen in Kelvin." #: C/adjust-color.page:50(title) msgid "Tint" msgstr "Farbton" #: C/adjust-color.page:51(p) msgid "This adjustment allows you to tinge the photo with a color." msgstr "" "Diese Einstellung ermöglicht Ihnen die Tönung Ihrer Fotos mit einer Farbe." #: C/23hq.page:8(desc) msgid "Upload photos to 23hq" msgstr "Fotos zu 23hq übertragen" #: C/23hq.page:11(title) msgid "23hq" msgstr "23hq" #: C/23hq.page:15(p) msgid "" "To upload photos to 23hq you will need a 23hq account, as well as internet " "access. Also, the 23hq extension must be " "installed and enabled." msgstr "" "Um Fotos zu 23hq hochzuladen, benötigen Sie ein 23hq-Konto sowie einen " "aktiven Internetzugang. Außerdem muss die 23hq-Erweiterung installiert und aktiviert sein." #. Put one translator per line, in the form of NAME , YEAR1, YEAR2 #: C/index.page:0(None) msgid "translator-credits" msgstr "" "Mario Blättermann , 2010\n" "Wolfgang Stöggl , 2010" f-spot-0.8.2/help/de/enhancements.page0000644000175000017500000000251711503407430020071 0ustar00rubenruben00000000000000 Einfache Verbesserungen für Ihre Fotos Verbesserungen

Im Wesentlichen unterstützt F-Spot derzeit zwei Verbesserungsmöglichkeiten: die Entfernung roter Augen und die automatische Farbanpassung.

So entfernen Sie rote Augen:

Wählen Sie mittels Doppelklick das Foto aus, welches Sie mit dem Rote-Augen-Entfernungswerkzeug bearbeiten wollen.

Klicken Sie auf Rote-Augen-Reduzierung in der Bearbeitungsleiste.

Wählen Sie den Bereich aus, in dem Sie rote Augen entfernen wollen. Falls der Bereich viele rote Bereiche enthält, müssen Sie möglicherweise jedes Auge einzeln auswählen.

Klicken Sie auf Korrigieren!.

So verbessern Sie automatisch die Farben eines Fotos:

Wählen Sie mittels Doppelklick das Foto aus, das Sie verbessern wollen.

Klicken Sie auf Automatischer Farbabgleich.

f-spot-0.8.2/help/de/import-photos.page0000644000175000017500000000220111503407430020233 0ustar00rubenruben00000000000000 Importieren zu verwaltender Fotos Importieren von Fotos

Als erstes werden Sie vermutlich Fotos importieren wollen.

So importieren Sie Fotos:

Wählen Sie FotoImportieren …. Wahlweise können Sie auch auf den Import-Knopf klicken.

Wählen Sie eine Quelle für den Import aus, wie ein Gerät oder einen Ordner.

F-Spot kann eine gewisse Zeit brauchen, um die Dateien zu indizieren. Wenn die Indizierung abgeschlossen ist, werden Ihnen die Fotos präsentiert. Nun können Sie Markierungen zu den Fotos hinzufügen. Dies ist jedoch später auch noch möglich.

Wenn Sie bereit zum Importieren der Fotos sind, klicken Sie auf Importieren.

f-spot-0.8.2/help/de/index.page0000644000175000017500000000154011503407430016523 0ustar00rubenruben00000000000000 F-Spot Fotoverwaltung F-Spot Fotoverwaltung F-Spot Fotoverwaltung
Grundlegende Funktionen
Suchen
Fotobearbeitung
Freigeben
Erweiterte Optionen
f-spot-0.8.2/help/de/date-search.page0000644000175000017500000000271511503407430017601 0ustar00rubenruben00000000000000 Durchsuchen von Fotos anhand des Datums Suchen nach Datum

So suchen Sie anhand des Datums:

Wählen Sie SuchenNach DatumDatumsbereich einstellen ….

Wählen Sie einen Zeitabschnitt, aus dem Sie Fotos betrachten wollen. Wählen Sie hierzu einen gesetzten Zeitabschnitt aus oder verwenden Sie Datumsangaben.

Klicken Sie auf OK.

Alternativ können Sie die Zeitlinie verwenden. So verwenden Sie die Zeitlinie:

Stellen Sie sicher, dass die Zeitlinie aktiviert ist. Wählen Sie AnsichtKomponenten und überprüfen Sie, ob das Ankreuzfeld Zeitlinie aktiviert ist.

Klicken Sie in der Zeitlinie auf den Balken des Zeitabschnitts, den Sie betrachten wollen.

So beenden Sie die Suche nach Datum:

Wählen Sie SuchenNach DatumDatumsspanne zurücksetzen.

f-spot-0.8.2/help/de/adjust-color.page0000644000175000017500000000342511503407430020026 0ustar00rubenruben00000000000000 Anpassen der Farben eines Fotos Farbe einstellen

Von den Bearbeitungswerkzeugen in F-Spot ist die Farbanpassung wohl das mächtigste Werkzeug. Die Farbanpassung ermöglicht Ihnen Folgendes:

Belichtung

Hierdurch wird die Verlängerung oder Verkürzung der Belichtungszeit simuliert.

Sättigung

Diese Einstellung erlaubt das Anpassen der Farbintensität in einem Bild. Verschieben nach links verringert die Farben bis hin zum Schwarzweißbild, wogegen Verschieben nach rechts die Farben intensiviert.

Helligkeit

Diese Einstellung verstärkt die Helligkeit der Farben. Ein zu hoher Wert lässt Farben »verwaschen« erscheinen, während ein zu geringer Wert das Bild zu dunkel und kontrastarm darstellt.

Farbton

Diese Einstellung lässt Farben entlang des Farbrades »rotieren«.

Kontrast

Diese Einstellung passt das Kontrastverhältnis an, also den Unterschied zwischen den hellen und den dunklen Bildpunkten. Verschieben nach links verringert den Kontrast, während Verschieben nach rechts den Kontrast erhöht.

Temp

Diese Einstellung ändert die Farbtemperatur, gemessen in Kelvin.

Farbton

Diese Einstellung ermöglicht Ihnen die Tönung Ihrer Fotos mit einer Farbe.

f-spot-0.8.2/help/de/upload-to-web.page0000644000175000017500000000075511503407431020103 0ustar00rubenruben00000000000000 Übertragen von Fotos zu verschiedenen Bilderdiensten Übertragen zu Bilderdiensten

F-Spot ermöglicht Ihnen das Hochladen von Fotos zu populären Webdiensten wie PicasaWeb von Google oder Flickr.

f-spot-0.8.2/help/de/file-management.page0000644000175000017500000000263411503407430020452 0ustar00rubenruben00000000000000 Verwalten bereits importierter Dateien Dateiverwaltung

F-Spot ermöglicht Ihnen, den Inhalt des Kataloges zu bearbeiten. Dazu zählt das Entfernen aus dem Katalog oder auch das Löschen von Dateien.

So löschen Sie Dateien aus Ihrem Katalog:

Wählen Sie die Fotos, die Sie aus dem Katalog entfernen wollen.

Klicken Sie mit der rechten Maustaste auf die Fotos und wählen Sie Aus dem Katalog entfernen. Alternativ wählen Sie BearbeitenAus dem Katalog entfernen oder drücken Sie die Entf-Taste auf Ihrer Tastatur.

So löschen Sie Fotos von Ihrem Rechner:

Wählen Sie die Fotos, die Sie löschen wollen.

Klicken Sie mit der rechten Maustaste auf die Fotos und wählen Sie Vom Laufwerk löschen. Alternativ wählen Sie BearbeitenVom Laufwerk löschen oder drücken Sie Umschalttaste+Entf auf Ihrer Tastatur.

f-spot-0.8.2/help/de/tag-search.page0000644000175000017500000000256011503407431017436 0ustar00rubenruben00000000000000 Fotos anhand von Markierungen durchsuchen Nach Markierungen suchen

Es gibt verschiedene Methoden, nach Markierungen zu suchen.

Erste Methode: Doppelklicken Sie auf die Markierungen, nach denen Sie suchen wollen.

Zweite Methode:

Aktivieren Sie das Suchfeld mittels SuchenSuchfeld anzeigen.

Ziehen Sie die Markierungen, nach denen Sie suchen wollen, in das soeben aktivierte Suchfeld.

Um eine Markierung aus Ihrer Suche zu entfernen, klicken Sie mit der rechten Maustaste in das Suchfeld und klicken Sie auf Aus der Suche entfernen.

So schließen Sie eine Markierung von Ihrer Suche aus:

Doppelklicken Sie in der Markierungsleiste auf die Markierung, die Sie ausschließen wollen. Dadurch wird sie zunächst zur Suchleiste hinzugefügt.

Doppelklicken Sie anschließend in der Suchleiste auf die Markierung, die Sie ausschließen wollen.

f-spot-0.8.2/help/de/tag-delete.page0000644000175000017500000000160111503407431017426 0ustar00rubenruben00000000000000 Löschen von Markierungen aus dem System Löschen

Das Löschen von Markierungen entfernt diese vollständig aus dem System, aber lässt die Fotos zurück, denen diese Markierung zugeordnet ist.

So löschen Sie eine Markierung:

Wählen Sie die zu entfernende Markierung in der Markierungsleiste aus.

Klicken Sie auf MarkierungenAusgewählte Markierung löschen. Wahlweise können Sie mit der rechten Maustaste in die Markierungsleiste klicken. Anschließend klicken Sie auf Markierung löschen.

f-spot-0.8.2/help/de/import-roll-search.page0000644000175000017500000000243511503407430021143 0ustar00rubenruben00000000000000 Suchen anhand des Importdatums Suchen anhand von importierten Rollen

Importierte Rollen sind »Stapel« von importierten Fotos. Unabhängig vom eigentlichen Aufnahmedatum des Bildes ist hier der Zeitstempel des Imports der Fotos entscheidend.

So suchen Sie nach der neuesten importierten Rolle:

Wählen Sie SuchenNach ImportenLetzter Import.

So wählen Sie einen früheren Import:

Wählen Sie SuchenNach ImportenImporte auswählen.

Wählen Sie einen zu durchsuchenden Import aus oder wählen Sie mit zwischen einen Datumsbereich aus, in welchem die Suche ausgeführt werden soll.

Um die Suche nach Importen zu beenden, wählen Sie SuchenNach ImportenImportfilter zurücksetzen.

f-spot-0.8.2/help/de/cd.page0000644000175000017500000000045511503407430016006 0ustar00rubenruben00000000000000 Fotos auf eine CD brennen CD-Export f-spot-0.8.2/help/de/smugmug.page0000644000175000017500000000101111503407431017072 0ustar00rubenruben00000000000000 Fotos zu SmugMug übertragen SmugMug

Um Fotos zu SmugMug hochzuladen, benötigen Sie ein SmugMug-Konto sowie einen aktiven Internetzugang. Außerdem muss die SmugMug-Erweiterung installiert und aktiviert sein.

f-spot-0.8.2/help/de/flickr.page0000644000175000017500000000100311503407430016660 0ustar00rubenruben00000000000000 Fotos zu Flickr übertragen Flickr

Um Fotos zu Flickr hochzuladen, benötigen Sie ein Flickr-Konto sowie einen aktiven Internetzugang. Außerdem muss die Flickr-Erweiterung installiert und aktiviert sein.

f-spot-0.8.2/help/de/colors.page0000644000175000017500000000153211503407430016716 0ustar00rubenruben00000000000000 Bearbeiten der Farben Ihrer Fotos Bearbeiten von Farben

F-Spot unterstützt verschiedene Modi der Farbanpassung.

Entsättigen

Dieser Modus entfernt die Farben, wodurch ein farbiges Bild in ein Schwarzweißbild umgewandelt wird.

Sepiafarben

Dieser Modus simuliert ein Foto, das mit Sepia-Tönung erstellt wurde.

Automatischer Farbabgleich

Dieser Modus gleicht die Farben automatisch mit einem gesetzten Profil ab.

f-spot-0.8.2/help/de/versioning.page0000644000175000017500000000176011503407431017604 0ustar00rubenruben00000000000000 Verschiedene Versionen Ihrer Fotos bewahren Versionierung

F-Spot ermöglicht es Ihnen, verschiedene Versionen Ihrer Bilder zu bewahren. Dies ist insbesondere beim Bearbeiten von Fotos nützlich, da Sie auf diese Weise schnell die Unterschiede zwischen der bearbeiteten Version und dem Original erkennen können.

So wechseln Sie zwischen verschiedenen Versionen bei der Bearbeitung:

Doppelklicken Sie auf das Foto, das Sie bearbeiten wollen.

In der Seitenleiste finden Sie ein Auswahlfeld mit der Beschriftung Version:. Um eine anzuzeigende Version auszuwählen, wählen Sie sie in der Auswahlliste aus.

f-spot-0.8.2/help/de/tag-creation.page0000644000175000017500000000522011503407431017771 0ustar00rubenruben00000000000000 Erstellen von Markierungen, die Fotos zugeordnet werden können Erstellen

Um überhaupt Markierungen benutzen zu können, müssen Sie zunächst eine Reihe von Markierungen erstellen. Es gibt drei grundlegende Methoden zum Erstellen von Markierungen.

Erste Methode:

Wählen Sie MarkierungenNeue Markierung erstellen ….

Wählen Sie eine übergeordnete Markierung, unter der die neue Markierung eingeordnet werden soll, wie beispielsweise »Personen« oder »Ereignisse«. Falls Sie eine neue Markierung ohne übergeordnete Markierung erstellen wollen, wählen Sie (Keine).

Benennen Sie die Markierung.

Klicken Sie auf Erstellen.

Zweite Methode:

Klicken Sie mit der rechten Maustaste in die Markierungsleiste und wählen Sie Neue Markierung erstellen …

Wählen Sie eine übergeordnete Markierung, unter der die neue Markierung eingeordnet werden soll, wie beispielsweise »Personen« oder »Ereignisse«. Falls Sie eine neue Markierung ohne übergeordnete Markierung erstellen wollen, wählen Sie (Keine).

Benennen Sie die Markierung.

Klicken Sie auf Erstellen.

Die dritte Methode hat den Vorteil, dass die neue Markierung auch zu den gewählten Fotos hinzugefügt wird. Gehen Sie folgendermaßen vor:

Wählen Sie die Fotos aus, denen Sie die neue Markierung zuordnen wollen.

Klicken Sie mit der rechten Maustaste auf die Fotos und wählen Sie Markierung hinzufügenNeue Markierung erstellen ….

Wählen Sie eine übergeordnete Markierung, unter der die neue Markierung eingeordnet werden soll, wie beispielsweise »Personen« oder »Ereignisse«. Falls Sie eine neue Markierung ohne übergeordnete Markierung erstellen wollen, wählen Sie (Keine).

Benennen Sie die Markierung.

Klicken Sie auf Erstellen.

f-spot-0.8.2/help/de/tag-attach.page0000644000175000017500000000251611503407431017436 0ustar00rubenruben00000000000000 Zuordnen von Markierungen zu Fotos Zuordnen

Das Hinzufügen von erstellten Markierungen erleichtert das Durchsuchen Ihrer Fotos. Wie beim Erstellen von Markierungen gibt es mehrere Methoden, diese Markierungen zu Fotos hinzuzufügen.

Erste Methode:

Wählen Sie Fotos aus, denen Sie eine Markierung zuordnen wollen.

Wählen Sie in der Markierungsleiste eine Markierung aus, die Sie zu den gewählten Fotos hinzufügen wollen.

Klicken Sie auf MarkierungenMarkierung zur Auswahl hinzufügen oder drücken Sie Strg+T.

Zweite Methode:

Wählen Sie Fotos aus, denen Sie eine Markierung zuordnen wollen.

Klicken Sie mit der rechten Maustaste auf die Fotos.

Wählen Sie Markierung hinzufügen und wählen Sie die Markierung aus, die Sie hinzufügen wollen.

f-spot-0.8.2/help/de/ratings.page0000644000175000017500000000223211503407431017063 0ustar00rubenruben00000000000000 Bewerten Sie Ihre Fotos mit einem bis fünf Sternen Bewerten Ihrer Fotos

F-Spot ermöglicht Ihnen die Bewertung Ihrer Fotos mit einem bis fünf Sternen. Es gibt zwei Möglichkeiten, Fotos zu bewerten.

Erste Methode:

Wählen Sie mittels Doppelklick das Foto aus, das Sie bewerten wollen.

In der unteren rechten Ecke sehen Sie fünf Punkte, die sich auf die zu vergebende Bewertung beziehen. Um beispielsweise einen Stern zu vergeben, klicken Sie auf den ersten Punkt.

Zweite Methode:

Wählen Sie das/die Foto(s) zur Bewertung aus.

Klicken Sie mit der rechten Maustaste auf das oder die zu bewertenden Foto(s) und wählen Sie eine Bewertung unten im Kontextmenü aus, indem Sie auf den entsprechenden Punkt klicken.

f-spot-0.8.2/help/de/rate-search.page0000644000175000017500000000171011503407431017612 0ustar00rubenruben00000000000000 Suchen nach Fotos anhand von Bewertungssternen Suche nach Bewertung

So suchen Sie nach Fotos anhand von Bewertungssternen:

Wählen Sie SuchenNach BewertungBewertungsfilter setzen.

Wählen Sie den Bereich der Bewertungen der zu betrachtenden Fotos.

Klicken Sie auf OK.

So halten Sie die Suche nach Bewertungssternen an:

Wählen Sie SuchenNach BewertungBewertungsfilter setzen.

f-spot-0.8.2/help/de/tags.page0000644000175000017500000000142711503407431016357 0ustar00rubenruben00000000000000 Eine kurze Einführung in die Möglichkeiten der Markierung mit F-Spot Markierungen

Wie von anderen Fotoverwaltungen bereits bekannt, können Sie auch in F-Spot Ihre Fotos mit Markierungen versehen, wodurch inhaltsbasiertes Durchsuchen Ihrer Fotos erleichtert wird. Sie können Personen, Ereignisse, Orte, Vorlieben als Markierungen nutzen oder auch Ihre eigenen Markierungsgruppen erstellen.

Arbeiten mit Markierungen
f-spot-0.8.2/help/fr/0000777000175000017500000000000011503407433014604 5ustar00rubenruben00000000000000f-spot-0.8.2/help/fr/facebook.page0000644000175000017500000000255311503407432017213 0ustar00rubenruben00000000000000 Envoyer des photos vers FaceBook Facebook

Pour envoyer des photos vers Facebook, vous avez besoin d'un compte Facebook, ainsi que d'un acceÌ€s aÌ€ internet. L'extension Facebook doit aussi eÌ‚tre installeÌe et activeÌe.

Pour poster les photos sélectionnées vers Facebook :

Choisissez dans le menu PhotoExporter versFacebook.

Cliquez sur Connexion. Une fenêtre du navigateur s'ouvre. Connectez vous à Facebook avec vos identifiants et cliquez sur « Autoriser » pour permettre à F-Spot d'accéder à votre profil Facebook.

Choisissez, soit de créer un nouvel album, soit d'ajouter à un album existant. Si vous créez un nouvel album, fournissez les informations adéquates.

Modifiez les légendes de chaque photo si vous le souhaitez.

Lorsque vous avez fini, cliquez sur Ajouter.

f-spot-0.8.2/help/fr/folder.page0000644000175000017500000000270711503407432016716 0ustar00rubenruben00000000000000 Envoyer des photos dans un dossier Exportation dans un dossier

F-Spot vous permet d'exporter vers un dossier. Cependant, pour pouvoir le faire, vous devez avoir installé et activé l'extension d'exportation de dossier.

Pour exporter les photos sélectionnées vers un dossier :

Choisissez dans le menu PhotoExporter versDossier....

Sélectionnez un dossier.

Donnez un nom et une description à la galerie.

Sélectionnez une méthode d'exportation. Créer une galerie Web indépendante crée un dossier contenant les fichiers prêts à être envoyés vers un serveur Web pour présenter les photos dans une galerie. Enregistrer uniquement les fichiers déplace seulement les photos vers le dossier sélectionné. Créer la galerie avec « Original » crée un dossier avec un contenu adapté aux galeries Original Photo Gallery.

Cliquez sur Exporter.

f-spot-0.8.2/help/fr/introduction.page0000644000175000017500000000125311503407432020157 0ustar00rubenruben00000000000000 Une brève introduction à F-Spot Introduction

F-Spot est un gestionnaire de photos complet pour le bureau de GNOME permettant d'attribuer des étiquettes, de noter, de dater des photos, de modifier leurs métadonnées et incluant même un petit programme autonome de retouches.

Pour débuter avec F-Spot et obtenir de l'aide, allez consulter les fonctions de base du fichier d'aide.

f-spot-0.8.2/help/fr/tag-remove.page0000644000175000017500000000226111503407432017504 0ustar00rubenruben00000000000000 Enlever les eÌtiquettes des photos Enlèvement

Comme lorsqu'on attribue une étiquette à des photos, il y a deux méthodes pour les enlever.

Première méthode :

Sélectionnez les photos dont vous voulez ôter une étiquette.

Dans le volet Étiquettes, sélectionnez l'étiquette à enlever sur les photos que vous avez préalablement choisies.

Cliquez sur ÉtiquettesEnlever l'étiquette de la sélection.

Deuxième méthode :

Sélectionnez les photos dont vous voulez ôter une étiquette.

Cliquez avec le bouton droit sur les photos.

Sélectionnez Enlever l'étiquette et choisissez celle que vous souhaitez enlever.

f-spot-0.8.2/help/fr/picasa.page0000644000175000017500000000205511503407432016677 0ustar00rubenruben00000000000000 Envoyer des photos vers PicasaWeb de Google Picasa

Pour envoyer des photos vers Picasa, vous avez besoin d'un compte Picasa, ainsi que d'un acceÌ€s aÌ€ internet. L'extension Picasa doit aussi eÌ‚tre installeÌe et activeÌe.

Select the photos you wish to upload.

Click PhotoExport To PicasaWeb....

Add a gallery by clicking Add and supplying a username and password.

j

Select a gallery to export to, or click Add to create a new gallery.

Click Export.

f-spot-0.8.2/help/fr/general-editing.page0000644000175000017500000000364711503407432020505 0ustar00rubenruben00000000000000 Effectuer des modifications simples de vos photos Modifications générales

F-Spot vous permet de faire des modifications générales simples, comme redresser, découper et faire pivoter vos photos.

Il y a trois façons d'effectuer la rotation d'une photo sélectionnée :

Cliquez sur le bouton de rotation approprié, à droite du bouton d'importation.

Sélectionnez l'option appropriée dans le menu Édition.

Utilisez les touches de raccourcis crochets « [ ] » pour faire tourner la photo.

Pour redresser la photo sélectionnée :

Dans le volet Modifier, sélectionnez Redressement.

Sélectionnez un angle de rotation, compris entre -45 et 45 degrés.

Cliquez sur Redressement

Pour découper la photo seÌlectionneÌe :

Cliquez sur le bouton Rogner dans le volet Modifier.

Choisissez une contrainte de format, c'est-à-dire le rapport hauteur-largeur dans laquelle la photo doit s'inscrire, par exemple 4x3, 4x6 et 5x7.

Cliquez puis déplacez le pointeur de la souris pour sélectionner la surface souhaitée à conserver. Cette zone peut ensuite encore être déplacée avec la souris après avoir choisi sa taille.

Après avoir choisi la zone à conserver, cliquez sur Rogner.

f-spot-0.8.2/help/fr/extensions.page0000644000175000017500000000420411503407432017634 0ustar00rubenruben00000000000000 Utilisation des extensions de F-Spot Extensions

F-Spot permet l'ajout d'extensions pour augmenter ses fonctionnalités.

Pour ouvrir le gestionnaire d'extensions, choisissez ÉditionGérer les extensions dans le menu.

Pour installer des extensions :

Ouvrez le gestionnaire d'extensions.

Cliquez sur Installer des greffons.

SeÌlectionnez dans la liste un greffon aÌ€ installer.

Cliquez sur Suivant.

Vérifiez toutes les informations et cliquez de nouveau sur Suivant.

Cliquez sur Ok.

Pour activer des greffons déjà installés :

Ouvrez le gestionnaire d'extensions.

Sélectionnez l'extension que vous voulez activer.

Cliquez sur Activer.

Pour désactiver des greffons installeÌs :

Ouvrez le gestionnaire d'extensions.

SeÌlectionnez l'extension que vous voulez désactiver.

Cliquez sur Désactiver.

Désinstaller des greffons :

Ouvrez le gestionnaire d'extensions.

SeÌlectionnez l'extension que vous voulez désinstaller.

Cliquez sur Désinstaller.

Cliquez sur Suivant.

Cliquez sur Ok.

f-spot-0.8.2/help/fr/23hq.page0000644000175000017500000000077111503407432016217 0ustar00rubenruben00000000000000 Envoyer des photos vers 23hq 23hq

Pour envoyer des photos vers 23hq, vous avez besoin d'un compte 23hq, ainsi que d'un accès à internet. L'extension 23hq doit aussi être installée et activée.

f-spot-0.8.2/help/fr/zooomr.page0000644000175000017500000000077511503407432016773 0ustar00rubenruben00000000000000 Envoyer des photos vers Zooomr Zooomr

Pour envoyer des photos vers Zooomr, vous avez besoin d'un compte ainsi que d'un accès à internet. L'extension Zooomr doit aussi être installée et activée.

f-spot-0.8.2/help/fr/enhancements.page0000644000175000017500000000246211503407432020111 0ustar00rubenruben00000000000000 Améliorations simples de vos photos Améliorations

Pour le moment, F-spot prend en charge deux outils de retouche : la réduction des yeux rouges et l'amélioration automatique des couleurs.

Pour réduire des yeux rouges :

Double-cliquez sur la photo à traiter avec l'outil de réduction des yeux rouges.

Appuyez sur le bouton Réduction des yeux rouges dans le volet d'édition.

Sélectionnez la zone où vous voulez réduire les yeux rouges. Note : si celle-ci comporte de nombreuses zones rouges, il est préférable de sélectionner les yeux un par un.

Cliquez sur Corriger !

Pour améliorer automatiquement les couleurs de la photo :

Double-cliquez sur la photo que vous souhaitez améliorer.

Cliquez sur Couleurs automatiques.

f-spot-0.8.2/help/fr/import-photos.page0000644000175000017500000000224211503407432020261 0ustar00rubenruben00000000000000 Importer des photos à gérer Importation de photos

Il y a de fortes chances pour que la première action que vous souhaitiez faire soit d'importer des photos.

Pour importer des photos :

Sélectionnez PhotoImporter.... Vous pouvez aussi cliquer sur le bouton Importer.

Sélectionnez la source d'importation, comme par exemple un périphérique ou un dossier.

F-Spot peut prendre un certain temps pour indexer les fichiers. Lorsqu'il a terminé, les photos s'affichent. À ce moment, vous pouvez attribuer des étiquettes à toutes les photos, ou remettre cette tâche à plus tard.

Quand vous êtes prêt à terminer l'importation des photos, cliquez sur Importer.

f-spot-0.8.2/help/fr/index.page0000644000175000017500000000157111503407432016550 0ustar00rubenruben00000000000000 Gestionnaire de photos F-Spot Gestionnaire de photos F-Spot Gestionnaire de photos F-Spot
Fonctions de base
Recherche
Modification de photos
Partage
Options avanceÌes
f-spot-0.8.2/help/fr/date-search.page0000644000175000017500000000303411503407432017615 0ustar00rubenruben00000000000000 Recherche de photos par date Recherche par date

Pour effectuer une recherche par date :

Choisissez dans le menu RecherchePar dateDeÌfinir une plage de dates.

Choisissez la période dont vous voulez visionner les photos. Vous pouvez le faire soit en sélectionnant une période donnée, telle qu'une semaine, soit en spécifiant les dates de début et de fin.

Cliquez sur Ok.

Vous pouvez aussi utiliser la frise chronologique. Pour utiliser la frise chronologie :

Assurez-vous que la frise chronologie soit activée dans le menu AffichageComposants et que la case Frise chronologique soit cochée.

Dans la frise chronologie, cliquez sur la barre correspondant à la période que vous souhaitez visionner.

Pour arrêter la recherche par date :

Choisissez dans le menu RecherchePar dateNe plus tenir compte des dates.

f-spot-0.8.2/help/fr/adjust-color.page0000644000175000017500000000363011503407432020045 0ustar00rubenruben00000000000000 Ajustement des couleurs d'une photo Ajustement des couleurs

Parmi les outils de modification disponibles dans F-Spot, l'ajustement des couleurs est assurément le plus puissant. L'éditeur des couleurs permets de modifier :

L'exposition

Ce réglage simule l'allongement ou le raccourcissement de la durée d'exposition.

La saturation

Ce réglage modifie la saturation des couleurs de l'image, c'est-à-dire : déplacer le curseur vers la gauche ternit les couleurs progressivement jusqu'au noir et blanc, tandis que le déplacer vers la droite les ravive jusqu'à la saturation.

La luminositeÌ

Ce réglage accroit la luminosité des couleurs. Trop l'augmenter produit des couleurs « délavées », alors que trop le diminuer rend l'image trop sombre et manquant de contraste.

La coloration

Ce réglage modifie le mélange des couleurs primaires en les faisant « tourner » sur le diagramme des couleurs .

Le contraste

Ce réglage ajuste le contraste, c'est-à-dire le ratio entre le nombre de pixels clairs et foncés. Déplacer le curseur vers la gauche diminue le contraste, alors que le déplacer vers la droite l'augmente.

La température

Ce réglage permet de modifier la température de couleur, mesurée en kelvin.

La nuance

Ce réglage permet de teinter la photo avec une couleur.

f-spot-0.8.2/help/fr/upload-to-web.page0000644000175000017500000000073611503407432020122 0ustar00rubenruben00000000000000 Envoyer des photos vers différents services Web Envoi vers le Web

F-Spot vous permet d'envoyer des photos vers les services Web à la mode, y compris PicasaWeb de Google et Flickr.

f-spot-0.8.2/help/fr/file-management.page0000644000175000017500000000261511503407432020472 0ustar00rubenruben00000000000000 Gérer les fichiers déjà importés Gestion des fichiers

F-Spot vous permet de contrôler le contenu de votre catalogue, c'est-à-dire d'enlever des fichiers du catalogue ou de les supprimer de votre ordinateur.

Pour enlever des fichiers de votre catalogue :

Sélectionnez les photos que vous voulez enlever du catalogue.

D'un clic droit sur les photos, faites Enlever du catalogue. Vous pouvez aussi choisir ÉditionEnlever du catalogue dans le menu, ou appuyer sur la touche Suppr de votre clavier.

Pour supprimer des photos de votre ordinateur :

Sélectionnez les photos que vous voulez supprimer.

D'un clic droit sur les photos, faites Supprimer du lecteur. Vous pouvez aussi choisir ÉditionSupprimer du lecteur dans le menu, ou utiliser le raccourci Maj + Suppr de votre clavier.

f-spot-0.8.2/help/fr/tag-search.page0000644000175000017500000000255511503407432017462 0ustar00rubenruben00000000000000 Recherche de photos par leurs étiquettes Recherche par étiquette

Il y a plusieurs méthodes de recherche par étiquettes

Première méthode : double-cliquez sur les étiquettes que vous voulez rechercher.

Deuxième méthode :

Activez la barre de recherche dans le menu RechercheAfficher la barre de recherche

Déposez les étiquettes que vous voulez rechercher dans la barre de recherche que vous venez d'activer.

Pour enlever une étiquette de la recherche, faites un clic droit sur l'étiquette dans la barre de recherche et choisissez Enlever de la recherche.

Pour exclure une étiquette de votre recherche :

Dans le volet Étiquettes, double-cliquez sur l'étiquette que vous souhaitez exclure pour l'ajouter à la barre de recherche.

Dans la barre de recherche, double-cliquez sur l'étiquette que vous souhaitez exclure.

f-spot-0.8.2/help/fr/tag-delete.page0000644000175000017500000000152511503407432017453 0ustar00rubenruben00000000000000 Suppression d'étiquettes du système Suppression

Supprimer des étiquettes les supprime totalement du système, mais les photos auxquelles elles sont attribuées restent présentes.

Pour supprimer une étiquette :

Sélectionnez l'étiquette que vous souhaitez supprimer dans le volet Étiquettes.

Cliquez sur ÉtiquettesSupprimer l'étiquette sélectionnée, ou d'un clic droit sur l'étiquette dans le volet, sélectionnez Supprimer l'étiquette.

f-spot-0.8.2/help/fr/import-roll-search.page0000644000175000017500000000271211503407432021162 0ustar00rubenruben00000000000000 Recherche par date d'importation Recherche par série d'importation

Les séries d'importation sont des « lots » de photos importées. Quelle que soit la date à laquelle la photo a été prise, l'horodatage de la série est défini par sa date d'importation.

Pour rechercher la dernière série d'importation :

Choisissez dans le menu RecherchePar série d'importationDernière série importée.

Pour sélectionner une série d'importation précédente :

Choisissez dans le menu RecherchePar série d'importationSélectionner des séries d'importation.

Choisissez une série d'importation où lancer la recherche, ou bien définissez une plage en sélectionnant Entre et les dates que vous souhaitez.

Pour arrêter la recherche par série d'importation, sélectionnez dans le menu RecherchePar série d'importationEffacer le filtre des séries.

f-spot-0.8.2/help/fr/fr.po0000644000175000017500000013413011503407433015551 0ustar00rubenruben00000000000000# French translation of f-spot documentation. # Copyright (C) 2007-2008 Free Software Foundation, Inc. # This file is distributed under the same license as the f-spot package. # # # Stephane Delcroix , 2007. # Claude Paroz , 2007. # Bruno Brouard , 2008. # Laurent Coudeur , 2010. # Alain Lojewski , 2010 # msgid "" msgstr "" "Project-Id-Version: f-spot doc fr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-13 19:33+0000\n" "PO-Revision-Date: 2010-12-15 10:45+0000\n" "Last-Translator: Laurent Coudeur \n" "Language-Team: GNOME French Team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n>1;\n" #: C/zooomr.page:8(desc) msgid "Upload photos to Zooomr" msgstr "Envoyer des photos vers Zooomr" #: C/zooomr.page:11(title) msgid "Zooomr" msgstr "Zooomr" #: C/zooomr.page:15(p) msgid "" "To upload photos to Zooomr you will need a Zooomr account, as well as " "internet access. Also, the Zooomr extension " "must be installed and enabled." msgstr "" "Pour envoyer des photos vers Zooomr, vous avez besoin d'un compte ainsi que " "d'un accès à internet. L'extension Zooomr " "doit aussi être installée et activée." #: C/versioning.page:8(desc) msgid "Track different versions of your photos" msgstr "Suivi des différentes versions de vos photos" #: C/versioning.page:11(title) msgid "Versioning" msgstr "Gestion des versions" #: C/versioning.page:14(p) msgid "" "F-Spot allows you to keep multiple versions of your photos. This " "is especially useful when editing photos, as you can quickly see the " "difference between the edited version and the original." msgstr "" "F-Spot permet de conserver plusieurs versions de vos photos. Ceci " "est particulièrement utile lorsque vous modifiez des photos car vous pouvez " "ainsi rapidement voir la différence entre la version modifiée et l'original." #: C/versioning.page:17(p) msgid "To switch between versions while editing:" msgstr "Pour passer d'une version à une autre pendant les modifications :" #: C/versioning.page:20(p) msgid "Double-click the photo you wish to edit." msgstr "Double-cliquez sur la photo que vous souhaitez modifier." #: C/versioning.page:23(p) msgid "" "In the sidebar, you will see a drop-down box labeled Version:. To " "select a version to view, select it in the drop-down box." msgstr "" "Dans la barre latérale, vous voyez la liste déroulante Version. " "Pour sélectionner une version à afficher, choisissez-la dans la liste " "déroulante." #: C/upload-to-web.page:8(desc) msgid "Upload photos to various web services" msgstr "Envoyer des photos vers différents services Web" #: C/upload-to-web.page:11(title) msgid "Upload to Web" msgstr "Envoi vers le Web" #: C/upload-to-web.page:14(p) msgid "" "F-Spot allows you to upload photos to popular web services, " "including Google's PicasaWeb and Flickr." msgstr "" "F-Spot vous permet d'envoyer des photos vers les services Web à " "la mode, y compris PicasaWeb de Google et Flickr." #: C/tags.page:6(desc) msgid "A brief introduction to the tagging capabilities of F-Spot" msgstr "Une brève introduction aux possibilités d'étiquetage de F-Spot" #: C/tags.page:9(title) msgid "Tags" msgstr "Les étiquettes" #: C/tags.page:12(p) msgid "" "Like certain other photo managers, F-Spot lets you tag your " "photos, allowing for quick, easy content-based searching of your photos. You " "can tag people, events, places, favorite things, or even make your own " "groups of tags." msgstr "" "Comme certains autres gestionnaires de photos, F-Spot vous permet " "d'étiqueter vos photos, ce qui autorise ensuite une recherche rapide " "simplement basée sur le contenu de vos photos. Vous pouvez étiqueter des " "personnes, des évènements, des endroits, des sujets favoris, ou même créer " "vos groupes d'étiquettes personnalisées." #: C/tags.page:17(title) msgid "Working with Tags" msgstr "Gestion des étiquettes" #: C/tag-search.page:8(desc) msgid "Search photos using tags" msgstr "Recherche de photos par leurs étiquettes" #: C/tag-search.page:11(title) msgid "Search by Tag" msgstr "Recherche par étiquette" #: C/tag-search.page:15(p) msgid "There are several methods to search by tags." msgstr "Il y a plusieurs méthodes de recherche par étiquettes" #: C/tag-search.page:16(p) msgid "Method One: Double-click the tags you wish to search for." msgstr "" "Première méthode : double-cliquez sur les étiquettes que vous voulez " "rechercher." #: C/tag-search.page:17(p) C/tag-remove.page:28(p) C/tag-creation.page:32(p) #: C/tag-attach.page:29(p) C/ratings.page:25(p) msgid "Method Two:" msgstr "Deuxième méthode :" #: C/tag-search.page:20(p) msgid "" "Enable the Find bar by clicking FindShow Find bar." msgstr "" "Activez la barre de recherche dans le menu RechercheAfficher la barre de recherche" #: C/tag-search.page:24(p) msgid "Drag the tags you wish to search for into the newly-enabled Find bar." msgstr "" "Déposez les étiquettes que vous voulez rechercher dans la barre de recherche " "que vous venez d'activer." #: C/tag-search.page:27(p) msgid "" "To remove a tag from your search, right-click the tag in the Find bar and " "click Remove From Search." msgstr "" "Pour enlever une étiquette de la recherche, faites un clic droit sur " "l'étiquette dans la barre de recherche et choisissez Enlever de la " "recherche." #: C/tag-search.page:30(p) msgid "To exclude a tag from your search:" msgstr "Pour exclure une étiquette de votre recherche :" #: C/tag-search.page:33(p) msgid "" "In the tag pane, double-click the tag you wish to exclude. This will add it " "to the Find bar." msgstr "" "Dans le volet Étiquettes, double-cliquez sur l'étiquette que vous souhaitez " "exclure pour l'ajouter à la barre de recherche." #: C/tag-search.page:37(p) msgid "In the Find bar, double-click the tag you wish to exclude." msgstr "" "Dans la barre de recherche, double-cliquez sur l'étiquette que vous " "souhaitez exclure." #: C/tag-remove.page:6(desc) msgid "Removing tags from photos" msgstr "Enlever les eÌtiquettes des photos" #: C/tag-remove.page:9(title) msgid "Removing" msgstr "Enlèvement" #: C/tag-remove.page:12(p) msgid "" "As with attaching tags, there are two main methods of removing tags from " "photos." msgstr "" "Comme lorsqu'on attribue une étiquette à des photos, il y a deux méthodes " "pour les enlever." #: C/tag-remove.page:14(p) C/tag-creation.page:14(p) C/tag-attach.page:15(p) #: C/ratings.page:14(p) msgid "Method One:" msgstr "Première méthode :" #: C/tag-remove.page:17(p) C/tag-remove.page:31(p) msgid "Select photos from which to remove a tag." msgstr "Sélectionnez les photos dont vous voulez ôter une étiquette." #: C/tag-remove.page:20(p) msgid "" "In the tag pane, select a tag to remove from the photos you have selected." msgstr "" "Dans le volet Étiquettes, sélectionnez l'étiquette à enlever sur les photos " "que vous avez préalablement choisies." #: C/tag-remove.page:24(p) msgid "" "Click TagsRemove Tag From Selection." msgstr "" "Cliquez sur ÉtiquettesEnlever l'étiquette de la " "sélection." #: C/tag-remove.page:34(p) C/tag-attach.page:35(p) msgid "Right click the photos." msgstr "Cliquez avec le bouton droit sur les photos." #: C/tag-remove.page:37(p) msgid "Select Remove Tag and select the tag you wish to remove." msgstr "" "Sélectionnez Enlever l'étiquette et choisissez celle que vous " "souhaitez enlever." #: C/tag-delete.page:6(desc) msgid "Deleting tags from the system" msgstr "Suppression d'étiquettes du système" #: C/tag-delete.page:9(title) msgid "Deleting" msgstr "Suppression" #: C/tag-delete.page:12(p) msgid "" "Deleting tags removes them entirely from your system, but leaves behind any " "photos to which that tag is attached." msgstr "" "Supprimer des étiquettes les supprime totalement du système, mais les photos " "auxquelles elles sont attribuées restent présentes." #: C/tag-delete.page:14(p) msgid "To delete a tag:" msgstr "Pour supprimer une étiquette :" #: C/tag-delete.page:17(p) msgid "Select the tag you wish to delete from within the tag pane." msgstr "" "Sélectionnez l'étiquette que vous souhaitez supprimer dans le volet " "Étiquettes." #: C/tag-delete.page:20(p) msgid "" "Click TagsDelete Selected Tag. " "Alternatively, right click the tag within the pane, and click Delete " "Tag." msgstr "" "Cliquez sur ÉtiquettesSupprimer l'étiquette " "sélectionnée, ou d'un clic droit sur l'étiquette dans le " "volet, sélectionnez Supprimer l'étiquette." #: C/tag-creation.page:6(desc) msgid "Creating tags to be attached to photos" msgstr "Création d'étiquettes à attribuer aux photos" #: C/tag-creation.page:9(title) msgid "Creating" msgstr "CreÌation" #: C/tag-creation.page:12(p) msgid "" "In order to use tags, you need to first create a set of tags which you wish " "to use. There are three main methods to create tags." msgstr "" "Pour pouvoir utiliser des étiquettes, vous devez d'abord en créer un " "assortiment qui vous convienne. Il y a trois méthodes principales pour créer " "des étiquettes." #: C/tag-creation.page:17(p) msgid "Select TagsCreate New Tag...." msgstr "" "Choisissez dans le menu ÉtiquettesCréer une nouvelle " "étiquette." #: C/tag-creation.page:21(p) C/tag-creation.page:39(p) #: C/tag-creation.page:61(p) msgid "" "Select a parent tag for the new tag to appear under, such as people or " "events. If you wish to create a new tag without a parent, select (None)" "." msgstr "" "Choisissez une étiquette parente sous laquelle apparaîtra la nouvelle " "éiquette, comme Personnes ou Évènements. Si vous souhaitez créer une " "nouvelle étiquette non parente, choisissez (aucun)." #: C/tag-creation.page:26(p) C/tag-creation.page:44(p) #: C/tag-creation.page:66(p) msgid "Name the tag." msgstr "Nommez l'étiquette." #: C/tag-creation.page:29(p) C/tag-creation.page:47(p) #: C/tag-creation.page:69(p) msgid "Click Create" msgstr "Cliquez sur Créer" #: C/tag-creation.page:35(p) msgid "In the tags page, right click, and select Create New Tag..." msgstr "" "Dans le volet Étiquettes, faites un clic droit, et sélectionnez Créer " "une nouvelle étiquette..." #: C/tag-creation.page:50(p) msgid "" "Method three has the advantage of also attaching the new tag to the photos selected. To do this:" msgstr "" "La troisième méthode permet en plus d'attribuer la nouvelle étiquette aux photos sélectionnées. Procédez comme suit :" #: C/tag-creation.page:54(p) msgid "Select the photos to which you wish to attach the new tag." msgstr "" "SeÌlectionnez les photos auxquelles vous souhaitez attribuer la nouvelle " "étiquette." #: C/tag-creation.page:57(p) msgid "" "Right-click on the photos, and select Attach TagCreate New Tag...." msgstr "" "D'un clic droit sur les photos, sélectionnez Attribuer " "l'étiquetteCréer une nouvelle étiquette...." #: C/tag-attach.page:6(desc) msgid "Attaching tags to photos" msgstr "Attribution d'étiquettes aux photos" #: C/tag-attach.page:9(title) msgid "Attaching" msgstr "Attribution" #: C/tag-attach.page:12(p) msgid "" "By attaching tags you have created you " "make it easier to search through your photos. As with creating tags, there " "is more than one method of attaching tags to photos." msgstr "" "En attribuant des étiquettes que vous avez créer, vous simplifiez vos recherche parmi vos photos. Comme pour " "la création d'étiquettes, il y a plusieurs méthodes pour les attribuer aux " "photos." #: C/tag-attach.page:18(p) C/tag-attach.page:32(p) msgid "Select photos to which to attach a tag." msgstr "" "SeÌlectionnez les photos auxquelles vous souhaitez attribuer une eÌtiquette." #: C/tag-attach.page:21(p) msgid "" "In the tag pane, select a tag to attach to the photos you have selected." msgstr "" "Dans le volet Étiquettes, choisissez une eÌtiquette aÌ€ attribuer aux photos " "seÌlectionneÌes." #: C/tag-attach.page:25(p) msgid "" "Click TagsAttach Tag to Selection. " "Alternatively, press Ctrl+T." msgstr "" "Cliquez sur ÉtiquettesAttribuer l'étiquette à la " "sélection. Alternativement, pressez Ctrl+T." #: C/tag-attach.page:38(p) msgid "Select Attach Tag and select the tag you wish to attach." msgstr "" "Choisissez Attribuer l'eÌtiquette à la sélection et seÌlectionnez " "l'eÌtiquette que vous souhaitez attribuer." #: C/smugmug.page:8(desc) msgid "Upload photos to SmugMug" msgstr "Envoyer des photos vers SmugMug" #: C/smugmug.page:11(title) msgid "SmugMug" msgstr "SmugMug" #: C/smugmug.page:15(p) msgid "" "To upload photos to SmugMug you will need a SmugMug account, as well as " "internet access. Also, the SmugMug extension must be installed and enabled." msgstr "" "Pour envoyer des photos vers SmugMug, vous avez besoin d'un compte SmugMug, " "ainsi que d'un acceÌ€s aÌ€ internet. L'extension SmugMug doit aussi eÌ‚tre installeÌe et activeÌe." #: C/ratings.page:6(desc) msgid "Rate your photos from one to five stars" msgstr "Notez vos photos de une à cinq étoiles." #: C/ratings.page:9(title) msgid "Rating your photos" msgstr "Notation de vos photos" #: C/ratings.page:12(p) msgid "" "F-Spot allows you to rate your photos from one to five stars. " "There are two ways to rate photos." msgstr "" "F-Spot vous permet de noter vos photos de une à cinq étoiles. Il " "y a deux façons de noter des photos." #: C/ratings.page:17(p) msgid "By double-clicking, select the photo you wish to rate." msgstr "Double-cliquez sur la photo que vous souhaitez noter." #: C/ratings.page:20(p) msgid "" "In the lower-right corner, you will see five dots, corresponding to the " "rating you wish to give; to give a rating of one star, for example, click " "the first dot." msgstr "" "Dans le coin inférieur droite, vous voyez cinq points vous permettant " "d'attribuer une note correspondant à votre estimation ; pour donner une note " "d'une étoile, par exemple, cliquez sur le premier point." #: C/ratings.page:28(p) msgid "Select the photo(s) you wish to rate." msgstr "Sélectionnez la ou les photos que vous souhaitez noter." #: C/ratings.page:31(p) msgid "" "Right-click the photo(s) you wish to rate, and select a rating at the bottom " "of the right-click menu by clicking the corresponding dot." msgstr "" "D'un clic droit sur la ou les photos que vous souhaitez noter, choisissez " "une note en bas du menu contextuel en sélectionnant le point correspondant." #: C/rate-search.page:8(desc) msgid "Search photos by star rating" msgstr "Recherche de photos en fonction de leur notation" #: C/rate-search.page:11(title) msgid "Search by Rating" msgstr "Recherche par note" #: C/rate-search.page:15(p) msgid "To search by rating:" msgstr "Pour effectuer une recherche par note :" #: C/rate-search.page:18(p) msgid "" "Select FindBy RatingSet Rating Filter...." msgstr "" "Allez dans le menu RecherchePar noteDéfinir une plage de notes...." #: C/rate-search.page:22(p) msgid "Select the rating range which you wish to view." msgstr "Sélectionnez la plage de notes que vous souhaitez afficher." #: C/rate-search.page:25(p) C/extensions.page:39(p) C/extensions.page:82(p) #: C/date-search.page:27(p) msgid "Click Ok." msgstr "Cliquez sur Ok." #: C/rate-search.page:28(p) msgid "To stop searching by rating:" msgstr "Pour arrêter la recherche par note :" # Note: Source text for "clear rating filter" is incorrect in source "Set rating filter" #: C/rate-search.page:31(p) msgid "" "Select FindBy RatingSet Rating Filter." msgstr "" "Choisissez dans le menu RecherchePar noteEffacer le filtre des notations." #: C/picasa.page:8(desc) msgid "Upload photos to Google's PicasaWeb" msgstr "Envoyer des photos vers PicasaWeb de Google" #: C/picasa.page:11(title) msgid "Picasa" msgstr "Picasa" #: C/picasa.page:15(p) msgid "" "To upload photos to Picasa you will need a Picasa account, as well as " "internet access. Also, the PicasaWeb extension must be installed and enabled." msgstr "" "Pour envoyer des photos vers Picasa, vous avez besoin d'un compte Picasa, " "ainsi que d'un acceÌ€s aÌ€ internet. L'extension Picasa doit aussi eÌ‚tre installeÌe et activeÌe." #: C/picasa.page:21(p) msgid "Select the photos you wish to upload." msgstr "Sélectionnez les photos que vous souhaitez envoyer." #: C/picasa.page:24(p) msgid "" "Click PhotoExport ToPicasaWeb...." msgstr "" "Cliquez dans le menu PhotoExporter versPicasaWeb." #: C/picasa.page:28(p) msgid "" "Add a gallery by clicking Add and supplying a username and " "password." msgstr "" "Cliquez sur Ajouter et saisissez votre nom d'utilisateur et votre " "mot de passe pour ajouter une galerie." #: C/picasa.page:32(p) msgid "" "Select a gallery to export to, or click Add to create a new " "gallery." msgstr "" "Sélectionnez une galerie où exporter, ou cliquez sur Ajouter pour " "créer une nouvelle galerie." #: C/picasa.page:36(p) C/folder.page:39(p) msgid "Click Export." msgstr "Cliquez sur Exporter." #: C/picasa.page:19(steps) msgid "" "j " msgstr "" "j " #: C/introduction.page:6(desc) msgid "A brief introduction to F-Spot" msgstr "Une breÌ€ve introduction à F-Spot" #: C/introduction.page:9(title) msgid "Introduction" msgstr "Introduction" #: C/introduction.page:12(p) msgid "" "F-Spot is a full-featured photo manager for the GNOME Desktop, " "allowing you to tag, rate, and date photos, edit photo metadata, and even " "includes a simple in-program photo editor." msgstr "" "F-Spot est un gestionnaire de photos complet pour le bureau de " "GNOME permettant d'attribuer des étiquettes, de noter, de dater des photos, " "de modifier leurs métadonnées et incluant même un petit programme autonome " "de retouches." #: C/introduction.page:15(p) msgid "" "For help getting started using F-Spot, check out the basic functions of the help file." msgstr "" "Pour débuter avec F-Spot et obtenir de l'aide, allez consulter " "les fonctions de base du fichier " "d'aide." #: C/index.page:7(title) C/index.page:8(title) C/index.page:11(title) msgid "F-Spot photo manager" msgstr "Gestionnaire de photos F-Spot" #: C/index.page:16(title) msgid "Basic Functions" msgstr "Fonctions de base" #: C/index.page:20(title) msgid "Searching" msgstr "Recherche" #: C/index.page:24(title) msgid "Photo Editing" msgstr "Modification de photos" #: C/index.page:28(title) msgid "Sharing" msgstr "Partage" #: C/index.page:32(title) msgid "Advanced Options" msgstr "Options avanceÌes" #: C/import-roll-search.page:8(desc) msgid "Searching by date of import" msgstr "Recherche par date d'importation" #: C/import-roll-search.page:11(title) msgid "Search by Import Roll" msgstr "Recherche par série d'importation" #: C/import-roll-search.page:15(p) msgid "" "Import rolls are \"batches\" of imported photos. Regardless of the date the " "photo was taken, the import roll timestamp is decided when you import photos." msgstr "" "Les séries d'importation sont des « lots » de photos importées. Quelle que " "soit la date à laquelle la photo a été prise, l'horodatage de la série est " "défini par sa date d'importation." #: C/import-roll-search.page:18(p) msgid "To search by latest import roll:" msgstr "Pour rechercher la dernière série d'importation :" #: C/import-roll-search.page:21(p) msgid "" "Select FindBy Import RollLast Import " "Roll." msgstr "" "Choisissez dans le menu RecherchePar série " "d'importationDernière série importée." #: C/import-roll-search.page:25(p) msgid "To select a previous import roll:" msgstr "Pour sélectionner une série d'importation précédente :" #: C/import-roll-search.page:28(p) msgid "" "Select FindBy Import RollSelect Import " "Rolls." msgstr "" "Choisissez dans le menu RecherchePar série " "d'importationSélectionner des séries d'importation." #: C/import-roll-search.page:32(p) msgid "" "Select an import roll to search, or select a range by choosing Between and select the dates you wish to include." msgstr "" "Choisissez une série d'importation où lancer la recherche, ou bien " "définissez une plage en sélectionnant Entre et les dates que vous " "souhaitez." #: C/import-roll-search.page:36(p) msgid "" "To stop searching by import rolls, select FindBy " "Import RollClear Roll Filter." msgstr "" "Pour arrêter la recherche par série d'importation, sélectionnez dans le menu " "RecherchePar série d'importationEffacer " "le filtre des séries." #: C/import-photos.page:6(desc) msgid "Import photos to be managed" msgstr "Importer des photos à gérer" #: C/import-photos.page:9(title) msgid "Importing Photos" msgstr "Importation de photos" #: C/import-photos.page:12(p) msgid "Chances are, the first thing you will want to do is import photos." msgstr "" "Il y a de fortes chances pour que la première action que vous souhaitiez " "faire soit d'importer des photos." #: C/import-photos.page:15(p) msgid "To import photos:" msgstr "Pour importer des photos :" #: C/import-photos.page:20(p) msgid "" "Select PhotoImport.... Alternatively, " "click the Import button." msgstr "" "Sélectionnez PhotoImporter.... Vous " "pouvez aussi cliquer sur le bouton Importer." #: C/import-photos.page:24(p) msgid "Select a source from which to import, such as a device or a folder." msgstr "" "Sélectionnez la source d'importation, comme par exemple un périphérique ou " "un dossier." #: C/import-photos.page:27(p) msgid "" "It may take a while for F-Spot to index the files. When it is done indexing, " "your photos will be presented to you. At this time, you can attach tags to all photos, or you can leave that task for " "later." msgstr "" "F-Spot peut prendre un certain temps pour indexer les fichiers. Lorsqu'il a " "terminé, les photos s'affichent. À ce moment, vous pouvez attribuer des " "étiquettes à toutes les photos, ou remettre cette " "tâche à plus tard." #: C/import-photos.page:33(p) msgid "When you are ready to finish importing photos, click Import." msgstr "" "Quand vous êtes prêt à terminer l'importation des photos, cliquez sur " "Importer." #: C/general-editing.page:6(desc) msgid "Make simple edits to your photos" msgstr "Effectuer des modifications simples de vos photos" #: C/general-editing.page:9(title) msgid "General Editing" msgstr "Modifications générales" #: C/general-editing.page:13(p) msgid "" "F-Spot allows you to make simple general edits, including " "straightening, cropping, and rotating your photos." msgstr "" "F-Spot vous permet de faire des modifications générales simples, " "comme redresser, découper et faire pivoter vos photos." #: C/general-editing.page:15(p) msgid "There are three ways to rotate a selected photo:" msgstr "Il y a trois façons d'effectuer la rotation d'une photo sélectionnée :" #: C/general-editing.page:18(p) msgid "Click the appropriate rotate button, to the right of the import button." msgstr "" "Cliquez sur le bouton de rotation approprié, à droite du bouton " "d'importation." #: C/general-editing.page:22(p) msgid "Select the appropriate option from within the Edit menu." msgstr "Sélectionnez l'option appropriée dans le menu Édition." #: C/general-editing.page:26(p) msgid "Use the bracket keys to rotate the photo." msgstr "" "Utilisez les touches de raccourcis crochets « [ ] » pour faire tourner la " "photo." #: C/general-editing.page:29(p) msgid "To straighten a selected photo:" msgstr "Pour redresser la photo sélectionnée :" #: C/general-editing.page:32(p) msgid "From within the editing pane, select Straighten." msgstr "Dans le volet Modifier, sélectionnez Redressement." #: C/general-editing.page:35(p) msgid "Select a rotation, ranging from -45 to 45 degrees." msgstr "Sélectionnez un angle de rotation, compris entre -45 et 45 degrés." #: C/general-editing.page:38(p) msgid "Click Straighten." msgstr "Cliquez sur Redressement" #: C/general-editing.page:41(p) msgid "To crop a selected photo:" msgstr "Pour découper la photo seÌlectionneÌe :" #: C/general-editing.page:44(p) msgid "Click the Crop button in the Edit pane." msgstr "Cliquez sur le bouton Rogner dans le volet Modifier." # note typo in source "Constraining" #: C/general-editing.page:47(p) msgid "" "Select a contraining aspect ratio, that is, a proportion of height to width " "to which the new photo must fit. Examples of contraining aspect ratios " "include 4x3, 4x6, and 5x7." msgstr "" "Choisissez une contrainte de format, c'est-à-dire le rapport hauteur-largeur " "dans laquelle la photo doit s'inscrire, par exemple 4x3, 4x6 et 5x7." #: C/general-editing.page:52(p) msgid "" "Click and drag to select the desired area to keep. This box can be dragged " "around after being sized." msgstr "" "Cliquez puis déplacez le pointeur de la souris pour sélectionner la surface " "souhaitée à conserver. Cette zone peut ensuite encore être déplacée avec la " "souris après avoir choisi sa taille." #: C/general-editing.page:56(p) msgid "When you have selected your area to crop to, click Crop." msgstr "Après avoir choisi la zone à conserver, cliquez sur Rogner." #: C/folder.page:8(desc) msgid "Send photos to a folder" msgstr "Envoyer des photos dans un dossier" #: C/folder.page:11(title) msgid "Folder Export" msgstr "Exportation dans un dossier" #: C/folder.page:15(p) msgid "" "F-Spot allows you to export to a folder. In order to do so, " "however, you will need to have the folder export extension installed and enabled." msgstr "" "F-Spot vous permet d'exporter vers un dossier. Cependant, pour " "pouvoir le faire, vous devez avoir installé et activé l'extension d'exportation de dossier." #: C/folder.page:18(p) msgid "To export selected photos to a folder:" msgstr "Pour exporter les photos sélectionnées vers un dossier :" #: C/folder.page:21(p) msgid "" "Select PhotoExport ToFolder...." msgstr "" "Choisissez dans le menu PhotoExporter versDossier...." #: C/folder.page:25(p) msgid "Select a folder." msgstr "Sélectionnez un dossier." #: C/folder.page:28(p) msgid "Name the gallery and give it a description." msgstr "Donnez un nom et une description à la galerie." #: C/folder.page:31(p) msgid "" "Select an export method. Create Standalone Web Gallery will " "create a folder with contents fit to be uploaded to a web server to present " "pictures in a gallery. Save the files only will only move photos " "to the selected folder. Create gallery using \"Original\" will " "create a folder with contents suitable for using with Original Photo Gallery." msgstr "" "Sélectionnez une méthode d'exportation. Créer une galerie Web " "indépendante crée un dossier contenant les fichiers prêts à être " "envoyés vers un serveur Web pour présenter les photos dans une galerie. " "Enregistrer uniquement les fichiers déplace seulement les photos " "vers le dossier sélectionné. Créer la galerie avec « Original » " "crée un dossier avec un contenu adapté aux galeries Original Photo Gallery." #: C/flickr.page:8(desc) msgid "Upload photos to Flickr" msgstr "Envoyer des photos vers Flickr" #: C/flickr.page:11(title) msgid "Flickr" msgstr "Flickr" #: C/flickr.page:15(p) msgid "" "To upload photos to Flickr you will need a Flickr account, as well as " "internet access. Also, the Flickr extension " "must be installed and enabled." msgstr "" "Pour envoyer des photos vers Flickr, vous avez besoin d'un compte Flickr, " "ainsi que d'un acceÌ€s aÌ€ internet. L'extension Flickr doit aussi eÌ‚tre installeÌe et activeÌe." #: C/file-management.page:8(desc) msgid "Manage files already imported" msgstr "Gérer les fichiers déjà importés" #: C/file-management.page:11(title) msgid "File Management" msgstr "Gestion des fichiers" # BUG in english sentence # # your catalog should be your computer #: C/file-management.page:15(p) msgid "" "F-Spot allows for some control over the contents of your catalog, " "that is, removing files from your catalog as well as deleting files from " "your catalog." msgstr "" "F-Spot vous permet de contrôler le contenu de votre catalogue, " "c'est-à-dire d'enlever des fichiers du catalogue ou de les supprimer de " "votre ordinateur." #: C/file-management.page:18(p) msgid "To remove files from your catalog:" msgstr "Pour enlever des fichiers de votre catalogue :" #: C/file-management.page:21(p) msgid "Select the photos you wish to remove from the catalog." msgstr "Sélectionnez les photos que vous voulez enlever du catalogue." #: C/file-management.page:24(p) msgid "" "Right-click the photos, select Remove From Catalog. " "Alternatively, select EditRemove From Catalog or press the Delete key on your keyboard." msgstr "" "D'un clic droit sur les photos, faites Enlever du catalogue. Vous " "pouvez aussi choisir ÉditionEnlever du catalogue dans le menu, ou appuyer sur la touche Suppr de votre clavier." #: C/file-management.page:29(p) msgid "To delete photos from your computer:" msgstr "Pour supprimer des photos de votre ordinateur :" #: C/file-management.page:32(p) msgid "Select the photos you wish to delete." msgstr "Sélectionnez les photos que vous voulez supprimer." #: C/file-management.page:35(p) msgid "" "Right-click the photos, select Delete From Drive. Alternatively, " "select EditDelete From Drive or press " "Shift+Delete on your keyboard." msgstr "" "D'un clic droit sur les photos, faites Supprimer du lecteur. Vous " "pouvez aussi choisir ÉditionSupprimer du lecteur dans le menu, ou utiliser le raccourci Maj + Suppr de votre " "clavier." #: C/facebook.page:8(desc) msgid "Upload photos to Facebook" msgstr "Envoyer des photos vers FaceBook" #: C/facebook.page:11(title) msgid "Facebook" msgstr "Facebook" #: C/facebook.page:15(p) msgid "" "To upload photos to Facebook you will need a Facebook account, as well as " "internet access. Also, the Facebook extension must be installed and enabled." msgstr "" "Pour envoyer des photos vers Facebook, vous avez besoin d'un compte " "Facebook, ainsi que d'un acceÌ€s aÌ€ internet. L'extension Facebook doit aussi eÌ‚tre installeÌe et activeÌe." #: C/facebook.page:20(p) msgid "To post selected photos to Facebook:" msgstr "Pour poster les photos sélectionnées vers Facebook :" #: C/facebook.page:23(p) msgid "" "Select PhotoExport ToFacebook." msgstr "" "Choisissez dans le menu PhotoExporter versFacebook." #: C/facebook.page:27(p) msgid "" "Click Login. A browser window will be brought up. Log in to " "Facebook and click \"Allow\" to allow F-Spot access to your Facebook profile." msgstr "" "Cliquez sur Connexion. Une fenêtre du navigateur s'ouvre. " "Connectez vous à Facebook avec vos identifiants et cliquez sur « Autoriser » " "pour permettre à F-Spot d'accéder à votre profil Facebook." #: C/facebook.page:32(p) msgid "" "Select whether to create a new album or add to an existing album. If you are " "creating a new album, fill in the relevant information." msgstr "" "Choisissez, soit de créer un nouvel album, soit d'ajouter à un album " "existant. Si vous créez un nouvel album, fournissez les informations " "adéquates." #: C/facebook.page:36(p) msgid "Edit captions for each photo, if so desired." msgstr "Modifiez les légendes de chaque photo si vous le souhaitez." #: C/facebook.page:39(p) msgid "When finished, click Add." msgstr "Lorsque vous avez fini, cliquez sur Ajouter." #: C/extensions.page:8(desc) msgid "Working with F-Spot extensions" msgstr "Utilisation des extensions de F-Spot" #: C/extensions.page:11(title) msgid "Extensions" msgstr "Extensions" #: C/extensions.page:15(p) msgid "" "F-Spot allows for the use of extensions to provide additional " "functionality." msgstr "" "F-Spot permet l'ajout d'extensions pour augmenter ses " "fonctionnalités." #: C/extensions.page:18(p) msgid "" "To open the extension manager, select EditManage " "Extensions." msgstr "" "Pour ouvrir le gestionnaire d'extensions, choisissez ÉditionGérer les extensions dans le menu." #: C/extensions.page:21(p) msgid "To install extensions:" msgstr "Pour installer des extensions :" #: C/extensions.page:24(p) C/extensions.page:46(p) C/extensions.page:58(p) #: C/extensions.page:70(p) msgid "Open the extension manager." msgstr "Ouvrez le gestionnaire d'extensions." #: C/extensions.page:27(p) msgid "Click Install Add-ins." msgstr "Cliquez sur Installer des greffons." #: C/extensions.page:30(p) msgid "Select an add-on to install from the list." msgstr "SeÌlectionnez dans la liste un greffon aÌ€ installer." #: C/extensions.page:33(p) C/extensions.page:79(p) msgid "Click Forward." msgstr "Cliquez sur Suivant." #: C/extensions.page:36(p) msgid "Verify all information, and click Forward again." msgstr "" "Vérifiez toutes les informations et cliquez de nouveau sur Suivant." #: C/extensions.page:43(p) msgid "To enable plugins that are already installed:" msgstr "Pour activer des greffons déjà installés :" #: C/extensions.page:49(p) msgid "Select the extension you wish to enable." msgstr "Sélectionnez l'extension que vous voulez activer." #: C/extensions.page:52(p) msgid "Click Enable." msgstr "Cliquez sur Activer." #: C/extensions.page:55(p) msgid "To disable plugins that are installed:" msgstr "Pour désactiver des greffons installeÌs :" #: C/extensions.page:61(p) msgid "Select the extension you wish to disable." msgstr "SeÌlectionnez l'extension que vous voulez désactiver." #: C/extensions.page:64(p) msgid "Click Disable." msgstr "Cliquez sur Désactiver." #: C/extensions.page:67(p) msgid "To uninstall plugins:" msgstr "Désinstaller des greffons :" #: C/extensions.page:73(p) msgid "Select the extension you wish to uninstall." msgstr "SeÌlectionnez l'extension que vous voulez désinstaller." #: C/extensions.page:76(p) msgid "Click Uninstall." msgstr "Cliquez sur Désinstaller." #: C/enhancements.page:6(desc) msgid "Simple enhancements for your photos" msgstr "Améliorations simples de vos photos" #: C/enhancements.page:9(title) msgid "Enhancements" msgstr "Améliorations" #: C/enhancements.page:13(p) msgid "" "Currently, there are two main enhancements that F-Spot supports: " "red-eye removal and the automatic enhancement of color." msgstr "" "Pour le moment, F-spot prend en charge deux outils de retouche : " "la réduction des yeux rouges et l'amélioration automatique des couleurs." #: C/enhancements.page:15(p) msgid "To remove red-eye:" msgstr "Pour réduire des yeux rouges :" #: C/enhancements.page:18(p) msgid "" "By double-clicking, select the photo on which you wish to use the red-eye " "removal tool." msgstr "" "Double-cliquez sur la photo à traiter avec l'outil de réduction des yeux " "rouges." #: C/enhancements.page:22(p) msgid "Click Red-Eye Removal in the Edit panel." msgstr "" "Appuyez sur le bouton Réduction des yeux rouges dans le volet " "d'édition." #: C/enhancements.page:25(p) msgid "" "Select the area from which you wish to remove red-eye. Note: If the contains " "many red areas, you may wish to select each eye individually." msgstr "" "Sélectionnez la zone où vous voulez réduire les yeux rouges. Note : si celle-" "ci comporte de nombreuses zones rouges, il est préférable de sélectionner " "les yeux un par un." #: C/enhancements.page:30(p) msgid "Click Fix!." msgstr "Cliquez sur Corriger !" #: C/enhancements.page:33(p) msgid "To automatically enhance the colors of the photo:" msgstr "Pour améliorer automatiquement les couleurs de la photo :" #: C/enhancements.page:36(p) msgid "By double-clicking, select the photo which you wish to enhance." msgstr "Double-cliquez sur la photo que vous souhaitez améliorer." #: C/enhancements.page:39(p) msgid "Click Auto Color." msgstr "Cliquez sur Couleurs automatiques." #: C/date-search.page:8(desc) msgid "Search photos by date" msgstr "Recherche de photos par date" #: C/date-search.page:11(title) msgid "Search by Date" msgstr "Recherche par date" #: C/date-search.page:15(p) msgid "To search by date:" msgstr "Pour effectuer une recherche par date :" #: C/date-search.page:18(p) msgid "" "Select FindBy DateSet Date Range...." msgstr "" "Choisissez dans le menu RecherchePar dateDeÌfinir une plage de dates." #: C/date-search.page:22(p) msgid "" "Select a time period to from which to view photos. This can by done by " "selecting a set period, such as a week, or by specifying dates." msgstr "" "Choisissez la période dont vous voulez visionner les photos. Vous pouvez le " "faire soit en sélectionnant une période donnée, telle qu'une semaine, soit " "en spécifiant les dates de début et de fin." #: C/date-search.page:30(p) msgid "Alternatively, you can use the timeline. To use the timeline:" msgstr "" "Vous pouvez aussi utiliser la frise chronologique. Pour utiliser la frise " "chronologie :" #: C/date-search.page:33(p) msgid "" "Make sure the timeline is enabled by selecting ViewComponents and making sure that Timeline " "is checked." msgstr "" "Assurez-vous que la frise chronologie soit activée dans le menu " "AffichageComposants et que la case " "Frise chronologique soit cochée." #: C/date-search.page:38(p) msgid "" "In the timeline, click the bar corresponding to the time period you wish to " "look at." msgstr "" "Dans la frise chronologie, cliquez sur la barre correspondant à la période " "que vous souhaitez visionner." #: C/date-search.page:42(p) msgid "To stop searching by date:" msgstr "Pour arreÌ‚ter la recherche par date :" #: C/date-search.page:45(p) msgid "" "Select FindBy DateClear Date Range." msgstr "" "Choisissez dans le menu RecherchePar dateNe plus tenir compte des dates." #: C/colors.page:6(desc) msgid "Edit the colors of your photos" msgstr "Modifiez les couleurs de vos photos" #: C/colors.page:9(title) msgid "Color Editing" msgstr "Modification de couleurs" #: C/colors.page:12(p) msgid "F-Spot supports several modes of color manipulation." msgstr "" "F-Spot prend en charge plusieurs modes de manipulation des " "couleurs." #: C/colors.page:15(title) msgid "Desaturate" msgstr "Décoloriser" #: C/colors.page:16(p) msgid "" "This mode eliminates all saturation, turning a color image into a black and " "white image." msgstr "" "Ce mode élimine toute les couleurs, une photo en couleur devenant alors une " "photo en noir et blanc." #: C/colors.page:20(title) msgid "Sepia Tone" msgstr "Effet seÌpia" #: C/colors.page:21(p) msgid "This mode simulates a photo being created with sepia toner." msgstr "Ce mode donne l'impression d'avoir crée une photo sur du papier sépia." #: C/colors.page:24(title) msgid "Auto Color" msgstr "Couleurs automatiques" #: C/colors.page:25(p) msgid "This mode automatically adjusts the colors to a set profile." msgstr "Ce mode ajuste automatiquement les couleurs à un profil défini." #: C/cd.page:8(desc) msgid "Burn photos to a CD" msgstr "Gravure de photos sur un CD" #: C/cd.page:11(title) msgid "CD Export" msgstr "Exportation vers un CD" #: C/adjust-color.page:6(desc) msgid "Adjusting the colors of a photo" msgstr "Ajustement des couleurs d'une photo" #: C/adjust-color.page:9(title) msgid "Adjust Color" msgstr "Ajustement des couleurs" #: C/adjust-color.page:12(p) msgid "" "As far as the editing tools in F-Spot, adjusting the color is easily the " "most powerful. The color editor allows you to adjust:" msgstr "" "Parmi les outils de modification disponibles dans F-Spot, l'ajustement des " "couleurs est assurément le plus puissant. L'éditeur des couleurs permets de " "modifier :" #: C/adjust-color.page:16(title) msgid "Exposure" msgstr "L'exposition" #: C/adjust-color.page:17(p) msgid "This adjustment simulates lengthening or shortening the exposure time." msgstr "" "Ce réglage simule l'allongement ou le raccourcissement de la durée " "d'exposition." #: C/adjust-color.page:21(title) msgid "Saturation" msgstr "La saturation" #: C/adjust-color.page:22(p) msgid "" "This adjustment simulates adjusting the amount of color in the image, i.e. " "sliding it to the left decrease color, making it black and white, while " "sliding it to the right will increase the vibrancy of colors." msgstr "" "Ce réglage modifie la saturation des couleurs de l'image, c'est-à-dire : " "déplacer le curseur vers la gauche ternit les couleurs progressivement " "jusqu'au noir et blanc, tandis que le déplacer vers la droite les ravive " "jusqu'à la saturation." #: C/adjust-color.page:28(title) msgid "Brightness" msgstr "La luminositeÌ" #: C/adjust-color.page:29(p) msgid "" "This adjustment increase the brightness of colors. Increasing this too much " "will make colors appear \"washed out\", while decreasing it too much will " "make the image too dark and lacking in contrast." msgstr "" "Ce réglage accroit la luminosité des couleurs. Trop l'augmenter produit des " "couleurs « délavées », alors que trop le diminuer rend l'image trop sombre et " "manquant de contraste." #: C/adjust-color.page:34(title) msgid "Hue" msgstr "La coloration" #: C/adjust-color.page:35(p) msgid "This adjustment causes colors to \"rotate\" along the color wheel." msgstr "" "Ce réglage modifie le mélange des couleurs primaires en les faisant " "« tourner » sur le diagramme des couleurs ." #: C/adjust-color.page:38(title) msgid "Contrast" msgstr "Le contraste" #: C/adjust-color.page:39(p) msgid "" "This adjustment adjusts the contrast ratio, that is, the ratio of difference " "between dark and light pixels. Sliding to the left decreases contrast, while " "sliding to the right will increase contrast." msgstr "" "Ce réglage ajuste le contraste, c'est-à-dire le ratio entre le nombre de " "pixels clairs et foncés. Déplacer le curseur vers la gauche diminue le " "contraste, alors que le déplacer vers la droite l'augmente." #: C/adjust-color.page:45(title) msgid "Temp" msgstr "La température" #: C/adjust-color.page:46(p) msgid "This adjust changes the color temperature, measured in degrees Kelvin." msgstr "" "Ce réglage permet de modifier la température de couleur, mesurée en kelvin." #: C/adjust-color.page:50(title) msgid "Tint" msgstr "La nuance" #: C/adjust-color.page:51(p) msgid "This adjustment allows you to tinge the photo with a color." msgstr "Ce réglage permet de teinter la photo avec une couleur." #: C/23hq.page:8(desc) msgid "Upload photos to 23hq" msgstr "Envoyer des photos vers 23hq" #: C/23hq.page:11(title) msgid "23hq" msgstr "23hq" #: C/23hq.page:15(p) msgid "" "To upload photos to 23hq you will need a 23hq account, as well as internet " "access. Also, the 23hq extension must be " "installed and enabled." msgstr "" "Pour envoyer des photos vers 23hq, vous avez besoin d'un compte 23hq, ainsi " "que d'un accès à internet. L'extension 23hq " "doit aussi être installée et activée." #. Put one translator per line, in the form of NAME , YEAR1, YEAR2 #: C/index.page:0(None) msgid "translator-credits" msgstr "" "Stephane Delcroix , 2007\n" "Claude Paroz , 2007-2008\n" "Bruno Brouard , 2008,2010\n" "Laurent Coudeur , 2010\n" "Alain Lojewski , 2010" f-spot-0.8.2/help/fr/cd.page0000644000175000017500000000047411503407432016030 0ustar00rubenruben00000000000000 Gravure de photos sur un CD Exportation vers un CD f-spot-0.8.2/help/fr/smugmug.page0000644000175000017500000000102011503407432017112 0ustar00rubenruben00000000000000 Envoyer des photos vers SmugMug SmugMug

Pour envoyer des photos vers SmugMug, vous avez besoin d'un compte SmugMug, ainsi que d'un acceÌ€s aÌ€ internet. L'extension SmugMug doit aussi eÌ‚tre installeÌe et activeÌe.

f-spot-0.8.2/help/fr/flickr.page0000644000175000017500000000101211503407432016701 0ustar00rubenruben00000000000000 Envoyer des photos vers Flickr Flickr

Pour envoyer des photos vers Flickr, vous avez besoin d'un compte Flickr, ainsi que d'un acceÌ€s aÌ€ internet. L'extension Flickr doit aussi eÌ‚tre installeÌe et activeÌe.

f-spot-0.8.2/help/fr/colors.page0000644000175000017500000000154011503407432016736 0ustar00rubenruben00000000000000 Modifiez les couleurs de vos photos Modification de couleurs

F-Spot prend en charge plusieurs modes de manipulation des couleurs.

Décoloriser

Ce mode élimine toute les couleurs, une photo en couleur devenant alors une photo en noir et blanc.

Effet seÌpia

Ce mode donne l'impression d'avoir crée une photo sur du papier sépia.

Couleurs automatiques

Ce mode ajuste automatiquement les couleurs à un profil défini.

f-spot-0.8.2/help/fr/versioning.page0000644000175000017500000000171211503407432017621 0ustar00rubenruben00000000000000 Suivi des différentes versions de vos photos Gestion des versions

F-Spot permet de conserver plusieurs versions de vos photos. Ceci est particulièrement utile lorsque vous modifiez des photos car vous pouvez ainsi rapidement voir la différence entre la version modifiée et l'original.

Pour passer d'une version à une autre pendant les modifications :

Double-cliquez sur la photo que vous souhaitez modifier.

Dans la barre latérale, vous voyez la liste déroulante Version. Pour sélectionner une version à afficher, choisissez-la dans la liste déroulante.

f-spot-0.8.2/help/fr/tag-creation.page0000644000175000017500000000463611503407432020023 0ustar00rubenruben00000000000000 Création d'étiquettes à attribuer aux photos CreÌation

Pour pouvoir utiliser des étiquettes, vous devez d'abord en créer un assortiment qui vous convienne. Il y a trois méthodes principales pour créer des étiquettes.

Première méthode :

Choisissez dans le menu ÉtiquettesCréer une nouvelle étiquette.

Choisissez une étiquette parente sous laquelle apparaîtra la nouvelle éiquette, comme Personnes ou Évènements. Si vous souhaitez créer une nouvelle étiquette non parente, choisissez (aucun).

Nommez l'étiquette.

Cliquez sur Créer

Deuxième méthode :

Dans le volet Étiquettes, faites un clic droit, et sélectionnez Créer une nouvelle étiquette...

Choisissez une étiquette parente sous laquelle apparaîtra la nouvelle éiquette, comme Personnes ou Évènements. Si vous souhaitez créer une nouvelle étiquette non parente, choisissez (aucun).

Nommez l'étiquette.

Cliquez sur Créer

La troisième méthode permet en plus d'attribuer la nouvelle étiquette aux photos sélectionnées. Procédez comme suit :

SeÌlectionnez les photos auxquelles vous souhaitez attribuer la nouvelle étiquette.

D'un clic droit sur les photos, sélectionnez Attribuer l'étiquetteCréer une nouvelle étiquette....

Choisissez une étiquette parente sous laquelle apparaîtra la nouvelle éiquette, comme Personnes ou Évènements. Si vous souhaitez créer une nouvelle étiquette non parente, choisissez (aucun).

Nommez l'étiquette.

Cliquez sur Créer

f-spot-0.8.2/help/fr/tag-attach.page0000644000175000017500000000260411503407432017454 0ustar00rubenruben00000000000000 Attribution d'étiquettes aux photos Attribution

En attribuant des étiquettes que vous avez créer, vous simplifiez vos recherche parmi vos photos. Comme pour la création d'étiquettes, il y a plusieurs méthodes pour les attribuer aux photos.

Première méthode :

SeÌlectionnez les photos auxquelles vous souhaitez attribuer une eÌtiquette.

Dans le volet Étiquettes, choisissez une eÌtiquette aÌ€ attribuer aux photos seÌlectionneÌes.

Cliquez sur ÉtiquettesAttribuer l'étiquette à la sélection. Alternativement, pressez Ctrl+T.

Deuxième méthode :

SeÌlectionnez les photos auxquelles vous souhaitez attribuer une eÌtiquette.

Cliquez avec le bouton droit sur les photos.

Choisissez Attribuer l'eÌtiquette à la sélection et seÌlectionnez l'eÌtiquette que vous souhaitez attribuer.

f-spot-0.8.2/help/fr/ratings.page0000644000175000017500000000217411503407432017110 0ustar00rubenruben00000000000000 Notez vos photos de une à cinq étoiles. Notation de vos photos

F-Spot vous permet de noter vos photos de une à cinq étoiles. Il y a deux façons de noter des photos.

Première méthode :

Double-cliquez sur la photo que vous souhaitez noter.

Dans le coin inférieur droite, vous voyez cinq points vous permettant d'attribuer une note correspondant à votre estimation ; pour donner une note d'une étoile, par exemple, cliquez sur le premier point.

Deuxième méthode :

Sélectionnez la ou les photos que vous souhaitez noter.

D'un clic droit sur la ou les photos que vous souhaitez noter, choisissez une note en bas du menu contextuel en sélectionnant le point correspondant.

f-spot-0.8.2/help/fr/rate-search.page0000644000175000017500000000167711503407432017646 0ustar00rubenruben00000000000000 Recherche de photos en fonction de leur notation Recherche par note

Pour effectuer une recherche par note :

Allez dans le menu RecherchePar noteDéfinir une plage de notes....

Sélectionnez la plage de notes que vous souhaitez afficher.

Cliquez sur Ok.

Pour arrêter la recherche par note :

Choisissez dans le menu RecherchePar noteEffacer le filtre des notations.

f-spot-0.8.2/help/fr/tags.page0000644000175000017500000000145311503407432016376 0ustar00rubenruben00000000000000 Une brève introduction aux possibilités d'étiquetage de F-Spot Les étiquettes

Comme certains autres gestionnaires de photos, F-Spot vous permet d'étiqueter vos photos, ce qui autorise ensuite une recherche rapide simplement basée sur le contenu de vos photos. Vous pouvez étiqueter des personnes, des évènements, des endroits, des sujets favoris, ou même créer vos groupes d'étiquettes personnalisées.

Gestion des étiquettes
f-spot-0.8.2/help/sl/0000777000175000017500000000000011503407433014613 5ustar00rubenruben00000000000000f-spot-0.8.2/help/sl/facebook.page0000644000175000017500000000237711503407433017227 0ustar00rubenruben00000000000000 Pošiljanje fotografij na Facebook Facebook

Za poÅ¡iljanje fotografij na Facebook boste potrebovali raÄun Facebook in internetni dostop. Poleg tega mora biti razÅ¡iritev Facebook nameÅ¡Äena in omogoÄena.

Za objavo izbranih fotografij na Facebooku:

Izberite FotografijaIzvozi vFacebook.

Kliknite Prijava. Odprlo se bo okno brskalnika. Prijavite se v Facebook in kliknite "Dovoli" za omogoÄitev dostopa F-Spot-u do svojega profila Facebook.

Izberite ali želite ustvariti nov album ali dodati slike k obstojeÄemu albumu. V primeru, da ustvarjajte nov album, izpolnite vse pomembne podatke.

Uredite naslove za vsako fotografije, Äe tako želite.

Ko boste konÄali, kliknite Dodaj.

f-spot-0.8.2/help/sl/folder.page0000644000175000017500000000237611503407433016730 0ustar00rubenruben00000000000000 Pošiljanje fotografij v mapo Izvoz mape

F-Spot vam omogoÄa izvoz v mapo. Da lahko to storite, boste morali imeti razÅ¡iritev izvoza v mapo nameÅ¡Äeno in omogoÄeno.

Za izvoz izbranih fotografij v mapo:

Izberite FotografijaIzvozi vMapa ....

Izberite mapo.

Poimenujte galerijo in ji dodajte opis.

Izberite naÄin izvoza. Ustvari samostojno spletno galerijo bo ustvaril mapo z vsebino, pripravljeno za poÅ¡iljanje na spletni strežnik za predstavitev slik v galeriji. Shrani le datoteke fotografije le premakne v izbrano mapo. Ustvari galerijo z "Izvirno" bo ustvarilo mapo z vsebino, primerno za uporabo z Izvirno galerijo fotografij.

Kliknite Izvoz.

f-spot-0.8.2/help/sl/introduction.page0000644000175000017500000000115611503407433020171 0ustar00rubenruben00000000000000 Kratek uvod v F-Spot Uvod

F-Spot je polno zmogljiv upravljalnik fotografij za namizje GNOME. OmogoÄa vam oznako, oceno in datiranje fotografij, urejanje metapodatkov fotografij in vkljuÄuje celo majhen vgrajen urejevalnik fotografij.

Za pomoÄ pri zaÄetku uporabe F-Spot si oglejte osnovne zmožnosti v datoteki pomoÄi.

f-spot-0.8.2/help/sl/tag-remove.page0000644000175000017500000000206711503407433017520 0ustar00rubenruben00000000000000 Odstranjevanje oznak iz fotografij Odstranjevanje

Tako kot za pripenjanje oznak, sta tudi za odstranjevanje oznak na voljo dva glavna naÄina.

Prvi naÄin:

Izberite fotografije iz katerih želite odstraniti oznako.

V pladnju oznak izberite oznako za odstranitev iz izbranih fotografij.

Kliknite OznakeOdstrani oznako iz izbora.

Drugi naÄin:

Izberite fotografije iz katerih želite odstraniti oznako.

Desno kliknite fotografije.

Izberite Odstrani oznako in izberite oznake, ki jih želite odstraniti.

f-spot-0.8.2/help/sl/picasa.page0000644000175000017500000000176711503407433016720 0ustar00rubenruben00000000000000 Pošiljanje fotografij na Google-ov PicasaWeb Picasa

Za poÅ¡iljanje fotografij na Picasa boste potrebovali raÄun Picasa in internetni dostop. Poleg tega mora biti link xref="extensions">razÅ¡iritev

Select the photos you wish to upload.

Click PhotoExport To PicasaWeb....

Add a gallery by clicking Add and supplying a username and password.

j

Select a gallery to export to, or click Add to create a new gallery.

Click Export.

f-spot-0.8.2/help/sl/general-editing.page0000644000175000017500000000322511503407433020505 0ustar00rubenruben00000000000000 Opravite majhna urejanja svojih fotografij Splošno urejanje

F-Spot vam omogoÄa enostavna sploÅ¡na urejanja, vkljuÄno s poravnavo obrezovanjem in vrtenjem vaÅ¡ih fotografij.

Za vrtenje izbrane fotografije so na voljo trije naÄini:

Kliknite primeren gumb vrtenja desno od gumba uvoza.

Izberite primerno možnost v meniju Uredi.

Uporabite tipke oklepaja za vrtenje fotografije.

Za poravnavo izbrane fotografije:

V pladnju urejanja izberite Poravnaj.

Izberite vrtenje med -45 do 45 stopinjami.

Kliknite Poravnaj.

Za obrez izbrane fotografije:

Kliknite gumb Obreži v pladnju Uredi.

Izberite razmerje velikosti to je razmerje med širino in dolžino kateremu se mora prilegati nova fotografija. Primeri razmerij velikosti so 4x3, 4x6 in 5x7.

Kliknite in povlecite za izbiro podroÄja, ki ga želite obdržati. Polje lahko po spremembi velikosti vleÄete naokoli.

Ko ste izbrali podroÄje za obrez, kliknite Obreži.

f-spot-0.8.2/help/sl/extensions.page0000644000175000017500000000377111503407433017654 0ustar00rubenruben00000000000000 Delo z razširitvami F-Spot Razširitve

F-Spot omogoÄa uporabo razÅ¡iritev, ki zagotavljajo dodatne zmožnsti.

Za odprtje upravljalnika razširitev izberite UrediUpravljanje razširitev.

Za namestitev vstavkov:

Odprite upravljalnika razširitev.

Kliknite Namesti vstavke.

Izberite vstavek za namestitev s seznama.

Kliknite Naprej.

Preverite vse podatke in znva kliknite Naprej.

Kliknite V redu.

Za omogoÄenje vstavkov, ki so že nameÅ¡Äeni:

Odprite upravljalnika razširitev.

Izberite razÅ¡iritev, ki jo želite omogoÄiti.

Kliknite OmogoÄi.

Za onemogoÄenje nameÅ¡Äenih vstavkov:

Odprite upravljalnika razširitev.

Izberite razÅ¡iritev, ki jo želite onemogoÄiti.

Kliknite OnemogoÄi.

Za odstranitev vstavkov:

Odprite upravljalnika razširitev.

Izberite razširitev, ki jo želite odstraniti.

Kliknite Odstrani.

Kliknite Naprej.

Kliknite V redu.

f-spot-0.8.2/help/sl/23hq.page0000644000175000017500000000075711503407432016232 0ustar00rubenruben00000000000000 Pošiljanje fotografij na 23hq 23hq

Za poÅ¡iljanje fotografij na 23hq boste potrebovali raÄun 23hq in internetni dostop. Poleg tega mora biti razÅ¡iritev 23hq nameÅ¡Äena in omogoÄena.

f-spot-0.8.2/help/sl/zooomr.page0000644000175000017500000000077311503407433017001 0ustar00rubenruben00000000000000 Pošiljanje fotografij na Zooomr Zooomr

Za poÅ¡iljanje fotografij na Zooomr boste potrebovali raÄun Zooomr in internetni dostop. Poleg tega mora biti razÅ¡iritev Zooomr nameÅ¡Äena in omogoÄena.

f-spot-0.8.2/help/sl/enhancements.page0000644000175000017500000000227611503407433020124 0ustar00rubenruben00000000000000 Enostavne izboljšave za vaše fotograije Izboljšave

Trenutno F-Spot podpira dve glavni izboljÅ¡avi: odstranitev rdeÄih oÄi in samodejno izboljÅ¡evanje barve.

Za odstranitev rdeÄih oÄi:

Z dvoklikom izberite fotografijo, na kateri želite uporabiti orodje odstranjevanja rdeÄih oÄi

V pladnju Uredi kliknite Odstranitev rdeÄih oÄi.

Izberite podroÄje iz katerega želite odstraniti rdeÄe oko. V primeru da ima slika veÄ rdeÄih oÄi, priporoÄamo izbiro posameznih rdeÄih oÄi.

Kliknite Popravi!.

Za samodejno izboljšanje barv fotografije:

Z dvoklikom izberite fotografijo, ki jo želite izboljšati.

Kliknite Samodejna barva.

f-spot-0.8.2/help/sl/import-photos.page0000644000175000017500000000204111503407433020266 0ustar00rubenruben00000000000000 Uvažanje fotografij za upravljanje Uvažanje fotografij

Verjetno boste najprej želeli uvoziti fotografije.

Za uvoz fotografij:

Izberite FotografijaUvozi .... Dodatno lahko kliknete gumb Uvozi.

Izberite vir iz katerega želite uvažati kot je naprava ali mapa.

F-Spot bo morda rabil nekaj Äasa za pripravo kazala fotografij. Ko bo program konÄal s pripravo kazala, vam bo kazalo predstavljeno. Takrat lahko vsem fotografijam pripnete oznake ali pa to storite kasneje.

Ko ste pripravljeni na konec uvažanja fotografij kliknite Uvoz.

f-spot-0.8.2/help/sl/index.page0000644000175000017500000000157211503407433016561 0ustar00rubenruben00000000000000 F-spot upravljalnik fotografij F-spot upravljalnik fotografij F-spot upravljalnik fotografij
Osnovne zmožnosti
Iskanje
Urejanje fotografij
Souporaba
Napredne možnosti
f-spot-0.8.2/help/sl/date-search.page0000644000175000017500000000251111503407433017624 0ustar00rubenruben00000000000000 Iskanje fotografij po datumu Iskanje po datumu

Za iskanje po datumu:

Izberite IÅ¡ÄiPo datumuNastavi obseg datumov ....

Izberite Äasovno obdobje za ogled fotografij. To lahko storite z izbiro nastavljenega obdobja, kot je na primer teden, ali z doloÄitvijo datumov.

Kliknite V redu.

Dodatno lahko uporabite Äasovnico. Za uporabo Äasovnice:

OmogoÄite Äasovnico tako, da izberete PogledSestavni deli in obkljukajte polje ÄŒasovnica.

V Äasovnici kliknite na vrstico, ki ustreza Äasovnemu obmoÄju, ki si ga želite ogledati.

Za konÄanje iskanje po datumu

Izberite IÅ¡ÄiPo datumuPoÄisti obseg datumov.

f-spot-0.8.2/help/sl/adjust-color.page0000644000175000017500000000307311503407433020056 0ustar00rubenruben00000000000000 Prilagajanje barv fotografije Prilagodi barvo

Med orodji urejanja v F-Spot-u je prilagajanje barv daleÄ najzmogljivejÅ¡e. Urejevalnik barv vam omogoÄa prilagoditev:

Osvetljenost

Ta prilagoditev simulira podaljšanje ali skrajšanje osvetljenosti.

NasiÄenost

Ta prilagodite simulira prilagajanje koliÄine barv na sliki, drsanje na levo zmanjÅ¡ava barve in jo naredi Ärno-belo, drsanje na desno bo poveÄalo živahnost barv.

Svetlost

Ta prilagoditev poveÄa svetlost barv. Prevelika svetlost bo povzroÄila "spranost" barv, premajhna pa bo povzroÄila temno sliko z majhnih kontrastom.

Odtenek

Ta prilagoditev barve "zavrti" po barvnem kolescu.

Kontrast

Ta prilagoditev prilagodi razmerje kontrasta, razlike med temnimi in svetlimi toÄkami. Drsenje na levo kontrast zmanjÅ¡a, drsenje na desno pa poveÄa.

Temp

Ta možnost prilagodi temperaturo barve merjeno v Kelvinih.

ÄŒrnilo

Ta prilagoditev vam omogoÄa dodajanje pridiha barve fotografijam.

f-spot-0.8.2/help/sl/upload-to-web.page0000644000175000017500000000075511503407433020133 0ustar00rubenruben00000000000000 PoÅ¡ljanje fotografij na razliÄne spletne storitve PoÅ¡ljanje na splet

F-Spot vam omogoÄa poÅ¡iljanje fotografij na priljubljene spletne storitve vkljuÄno z Google-ovim PicasaWeb in Flickr-jem.

f-spot-0.8.2/help/sl/file-management.page0000644000175000017500000000245111503407433020500 0ustar00rubenruben00000000000000 Upravljanje že uvoženih slik Upravljanje datotek

F-Spot omogoÄa nekaj nadzora nad vsebino kataloga, to je možnost odstranjevanja ali izbrisa datotek iz vaÅ¡ega kataloga.

Za odstranitev datotek iz kataloga:

Izberite fotografije, ki jih želite odstraniti iz kataloga.

Desno kliknite na fotografije in izberite Odstrani iz kataloga. Dodatno lahko izberete UrediOdstrani iz kataloga ali pritisnete tipko Izbriši na svoji tipkovnici.

Za izbris fotografij s svojega raÄunalnika:

Izberite fotografije, ki jih želite izbrisati.

Desno kliknite na fotografije in izberite Izbriši s pogona. Dodatno lahko na izberete UrediIzbriši s pogona ali na svoji tipkovnici pritisnete Shift+Izbriši.

f-spot-0.8.2/help/sl/tag-search.page0000644000175000017500000000213311503407433017462 0ustar00rubenruben00000000000000 Iskanje fotografij z uporabo oznak Iskanje po oznaki

Obstaja veÄ naÄinov za iskanje po oznakah.

Prvi naÄin: Dvokliknite oznake, ki jih želite iskati.

Drugi naÄin:

OmogoÄite iskalno vrstico s klikom na NajdiPoka

Povlecite oznake, ki jih želite iskati v novo omogoÄeno iskalno vrstico.

Za odstranitev oznake iz svojega iskanja jo desno kliknite in izberite Odstrani.

Za izkljuÄitev oznake iz svojega iskanja:

V pladnju oznak dvokliknite oznako, ki jo želite izkljuÄiti. To jo bo dodalo v iskalno vrstico.

V iskalni vrstici dvokoliknite oznako, ki jo želite izkljuÄiti.

f-spot-0.8.2/help/sl/tag-delete.page0000644000175000017500000000134011503407433017456 0ustar00rubenruben00000000000000 Brisanje oznak s sistema Brisanje

Izbris oznak jih popolnoma izbriše z vašega sistema, vendar pusti fotografije s pripetimi oznakami nedotaknjene.

Za izbris oznake:

V pladnju oznak izberite oznako, ki jo želite izbrisati.

Kliknite OznakeIzbriši izbrano oznako. Dodatno lahko desno kliknete v pladnju in kliknete Izbriši oznako.

f-spot-0.8.2/help/sl/import-roll-search.page0000644000175000017500000000231211503407433021166 0ustar00rubenruben00000000000000 Iskanje po datumu uvoza Iskanje po uvoznem zvitku

Uvozni zvitki so "paketi" uvoženih fotografij. Ne glede na datum zajema fotografije je Äasovni žig uvoznega zvitka doloÄen ob uvozu fotografij.

Za iskanje po zadnjem uvoznem zvitku:

Izberite IÅ¡ÄiPo uvoznem zvitkuZadnji uvozni zvitek.

Za izbiro predhodnega uvoznega zvitka:

Izberite IÅ¡ÄiPo uvoznem zvitkuIzberi uvozne zvitke.

Izberite uvozni zvitek za iskanje ali izberite obseg z izbiro Vmes in izberite datume, ki jih želite vkljuÄiti.

Za zaustavitev iskanja po uvoznih zvitkih izberite NajdiPo uvoznem zvitkuPoÄisti uvozni zvitek.

f-spot-0.8.2/help/sl/sl.po0000644000175000017500000031602511503407433015574 0ustar00rubenruben00000000000000# Andrej ŽnidarÅ¡iÄ , 2009 - 2010 # msgid "" msgstr "" "Project-Id-Version: f-spot documentation\n" "POT-Creation-Date: 2010-10-30 15:15+0000\n" "PO-Revision-Date: \n" "Last-Translator: Andrej ŽnidarÅ¡iÄ \n" "Language-Team: Slovenian GNOME Translation Team \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n" "X-Poedit-Language: Slovenian\n" "X-Poedit-Country: SLOVENIA\n" "X-Poedit-SourceCharset: utf-8\n" #: C/zooomr.page:8(desc) msgid "Upload photos to Zooomr" msgstr "PoÅ¡iljanje fotografij na Zooomr" #: C/zooomr.page:11(title) msgid "Zooomr" msgstr "Zooomr" #: C/zooomr.page:15(p) msgid "To upload photos to Zooomr you will need a Zooomr account, as well as internet access. Also, the Zooomr extension must be installed and enabled." msgstr "Za poÅ¡iljanje fotografij na Zooomr boste potrebovali raÄun Zooomr in internetni dostop. Poleg tega mora biti razÅ¡iritev Zooomr nameÅ¡Äena in omogoÄena." #: C/versioning.page:8(desc) msgid "Track different versions of your photos" msgstr "Sledite razliÄnim razliÄicam svojih fotografij" #: C/versioning.page:11(title) msgid "Versioning" msgstr "RazliÄice" #: C/versioning.page:14(p) msgid "F-Spot allows you to keep multiple versions of your photos. This is especially useful when editing photos, as you can quickly see the difference between the edited version and the original." msgstr "F-Spot vam omogoÄa obdržati veÄ razliÄic svojih fotografij. To je Å¡e posebno uporabno pri urejanju fotografij, saj lahko hitro vidite razlike med urejeno razliÄico in izvirnikom." #: C/versioning.page:17(p) msgid "To switch between versions while editing:" msgstr "Za menjavo med razliÄicami med urejanjem:" #: C/versioning.page:20(p) msgid "Double-click the photo you wish to edit." msgstr "Dvokliknite na fotografijo, ki jo želite urediti." #: C/versioning.page:23(p) msgid "In the sidebar, you will see a drop-down box labeled Version:. To select a version to view, select it in the drop-down box." msgstr "V stranski vrstici boste videli spustno polje z oznako RazliÄica:. Za izbiro razliÄice za ogled jo izberite v spustnem polju." #: C/upload-to-web.page:8(desc) msgid "Upload photos to various web services" msgstr "PoÅ¡ljanje fotografij na razliÄne spletne storitve" #: C/upload-to-web.page:11(title) msgid "Upload to Web" msgstr "PoÅ¡ljanje na splet" #: C/upload-to-web.page:14(p) msgid "F-Spot allows you to upload photos to popular web services, including Google's PicasaWeb and Flickr." msgstr "F-Spot vam omogoÄa poÅ¡iljanje fotografij na priljubljene spletne storitve vkljuÄno z Google-ovim PicasaWeb in Flickr-jem." #: C/tags.page:6(desc) msgid "A brief introduction to the tagging capabilities of F-Spot" msgstr "Kratek uvod k zmogljivostim oznaÄevanja v F-Spotu" #: C/tags.page:9(title) msgid "Tags" msgstr "Oznake" #: C/tags.page:12(p) msgid "Like certain other photo managers, F-Spot lets you tag your photos, allowing for quick, easy content-based searching of your photos. You can tag people, events, places, favorite things, or even make your own groups of tags." msgstr "Kot nekateri drugi upravljalniki fotografij vam tudi F-Spot omogoÄa oznaÄevanje vaÅ¡ih fotografij. To vam omogoÄa hitro, enostavno na vsebini osnovano iskanje vaÅ¡ih fotografij. OznaÄite lahko ljudi, mesta, najljubÅ¡e stari in celo naredite svojo lastno skupino oznak." #: C/tags.page:17(title) msgid "Working with Tags" msgstr "Delo z oznakami" #: C/tag-search.page:8(desc) msgid "Search photos using tags" msgstr "Iskanje fotografij z uporabo oznak" #: C/tag-search.page:11(title) msgid "Search by Tag" msgstr "Iskanje po oznaki" #: C/tag-search.page:15(p) msgid "There are several methods to search by tags." msgstr "Obstaja veÄ naÄinov za iskanje po oznakah." #: C/tag-search.page:16(p) msgid "Method One: Double-click the tags you wish to search for." msgstr "Prvi naÄin: Dvokliknite oznake, ki jih želite iskati." #: C/tag-search.page:17(p) #: C/tag-remove.page:28(p) #: C/tag-creation.page:32(p) #: C/tag-attach.page:29(p) #: C/ratings.page:25(p) msgid "Method Two:" msgstr "Drugi naÄin:" #: C/tag-search.page:20(p) msgid "Enable the Find bar by clicking FindShow Find bar." msgstr "OmogoÄite iskalno vrstico s klikom na Najdi
Pokaži iskalno vrstico
." #: C/tag-search.page:24(p) msgid "Drag the tags you wish to search for into the newly-enabled Find bar." msgstr "Povlecite oznake, ki jih želite iskati v novo omogoÄeno iskalno vrstico." #: C/tag-search.page:27(p) msgid "To remove a tag from your search, right-click the tag in the Find bar and click Remove From Search." msgstr "Za odstranitev oznake iz svojega iskanja jo desno kliknite in izberite Odstrani." #: C/tag-search.page:30(p) msgid "To exclude a tag from your search:" msgstr "Za izkljuÄitev oznake iz svojega iskanja:" #: C/tag-search.page:33(p) msgid "In the tag pane, double-click the tag you wish to exclude. This will add it to the Find bar." msgstr "V pladnju oznak dvokliknite oznako, ki jo želite izkljuÄiti. To jo bo dodalo v iskalno vrstico." #: C/tag-search.page:37(p) msgid "In the Find bar, double-click the tag you wish to exclude." msgstr "V iskalni vrstici dvokoliknite oznako, ki jo želite izkljuÄiti." #: C/tag-remove.page:6(desc) msgid "Removing tags from photos" msgstr "Odstranjevanje oznak iz fotografij" #: C/tag-remove.page:9(title) msgid "Removing" msgstr "Odstranjevanje" #: C/tag-remove.page:12(p) msgid "As with attaching tags, there are two main methods of removing tags from photos." msgstr "Tako kot za pripenjanje oznak, sta tudi za odstranjevanje oznak na voljo dva glavna naÄina. " #: C/tag-remove.page:14(p) #: C/tag-creation.page:14(p) #: C/tag-attach.page:15(p) #: C/ratings.page:14(p) msgid "Method One:" msgstr "Prvi naÄin:" #: C/tag-remove.page:17(p) #: C/tag-remove.page:31(p) msgid "Select photos from which to remove a tag." msgstr "Izberite fotografije iz katerih želite odstraniti oznako." #: C/tag-remove.page:20(p) msgid "In the tag pane, select a tag to remove from the photos you have selected." msgstr "V pladnju oznak izberite oznako za odstranitev iz izbranih fotografij." #: C/tag-remove.page:24(p) msgid "Click TagsRemove Tag From Selection." msgstr "Kliknite OznakeOdstrani oznako iz izbora." #: C/tag-remove.page:34(p) #: C/tag-attach.page:35(p) msgid "Right click the photos." msgstr "Desno kliknite fotografije." #: C/tag-remove.page:37(p) msgid "Select Remove Tag and select the tag you wish to remove." msgstr "Izberite Odstrani oznako in izberite oznake, ki jih želite odstraniti." #: C/tag-delete.page:6(desc) msgid "Deleting tags from the system" msgstr "Brisanje oznak s sistema" #: C/tag-delete.page:9(title) msgid "Deleting" msgstr "Brisanje" #: C/tag-delete.page:12(p) msgid "Deleting tags removes them entirely from your system, but leaves behind any photos to which that tag is attached." msgstr "Izbris oznak jih popolnoma izbriÅ¡e z vaÅ¡ega sistema, vendar pusti fotografije s pripetimi oznakami nedotaknjene." #: C/tag-delete.page:14(p) msgid "To delete a tag:" msgstr "Za izbris oznake:" #: C/tag-delete.page:17(p) msgid "Select the tag you wish to delete from within the tag pane." msgstr "V pladnju oznak izberite oznako, ki jo želite izbrisati." #: C/tag-delete.page:20(p) msgid "Click TagsDelete Selected Tag. Alternatively, right click the tag within the pane, and click Delete Tag." msgstr "Kliknite OznakeIzbriÅ¡i izbrano oznako. Dodatno lahko desno kliknete v pladnju in kliknete IzbriÅ¡i oznako." #: C/tag-creation.page:6(desc) msgid "Creating tags to be attached to photos" msgstr "Ustvarjanje oznak za pripenjanje k fotografijam" #: C/tag-creation.page:9(title) msgid "Creating" msgstr "Ustvarjanje" #: C/tag-creation.page:12(p) msgid "In order to use tags, you need to first create a set of tags which you wish to use. There are three main methods to create tags." msgstr "Za uporabo oznak jih morate najprej ustvariti. Za ustvarjanje oznak so na voljo trije glavni naÄini." #: C/tag-creation.page:17(p) msgid "Select TagsCreate New Tag...." msgstr "Izberite OznakeUstari novo oznako ...." #: C/tag-creation.page:21(p) #: C/tag-creation.page:39(p) #: C/tag-creation.page:61(p) msgid "Select a parent tag for the new tag to appear under, such as people or events. If you wish to create a new tag without a parent, select (None)." msgstr "Izberite nadrejeno oznako pod katero naj se pojavi nova oznaka kot so na primer ljudje ali dogodki. V primeru, da želite ustvariti oznako brez nadrejenega predmeta, izberite (Brez)." #: C/tag-creation.page:26(p) #: C/tag-creation.page:44(p) #: C/tag-creation.page:66(p) msgid "Name the tag." msgstr "Poimenujte oznako." #: C/tag-creation.page:29(p) #: C/tag-creation.page:47(p) #: C/tag-creation.page:69(p) msgid "Click Create" msgstr "Kliknite Ustvari" #: C/tag-creation.page:35(p) msgid "In the tags page, right click, and select Create New Tag..." msgstr " Desno kliknite v pladnju oznak in izberite Ustvari novo oznako ..." #: C/tag-creation.page:50(p) msgid "Method three has the advantage of also attaching the new tag to the photos selected. To do this:" msgstr "Tretji naÄin omogoÄa tudi pripenjanje nove oznake izbranim fotografijam. To storite tako:" #: C/tag-creation.page:54(p) msgid "Select the photos to which you wish to attach the new tag." msgstr "Izberite fotografije katerim želite dodati novo oznako." #: C/tag-creation.page:57(p) msgid "Right-click on the photos, and select Attach TagCreate New Tag...." msgstr "Desno kliknite na fotografije in izberite Pripni oznakoUstvari novo oznako ...." #: C/tag-attach.page:6(desc) msgid "Attaching tags to photos" msgstr "Pripenjanje oznak fotografijam" #: C/tag-attach.page:9(title) msgid "Attaching" msgstr "Pripenjanje" #: C/tag-attach.page:12(p) msgid "By attaching tags you have created you make it easier to search through your photos. As with creating tags, there is more than one method of attaching tags to photos." msgstr "S pripenjanjem oznak, ki ste jih ustvarili, si boste olajÅ¡ali iskanje po svojih fotografijah. To kot z ustvarjanjem oznak je za pripenjanje oznak fotografijam na voljo veÄ naÄinov." #: C/tag-attach.page:18(p) #: C/tag-attach.page:32(p) msgid "Select photos to which to attach a tag." msgstr "Izberite fotografije katerim želite pripeti oznake." #: C/tag-attach.page:21(p) msgid "In the tag pane, select a tag to attach to the photos you have selected." msgstr "V pladnju oznak izberite oznako za pripenjanje k izbranim fotografijam." #: C/tag-attach.page:25(p) msgid "Click TagsAttach Tag to Selection. Alternatively, press Ctrl+T." msgstr "Kliknite OznakePripni oznako izboru. Namesto tega lahko pritisnete Ctrl+T." #: C/tag-attach.page:38(p) msgid "Select Attach Tag and select the tag you wish to attach." msgstr "Izberite Pripni oznako in izberite oznako, ki jo želite pripeti." #: C/smugmug.page:8(desc) msgid "Upload photos to SmugMug" msgstr "PoÅ¡iljanje fotografij na SmugMug" #: C/smugmug.page:11(title) msgid "SmugMug" msgstr "SmugMug" #: C/smugmug.page:15(p) msgid "To upload photos to SmugMug you will need a SmugMug account, as well as internet access. Also, the SmugMug extension must be installed and enabled." msgstr "Za poÅ¡iljanje fotografij na SmugMug boste potrebovali raÄun SmugMug in interneti dostop. Poleg tega mora biti razÅ¡iritev SmugMug nameÅ¡Äena in omogoÄena." #: C/ratings.page:6(desc) msgid "Rate your photos from one to five stars" msgstr "Ocenite svoje fotografije z eno do pet zvezdic" #: C/ratings.page:9(title) msgid "Rating your photos" msgstr "Ocenjevanje vaÅ¡ih fotografij" #: C/ratings.page:12(p) msgid "F-Spot allows you to rate your photos from one to five stars. There are two ways to rate photos." msgstr "F-Spot vam omogoÄa ocenjevanj svojih fotografij z eno do pet zvezdic. Za ocenjevanje fotografij sta na voljo dva naÄina." #: C/ratings.page:17(p) msgid "By double-clicking, select the photo you wish to rate." msgstr "Z dvoklikom izberite fotografijo, ki jo želite oceniti." #: C/ratings.page:20(p) msgid "In the lower-right corner, you will see five dots, corresponding to the rating you wish to give; to give a rating of one star, for example, click the first dot." msgstr "V spodnjem desnem kotu boste videli pet pikic, ki ustrezajo vaÅ¡i oceni. Za oceno ena zvezdica kliknite na prvo piko." #: C/ratings.page:28(p) msgid "Select the photo(s) you wish to rate." msgstr "Izberite fotografij-o/e, ki jih želite oceniti." #: C/ratings.page:31(p) msgid "Right-click the photo(s) you wish to rate, and select a rating at the bottom of the right-click menu by clicking the corresponding dot." msgstr "Desno kliknite fotografij-o/e, ki j-o/ih želite oceniti. Nato s klikom na ustrezno piko na dnu menija desnega klika izberite oceno." #: C/rate-search.page:8(desc) msgid "Search photos by star rating" msgstr "IÅ¡Äite fotografije po oceni zvezdic" #: C/rate-search.page:11(title) msgid "Search by Rating" msgstr "Iskanje po ocenah" #: C/rate-search.page:15(p) msgid "To search by rating:" msgstr "Za iskanje po ocenah:" #: C/rate-search.page:18(p) msgid "Select FindBy RatingSet Rating Filter...." msgstr "Izberite NajdiPo oceniIzbor filtra ocen ...." #: C/rate-search.page:22(p) msgid "Select the rating range which you wish to view." msgstr "Izberite si obseg ocen, ki ga želite videti." #: C/rate-search.page:25(p) #: C/extensions.page:39(p) #: C/extensions.page:82(p) #: C/date-search.page:27(p) msgid "Click Ok." msgstr "Kliknite V redu." #: C/rate-search.page:28(p) msgid "To stop searching by rating:" msgstr "Za zaustavitev iskanja po ocenah:" #: C/rate-search.page:31(p) msgid "Select FindBy RatingSet Rating Filter." msgstr "Izberite NajdiPo oceniNastavi filter ocen." #: C/picasa.page:8(desc) msgid "Upload photos to Google's PicasaWeb" msgstr "PoÅ¡iljanje fotografij na Google-ov PicasaWeb" #: C/picasa.page:11(title) msgid "Picasa" msgstr "Picasa" #: C/picasa.page:15(p) msgid "To upload photos to Picasa you will need a Picasa account, as well as internet access. Also, the PicasaWeb extension must be installed and enabled." msgstr "Za poÅ¡iljanje fotografij na Picasa boste potrebovali raÄun Picasa in internetni dostop. Poleg tega mora biti link xref=\"extensions\">razÅ¡iritev PicasaWeb nameÅ¡Äena in omogoÄena." #: C/picasa.page:21(p) msgid "Select the photos you wish to upload." msgstr "Izberite fotografije, ki jih želite poslati." #: C/picasa.page:24(p) msgid "Click PhotoExport ToPicasaWeb...." msgstr "Kliknite FotografijaIzvozi vPicasaWeb ...." #: C/picasa.page:28(p) msgid "Add a gallery by clicking Add and supplying a username and password." msgstr "Dodajte galerijo s klikom na Dodaj in vpisom uporabniÅ¡kega imena in gesla." #: C/picasa.page:32(p) msgid "Select a gallery to export to, or click Add to create a new gallery." msgstr "Izberite galerijo za izvoz ali kliknite Dodaj za ustvarjanje nove galerije." #: C/picasa.page:36(p) #: C/folder.page:39(p) msgid "Click Export." msgstr "Kliknite Izvoz." #: C/picasa.page:19(steps) msgid "j " msgstr "j " #: C/introduction.page:6(desc) msgid "A brief introduction to F-Spot" msgstr "Kratek uvod v F-Spot" #: C/introduction.page:9(title) msgid "Introduction" msgstr "Uvod" #: C/introduction.page:12(p) msgid "F-Spot is a full-featured photo manager for the GNOME Desktop, allowing you to tag, rate, and date photos, edit photo metadata, and even includes a simple in-program photo editor." msgstr "F-Spot je polno zmogljiv upravljalnik fotografij za namizje GNOME. OmogoÄa vam oznako, oceno in datiranje fotografij, urejanje metapodatkov fotografij in vkljuÄuje celo majhen vgrajen urejevalnik fotografij." #: C/introduction.page:15(p) msgid "For help getting started using F-Spot, check out the basic functions of the help file." msgstr "Za pomoÄ pri zaÄetku uporabe F-Spot si oglejte osnovne zmožnosti v datoteki pomoÄi." #: C/index.page:7(title) #: C/index.page:8(title) #: C/index.page:11(title) msgid "F-Spot photo manager" msgstr "F-spot upravljalnik fotografij" #: C/index.page:16(title) msgid "Basic Functions" msgstr "Osnovne zmožnosti" #: C/index.page:20(title) msgid "Searching" msgstr "Iskanje" #: C/index.page:24(title) msgid "Photo Editing" msgstr "Urejanje fotografij" #: C/index.page:28(title) msgid "Sharing" msgstr "Souporaba" #: C/index.page:32(title) msgid "Advanced Options" msgstr "Napredne možnosti" #: C/import-roll-search.page:8(desc) msgid "Searching by date of import" msgstr "Iskanje po datumu uvoza" #: C/import-roll-search.page:11(title) msgid "Search by Import Roll" msgstr "Iskanje po uvoznem zvitku" #: C/import-roll-search.page:15(p) msgid "Import rolls are \"batches\" of imported photos. Regardless of the date the photo was taken, the import roll timestamp is decided when you import photos." msgstr "Uvozni zvitki so \"paketi\" uvoženih fotografij. Ne glede na datum zajema fotografije je Äasovni žig uvoznega zvitka doloÄen ob uvozu fotografij." #: C/import-roll-search.page:18(p) msgid "To search by latest import roll:" msgstr "Za iskanje po zadnjem uvoznem zvitku:" #: C/import-roll-search.page:21(p) msgid "Select FindBy Import RollLast Import Roll." msgstr "Izberite IÅ¡ÄiPo uvoznem zvitkuZadnji uvozni zvitek." #: C/import-roll-search.page:25(p) msgid "To select a previous import roll:" msgstr "Za izbiro predhodnega uvoznega zvitka:" #: C/import-roll-search.page:28(p) msgid "Select FindBy Import RollSelect Import Rolls." msgstr "Izberite IÅ¡ÄiPo uvoznem zvitkuIzberi uvozne zvitke." #: C/import-roll-search.page:32(p) msgid "Select an import roll to search, or select a range by choosing Between and select the dates you wish to include." msgstr "Izberite uvozni zvitek za iskanje ali izberite obseg z izbiro Vmes in izberite datume, ki jih želite vkljuÄiti." #: C/import-roll-search.page:36(p) msgid "To stop searching by import rolls, select FindBy Import RollClear Roll Filter." msgstr "Za zaustavitev iskanja po uvoznih zvitkih izberite NajdiPo uvoznem zvitkuPoÄisti uvozni zvitek." #: C/import-photos.page:6(desc) msgid "Import photos to be managed" msgstr "Uvažanje fotografij za upravljanje" #: C/import-photos.page:9(title) msgid "Importing Photos" msgstr "Uvažanje fotografij" #: C/import-photos.page:12(p) msgid "Chances are, the first thing you will want to do is import photos." msgstr "Verjetno boste najprej želeli uvoziti fotografije." #: C/import-photos.page:15(p) msgid "To import photos:" msgstr "Za uvoz fotografij:" #: C/import-photos.page:20(p) msgid "Select PhotoImport.... Alternatively, click the Import button." msgstr "Izberite FotografijaUvozi .... Dodatno lahko kliknete gumb Uvozi." #: C/import-photos.page:24(p) msgid "Select a source from which to import, such as a device or a folder." msgstr "Izberite vir iz katerega želite uvažati kot je naprava ali mapa." #: C/import-photos.page:27(p) msgid "It may take a while for F-Spot to index the files. When it is done indexing, your photos will be presented to you. At this time, you can attach tags to all photos, or you can leave that task for later." msgstr "F-Spot bo morda rabil nekaj Äasa za pripravo kazala fotografij. Ko bo program konÄal s pripravo kazala, vam bo kazalo predstavljeno. Takrat lahko vsem fotografijam pripnete oznake ali pa to storite kasneje." #: C/import-photos.page:33(p) msgid "When you are ready to finish importing photos, click Import." msgstr "Ko ste pripravljeni na konec uvažanja fotografij kliknite Uvoz." #: C/general-editing.page:6(desc) msgid "Make simple edits to your photos" msgstr "Opravite majhna urejanja svojih fotografij" #: C/general-editing.page:9(title) msgid "General Editing" msgstr "SploÅ¡no urejanje" #: C/general-editing.page:13(p) msgid "F-Spot allows you to make simple general edits, including straightening, cropping, and rotating your photos." msgstr "F-Spot vam omogoÄa enostavna sploÅ¡na urejanja, vkljuÄno s poravnavo obrezovanjem in vrtenjem vaÅ¡ih fotografij." #: C/general-editing.page:15(p) msgid "There are three ways to rotate a selected photo:" msgstr "Za vrtenje izbrane fotografije so na voljo trije naÄini:" #: C/general-editing.page:18(p) msgid "Click the appropriate rotate button, to the right of the import button." msgstr "Kliknite primeren gumb vrtenja desno od gumba uvoza." #: C/general-editing.page:22(p) msgid "Select the appropriate option from within the Edit menu." msgstr "Izberite primerno možnost v meniju Uredi." #: C/general-editing.page:26(p) msgid "Use the bracket keys to rotate the photo." msgstr "Uporabite tipke oklepaja za vrtenje fotografije." #: C/general-editing.page:29(p) msgid "To straighten a selected photo:" msgstr "Za poravnavo izbrane fotografije:" #: C/general-editing.page:32(p) msgid "From within the editing pane, select Straighten." msgstr "V pladnju urejanja izberite Poravnaj." #: C/general-editing.page:35(p) msgid "Select a rotation, ranging from -45 to 45 degrees." msgstr "Izberite vrtenje med -45 do 45 stopinjami." #: C/general-editing.page:38(p) msgid "Click Straighten." msgstr "Kliknite Poravnaj." #: C/general-editing.page:41(p) msgid "To crop a selected photo:" msgstr "Za obrez izbrane fotografije:" #: C/general-editing.page:44(p) msgid "Click the Crop button in the Edit pane." msgstr "Kliknite gumb Obreži v pladnju Uredi." #: C/general-editing.page:47(p) msgid "Select a contraining aspect ratio, that is, a proportion of height to width to which the new photo must fit. Examples of contraining aspect ratios include 4x3, 4x6, and 5x7." msgstr "Izberite razmerje velikosti to je razmerje med Å¡irino in dolžino kateremu se mora prilegati nova fotografija. Primeri razmerij velikosti so 4x3, 4x6 in 5x7." #: C/general-editing.page:52(p) msgid "Click and drag to select the desired area to keep. This box can be dragged around after being sized." msgstr "Kliknite in povlecite za izbiro podroÄja, ki ga želite obdržati. Polje lahko po spremembi velikosti vleÄete naokoli." #: C/general-editing.page:56(p) msgid "When you have selected your area to crop to, click Crop." msgstr "Ko ste izbrali podroÄje za obrez, kliknite Obreži." #: C/folder.page:8(desc) msgid "Send photos to a folder" msgstr "PoÅ¡iljanje fotografij v mapo" #: C/folder.page:11(title) msgid "Folder Export" msgstr "Izvoz mape" #: C/folder.page:15(p) msgid "F-Spot allows you to export to a folder. In order to do so, however, you will need to have the folder export extension installed and enabled." msgstr "F-Spot vam omogoÄa izvoz v mapo. Da lahko to storite, boste morali imeti razÅ¡iritev izvoza v mapo nameÅ¡Äeno in omogoÄeno." #: C/folder.page:18(p) msgid "To export selected photos to a folder:" msgstr "Za izvoz izbranih fotografij v mapo:" #: C/folder.page:21(p) msgid "Select PhotoExport ToFolder...." msgstr "Izberite FotografijaIzvozi vMapa ...." #: C/folder.page:25(p) msgid "Select a folder." msgstr "Izberite mapo." #: C/folder.page:28(p) msgid "Name the gallery and give it a description." msgstr "Poimenujte galerijo in ji dodajte opis." #: C/folder.page:31(p) msgid "Select an export method. Create Standalone Web Gallery will create a folder with contents fit to be uploaded to a web server to present pictures in a gallery. Save the files only will only move photos to the selected folder. Create gallery using \"Original\" will create a folder with contents suitable for using with Original Photo Gallery." msgstr "Izberite naÄin izvoza. Ustvari samostojno spletno galerijo bo ustvaril mapo z vsebino, pripravljeno za poÅ¡iljanje na spletni strežnik za predstavitev slik v galeriji. Shrani le datoteke fotografije le premakne v izbrano mapo. Ustvari galerijo z \"Izvirno\" bo ustvarilo mapo z vsebino, primerno za uporabo z Izvirno galerijo fotografij." #: C/flickr.page:8(desc) msgid "Upload photos to Flickr" msgstr "PoÅ¡iljanje fotografij na Flickr" #: C/flickr.page:11(title) msgid "Flickr" msgstr "Flickr" #: C/flickr.page:15(p) msgid "To upload photos to Flickr you will need a Flickr account, as well as internet access. Also, the Flickr extension must be installed and enabled." msgstr "Za poÅ¡iljanje fotografij na Flick boste potrebovali raÄun Flickr in internetni dostop. Poleg tega mora biti razÅ¡iritev Flickr nameÅ¡Äena in omogoÄena." #: C/file-management.page:8(desc) msgid "Manage files already imported" msgstr "Upravljanje že uvoženih slik" #: C/file-management.page:11(title) msgid "File Management" msgstr "Upravljanje datotek" #: C/file-management.page:15(p) msgid "F-Spot allows for some control over the contents of your catalog, that is, removing files from your catalog as well as deleting files from your catalog." msgstr "F-Spot omogoÄa nekaj nadzora nad vsebino kataloga, to je možnost odstranjevanja ali izbrisa datotek iz vaÅ¡ega kataloga." #: C/file-management.page:18(p) msgid "To remove files from your catalog:" msgstr "Za odstranitev datotek iz kataloga:" #: C/file-management.page:21(p) msgid "Select the photos you wish to remove from the catalog." msgstr "Izberite fotografije, ki jih želite odstraniti iz kataloga." #: C/file-management.page:24(p) msgid "Right-click the photos, select Remove From Catalog. Alternatively, select EditRemove From Catalog or press the Delete key on your keyboard." msgstr "Desno kliknite na fotografije in izberite Odstrani iz kataloga. Dodatno lahko izberete UrediOdstrani iz kataloga ali pritisnete tipko IzbriÅ¡i na svoji tipkovnici." #: C/file-management.page:29(p) msgid "To delete photos from your computer:" msgstr "Za izbris fotografij s svojega raÄunalnika:" #: C/file-management.page:32(p) msgid "Select the photos you wish to delete." msgstr "Izberite fotografije, ki jih želite izbrisati." #: C/file-management.page:35(p) msgid "Right-click the photos, select Delete From Drive. Alternatively, select EditDelete From Drive or press Shift+Delete on your keyboard." msgstr "Desno kliknite na fotografije in izberite IzbriÅ¡i s pogona. Dodatno lahko na izberete UrediIzbriÅ¡i s pogona ali na svoji tipkovnici pritisnete Shift+IzbriÅ¡i." #: C/facebook.page:8(desc) msgid "Upload photos to Facebook" msgstr "PoÅ¡iljanje fotografij na Facebook" #: C/facebook.page:11(title) msgid "Facebook" msgstr "Facebook" #: C/facebook.page:15(p) msgid "To upload photos to Facebook you will need a Facebook account, as well as internet access. Also, the Facebook extension must be installed and enabled." msgstr "Za poÅ¡iljanje fotografij na Facebook boste potrebovali raÄun Facebook in internetni dostop. Poleg tega mora biti razÅ¡iritev Facebook nameÅ¡Äena in omogoÄena." #: C/facebook.page:20(p) msgid "To post selected photos to Facebook:" msgstr "Za objavo izbranih fotografij na Facebooku:" #: C/facebook.page:23(p) msgid "Select PhotoExport ToFacebook." msgstr "Izberite FotografijaIzvozi vFacebook." #: C/facebook.page:27(p) msgid "Click Login. A browser window will be brought up. Log in to Facebook and click \"Allow\" to allow F-Spot access to your Facebook profile." msgstr "Kliknite Prijava. Odprlo se bo okno brskalnika. Prijavite se v Facebook in kliknite \"Dovoli\" za omogoÄitev dostopa F-Spot-u do svojega profila Facebook." #: C/facebook.page:32(p) msgid "Select whether to create a new album or add to an existing album. If you are creating a new album, fill in the relevant information." msgstr "Izberite ali želite ustvariti nov album ali dodati slike k obstojeÄemu albumu. V primeru, da ustvarjajte nov album, izpolnite vse pomembne podatke." #: C/facebook.page:36(p) msgid "Edit captions for each photo, if so desired." msgstr "Uredite naslove za vsako fotografije, Äe tako želite." #: C/facebook.page:39(p) msgid "When finished, click Add." msgstr "Ko boste konÄali, kliknite Dodaj." #: C/extensions.page:8(desc) msgid "Working with F-Spot extensions" msgstr "Delo z razÅ¡iritvami F-Spot" #: C/extensions.page:11(title) msgid "Extensions" msgstr "RazÅ¡iritve" #: C/extensions.page:15(p) msgid "F-Spot allows for the use of extensions to provide additional functionality." msgstr "F-Spot omogoÄa uporabo razÅ¡iritev, ki zagotavljajo dodatne zmožnsti." #: C/extensions.page:18(p) msgid "To open the extension manager, select EditManage Extensions." msgstr "Za odprtje upravljalnika razÅ¡iritev izberite UrediUpravljanje razÅ¡iritev." #: C/extensions.page:21(p) msgid "To install extensions:" msgstr "Za namestitev vstavkov:" #: C/extensions.page:24(p) #: C/extensions.page:46(p) #: C/extensions.page:58(p) #: C/extensions.page:70(p) msgid "Open the extension manager." msgstr "Odprite upravljalnika razÅ¡iritev." #: C/extensions.page:27(p) msgid "Click Install Add-ins." msgstr "Kliknite Namesti vstavke." #: C/extensions.page:30(p) msgid "Select an add-on to install from the list." msgstr "Izberite vstavek za namestitev s seznama." #: C/extensions.page:33(p) #: C/extensions.page:79(p) msgid "Click Forward." msgstr "Kliknite Naprej." #: C/extensions.page:36(p) msgid "Verify all information, and click Forward again." msgstr "Preverite vse podatke in znva kliknite Naprej." #: C/extensions.page:43(p) msgid "To enable plugins that are already installed:" msgstr "Za omogoÄenje vstavkov, ki so že nameÅ¡Äeni:" #: C/extensions.page:49(p) msgid "Select the extension you wish to enable." msgstr "Izberite razÅ¡iritev, ki jo želite omogoÄiti." #: C/extensions.page:52(p) msgid "Click Enable." msgstr "Kliknite OmogoÄi." #: C/extensions.page:55(p) msgid "To disable plugins that are installed:" msgstr "Za onemogoÄenje nameÅ¡Äenih vstavkov:" #: C/extensions.page:61(p) msgid "Select the extension you wish to disable." msgstr "Izberite razÅ¡iritev, ki jo želite onemogoÄiti." #: C/extensions.page:64(p) msgid "Click Disable." msgstr "Kliknite OnemogoÄi." #: C/extensions.page:67(p) msgid "To uninstall plugins:" msgstr "Za odstranitev vstavkov:" #: C/extensions.page:73(p) msgid "Select the extension you wish to uninstall." msgstr "Izberite razÅ¡iritev, ki jo želite odstraniti." #: C/extensions.page:76(p) msgid "Click Uninstall." msgstr "Kliknite Odstrani." #: C/enhancements.page:6(desc) msgid "Simple enhancements for your photos" msgstr "Enostavne izboljÅ¡ave za vaÅ¡e fotograije" #: C/enhancements.page:9(title) msgid "Enhancements" msgstr "IzboljÅ¡ave" #: C/enhancements.page:13(p) msgid "Currently, there are two main enhancements that F-Spot supports: red-eye removal and the automatic enhancement of color." msgstr "Trenutno F-Spot podpira dve glavni izboljÅ¡avi: odstranitev rdeÄih oÄi in samodejno izboljÅ¡evanje barve." #: C/enhancements.page:15(p) msgid "To remove red-eye:" msgstr "Za odstranitev rdeÄih oÄi:" #: C/enhancements.page:18(p) msgid "By double-clicking, select the photo on which you wish to use the red-eye removal tool." msgstr "Z dvoklikom izberite fotografijo, na kateri želite uporabiti orodje odstranjevanja rdeÄih oÄi" #: C/enhancements.page:22(p) msgid "Click Red-Eye Removal in the Edit panel." msgstr "V pladnju Uredi kliknite Odstranitev rdeÄih oÄi." #: C/enhancements.page:25(p) msgid "Select the area from which you wish to remove red-eye. Note: If the contains many red areas, you may wish to select each eye individually." msgstr "Izberite podroÄje iz katerega želite odstraniti rdeÄe oko. V primeru da ima slika veÄ rdeÄih oÄi, priporoÄamo izbiro posameznih rdeÄih oÄi." #: C/enhancements.page:30(p) msgid "Click Fix!." msgstr "Kliknite Popravi!." #: C/enhancements.page:33(p) msgid "To automatically enhance the colors of the photo:" msgstr "Za samodejno izboljÅ¡anje barv fotografije:" #: C/enhancements.page:36(p) msgid "By double-clicking, select the photo which you wish to enhance." msgstr "Z dvoklikom izberite fotografijo, ki jo želite izboljÅ¡ati." #: C/enhancements.page:39(p) msgid "Click Auto Color." msgstr "Kliknite Samodejna barva." #: C/date-search.page:8(desc) msgid "Search photos by date" msgstr "Iskanje fotografij po datumu" #: C/date-search.page:11(title) msgid "Search by Date" msgstr "Iskanje po datumu" #: C/date-search.page:15(p) msgid "To search by date:" msgstr "Za iskanje po datumu:" #: C/date-search.page:18(p) msgid "Select FindBy DateSet Date Range...." msgstr "Izberite IÅ¡ÄiPo datumuNastavi obseg datumov ...." #: C/date-search.page:22(p) msgid "Select a time period to from which to view photos. This can by done by selecting a set period, such as a week, or by specifying dates." msgstr "Izberite Äasovno obdobje za ogled fotografij. To lahko storite z izbiro nastavljenega obdobja, kot je na primer teden, ali z doloÄitvijo datumov." #: C/date-search.page:30(p) msgid "Alternatively, you can use the timeline. To use the timeline:" msgstr "Dodatno lahko uporabite Äasovnico. Za uporabo Äasovnice:" #: C/date-search.page:33(p) msgid "Make sure the timeline is enabled by selecting ViewComponents and making sure that Timeline is checked." msgstr "OmogoÄite Äasovnico tako, da izberete PogledSestavni deli in obkljukajte polje ÄŒasovnica." #: C/date-search.page:38(p) msgid "In the timeline, click the bar corresponding to the time period you wish to look at." msgstr "V Äasovnici kliknite na vrstico, ki ustreza Äasovnemu obmoÄju, ki si ga želite ogledati." #: C/date-search.page:42(p) msgid "To stop searching by date:" msgstr "Za konÄanje iskanje po datumu" #: C/date-search.page:45(p) msgid "Select FindBy DateClear Date Range." msgstr "Izberite IÅ¡ÄiPo datumuPoÄisti obseg datumov." #: C/colors.page:6(desc) msgid "Edit the colors of your photos" msgstr "Urejajte barve svojih fotografij" #: C/colors.page:9(title) msgid "Color Editing" msgstr "Urejanje barv" #: C/colors.page:12(p) msgid "F-Spot supports several modes of color manipulation." msgstr "F-Spot podpira veÄ naÄinov upravljanja barv." #: C/colors.page:15(title) msgid "Desaturate" msgstr "ZmanjÅ¡aj nasiÄenje" #: C/colors.page:16(p) msgid "This mode eliminates all saturation, turning a color image into a black and white image." msgstr "Ta naÄin odstrani vse nasiÄenje in barvno sliko spremeni v Ärno-belo sliko." #: C/colors.page:20(title) msgid "Sepia Tone" msgstr "Sepia uÄinek staranja" #: C/colors.page:21(p) msgid "This mode simulates a photo being created with sepia toner." msgstr "Ta naÄin simulira fotografijo, ustvarjeno z uÄinkom staranja. " #: C/colors.page:24(title) msgid "Auto Color" msgstr "Samodejna barva" #: C/colors.page:25(p) msgid "This mode automatically adjusts the colors to a set profile." msgstr "Ta naÄin samodejno prilagodi barve na nastavljen profil." #: C/cd.page:8(desc) msgid "Burn photos to a CD" msgstr "ZapiÅ¡i fotografije na CD" #: C/cd.page:11(title) msgid "CD Export" msgstr "Izvoz na CD" #: C/adjust-color.page:6(desc) msgid "Adjusting the colors of a photo" msgstr "Prilagajanje barv fotografije" #: C/adjust-color.page:9(title) msgid "Adjust Color" msgstr "Prilagodi barvo" #: C/adjust-color.page:12(p) msgid "As far as the editing tools in F-Spot, adjusting the color is easily the most powerful. The color editor allows you to adjust:" msgstr "Med orodji urejanja v F-Spot-u je prilagajanje barv daleÄ najzmogljivejÅ¡e. Urejevalnik barv vam omogoÄa prilagoditev:" #: C/adjust-color.page:16(title) msgid "Exposure" msgstr "Osvetljenost" #: C/adjust-color.page:17(p) msgid "This adjustment simulates lengthening or shortening the exposure time." msgstr "Ta prilagoditev simulira podaljÅ¡anje ali skrajÅ¡anje osvetljenosti." #: C/adjust-color.page:21(title) msgid "Saturation" msgstr "NasiÄenost" #: C/adjust-color.page:22(p) msgid "This adjustment simulates adjusting the amount of color in the image, i.e. sliding it to the left decrease color, making it black and white, while sliding it to the right will increase the vibrancy of colors." msgstr "Ta prilagodite simulira prilagajanje koliÄine barv na sliki, drsanje na levo zmanjÅ¡ava barve in jo naredi Ärno-belo, drsanje na desno bo poveÄalo živahnost barv." #: C/adjust-color.page:28(title) msgid "Brightness" msgstr "Svetlost" #: C/adjust-color.page:29(p) msgid "This adjustment increase the brightness of colors. Increasing this too much will make colors appear \"washed out\", while decreasing it too much will make the image too dark and lacking in contrast." msgstr "Ta prilagoditev poveÄa svetlost barv. Prevelika svetlost bo povzroÄila \"spranost\" barv, premajhna pa bo povzroÄila temno sliko z majhnih kontrastom." #: C/adjust-color.page:34(title) msgid "Hue" msgstr "Odtenek" #: C/adjust-color.page:35(p) msgid "This adjustment causes colors to \"rotate\" along the color wheel." msgstr "Ta prilagoditev barve \"zavrti\" po barvnem kolescu." #: C/adjust-color.page:38(title) msgid "Contrast" msgstr "Kontrast" #: C/adjust-color.page:39(p) msgid "This adjustment adjusts the contrast ratio, that is, the ratio of difference between dark and light pixels. Sliding to the left decreases contrast, while sliding to the right will increase contrast." msgstr "Ta prilagoditev prilagodi razmerje kontrasta, razlike med temnimi in svetlimi toÄkami. Drsenje na levo kontrast zmanjÅ¡a, drsenje na desno pa poveÄa." #: C/adjust-color.page:45(title) msgid "Temp" msgstr "Temp" #: C/adjust-color.page:46(p) msgid "This adjust changes the color temperature, measured in degrees Kelvin." msgstr "Ta možnost prilagodi temperaturo barve merjeno v Kelvinih." #: C/adjust-color.page:50(title) msgid "Tint" msgstr "ÄŒrnilo" #: C/adjust-color.page:51(p) msgid "This adjustment allows you to tinge the photo with a color." msgstr "Ta prilagoditev vam omogoÄa dodajanje pridiha barve fotografijam." #: C/23hq.page:8(desc) msgid "Upload photos to 23hq" msgstr "PoÅ¡iljanje fotografij na 23hq" #: C/23hq.page:11(title) msgid "23hq" msgstr "23hq" #: C/23hq.page:15(p) msgid "To upload photos to 23hq you will need a 23hq account, as well as internet access. Also, the 23hq extension must be installed and enabled." msgstr "Za poÅ¡iljanje fotografij na 23hq boste potrebovali raÄun 23hq in internetni dostop. Poleg tega mora biti razÅ¡iritev 23hq nameÅ¡Äena in omogoÄena." #. Put one translator per line, in the form of NAME , YEAR1, YEAR2 #: C/index.page:0(None) msgid "translator-credits" msgstr "Andrej ŽnidarÅ¡iÄ " #~ msgid "" #~ "@@image: 'figures/f-spot-crop.png'; md5=63e18c96702aea4701024837a13ae2d9" #~ msgstr "a" #~ msgid "" #~ "@@image: 'figures/f-spot-straighten.png'; " #~ "md5=ceeff0cac633d06599fa5760cc4bc568" #~ msgstr "a" #~ msgid "" #~ "@@image: 'figures/f-spot-adjust-colors.png'; " #~ "md5=6a5d9eaaaaf238ccbf70552bc073898c" #~ msgstr "a" #~ msgid "" #~ "@@image: 'figures/f-spot-autocolor.png'; " #~ "md5=240c4a86c95c9507755fe790bef0e24a" #~ msgstr "a" #~ msgid "" #~ "@@image: 'figures/f-spot-desaturate.png'; " #~ "md5=fa54dfd08171658d720be71b6d367139" #~ msgstr "a" #~ msgid "" #~ "@@image: 'figures/f-spot-sepia.png'; md5=154d6e34903664dbd776f2bef405ce91" #~ msgstr "a" #~ msgid "" #~ "@@image: 'figures/f-spot-red-eye.png'; " #~ "md5=743d0a2ccc9b2fa8fa314855c225cd31" #~ msgstr "a" #~ msgid "" #~ "@@image: 'figures/f-spot-soft-focus.png'; " #~ "md5=14d1437ce49c83f3ebbcf70b7047ffbe" #~ msgstr "a" #~ msgid "" #~ "@@image: 'figures/f-spot-fullscreen.png'; " #~ "md5=86040e20ebf1015f6489a56e9589f063" #~ msgstr "a" #~ msgid "" #~ "@@image: 'figures/f-spot-slideshow.png'; " #~ "md5=84a69bc3bb7a1b8d04c967d3a66e6f23" #~ msgstr "a" #~ msgid "The F-Spot Manual" #~ msgstr "F-Spot priroÄnik" #~ msgid "This is the user manual for F-Spot, a GNOME personal photo manager." #~ msgstr "" #~ "To je uporabniÅ¡ki priroÄnik za F-Spot, GNOME upravljalnik fotografij" #~ msgid "2007-2009" #~ msgstr "2007-2009" #~ msgid "Aaron Bockover, Gabriel Burt, Miguel de Icaza, Bengt Thuree" #~ msgstr "Aaron Bockover, Gabriel Burt, Miguel de Icaza, Bengt Thuree" #~ msgid "GNOME Documentation Project" #~ msgstr "GNOME projekt dokumentacije" #~ msgid "Miguel" #~ msgstr "Miguel" #~ msgid "de Icaza" #~ msgstr "de Icaza" #~ msgid "Aaron" #~ msgstr "Aaron" #~ msgid "Bockover" #~ msgstr "Bockover" #~ msgid "Bengt" #~ msgstr "Bengt" #~ msgid "Thuree" #~ msgstr "Thuree" #~ msgid "Gabriel" #~ msgstr "Gabriel" #~ msgid "Burt" #~ msgstr "Burt" #~ msgid "Alexandre" #~ msgstr "Alexandre" #~ msgid "Prokoudine" #~ msgstr "Prokoudine" #~ msgid "Stephane" #~ msgstr "Stephane" #~ msgid "Delcroix" #~ msgstr "Delcroix" #~ msgid "0.5" #~ msgstr "0,5" #~ msgid "2008-09-25" #~ msgstr "2008-09-25" #~ msgid "0.4" #~ msgstr "0,4" #~ msgid "2008-09-12" #~ msgstr "2008-09-12" #~ msgid "0.3" #~ msgstr "0,3" #~ msgid "2007-07-26" #~ msgstr "26-07-2007" #~ msgid "Organizing your photos" #~ msgstr "Organizacija vaÅ¡ih fotografij" #~ msgid "Import" #~ msgstr "Uvažanje" #~ msgid "" #~ "You can import photos from your hard drive or your camera. When you " #~ "import your photos into F-Spot from your camera, it will always make a " #~ "copy of them, leaving you free to clear your camera's memory. By default, " #~ "F-Spot will make a copy of photos imported from your hard drive. Uncheck " #~ "the Copy option on the import dialog or hold " #~ "Shift when dragging photos into F-Spot if you do not " #~ "wish to copy them from your hard drive." #~ msgstr "" #~ "Fotografije lahko uvozite s trdega diska ali fotoaparata. V primeru uvoza " #~ "fotografij v F-Spot s fotoaparata, bo F-Spot vedno naredil njihovo kopijo " #~ "in vam omogoÄil ÄiÅ¡Äenje pomnilnika vaÅ¡ega fotoaparata. Privzeto F-Spot " #~ "naredi kopijo fotografij uvoženih s trdega diska. V primeru da datotek ne " #~ "želite kopirati s trdega diska, odkljukajte možnost Kopiranje " #~ "datotek v mapo fotografij v pogovornem oknu uvoza ali pa med " #~ "vleÄenjem fotografij v F-Spot držite tipko Dvigalka." #~ msgid "" #~ "By default, F-Spot copies your photos to the ~/Photos folder. You can change the folder F-Spot uses in " #~ "Preferences dialog (EditPreferences). You can " #~ "also disable physical copying of images to that directory and make F-Spot " #~ "only reference to existing files. For that you need to disable checkbox " #~ "Copy files to the Photos folder." #~ msgstr "" #~ "Privzeto F-Spot kopira vaÅ¡e fotografije v mapo ~/Slike. Mapo, ki jo uporablja F-Spot lahko spremenite v " #~ "pogovornem oknu Možnosti " #~ "(UrediMožnosti)." #~ msgid "" #~ "If there is a tiny chance that some of your photos are already imported " #~ "from the chosen source, you can use Detect duplicates option. In this case F-Spot will try to find out if exactly " #~ "this image is already present in the database and thus new copy of it " #~ "should not be imported." #~ msgstr "" #~ "V primeru da ste morda nekatere fotografije iz izbranega vira že uvozili, " #~ "lahko uporabite možnost Zaznavanje dvojnikov. F-Spot " #~ "bo poskusil ugotoviti ali natanko ta slika že obstaja v podatkovni " #~ "zbirki. V tem primeru kopija slike ne bo uvožena." #~ msgid "" #~ "If all the photos you are importing at one time are from a particular " #~ "event, or have some other characteristic in common, you can create a tag " #~ "for them so you can later find them with ease. To do this, follow the " #~ "instructions from to create a new tag, then when " #~ "you are importing them, check the button for Attach Tag and choose the tag you created." #~ msgstr "" #~ "V primeru da so vse uvožene fotografije z doloÄenega dogodka, ali imajo " #~ "neko drugo skupno znaÄilnost, lahko za njih ustvarite oznako zato da jih " #~ "kasneje lahko najdete. Za to sledite navodilom z " #~ "za ustvarjanje nove oznake, nato med uvažanjem oznaÄite gumb " #~ "Pripni oznako in izberite ustvarjeno oznako." #~ msgid "" #~ "F-Spot uses a database stored at ~/.config/f-spot/photos.db. Note, to access it, use the sqlite3 command. You can also " #~ "manually specify path to a database by running F-Spot with ." #~ msgid "" #~ "After an import, F-Spot will display the pictures of the latest import " #~ "roll only. Read to learn how to deal " #~ "with import rolls." #~ msgstr "" #~ "Po uvozu bo F-Spot prikazal le slike zadnjega uvoznega zvitka. Preberite " #~ " za podrobnosti o upravljanju z " #~ "uvoznimi zvitki." #~ msgid "" #~ "You can also import directly from Mozilla Firefox and Thunderbird using Firefox and Thunderbird F-Spot importer extensions written by " #~ "Pizzach." #~ msgstr "" #~ "Uvoziti je mogoÄe tudi neposredno iz Mozilla Firefox in Thunderbird z uporabo Firefox " #~ "in Thunderbird razÅ¡iritve F-Spot uvoznik, ki jo je " #~ "napisalPizzach." #~ msgid "Edit" #~ msgstr "Urejanje" #~ msgid "" #~ "If you double click or press enter on an image, you enter Edit mode, " #~ "where you can remove red-eye, crop, and adjust brightness and colors." #~ msgstr "" #~ "V primeru da dvojno kliknite ali pritisnete vnosno tipko, vstopite v " #~ "naÄin urejanje, kjer lahko odstranite rdeÄe oÄi, obrežete ter prilagodite " #~ "svetlost in barve." #~ msgid "" #~ "When you edit your photos, a new copy (called a version) is created, so " #~ "your original is never altered. After your first edit to a photo, " #~ "subsequent edits will modify the same version. If you want to create " #~ "multiple versions of your photo, perhaps with different cropping or " #~ "coloring, you can do so via the FileCreate new version option." #~ msgstr "" #~ "Ko urejate fotografije, je ustvarjena nova kopija (imenovana razliÄica), " #~ "tako izvorna fotografija ni nikoli spremenjena. Po prvem urejanju " #~ "fotografije bodo naslednja urejanja spremenila isto razliÄico. V primeru " #~ "da želite ustvariti veÄ razliÄic fotografije, morda z drugim obrezovanjem " #~ "ali barvami lahko to storite preko možnosti " #~ "FotografijaUstvari novo " #~ "razliÄico." #~ msgid "Crop" #~ msgstr "Obreži" #~ msgid "" #~ "Cropping an image is a great way to improve the quality of a photograph " #~ "by change how it is framed. You crop a photo by selecting the part of the " #~ "photo you want to keep. If you want your photo to be the exact dimensions " #~ "necessary for a certain print size, you can constrain the kind of " #~ "selection F-Spot will allow you to draw by choosing the appropriate size " #~ "from the constraint drop down. See the below for details on making a selection on your photo." #~ msgstr "" #~ "Obrezovanje slike je dober naÄin za izboljÅ¡anje kakovosti slike s " #~ "spremembo okvirjanja. Fotografijo lahko obrežete z izbiro dela " #~ "fotografije, ki ga želite obdržati. V primeru da želite imeti fotografijo " #~ "natanÄnih mer zahtevanih za doloÄeno velikost tiskanja, lahko z izbiro " #~ "primerne velikosti s spustnega menija omejitev omejite izbiro, ki vam jo " #~ "bo dovolil narisati F-Spot. Za podrobnosti o izbiri na fotografiji si " #~ "oglejte spodaj." #~ msgid "Crop tool" #~ msgstr "Orodje obreži" #~ msgid "" #~ "Once you have made your crop selection, you must click the crop button " #~ "beneath the image to finalize the crop. If you are working with the " #~ "original photo, cropping creates a new version your photo." #~ msgstr "" #~ "Ko ste naredili izbor obreza, morate za konÄanje obrezovanja klikniti " #~ "gumb pod sliko. V primeru da delate z izvorno fotografijo, obrezovanje " #~ "ustvari novo razliÄico vaÅ¡e fotografije." #~ msgid "" #~ "Straighten effect is a tool to level a photo, quite helpful for " #~ "landscapes taken without a tripod, when (imaginary) line of horizon is " #~ "not at 0°. This tool rotates an image by a specified angle and " #~ "automagically crops the resulted image, so that you always see a perfect " #~ "rectangle." #~ msgstr "" #~ "UÄinek poravnave je orodje za poravnanje fotografij, precej uporabno za " #~ "sliko pokrajine posnete brez stativa, ko (navidezna) Ärta horizonta ni na " #~ "0°. To orodje zavrti sliko za doloÄen kot in samodejno Äarobno obreže " #~ "nastalo sliko, tako da vedno vidite idealen pravokotnik." #~ msgid "Straighten tool" #~ msgstr "Orodje poravnave" #~ msgid "" #~ "To adjust the brightness, contrast, and colors of a photo, first click " #~ "the Adjust the photo colors icon to open the " #~ "adjustment dialog. Change then some settings and save them with " #~ "OK." #~ msgstr "" #~ "Za prilagajanje svetlosti, kontrasta in barv fotografije najprej kliknite " #~ "ikono Prilagodi barve fotografije za odpiranje " #~ "pogovornega okna prilagajanja. Spremenite nekaj nastavitev in jih " #~ "shranite z V redu." #~ msgid "" #~ "This effect automatically adjusts color levels to make a pretty balanced " #~ "picture color-wise. It serves best for pictures taken with automatical " #~ "white balance, when camera didn't manage to do the job well." #~ msgstr "" #~ "Ta uÄinek samodejno prilagodi barvne ravni za ustvarjanje barvno " #~ "uravnotežene slike. NajboljÅ¡e deluje za slike posnete s samodejnim " #~ "ravnotežjem bele barve, ko fotoaparat ni uspel dobro opraviti dela. " #~ msgid "" #~ "To make a colorful photo a black and white one, open a photo of choice " #~ "and press Desaturate button." #~ msgstr "" #~ "Za pretvorbo barve fotografije v Ärno belo odprite izbrano fotografijo iz " #~ "pritisnite gumb ZmanjÅ¡aj nasiÄenje." #~ msgid "" #~ "To make a colorful photo look like an old-style picture in sepia tones, " #~ "open a photo of choice and press Sepia button." #~ msgstr "" #~ "Za pretvorbo barvne fotografije v staro sliko sepia tonov odprite izbrano " #~ "fotografijo in pritisnite gumb Sepia uÄinek staranja." #~ msgid "" #~ "To remove redeye from a photo, you need to select a zone containing the " #~ "eyes. You may want to zoom in on the image to accurately select the eyes " #~ "in the photo. You should be able to correct both eyes on the same person " #~ "in one shot, or even the eyes from multiple people at once. If this " #~ "doesn't work for you, or the selected zone contains some vivid red parts " #~ "(lips, ...) you'll probably have to correct one red eye at a time." #~ msgstr "" #~ "Za odstranitev rdeÄih oÄi s fotografije morate izbrati podroÄje, ki " #~ "vsebuje oÄi. Pametno je poveÄati sliko za natanÄno izbiro oÄi v " #~ "fotografiji. Naenkrat bi lahko popravite obe oÄi iste osebe ali celo oÄi " #~ "veÄ oseb na enkrat. V primeru da to ne deluje, ali izbrano podroÄje " #~ "vsebuje druge živo rdeÄe dele (ustnice, ...) boste najbrž morali " #~ "popraviti eno oko na enkrat." #~ msgid "" #~ "To make your selection, click one corner of the rectangle that will be " #~ "your selection, and drag your mouse to the diagonal corner and release " #~ "it. You can resize your selection by dragging its edges, and you can move " #~ "it by clicking in the middle of it and dragging it to where you want it." #~ msgstr "" #~ "Za izbiranje kliknite en kot kvadrata, ki bo vaÅ¡ izbor, povlecite vaÅ¡o " #~ "miÅ¡ko v diagonalni kot in jo spustite. Izboru lahko spremenite velikost z " #~ "vleÄenjem njegovih robom ali pa ga lahko premaknete s klikom v sredino " #~ "izbora in ga povleÄete kamor ga želite." #~ msgid "" #~ "Once you have selected a zone, you can remove the red from it by clicking " #~ "the red-eye button beneath the photo." #~ msgstr "" #~ "Ko ste izbrali podroÄje, lahko rdeÄe oko odstranite s klikom na gumb " #~ "rdeÄe-oko pod fotografijo." #~ msgid "Red-Eye tool" #~ msgstr "Orodje rdeÄih oÄi" #~ msgid "" #~ "You can change the threshold for redeyes detection by changing the gconf " #~ "key /apps/f-spot/edit/redeye_threshold." #~ msgstr "" #~ "Prag za zaznavanje rdeÄih oÄi lahko spremenite s spremembo gconf kljuÄa " #~ "¸/apps/f-spot/edit/redeye_threshold." #~ msgid "Soft Focus" #~ msgstr "Mehko žariÅ¡Äe" #~ msgid "" #~ "In photography sharpening one region of a picture, while blurring all the " #~ "rest, is a way to make an emphasis and grab attention. It is achieved by " #~ "using a lens that allows shooting with a short distance in front of and " #~ "beyond the subject that appears to be in focus. Soft focus effect is a " #~ "way to emulate such a lens." #~ msgstr "" #~ "V fotografiji je izostritev enega predela slike in zameglitev vsega " #~ "ostalega naÄin za poudarjanje in pridobitev pozornosti. To je mogoÄe " #~ "doseÄi z uporabo leÄe ki dovoli snemanje s kratko razdaljo pred in za " #~ "predmetom, ki je videti v goriÅ¡Äu. UÄinek mehkega goriÅ¡Äa je naÄin za " #~ "posnemanje takÅ¡ne leÄe." #~ msgid "Soft Focus tool" #~ msgstr "Orodje mehkega žariÅ¡Äa" #~ msgid "" #~ "Click to choose central point of the area you want to be in focus and " #~ "adjust amount of blurring, then click OK." #~ msgstr "" #~ "Kliknite za izbor srediÅ¡Äa podroÄja, ki naj bo v goriÅ¡Äu in prilagodite " #~ "koliÄino megljenja in nato kliknite V redu." #~ msgid "" #~ "Out-of-focus photographs and most digitized images often need a sharpness " #~ "correction. The Unsharp Mask effect sharpens edges of the elements " #~ "without increasing noise or blemish. To sharpen a photo choose " #~ "EditSharpen... and specify the following values:" #~ msgstr "" #~ "Fotografije izven goriÅ¡Äa in veÄina digitaliziranih slik pogosto " #~ "potrebujejo popravek izostritve. UÄinek maske odstranitve izostritve " #~ "izostri robove elementov brez poveÄanja Å¡uma ali napak. Za izostritev " #~ "fotografije izberite UrediIzostri... in navedite " #~ "naslednje vrednosti:" #~ msgid "" #~ "Amount — strength of sharpening." #~ msgstr "KoliÄina — moÄ izostritve." #~ msgid "" #~ "Radius — how many pixels on " #~ "either side of an edge will be affected by sharpening. High resolution " #~ "images allow higher radius." #~ msgstr "" #~ "Polmer — na koliko toÄk na vsaki " #~ "strani roba bo vplivala izostritev. Slike z visoko loÄljivostjo omogoÄijo " #~ "veÄje polmere." #~ msgid "" #~ "Threshold — the minimum " #~ "difference in pixel values that indicates an edge where sharpen must be " #~ "applied. This helps avoiding creation of blemishes in face, sky or water " #~ "surface." #~ msgstr "" #~ "Prag — najmanjÅ¡a razlika v " #~ "vrednostih toÄk ki doloÄiti rob, kjer mora biti uveljavljena izostritev. " #~ "To pomaga pri izogibanju ustvarjanja napak v obrazu, nebu ali vodni " #~ "povrÅ¡ini." #~ msgid "Describe" #~ msgstr "Opisovanje" #~ msgid "" #~ "You can also enter a description of the image by clicking on the text " #~ "entry box below the image and typing." #~ msgstr "" #~ "Vpis slike lahko vnesete s klikom na polje besedilnega vnosa pod sliko in " #~ "tipkanjem." #~ msgid "Adjust Time" #~ msgstr "Prilagodi Äas" #~ msgid "" #~ "In both 'browse' or 'edit' modes, you can adjust the time of one or " #~ "multiple pictures (EditAdjust " #~ "Time). Adjusting the time of multiple pictures " #~ "at once helps you shift all an import roll if, e.g. the time on your " #~ "camera is badly set or if you forgot to change it according to DST." #~ msgstr "" #~ "Tako v naÄinu 'brskanje' kot 'urejanje' lahko prilagodite Äas ene ali veÄ " #~ "slik (UrediPrilagodi Äas). Prilagajanje Äasa veÄ slik na enkrat vam " #~ "pomaga premakniti celoten uvozni zvitek, na primer Äe je Äas na vaÅ¡em " #~ "fotoaparatu slabo nastavljen in ste ali Äe ste ga pozabili spremeniti z/" #~ "na poletni Äas. " #~ msgid "Tag" #~ msgstr "Oznaka" #~ msgid "" #~ "F-Spot enables you to organize and enjoy your photos by associating them " #~ "with various user-customizable tags. A tag is a merely a label. F-Spot " #~ "comes with default tags to get you started; you are free to change them " #~ "and add new ones. For example, if you want to create a tag for specific " #~ "event, you can create a new tag named after that event under the Events " #~ "tag." #~ msgstr "" #~ "F-Spot vam omogoÄa organizacijo in uživanje v vaÅ¡ih fotografijah s " #~ "povezavo z razliÄnimi uporabniÅ¡ko prilagodljivimi oznakami. F-Spot za " #~ "zaÄetek vsebuje privzete oznake, lahko jih spremenite in dodate nove. Na " #~ "primer, Äe želite ustvariti oznako za doloÄen dogodek, lahko ustvarite " #~ "oznako imenovano po dogodku pod oznako dogodki." #~ msgid "drag and drop the photo(s) onto the tag" #~ msgstr "povlecite in spustite fotografij-o/e na oznako" #~ msgid "drag and drop the tag onto the photo(s)" #~ msgstr "povlecite in spustite oznako na fotografij-o/e" #~ msgid "via the photo's right-click menu" #~ msgstr "preko menija desnega klika fotografija" #~ msgid "via the Tags and Edit menus" #~ msgstr "preko menijev Oznake in Uredi" #~ msgid "" #~ "by typing them in. Press t to pop up the tag entry bar. " #~ "Here you can enter the tags, separated by commas." #~ msgstr "" #~ "s tipkanjem oznak. Pritisnite t za pojav vnosne vrstice " #~ "oznak. Sem lahko vnesete oznake, loÄene z vejicami." #~ msgid "" #~ "You can also use auto-completion in this entry bar: After entering the " #~ "beginning of a tag name, press Tab to see the first " #~ "possible completion. You can cycle between other possible completions by " #~ "pressing Tab again, and backwards with ShiftTab. To " #~ "confirm the suggested completion and enter a new tag, press ,. By pressing Enter you leave the tag entry bar, " #~ "possibly confirming the current completion. To abort the auto completion, " #~ "just keep on typing." #~ msgstr "" #~ "V vnosni vrstici lahko uporabite samodejno dokonÄanje. Po vnosu zaÄetka " #~ "imena oznake pritisnite Tabulator za ogled prvega " #~ "mogoÄega dokonÄanja. Med mogoÄimi dokonÄanji lahko krožite naprej s " #~ "ponovnim pritiskom na Tabulator in nazaj s pritiskom na " #~ "DvigalkaTabulator. Za potrditev predlaganega dokonÄanja in vnos nove " #~ "oznake pritisnite ,. S pritiskom Vnosna tipka zapustite vnosno vrstico oznak in s tem morda potrdite trenutno " #~ "dokonÄanje. Za preklic samodejnega dokonÄevanja tipkajte naprej. " #~ msgid "" #~ "The first photo you associate with a tag will be used for that tag's " #~ "icon. You can always edit a tag's name, parent tag, and icon by right " #~ "clicking on it and choosing Edit tag." #~ msgstr "" #~ "Prva fotografija, ki jo povežete z oznako, bo uporabljena za ikono " #~ "oznake. Z desnim klikom na oznako in izbiro Uredi oznako lahko uredite ime oznake, nadrejeno oznako in ikono oznake." #~ msgid "" #~ "You can change a tag's parent by dragging and dropping it where you like. " #~ "Also, you can edit the name of a tag by selecting it and pressing " #~ "F2. Lastly, if you have the tag tree widget focused (e." #~ "g. you just clicked on a tag), you can start typing the name of a tag, " #~ "and all the expanded tags in the list will be searched and you'll jump to " #~ "any matching ones." #~ msgstr "" #~ "Nadrejeni predmet oznake lahko spremenite tako, da ga povleÄete in " #~ "spustite kamor želite. Ime oznake lahko uredite tako, da jo izberete in " #~ "pritisnete F2. V primeru da je gradnik drevesa oznak v " #~ "žariÅ¡Äu, (na primer ste ravnokar kliknili na oznako) lahko zaÄnete " #~ "tipkati ime oznake, vse razÅ¡irjene oznake na seznamu bodo preiskane in " #~ "skoÄili boste na zadetke." #~ msgid "" #~ "You can also change size of tag icons in the sidebar or even make tag " #~ "icons invisible by selecting preferred option from " #~ "ViewTag Icons menu." #~ msgstr "" #~ "Velikost ikon znaÄk v stranski vrstici lahko spremenite ali pa jih celo " #~ "napravite nevidne z izbiro prednostne možnosti v meniju " #~ "PogledIkone oznak." #~ msgid "" #~ "F-Spot can write tags as metadata fields into JPEG files. Tags for " #~ "various RAW files, PNG, TIFF, and others are written to F-Spot's " #~ "database. You will have to re-tag these files if you re-import your " #~ "collection." #~ msgstr "" #~ "F-Spot lahko oznake zapiÅ¡e v datoteke JPEG kot polja metapodatkov. Oznake " #~ "za razliÄne RAW, PNG, TIFF in druge datoteke so zapisane v podatkovno " #~ "zbirko F-Spot. Te datoteke boste morali ob ponovnem uvozu zbirke ponovno " #~ "oznaÄiti." #~ msgid "Enjoying your photos" #~ msgstr "Uživanje v vaÅ¡ih fotografijah" #~ msgid "Browse" #~ msgstr "Brskanje" #~ msgid "" #~ "You can use the slider widget to browse your photos by month or by " #~ "directory. To change this setting, go to ViewArranged By." #~ msgstr "" #~ "Za brskanje po vaÅ¡ih fotografijah po mesecu ali po mapi lahko uporabite " #~ "drsni gradnik. Za spremembo te nastavitve pojdite na " #~ "PogledUrejeno po." #~ msgid "" #~ "F-Spot uses search filters to help you better define search criteria." #~ msgstr "" #~ "F-Spot uporablja iskalne filtre za pomoÄ pri boljÅ¡em doloÄanju iskalnih " #~ "kriterijev." #~ msgid "" #~ "You can start a search by double clicking or activating a tag from the " #~ "tag list. Alternatively, you can show the find bar with " #~ "FindShow Find Bar. With the find bar shown, you can drag tags " #~ "from the tag view to the find bar." #~ msgstr "" #~ "Iskanje lahko zaÄnete z dvojnim klikom ali omogoÄanjem oznake iz seznama " #~ "oznak. Dodatno lahko pokažete iskalno vrstico z " #~ "NajdiPokaži iskalno vrstico. Ko je iskalna vrstica prikazana, lahko oznake " #~ "povleÄete iz pogleda oznak v iskalno vrstico." #~ msgid "" #~ "To find photos that are tagged with both of two tags, activate the first " #~ "in the tag view or drag it onto the find bar, then drag the second tag " #~ "and drop it on top of the first. You can also right click on the second " #~ "tag in the tag view, or use the Find menu, and choose " #~ "Find With... and select the first tag (or " #~ "group of tags)." #~ msgstr "" #~ "Za iskanje fotografij, ki so oznaÄene z obema od dveh oznak, omogoÄite " #~ "prvo v pogledu oznak ali jo povlecite v iskalno vrstico in nato povlecite " #~ "drugo oznako in jo spustite na prvo. Lahko tudi desno kliknete na drugo " #~ "oznako v pogledu oznak ali uporabite meni Najdi in " #~ "izberite Najdi z... in izberite prvo oznako " #~ "(ali skupino oznak)." #~ msgid "" #~ "You can drag a tag icon around on the find bar to change from finding it " #~ "and another tag to finding it or another tag." #~ msgstr "" #~ "Ikono oznake lahko povleÄete na iskalno vrstico za spremembo iz iskanja " #~ "te oznake in druge oznake v iskanje te oznake ali druge oznake. " #~ msgid "" #~ "You can search for photos that do not have a particular tag by double-" #~ "clicking on a tag in the find bar. Alternatively, you can right-click a " #~ "tag in the find bar and select Exclude." #~ msgstr "" #~ "Fotografije brez doloÄene oznake lahko iÅ¡Äete z dvojnim klikom na oznako " #~ "v iskalni vrstici. Dodatna možnost je desni klik na oznako v iskalni " #~ "vrstici in izbira IzkljuÄi." #~ msgid "" #~ "By default, photos tagged Hidden will not be shown. " #~ "You must explicitly include the Hidden tag in your " #~ "search to show such photos." #~ msgstr "" #~ "Privzeto so fotografije oznaÄene Skrito skrite. Za " #~ "iskanje takÅ¡nih fotografij morate eksplicitno vkljuÄiti oznako " #~ "Skrito." #~ msgid "" #~ "F-Spot remembers what pictures were imported every now and then. Use " #~ "FindImport RollLast import roll to " #~ "limit search to last importing session or use FindImport RollSelect Import " #~ "Rolls... to make a finer selection of imported " #~ "photos:" #~ msgstr "" #~ "F-Spot si vsake toliko Äasa zapomni katere slike so bile uvožene. " #~ "Uporabite NajdiPo uvoznem " #~ "zvitkuZadnji uvozni zvitek za omejitev iskanja na zadnjo sejo uvažanja ali uporabite " #~ "NajdiPo uvoznem zvitkuIzberi uvozne zvitke ... za fino izbiro uvoženih fotografij:" #~ msgid "" #~ "At — to select photos from a " #~ "particular importing session" #~ msgstr "" #~ "Ob — za izbor fotografij iz " #~ "doloÄene seje uvažanja" #~ msgid "" #~ "After — to select all photos " #~ "imported begining with a particular importing session" #~ msgstr "" #~ "Za — za izbor vseh uvoženih " #~ "fotografij z zaÄetkom pri doloÄeni seji uvažanja" #~ msgid "" #~ "Between — to select all photos " #~ "imported between two particular importing sessions" #~ msgstr "" #~ "Med — za izbor vseh fotografij " #~ "uvoženih med dvema doloÄenima sejama uvažanja" #~ msgid "" #~ "Every time you change settings of the filter, the amount of selected " #~ "photos will appear in the bottom part of the dialog." #~ msgstr "" #~ "VsakiÄ ko spremenite nastavitve filtra, se koliÄina izbranih fotografij " #~ "pojavi na spodnjem delu pogovornega okna." #~ msgid "" #~ "When you apply Import Roll filter, in the Find bar you will see " #~ "Find: Import Roll. Now you can add some other filter " #~ "to finetune your selection." #~ msgstr "" #~ "Ko boste uveljavili filter uvoznih zvitkov boste videli Najdi: " #~ "Uvozni zvitek. Sedaj lahko dodate druge filtre za fino " #~ "nastavljanje vaÅ¡ega izbora." #~ msgid "" #~ "If you don't need the Import Roll filter anymore, choose " #~ "FindImport RollClear roll filter to " #~ "remove Import Roll from search criteria. You can also click the close " #~ "button (X) of the search bar to discard all the " #~ "current search options." #~ msgstr "" #~ "V primeru da filtra uvoznih zvitkov ne potrebujete veÄ, za odstranitev " #~ "uvoznih zvitkov iz iskalnih kriterijev izberite " #~ "NajdiUvozni zvitekPoÄisti filter uvoznih zvitkov. Za zavraÄanje vseh trenutnih možnosti iskanja lahko " #~ "kliknete tudi na gumb zapri (X) v iskalni vrstici." #~ msgid "" #~ "The number of displayed rolls in the dialog is defined by the gconf key " #~ "/apps/f-spot/import/gui_roll_history. Default value is 10." #~ msgstr "" #~ "Å tevilo prikazanih zvitkov v pogovornem oknu je doloÄeno z gconf kljuÄem " #~ "/apps/f-spot/import/gui_roll_history. Privzeta vrednost je 10." #~ msgid "Type-to-find" #~ msgstr "Tipkajte-za-iskanje" # Govorimo o operatorjih, zato jih ne prevajamo ... #~ msgid "" #~ "There is also a type-to-find entry. Press / to open it. " #~ "It cannot be used at the same time as the find bar. You can type queries " #~ "such as \"TagA and (TagB or (TagC and TagD))\". At any point, if F-Spot " #~ "recognizes what you've typed as a valid query, it will update your " #~ "search. The not operator is not yet supported." #~ msgstr "" #~ "Obstaja tudi vnos tipkaj-za-iskanje. Za odpiranje pritisnite /. Vnosa ni mogoÄe uporabiti istoÄasno kot iskalne vrstice. " #~ "Vtipkate lahko poizvedbe kot so \"OznakaA and (OznakaB or (OznakaC and " #~ "OznakaD)\". V vsakem primeru bo F-Spot posodobil vaÅ¡e iskanje, Äe zazna " #~ "veljavno poizvedbo. Operator not Å¡e ni podprt." #~ msgid "" #~ "This function will also search for the typed text into photos comments " #~ "and filename." #~ msgstr "" #~ "Ta funkcija bo iskala tudi besedilo vneseno v komentarje fotografije in " #~ "ime datoteke." #~ msgid "Fullscreen Mode and Slideshows" #~ msgstr "Celozaslonski naÄin in diapredstavitve" #~ msgid "" #~ "For fewer distractions and larger display, you can view your photos in " #~ "full screen mode. You control when to show the next photo or to return to " #~ "the previous. Enter fullscreen mode by pressing F11 at " #~ "any time or by pressing the button in the toolbar." #~ msgstr "" #~ "Za manj motenj in veÄji prikaz si lahko ogledate fotografije v " #~ "celozaslonskem naÄinu. Nadzirate lahko kdaj naj bo prikazana naslednja " #~ "ali predhodna fotografija. V celozaslonski naÄin lahko kadarkoli vstopite " #~ "s pritiskom na F11 ali s pritiskom gumba v orodni " #~ "vrstici." #~ msgid "FullScreen" #~ msgstr "Celozaslonski naÄin" #~ msgid "" #~ "In slideshow mode, you can sit back and view your photos as they are " #~ "presented to you. You can start a slideshow by pressing the button on the " #~ "toolbar." #~ msgstr "" #~ "V naÄinu diapredstavitve se lahko usedete in si ogledate svoje " #~ "fotografije medtem ko so vam predstavljene. Diapredstavitev lahko " #~ "zaženete s pritiskom na gumb v orodni vrstici." #~ msgid "SlideShow" #~ msgstr "Diapredstavitev" #~ msgid "" #~ "There are many ways to share your photos using F-Spot. All of the " #~ "following methods will only share the photos you have selected when you " #~ "run them." #~ msgstr "" #~ "Za souporabo vaÅ¡ih fotografij z F-Spot obstaja veÄ naÄinov. Vse naslednje " #~ "metode bodo dale v souporabo le fotografije, ki ste jih izbrali ob zagonu " #~ "souporabe." #~ msgid "E-mail" #~ msgstr "E-poÅ¡ta" #~ msgid "" #~ "E-mail your photos directly from F-Spot with the " #~ "FileSend Mail menu." #~ msgstr "" #~ "Svoje fotografije lahko poÅ¡ljete preko elektronske poÅ¡te neposredno iz F-" #~ "Spot z uporabo menija FotografijaPoÅ¡lji po poÅ¡ti. " #~ msgid "Note 1" #~ msgstr "Opomba 1" #~ msgid "" #~ "The email program used for this is defined at the GNOME level. You can " #~ "change the default e-mailer for your user using the " #~ "Preferred Applications tool in " #~ "SystemPreferences." #~ msgstr "" #~ "Uporabljen bo e-poÅ¡tni program, ki je doloÄen na ravni GNOME. Privzeti e-" #~ "poÅ¡tni program lahko spremenite za svoj raÄun z uporabo orodja " #~ "Prednostni programi v meniju " #~ "SistemNastavitve." #~ msgid "Note 2" #~ msgstr "Opomba 2" #~ msgid "" #~ "If some of the photos you'd like to send by email are in a format that F-" #~ "Spot can't write (e.g. RAW images), the size selection dialog will become " #~ "insensitive and the originals will be sent." #~ msgstr "" #~ "V primeru da so fotografije, ki jih želite poslati preko elektronske " #~ "poÅ¡te vrste, ki je F-Spot ne more zapisati (na primer slike RAW) bo " #~ "pogovorno okno postalo neobÄutljivo in bodo poslane izvorne fotografije." #~ msgid "" #~ "If you're sending resized pictures, F-Spot will keep the modified " #~ "versions somewhere in the /tmp " #~ "directory for 30 seconds. It's not an issue with evolution, which makes " #~ "it's own local copy of the attachments, but could be a bit shorter if " #~ "you're using Thunderbird. You can change the delay by editing the gconf " #~ "key /apps/f-spot/export/email/" #~ "delete_timeout_seconds." #~ msgstr "" #~ "V primeru da poÅ¡iljate slike s spremenjenimi velikostmi, bo F-Spot " #~ "obdržal spremenjene razliÄice nekje v mapi /" #~ "tmp za 30 sekund. To ne povzroÄa težav z evolution, ki naredi " #~ "svojo krajevno kopijo prilog, toda bi lahko bilo malce krajÅ¡e, Äe " #~ "uporabljate Thunderbird. Zamik lahko spremenite z urejanjem gconf kljuÄa " #~ "/apps/f-spot/export/email/" #~ "delete_timeout_seconds." #~ msgid "Print" #~ msgstr "Tisk" #~ msgid "" #~ "Print your photos with the FilePrint menu." #~ msgstr "" #~ "Fotografije lahko natisnite z menijem DatotekaNatisni." #~ msgid "" #~ "Burn your photos to CD or DVD with the FileExportExport to CD menu." #~ msgstr "" #~ "ZapiÅ¡ite vaÅ¡e fotografije z menijem FotografijaIzvoziIzvozi na CD." #~ msgid "Generate a Website Gallery or Folder" #~ msgstr "Ustvarjanje spletne galerije ali mape" #~ msgid "" #~ "The FileExportExport to Folder " #~ "feature gives you three ways to export your images." #~ msgstr "" #~ "Zmožnost FotografijaIzvozi vIzvozi v mapo vam " #~ "poda tri naÄine za izvažanje vaÅ¡ih slik." #~ msgid "" #~ "Use Original exports your photos ready for use with " #~ "Jakub Steiner's free Original Photo Gallery software. If you are unsure about this " #~ "option, it is probably not the right one for you." #~ msgstr "" #~ "Uporabi izvorno izvozi vaÅ¡e fotografije pripravljene " #~ "za uporabo z brezplaÄnim programom Jakuba Steinerja Original Photo Gallery. V " #~ "primeru da niste prepriÄani o tej možnosti, verjetno ni prava za vas." #~ msgid "" #~ "Use static HTML files exports your photos to an " #~ "interactive website, ready for you to upload." #~ msgstr "" #~ "Uporabi statiÄne datoteke HTML izvozi vaÅ¡e " #~ "fotografije v interaktivno spletiÅ¡Äe, pripravljeno na poÅ¡iljanje." #~ msgid "" #~ "Plain Files exports your images as files within " #~ "directories, without putting them into a gallery." #~ msgstr "" #~ "ObiÄajne datoteke izvozi vaÅ¡e slike kot datoteke v " #~ "mape, brez poÅ¡iljanja v galerijo." #~ msgid "Post to your online galleries" #~ msgstr "Objavljanje v spletne galerije" # V programu je fotografija, ni datoteka !! #~ msgid "" #~ "If you use Flickr, SmugMug, 23hq, Tabblo, Facebook, Zooomr or Picasa Web " #~ "Album, you can post your files directly from F-Spot with the " #~ "FileExport menu, choosing corresponding submenu item." #~ msgstr "" #~ "V primeru da uporabljate Flickr, SmugMug, 23hq, Tabblo, Facebook, Zooomr " #~ "ali Picasa spletne albume lahko svoje datoteke objavite neposredno iz F-" #~ "Spot z uporabo menija FotografijaIzvozi v in izbiro " #~ "ustreznega predmeta podmenija." # V programu je fotografija, ni datoteka !! #~ msgid "" #~ "If you use the PHP software known as Gallery, you can post your photos to your " #~ "existing album with the FileExportExport to Web " #~ "Gallery menu. You must first enable the Remote " #~ "module within your Gallery installation." #~ msgstr "" #~ "V primeru da uporabljate PHP program poznan kot Gallery, lahko svoje fotografije " #~ "objavite v svoj obstojeÄ album z menijem " #~ "FotografijaIzvozi vIzvozi v spletno galerijo. Najprej morate v namestitvi Gallery omogoÄiti modul " #~ "Oddaljeno. " # To je ime programa ... #~ msgid "Note for Gallery 2.2 users" #~ msgstr "Opomba za uporabnike Gallery 2.2" #~ msgid "The Remote plugin for Gallery should be 1.0.8 or newer." #~ msgstr "Oddaljeni vstavek Gallery mora biti 1.0.8 ali novejÅ¡i." #~ msgid "" #~ "PennAve is a Python " #~ "web-application that directly uses F-Spot's database to present a dynamic " #~ "gallery of your photos and tags." #~ msgstr "" #~ "PennAve je spletni " #~ "program v Pythonu, ki neposredno uporablja podatkovno zbirko F-Spot za " #~ "predstavljanje dinamiÄne galerije vaÅ¡ih fotografij in oznak." #~ msgid "" #~ "Conduit is an " #~ "application that can sync photos that have a particular tag with your " #~ "Flickr or Picasa Web Album web storage." #~ msgstr "" #~ "Conduit je program, " #~ "ki lahko uskladi fotografije z doloÄeno oznako s spletno shrambo Flicker " #~ "ali Picasa spletni albumi." #~ msgid "What's color management" #~ msgstr "Kaj je upravljanje barv" #~ msgid "" #~ "When you capture a photo and look at it on a display, it looks different " #~ "than on a camera's preview display or on any other display. It will also " #~ "look different when you print it. This is because every device has unique " #~ "color reproduction capabilities." #~ msgstr "" #~ "Fotografija je na zaslonu videti drugaÄe kot na zaslonu predogleda " #~ "fotoaparata ali kateremukoli drugemu zaslonu. Tudi natisnjena fotografija " #~ "je videti drugaÄna. To se zgodi zato, ker ima vsaka barva edinstvene " #~ "zmožnosti poustvaritve barv. " #~ msgid "" #~ "Color management system (CMS) is a tool to achieve reliable color " #~ "reproduction for both display and output (e.g. a printer). A CMS relies " #~ "on color profiles to map original colors to the color that a device can " #~ "reproduce so that colors will appear the same way everywhere — on a " #~ "computer LCD monitor, on a print from your local photolab etc." #~ msgstr "" #~ "Sistem za upravljanje barv (CMS) je orodje za doseganje zanesljive " #~ "poustvaritve barv tako za zaslon kot izhod (na primer tiskalnik). CMS se " #~ "zanaÅ¡a na barvne profile za preslikavo izvornih barv v barve, ki jih " #~ "lahko poustvarijo naprave, tako, da so barve povsod videti enake - na " #~ "raÄunalniÅ¡kem zaslonu LCD, natisnjene, itn." #~ msgid "What's a color profile" #~ msgstr "Kaj je barvni profil" #~ msgid "" #~ "A color profile is a file with either .icc (thus its is often called an " #~ "ICC profile) or .icm extension that describes how device's colors " #~ "correspond to a universal description of colors." #~ msgstr "" #~ "Barvni profil je datoteka s pripono .icc (zato je pogosto imenovan profil " #~ "ICC) ali .icm ki opiÅ¡e kako barve naprave ustrezajo sploÅ¡nemu opisu " #~ "naprav." #~ msgid "" #~ "Input device profile. It's profile for a camera or a profile that an " #~ "application like XSane embeds into a scanned image." #~ msgstr "" #~ "Profil vhodne naprave. To je profil fotoaparata ali profil, ki ga lahko " #~ "program kot je XSane vkljuÄi v skenirano sliko." #, fuzzy #~ msgid "" #~ "Working space profile. It's a profile that describes color space in which " #~ "all operations are done inside an application. Usually very wide gamut " #~ "profiles like AdobeRGB1998 or ProPhotoRGB are used for that." #~ msgstr "" #~ "Profil delovnega prostora. To je profil, ki opiÅ¡e barvni prostor, v " #~ "katerem so vsa opravila narejena znotraj programa. ObiÄajno so za to " #~ "uporabljeni zelo Å¡iroki XXX profili kot AdobeRGB1998 ali ProPhotoRGB." #~ msgid "Display profile. It's a profile for a monitor." #~ msgstr "Profil zaslona. To je profil za zaslon." #~ msgid "Output profile. This is usually a profile for you printer." #~ msgstr "Izhodni profil. To je obiÄajno profil za tiskalnik." #~ msgid "" #~ "Currently F-Spot allows setting only display and output profiles. All " #~ "color operations are done in sRGB color space." #~ msgstr "" #~ "Trenutno F-Spot dovoli le nastavljanje profilov zaslona in izhoda. Vsa " #~ "barvna opravila so narejena v barvnem prostoru sRGB." #~ msgid "How to get my screen/printer color profile" #~ msgstr "Kako dobiti barvni profil zaslona/tiskalnika" #~ msgid "There are few ways to get a color profile." #~ msgstr "Obstaja veÄ naÄinov za pridobivanje barvnega profila." #~ msgid "From CD or Internet" #~ msgstr "Iz CD-ja ali medmrežja" #~ msgid "" #~ "Many hardware manufacturers put color profiles into CD in the bundle. If " #~ "you have one (from monitor or printer), you can use it. Or you can " #~ "download it from the Internet (usually, from support section of the " #~ "manufacturer's web site). Some camera manufacturers (Nikon, Canon) also " #~ "provide ICC profiles." #~ msgstr "" #~ "Veliko proizvajalcev strojene opreme priložijo CD z barvnimi profili. V " #~ "primeru da ga imate (od zaslona ali tiskalnika) ga lahko uporabite. Lahko " #~ "ga prejmete z medmrežja (obiÄajno z odseka podpore na spletiÅ¡Äu " #~ "proizvajalca). Barvne profile zagotavljajo tudi nekateri proizvajalci " #~ "fotoaparatov (Nikon, Canon)." #~ msgid "Calibrating and profiling" #~ msgstr "Umerjanje in profiliranje" #~ msgid "" #~ "Best results can be achieved by calibrating and profiling devices with a " #~ "measurement device. It is not so difficult, but it means that you need a " #~ "spectrophotometer to do all measurements and create an ICC profile." #~ msgstr "" #~ "NajboljÅ¡e rezultate je mogoÄe doseÄi z umerjanjem in profiliranjem naprav " #~ "z meritveno napravo. To ni težko, vendar pa je za izvajanje vseh meritev " #~ "in ustvarjanje profila ICC potreben spektrofotometer." #~ msgid "" #~ "If you are on Windows or Mac OS X, you can use manufacturer's software " #~ "coming with a spectrophotometer. On Linux you will have to use either " #~ "Argyll, which is a set of " #~ "versatile command line tools, or LProf, which has a graphical user interface." #~ msgstr "" #~ "V primeru da uporabljate Windows ali Mac OS X lahko uporabite program " #~ "proizvajalca, ki je prispel s spektrofotometrom. Na Linuxu boste morali " #~ "uporabiti Argyll, ki je " #~ "niz vsestranskih orodij ukazne vrstice ali LProf, ki ima grafiÄni uporabniÅ¡ki vmesnik." #, fuzzy #~ msgid "" #~ "Please refer to documentation of third party hardware and software " #~ "vendors for details." #~ msgstr "Za podrobnosti si oglede dokumentacijo za " #~ msgid "Embedding" #~ msgstr "VkljuÄevanje" #~ msgid "" #~ "Image formats themselves (such as TIFF, JPEG, PNG...) may contain " #~ "embedded color profiles. If color management is enabled, F-Spot looks for " #~ "such embedded profiles and takes them into consideration." #~ msgstr "" #~ "Nekatere vrste slik (kot so TIFF, JPEG, PNG ...) lahko vsebujejo " #~ "vkljuÄene barvne profile. V primeru da je upravljanje barv omogoÄeno, F-" #~ "Spot poiÅ¡Äe vkljuÄene profile in jih upoÅ¡teva." #~ msgid "How to use color management in F-Spot" #~ msgstr "Kako uporabiti upravljanje barv v F-Spot" #~ msgid "" #~ "Color management in F-Spot can use only RGB profiles at this time (and " #~ "you can't see other profiles in the F-Spot)." #~ msgstr "" #~ "Upravljanje barv v F-Spot lahko trenutno uporabi le profile RGB (drugih " #~ "profilov v F-Spot ni mogoÄe videti)." #~ msgid "" #~ "Copy your color profiles into the /usr/" #~ "share/color/icc or /usr/local/" #~ "share/color/icc directory." #~ msgstr "" #~ "Kopirajte svoje barvne profile v mapo /usr/" #~ "share/color/icc ali /usr/local/" #~ "share/color/icc." #~ msgid "" #~ "Enable the color management with the EditPreferences menu." #~ msgstr "" #~ "Upravljanje barv omogoÄite z menijem UrediMožnosti." #~ msgid "" #~ "Select Display and Output " #~ "profiles." #~ msgstr "" #~ "Izberite profila Prikaz in Izhod." #~ msgid "" #~ "You can use xicc to load ICC profile to display and use the loaded profile from F-" #~ "Spot. Just mark the checkbox Try to use the system display " #~ "profile." #~ msgstr "" #~ "Za nalaganje profila ICC za prikaz in uporabo naloženega profila iz F-" #~ "Spot lahko uporabite xicc. Samo oznaÄite potrditveno polje Poskus uporabe " #~ "sistemskega profila prikaza." #~ msgid "Extend functionality" #~ msgstr "RazÅ¡iritev zmožnosti" #~ msgid "" #~ "F-Spot extensions are means to add new functionality to the application. " #~ "F-Spot supports two types of extension: exporters (which allow exporting " #~ "photos to new web services or data storages) and tools (which allow new " #~ "ways of color correction, duplicate photos finders etc.). Extensions are " #~ "distributed in form of extension packages." #~ msgstr "" #~ "RazÅ¡iritve F-Spot dajo programu nove zmožnosti. F-Spot podpira dve vrsti " #~ "razÅ¡iritev: izvoznike (omogoÄajo izvažanje fotografij na spletne storitve " #~ "ali podatkovne shrambe) in orodja (omogoÄajo nove naÄine popravljanja " #~ "barv, podvajanje fotografij, itn.). RazÅ¡iritve so distribuirane v obliki " #~ "paketov razÅ¡iritev." #~ msgid "" #~ "In the best traditions of not reinventing the wheel extensions can use " #~ "other extensions, which means that one extension cannot work, if another " #~ "extension is not installed. This concept of dependance actually means that" #~ msgstr "" #~ "Z namenom zmanjÅ¡anja podvajanja dela lahko razÅ¡iritve uporabijo druge " #~ "razÅ¡iritve, kar pomeni da lahko razÅ¡iritev ne deluje, Äe ni nameÅ¡Äena " #~ "druga razÅ¡iritev. Ta koncept odvisnosti pomeni da" #~ msgid "" #~ "you cannot install an extension, if the extension it depends on, is not " #~ "present in the system" #~ msgstr "" #~ "ne morete namestiti razÅ¡iritve, Äe je odvisna od druge razÅ¡iritve, ki je " #~ "ni na sistemu" #~ msgid "you cannot remove an extension on which some other extension depends" #~ msgstr "" #~ "ne morete odstraniti razÅ¡iritve od katere je odvisna druga razÅ¡iritev" #~ msgid "Managing extensions" #~ msgstr "Upravljanje razÅ¡iritev" #~ msgid "Managing extension repositories" #~ msgstr "Upravljanje s skladiÅ¡Äi razÅ¡iritev" #~ msgid "" #~ "Simply put, repositories are extension storages. They can be either " #~ "network or local. To add a new repository click Repositories button, " #~ "choose type of the repository you are about to add and provide either URL " #~ "or path. If the URL or path you specified doesn't contain a description " #~ "(index) file for extensions, a warning message will pop up to tell you " #~ "that." #~ msgstr "" #~ "Preprosto povedano so skladiÅ¡Äa shrambe razÅ¡iritev. Lahko so omrežna ali " #~ "krajevna. Za dodajanje novega skladiÅ¡Äa kliknite gumb SkladiÅ¡Äa, izberite " #~ "vrsto skladiÅ¡Äa za dodajanje in vnesite URL ali pot. V primeru da " #~ "navedeni URL ali pot ne vsebuje datoteke opisa (kazala) za razÅ¡iritve, " #~ "vas bo o tem obvestilo opozorilno sporoÄilo." #~ msgid "" #~ "To remove a repository click Repositories button " #~ "again, choose the repository you are about to delete and click " #~ "Delete button." #~ msgstr "" #~ "Za odstranitev skladiÅ¡Äa ponovno kliknite gumb SkladiÅ¡Äa, izberite skladiÅ¡Äe za izbris in kliknite gumb " #~ "IzbriÅ¡i." #~ msgid "Installing and updating extensions" #~ msgstr "NameÅ¡Äanje in posodabljanje razÅ¡iritev" #~ msgid "" #~ "To install an extension click Install extensions... button. In the newly presented dialog" #~ msgstr "" #~ "Za namestitev razÅ¡iritve kliknite gumb Namesti razÅ¡iritve ... . V novo predstavljenem pogovornem oknu" #~ msgid "" #~ "Choose repository to install from all known repositories or just one of " #~ "available repositories." #~ msgstr "" #~ "Izberite skladiÅ¡Äe za namestitev iz vseh znanih skladiÅ¡Ä ali " #~ "razpoložljivih skladiÅ¡Ä." #~ msgid "" #~ "Choose, what extension packages you want to see: All, Only new, Only " #~ "updates." #~ msgstr "" #~ "Izberite katere pakete razÅ¡iritev želite videti: Vse, le nove, le " #~ "posodobitve." #~ msgid "" #~ "Click the Update button to update list of " #~ "available extension packages by given criteria." #~ msgstr "" #~ "Kliknite gumb Posodobi za posodobitev seznama " #~ "razpoložljivih paketov razÅ¡iritev glede na dane kriterije." #~ msgid "" #~ "Choose extensions you want to install/update, click " #~ "Information to see summary on selected package, if " #~ "you want to." #~ msgstr "" #~ "Izberite razÅ¡iritve, ki jih želite namestiti/posodobiti, ter kliknite " #~ "Podrobnosti za ogled povzetka izbranega paketa, Äe " #~ "želite." #~ msgid "Click Forward to proceed with installation." #~ msgstr "" #~ "Kliknite gumb Naprej za nadaljevanje z " #~ "namestitvijo." #~ msgid "Enabling and disabling extensions" #~ msgstr "OmogoÄanje in onemogoÄanje razÅ¡iritev " #~ msgid "" #~ "You might want to temporarily enable or disable a particular extension " #~ "package, for example, if the extension is not stable enough to handle a " #~ "large amount of photos or if menus get crowded with extensions." #~ msgstr "" #~ "Morda želite zaÄasno omogoÄiti ali onemogoÄiti doloÄen paket razÅ¡iritve, " #~ "na primer Äe razÅ¡iritev ni dovolj stabilna za upravljanje z veliko " #~ "koliÄino fotografij ali Äe so meniji preveÄ natrpani z razÅ¡iritvami." #~ msgid "" #~ "In the Manage Extensions dialog select the extension " #~ "package and click Enable or Disable." #~ msgstr "" #~ "V pogovornem oknu Upravljanje razÅ¡iritev izberite " #~ "paket razÅ¡iritev in kliknite gumb OmogoÄi ali " #~ "OnemogoÄi. " #~ msgid "" #~ "If you don't need an extension you can remove it from the system " #~ "completely. In the Manage Extensions dialog select " #~ "the extension package you want to remove and click Delete." #~ msgstr "" #~ "V primeru da razÅ¡iritve ne potrebujete, jo lahko popolnoma odstranite s " #~ "sistema. V pogovornem oknu Upravljanje razÅ¡iritev " #~ "izberite paket razÅ¡iritev, ki ga želite izbrisati in kliknite " #~ "IzbriÅ¡i." #~ msgid "Reading summary of extensions" #~ msgstr "Branje povzetka razÅ¡iritev" #~ msgid "" #~ "Every extension package contains metadata that provides the following " #~ "information about the extension:" #~ msgstr "" #~ "Vsak paket razÅ¡iritve vsebuje metapodatke, ki zagotavljajo naslednje " #~ "podrobnosti o razÅ¡iritvi:" #~ msgid "Description, which usually covers puprose of the extension" #~ msgstr "Opis, ki obiÄajno opiÅ¡e namen razÅ¡iritve" #~ msgid "Author" #~ msgstr "Avtor" #~ msgid "Dependencies" #~ msgstr "Odvisnosti" #~ msgid "" #~ "In the Manage Extensions dialog select the extension " #~ "package you want to read summary of and click Information." #~ msgstr "" #~ "V pogovornem oknu Upravljanje razÅ¡iritev izberite " #~ "paket razÅ¡iritve katerega opis želite prebrati in kliknite " #~ "Podrobnosti." #~ msgid "Developing extensions" #~ msgstr "Razvijanje razÅ¡iritev" #~ msgid "" #~ "Extend F-Spot " #~ "document gives instructions on developing your own extensions for F-Spot." #~ msgstr "" #~ "Dokument razÅ¡irite F-Spot vsebuje navodila za razvijanje vaÅ¡ih lastnih razÅ¡iritev za F-Spot." #~ msgid "Shortcuts" #~ msgstr "Bližnjice" #~ msgid "Global Shortcuts" #~ msgstr "SploÅ¡ne bližnjice" #~ msgid "Key" #~ msgstr "Tipka" #~ msgid "Action" #~ msgstr "Dejanje" #~ msgid "[" #~ msgstr "[" #~ msgid "]" #~ msgstr "]" #~ msgid "Rotate the selected photos to the right" #~ msgstr "Vrtenje izbranih fotografij desno" #~ msgid "Del" #~ msgstr "Del" #~ msgid "Shift" #~ msgstr "Dvigalka" #~ msgid "" #~ "Delete selected photos permanently from the drive. If possible, they will " #~ "moved to trash." #~ msgstr "" #~ "Trajno izbriÅ¡e izbrane fotografije s pogona. V primeru, da je to mogoÄe, " #~ "bodo premaknjene v smeti." #~ msgid "t" #~ msgstr "t" #~ msgid "View or edit tags for selected photos" #~ msgstr "Ogled ali urejanje oznak za izbrane fotografije" #~ msgid "F11" #~ msgstr "F11" #~ msgid "Full screen view" #~ msgstr "Celozaslonski pogled" #~ msgid "Ctrl" #~ msgstr "Ctrl" #~ msgid "I" #~ msgstr "I" #~ msgid "Displays information about the photo" #~ msgstr "Prikaz podrobnosti o fotografiji" #~ msgid "Equals" #~ msgstr "Je enako" #~ msgid "Zoom-in" #~ msgstr "Približanje" #~ msgid "Minus" #~ msgstr "Minus" #~ msgid "Zoom-out" #~ msgstr "Oddaljevanje" #~ msgid "N" #~ msgstr "N" #~ msgid "Alt" #~ msgstr "Alt" #~ msgid "0-5" #~ msgstr "0-5" #~ msgid "Alt plus a number from 0 to 5 rate the selected picture(s)" #~ msgstr "Alt in Å¡tevilo od 0 do 5 za oceno izbran-e/ih slik(e)" #~ msgid "Browse Mode Shortcuts" #~ msgstr "Bližnjice naÄina brskanja" #~ msgid "A" #~ msgstr "A" #~ msgid "Unselect all" #~ msgstr "Preklic izbora" #~ msgid "H" #~ msgstr "H" #~ msgid "J" #~ msgstr "J" #~ msgid "K" #~ msgstr "K" #~ msgid "L" #~ msgstr "L" #~ msgid "Move focus" #~ msgstr "Premakne žariÅ¡Äe" #~ msgid "-Arrow key" #~ msgstr "-Tipka puÅ¡Äice" #~ msgid "Move the focus without changing the selection" #~ msgstr "Premakne žariÅ¡Äe brez spremembe izbora" #~ msgid "Spacebar" #~ msgstr "Preslednica" #~ msgid "Select or unselect the focused photo" #~ msgstr "Izbere ali prekliÄe izbor fotografije v žariÅ¡Äu" #~ msgid "Arrow key" #~ msgstr "Tipka puÅ¡Äice" #~ msgid "Change the photo selection" #~ msgstr "Sprememba izbire fotografije" #~ msgid "Left arrow or Right arrow" #~ msgstr "Leva puÅ¡Äica ali desna puÅ¡Äica" #~ msgid "" #~ "Add/Remove all photos in the row, in the direction pressed, to the " #~ "selection" #~ msgstr "Doda/odstrani vse fotografije v vrstici v izbrani smeri do izbora" #~ msgid "V" #~ msgstr "V" #~ msgid "Pops up a larger preview of the picture pointed by the mouse" #~ msgstr "Pojavi veÄji predogled slike pokazane z miÅ¡ko" #~ msgid "" #~ "Pops up a larger preview and a color histogram of the picture pointed by " #~ "the mouse" #~ msgstr "Pojavi veÄji predogled in barvni histogram slike pokazane z miÅ¡ko" #~ msgid "Tag Shortcuts" #~ msgstr "Bližnjice oznak" #~ msgid "F2" #~ msgstr "F2" #~ msgid "T" #~ msgstr "T" #~ msgid "n/a" #~ msgstr "n/a" #~ msgid "Drag and drop tags to move them" #~ msgstr "Za premikanje oznak jih povlecite in spustite" #~ msgid "" #~ "Type a tag's name to jump to it (only works if tag is shown/expanded)" #~ msgstr "" #~ "Vtipkajte ime oznake za skok nanjo (deluje le, Äe je oznaka prikazana/" #~ "razÅ¡irjena)" #~ msgid "Edit Mode Shortcuts" #~ msgstr "Bližnjice naÄina urejanja" #~ msgid "Page Up" #~ msgstr "Stran navzgor" #~ msgid "Backspace" #~ msgstr "Povratna tipka" #~ msgid "B" #~ msgstr "B" #~ msgid ", , " #~ msgstr ", , " #~ msgid "Go to Previous Photo" #~ msgstr "Pojdi na predhodno fotografijo" #~ msgid "Page Down" #~ msgstr "Stran navzdol" #~ msgid "Go to Next Photo" #~ msgstr "Pojdi na naslednjo fotografijo" #~ msgid "Go to Previous/Next photo or move around a zoomed photo" #~ msgstr "" #~ "Gre na predhodno/naslednjo fotografijo ali premakne naokoli poveÄano " #~ "fotografijo" #~ msgid "R" #~ msgstr "R" #~ msgid "f" #~ msgstr "f" #~ msgid "0" #~ msgstr "0" #~ msgid "Fit the image to the screen" #~ msgstr "Prilagajanje slike zaslonu" #~ msgid "1" #~ msgstr "1" #~ msgid "Zoom Factor to 1.0 (1 screen pixel per image pixel)" #~ msgstr "Faktor poveÄave 1.0 (1 toÄka zaslona na toÄko slike)" #~ msgid "2" #~ msgstr "2" #~ msgid "Zoom Factor to 2.0 (4 screen pixels per image pixel)" #~ msgstr "Faktor poveÄave na 2.0 (4 toÄke zaslona na toÄko slike)" #~ msgid "Escape" #~ msgstr "Ubežna tipka" #~ msgid "Returns to Browser mode" #~ msgstr "Vrne v naÄin brskalnika" #~ msgid "v" #~ msgstr "v" #~ msgid "" #~ "Examine photo with magnifying glass (Loupe). Doubleclick on the Loupe, or " #~ "type again to close it." #~ msgstr "" #~ "PreuÄevanje fotografije s poveÄevalnim steklom. Za zaprtje poveÄevalnega " #~ "stekla kliknite nanj ali vtipkajte ." #~ msgid "-Mousewheel" #~ msgstr "-MiÅ¡kino kolesce" #~ msgid "Faster filmstrip scrolling" #~ msgstr "HitrejÅ¡e drsenje filmskega traku" #~ msgid "i" #~ msgstr "i" #~ msgid "Toggle infobox visibility ''(only when in full screen)''" #~ msgstr "Preklop vidnosti polja podrobnosti \"(le v celozaslonskem naÄinu)\"" f-spot-0.8.2/help/sl/cd.page0000644000175000017500000000045711503407433016041 0ustar00rubenruben00000000000000 ZapiÅ¡i fotografije na CD Izvoz na CD f-spot-0.8.2/help/sl/smugmug.page0000644000175000017500000000100011503407433017120 0ustar00rubenruben00000000000000 PoÅ¡iljanje fotografij na SmugMug SmugMug

Za poÅ¡iljanje fotografij na SmugMug boste potrebovali raÄun SmugMug in interneti dostop. Poleg tega mora biti razÅ¡iritev SmugMug nameÅ¡Äena in omogoÄena.

f-spot-0.8.2/help/sl/flickr.page0000644000175000017500000000077211503407433016725 0ustar00rubenruben00000000000000 Pošiljanje fotografij na Flickr Flickr

Za poÅ¡iljanje fotografij na Flick boste potrebovali raÄun Flickr in internetni dostop. Poleg tega mora biti razÅ¡iritev Flickr nameÅ¡Äena in omogoÄena.

f-spot-0.8.2/help/sl/colors.page0000644000175000017500000000144211503407433016747 0ustar00rubenruben00000000000000 Urejajte barve svojih fotografij Urejanje barv

F-Spot podpira veÄ naÄinov upravljanja barv.

ZmanjÅ¡aj nasiÄenje

Ta naÄin odstrani vse nasiÄenje in barvno sliko spremeni v Ärno-belo sliko.

Sepia uÄinek staranja

Ta naÄin simulira fotografijo, ustvarjeno z uÄinkom staranja.

Samodejna barva

Ta naÄin samodejno prilagodi barve na nastavljen profil.

f-spot-0.8.2/help/sl/versioning.page0000644000175000017500000000155011503407433017631 0ustar00rubenruben00000000000000 Sledite razliÄnim razliÄicam svojih fotografij RazliÄice

F-Spot vam omogoÄa obdržati veÄ razliÄic svojih fotografij. To je Å¡e posebno uporabno pri urejanju fotografij, saj lahko hitro vidite razlike med urejeno razliÄico in izvirnikom.

Za menjavo med razliÄicami med urejanjem:

Dvokliknite na fotografijo, ki jo želite urediti.

V stranski vrstici boste videli spustno polje z oznako RazliÄica:. Za izbiro razliÄice za ogled jo izberite v spustnem polju.

f-spot-0.8.2/help/sl/tag-creation.page0000644000175000017500000000420511503407433020023 0ustar00rubenruben00000000000000 Ustvarjanje oznak za pripenjanje k fotografijam Ustvarjanje

Za uporabo oznak jih morate najprej ustvariti. Za ustvarjanje oznak so na voljo trije glavni naÄini.

Prvi naÄin:

Izberite OznakeUstari novo oznako ....

Izberite nadrejeno oznako pod katero naj se pojavi nova oznaka kot so na primer ljudje ali dogodki. V primeru, da želite ustvariti oznako brez nadrejenega predmeta, izberite (Brez).

Poimenujte oznako.

Kliknite Ustvari

Drugi naÄin:

Desno kliknite v pladnju oznak in izberite Ustvari novo oznako ...

Izberite nadrejeno oznako pod katero naj se pojavi nova oznaka kot so na primer ljudje ali dogodki. V primeru, da želite ustvariti oznako brez nadrejenega predmeta, izberite (Brez).

Poimenujte oznako.

Kliknite Ustvari

Tretji naÄin omogoÄa tudi pripenjanje nove oznake izbranim fotografijam. To storite tako:

Izberite fotografije katerim želite dodati novo oznako.

Desno kliknite na fotografije in izberite Pripni oznakoUstvari novo oznako ....

Izberite nadrejeno oznako pod katero naj se pojavi nova oznaka kot so na primer ljudje ali dogodki. V primeru, da želite ustvariti oznako brez nadrejenega predmeta, izberite (Brez).

Poimenujte oznako.

Kliknite Ustvari

f-spot-0.8.2/help/sl/tag-attach.page0000644000175000017500000000227311503407433017466 0ustar00rubenruben00000000000000 Pripenjanje oznak fotografijam Pripenjanje

S pripenjanjem oznak, ki ste jih ustvarili, si boste olajÅ¡ali iskanje po svojih fotografijah. To kot z ustvarjanjem oznak je za pripenjanje oznak fotografijam na voljo veÄ naÄinov.

Prvi naÄin:

Izberite fotografije katerim želite pripeti oznake.

V pladnju oznak izberite oznako za pripenjanje k izbranim fotografijam.

Kliknite OznakePripni oznako izboru. Namesto tega lahko pritisnete Ctrl+T.

Drugi naÄin:

Izberite fotografije katerim želite pripeti oznake.

Desno kliknite fotografije.

Izberite Pripni oznako in izberite oznako, ki jo želite pripeti.

f-spot-0.8.2/help/sl/ratings.page0000644000175000017500000000203011503407433017107 0ustar00rubenruben00000000000000 Ocenite svoje fotografije z eno do pet zvezdic Ocenjevanje vaših fotografij

F-Spot vam omogoÄa ocenjevanj svojih fotografij z eno do pet zvezdic. Za ocenjevanje fotografij sta na voljo dva naÄina.

Prvi naÄin:

Z dvoklikom izberite fotografijo, ki jo želite oceniti.

V spodnjem desnem kotu boste videli pet pikic, ki ustrezajo vaši oceni. Za oceno ena zvezdica kliknite na prvo piko.

Drugi naÄin:

Izberite fotografij-o/e, ki jih želite oceniti.

Desno kliknite fotografij-o/e, ki j-o/ih želite oceniti. Nato s klikom na ustrezno piko na dnu menija desnega klika izberite oceno.

f-spot-0.8.2/help/sl/rate-search.page0000644000175000017500000000152711503407433017650 0ustar00rubenruben00000000000000 IÅ¡Äite fotografije po oceni zvezdic Iskanje po ocenah

Za iskanje po ocenah:

Izberite NajdiPo oceniIzbor filtra ocen ....

Izberite si obseg ocen, ki ga želite videti.

Kliknite V redu.

Za zaustavitev iskanja po ocenah:

Izberite NajdiPo oceniNastavi filter ocen.

f-spot-0.8.2/help/sl/tags.page0000644000175000017500000000131711503407433016405 0ustar00rubenruben00000000000000 Kratek uvod k zmogljivostim oznaÄevanja v F-Spotu Oznake

Kot nekateri drugi upravljalniki fotografij vam tudi F-Spot omogoÄa oznaÄevanje vaÅ¡ih fotografij. To vam omogoÄa hitro, enostavno na vsebini osnovano iskanje vaÅ¡ih fotografij. OznaÄite lahko ljudi, mesta, najljubÅ¡e stari in celo naredite svojo lastno skupino oznak.

Delo z oznakami
f-spot-0.8.2/help/es/0000777000175000017500000000000011503407433014604 5ustar00rubenruben00000000000000f-spot-0.8.2/help/es/facebook.page0000644000175000017500000000240211503407431017203 0ustar00rubenruben00000000000000 Subir fotos a Facebook Facebook

Para subir fotos a Facebook necesitaraÌ una cuenta Facebook, asiÌ como acceso a internet. TambieÌn debe tener instalada y activada la extensioÌn Facebook.

Para publicar las fotos seleccionadas en Facebook:

Seleccione FotoExportar aFacebook.

Pulse Iniciar sesión. Se mostrará una ventana de un navegador. Inicie sesión en Facebook y pulse «Permitir» para permitir a F-Spot acceder a su perfil de Facebook.

Seleccione si quiere crear un álbum nuevo o añadir fotos a un álbum existente. Si está creando un álbum nuevo, rellene la información relevante.

Edite los títulos para cada foto, si así lo desea.

Cuando haya terminado pulse Añadir.

f-spot-0.8.2/help/es/folder.page0000644000175000017500000000257111503407431016714 0ustar00rubenruben00000000000000 Enviar las fotos a una carpeta Exportar carpeta

F-Spot le permite exportar a una carpeta. Para ello, no obstante, necesitará tener la extensión para exportar carpetas instalada y activada.

Exportar a una carpeta las fotos seleccionadas:

Seleccione FotoExportar aCarpeta....

Seleccione una carpeta.

Proporcione un nombre y una descripción para la galería.

Seleccione un método de exportación. Crear una galería web autónoma creará una carpeta con el contenido ajustado para que se suba a un servidor web para presentar las imágenes en una galería. Sólo guardar los archivos sólo moverá las fotos a la carpeta. Crear una galería usando «Original» creará una carpeta con contenidos apropiados para usarlos con la Galería fotográfica Original.

Pulse Exportar.

f-spot-0.8.2/help/es/introduction.page0000644000175000017500000000124511503407431020157 0ustar00rubenruben00000000000000 Una pequeña introduccioÌn a F-Spot Introducción

F-Spot es un gestor de fotos lleno de características para el Escritorio GNOME, permitiéndole etiquetar, puntuar y fechar fotos, editar los metadatos de las fotos e incluso incluye un pequeño editor simple de fotos.

Para obtener ayuda acerca de cómo comenzar a usar F-Spot, consulte el archivo de ayuda funciones básicas.

f-spot-0.8.2/help/es/tag-remove.page0000644000175000017500000000214411503407431017503 0ustar00rubenruben00000000000000 Quitar etiquetas de las fotos Eliminando

Al igual que al añadir etiquetas, existen principalmente dos métodos para quitar etiquetas de las fotos.

Método uno:

Seleccione las fotos de las que quiera quitar la etiqueta.

En el panel de etiquetas, seleccione una etiqueta para quitar de las fotos que ha seleccionado.

Pulse EtiquetasQuitar etiqueta de la selección.

Método uno:

Seleccione las fotos de las que quiera quitar la etiqueta.

Pulse con el botón derecho las fotos.

Seleccione Quitar etiqueta y seleccione la etiqueta que quiere quitar.

f-spot-0.8.2/help/es/picasa.page0000644000175000017500000000202411503407431016672 0ustar00rubenruben00000000000000 Subir fotos a PicasaWeb de Google Picasa

Para subir fotos a Picasa necesitaraÌ una cuenta de Picasa, asiÌ como acceso a internet. TambieÌn debe tener instalada y activada la extensioÌn PicasaWeb.

Select the photos you wish to upload.

Click PhotoExport To PicasaWeb....

Add a gallery by clicking Add and supplying a username and password.

j

Select a gallery to export to, or click Add to create a new gallery.

Click Export.

f-spot-0.8.2/help/es/general-editing.page0000644000175000017500000000336111503407431020475 0ustar00rubenruben00000000000000 Realice ediciones simples de sus fotos Edición general

F-Spot le permite realizar ediciones generales simples, incluyendo enderezar, recortar y rotar sus fotos.

Existen tres formas de rotar una foto seleccionada:

Pulse el botón de rotación apropiado, a la izquierda del botón de importación.

Seleccione la opción apropiada en el menú Editar.

Use las teclas de paréntesis para rotar la foto.

Enderezar una foto seleccionada:

Desde el panel de edición seleccione Enderezar.

Seleccione una rotación, desde -45º a 45º.

Pulse Enderezar.

Recortar una foto seleccionada:

Pulse el botón Recortar en el panel de edición.

Seleccione la tasa de proporción, esto es, la proporción entre la altura y la anchura en la que la nueva foto debe ajustarse. Los ejemplos de proporciones incluyen 4x3, 4x6 y 5x7.

Pulse y arrastre para seleccionar el área deseado para mantener. Esta caja se puede arrastrar alrededor después de marcar el tamaño.

Cuando haya seleccionado el área para recortar pulse Recortar.

f-spot-0.8.2/help/es/extensions.page0000644000175000017500000000374511503407431017644 0ustar00rubenruben00000000000000 Trabajar con las extensiones de F-Spot Extensiones

F-Spot permite usar extensiones para proporcionar funcionalidades adicionales.

Para abrir el gestor de extensiones seleccione EditarGestionar extensiones.

Instalar extensiones:

Abrir el gestor de extensiones.

Pulse Instalar complementos.

Seleccione un complemento de la lista para instalar.

Pulse

Compruebe toda la información y pulse Siguiente de nuevo.

Pulse Aceptar.

Activar complementos que ya están instalados:

Abrir el gestor de extensiones.

Seleccione la extensión que quiere activar.

Pulse Activar.

Desactivar complementos que están instalados:

Abrir el gestor de extensiones.

Seleccione la extensión que quiere desactivar.

Pulse Desactivar.

Desinstalar complementos:

Abrir el gestor de extensiones.

Seleccione la extensión que quiere desinstalar.

Pulse Desinstalar.

Pulse

Pulse Aceptar.

f-spot-0.8.2/help/es/23hq.page0000644000175000017500000000073611503407431016217 0ustar00rubenruben00000000000000 Subir fotos a 23hq 23hq

Para subir fotos a 23hq necesitará una cuenta de 23hq, así como acceso a internet. También debe tener instalada y activada la extensión 23hq.

f-spot-0.8.2/help/es/zooomr.page0000644000175000017500000000075411503407432016770 0ustar00rubenruben00000000000000 Subir fotos a Zoomr Zooomr

Para subir fotos a Zooomr necesitaraÌ una cuenta deZooomr, asiÌ como acceso a internet. TambieÌn debe tener instalada y activada la extensioÌn Zooomr.

f-spot-0.8.2/help/es/enhancements.page0000644000175000017500000000232511503407431020106 0ustar00rubenruben00000000000000 Mejoras simples para sus fotos Mejoras

Actualmente existen dos mejoras principales que F-Spot soporta: eliminación de ojos rojos y mejora automática del color.

Quitar ojos rojos:

Pulsando dos veces con el ratón, seleccione la foto sobre la que quiera usar la herramienta de reducción de ojos rojos.

Pulse Reducción de ojos rojos en el panel de edición.

Seleccione el área en el que quiere reducir los ojos rojos. Nota: si contiene muchas áreas rojas puede querer seleccionar cada ojo individualmente.

Pulse Arreglar.

Mejorar automáticamente los colores de la foto:

Pulse dos veces con el ratón, seleccione la foto que quiere mejorar.

Pulsar Autocolor.

f-spot-0.8.2/help/es/import-photos.page0000644000175000017500000000207611503407431020265 0ustar00rubenruben00000000000000 Importar fotos para ser gestionadas Importando fotos

Seguramente lo primero que quiera hacer es importar fotos.

Importar fotos:

Seleccione FotoImportar.... Alternativamente, pulse el botón Importar.

Seleccione un origen del que importar, tal como un dispositivo o una carpeta.

Puede llevar un tiempo que F-Spot indexe los archivos. Cuando haya terminado de indexarlos, se le presentarán sus fotos. en ese momento puede adjuntar etiquetas a todas sus fotos, o puede dejar la tarea para más tarde.

Cuando esté listo para terminar de importar fotos pulse Importar.

f-spot-0.8.2/help/es/index.page0000644000175000017500000000154111503407431016544 0ustar00rubenruben00000000000000 Gestor de fotos F-Spot Gestor de fotos F-Spot Gestor de fotos F-Spot
Funciones básicas
Buscando
Edición de fotos
Compartir
Opciones avanzadas
f-spot-0.8.2/help/es/date-search.page0000644000175000017500000000256111503407431017620 0ustar00rubenruben00000000000000 Buscar fotos por fecha Buscar por fecha

Buscar por fecha:

Pulse BuscarPor fechaEstablecer rango de fechas.

Seleccione un periodo de tiempo en el que ver fotos. Se puede hacer estableciendo un periodo, tal como una semana, o especificando fechas.

Pulse Aceptar.

Alternativamente puede usar la línea de tiempo. Para usar la línea de tiempo:

Asegúrese de que la línea de tiempo está activada seleccionando VerComponentes y seleccionando la casilla Línea de tiempo.

En la línea de tiempo pulse la barra correspondiente con el periodo de tiempo que quiere observar.

Dejar de buscar por fecha:

Seleccione BuscarPor fechaLimpiar el rango de fechas.

f-spot-0.8.2/help/es/adjust-color.page0000644000175000017500000000344011503407431020043 0ustar00rubenruben00000000000000 Ajustar los colores de una foto Ajustar el color

De las herramientas de edición de F-Spot, la de ajuste de color es la más fácil y potente. El editor de color le permite ajustar:

Exposición

Este ajuste estimula la prolongación o acortamiento del tiempo de exposición.

Saturación

Este ajuste simula el ajuste de la cantidad de color en la imagen, ej. deslizarlo a la izquierda disminuye el color, cambiando la imagen a blanco y negro; mientras que deslizarlo a la derecha aumentará la vitalidad de los colores.

Brillo

Este ajuste aumenta el brillo de los colores. Aumentándolo demasiado hará que los colores aparezcan como «lavados», mientras que reduciéndolo demasiado hará que la imagen sea demasiado oscura y le falte contraste.

Tono

Este ajuste hace que los colores «roten» en la rueda de color.

Contraste

Este ajuste cambia la tasa de contraste, esto es, la tasa de diferencia entre los píxeles oscuros y luminosos. Deslizarlo a la izquierda reduce el contraste, mientras que deslizarlo a la derecha aumenta el contraste.

Temperatura

Esto ajusta el color de la temperatura, medido en grados Kelvin.

Matiz

Este ajuste le permite teñir la foto con un color.

f-spot-0.8.2/help/es/upload-to-web.page0000644000175000017500000000070511503407432020116 0ustar00rubenruben00000000000000 Subir fotos a varios servicios web Subir a la web

F-Spot le permite subir fotos a los servicios web más populares, incluyendo PicasaWeb de Google y Flickr.

f-spot-0.8.2/help/es/file-management.page0000644000175000017500000000253211503407431020467 0ustar00rubenruben00000000000000 Gestionar archivos ya importados Gestión de archivos

F-Spot le permite algún control sobre el contenido de su catálogo, esto es, quitar archivos de su catálogo al igual que eliminar archivos del mismo.

Quitar fotos de su catálogo:

Seleccione las fotos que quiere quitar del catálogo.

Pulse con el botón derecho del ratón en las fotos, seleccione Quitar del catálogo. Alternativamente, seleccione EditarQuitar del catálogo o pulse la tecla Suprimir en su teclado.

Eliminar fotos de su equipo:

Seleccione las fotos que quiere eliminar.

Pulse con el botoÌn derecho del ratoÌn en las fotos, seleccione Eliminar de la unidad. Alternativamente, seleccione EditarEliminar de la unidad o pulse las teclas Mayús+Suprimir en su teclado.

f-spot-0.8.2/help/es/es.po0000644000175000017500000012730611503407433015560 0ustar00rubenruben00000000000000# translation of f-spot.help.master.po to Español # Spanish translation for f-spot. # Copyright (C) 2010 f-spot's COPYRIGHT HOLDER # This file is distributed under the same license as the f-spot package. # Jorge González , 2010. # msgid "" msgstr "" "Project-Id-Version: f-spot.help.master\n" "POT-Creation-Date: 2010-10-21 11:49+0000\n" "PO-Revision-Date: 2010-10-23 14:18+0200\n" "Last-Translator: Jorge González \n" "Language-Team: Español \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: KBabel 1.11.4\n" #: C/zooomr.page:8(desc) msgid "Upload photos to Zooomr" msgstr "Subir fotos a Zoomr" #: C/zooomr.page:11(title) msgid "Zooomr" msgstr "Zooomr" #: C/zooomr.page:15(p) msgid "" "To upload photos to Zooomr you will need a Zooomr account, as well as " "internet access. Also, the Zooomr extension " "must be installed and enabled." msgstr "" "Para subir fotos a Zooomr necesitaraÌ una cuenta deZooomr, asiÌ como acceso a " "internet. TambieÌn debe tener instalada y activada la extensioÌn Zooomr." #: C/versioning.page:8(desc) msgid "Track different versions of your photos" msgstr "Seguir diferentes versiones de sus fotos" #: C/versioning.page:11(title) msgid "Versioning" msgstr "Versionado" #: C/versioning.page:14(p) msgid "" "F-Spot allows you to keep multiple versions of your photos. This " "is especially useful when editing photos, as you can quickly see the " "difference between the edited version and the original." msgstr "" "F-Spot le permite tener varias versiones de sus fotos. Esto es " "especialmente útil al editar fotos, ya que puede ver rápidamente la " "diferencia entre la versión editada y la original." #: C/versioning.page:17(p) msgid "To switch between versions while editing:" msgstr "Cambiar entre versiones al editar:" #: C/versioning.page:20(p) msgid "Double-click the photo you wish to edit." msgstr "Pulse dos veces en la foto que quiera editar." #: C/versioning.page:23(p) msgid "" "In the sidebar, you will see a drop-down box labeled Version:. To " "select a version to view, select it in the drop-down box." msgstr "" "En la barra lateral verá una caja desplegable etiquetada como Versión:. Para seleccionar una versión para verla, selecciónela en la caja " "desplegable." #: C/upload-to-web.page:8(desc) msgid "Upload photos to various web services" msgstr "Subir fotos a varios servicios web" #: C/upload-to-web.page:11(title) msgid "Upload to Web" msgstr "Subir a la web" #: C/upload-to-web.page:14(p) msgid "" "F-Spot allows you to upload photos to popular web services, " "including Google's PicasaWeb and Flickr." msgstr "" "F-Spot le permite subir fotos a los servicios web más populares, " "incluyendo PicasaWeb de Google y Flickr." #: C/tags.page:6(desc) msgid "A brief introduction to the tagging capabilities of F-Spot" msgstr "Una pequeña introducción a las capacidades de etiquetado de F-Spot" #: C/tags.page:9(title) msgid "Tags" msgstr "Etiquetas" #: C/tags.page:12(p) msgid "" "Like certain other photo managers, F-Spot lets you tag your " "photos, allowing for quick, easy content-based searching of your photos. You " "can tag people, events, places, favorite things, or even make your own " "groups of tags." msgstr "" "Al igual que otros gestores de fotos, F-Spot le permite etiquetar " "sus fotos, permitiendo una búsqueda rápida y fácil basada en el contenido de " "sus fotos. Puede etiquetar personas, acontecimientos, lugares, cosas " "favoritas o incluso hacer sus propios grupos de etiquetas." #: C/tags.page:17(title) msgid "Working with Tags" msgstr "Trabajar con etiquetas" #: C/tag-search.page:8(desc) msgid "Search photos using tags" msgstr "Buscar fotos usando las etiquetas" #: C/tag-search.page:11(title) msgid "Search by Tag" msgstr "Buscar por etiqueta" #: C/tag-search.page:15(p) msgid "There are several methods to search by tags." msgstr "Existen diversos métodos para buscar por etiquetas." #: C/tag-search.page:16(p) msgid "Method One: Double-click the tags you wish to search for." msgstr "Método uno: pulse dos veces en las etiquetas que quiera buscar." #: C/tag-search.page:17(p) C/tag-remove.page:28(p) C/tag-creation.page:32(p) #: C/tag-attach.page:29(p) C/ratings.page:25(p) msgid "Method Two:" msgstr "Método uno:" #: C/tag-search.page:20(p) msgid "" "Enable the Find bar by clicking FindShow Find bar." msgstr "" "Activar la barra de búsqueda pulsando BuscarMostrar " "barra de búsqueda." #: C/tag-search.page:24(p) msgid "Drag the tags you wish to search for into the newly-enabled Find bar." msgstr "" "Arrastre las etiquetas que quiera buscar en la recién activada barra de " "búsqueda." #: C/tag-search.page:27(p) msgid "" "To remove a tag from your search, right-click the tag in the Find bar and " "click Remove From Search." msgstr "" "Para quitar una etiqueta de su búsqueda, pulse con el botón derecho del " "ratón sobre la etiqueta en la barra de búsqueda y pulse Quitar de la " "búsqueda." #: C/tag-search.page:30(p) msgid "To exclude a tag from your search:" msgstr "Excluir una etiqueta de su búsqueda:" #: C/tag-search.page:33(p) msgid "" "In the tag pane, double-click the tag you wish to exclude. This will add it " "to the Find bar." msgstr "" "En el panel de etiquetas, pulse dos veces sobre la etiqueta que quiera " "excluir. Esto lo añadirá a la barra de búsqueda." #: C/tag-search.page:37(p) msgid "In the Find bar, double-click the tag you wish to exclude." msgstr "" "En la barra de búsqueda, pulse dos veces en la etiqueta que quiera excluir." #: C/tag-remove.page:6(desc) msgid "Removing tags from photos" msgstr "Quitar etiquetas de las fotos" #: C/tag-remove.page:9(title) msgid "Removing" msgstr "Eliminando" #: C/tag-remove.page:12(p) msgid "" "As with attaching tags, there are two main methods of removing tags from " "photos." msgstr "" "Al igual que al añadir etiquetas, existen principalmente dos métodos para " "quitar etiquetas de las fotos." #: C/tag-remove.page:14(p) C/tag-creation.page:14(p) C/tag-attach.page:15(p) #: C/ratings.page:14(p) msgid "Method One:" msgstr "Método uno:" #: C/tag-remove.page:17(p) C/tag-remove.page:31(p) msgid "Select photos from which to remove a tag." msgstr "Seleccione las fotos de las que quiera quitar la etiqueta." #: C/tag-remove.page:20(p) msgid "" "In the tag pane, select a tag to remove from the photos you have selected." msgstr "" "En el panel de etiquetas, seleccione una etiqueta para quitar de las fotos " "que ha seleccionado." #: C/tag-remove.page:24(p) msgid "" "Click TagsRemove Tag From Selection." msgstr "" "Pulse EtiquetasQuitar etiqueta de la selección." #: C/tag-remove.page:34(p) C/tag-attach.page:35(p) msgid "Right click the photos." msgstr "Pulse con el botón derecho las fotos." #: C/tag-remove.page:37(p) msgid "Select Remove Tag and select the tag you wish to remove." msgstr "" "Seleccione Quitar etiqueta y seleccione la etiqueta que quiere " "quitar." #: C/tag-delete.page:6(desc) msgid "Deleting tags from the system" msgstr "Eliminar etiquetas del sistema" #: C/tag-delete.page:9(title) msgid "Deleting" msgstr "Eliminar" #: C/tag-delete.page:12(p) msgid "" "Deleting tags removes them entirely from your system, but leaves behind any " "photos to which that tag is attached." msgstr "" "Eliminar etiquetas las quita completamente del sistema, pero deja las fotos " "que tenían esa etiqueta." #: C/tag-delete.page:14(p) msgid "To delete a tag:" msgstr "Para eliminar una etiqueta:" #: C/tag-delete.page:17(p) msgid "Select the tag you wish to delete from within the tag pane." msgstr "" "Seleccione la etiqueta que quiere eliminar desde el panel de etiquetas." #: C/tag-delete.page:20(p) #| msgid "" #| "Click TagsDelete Select Tag. " #| "Alternatively, right click the tag within the pane, and click Delete " #| "Tag." msgid "" "Click TagsDelete Selected Tag. " "Alternatively, right click the tag within the pane, and click Delete " "Tag." msgstr "" "Pulse EtiquetasEliminar la etiqueta seleccionada. Alternativamente, pulse con el botón derecho del ratón y " "pulse Eliminar etiqueta." #: C/tag-creation.page:6(desc) msgid "Creating tags to be attached to photos" msgstr "Crear etiquetas para adjuntarlas a las fotos" #: C/tag-creation.page:9(title) msgid "Creating" msgstr "Crear" #: C/tag-creation.page:12(p) msgid "" "In order to use tags, you need to first create a set of tags which you wish " "to use. There are three main methods to create tags." msgstr "" "Para poder usar las etiquetas, primero necesita crear un conjunto de ellas " "que quiera usar. Existen principalmente tres métodos para crear etiquetas." #: C/tag-creation.page:17(p) msgid "Select TagsCreate New Tag...." msgstr "" "Seleccione EtiquetasCrear etiqueta nueva...." #: C/tag-creation.page:21(p) C/tag-creation.page:39(p) #: C/tag-creation.page:61(p) msgid "" "Select a parent tag for the new tag to appear under, such as people or " "events. If you wish to create a new tag without a parent, select (None)" "." msgstr "" "Seleccione una etiqueta padre para que la nueva etiqueta aparezca bajo ella, " "tales como gente o eventos. Si quiere crear una etiqueta nueva sin padre, " "seleccione (Ninguno)." #: C/tag-creation.page:26(p) C/tag-creation.page:44(p) #: C/tag-creation.page:66(p) msgid "Name the tag." msgstr "Nombre de la etiqueta." #: C/tag-creation.page:29(p) C/tag-creation.page:47(p) #: C/tag-creation.page:69(p) msgid "Click Create" msgstr "Pulse Crear" #: C/tag-creation.page:35(p) msgid "In the tags page, right click, and select Create New Tag..." msgstr "" "En el panel de etiquetas, pulse con el botón derecho del ratón y seleccione " "Crear etiqueta nueva..." #: C/tag-creation.page:50(p) msgid "" "Method three has the advantage of also attaching the new tag to the photos selected. To do this:" msgstr "" "El método tres tiene la ventana de que puede adjuntar la etiqueta nueva a las fotos seleccionadas. Para hacerlo:" #: C/tag-creation.page:54(p) msgid "Select the photos to which you wish to attach the new tag." msgstr "Seleccione las fotos en las que quiere añadir la etiqueta nueva." #: C/tag-creation.page:57(p) msgid "" "Right-click on the photos, and select Attach TagCreate New Tag...." msgstr "" "Pulse con el botón derecho sobre las fotos y seleccione " "Adjuntar etiquetaCrear etiqueta nueva...." #: C/tag-attach.page:6(desc) msgid "Attaching tags to photos" msgstr "Adjuntar etiquetas a las fotos" #: C/tag-attach.page:9(title) msgid "Attaching" msgstr "Adjuntar" #: C/tag-attach.page:12(p) msgid "" "By attaching tags you have created you " "make it easier to search through your photos. As with creating tags, there " "is more than one method of attaching tags to photos." msgstr "" "Al adjuntar las etiquetas que ha creado " "hará más fácil la búsqueda entre sus fotos. Al igual que para crear " "etiquetas, existe más de un método para adjuntar etiquetas a las fotos." #: C/tag-attach.page:18(p) C/tag-attach.page:32(p) msgid "Select photos to which to attach a tag." msgstr "Seleccione las fotos sobre las que adjuntar la etiqueta." #: C/tag-attach.page:21(p) msgid "" "In the tag pane, select a tag to attach to the photos you have selected." msgstr "" "En el panel de etiquetas seleccione una etiqueta para adjuntar a las fotos " "que ha seleccionado." #: C/tag-attach.page:25(p) msgid "" "Click TagsAttach Tag to Selection. " "Alternatively, press Ctrl+T." msgstr "" "Pulse EtiquetasAdjuntar etiqueta a la selección. Alternativamente, pulse Ctrl+T." #: C/tag-attach.page:38(p) msgid "Select Attach Tag and select the tag you wish to attach." msgstr "" "Seleccione Adjuntar etiqueta y seleccione la etiqueta que quiere " "adjuntar." #: C/smugmug.page:8(desc) msgid "Upload photos to SmugMug" msgstr "Subir fotos a SmugMug" #: C/smugmug.page:11(title) msgid "SmugMug" msgstr "SmugMug" #: C/smugmug.page:15(p) msgid "" "To upload photos to SmugMug you will need a SmugMug account, as well as " "internet access. Also, the SmugMug extension must be installed and enabled." msgstr "" "Para subir fotos a SmugMug necesitaraÌ una cuenta SmugMug, asiÌ como acceso a " "internet. TambieÌn debe tener instalada y activada la extensioÌn SmugMug." #: C/ratings.page:6(desc) msgid "Rate your photos from one to five stars" msgstr "Puntúe sus fotos de una a cinco estrellas" #: C/ratings.page:9(title) msgid "Rating your photos" msgstr "Puntuar sus fotos" #: C/ratings.page:12(p) msgid "" "F-Spot allows you to rate your photos from one to five stars. " "There are two ways to rate photos." msgstr "" "F-Spot le permite puntuar sus fotos desde una a cinco estrellas. " "Existen dos formas de puntuar fotos." #: C/ratings.page:17(p) msgid "By double-clicking, select the photo you wish to rate." msgstr "Al pulsar dos veces seleccionará la foto que quiere puntuar." #: C/ratings.page:20(p) msgid "" "In the lower-right corner, you will see five dots, corresponding to the " "rating you wish to give; to give a rating of one star, for example, click " "the first dot." msgstr "" "En la esquina inferior derecha verá cinco puntos, correspondientes con la " "puntuación que quiere otorgarle; para darle una puntuación de una estrella, " "por ejemplo, pulse el primer punto." #: C/ratings.page:28(p) msgid "Select the photo(s) you wish to rate." msgstr "Seleccione las fotos que quiere puntuar." #: C/ratings.page:31(p) msgid "" "Right-click the photo(s) you wish to rate, and select a rating at the bottom " "of the right-click menu by clicking the corresponding dot." msgstr "" "Pulse con el botón derecho del ratón sobre las fotos que quiere puntuar y " "seleccione una puntuación en la parte inferior del menú contextual del botón " "derecho del ratón, seleccionando el punto correspondiente." #: C/rate-search.page:8(desc) msgid "Search photos by star rating" msgstr "Buscar fotos por puntuación" #: C/rate-search.page:11(title) msgid "Search by Rating" msgstr "Buscar por puntuación" #: C/rate-search.page:15(p) msgid "To search by rating:" msgstr "Buscar por puntuación:" #: C/rate-search.page:18(p) msgid "" "Select FindBy RatingSet Rating Filter...." msgstr "" "Seleccione BuscarPor puntuaciónEstablecer " "el filtro de puntuación...." #: C/rate-search.page:22(p) msgid "Select the rating range which you wish to view." msgstr "Seleccione el rango de puntuación que quiere ver." #: C/rate-search.page:25(p) C/extensions.page:39(p) C/extensions.page:82(p) #: C/date-search.page:27(p) msgid "Click Ok." msgstr "Pulse Aceptar." #: C/rate-search.page:28(p) msgid "To stop searching by rating:" msgstr "Dejar de buscar por puntuación:" #: C/rate-search.page:31(p) msgid "" "Select FindBy RatingSet Rating Filter." msgstr "" "Seleccione BuscarPor puntuacioÌnEstablecer " "el filtro de puntuacioÌn." #: C/picasa.page:8(desc) msgid "Upload photos to Google's PicasaWeb" msgstr "Subir fotos a PicasaWeb de Google" #: C/picasa.page:11(title) msgid "Picasa" msgstr "Picasa" #: C/picasa.page:15(p) msgid "" "To upload photos to Picasa you will need a Picasa account, as well as " "internet access. Also, the PicasaWeb extension must be installed and enabled." msgstr "" "Para subir fotos a Picasa necesitaraÌ una cuenta de Picasa, asiÌ como acceso a " "internet. TambieÌn debe tener instalada y activada la extensioÌn PicasaWeb." #: C/picasa.page:21(p) msgid "Select the photos you wish to upload." msgstr "Seleccione las fotos que quiere subir." #: C/picasa.page:24(p) msgid "" "Click PhotoExport ToPicasaWeb...." msgstr "" "Pulse FotoExportar aPicasaWeb...." #: C/picasa.page:28(p) msgid "" "Add a gallery by clicking Add and supplying a username and " "password." msgstr "" "Añada una galería pulsando Añadir y proporcionando un nombre de " "usuario y contraseña." #: C/picasa.page:32(p) msgid "" "Select a gallery to export to, or click Add to create a new " "gallery." msgstr "" "Seleccione una galería a la que exportar, o pulse Añadir para " "crear una galería nueva." #: C/picasa.page:36(p) C/folder.page:39(p) msgid "Click Export." msgstr "Pulse Exportar." #: C/picasa.page:19(steps) msgid "" "j " msgstr "" "j " #: C/introduction.page:6(desc) msgid "A brief introduction to F-Spot" msgstr "Una pequeña introduccioÌn a F-Spot" #: C/introduction.page:9(title) msgid "Introduction" msgstr "Introducción" #: C/introduction.page:12(p) msgid "" "F-Spot is a full-featured photo manager for the GNOME Desktop, " "allowing you to tag, rate, and date photos, edit photo metadata, and even " "includes a simple in-program photo editor." msgstr "" "F-Spot es un gestor de fotos lleno de características para el " "Escritorio GNOME, permitiéndole etiquetar, puntuar y fechar fotos, editar " "los metadatos de las fotos e incluso incluye un pequeño editor simple de " "fotos." #: C/introduction.page:15(p) msgid "" "For help getting started using F-Spot, check out the basic functions of the help file." msgstr "" "Para obtener ayuda acerca de cómo comenzar a usar F-Spot, " "consulte el archivo de ayuda funciones " "básicas." #: C/index.page:7(title) C/index.page:8(title) C/index.page:11(title) msgid "F-Spot photo manager" msgstr "Gestor de fotos F-Spot" #: C/index.page:16(title) msgid "Basic Functions" msgstr "Funciones básicas" #: C/index.page:20(title) msgid "Searching" msgstr "Buscando" #: C/index.page:24(title) msgid "Photo Editing" msgstr "Edición de fotos" #: C/index.page:28(title) msgid "Sharing" msgstr "Compartir" #: C/index.page:32(title) msgid "Advanced Options" msgstr "Opciones avanzadas" #: C/import-roll-search.page:8(desc) msgid "Searching by date of import" msgstr "Buscar por fecha de importación" #: C/import-roll-search.page:11(title) msgid "Search by Import Roll" msgstr "Buscar por carrete importado" #: C/import-roll-search.page:15(p) msgid "" "Import rolls are \"batches\" of imported photos. Regardless of the date the " "photo was taken, the import roll timestamp is decided when you import photos." msgstr "" "Importar carretes son «lotes» de fotos importadas. Independientemente de la " "fecha en la que se tomó la foto, la fecha de importación del lote se marca " "al importar las fotos." #: C/import-roll-search.page:18(p) msgid "To search by latest import roll:" msgstr "Buscar por el último carrete importado:" #: C/import-roll-search.page:21(p) msgid "" "Select FindBy Import RollLast Import " "Roll." msgstr "" "Seleccione BuscarPor carrete importadoÚltimo carrete importado." #: C/import-roll-search.page:25(p) msgid "To select a previous import roll:" msgstr "Seleccionar un carrete importado anteriormente:" #: C/import-roll-search.page:28(p) msgid "" "Select FindBy Import RollSelect Import " "Rolls." msgstr "" "Seleccione BuscarPor carrete importadoSeleccionar carretes importados…." #: C/import-roll-search.page:32(p) msgid "" "Select an import roll to search, or select a range by choosing Between and select the dates you wish to include." msgstr "" "Seleccione un carrete importado para buscarlo o seleccione un rango " "escogiendo Entre y seleccionando las fechas que quiere incluir." #: C/import-roll-search.page:36(p) msgid "" "To stop searching by import rolls, select FindBy " "Import RollClear Roll Filter." msgstr "" "Para dejar de buscar por carretes importados seleccione BuscarPor carrete importadoLimpiar el filtro de carrete." #: C/import-photos.page:6(desc) msgid "Import photos to be managed" msgstr "Importar fotos para ser gestionadas" #: C/import-photos.page:9(title) msgid "Importing Photos" msgstr "Importando fotos" #: C/import-photos.page:12(p) msgid "Chances are, the first thing you will want to do is import photos." msgstr "Seguramente lo primero que quiera hacer es importar fotos." #: C/import-photos.page:15(p) msgid "To import photos:" msgstr "Importar fotos:" #: C/import-photos.page:20(p) msgid "" "Select PhotoImport.... Alternatively, " "click the Import button." msgstr "" "Seleccione FotoImportar.... " "Alternativamente, pulse el botón Importar." #: C/import-photos.page:24(p) msgid "Select a source from which to import, such as a device or a folder." msgstr "" "Seleccione un origen del que importar, tal como un dispositivo o una carpeta." #: C/import-photos.page:27(p) msgid "" "It may take a while for F-Spot to index the files. When it is done indexing, " "your photos will be presented to you. At this time, you can attach tags to all photos, or you can leave that task for " "later." msgstr "" "Puede llevar un tiempo que F-Spot indexe los archivos. Cuando haya terminado " "de indexarlos, se le presentarán sus fotos. en ese momento puede adjuntar " "etiquetas a todas sus fotos, o puede dejar la " "tarea para más tarde." #: C/import-photos.page:33(p) msgid "When you are ready to finish importing photos, click Import." msgstr "" "Cuando esté listo para terminar de importar fotos pulse Importar." #: C/general-editing.page:6(desc) msgid "Make simple edits to your photos" msgstr "Realice ediciones simples de sus fotos" #: C/general-editing.page:9(title) msgid "General Editing" msgstr "Edición general" #: C/general-editing.page:13(p) msgid "" "F-Spot allows you to make simple general edits, including " "straightening, cropping, and rotating your photos." msgstr "" "F-Spot le permite realizar ediciones generales simples, " "incluyendo enderezar, recortar y rotar sus fotos." #: C/general-editing.page:15(p) msgid "There are three ways to rotate a selected photo:" msgstr "Existen tres formas de rotar una foto seleccionada:" #: C/general-editing.page:18(p) msgid "Click the appropriate rotate button, to the right of the import button." msgstr "" "Pulse el botón de rotación apropiado, a la izquierda del botón de " "importación." #: C/general-editing.page:22(p) msgid "Select the appropriate option from within the Edit menu." msgstr "Seleccione la opción apropiada en el menú Editar." #: C/general-editing.page:26(p) msgid "Use the bracket keys to rotate the photo." msgstr "Use las teclas de paréntesis para rotar la foto." #: C/general-editing.page:29(p) msgid "To straighten a selected photo:" msgstr "Enderezar una foto seleccionada:" #: C/general-editing.page:32(p) msgid "From within the editing pane, select Straighten." msgstr "Desde el panel de edición seleccione Enderezar." #: C/general-editing.page:35(p) msgid "Select a rotation, ranging from -45 to 45 degrees." msgstr "Seleccione una rotación, desde -45º a 45º." #: C/general-editing.page:38(p) msgid "Click Straighten." msgstr "Pulse Enderezar." #: C/general-editing.page:41(p) msgid "To crop a selected photo:" msgstr "Recortar una foto seleccionada:" #: C/general-editing.page:44(p) msgid "Click the Crop button in the Edit pane." msgstr "Pulse el botón Recortar en el panel de edición." #: C/general-editing.page:47(p) msgid "" "Select a contraining aspect ratio, that is, a proportion of height to width " "to which the new photo must fit. Examples of contraining aspect ratios " "include 4x3, 4x6, and 5x7." msgstr "" "Seleccione la tasa de proporción, esto es, la proporción entre la altura y " "la anchura en la que la nueva foto debe ajustarse. Los ejemplos de " "proporciones incluyen 4x3, 4x6 y 5x7." #: C/general-editing.page:52(p) msgid "" "Click and drag to select the desired area to keep. This box can be dragged " "around after being sized." msgstr "" "Pulse y arrastre para seleccionar el área deseado para mantener. Esta caja " "se puede arrastrar alrededor después de marcar el tamaño." #: C/general-editing.page:56(p) msgid "When you have selected your area to crop to, click Crop." msgstr "" "Cuando haya seleccionado el área para recortar pulse Recortar." #: C/folder.page:8(desc) msgid "Send photos to a folder" msgstr "Enviar las fotos a una carpeta" #: C/folder.page:11(title) msgid "Folder Export" msgstr "Exportar carpeta" #: C/folder.page:15(p) msgid "" "F-Spot allows you to export to a folder. In order to do so, " "however, you will need to have the folder export extension installed and enabled." msgstr "" "F-Spot le permite exportar a una carpeta. Para ello, no obstante, " "necesitará tener la extensión para exportar " "carpetas instalada y activada." #: C/folder.page:18(p) msgid "To export selected photos to a folder:" msgstr "Exportar a una carpeta las fotos seleccionadas:" #: C/folder.page:21(p) msgid "" "Select PhotoExport ToFolder...." msgstr "" "Seleccione FotoExportar aCarpeta...." #: C/folder.page:25(p) msgid "Select a folder." msgstr "Seleccione una carpeta." #: C/folder.page:28(p) msgid "Name the gallery and give it a description." msgstr "Proporcione un nombre y una descripción para la galería." #: C/folder.page:31(p) msgid "" "Select an export method. Create Standalone Web Gallery will " "create a folder with contents fit to be uploaded to a web server to present " "pictures in a gallery. Save the files only will only move photos " "to the selected folder. Create gallery using \"Original\" will " "create a folder with contents suitable for using with Original Photo Gallery." msgstr "" "Seleccione un método de exportación. Crear una galería web autónoma creará una carpeta con el contenido ajustado para que se suba a un " "servidor web para presentar las imágenes en una galería. Sólo guardar " "los archivos sólo moverá las fotos a la carpeta. Crear una " "galería usando «Original» creará una carpeta con contenidos apropiados " "para usarlos con la Galería fotográfica Original." #: C/flickr.page:8(desc) msgid "Upload photos to Flickr" msgstr "Subir fotos a Flickr" #: C/flickr.page:11(title) msgid "Flickr" msgstr "Flickr" #: C/flickr.page:15(p) msgid "" "To upload photos to Flickr you will need a Flickr account, as well as " "internet access. Also, the Flickr extension " "must be installed and enabled." msgstr "" "Para subir fotos a Flickr necesitaraÌ una cuenta Flickr, asiÌ como acceso a " "internet. TambieÌn debe tener instalada y activada la extensioÌn Flickr." #: C/file-management.page:8(desc) msgid "Manage files already imported" msgstr "Gestionar archivos ya importados" #: C/file-management.page:11(title) msgid "File Management" msgstr "Gestión de archivos" #: C/file-management.page:15(p) msgid "" "F-Spot allows for some control over the contents of your catalog, " "that is, removing files from your catalog as well as deleting files from " "your catalog." msgstr "" "F-Spot le permite algún control sobre el contenido de su " "catálogo, esto es, quitar archivos de su catálogo al igual que eliminar " "archivos del mismo." #: C/file-management.page:18(p) msgid "To remove files from your catalog:" msgstr "Quitar fotos de su catálogo:" #: C/file-management.page:21(p) msgid "Select the photos you wish to remove from the catalog." msgstr "Seleccione las fotos que quiere quitar del catálogo." #: C/file-management.page:24(p) msgid "" "Right-click the photos, select Remove From Catalog. " "Alternatively, select EditRemove From Catalog or press the Delete key on your keyboard." msgstr "" "Pulse con el botón derecho del ratón en las fotos, seleccione Quitar " "del catálogo. Alternativamente, seleccione EditarQuitar del catálogo o pulse la tecla Suprimir en su " "teclado." #: C/file-management.page:29(p) msgid "To delete photos from your computer:" msgstr "Eliminar fotos de su equipo:" #: C/file-management.page:32(p) msgid "Select the photos you wish to delete." msgstr "Seleccione las fotos que quiere eliminar." #: C/file-management.page:35(p) msgid "" "Right-click the photos, select Delete From Drive. Alternatively, " "select EditDelete From Drive or press " "Shift+Delete on your keyboard." msgstr "" "Pulse con el botoÌn derecho del ratoÌn en las fotos, seleccione Eliminar " "de la unidad. Alternativamente, seleccione EditarEliminar de la unidad o pulse las teclas Mayús" "+Suprimir en su teclado." #: C/facebook.page:8(desc) msgid "Upload photos to Facebook" msgstr "Subir fotos a Facebook" #: C/facebook.page:11(title) msgid "Facebook" msgstr "Facebook" #: C/facebook.page:15(p) msgid "" "To upload photos to Facebook you will need a Facebook account, as well as " "internet access. Also, the Facebook extension must be installed and enabled." msgstr "" "Para subir fotos a Facebook necesitaraÌ una cuenta Facebook, asiÌ como acceso " "a internet. TambieÌn debe tener instalada y activada la extensioÌn Facebook." #: C/facebook.page:20(p) msgid "To post selected photos to Facebook:" msgstr "Para publicar las fotos seleccionadas en Facebook:" #: C/facebook.page:23(p) msgid "" "Select PhotoExport ToFacebook." msgstr "" "Seleccione FotoExportar aFacebook." #: C/facebook.page:27(p) msgid "" "Click Login. A browser window will be brought up. Log in to " "Facebook and click \"Allow\" to allow F-Spot access to your Facebook profile." msgstr "" "Pulse Iniciar sesión. Se mostrará una ventana de un navegador. " "Inicie sesión en Facebook y pulse «Permitir» para permitir a F-Spot acceder " "a su perfil de Facebook." #: C/facebook.page:32(p) msgid "" "Select whether to create a new album or add to an existing album. If you are " "creating a new album, fill in the relevant information." msgstr "" "Seleccione si quiere crear un álbum nuevo o añadir fotos a un álbum " "existente. Si está creando un álbum nuevo, rellene la información relevante." #: C/facebook.page:36(p) msgid "Edit captions for each photo, if so desired." msgstr "Edite los títulos para cada foto, si así lo desea." #: C/facebook.page:39(p) msgid "When finished, click Add." msgstr "Cuando haya terminado pulse Añadir." #: C/extensions.page:8(desc) msgid "Working with F-Spot extensions" msgstr "Trabajar con las extensiones de F-Spot" #: C/extensions.page:11(title) msgid "Extensions" msgstr "Extensiones" #: C/extensions.page:15(p) msgid "" "F-Spot allows for the use of extensions to provide additional " "functionality." msgstr "" "F-Spot permite usar extensiones para proporcionar funcionalidades " "adicionales." #: C/extensions.page:18(p) msgid "" "To open the extension manager, select EditManage " "Extensions." msgstr "" "Para abrir el gestor de extensiones seleccione EditarGestionar extensiones." #: C/extensions.page:21(p) msgid "To install extensions:" msgstr "Instalar extensiones:" #: C/extensions.page:24(p) C/extensions.page:46(p) C/extensions.page:58(p) #: C/extensions.page:70(p) msgid "Open the extension manager." msgstr "Abrir el gestor de extensiones." #: C/extensions.page:27(p) msgid "Click Install Add-ins." msgstr "Pulse Instalar complementos." #: C/extensions.page:30(p) msgid "Select an add-on to install from the list." msgstr "Seleccione un complemento de la lista para instalar." #: C/extensions.page:33(p) C/extensions.page:79(p) msgid "Click Forward." msgstr "Pulse Siguiente." #: C/extensions.page:36(p) msgid "Verify all information, and click Forward again." msgstr "Compruebe toda la información y pulse Siguiente de nuevo." #: C/extensions.page:43(p) msgid "To enable plugins that are already installed:" msgstr "Activar complementos que ya están instalados:" #: C/extensions.page:49(p) msgid "Select the extension you wish to enable." msgstr "Seleccione la extensión que quiere activar." #: C/extensions.page:52(p) msgid "Click Enable." msgstr "Pulse Activar." #: C/extensions.page:55(p) msgid "To disable plugins that are installed:" msgstr "Desactivar complementos que están instalados:" #: C/extensions.page:61(p) msgid "Select the extension you wish to disable." msgstr "Seleccione la extensión que quiere desactivar." #: C/extensions.page:64(p) msgid "Click Disable." msgstr "Pulse Desactivar." #: C/extensions.page:67(p) msgid "To uninstall plugins:" msgstr "Desinstalar complementos:" #: C/extensions.page:73(p) msgid "Select the extension you wish to uninstall." msgstr "Seleccione la extensión que quiere desinstalar." #: C/extensions.page:76(p) msgid "Click Uninstall." msgstr "Pulse Desinstalar." #: C/enhancements.page:6(desc) msgid "Simple enhancements for your photos" msgstr "Mejoras simples para sus fotos" #: C/enhancements.page:9(title) msgid "Enhancements" msgstr "Mejoras" #: C/enhancements.page:13(p) msgid "" "Currently, there are two main enhancements that F-Spot supports: " "red-eye removal and the automatic enhancement of color." msgstr "" "Actualmente existen dos mejoras principales que F-Spot soporta: " "eliminación de ojos rojos y mejora automática del color." #: C/enhancements.page:15(p) msgid "To remove red-eye:" msgstr "Quitar ojos rojos:" #: C/enhancements.page:18(p) msgid "" "By double-clicking, select the photo on which you wish to use the red-eye " "removal tool." msgstr "" "Pulsando dos veces con el ratón, seleccione la foto sobre la que quiera usar " "la herramienta de reducción de ojos rojos." #: C/enhancements.page:22(p) msgid "Click Red-Eye Removal in the Edit panel." msgstr "Pulse Reducción de ojos rojos en el panel de edición." #: C/enhancements.page:25(p) msgid "" "Select the area from which you wish to remove red-eye. Note: If the contains " "many red areas, you may wish to select each eye individually." msgstr "" "Seleccione el área en el que quiere reducir los ojos rojos. Nota: si " "contiene muchas áreas rojas puede querer seleccionar cada ojo " "individualmente." #: C/enhancements.page:30(p) msgid "Click Fix!." msgstr "Pulse Arreglar." #: C/enhancements.page:33(p) msgid "To automatically enhance the colors of the photo:" msgstr "Mejorar automáticamente los colores de la foto:" #: C/enhancements.page:36(p) msgid "By double-clicking, select the photo which you wish to enhance." msgstr "Pulse dos veces con el ratón, seleccione la foto que quiere mejorar." #: C/enhancements.page:39(p) msgid "Click Auto Color." msgstr "Pulsar Autocolor." #: C/date-search.page:8(desc) msgid "Search photos by date" msgstr "Buscar fotos por fecha" #: C/date-search.page:11(title) msgid "Search by Date" msgstr "Buscar por fecha" #: C/date-search.page:15(p) msgid "To search by date:" msgstr "Buscar por fecha:" #: C/date-search.page:18(p) msgid "" "Select FindBy DateSet Date Range...." msgstr "" "Pulse BuscarPor fechaEstablecer rango de " "fechas." #: C/date-search.page:22(p) msgid "" "Select a time period to from which to view photos. This can by done by " "selecting a set period, such as a week, or by specifying dates." msgstr "" "Seleccione un periodo de tiempo en el que ver fotos. Se puede hacer " "estableciendo un periodo, tal como una semana, o especificando fechas." #: C/date-search.page:30(p) msgid "Alternatively, you can use the timeline. To use the timeline:" msgstr "" "Alternativamente puede usar la línea de tiempo. Para usar la línea de tiempo:" #: C/date-search.page:33(p) msgid "" "Make sure the timeline is enabled by selecting ViewComponents and making sure that Timeline " "is checked." msgstr "" "Asegúrese de que la línea de tiempo está activada seleccionando " "VerComponentes y seleccionando la " "casilla Línea de tiempo." #: C/date-search.page:38(p) msgid "" "In the timeline, click the bar corresponding to the time period you wish to " "look at." msgstr "" "En la línea de tiempo pulse la barra correspondiente con el periodo de " "tiempo que quiere observar." #: C/date-search.page:42(p) msgid "To stop searching by date:" msgstr "Dejar de buscar por fecha:" #: C/date-search.page:45(p) msgid "" "Select FindBy DateClear Date Range." msgstr "" "Seleccione BuscarPor fechaLimpiar el " "rango de fechas." #: C/colors.page:6(desc) msgid "Edit the colors of your photos" msgstr "Editar los colores de sus fotos" #: C/colors.page:9(title) msgid "Color Editing" msgstr "Edición de color" #: C/colors.page:12(p) msgid "F-Spot supports several modes of color manipulation." msgstr "F-Spot soporta diversos modos de manipulación de color." #: C/colors.page:15(title) msgid "Desaturate" msgstr "Desaturar" #: C/colors.page:16(p) msgid "" "This mode eliminates all saturation, turning a color image into a black and " "white image." msgstr "" "Este modo elimina toda la saturación, convirtiendo una imagen de color en " "una imagen en blanco y negro." #: C/colors.page:20(title) msgid "Sepia Tone" msgstr "Tono sepia" #: C/colors.page:21(p) msgid "This mode simulates a photo being created with sepia toner." msgstr "Este modo simula una foto creada con un tóner sepia." #: C/colors.page:24(title) msgid "Auto Color" msgstr "Color automático" #: C/colors.page:25(p) msgid "This mode automatically adjusts the colors to a set profile." msgstr "" "Este modo ajusta automáticamente los colores para establecer sobre un perfil." #: C/cd.page:8(desc) msgid "Burn photos to a CD" msgstr "Grabar fotos en un CD" #: C/cd.page:11(title) msgid "CD Export" msgstr "Exportar a CD" #: C/adjust-color.page:6(desc) msgid "Adjusting the colors of a photo" msgstr "Ajustar los colores de una foto" #: C/adjust-color.page:9(title) msgid "Adjust Color" msgstr "Ajustar el color" #: C/adjust-color.page:12(p) msgid "" "As far as the editing tools in F-Spot, adjusting the color is easily the " "most powerful. The color editor allows you to adjust:" msgstr "" "De las herramientas de edición de F-Spot, la de ajuste de color es la más " "fácil y potente. El editor de color le permite ajustar:" #: C/adjust-color.page:16(title) msgid "Exposure" msgstr "Exposición" #: C/adjust-color.page:17(p) msgid "This adjustment simulates lengthening or shortening the exposure time." msgstr "" "Este ajuste estimula la prolongación o acortamiento del tiempo de exposición." #: C/adjust-color.page:21(title) msgid "Saturation" msgstr "Saturación" #: C/adjust-color.page:22(p) msgid "" "This adjustment simulates adjusting the amount of color in the image, i.e. " "sliding it to the left decrease color, making it black and white, while " "sliding it to the right will increase the vibrancy of colors." msgstr "" "Este ajuste simula el ajuste de la cantidad de color en la imagen, ej. " "deslizarlo a la izquierda disminuye el color, cambiando la imagen a blanco y " "negro; mientras que deslizarlo a la derecha aumentará la vitalidad de los " "colores." #: C/adjust-color.page:28(title) msgid "Brightness" msgstr "Brillo" #: C/adjust-color.page:29(p) msgid "" "This adjustment increase the brightness of colors. Increasing this too much " "will make colors appear \"washed out\", while decreasing it too much will " "make the image too dark and lacking in contrast." msgstr "" "Este ajuste aumenta el brillo de los colores. Aumentándolo demasiado hará " "que los colores aparezcan como «lavados», mientras que reduciéndolo " "demasiado hará que la imagen sea demasiado oscura y le falte contraste." #: C/adjust-color.page:34(title) msgid "Hue" msgstr "Tono" #: C/adjust-color.page:35(p) msgid "This adjustment causes colors to \"rotate\" along the color wheel." msgstr "Este ajuste hace que los colores «roten» en la rueda de color." #: C/adjust-color.page:38(title) msgid "Contrast" msgstr "Contraste" #: C/adjust-color.page:39(p) msgid "" "This adjustment adjusts the contrast ratio, that is, the ratio of difference " "between dark and light pixels. Sliding to the left decreases contrast, while " "sliding to the right will increase contrast." msgstr "" "Este ajuste cambia la tasa de contraste, esto es, la tasa de diferencia " "entre los píxeles oscuros y luminosos. Deslizarlo a la izquierda reduce el " "contraste, mientras que deslizarlo a la derecha aumenta el contraste." #: C/adjust-color.page:45(title) msgid "Temp" msgstr "Temperatura" #: C/adjust-color.page:46(p) msgid "This adjust changes the color temperature, measured in degrees Kelvin." msgstr "Esto ajusta el color de la temperatura, medido en grados Kelvin." #: C/adjust-color.page:50(title) msgid "Tint" msgstr "Matiz" #: C/adjust-color.page:51(p) msgid "This adjustment allows you to tinge the photo with a color." msgstr "Este ajuste le permite teñir la foto con un color." #: C/23hq.page:8(desc) msgid "Upload photos to 23hq" msgstr "Subir fotos a 23hq" #: C/23hq.page:11(title) msgid "23hq" msgstr "23hq" #: C/23hq.page:15(p) msgid "" "To upload photos to 23hq you will need a 23hq account, as well as internet " "access. Also, the 23hq extension must be " "installed and enabled." msgstr "" "Para subir fotos a 23hq necesitará una cuenta de 23hq, así como acceso a " "internet. También debe tener instalada y activada la extensión 23hq." #. Put one translator per line, in the form of NAME , YEAR1, YEAR2 #: C/index.page:0(None) msgid "translator-credits" msgstr "Jorge González , 2010" f-spot-0.8.2/help/es/tag-search.page0000644000175000017500000000241511503407432017455 0ustar00rubenruben00000000000000 Buscar fotos usando las etiquetas Buscar por etiqueta

Existen diversos métodos para buscar por etiquetas.

Método uno: pulse dos veces en las etiquetas que quiera buscar.

Método uno:

Activar la barra de búsqueda pulsando BuscarMostrar barra de búsqueda.

Arrastre las etiquetas que quiera buscar en la recién activada barra de búsqueda.

Para quitar una etiqueta de su búsqueda, pulse con el botón derecho del ratón sobre la etiqueta en la barra de búsqueda y pulse Quitar de la búsqueda.

Excluir una etiqueta de su búsqueda:

En el panel de etiquetas, pulse dos veces sobre la etiqueta que quiera excluir. Esto lo añadirá a la barra de búsqueda.

En la barra de búsqueda, pulse dos veces en la etiqueta que quiera excluir.

f-spot-0.8.2/help/es/tag-delete.page0000644000175000017500000000141311503407431017446 0ustar00rubenruben00000000000000 Eliminar etiquetas del sistema Eliminar

Eliminar etiquetas las quita completamente del sistema, pero deja las fotos que tenían esa etiqueta.

Para eliminar una etiqueta:

Seleccione la etiqueta que quiere eliminar desde el panel de etiquetas.

Pulse EtiquetasEliminar la etiqueta seleccionada. Alternativamente, pulse con el botón derecho del ratón y pulse Eliminar etiqueta.

f-spot-0.8.2/help/es/import-roll-search.page0000644000175000017500000000250011503407431021154 0ustar00rubenruben00000000000000 Buscar por fecha de importación Buscar por carrete importado

Importar carretes son «lotes» de fotos importadas. Independientemente de la fecha en la que se tomó la foto, la fecha de importación del lote se marca al importar las fotos.

Buscar por el último carrete importado:

Seleccione BuscarPor carrete importadoÚltimo carrete importado.

Seleccionar un carrete importado anteriormente:

Seleccione BuscarPor carrete importadoSeleccionar carretes importados….

Seleccione un carrete importado para buscarlo o seleccione un rango escogiendo Entre y seleccionando las fechas que quiere incluir.

Para dejar de buscar por carretes importados seleccione BuscarPor carrete importadoLimpiar el filtro de carrete.

f-spot-0.8.2/help/es/cd.page0000644000175000017500000000045511503407431016026 0ustar00rubenruben00000000000000 Grabar fotos en un CD Exportar a CD f-spot-0.8.2/help/es/smugmug.page0000644000175000017500000000076111503407431017124 0ustar00rubenruben00000000000000 Subir fotos a SmugMug SmugMug

Para subir fotos a SmugMug necesitaraÌ una cuenta SmugMug, asiÌ como acceso a internet. TambieÌn debe tener instalada y activada la extensioÌn SmugMug.

f-spot-0.8.2/help/es/flickr.page0000644000175000017500000000075311503407431016713 0ustar00rubenruben00000000000000 Subir fotos a Flickr Flickr

Para subir fotos a Flickr necesitaraÌ una cuenta Flickr, asiÌ como acceso a internet. TambieÌn debe tener instalada y activada la extensioÌn Flickr.

f-spot-0.8.2/help/es/colors.page0000644000175000017500000000147511503407431016744 0ustar00rubenruben00000000000000 Editar los colores de sus fotos Edición de color

F-Spot soporta diversos modos de manipulación de color.

Desaturar

Este modo elimina toda la saturación, convirtiendo una imagen de color en una imagen en blanco y negro.

Tono sepia

Este modo simula una foto creada con un tóner sepia.

Color automático

Este modo ajusta automáticamente los colores para establecer sobre un perfil.

f-spot-0.8.2/help/es/versioning.page0000644000175000017500000000155511503407432017626 0ustar00rubenruben00000000000000 Seguir diferentes versiones de sus fotos Versionado

F-Spot le permite tener varias versiones de sus fotos. Esto es especialmente útil al editar fotos, ya que puede ver rápidamente la diferencia entre la versión editada y la original.

Cambiar entre versiones al editar:

Pulse dos veces en la foto que quiera editar.

En la barra lateral verá una caja desplegable etiquetada como Versión:. Para seleccionar una versión para verla, selecciónela en la caja desplegable.

f-spot-0.8.2/help/es/tag-creation.page0000644000175000017500000000434311503407431020015 0ustar00rubenruben00000000000000 Crear etiquetas para adjuntarlas a las fotos Crear

Para poder usar las etiquetas, primero necesita crear un conjunto de ellas que quiera usar. Existen principalmente tres métodos para crear etiquetas.

Método uno:

Seleccione EtiquetasCrear etiqueta nueva....

Seleccione una etiqueta padre para que la nueva etiqueta aparezca bajo ella, tales como gente o eventos. Si quiere crear una etiqueta nueva sin padre, seleccione (Ninguno).

Nombre de la etiqueta.

Pulse Crear

Método uno:

En el panel de etiquetas, pulse con el botón derecho del ratón y seleccione Crear etiqueta nueva...

Seleccione una etiqueta padre para que la nueva etiqueta aparezca bajo ella, tales como gente o eventos. Si quiere crear una etiqueta nueva sin padre, seleccione (Ninguno).

Nombre de la etiqueta.

Pulse Crear

El método tres tiene la ventana de que puede adjuntar la etiqueta nueva a las fotos seleccionadas. Para hacerlo:

Seleccione las fotos en las que quiere añadir la etiqueta nueva.

Pulse con el botón derecho sobre las fotos y seleccione Adjuntar etiquetaCrear etiqueta nueva....

Seleccione una etiqueta padre para que la nueva etiqueta aparezca bajo ella, tales como gente o eventos. Si quiere crear una etiqueta nueva sin padre, seleccione (Ninguno).

Nombre de la etiqueta.

Pulse Crear

f-spot-0.8.2/help/es/tag-attach.page0000644000175000017500000000236411503407431017456 0ustar00rubenruben00000000000000 Adjuntar etiquetas a las fotos Adjuntar

Al adjuntar las etiquetas que ha creado hará más fácil la búsqueda entre sus fotos. Al igual que para crear etiquetas, existe más de un método para adjuntar etiquetas a las fotos.

Método uno:

Seleccione las fotos sobre las que adjuntar la etiqueta.

En el panel de etiquetas seleccione una etiqueta para adjuntar a las fotos que ha seleccionado.

Pulse EtiquetasAdjuntar etiqueta a la selección. Alternativamente, pulse Ctrl+T.

Método uno:

Seleccione las fotos sobre las que adjuntar la etiqueta.

Pulse con el botón derecho las fotos.

Seleccione Adjuntar etiqueta y seleccione la etiqueta que quiere adjuntar.

f-spot-0.8.2/help/es/ratings.page0000644000175000017500000000221111503407431017077 0ustar00rubenruben00000000000000 Puntúe sus fotos de una a cinco estrellas Puntuar sus fotos

F-Spot le permite puntuar sus fotos desde una a cinco estrellas. Existen dos formas de puntuar fotos.

Método uno:

Al pulsar dos veces seleccionará la foto que quiere puntuar.

En la esquina inferior derecha verá cinco puntos, correspondientes con la puntuación que quiere otorgarle; para darle una puntuación de una estrella, por ejemplo, pulse el primer punto.

Método uno:

Seleccione las fotos que quiere puntuar.

Pulse con el botón derecho del ratón sobre las fotos que quiere puntuar y seleccione una puntuación en la parte inferior del menú contextual del botón derecho del ratón, seleccionando el punto correspondiente.

f-spot-0.8.2/help/es/rate-search.page0000644000175000017500000000161611503407431017636 0ustar00rubenruben00000000000000 Buscar fotos por puntuación Buscar por puntuación

Buscar por puntuación:

Seleccione BuscarPor puntuaciónEstablecer el filtro de puntuación....

Seleccione el rango de puntuación que quiere ver.

Pulse Aceptar.

Dejar de buscar por puntuación:

Seleccione BuscarPor puntuacioÌnEstablecer el filtro de puntuacioÌn.

f-spot-0.8.2/help/es/tags.page0000644000175000017500000000135411503407432016376 0ustar00rubenruben00000000000000 Una pequeña introducción a las capacidades de etiquetado de F-Spot Etiquetas

Al igual que otros gestores de fotos, F-Spot le permite etiquetar sus fotos, permitiendo una búsqueda rápida y fácil basada en el contenido de sus fotos. Puede etiquetar personas, acontecimientos, lugares, cosas favoritas o incluso hacer sus propios grupos de etiquetas.

Trabajar con etiquetas
f-spot-0.8.2/help/Makefile.in0000644000175000017500000013663011503407231016243 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # gnome-doc-utils.make - make magic for building documentation # Copyright (C) 2004-2005 Shaun McCance # # 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. ################################################################################ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/gnome-doc-utils.make subdir = help ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @HAVE_GNOME_DOC_UTILS_TRUE@_clean_doc_header = $(if $(DOC_H_FILE),clean-doc-header) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_REAL_FORMATS = $(if $(DOC_USER_FORMATS),$(DOC_USER_FORMATS),$(DOC_FORMATS)) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_REAL_LINGUAS = $(if $(filter environment,$(origin LINGUAS)), \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(filter $(LINGUAS),$(DOC_LINGUAS)), \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(DOC_LINGUAS)) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_ABS_SRCDIR = @abs_srcdir@ @HAVE_GNOME_DOC_UTILS_TRUE@_xml2po_mode = $(if $(DOC_ID),mallard,docbook) @ENABLE_SK_TRUE@@HAVE_GNOME_DOC_UTILS_TRUE@_ENABLE_SK = true ################################################################################ @HAVE_GNOME_DOC_UTILS_TRUE@db2omf_args = \ @HAVE_GNOME_DOC_UTILS_TRUE@ --stringparam db2omf.basename $(DOC_MODULE) \ @HAVE_GNOME_DOC_UTILS_TRUE@ --stringparam db2omf.format $(3) \ @HAVE_GNOME_DOC_UTILS_TRUE@ --stringparam db2omf.dtd \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(shell xmllint --format $(2) | grep -h PUBLIC | head -n 1 \ @HAVE_GNOME_DOC_UTILS_TRUE@ | sed -e 's/.*PUBLIC \(\"[^\"]*\"\).*/\1/') \ @HAVE_GNOME_DOC_UTILS_TRUE@ --stringparam db2omf.lang $(notdir $(patsubst %/$(notdir $(2)),%,$(2))) \ @HAVE_GNOME_DOC_UTILS_TRUE@ --stringparam db2omf.omf_dir "$(OMF_DIR)" \ @HAVE_GNOME_DOC_UTILS_TRUE@ --stringparam db2omf.help_dir "$(HELP_DIR)" \ @HAVE_GNOME_DOC_UTILS_TRUE@ --stringparam db2omf.omf_in "$(_DOC_OMF_IN)" \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(_ENABLE_SK), \ @HAVE_GNOME_DOC_UTILS_TRUE@ --stringparam db2omf.scrollkeeper_cl "$(_skcontentslist)") \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_db2omf) $(2) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_OMF_IN = $(if $(DOC_MODULE),$(wildcard $(_DOC_ABS_SRCDIR)/$(DOC_MODULE).omf.in)) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_OMF_DB = $(if $(_DOC_OMF_IN), \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(foreach lc,C $(_DOC_REAL_LINGUAS),$(DOC_MODULE)-$(lc).omf)) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_OMF_HTML = $(if $(_DOC_OMF_IN), \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(foreach lc,C $(_DOC_REAL_LINGUAS),$(DOC_MODULE)-html-$(lc).omf)) # FIXME @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_OMF_ALL = \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(filter docbook,$(_DOC_REAL_FORMATS)),$(_DOC_OMF_DB)) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(filter html HTML,$(_DOC_REAL_FORMATS)),$(_DOC_OMF_HTML)) ################################################################################ @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_C_MODULE = $(if $(DOC_MODULE),C/$(DOC_MODULE).xml) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_C_PAGES = $(foreach page,$(DOC_PAGES),C/$(page)) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_C_ENTITIES = $(foreach ent,$(DOC_ENTITIES),C/$(ent)) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_C_INCLUDES = $(foreach inc,$(DOC_INCLUDES),C/$(inc)) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_C_DOCS = \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_DOC_C_ENTITIES) $(_DOC_C_INCLUDES) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_DOC_C_PAGES) $(_DOC_C_MODULE) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_C_DOCS_NOENT = \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_DOC_C_MODULE) $(_DOC_C_INCLUDES) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_DOC_C_PAGES) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_C_FIGURES = $(if $(DOC_FIGURES), \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(foreach fig,$(DOC_FIGURES),C/$(fig)), \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/C/figures/*.png))) # FIXME: probably have to shell escape to determine the file names @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_C_HTML = $(foreach f, \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(shell xsltproc --xinclude \ @HAVE_GNOME_DOC_UTILS_TRUE@ --stringparam db.chunk.basename "$(DOC_MODULE)" \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_chunks) "C/$(DOC_MODULE).xml"), \ @HAVE_GNOME_DOC_UTILS_TRUE@ C/$(f).xhtml) ############################################################################### @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_POFILES = $(if $(DOC_MODULE)$(DOC_ID), \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(foreach lc,$(_DOC_REAL_LINGUAS),$(lc)/$(lc).po)) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_LC_MODULES = $(if $(DOC_MODULE), \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(foreach lc,$(_DOC_REAL_LINGUAS),$(lc)/$(DOC_MODULE).xml)) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_LC_PAGES = \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach page,$(_DOC_C_PAGES), \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(lc)/$(notdir $(page)) )) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_LC_INCLUDES = \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach inc,$(_DOC_C_INCLUDES), \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(lc)/$(notdir $(inc)) )) # FIXME: probably have to shell escape to determine the file names @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_LC_HTML = \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(foreach lc,$(_DOC_REAL_LINGUAS),$(foreach doc,$(_DOC_C_HTML), \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(lc)/$(notdir $(doc)) )) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_LC_DOCS = \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_DOC_LC_MODULES) $(_DOC_LC_INCLUDES) $(_DOC_LC_PAGES) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(filter html HTML,$(_DOC_REAL_FORMATS)),$(_DOC_LC_HTML)) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_LC_FIGURES = $(foreach lc,$(_DOC_REAL_LINGUAS), \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(patsubst C/%,$(lc)/%,$(_DOC_C_FIGURES)) ) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_SRC_FIGURES = \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(foreach fig,$(_DOC_C_FIGURES), $(foreach lc,C $(_DOC_REAL_LINGUAS), \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(wildcard $(srcdir)/$(lc)/$(patsubst C/%,%,$(fig))) )) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_POT = $(if $(DOC_MODULE),$(DOC_MODULE).pot) ################################################################################ @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_HTML_ALL = $(if $(filter html HTML,$(_DOC_REAL_FORMATS)), \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_DOC_C_HTML) $(_DOC_LC_HTML)) @HAVE_GNOME_DOC_UTILS_TRUE@_DOC_HTML_TOPS = $(foreach lc,C $(_DOC_REAL_LINGUAS),$(lc)/$(DOC_MODULE).xhtml) @HAVE_GNOME_DOC_UTILS_TRUE@_clean_omf = $(if $(_DOC_OMF_IN),clean-doc-omf) @HAVE_GNOME_DOC_UTILS_TRUE@_clean_dsk = $(if $(_DOC_DSK_IN),clean-doc-dsk) @HAVE_GNOME_DOC_UTILS_TRUE@_clean_lc = $(if $(_DOC_REAL_LINGUAS),clean-doc-lc) @HAVE_GNOME_DOC_UTILS_TRUE@_clean_dir = $(if $(DOC_MODULE)$(DOC_ID),clean-doc-dir) @HAVE_GNOME_DOC_UTILS_TRUE@_doc_install_dir = $(if $(DOC_ID),$(DOC_ID),$(DOC_MODULE)) @HAVE_GNOME_DOC_UTILS_TRUE@DOC_ID = f-spot @HAVE_GNOME_DOC_UTILS_TRUE@DOC_INCLUDES = @HAVE_GNOME_DOC_UTILS_TRUE@DOC_PAGES = \ @HAVE_GNOME_DOC_UTILS_TRUE@ 23hq.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ adjust-color.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ cd.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ colors.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ date-search.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ enhancements.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ extensions.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ facebook.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ file-management.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ flickr.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ folder.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ general-editing.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ import-photos.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ import-roll-search.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ index.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ introduction.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ picasa.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ rate-search.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ ratings.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ smugmug.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ tag-attach.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ tag-creation.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ tag-delete.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ tag-remove.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ tag-search.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ tags.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ upload-to-web.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ versioning.page \ @HAVE_GNOME_DOC_UTILS_TRUE@ zooomr.page @HAVE_GNOME_DOC_UTILS_TRUE@DOC_FIGURES = \ @HAVE_GNOME_DOC_UTILS_TRUE@ figures/f-spot-adjust-colors.png \ @HAVE_GNOME_DOC_UTILS_TRUE@ figures/f-spot-autocolor.png \ @HAVE_GNOME_DOC_UTILS_TRUE@ figures/f-spot-crop.png \ @HAVE_GNOME_DOC_UTILS_TRUE@ figures/f-spot-desaturate.png \ @HAVE_GNOME_DOC_UTILS_TRUE@ figures/f-spot-fullscreen.png \ @HAVE_GNOME_DOC_UTILS_TRUE@ figures/f-spot-red-eye.png \ @HAVE_GNOME_DOC_UTILS_TRUE@ figures/f-spot-sepia.png \ @HAVE_GNOME_DOC_UTILS_TRUE@ figures/f-spot-slideshow.png \ @HAVE_GNOME_DOC_UTILS_TRUE@ figures/f-spot-soft-focus.png \ @HAVE_GNOME_DOC_UTILS_TRUE@ figures/f-spot-straighten.png @HAVE_GNOME_DOC_UTILS_TRUE@DOC_LINGUAS = de es fr sl all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/gnome-doc-utils.make $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign help/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign help/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: @HAVE_GNOME_DOC_UTILS_FALSE@dist-hook: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." @HAVE_GNOME_DOC_UTILS_FALSE@uninstall-local: @HAVE_GNOME_DOC_UTILS_FALSE@distclean-local: @HAVE_GNOME_DOC_UTILS_FALSE@install-data-local: @HAVE_GNOME_DOC_UTILS_FALSE@maintainer-clean-local: @HAVE_GNOME_DOC_UTILS_FALSE@mostlyclean-local: @HAVE_GNOME_DOC_UTILS_FALSE@clean-local: clean: clean-am clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-local dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic \ maintainer-clean-local mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool \ mostlyclean-local pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ clean-local dist-hook distclean distclean-generic \ distclean-libtool distclean-local distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic maintainer-clean-local mostlyclean \ mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \ pdf-am ps ps-am uninstall uninstall-am uninstall-local @HAVE_GNOME_DOC_UTILS_TRUE@DOC_H_FILE ?= @HAVE_GNOME_DOC_UTILS_TRUE@DOC_H_DOCS ?= @HAVE_GNOME_DOC_UTILS_TRUE@$(DOC_H_FILE): $(DOC_H_DOCS); @HAVE_GNOME_DOC_UTILS_TRUE@ @rm -f $@.tmp; touch $@.tmp; @HAVE_GNOME_DOC_UTILS_TRUE@ echo 'const gchar* documentation_credits[] = {' >> $@.tmp @HAVE_GNOME_DOC_UTILS_TRUE@ list='$(DOC_H_DOCS)'; for doc in $$list; do \ @HAVE_GNOME_DOC_UTILS_TRUE@ xmlpath="`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`:$(srcdir)/`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ if ! test -f "$$doc"; then doc="$(srcdir)/$$doc"; fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ xsltproc --path "$$xmlpath" $(_credits) $$doc; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done | sort | uniq \ @HAVE_GNOME_DOC_UTILS_TRUE@ | awk 'BEGIN{s=""}{n=split($$0,w,"<");if(s!=""&&s!=substr(w[1],1,length(w[1])-1)){print s};if(n>1){print $$0;s=""}else{s=$$0}};END{if(s!=""){print s}}' \ @HAVE_GNOME_DOC_UTILS_TRUE@ | sed -e 's/\\/\\\\/' -e 's/"/\\"/' -e 's/\(.*\)/\t"\1",/' >> $@.tmp @HAVE_GNOME_DOC_UTILS_TRUE@ echo ' NULL' >> $@.tmp @HAVE_GNOME_DOC_UTILS_TRUE@ echo '};' >> $@.tmp @HAVE_GNOME_DOC_UTILS_TRUE@ echo >> $@.tmp @HAVE_GNOME_DOC_UTILS_TRUE@ list='$(DOC_H_DOCS)'; for doc in $$list; do \ @HAVE_GNOME_DOC_UTILS_TRUE@ xmlpath="`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`:$(srcdir)/`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ if ! test -f "$$doc"; then doc="$(srcdir)/$$doc"; fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ docid=`echo "$$doc" | sed -e 's/.*\/\([^/]*\)\.xml/\1/' \ @HAVE_GNOME_DOC_UTILS_TRUE@ | sed -e 's/[^a-zA-Z_]/_/g' | tr 'a-z' 'A-Z'`; \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo $$xmlpath; \ @HAVE_GNOME_DOC_UTILS_TRUE@ ids=`xsltproc --xinclude --path "$$xmlpath" $(_ids) $$doc`; \ @HAVE_GNOME_DOC_UTILS_TRUE@ for id in $$ids; do \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo '#define HELP_'`echo $$docid`'_'`echo $$id \ @HAVE_GNOME_DOC_UTILS_TRUE@ | sed -e 's/[^a-zA-Z_]/_/g' | tr 'a-z' 'A-Z'`' "'$$id'"' >> $@.tmp; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done; \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo >> $@.tmp; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done; @HAVE_GNOME_DOC_UTILS_TRUE@ cp $@.tmp $@ && rm -f $@.tmp @HAVE_GNOME_DOC_UTILS_TRUE@dist-check-gdu: # @echo "*** GNOME Doc Utils must be installed in order to make dist" # @false @HAVE_GNOME_DOC_UTILS_TRUE@.PHONY: dist-doc-header @HAVE_GNOME_DOC_UTILS_TRUE@dist-doc-header: $(DOC_H_FILE) @HAVE_GNOME_DOC_UTILS_TRUE@ @if test -f "$(DOC_H_FILE)"; then d=; else d="$(srcdir)/"; fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "$(INSTALL_DATA) $${d}$(DOC_H_FILE) $(distdir)/$(DOC_H_FILE)"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(INSTALL_DATA) "$${d}$(DOC_H_FILE)" "$(distdir)/$(DOC_H_FILE)"; @HAVE_GNOME_DOC_UTILS_TRUE@doc-dist-hook: dist-check-gdu $(if $(DOC_H_FILE),dist-doc-header) @HAVE_GNOME_DOC_UTILS_TRUE@.PHONY: clean-doc-header @HAVE_GNOME_DOC_UTILS_TRUE@clean-local: $(_clean_doc_header) @HAVE_GNOME_DOC_UTILS_TRUE@distclean-local: $(_clean_doc_header) @HAVE_GNOME_DOC_UTILS_TRUE@mostlyclean-local: $(_clean_doc_header) @HAVE_GNOME_DOC_UTILS_TRUE@maintainer-clean-local: $(_clean_doc_header) @HAVE_GNOME_DOC_UTILS_TRUE@clean-doc-header: @HAVE_GNOME_DOC_UTILS_TRUE@ rm -f $(DOC_H_FILE) @HAVE_GNOME_DOC_UTILS_TRUE@all: $(DOC_H_FILE) ################################################################################ @HAVE_GNOME_DOC_UTILS_TRUE@DOC_MODULE ?= @HAVE_GNOME_DOC_UTILS_TRUE@DOC_ID ?= @HAVE_GNOME_DOC_UTILS_TRUE@DOC_PAGES ?= @HAVE_GNOME_DOC_UTILS_TRUE@DOC_ENTITIES ?= @HAVE_GNOME_DOC_UTILS_TRUE@DOC_INCLUDES ?= @HAVE_GNOME_DOC_UTILS_TRUE@DOC_FIGURES ?= @HAVE_GNOME_DOC_UTILS_TRUE@DOC_FORMATS ?= docbook @HAVE_GNOME_DOC_UTILS_TRUE@DOC_LINGUAS ?= ################################################################################ @HAVE_GNOME_DOC_UTILS_TRUE@_xml2po ?= `which xml2po` @HAVE_GNOME_DOC_UTILS_TRUE@_db2html ?= `$(PKG_CONFIG) --variable db2html gnome-doc-utils` @HAVE_GNOME_DOC_UTILS_TRUE@_db2omf ?= `$(PKG_CONFIG) --variable db2omf gnome-doc-utils` @HAVE_GNOME_DOC_UTILS_TRUE@_malrng ?= `$(PKG_CONFIG) --variable malrng gnome-doc-utils` @HAVE_GNOME_DOC_UTILS_TRUE@_chunks ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/chunks.xsl @HAVE_GNOME_DOC_UTILS_TRUE@_credits ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/credits.xsl @HAVE_GNOME_DOC_UTILS_TRUE@_ids ?= `$(PKG_CONFIG) --variable xmldir gnome-doc-utils`/gnome/xslt/docbook/utils/ids.xsl @ENABLE_SK_TRUE@@HAVE_GNOME_DOC_UTILS_TRUE@_skpkgdatadir ?= `scrollkeeper-config --pkgdatadir` @ENABLE_SK_TRUE@@HAVE_GNOME_DOC_UTILS_TRUE@_sklocalstatedir ?= `scrollkeeper-config --pkglocalstatedir` @ENABLE_SK_TRUE@@HAVE_GNOME_DOC_UTILS_TRUE@_skcontentslist ?= $(_skpkgdatadir)/Templates/C/scrollkeeper_cl.xml @HAVE_GNOME_DOC_UTILS_TRUE@$(_DOC_OMF_DB) : $(_DOC_OMF_IN) @HAVE_GNOME_DOC_UTILS_TRUE@$(_DOC_OMF_DB) : $(DOC_MODULE)-%.omf : %/$(DOC_MODULE).xml @HAVE_GNOME_DOC_UTILS_TRUE@ @test "x$(_ENABLE_SK)" != "xtrue" -o -f "$(_skcontentslist)" || { \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "The file '$(_skcontentslist)' does not exist." >&2; \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "Please check your ScrollKeeper installation." >&2; \ @HAVE_GNOME_DOC_UTILS_TRUE@ exit 1; } @HAVE_GNOME_DOC_UTILS_TRUE@ xsltproc -o $@ $(call db2omf_args,$@,$<,'docbook') || { rm -f "$@"; exit 1; } @HAVE_GNOME_DOC_UTILS_TRUE@$(_DOC_OMF_HTML) : $(_DOC_OMF_IN) @HAVE_GNOME_DOC_UTILS_TRUE@$(_DOC_OMF_HTML) : $(DOC_MODULE)-html-%.omf : %/$(DOC_MODULE).xml @ENABLE_SK_TRUE@@HAVE_GNOME_DOC_UTILS_TRUE@ @test "x$(_ENABLE_SK)" != "xtrue" -o -f "$(_skcontentslist)" || { \ @ENABLE_SK_TRUE@@HAVE_GNOME_DOC_UTILS_TRUE@ echo "The file '$(_skcontentslist)' does not exist" >&2; \ @ENABLE_SK_TRUE@@HAVE_GNOME_DOC_UTILS_TRUE@ echo "Please check your ScrollKeeper installation." >&2; \ @ENABLE_SK_TRUE@@HAVE_GNOME_DOC_UTILS_TRUE@ exit 1; } @HAVE_GNOME_DOC_UTILS_TRUE@ xsltproc -o $@ $(call db2omf_args,$@,$<,'xhtml') || { rm -f "$@"; exit 1; } @HAVE_GNOME_DOC_UTILS_TRUE@.PHONY: omf @HAVE_GNOME_DOC_UTILS_TRUE@omf: $(_DOC_OMF_ALL) @HAVE_GNOME_DOC_UTILS_TRUE@.PHONY: po @HAVE_GNOME_DOC_UTILS_TRUE@po: $(_DOC_POFILES) @HAVE_GNOME_DOC_UTILS_TRUE@$(_DOC_POFILES): @HAVE_GNOME_DOC_UTILS_TRUE@ @if ! test -d $(dir $@); then \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "mkdir $(dir $@)"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ mkdir "$(dir $@)"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi @HAVE_GNOME_DOC_UTILS_TRUE@ @if test ! -f $@ -a -f $(srcdir)/$@; then \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "cp $(srcdir)/$@ $@"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ cp "$(srcdir)/$@" "$@"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi; @HAVE_GNOME_DOC_UTILS_TRUE@ @docs=; \ @HAVE_GNOME_DOC_UTILS_TRUE@ list='$(_DOC_C_DOCS_NOENT)'; for doc in $$list; do \ @HAVE_GNOME_DOC_UTILS_TRUE@ docs="$$docs $(_DOC_ABS_SRCDIR)/$$doc"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done; \ @HAVE_GNOME_DOC_UTILS_TRUE@ if ! test -f $@; then \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "(cd $(dir $@) && \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_xml2po) -m $(_xml2po_mode) -e $$docs > $(notdir $@).tmp && \ @HAVE_GNOME_DOC_UTILS_TRUE@ cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp)"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ (cd $(dir $@) && \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_xml2po) -m $(_xml2po_mode) -e $$docs > $(notdir $@).tmp && \ @HAVE_GNOME_DOC_UTILS_TRUE@ cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp); \ @HAVE_GNOME_DOC_UTILS_TRUE@ else \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "(cd $(dir $@) && \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_xml2po) -m $(_xml2po_mode) -e -u $(notdir $@) $$docs)"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ (cd $(dir $@) && \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_xml2po) -m $(_xml2po_mode) -e -u $(notdir $@) $$docs); \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi # FIXME: fix the dependancy # FIXME: hook xml2po up @HAVE_GNOME_DOC_UTILS_TRUE@$(_DOC_LC_DOCS) : $(_DOC_POFILES) @HAVE_GNOME_DOC_UTILS_TRUE@$(_DOC_LC_DOCS) : $(_DOC_C_DOCS) @HAVE_GNOME_DOC_UTILS_TRUE@ if ! test -d $(dir $@); then mkdir $(dir $@); fi @HAVE_GNOME_DOC_UTILS_TRUE@ if [ -f "C/$(notdir $@)" ]; then d="../"; else d="$(_DOC_ABS_SRCDIR)/"; fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ po="$(dir $@)$(patsubst %/$(notdir $@),%,$@).po"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ if [ -f "$${po}" ]; then po="../$${po}"; else po="$(_DOC_ABS_SRCDIR)/$${po}"; fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ (cd $(dir $@) && \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_xml2po) -m $(_xml2po_mode) -e -p "$${po}" \ @HAVE_GNOME_DOC_UTILS_TRUE@ "$${d}C/$(notdir $@)" > $(notdir $@).tmp && \ @HAVE_GNOME_DOC_UTILS_TRUE@ cp $(notdir $@).tmp $(notdir $@) && rm -f $(notdir $@).tmp) @HAVE_GNOME_DOC_UTILS_TRUE@.PHONY: pot @HAVE_GNOME_DOC_UTILS_TRUE@pot: $(_DOC_POT) @HAVE_GNOME_DOC_UTILS_TRUE@$(_DOC_POT): $(_DOC_C_DOCS_NOENT) @HAVE_GNOME_DOC_UTILS_TRUE@ $(_xml2po) -m $(_xml2po_mode) -e -o $@ $^ @HAVE_GNOME_DOC_UTILS_TRUE@$(_DOC_HTML_TOPS): $(_DOC_C_DOCS) $(_DOC_LC_DOCS) @HAVE_GNOME_DOC_UTILS_TRUE@ xsltproc -o $@ --xinclude --param db.chunk.chunk_top "false()" --stringparam db.chunk.basename "$(DOC_MODULE)" --stringparam db.chunk.extension ".xhtml" $(_db2html) $(patsubst %.xhtml,%.xml,$@) ################################################################################ @HAVE_GNOME_DOC_UTILS_TRUE@all: \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_DOC_C_DOCS) $(_DOC_LC_DOCS) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_DOC_OMF_ALL) $(_DOC_DSK_ALL) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_DOC_HTML_ALL) $(_DOC_POFILES) ################################################################################ @HAVE_GNOME_DOC_UTILS_TRUE@.PHONY: clean-doc-omf clean-doc-dsk clean-doc-lc clean-doc-dir @HAVE_GNOME_DOC_UTILS_TRUE@clean-doc-omf: ; rm -f $(_DOC_OMF_DB) $(_DOC_OMF_HTML) @HAVE_GNOME_DOC_UTILS_TRUE@clean-doc-dsk: ; rm -f $(_DOC_DSK_DB) $(_DOC_DSK_HTML) @HAVE_GNOME_DOC_UTILS_TRUE@clean-doc-lc: @HAVE_GNOME_DOC_UTILS_TRUE@ rm -f $(_DOC_LC_DOCS) @HAVE_GNOME_DOC_UTILS_TRUE@ @list='$(_DOC_POFILES)'; for po in $$list; do \ @HAVE_GNOME_DOC_UTILS_TRUE@ if ! test "$$po" -ef "$(srcdir)/$$po"; then \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "rm -f $$po"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ rm -f "$$po"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done @HAVE_GNOME_DOC_UTILS_TRUE@ @for lc in C $(_DOC_REAL_LINGUAS); do \ @HAVE_GNOME_DOC_UTILS_TRUE@ if test -f "$$lc/.xml2po.mo"; then \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "rm -f $$lc/.xml2po.mo"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ rm -f "$$lc/.xml2po.mo"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done @HAVE_GNOME_DOC_UTILS_TRUE@clean-doc-dir: clean-doc-lc @HAVE_GNOME_DOC_UTILS_TRUE@ @for lc in C $(_DOC_REAL_LINGUAS); do \ @HAVE_GNOME_DOC_UTILS_TRUE@ for dir in `find $$lc -depth -type d`; do \ @HAVE_GNOME_DOC_UTILS_TRUE@ if ! test $$dir -ef $(srcdir)/$$dir; then \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "rmdir $$dir"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ rmdir "$$dir"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done @HAVE_GNOME_DOC_UTILS_TRUE@clean-local: \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_clean_omf) $(_clean_dsk) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_clean_lc) $(_clean_dir) @HAVE_GNOME_DOC_UTILS_TRUE@distclean-local: \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_clean_omf) $(_clean_dsk) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_clean_lc) $(_clean_dir) @HAVE_GNOME_DOC_UTILS_TRUE@mostlyclean-local: \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_clean_omf) $(_clean_dsk) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_clean_lc) $(_clean_dir) @HAVE_GNOME_DOC_UTILS_TRUE@maintainer-clean-local: \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_clean_omf) $(_clean_dsk) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(_clean_lc) $(_clean_dir) ################################################################################ @HAVE_GNOME_DOC_UTILS_TRUE@.PHONY: dist-doc-docs dist-doc-pages dist-doc-figs dist-doc-omf dist-doc-dsk @HAVE_GNOME_DOC_UTILS_TRUE@doc-dist-hook: \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(DOC_MODULE)$(DOC_ID),dist-doc-docs) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(_DOC_C_FIGURES),dist-doc-figs) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(_DOC_OMF_IN),dist-doc-omf) # $(if $(_DOC_DSK_IN),dist-doc-dsk) @HAVE_GNOME_DOC_UTILS_TRUE@dist-doc-docs: $(_DOC_C_DOCS) $(_DOC_LC_DOCS) $(_DOC_POFILES) @HAVE_GNOME_DOC_UTILS_TRUE@ @for lc in C $(_DOC_REAL_LINGUAS); do \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo " $(mkinstalldirs) $(distdir)/$$lc"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(mkinstalldirs) "$(distdir)/$$lc"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done @HAVE_GNOME_DOC_UTILS_TRUE@ @list='$(_DOC_C_DOCS) $(_DOC_LC_DOCS) $(_DOC_POFILES)'; \ @HAVE_GNOME_DOC_UTILS_TRUE@ for doc in $$list; do \ @HAVE_GNOME_DOC_UTILS_TRUE@ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ docdir=`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ @HAVE_GNOME_DOC_UTILS_TRUE@ if ! test -d "$(distdir)/$$docdir"; then \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "$(mkinstalldirs) $(distdir)/$$docdir"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(mkinstalldirs) "$(distdir)/$$docdir"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "$(INSTALL_DATA) $$d$$doc $(distdir)/$$doc"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(INSTALL_DATA) "$$d$$doc" "$(distdir)/$$doc"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done @HAVE_GNOME_DOC_UTILS_TRUE@dist-doc-figs: $(_DOC_SRC_FIGURES) @HAVE_GNOME_DOC_UTILS_TRUE@ @list='$(_DOC_C_FIGURES) $(_DOC_LC_FIGURES)'; \ @HAVE_GNOME_DOC_UTILS_TRUE@ for fig in $$list; do \ @HAVE_GNOME_DOC_UTILS_TRUE@ if test -f "$$fig"; then d=; else d="$(srcdir)/"; fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ if test -f "$$d$$fig"; then \ @HAVE_GNOME_DOC_UTILS_TRUE@ figdir=`echo $$fig | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ @HAVE_GNOME_DOC_UTILS_TRUE@ if ! test -d "$(distdir)/$$figdir"; then \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "$(mkinstalldirs) $(distdir)/$$figdir"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(mkinstalldirs) "$(distdir)/$$figdir"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "$(INSTALL_DATA) $$d$$fig $(distdir)/$$fig"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(INSTALL_DATA) "$$d$$fig" "$(distdir)/$$fig"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done; @HAVE_GNOME_DOC_UTILS_TRUE@dist-doc-omf: @HAVE_GNOME_DOC_UTILS_TRUE@ @if test -f "$(_DOC_OMF_IN)"; then d=; else d="$(srcdir)/"; fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "$(INSTALL_DATA) $$d$(_DOC_OMF_IN) $(distdir)/$(notdir $(_DOC_OMF_IN))"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(INSTALL_DATA) "$$d$(_DOC_OMF_IN)" "$(distdir)/$(notdir $(_DOC_OMF_IN))" @HAVE_GNOME_DOC_UTILS_TRUE@dist-doc-dsk: @HAVE_GNOME_DOC_UTILS_TRUE@ @if test -f "$(_DOC_DSK_IN)"; then d=; else d="$(srcdir)/"; fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "$(INSTALL_DATA) $$d$(_DOC_DSK_IN) $(distdir)/$(notdir $(_DOC_DSK_IN))"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(INSTALL_DATA) "$$d$(_DOC_DSK_IN)" "$(distdir)/$(notdir $(_DOC_DSK_IN))" ################################################################################ @HAVE_GNOME_DOC_UTILS_TRUE@.PHONY: check-doc-docs check-doc-omf @HAVE_GNOME_DOC_UTILS_TRUE@check: \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(DOC_MODULE),check-doc-docs) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(DOC_ID),check-doc-pages) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(_DOC_OMF_IN),check-doc-omf) @HAVE_GNOME_DOC_UTILS_TRUE@check-doc-docs: $(_DOC_C_DOCS) $(_DOC_LC_DOCS) @HAVE_GNOME_DOC_UTILS_TRUE@ @for lc in C $(_DOC_REAL_LINGUAS); do \ @HAVE_GNOME_DOC_UTILS_TRUE@ if test -f "$$lc"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ then d=; \ @HAVE_GNOME_DOC_UTILS_TRUE@ xmlpath="$$lc"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ else \ @HAVE_GNOME_DOC_UTILS_TRUE@ d="$(srcdir)/"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ xmlpath="$$lc:$(srcdir)/$$lc"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "xmllint --noout --noent --path $$xmlpath --xinclude --postvalid $$d$$lc/$(DOC_MODULE).xml"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ xmllint --noout --noent --path "$$xmlpath" --xinclude --postvalid "$$d$$lc/$(DOC_MODULE).xml"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done @HAVE_GNOME_DOC_UTILS_TRUE@check-doc-pages: $(_DOC_C_PAGES) $(_DOC_LC_PAGES) @HAVE_GNOME_DOC_UTILS_TRUE@ for lc in C $(_DOC_REAL_LINGUAS); do \ @HAVE_GNOME_DOC_UTILS_TRUE@ if test -f "$$lc"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ then d=; \ @HAVE_GNOME_DOC_UTILS_TRUE@ xmlpath="$$lc"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ else \ @HAVE_GNOME_DOC_UTILS_TRUE@ d="$(srcdir)/"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ xmlpath="$$lc:$(srcdir)/$$lc"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ for page in $(DOC_PAGES); do \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "xmllint --noout --noent --path $$xmlpath --xinclude --relaxng $(_malrng) $$d$$lc/$$page"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ xmllint --noout --noent --path "$$xmlpath" --xinclude --relaxng "$(_malrng)" "$$d$$lc/$$page"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done @HAVE_GNOME_DOC_UTILS_TRUE@check-doc-omf: $(_DOC_OMF_ALL) @HAVE_GNOME_DOC_UTILS_TRUE@ @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "xmllint --noout --xinclude --dtdvalid 'http://scrollkeeper.sourceforge.net/dtds/scrollkeeper-omf-1.0/scrollkeeper-omf.dtd' $$omf"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ xmllint --noout --xinclude --dtdvalid 'http://scrollkeeper.sourceforge.net/dtds/scrollkeeper-omf-1.0/scrollkeeper-omf.dtd' $$omf; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done ################################################################################ @HAVE_GNOME_DOC_UTILS_TRUE@.PHONY: install-doc-docs install-doc-html install-doc-figs install-doc-omf install-doc-dsk @HAVE_GNOME_DOC_UTILS_TRUE@install-data-local: \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(DOC_MODULE)$(DOC_ID),install-doc-docs) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(_DOC_HTML_ALL),install-doc-html) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(_DOC_C_FIGURES),install-doc-figs) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(_DOC_OMF_IN),install-doc-omf) # $(if $(_DOC_DSK_IN),install-doc-dsk) @HAVE_GNOME_DOC_UTILS_TRUE@install-doc-docs: @HAVE_GNOME_DOC_UTILS_TRUE@ @for lc in C $(_DOC_REAL_LINGUAS); do \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "$(mkinstalldirs) $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$lc"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(mkinstalldirs) $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$lc; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done @HAVE_GNOME_DOC_UTILS_TRUE@ @list='$(_DOC_C_DOCS) $(_DOC_LC_DOCS)'; for doc in $$list; do \ @HAVE_GNOME_DOC_UTILS_TRUE@ if test -f "$$doc"; then d=; else d="$(srcdir)/"; fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ docdir="$$lc/"`echo $$doc | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ @HAVE_GNOME_DOC_UTILS_TRUE@ docdir="$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$docdir"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ if ! test -d "$$docdir"; then \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "$(mkinstalldirs) $$docdir"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(mkinstalldirs) "$$docdir"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "$(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(INSTALL_DATA) $$d$$doc $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done @HAVE_GNOME_DOC_UTILS_TRUE@install-doc-figs: @HAVE_GNOME_DOC_UTILS_TRUE@ @list='$(patsubst C/%,%,$(_DOC_C_FIGURES))'; for fig in $$list; do \ @HAVE_GNOME_DOC_UTILS_TRUE@ for lc in C $(_DOC_REAL_LINGUAS); do \ @HAVE_GNOME_DOC_UTILS_TRUE@ figsymlink=false; \ @HAVE_GNOME_DOC_UTILS_TRUE@ if test -f "$$lc/$$fig"; then \ @HAVE_GNOME_DOC_UTILS_TRUE@ figfile="$$lc/$$fig"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ elif test -f "$(srcdir)/$$lc/$$fig"; then \ @HAVE_GNOME_DOC_UTILS_TRUE@ figfile="$(srcdir)/$$lc/$$fig"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ else \ @HAVE_GNOME_DOC_UTILS_TRUE@ figsymlink=true; \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ figdir="$$lc/"`echo $$fig | sed -e 's/^\(.*\/\).*/\1/' -e '/\//!s/.*//'`; \ @HAVE_GNOME_DOC_UTILS_TRUE@ figdir="$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$figdir"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ if ! test -d "$$figdir"; then \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "$(mkinstalldirs) $$figdir"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(mkinstalldirs) "$$figdir"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ figbase=`echo $$fig | sed -e 's/^.*\///'`; \ @HAVE_GNOME_DOC_UTILS_TRUE@ if $$figsymlink; then \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "cd $$figdir && $(LN_S) -f ../../C/$$fig $$figbase"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ ( cd "$$figdir" && $(LN_S) -f "../../C/$$fig" "$$figbase" ); \ @HAVE_GNOME_DOC_UTILS_TRUE@ else \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "$(INSTALL_DATA) $$figfile $$figdir$$figbase"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(INSTALL_DATA) "$$figfile" "$$figdir$$figbase"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done @HAVE_GNOME_DOC_UTILS_TRUE@install-doc-html: @HAVE_GNOME_DOC_UTILS_TRUE@ echo install-html @HAVE_GNOME_DOC_UTILS_TRUE@install-doc-omf: @HAVE_GNOME_DOC_UTILS_TRUE@ $(mkinstalldirs) $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir) @HAVE_GNOME_DOC_UTILS_TRUE@ @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "$(INSTALL_DATA) $$omf $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(INSTALL_DATA) $$omf $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done @HAVE_GNOME_DOC_UTILS_TRUE@ @if test "x$(_ENABLE_SK)" = "xtrue"; then \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "scrollkeeper-update -p $(DESTDIR)$(_sklocalstatedir) -o $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ scrollkeeper-update -p "$(DESTDIR)$(_sklocalstatedir)" -o "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi; @HAVE_GNOME_DOC_UTILS_TRUE@install-doc-dsk: @HAVE_GNOME_DOC_UTILS_TRUE@ echo install-dsk ################################################################################ @HAVE_GNOME_DOC_UTILS_TRUE@.PHONY: uninstall-doc-docs uninstall-doc-html uninstall-doc-figs uninstall-doc-omf uninstall-doc-dsk @HAVE_GNOME_DOC_UTILS_TRUE@uninstall-local: \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(DOC_MODULE)$(DOC_ID),uninstall-doc-docs) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(_DOC_HTML_ALL),uninstall-doc-html) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(_DOC_C_FIGURES),uninstall-doc-figs) \ @HAVE_GNOME_DOC_UTILS_TRUE@ $(if $(_DOC_OMF_IN),uninstall-doc-omf) # $(if $(_DOC_DSK_IN),uninstall-doc-dsk) @HAVE_GNOME_DOC_UTILS_TRUE@uninstall-doc-docs: @HAVE_GNOME_DOC_UTILS_TRUE@ @list='$(_DOC_C_DOCS) $(_DOC_LC_DOCS)'; for doc in $$list; do \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo " rm -f $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ rm -f "$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$doc"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done @HAVE_GNOME_DOC_UTILS_TRUE@uninstall-doc-figs: @HAVE_GNOME_DOC_UTILS_TRUE@ @list='$(_DOC_C_FIGURES) $(_DOC_LC_FIGURES)'; for fig in $$list; do \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "rm -f $(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$fig"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ rm -f "$(DESTDIR)$(HELP_DIR)/$(_doc_install_dir)/$$fig"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done; @HAVE_GNOME_DOC_UTILS_TRUE@uninstall-doc-omf: @HAVE_GNOME_DOC_UTILS_TRUE@ @list='$(_DOC_OMF_ALL)'; for omf in $$list; do \ @HAVE_GNOME_DOC_UTILS_TRUE@ if test "x$(_ENABLE_SK)" = "xtrue"; then \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "scrollkeeper-uninstall -p $(_sklocalstatedir) $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ scrollkeeper-uninstall -p "$(_sklocalstatedir)" "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ fi; \ @HAVE_GNOME_DOC_UTILS_TRUE@ echo "rm -f $(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ rm -f "$(DESTDIR)$(OMF_DIR)/$(_doc_install_dir)/$$omf"; \ @HAVE_GNOME_DOC_UTILS_TRUE@ done @HAVE_GNOME_DOC_UTILS_TRUE@dist-hook: doc-dist-hook # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/help/Makefile.am0000644000175000017500000000217711503362130016226 0ustar00rubenruben00000000000000if HAVE_GNOME_DOC_UTILS include $(top_srcdir)/gnome-doc-utils.make DOC_ID = f-spot DOC_INCLUDES = DOC_PAGES = \ 23hq.page \ adjust-color.page \ cd.page \ colors.page \ date-search.page \ enhancements.page \ extensions.page \ facebook.page \ file-management.page \ flickr.page \ folder.page \ general-editing.page \ import-photos.page \ import-roll-search.page \ index.page \ introduction.page \ picasa.page \ rate-search.page \ ratings.page \ smugmug.page \ tag-attach.page \ tag-creation.page \ tag-delete.page \ tag-remove.page \ tag-search.page \ tags.page \ upload-to-web.page \ versioning.page \ zooomr.page DOC_FIGURES = \ figures/f-spot-adjust-colors.png \ figures/f-spot-autocolor.png \ figures/f-spot-crop.png \ figures/f-spot-desaturate.png \ figures/f-spot-fullscreen.png \ figures/f-spot-red-eye.png \ figures/f-spot-sepia.png \ figures/f-spot-slideshow.png \ figures/f-spot-soft-focus.png \ figures/f-spot-straighten.png DOC_LINGUAS = de es fr sl dist-hook: doc-dist-hook endif f-spot-0.8.2/help/C/0000777000175000017500000000000011503407434014360 5ustar00rubenruben00000000000000f-spot-0.8.2/help/C/facebook.page0000644000175000017500000000231611503407427016767 0ustar00rubenruben00000000000000 Upload photos to Facebook Facebook

To upload photos to Facebook you will need a Facebook account, as well as internet access. Also, the Facebook extension must be installed and enabled.

To post selected photos to Facebook:

Select PhotoExport ToFacebook .

Click Login. A browser window will be brought up. Log in to Facebook and click "Allow" to allow F-Spot access to your Facebook profile.

Select whether to create a new album or add to an existing album. If you are creating a new album, fill in the relevant information.

Edit captions for each photo, if so desired.

When finished, click Add.

f-spot-0.8.2/help/C/folder.page0000644000175000017500000000250011503407427016464 0ustar00rubenruben00000000000000 Send photos to a folder Folder Export

F-Spot allows you to export to a folder. In order to do so, however, you will need to have the folder export extension installed and enabled.

To export selected photos to a folder:

Select PhotoExport ToFolder... .

Select a folder.

Name the gallery and give it a description.

Select an export method. Create Standalone Web Gallery will create a folder with contents fit to be uploaded to a web server to present pictures in a gallery. Save the files only will only move photos to the selected folder. Create gallery using "Original" will create a folder with contents suitable for using with Original Photo Gallery.

Click Export.

f-spot-0.8.2/help/C/introduction.page0000644000175000017500000000113211503407430017724 0ustar00rubenruben00000000000000 A brief introduction to F-Spot Introduction

F-Spot is a full-featured photo manager for the GNOME Desktop, allowing you to tag, rate, and date photos, edit photo metadata, and even includes a simple in-program photo editor.

For help getting started using F-Spot, check out the basic functions of the help file.

f-spot-0.8.2/help/C/tag-remove.page0000644000175000017500000000175311503407430017262 0ustar00rubenruben00000000000000 Removing tags from photos Removing

As with attaching tags, there are two main methods of removing tags from photos.

Method One:

Select photos from which to remove a tag.

In the tag pane, select a tag to remove from the photos you have selected.

Click TagsRemove Tag From Selection .

Method Two:

Select photos from which to remove a tag.

Right click the photos.

Select Remove Tag and select the tag you wish to remove.

f-spot-0.8.2/help/C/picasa.page0000644000175000017500000000201711503407430016446 0ustar00rubenruben00000000000000 Upload photos to Google's PicasaWeb Picasa

To upload photos to Picasa you will need a Picasa account, as well as internet access. Also, the PicasaWeb extension must be installed and enabled.

Select the photos you wish to upload.

Click PhotoExport To PicasaWeb....

Add a gallery by clicking Add and supplying a username and password.

j

Select a gallery to export to, or click Add to create a new gallery.

Click Export.

f-spot-0.8.2/help/C/general-editing.page0000644000175000017500000000330511503407427020253 0ustar00rubenruben00000000000000 Make simple edits to your photos General Editing

F-Spot allows you to make simple general edits, including straightening, cropping, and rotating your photos.

There are three ways to rotate a selected photo:

Click the appropriate rotate button, to the right of the import button.

Select the appropriate option from within the Edit menu.

Use the bracket keys to rotate the photo.

To straighten a selected photo:

From within the editing pane, select Straighten.

Select a rotation, ranging from -45 to 45 degrees.

Click Straighten.

To crop a selected photo:

Click the Crop button in the Edit pane.

Select a contraining aspect ratio, that is, a proportion of height to width to which the new photo must fit. Examples of contraining aspect ratios include 4x3, 4x6, and 5x7.

Click and drag to select the desired area to keep. This box can be dragged around after being sized.

When you have selected your area to crop to, click Crop.

f-spot-0.8.2/help/C/extensions.page0000644000175000017500000000363211503407427017417 0ustar00rubenruben00000000000000 Working with F-Spot extensions Extensions

F-Spot allows for the use of extensions to provide additional functionality.

To open the extension manager, select Edit Manage Extensions.

To install extensions:

Open the extension manager.

Click Install Add-ins.

Select an add-on to install from the list.

Click Forward.

Verify all information, and click Forward again.

Click Ok.

To enable plugins that are already installed:

Open the extension manager.

Select the extension you wish to enable.

Click Enable.

To disable plugins that are installed:

Open the extension manager.

Select the extension you wish to disable.

Click Disable.

To uninstall plugins:

Open the extension manager.

Select the extension you wish to uninstall.

Click Uninstall.

Click Forward.

Click Ok.

f-spot-0.8.2/help/C/23hq.page0000644000175000017500000000073611503407427015777 0ustar00rubenruben00000000000000 Upload photos to 23hq 23hq

To upload photos to 23hq you will need a 23hq account, as well as internet access. Also, the 23hq extension must be installed and enabled.

f-spot-0.8.2/help/C/zooomr.page0000644000175000017500000000075211503407430016537 0ustar00rubenruben00000000000000 Upload photos to Zooomr Zooomr

To upload photos to Zooomr you will need a Zooomr account, as well as internet access. Also, the Zooomr extension must be installed and enabled.

f-spot-0.8.2/help/C/enhancements.page0000644000175000017500000000224711503407427017671 0ustar00rubenruben00000000000000 Simple enhancements for your photos Enhancements

Currently, there are two main enhancements that F-Spot supports: red-eye removal and the automatic enhancement of color.

To remove red-eye:

By double-clicking, select the photo on which you wish to use the red-eye removal tool.

Click Red-Eye Removal in the Edit panel.

Select the area from which you wish to remove red-eye. Note: If the contains many red areas, you may wish to select each eye individually.

Click Fix!.

To automatically enhance the colors of the photo:

By double-clicking, select the photo which you wish to enhance.

Click Auto Color.

f-spot-0.8.2/help/C/import-photos.page0000644000175000017500000000206711503407430020037 0ustar00rubenruben00000000000000 Import photos to be managed Importing Photos

Chances are, the first thing you will want to do is import photos.

To import photos:

Select PhotoImport.... Alternatively, click the Import button.

Select a source from which to import, such as a device or a folder.

It may take a while for F-Spot to index the files. When it is done indexing, your photos will be presented to you. At this time, you can attach tags to all photos, or you can leave that task for later.

When you are ready to finish importing photos, click Import.

f-spot-0.8.2/help/C/index.page0000644000175000017500000000150411503407430016315 0ustar00rubenruben00000000000000 F-Spot photo manager F-Spot photo manager F-Spot photo manager
Basic Functions
Searching
Photo Editing
Sharing
Advanced Options
f-spot-0.8.2/help/C/date-search.page0000644000175000017500000000247211503407427017401 0ustar00rubenruben00000000000000 Search photos by date Search by Date

To search by date:

Select FindBy Date Set Date Range....

Select a time period to from which to view photos. This can by done by selecting a set period, such as a week, or by specifying dates.

Click Ok.

Alternatively, you can use the timeline. To use the timeline:

Make sure the timeline is enabled by selecting View Components and making sure that Timeline is checked.

In the timeline, click the bar corresponding to the time period you wish to look at.

To stop searching by date:

Select FindBy Date Clear Date Range.

f-spot-0.8.2/help/C/adjust-color.page0000644000175000017500000000344011503407427017623 0ustar00rubenruben00000000000000 Adjusting the colors of a photo Adjust Color

As far as the editing tools in F-Spot, adjusting the color is easily the most powerful. The color editor allows you to adjust:

Exposure

This adjustment simulates lengthening or shortening the exposure time.

Saturation

This adjustment simulates adjusting the amount of color in the image, i.e. sliding it to the left decrease color, making it black and white, while sliding it to the right will increase the vibrancy of colors.

Brightness

This adjustment increase the brightness of colors. Increasing this too much will make colors appear "washed out", while decreasing it too much will make the image too dark and lacking in contrast.

Hue

This adjustment causes colors to "rotate" along the color wheel.

Contrast

This adjustment adjusts the contrast ratio, that is, the ratio of difference between dark and light pixels. Sliding to the left decreases contrast, while sliding to the right will increase contrast.

Temp

This adjust changes the color temperature, measured in degrees Kelvin.

Tint

This adjustment allows you to tinge the photo with a color.

f-spot-0.8.2/help/C/upload-to-web.page0000644000175000017500000000067111503407430017671 0ustar00rubenruben00000000000000 Upload photos to various web services Upload to Web

F-Spot allows you to upload photos to popular web services, including Google's PicasaWeb and Flickr.

f-spot-0.8.2/help/C/file-management.page0000644000175000017500000000242511503407427020250 0ustar00rubenruben00000000000000 Manage files already imported File Management

F-Spot allows for some control over the contents of your catalog, that is, removing files from your catalog as well as deleting files from your catalog.

To remove files from your catalog:

Select the photos you wish to remove from the catalog.

Right-click the photos, select Remove From Catalog. Alternatively, select EditRemove From Catalog or press the Delete key on your keyboard.

To delete photos from your computer:

Select the photos you wish to delete.

Right-click the photos, select Delete From Drive. Alternatively, select EditDelete From Drive or press Shift+Delete on your keyboard.

f-spot-0.8.2/help/C/tag-search.page0000644000175000017500000000216311503407430017226 0ustar00rubenruben00000000000000 Search photos using tags Search by Tag

There are several methods to search by tags.

Method One: Double-click the tags you wish to search for.

Method Two:

Enable the Find bar by clicking Find Show Find bar.

Drag the tags you wish to search for into the newly-enabled Find bar.

To remove a tag from your search, right-click the tag in the Find bar and click Remove From Search.

To exclude a tag from your search:

In the tag pane, double-click the tag you wish to exclude. This will add it to the Find bar.

In the Find bar, double-click the tag you wish to exclude.

f-spot-0.8.2/help/C/tag-delete.page0000644000175000017500000000134011503407430017217 0ustar00rubenruben00000000000000 Deleting tags from the system Deleting

Deleting tags removes them entirely from your system, but leaves behind any photos to which that tag is attached.

To delete a tag:

Select the tag you wish to delete from within the tag pane.

Click TagsDelete Selected Tag. Alternatively, right click the tag within the pane, and click Delete Tag.

f-spot-0.8.2/help/C/import-roll-search.page0000644000175000017500000000226611503407430020737 0ustar00rubenruben00000000000000 Searching by date of import Search by Import Roll

Import rolls are "batches" of imported photos. Regardless of the date the photo was taken, the import roll timestamp is decided when you import photos.

To search by latest import roll:

Select FindBy Import RollLast Import Roll.

To select a previous import roll:

Select FindBy Import RollSelect Import Rolls.

Select an import roll to search, or select a range by choosing Between and select the dates you wish to include.

To stop searching by import rolls, select FindBy Import RollClear Roll Filter.

f-spot-0.8.2/help/C/cd.page0000644000175000017500000000043211503407427015601 0ustar00rubenruben00000000000000 Burn photos to a CD CD Export f-spot-0.8.2/help/C/smugmug.page0000644000175000017500000000076011503407430016675 0ustar00rubenruben00000000000000 Upload photos to SmugMug SmugMug

To upload photos to SmugMug you will need a SmugMug account, as well as internet access. Also, the SmugMug extension must be installed and enabled.

f-spot-0.8.2/help/C/flickr.page0000644000175000017500000000075211503407427016472 0ustar00rubenruben00000000000000 Upload photos to Flickr Flickr

To upload photos to Flickr you will need a Flickr account, as well as internet access. Also, the Flickr extension must be installed and enabled.

f-spot-0.8.2/help/C/colors.page0000644000175000017500000000141011503407427016511 0ustar00rubenruben00000000000000 Edit the colors of your photos Color Editing

F-Spot supports several modes of color manipulation.

Desaturate

This mode eliminates all saturation, turning a color image into a black and white image.

Sepia Tone

This mode simulates a photo being created with sepia toner.

Auto Color

This mode automatically adjusts the colors to a set profile.

f-spot-0.8.2/help/C/versioning.page0000644000175000017500000000154511503407430017376 0ustar00rubenruben00000000000000 Track different versions of your photos Versioning

F-Spot allows you to keep multiple versions of your photos. This is especially useful when editing photos, as you can quickly see the difference between the edited version and the original.

To switch between versions while editing:

Double-click the photo you wish to edit.

In the sidebar, you will see a drop-down box labeled Version:. To select a version to view, select it in the drop-down box.

f-spot-0.8.2/help/C/tag-creation.page0000644000175000017500000000406311503407430017566 0ustar00rubenruben00000000000000 Creating tags to be attached to photos Creating

In order to use tags, you need to first create a set of tags which you wish to use. There are three main methods to create tags.

Method One:

Select TagsCreate New Tag....

Select a parent tag for the new tag to appear under, such as people or events. If you wish to create a new tag without a parent, select (None).

Name the tag.

Click Create

Method Two:

In the tags page, right click, and select Create New Tag...

Select a parent tag for the new tag to appear under, such as people or events. If you wish to create a new tag without a parent, select (None).

Name the tag.

Click Create

Method three has the advantage of also attaching the new tag to the photos selected. To do this:

Select the photos to which you wish to attach the new tag.

Right-click on the photos, and select Attach Tag Create New Tag....

Select a parent tag for the new tag to appear under, such as people or events. If you wish to create a new tag without a parent, select (None).

Name the tag.

Click Create

f-spot-0.8.2/help/C/tag-attach.page0000644000175000017500000000217611503407430017231 0ustar00rubenruben00000000000000 Attaching tags to photos Attaching

By attaching tags you have created you make it easier to search through your photos. As with creating tags, there is more than one method of attaching tags to photos.

Method One:

Select photos to which to attach a tag.

In the tag pane, select a tag to attach to the photos you have selected.

Click TagsAttach Tag to Selection . Alternatively, press Ctrl+T.

Method Two:

Select photos to which to attach a tag.

Right click the photos.

Select Attach Tag and select the tag you wish to attach.

f-spot-0.8.2/help/C/ratings.page0000644000175000017500000000202711503407430016656 0ustar00rubenruben00000000000000 Rate your photos from one to five stars Rating your photos

F-Spot allows you to rate your photos from one to five stars. There are two ways to rate photos.

Method One:

By double-clicking, select the photo you wish to rate.

In the lower-right corner, you will see five dots, corresponding to the rating you wish to give; to give a rating of one star, for example, click the first dot.

Method Two:

Select the photo(s) you wish to rate.

Right-click the photo(s) you wish to rate, and select a rating at the bottom of the right-click menu by clicking the corresponding dot.

f-spot-0.8.2/help/C/rate-search.page0000644000175000017500000000150011503407430017400 0ustar00rubenruben00000000000000 Search photos by star rating Search by Rating

To search by rating:

Select FindBy RatingSet Rating Filter....

Select the rating range which you wish to view.

Click Ok.

To stop searching by rating:

Select FindBy RatingSet Rating Filter.

f-spot-0.8.2/help/C/figures/0000777000175000017500000000000011503407434016024 5ustar00rubenruben00000000000000f-spot-0.8.2/help/C/figures/f-spot-red-eye.png0000644000175000017500000000217511503407434021273 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  šœtIME×Á²è5tEXtComment(c) 2004 Jakub Steiner Created with The GIMPÙ‹oÉIDATHÇí”mL›UÇOécG)ï]åE鬌 ¾]d.Ùš¸ˆ1Ù†/Kg\B‘l(aN—! ™ŒaJ"ê 1~pޱÈ? qÎèJg€-°œ¼  -<ÏõƒÏŽŽ,~1&žä&÷žsïùßû¿ÿsàû·Mº=êM>æÆþ)À}@NùÁW²Ö[Öï$)ïF@ñƒ¢(ÝU•ÕM€g-¨[øœÕG«6çoqî|æZmSWú…îqfe…@XoMN·d–•ì-IJ4gºÛ/õ£· 8€ì#oT|ø¼ë…霜ÜukšÓ+÷ïäÉ­yœ:y‚˜äü“J´Ãñ06«9Ûn·g}wî¼G£l—7lððleUEËEÅ!£1&^–e:zûɵÝÅ[ヌ1&_ÿx‡—°¦¦!ÅÛˆOµ8«Vž^ `ˆÝ_Zb6$&&B T…ìÇ÷ÑÙwû³¬ÌÏ ú ¡… sjFóFdYÞd™Bˆ‘úúêŽ<55}òbÛ&&ýèt:Ò,É(á 1±ñ|ë€uI8ì¹Hz)qÑ ú†PU¯×‹¢lM !ì@acccåNó–Œ +&S,®Ãõ˜âtÌEÅ“v‡žò=vjO{ØýÔvjŽ7~Ó~â˜Gc¡^’¤eUéWéV’z€!Dè:öÎÛ¶ðbx{Áƒ ­¾DéÓ|ùu;,lÜp7)ly@‹$Iï¯õ¸¡Î ~7ø/I’]’¤ÒC¯þÅYðXs«ÏL‘«€!Ù~e"Î>¥—™[RðOÍ&EJþ·¸¡(]+ueoînnÿ}Ó‘"W!}Þ!:/ûl/¹vÐ3<ƒ¬¡t‹ˆ€+Â\]£ù¥¯?ÇEO?Îm[ÿ¢éž,qÑ|~æ+Õd˜›d@ÑZˆXE‘ˆôá …ü³¡eßÕñ,&=Ãþij›äÊÐuª ˆ 7ïò æá´ŠWg¡Å¤ùìÔÙŠò½»hëõáíþ•«5,e4œùy¡÷‹úß:“vl)b«øÚvAº2TBËP9àþéܽ»áûŽ¡|ç£ytö\fa¸«Æ?Ð}¶¯õÓ3þ‘ÀŒ–4¬%ªUu$±u!`QÛö½\½ ·hûèõÍ×!->¯à U2 `R+˜Ià:°„Î7ÔUG+ƒuÚÞ1`Dë ãÚ¹ë r«J–4Êdm®‹š"ôZL¿BŠª–lI[‹H2ýïÛŸ1 pÀ¬J«;IEND®B`‚f-spot-0.8.2/help/C/figures/f-spot-desaturate.png0000644000175000017500000000141211503407434022073 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× $ iØ5­—IDATHÇí•ËKQÇ?3sg¼/ë&Šñré BQ«vš¸kW«þ‚(hQ¶ .­\Ñ¢5¡6…„+ËR¦d‚zŤwW»™;çÎi‘£ãM3Ñv}™?~¿93Ÿó=gÿµ†o±·©-gæU‰'I÷Z’”Ëj)ÓÛ»Ñpû>ï3i[ÓûožÅ‘¶È#DÛÎc -„äD~éÞb„È“L™ÄoèÞw.蚊¡kL}ÈÊZ¤3&©ÌBöÔ©¬I:c‘Ê,ä…útÓ!tMå7@Kks˜¶6\\#ðºÒ7ÉøDbó]7€XXKÓ~ímW.ó|hdSÐÙÑõ-läˆ_³³®Š'oq½=ΫáÑ |…@ÀÏ™S'IÎãî½G¼ìaäY1•уTÕÔnàÊÐ ZNa¾q?ú˜ëcf,À–Ê}””Wm°8@Ó8~¸LCŒþÁ7$¦ž2?ó%Ã)ß8`ñÈ+ öÔ±»®‚—£ fgGÈ~Å,ÚF)yÇù3@J‰”rMX¬¶Œší!Ʀ?óõkÌI„¬ “Í!Wûм¿UuiˆhuÁ`1å#Cï°MýDKk³¾"@J‰³‚͵T„Ò B4º‹r}`¼¥µyká©ëuP¨p‘BÀ'0³âhOwïœ×ˆx÷@Q”CUÕCÓ4LÓDJIOwoÒ¼ë Ô;ŽC2™D!l¤tÐ4ÃЉª*†Žß_D(IJ,r¹–eaY©Ôw‰ë·ÀœÏã ,‘‰óΕº. óòž³¬v²-ì/@ؼâqPTÁÂ?Ý:$ ð˜ÒŠgƒý@`=‡o ˜€Ã¿ÖO:Ar…É^IEND®B`‚f-spot-0.8.2/help/C/figures/f-spot-sepia.png0000644000175000017500000000173011503407434021036 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<UIDAT8µ•Mh\UÇç¾7ïeÒN'/IbMŠÁª µ"( ÒDE+¸é& ˆT1ˆY$vÓ…¢™h²‰ ÁÖbV\ĽI“´"¥¡ÚÐPM;3™fÞË̼ãb&µI¦©Z¼«sî}üÞÿü9÷\QUþe ¿W*•>PUçn`"²bÛöû===ƒ¨*éÁô²øz·Ë|M¦—Uµ¢XCºŽËÙó?nT¬·ÓyóhWûn4Ô(€=Ó-]±ÞÀˆáÕþÿɆo>ê\“Û@[Çåc\<|šðÑ—IÆb”°qÝO,£"œ8UX›‚˜µà=_éÑÁ¼ÑÙΕoÓ|žeÚyëñÇxóµ·Q-uóÝ”·9جõªâ±â{_!êµsò“C4—~㾩O¹œ¤q_7®íЋþ;Å·&"†˜]D­m̹Oá]ϳðE~Ç{ž ]V¬&XÌ&`c ®cc…eÀ"ï{äë<¬ˆÏΠ{þüš_½'™æa2Þ^¶56ÿ3ÅF uŽ…)¯Ù†ÈVŠu[YܲƒúÂUžË!·pŒÌ#ù½¥‹Ð¸˜;)v"6Æ”k– \+cGbùêEîÿå8þô‹© BëÎÚ`©*–RíÖZÎç(ä³x‰{Èi”b²¥H”ÆšØMšÛfog³»gçÌŒM´ÆÝ@£Å‡ÿügf¾o¾ÜáA¶2)žHëÌ["wúøþZ#­v¦ €À·ÁÜ\ó¹¾%@<‘ÞhÖÐÚ @šmÁ‰ÁOº)áí,àÔüXt¶U¿Ÿ>Th0\<}|ÿrÓÄiº.~æ‘Ý«õŒw@‘€nqɈrÜ9±r)3¸Ü°ÀXC@<‘­ îß¡³Ú™Ÿ{Vé÷Kéݬ]ìZÔÎ/v†­Åm¼ÁJ6е§ jPÑ·xo8zx°gབރ‰6Z×èZ}§©Õ·‡ÍB׺vCÜO¤{šm‘·&2]¥Ç¸P1¦…þJª+E«\¬ÉY0ÓPÐÀ*»¶]õw׳ ß,rw©]¸7 Øj¡ÂÛH…[f©¶6pöV€ñóïËCO¾Ð`; øt7Â,»Âåœã4_A¬”¯DëKå6ï·\' ®E@P¹ÕÈìÜÒ./Ò?ì{´³05úãÆ:˜0¸PŽ™¦æJ×3Ü .1æù¸gÐB-$§²}’K­eý‹õRÁŽŒžëÜ}éBÐ.­°—{}Bp1¬I÷Ü?ê žHû¼½và¦__ D|N1á«Ôý4_ R©4ƒ¹+˜³¢Wï./ž±C!?¥°,Û†¯µ• ›½BlzýäËíÓÓ#s}>\çž’B}M ÿþÅk)x@JÓŽ9ŒkÝ·Ûñû)‰‰Ð¦—ÝçŸ}}RvòS Ouꀨ“¤ç}¸Z,‰íÝTœCqR©@y^`S“xwGµöÆØØ›ÞÍ7¯þMœ!¡”U›ŸWn&BçœM „8Pê‘àçÛn8I`ˆêúHûÐ_þ4Wœ£žË!›LV•ßm¹£% yŠjÚÙh¿ŸiçðÊeä®\©(!žFþu¯Mr"¥iåk½½ê×®.•b¬œ$äùÿ´¡' y%Ei9E©3IÈ[wä¯a’w& 9ƒÿküF@—ac8¸IEND®B`‚f-spot-0.8.2/help/C/figures/f-spot-crop.png0000644000175000017500000000540611503407434020704 0ustar00rubenruben00000000000000‰PNG  IHDR—"R˜K¿bKGDÿÿÿ ½§“ pHYs  šœtIME×!%: “IDATxÚí›yPTWƽ Òl.¨À îFŒ1KÇIʨ¨Q÷8ˆKRQ#…QcÐDÅh‚ĨcŒ•(Ž!㔩ÄÝŒ 1†PQ–fk Yºß›?0tènA™¡qúTÝêÛ÷œ¾ç¼w¾¾÷»÷Ý'QåÞªªª°Ê³%vvvMê_þk%ç^6Ï}O^îkVš±È¤2Ü<< ðg|ýü›\÷ïeóéŒ;‘ê„L&G‚Äš©f(:AÇŸÓøúÈAlíìðjסiÁuþô)F ÃÛ¯3¢( è´Ö,5cñïÚ‹ªÊ*Ο>ÅØ©M .UÞC¼|ü¢(Z³ÓDòKúYz¡¦ºò©ûjÓÁÕ?ö7ý´( "“ÊÐéj¬¶Eáé+“! 6=¸$ " ‚5³–®Fȃ(òjàE±Qþ1V±Œ‘K-\µYù–e€Kl”>š\R©Äºíð,Ê#¯ EÅEµÀ•Ô\+¸š•hµõÛ*jì¼ªŠŠ¸výÜÝ=õ]'‚h׳ iiéôíOZZúÿ\÷st ™A/ B§¨®ÖRS£C&•šôó¸DÑòŠPÍôþ‹-3¶…‹¾ÕZÁˆÝo„ÉhI»œÆˆ 1ܼu‹AcH»œfÆgã+;ûq6²téÛhª*©ªª¢°¨¹ü‘«ÇŒ\"Ô«d&/AÙÖ³Þö¦ÊÉÞâ¹.~89»âà¤4j“Ÿ¶Œ¿6MÿÝÁI‰ƒ“…K+:?Äîô§ŽÃ”ïÆ.ü®>ãµD§µÁÄï/§¥4fË—½E~nË—½EИq\NK7é³±Àu;ë{v磻¸­NÇÕk?¡pR´:­InWKè¥õ ¢$c/£ÖªÙ6°õS{çpã³Ør–âÒBÊÕEFíμÊЉÞmåê"JUÙìŒôaјèf9µùLÂÑçô›˜ØwX½*–9á88Ø3'"œÕ«b‰‰}Ç4¡–6¸RS;ÍJeܸ‘‰½ööŽ”¨K‘Ie˜bö†œḚ̈^S–ÆøÑ;Ø~"žò›eFmöG"ú@¦þ{fò2ÌOªc·1ú(““63¨“R3>w\U1έ…á´!ŠH¤¶ yMQª^§ÉûŽA(]ZÑcPßåiôºëûÞåÏ}ºâªt§}×—xûÓ3 Š8:)ptRÖÖE‘JÕY&ÿ¥Ê–®ú¶_‹£“…³+­ýŸgmê]ƒöã¢èã+ˆ"¾ed`”ž¾Œ_zÐàþÚ»Fuegƒ¦Å/ìcêä0ƒ¶©“ÃøòÀ>“÷¯1F®¢âJJK¨¬¬Dªª+ɺ{[[drä66ONèEšèaÓ =°Ÿ\ìø¡ÔøÙ¯ñ¿F²5˜ø3yä_L`t¼–“ñãëØ%hð?¸¶ž­ñ Æî+…Fû;[ZCg{# UœKZ†½r˜¾iÛ˜×)GNÞÞR3et‚^7rÞ¢vãa~.WO$âš¾ºv,-ÔþZß6z*/Çr· @ߦ5K )+ÉçÒþż?{nmÞs|})u‰ €ÄqH¶òàÞuÂ=÷ØÚØw¡ºô\Ã6$åòµ7¡×jµlØü!Q‘ ˜L›6^têÔ•öíÚãîÑ …¢%Ž gަ~õxp™š»wÏ{!ò 3zÔò“Ó¥ÕÆy…Ô5©Ÿs$l/‡¦°7u5Òº|Náj·HnådñEt'–Œ]ZoÞâèìŠÂÕ›i›n².y½^·ñ—b祅M þù1EêuïL}‘˜…Q,xs%Ç2t,ŒÿÊ(õ?²}Ñ0å†qg‹gpßn(•t4›ª’ï úøbå$Z;ÛÄ“0g0v6v ™ûQ?˜¸>Sy¨ÑjÔÞœë£O¶3^$~ý1b8BƒñôlEI‰šru9J¥ Fáß±£9pIÍ:™»7ƒO_DáìŠÂÙ•ìJ- gW£¶•djt¨*’¯ÑµèlCÜ„~ØÉíèò.ÕQ“vÇée¥…¨‹’qá+¦¸þSMÄ?iÃaNº‚þN¤¬ŸFŸÐ-æ—ðFÚBf¬eÒæÃÜÏϧTuQ4Ükjm+5ÙÏû«Ñd`ë< A‰ÂîÏ>7hÛýÙçŒ 13rIŸXçüoڷ²Œ=»3jtBƒðü@ºuïIè¤fÿm&~¾¾æÀežo••¨ Pûù;¡:Y/G3ïÀq¾KÁ´¡‘ÕuìŽlÏ›I—¨ÖVq!i)öžcúÑÕÃu8—±² “ Ÿ¢²¦’“[æàÒi¾^7láî˽™źu±Üþv«^çi+ãbþoülIWfmú† ­aÜ%:…¶:5)ë¦Æb$®¨ßdzu®¦ ·žÓĹVÆÆ°"&–„„D***HHHdEL,+ccÌp®'Ö½œû;v‚à±!ääPV®F&“áççÇä°0fΚƄÐ`/xƒíÚ=îñ”Æ=¯ÒbI2Ñ/µÂwÔ*’_¯`èü¤:v/¾¿é¾…´õlÏ”MYl9²Êh/¬ηIÙõòqøZ$/¦§7‹;òYJ„^·¢GÓ_ DéêÅà)ysë!½nóŒÁŒéÞEËÚQpvÊ\R—ãåæ¡oøbÍVŽè‹»w ÉÕ3Oø—£Û3—6^]IÌ 3Ðe%ý“áïôoнíÓ»)‡²fmž­Û±fm)‡Ò§w/3ž×òŠr¶íØELL,ùª\T…¨Õe”••áìÔ‰DJ@@_<<ÝP8:šŸT¹wŃ{™1o)ÕUËZ³‹5̸œg×=S»ì‹^'îL"6Yne¤Ó3pH…„Á}ú¦NŸÉî];ÌK]ZÊ‘ý;ž^ï¸A`ý¦xæÌy™LÊÝûY8Ú;âåÕJM%wîÜáÚõ«¨T¸8;3jäpZØ›^„Ôî_<"¯w*BÎŽ3qÏÜiÎl«}6gâ²Ì]oï^=ùñÂYär¹Y;Q‘4pŸëøÉ“ 5wÚc?"”WT°sçvæ=ÄÁÞ_ÂÆÇÉIQìYŸ-6;1·ýð¤[×®_çÜ…‹|0>Œ‹—ÎsèÐ!t‚–v^mØ__³£”\ÿgÒ¼nßõwììù`Ã{ôîMøÌi¸»ÕrΚšj´Z-åå}Êå2$R)R‰™Lf—\ÆecÜ{&u66¶ØØØ>©áÑ¡2Ñz†ÞbÖ1Bãs–ZÎzAÐY3kÒye½ a׳.‹yûG&•!:\®FȃV[óè8LƒËÅÕœ¬LZ*ݬ™mBiíåC~ÎíFéK]\ˆ‹«{Ó‚Kü»õæê¿ÎÒ¥W?\Ü73®Ð=`B.Ò$¹÷o‹¹9dfüDYi‚õåØf+R‰…³’Ž{àÞªm“Æ"ÉÉÎZ88Y3óŒIe…ºIýÿ@ßR—ÿÐõÃIEND®B`‚f-spot-0.8.2/help/C/figures/f-spot-autocolor.png0000644000175000017500000000222711503407434021746 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× 4¦`Ð$IDATHÇÍ–MlTUÇ÷¾÷æÍ¼ùh;™¶P™i¡”ÒR$•UA*Q„*1bB@".ð#Ó  ÝtÇ W,Lܨр @-”¨Žb)¶%¥|´–â´¥ôãÍô}¸™Ò”vX˜x’“wïÍ»÷wï=9ÿsáÿl‰¦Öðbÿ¨sRD€0à2@ª°†Ô<‹¯ö- äœÅË€5À: .û­Mu’˜;QÓ”×4U9”hjÕr¤:)Ê=y{¶è¥¿ê‹_ÿüžûÞÀ*`yª“¼'*Rî[SQâžËõ XïóçÕø ¥´âHMg_]‹ãRĸžõkãÁ£¯oñèí\:`ØvÆøw—ŠÀ>vîò¶Ozo.[:;îÑÔý;7×ê–+ ô'M­ËPfï¿IˆI÷ŽcQ^#Üi1•úŒPЇ9Ñ;ºk_-¯|¼m8¼k@Uå‰ý»6ê7†'ÑUátõ ¥G{NŸ]ì£À]kòT‡9ðÔñdÛŽ»—Û˜Jç3c‡°ÜˆjeìïãÞGž¬Ëvðúýo$šZåb€ è¸¿­(íþøÞøôÉ ¿ÞáÊ5…ªêµlÚTï-õO|Qnù3–ƒe;X®ÄoèðÌ‚€Âà*Бõ‹ë«/龯î®îÔèùsíf$¡ù¥”ÑÁ?ùú‹ã˜¦‰m;ä„„”ó[ä’±ÍÍÍyšW~ å×okÚªëö ?38ø7ÁÊíôü•æjW¯éºnYÿÉ–¡yƒ¼uuu¥w½Ø|"Ùo¼}íÐ’%ÅTU­B‘ÐÓqšŒ’Ç=S±-kr¬÷tÛ#úÆè´,<ÚØ°Q½ðÃI ÃKeåJJŠ‹¸rEÓ´ÑiÏêüŠÍÇÆzÏÌ/‹ØËuÕqê×o`çÞwI&¯ÐÞþ Ñh„ÝÍ;ˆÑ‡_K†‡jÑ‚)å¡X4ß{±g˜`A¯lahdšo¾=Ejd!%ºá7„”o=2 ÑÔº\÷¨q¯Ï‡‚%A„¢³²~Sžg~êà.eà‹ \÷éxãG‘GH\{¼4¦Ù.4¬+%^ ¶ÿáw ›ðúp¯ŸÁ”Õ£Ù…#¥9äÔ½ }~Qþ†Nƒu€>wwaf\ü™‰Éû«G°(•‚JÑ tç ŒÝZÄ>}ú§Üš²ƒãø ,ûh¹S<59ª6t®­«Àú¤pÔÕÚ ãq­ F• %KàÿŒDb\4š~Ͱ›ºªbÅ»³!DnP‘%4­U«É•ÉÉ 4=__Áâ¯#˜yí(4*9æm^[ØvÞæ…F%‡DLÄÙ”‘JGœËËœ,#cݦ˜a#H›N•4Ãn J§Çšæ‚‘0hö¸hMEr}‹ÒÌÎÀ4»€œô(Ð4»)rÒ£0=»B@Jbú­I‹Åâñz[³þå'÷ôb°§ R£•ƒf˜ Ähå8X‚ÁÛR„Æ ›¶´´ûŠ‹zçì¶7ž¨|Q¢))m2µÛ¡¬èt˜‚ï½T–ãawRXö­ F£À½;ðaÕttóôݯNÕœü¿±›J¨Þy÷Ø3é ;Η¤e¨SË"U)Éމ Üè»Í¤RâñÜ"u‡Û"”p¸)üa±b¨ß@›LÓMß\¸Xïv»]–°Ä†¿!@xjjjtåsåïkåÒ|I„:‰gÆçrÍLÎÝš6[fóòó‹5jmrx˜Lë¥h»?à7Ž^j¿Ù>ÀÀ À @ 6éO aTä«ÙIV! à0èU2 @`ízþÑŸ¼³†5S!ðߌ¿ì c/j?éIEND®B`‚f-spot-0.8.2/help/C/figures/f-spot-soft-focus.png0000644000175000017500000000251411503407434022026 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  šœtIME×,×*ÂÈHtEXtComment(c) 2006 Jakub Steiner created with the GIMP :: http://gimp.org#ÿX@…IDATHǽ•ÍŽ$G…¿{#2#3«ªk¦{dXY2¯6hlÉ нßÈ ’V,ÆfÃÆ2cÌ`OOWVþÄße‘ãjwR*¥L)¾çž{þÇK–eù4çTïO¯ÊË—ß0/³õÝ`Çã#º®ÓyžÝ«û;[–Yû~(WWW¾iZÉ9Ë8ž$ç„÷m9ÓaõUhÃ_ÕéóÆ7x€”Ó“ZË-¢‚Uì`f`Û[„í» *B­³ŠÙVm­•œN)úKpw4ƒ\2N=Ãn@Õ‘r¢Z1œSBèPu¬ëJ)APu8UJ)LóDJ‰Z‹¿¾yùukf„¶£ë{EL‘ñtOLUåoü¶ ¬qåù—_PJ¥m[®¯oPQbŠÄue™g¼w¬qå˜æ Ah|Cãú~À€5®ŒçÓîzvÞf]X–…y™Ø {Úæ BèidžÏ,ó‚o<1F½†~‡ˆ ª›,çÄš&†÷ž”ªºUßD€R΀І@ß r<:>Æ0rNœÇóº "¼ùæ[t! êøø“¨VQQÞyû)ÄyöéŸA„¾ë9®rNt¡{¨ï{j­ÌµSdY&œzBèÂö/—¼9…ŠS‡ªnÕ§HJU᱿¦mZÖU ¡³ `Yæ‹Õ¼Û6®¥âT©µ^6ûv©*f†sŽR mpêÈ)‘sb]¥^w¯îPœóÜÜùãïH9ðþ{¿¸~õ›·)áÝŸ¿O)™ižxþå˜*ŽyžN0Ï"Bß ´mËÐï(¥PkýÎ03Tç)¥ËÓ6-9'û˜ê””ó2ãCT໕ k\ñÞã}ƒS‡÷¾\7×·X5rI¼øç –åsb\yç'OñÞ#"Yþ].3ã£ßÿ§žý~Ï÷n¿Š#—„sþÁE‡ýj•ÓxOL+Ó|¦ñíEg°ÿZý&¡r¼˜¡ï{ÖE ]÷0h§ñ@ŠþµjÄ´‚ð:oô¢ùrFÊi›ç¡#¦D)#)­Ô×Úz€¼ø;ªJÓ´G®ß" Ÿýå1mÕýì§OQ ãã?üÃmàGoý˜R*k\˜Î#1EÌŒe]€ŒãÈ8Žl¹î†ž’ ›+Ú–˜"Î9rN¨SJɈf•ÝnGãRάëJΙyžÒt¿ß#¢4¾!ÆøZžH× [6-ãy$ç̲.ö[Ú†¦eYWRÊÄi›UEªÕæxrs«Y[J!ÆHŒ+fFßu ýçñÄt)µr¼:n ˜¦3µV¼ó´¡¥“íÎøöÂR€ãñÑß®W´MVY–™Z·Ìi¼GE±º5Õ©C^÷Ę̈¥PJ¦ZÝò+ôô}ÏnØŸ/€¶ ònu‘Í)¥dj-˜Uªf›5­Vj-ÔR)µlQ/‚sŽ¦Ù²¬ áë‹D*úLD>ÛîÔìKÍê}Ђz߸œ“¦”¤Ö"E„ çœ h©Ej­ Ã&àN¾pê^ñÿXÿz«¬5uo´{IEND®B`‚f-spot-0.8.2/help/C/figures/f-spot-fullscreen.png0000644000175000017500000000125711503407434022103 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  šœtIMEÖ " AP…p¦Ií(_>úïÑ6ƒb±8†aO'Bˆ…B¡Ð›ˆìyž‰+žç™¶ðõîS¾üD„+SÛwc=ŸÚ¦•/ë-¶ã2ËbÃDæ€L0ûîs§¹EUolÇR¾¬¬ØŽÛ+„¸—ÍfvU«µtãPk;ãg;–RkÝö ÁŸí8=Q$M£Ê—Œ±iέÃG÷g£·‰At\Mœ85˜N q1ötuÐŒ1ǃ0ôÊ3ÏëÍÑý ÐT"¼|ñú‡Ö4kŒZ-‘òe@ÚŽ{Àt3 A‰êµÚ÷KDæ†ò¥ù£‹”/+¶ãîk艙L¦# ’ANKª<ö¾c›®´YγX*•¶Æ™cÌ"€îOå±/q'y3€s.ÅŠ¯õ8 @@ÏÉ«ÃOM®‰šÂëó3—G"€À¯¸Ïµ°`À²ÅSž¼²{OxðÐ^#WÌ#s?[9OúáØœó·Œ1+ ÃcÊ—¯âØñ¸€êÜ“ê¦ù¯`˜ûøðâíùñsl$ù ¾¤< œ%ýIEND®B`‚f-spot-0.8.2/help/C/figures/f-spot-slideshow.png0000644000175000017500000000051111503407434021732 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDùC» pHYs  d_‘éIDATHÇÝϱÁ@Çñ_妚4×Ýj‰ç05M߀M,éì DŒC"Ø­xˆæ,šˆÅÿN;ð›ÿ÷ýä€_ @-K ìù®üÉQŽ<ßÝë"$ lw´ð BNç£Bc¸Ý¯Êàœ£/"Žc ú馼ï‰>!ÚÀ+EQ+@Á%u@Ý^ˆÍz[7 c—*@£Fó¼Ó4Á9OâÍOq¥0Æ`Û6fói_QÞ‘˲0žŒ”âJÀ2Z(Ç)+{¾+=ß•RÊFšád•,ã ²ŒÿÆkUÕþ.IEND®B`‚f-spot-0.8.2/help/C/tags.page0000644000175000017500000000124311503407430016144 0ustar00rubenruben00000000000000 A brief introduction to the tagging capabilities of F-Spot Tags

Like certain other photo managers, F-Spot lets you tag your photos, allowing for quick, easy content-based searching of your photos. You can tag people, events, places, favorite things, or even make your own groups of tags.

Working with Tags
f-spot-0.8.2/src/0000777000175000017500000000000011503407440014032 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/0000777000175000017500000000000011503407440014722 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Platform/0000777000175000017500000000000011503407444017544 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Platform/FSpot.Platform/0000777000175000017500000000000011503407444022362 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Platform/FSpot.Platform/WebProxy.cs0000644000175000017500000000470111503404762024466 0ustar00rubenruben00000000000000/* * FSpot.Platform.Gnome.WebProxy.cs * * Author(s): * Anton Keks * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using Hyena; namespace FSpot.Platform { public class WebProxy { const string PROXY = "/system/http_proxy/"; const string PROXY_USE_PROXY = PROXY + "use_http_proxy"; const string PROXY_HOST = PROXY + "host"; const string PROXY_PORT = PROXY + "port"; const string PROXY_USER = PROXY + "authentication_user"; const string PROXY_PASSWORD = PROXY + "authentication_password"; const string PROXY_BYPASS_LIST = PROXY + "ignore_hosts"; public static void Init () { LoadPreference (PROXY_USE_PROXY); } static void OnPreferenceChanged (object sender, NotifyEventArgs args) { LoadPreference (args.Key); } static void LoadPreference (string key) { switch (key) { case PROXY_USE_PROXY : case PROXY_HOST : case PROXY_PORT : case PROXY_USER : case PROXY_PASSWORD : case PROXY_BYPASS_LIST : System.Net.WebRequest.DefaultWebProxy = GetWebProxy () ?? new System.Net.WebProxy (); break; } } static System.Net.WebProxy GetWebProxy () { System.Net.WebProxy proxy; if (!Backend.Get (PROXY_USE_PROXY)) return null; try { string host = Backend.Get (PROXY_HOST); int port = Backend.Get (PROXY_PORT); string uri = "http://" + host + ":" + port.ToString (); proxy = new System.Net.WebProxy (uri); string [] bypass_list = Backend.Get (PROXY_BYPASS_LIST); if (bypass_list != null) { for (int i = 0; i < bypass_list.Length; i++) { bypass_list [i] = "http://" + bypass_list [i]; } proxy.BypassList = bypass_list; } string username = Backend.Get (PROXY_USER); string password = Backend.Get (PROXY_PASSWORD); proxy.Credentials = new System.Net.NetworkCredential (username, password); } catch (Exception e) { Log.Warning ("Failed to set the web proxy settings"); Log.DebugException (e); return null; } return proxy; } static PreferenceBackend backend; static EventHandler changed_handler; static PreferenceBackend Backend { get { if (backend == null) { backend = new PreferenceBackend (); changed_handler = new EventHandler (OnPreferenceChanged); backend.AddNotify (PROXY, changed_handler); } return backend; } } } } f-spot-0.8.2/src/Core/FSpot.Platform/FSpot.Platform/PreferenceBackend.cs0000644000175000017500000000370111503404761026233 0ustar00rubenruben00000000000000/* * FSpot.Platform.Gnome.PreferenceBackend.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using System.Runtime.Serialization; namespace FSpot { public class NotifyEventArgs : System.EventArgs { string key; public string Key { get { return key; } } object val; public object Value { get { return val; } } public NotifyEventArgs (string key, object val) { this.key = key; this.val = val; } } } namespace FSpot.Platform { [Serializable] public class NoSuchKeyException : Exception { public NoSuchKeyException () : base () { } public NoSuchKeyException (string key) : base (key) { } public NoSuchKeyException (string key, Exception e) : base (key, e) { } protected NoSuchKeyException (SerializationInfo info, StreamingContext context) : base (info, context) { } } public class PreferenceBackend { static object sync_handler = new object (); private static GConf.Client client; private GConf.Client Client { get { lock (sync_handler) { if (client == null) client = new GConf.Client (); return client; } } } public PreferenceBackend () { } public object Get (string key) { try { return Client.Get (key); } catch (GConf.NoSuchKeyException) { throw new NoSuchKeyException (key); } } internal T Get (string key) { T value = default(T); try { value = (T) Get (key); } catch (NoSuchKeyException) { } catch (InvalidCastException) { } return value; } public void Set (string key, object o) { Client.Set (key, o); } public void AddNotify (string key, EventHandler handler) { // GConf doesn't like trailing slashes key = key.TrimEnd('/'); Client.AddNotify (key, delegate (object sender, GConf.NotifyEventArgs args) {handler (sender, new NotifyEventArgs (args.Key, args.Value));}); } } } f-spot-0.8.2/src/Core/FSpot.Platform/FSpot.Platform/ScreenSaver.cs0000644000175000017500000000277711503404761025141 0ustar00rubenruben00000000000000/* * FSpot.Platform.Gnome.ScreenSaver.cs * * Author(s) * Stephane Delcroix * Giacomo Rizzo * * This is free software. See COPYING for details. */ using System; using System.Runtime.InteropServices; using NDesk.DBus; using Hyena; namespace FSpot.Platform { [Interface ("org.gnome.ScreenSaver")] public interface IScreenSaver { uint Inhibit (string appname, string reason); void UnInhibit (uint cookie); void Lock (); } public static class ScreenSaver { private static IScreenSaver screensaver; private static IScreenSaver GnomeScreenSaver { get { if (screensaver == null) screensaver = Bus.Session.GetObject ("org.gnome.ScreenSaver", new ObjectPath ("/org/gnome/ScreenSaver")); return screensaver; } } private static bool inhibited = false; private static uint cookie = 0; public static uint Inhibit (string reason ) { if (inhibited) return cookie; Log.InformationFormat ("Inhibit screensaver for {0}", reason); try { cookie = GnomeScreenSaver.Inhibit ("f-spot", reason); inhibited = true; } catch (Exception ex) { Log.Exception ("Error Inhibiting the screensaver", ex); } return cookie; } public static void UnInhibit () { if (!inhibited) return; Log.Information ("UnInhibit screensaver"); try { GnomeScreenSaver.UnInhibit (cookie); inhibited = false; } catch (Exception ex) { Log.Exception ("Error UnInhibiting the screensaver", ex); } } } } f-spot-0.8.2/src/Core/FSpot.Platform/FSpot.Platform/Desktop.cs0000644000175000017500000000135111503404761024315 0ustar00rubenruben00000000000000/* * FSpot.Platform.Gnome.Desktop.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details. */ namespace FSpot.Platform { public static class Desktop { public static void SetBackgroundImage (string path) { GConf.Client client = new GConf.Client (); client.Set ("/desktop/gnome/background/color_shading_type", "solid"); client.Set ("/desktop/gnome/background/primary_color", "#000000"); client.Set ("/desktop/gnome/background/picture_options", "zoom"); client.Set ("/desktop/gnome/background/picture_opacity", 100); client.Set ("/desktop/gnome/background/picture_filename", path); client.Set ("/desktop/gnome/background/draw_background", true); } } } f-spot-0.8.2/src/Core/FSpot.Platform/Makefile.in0000644000175000017500000006654611503407253021624 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Core/FSpot.Platform ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Platform TARGET = library LINK = $(REF_FSPOT_PLATFORM) $(am__append_1) SOURCES = \ FSpot.Platform/Desktop.cs \ FSpot.Platform/PreferenceBackend.cs \ FSpot.Platform/ScreenSaver.cs \ FSpot.Platform/WebProxy.cs RESOURCES = # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Core/FSpot.Platform/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Core/FSpot.Platform/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Core/FSpot.Platform/Makefile.am0000644000175000017500000000041211430555234021571 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Platform TARGET = library LINK = $(REF_FSPOT_PLATFORM) SOURCES = \ FSpot.Platform/Desktop.cs \ FSpot.Platform/PreferenceBackend.cs \ FSpot.Platform/ScreenSaver.cs \ FSpot.Platform/WebProxy.cs RESOURCES = include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Core/FSpot.JobScheduler/0000777000175000017500000000000011503407442020327 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.JobScheduler/Banshee.Base/0000777000175000017500000000000011503407443022546 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.JobScheduler/Banshee.Base/FSpotCompat.cs0000644000175000017500000000046111503404761025271 0ustar00rubenruben00000000000000/* * FSpotCompat.cs * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. */ namespace Banshee.Base { public static class Globals { static bool debugging = false; public static bool Debugging { get { return debugging; } } } } f-spot-0.8.2/src/Core/FSpot.JobScheduler/FSpot.Jobs/0000777000175000017500000000000011503407443022257 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.JobScheduler/FSpot.Jobs/JobStatus.cs0000644000175000017500000000037711503404761024527 0ustar00rubenruben00000000000000/* * Jobs/JobStatus.cs * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details */ namespace FSpot.Jobs { public enum JobStatus { Created, Scheduled, Running, Finished, Failed } } f-spot-0.8.2/src/Core/FSpot.JobScheduler/Banshee.Kernel/0000777000175000017500000000000011503407443023114 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.JobScheduler/Banshee.Kernel/IntervalHeap.cs0000644000175000017500000002660211503404761026027 0ustar00rubenruben00000000000000/*************************************************************************** * IntervalHeap.cs * * Copyright (C) 2006 Novell, Inc. * Written by Aaron Bockover ****************************************************************************/ /* THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ using System; using System.Collections; using System.Collections.Generic; namespace Banshee.Kernel { public class IntervalHeap : ICollection, ICollection, IEnumerable, IEnumerable { private const int MIN_CAPACITY = 16; private int count; private int generation; private Interval [] heap; public IntervalHeap() { Clear(); } public virtual T Pop() { if(count == 0) { throw new InvalidOperationException(); } T item = heap[0].Item; MoveDown(0, heap[--count]); generation++; return item; } public virtual T Peek() { if(count == 0) { throw new InvalidOperationException(); } return heap[0].Item; } public virtual void Push(T item, int priority) { if(item == null) { throw new ArgumentNullException("item"); } if(count == heap.Length) { OptimalArrayResize(ref heap, 1); } MoveUp(++count - 1, new Interval(item, priority)); generation++; } public virtual void Clear() { generation = 0; heap = new Interval[MIN_CAPACITY]; } void ICollection.CopyTo(Array array, int index) { if(array == null) { throw new ArgumentNullException("array"); } if(index < 0) { throw new ArgumentOutOfRangeException("index"); } Array.Copy(heap, 0, array, index, count); } public virtual void CopyTo(T [] array, int index) { if(array == null) { throw new ArgumentNullException("array"); } if(index < 0) { throw new ArgumentOutOfRangeException("index"); } Array.Copy(heap, 0, array, index, count); } public virtual bool Contains(T item) { if(item == null) { throw new ArgumentNullException("item"); } return FindItemHeapIndex(item) >= 0; } public virtual void Add(T item) { if(item == null) { throw new ArgumentNullException("item"); } Push(item, 0); } public virtual bool Remove(T item) { if(item == null) { throw new ArgumentNullException("item"); } int index = FindItemHeapIndex(item); if(index < 0) { return false; } MoveDown(index, heap[--count]); generation++; return true; } public virtual void TrimExcess() { if(count < heap.Length * 0.9) { Array.Resize(ref heap, count); } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public virtual IEnumerator GetEnumerator() { return new IntervalHeapEnumerator(this); } public static IntervalHeap Synchronized(IntervalHeap heap) { if(heap == null) { throw new ArgumentNullException("heap"); } return new SyncIntervalHeap(heap); } private int FindItemHeapIndex(T item) { for(int i = 0; i < count; i++) { if(item.Equals(heap[i].Item)) { return i; } } return -1; } private static int GetLeftChildIndex(int index) { return index * 2 + 1; } private static int GetParentIndex(int index) { return (index - 1) / 2; } // grow array to nearest minimum power of two private static void OptimalArrayResize(ref Interval [] array, int grow) { int new_capacity = array.Length == 0 ? 1 : array.Length; int min_capacity = array.Length == 0 ? MIN_CAPACITY : array.Length + grow; while(new_capacity < min_capacity) { new_capacity <<= 1; } Array.Resize(ref array, new_capacity); } private void MoveUp(int index, Interval node) { int parent_index = GetParentIndex(index); while(index > 0 && heap[parent_index].Priority < node.Priority) { heap[index] = heap[parent_index]; index = parent_index; parent_index = GetParentIndex(index); } heap[index] = node; } private void MoveDown(int index, Interval node) { int child_index = GetLeftChildIndex(index); while(child_index < count) { if(child_index + 1 < count && heap[child_index].Priority < heap[child_index + 1].Priority) { child_index++; } heap[index] = heap[child_index]; index = child_index; child_index = GetLeftChildIndex(index); } MoveUp(index, node); } public virtual int Count { get { return count; } } public bool IsReadOnly { get { return false; } } public virtual object SyncRoot { get { return this; } } public virtual bool IsSynchronized { get { return false; } } private struct Interval { private T item; private int priority; public Interval(T item, int priority) { this.item = item; this.priority = priority; } public T Item { get { return item; } } public int Priority { get { return priority; } } public override int GetHashCode () { return priority.GetHashCode () ^ item.GetHashCode (); } } private sealed class SyncIntervalHeap : IntervalHeap { private IntervalHeap heap; internal SyncIntervalHeap(IntervalHeap heap) { this.heap = heap; } public override int Count { get { lock(heap) { return heap.Count; } } } public override bool IsSynchronized { get { return true; } } public override object SyncRoot { get { return heap.SyncRoot; } } public override void Clear() { lock(heap) { heap.Clear(); } } public override bool Contains(T item) { lock(heap) { return heap.Contains(item); } } public override T Pop() { lock(heap) { return heap.Pop(); } } public override T Peek() { lock(heap) { return heap.Peek(); } } public override void Push(T item, int priority) { lock(heap) { heap.Push(item, priority); } } public override void Add(T item) { lock(heap) { heap.Add(item); } } public override bool Remove(T item) { lock(heap) { return heap.Remove(item); } } public override void TrimExcess() { lock(heap) { heap.TrimExcess(); } } public override void CopyTo(T [] array, int index) { lock(heap) { heap.CopyTo(array, index); } } public override IEnumerator GetEnumerator() { lock(heap) { return new IntervalHeapEnumerator(this); } } } private sealed class IntervalHeapEnumerator : IEnumerator, IEnumerator { private IntervalHeap heap; private int index; private int generation; public IntervalHeapEnumerator(IntervalHeap heap) { this.heap = heap; Reset(); } public void Reset() { generation = heap.generation; index = -1; } public void Dispose() { heap = null; } public bool MoveNext() { if(generation != heap.generation) { throw new InvalidOperationException(); } if(index + 1 == heap.count) { return false; } index++; return true; } object IEnumerator.Current { get { return Current; } } public T Current { get { if(generation != heap.generation) { throw new InvalidOperationException(); } return heap.heap[index].Item; } } } } } f-spot-0.8.2/src/Core/FSpot.JobScheduler/Banshee.Kernel/IJob.cs0000644000175000017500000000301511503404761024261 0ustar00rubenruben00000000000000/*************************************************************************** * IJob.cs * * Copyright (C) 2006 Novell, Inc. * Written by Aaron Bockover ****************************************************************************/ /* THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ using System; namespace Banshee.Kernel { public interface IJob { void Run(); } } f-spot-0.8.2/src/Core/FSpot.JobScheduler/Banshee.Kernel/JobPriority.cs0000644000175000017500000000313411503404761025714 0ustar00rubenruben00000000000000/*************************************************************************** * JobPriority.cs * * Copyright (C) 2006 Novell, Inc. * Written by Aaron Bockover ****************************************************************************/ /* THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ using System; namespace Banshee.Kernel { public enum JobPriority { Lowest, BelowNormal, Normal, AboveNormal, Highest } } f-spot-0.8.2/src/Core/FSpot.JobScheduler/Banshee.Kernel/IInstanceCriticalJob.cs0000644000175000017500000000307511503404761027427 0ustar00rubenruben00000000000000/*************************************************************************** * IInstanceCriticalJob.cs * * Copyright (C) 2006 Novell, Inc. * Written by Aaron Bockover ****************************************************************************/ /* THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ using System; namespace Banshee.Kernel { public interface IInstanceCriticalJob : IJob { string Name { get; } } } f-spot-0.8.2/src/Core/FSpot.JobScheduler/Banshee.Kernel/Scheduler.cs0000644000175000017500000002173311503404761025363 0ustar00rubenruben00000000000000/*************************************************************************** * Scheduler.cs * * Copyright (C) 2006 Novell, Inc. * Written by Aaron Bockover ****************************************************************************/ /* THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ using System; using System.Threading; using System.Collections.Generic; using Hyena; namespace Banshee.Kernel { public delegate void JobEventHandler(IJob job); public static class Scheduler { private static object this_mutex = new object(); private static IntervalHeap heap = new IntervalHeap(); private static Thread job_thread; private static bool disposed; private static IJob current_running_job; private static int suspend_count; public static event JobEventHandler JobStarted; public static event JobEventHandler JobFinished; public static event JobEventHandler JobScheduled; public static event JobEventHandler JobUnscheduled; public static void Schedule(IJob job) { Schedule(job, JobPriority.Normal); } public static void Schedule(IJob job, JobPriority priority) { lock(this_mutex) { if(IsDisposed()) { return; } heap.Push(job, (int)priority); Debug("Job scheduled ({0}, {1})", job, priority); OnJobScheduled(job); CheckRun(); } } public static void Unschedule(IJob job) { lock(this_mutex) { if(IsDisposed()) { return; } if(heap.Remove(job)) { Debug("Job unscheduled ({0}), job", job); OnJobUnscheduled(job); } else { Debug("Job not unscheduled; not located in heap"); } } } public static void Unschedule(Type type) { lock(this_mutex) { Queue to_remove = new Queue(); foreach(IJob job in ScheduledJobs) { Type job_type = job.GetType(); if((type.IsInterface && job_type.GetInterface(type.Name) != null) || job_type == type || job_type.IsSubclassOf(job_type)) { to_remove.Enqueue(job); } } while(to_remove.Count > 0) { Unschedule(to_remove.Dequeue()); } } } public static void Suspend() { lock(this_mutex) { Interlocked.Increment(ref suspend_count); } } public static void Resume() { lock(this_mutex) { Interlocked.Decrement(ref suspend_count); } } public static bool IsScheduled(IJob job) { lock(this_mutex) { if(IsDisposed()) { return false; } return heap.Contains(job); } } public static bool IsScheduled(Type type) { lock(this_mutex) { if(IsDisposed()) { return false; } foreach(IJob job in heap) { if(job.GetType() == type) { return true; } } return false; } } public static bool IsInstanceCriticalJobScheduled { get { lock(this_mutex) { if(IsDisposed()) { return false; } foreach(IJob job in heap) { if(job is IInstanceCriticalJob) { return true; } } return false; } } } public static IEnumerable ScheduledJobs { get { lock(this_mutex) { return heap; } } } public static int ScheduledJobsCount { get { lock(this_mutex) { return heap.Count; } } } public static void Dispose() { lock(this_mutex) { disposed = true; } } private static bool IsDisposed() { if(disposed) { Debug("Job not unscheduled; disposing scheduler"); return true; } return false; } private static void CheckRun() { if(heap.Count <= 0) { return; } else if(job_thread == null) { Debug("execution thread created"); job_thread = new Thread(new ThreadStart(ProcessJobThread)); job_thread.Priority = ThreadPriority.BelowNormal; job_thread.IsBackground = true; job_thread.Start(); } } private static void ProcessJobThread() { while(true) { current_running_job = null; if(suspend_count > 0) { Thread.Sleep(10); continue; } lock(this_mutex) { if(disposed) { Log.Debug ("execution thread destroyed, dispose requested"); return; } try { current_running_job = heap.Pop(); } catch(InvalidOperationException) { Debug("execution thread destroyed, no more jobs scheduled"); job_thread = null; return; } } try { Debug("Job started ({0})", current_running_job); OnJobStarted(current_running_job); current_running_job.Run(); Debug("Job ended ({0})", current_running_job); OnJobFinished(current_running_job); } catch(Exception e) { Debug("Job threw an unhandled exception: {0}", e); } } } public static IJob CurrentJob { get { return current_running_job; } } private static void OnJobStarted(IJob job) { JobEventHandler handler = JobStarted; if(handler != null) { handler(job); } } private static void OnJobFinished(IJob job) { JobEventHandler handler = JobFinished; if(handler != null) { handler(job); } } private static void OnJobScheduled(IJob job) { JobEventHandler handler = JobScheduled; if(handler != null) { handler(job); } } private static void OnJobUnscheduled(IJob job) { JobEventHandler handler = JobUnscheduled; if(handler != null) { handler(job); } } private static void Debug(string message, params object [] args) { if(Banshee.Base.Globals.Debugging) { Console.Error.WriteLine(String.Format("** Scheduler: {0}", message), args); } } } } f-spot-0.8.2/src/Core/FSpot.JobScheduler/Makefile.in0000644000175000017500000006673011503407252022403 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Core/FSpot.JobScheduler ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.JobScheduler TARGET = library LINK = $(REF_FSPOT_JOB_SCHEDULER) $(am__append_1) SOURCES = \ Banshee.Base/FSpotCompat.cs \ Banshee.Kernel/IInstanceCriticalJob.cs \ Banshee.Kernel/IJob.cs \ Banshee.Kernel/IntervalHeap.cs \ Banshee.Kernel/JobPriority.cs \ Banshee.Kernel/Scheduler.cs \ FSpot.Jobs/JobStatus.cs RESOURCES = # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Core/FSpot.JobScheduler/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Core/FSpot.JobScheduler/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Core/FSpot.JobScheduler/Makefile.am0000644000175000017500000000056011430555234022362 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.JobScheduler TARGET = library LINK = $(REF_FSPOT_JOB_SCHEDULER) SOURCES = \ Banshee.Base/FSpotCompat.cs \ Banshee.Kernel/IInstanceCriticalJob.cs \ Banshee.Kernel/IJob.cs \ Banshee.Kernel/IntervalHeap.cs \ Banshee.Kernel/JobPriority.cs \ Banshee.Kernel/Scheduler.cs \ FSpot.Jobs/JobStatus.cs RESOURCES = include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Core/FSpot.Cms/0000777000175000017500000000000011503407441016477 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Cms/FSpot.Cms.dll.config.in0000644000175000017500000000024711430555234022623 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Core/FSpot.Cms/Cms/0000777000175000017500000000000011503407441017221 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Cms/Cms/ColorCIELab.cs0000644000175000017500000000145411503404761021570 0ustar00rubenruben00000000000000/* * Cms.ColorCIELab.cs A very incomplete wrapper for lcms * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ using System; using System.IO; using System.Collections; using System.Runtime.InteropServices; using System.Reflection; using System.Runtime.Serialization; namespace Cms { public struct ColorCIELab { public double L; public double a; public double b; public ColorCIELCh ToLCh () { ColorCIELCh lch; NativeMethods.CmsLab2LCh (out lch, ref this); return lch; } public ColorCIEXYZ ToXYZ (ColorCIEXYZ wp) { ColorCIEXYZ xyz; NativeMethods.CmsLab2XYZ (ref wp, out xyz, ref this); return xyz; } public override string ToString () { return String.Format ("(L={0}, a={1}, b={2})", L, a, b); } } } f-spot-0.8.2/src/Core/FSpot.Cms/Cms/Intent.cs0000644000175000017500000000050111503404761021003 0ustar00rubenruben00000000000000/* * Cms.Intent.cs A very incomplete wrapper for lcms * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ namespace Cms { public enum Intent { Perceptual = 0, RelativeColorimetric = 1, Saturation = 2, AbsoluteColorimetric = 3 } } f-spot-0.8.2/src/Core/FSpot.Cms/Cms/Profile.cs0000644000175000017500000002117211503404761021151 0ustar00rubenruben00000000000000/* * Cms.Profile.cs A very incomplete wrapper for lcms * * Author(s): * Larry Ewing * Stephane Delcroix * * Copyright (c) 2005-2008 Novell, Inc. * Copyright (c) 2010 Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using System.IO; using System.Collections; using System.Runtime.InteropServices; using System.Reflection; using System.Runtime.Serialization; namespace Cms { public class Profile : IDisposable { static Profile srgb = new Profile (NativeMethods.CmsCreateSRGBProfile()); static Profile () { SetErrorAction (ErrorAction.Show); } private HandleRef handle; public HandleRef Handle { get { return handle; } } private Profile () : this (NativeMethods.CmsCreateProfilePlaceholder ()) { } public static Profile CreateSRgb () { return CreateStandardRgb (); } public static Profile CreateStandardRgb () { return srgb; } public static Profile CreateAlternateRgb () { // FIXME I'm basing this off the values set in the camera // exif data when the adobe profile is selected. They could // easily be off ColorCIExyY wp = new ColorCIExyY (.3127, .329, 1.0); ColorCIExyYTriple primaries = new ColorCIExyYTriple ( new ColorCIExyY (.64, .33, 1.0), new ColorCIExyY (.21, .71, 1.0), new ColorCIExyY (.15, .06, 1.0)); GammaTable g = new GammaTable (4096, 2.2); GammaTable [] gamma = new GammaTable [] { g, g, g, g}; return new Profile (wp, primaries, gamma); } public static Profile CreateLab (ColorCIExyY wp) { return new Profile (NativeMethods.CmsCreateLabProfile (out wp)); } public static Profile CreateLab () { return new Profile (NativeMethods.CmsCreateLabProfile (IntPtr.Zero)); } public static Profile CreateGray (ColorCIExyY whitePoint, GammaTable transfer) { if (transfer == null) return new Profile (NativeMethods.CmsCreateGrayProfile (ref whitePoint, new GammaTable (4096, 2.2).Handle)); else return new Profile (NativeMethods.CmsCreateGrayProfile (ref whitePoint, transfer.Handle)); } public static Profile GetScreenProfile (Gdk.Screen screen) { if (screen == null) throw new ArgumentNullException ("screen"); IntPtr profile = NativeMethods.FScreenGetProfile (screen.Handle); if (profile == IntPtr.Zero) return null; return new Profile (profile); } public static Profile CreateAbstract (int nLUTPoints, double Exposure, double Bright, double Contrast, double Hue, double Saturation, int TempSrc, int TempDest) { #if true GammaTable gamma = new GammaTable (1024, Math.Pow (10, -Bright/100)); GammaTable line = new GammaTable (1024, 1.0); GammaTable [] tables = new GammaTable [] { gamma, line, line }; return CreateAbstract (nLUTPoints, Exposure, 0.0, Contrast, Hue, Saturation, tables, ColorCIExyY.WhitePointFromTemperature (TempSrc), ColorCIExyY.WhitePointFromTemperature (TempDest)); #else GammaTable [] tables = null; return CreateAbstract (nLUTPoints, Exposure, Bright, Contrast, Hue, Saturation, tables, ColorCIExyY.WhitePointFromTemperature (TempSrc), ColorCIExyY.WhitePointFromTemperature (TempDest)); #endif } public static Profile CreateAbstract (int nLUTPoints, double Exposure, double Bright, double Contrast, double Hue, double Saturation, GammaTable [] tables, ColorCIExyY srcWp, ColorCIExyY destWp) { if (tables == null) { GammaTable gamma = new GammaTable (1024, Math.Pow (10, -Bright/100)); GammaTable line = new GammaTable (1024, 1.0); tables = new GammaTable [] { gamma, line, line }; } /* System.Console.WriteLine ("e {0}", Exposure); System.Console.WriteLine ("b {0}", Bright); System.Console.WriteLine ("c {0}", Contrast); System.Console.WriteLine ("h {0}", Hue); System.Console.WriteLine ("s {0} {1} {2}", Saturation, srcWp, destWp); */ return new Profile (NativeMethods.FCmsCreateBCHSWabstractProfile (nLUTPoints, Exposure, 0.0, //Bright, Contrast, Hue, Saturation, ref srcWp, ref destWp, CopyHandles (tables))); } public Profile (IccColorSpace color_space, GammaTable [] gamma) { handle = new HandleRef (this, NativeMethods.CmsCreateLinearizationDeviceLink (color_space, CopyHandles (gamma))); } private static HandleRef [] CopyHandles (GammaTable [] gamma) { if (gamma == null) return null; HandleRef [] gamma_handles = new HandleRef [gamma.Length]; for (int i = 0; i < gamma_handles.Length; i++) gamma_handles [i] = gamma [i].Handle; return gamma_handles; } public Profile (ColorCIExyY whitepoint, ColorCIExyYTriple primaries, GammaTable [] gamma) { handle = new HandleRef (this, NativeMethods.CmsCreateRGBProfile (out whitepoint, out primaries, CopyHandles (gamma))); } public Profile (string path) { handle = new HandleRef (this, NativeMethods.CmsOpenProfileFromFile (path, "r")); if (handle.Handle == IntPtr.Zero) throw new CmsException ("Error opening ICC profile in file " + path); } public byte [] Save () { unsafe { uint length = 0; if (NativeMethods.CmsSaveProfileToMem (this.Handle, null, ref length)) { byte [] data = new byte [length]; fixed (byte * data_p = &data [0]) { if (NativeMethods.CmsSaveProfileToMem (this.Handle, data_p, ref length)) { return data; } } } } throw new SaveException ("Error Saving Profile"); } public Profile (byte [] data) : this (data, 0, data.Length) { if (data == null) throw new ArgumentNullException ("data"); } public Profile (byte [] data, int start_offset, int length) { if (start_offset < 0) throw new System.ArgumentOutOfRangeException ("start_offset < 0"); if (data == null) throw new ArgumentNullException ("data"); if (data.Length - start_offset < 0) throw new System.ArgumentOutOfRangeException ("start_offset > data.Length"); if (data.Length - length - start_offset < 0) throw new System.ArgumentOutOfRangeException ("start_offset + length > data.Length"); IntPtr profileh; unsafe { fixed (byte * start = & data [start_offset]) { profileh = NativeMethods.CmsOpenProfileFromMem (start, (uint)length); } } if (profileh == IntPtr.Zero) throw new CmsException ("Invalid Profile Data"); else this.handle = new HandleRef (this, profileh); } public ColorCIEXYZ MediaWhitePoint { get { ColorCIEXYZ wp; if (!NativeMethods.CmsTakeMediaWhitePoint (out wp, handle)) throw new CmsException ("unable to retrieve white point from profile"); return wp; } } public ColorCIEXYZ MediaBlackPoint { get { ColorCIEXYZ black; if (!NativeMethods.CmsTakeMediaBlackPoint (out black, handle)) throw new CmsException ("unable to retrieve white point from profile"); return black; } } public ColorCIEXYZTriple Colorants { get { ColorCIEXYZTriple colors; if (!NativeMethods.CmsTakeColorants (out colors, handle)) throw new CmsException ("Unable to retrieve profile colorants"); return colors; } } public IccColorSpace ColorSpace { get { return (IccColorSpace) NativeMethods.CmsGetColorSpace (this.handle); } } public IccProfileClass DeviceClass { get { return (IccProfileClass) NativeMethods.CmsGetDeviceClass (this.handle); } } public string Model { get { lock (srgb) { return Marshal.PtrToStringAnsi (NativeMethods.CmsTakeModel (handle)); } } } public string ProductName { get { lock (srgb) { return Marshal.PtrToStringAnsi (NativeMethods.CmsTakeProductName (handle)); } } } public string ProductDescription { get { lock (srgb) { return Marshal.PtrToStringAnsi (NativeMethods.CmsTakeProductDesc (handle)); } } } private enum ErrorAction { Abort, Show, Ignore } private static void SetErrorAction (ErrorAction act) { NativeMethods.CmsErrorAction ((int) act); } public override string ToString () { return ProductName; } protected Profile (IntPtr handle) { this.handle = new HandleRef (this, handle); } public void Dispose () { Cleanup (); System.GC.SuppressFinalize (this); } protected virtual void Cleanup () { if (NativeMethods.CmsCloseProfile (this.Handle) == 0) throw new CmsException ("Error closing Handle"); } ~Profile () { Cleanup (); } } } f-spot-0.8.2/src/Core/FSpot.Cms/Cms/SaveException.cs0000644000175000017500000000112711503404761022324 0ustar00rubenruben00000000000000/* * Cms.SaveException.cs * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ using System; using System.Runtime.Serialization; namespace Cms { [Serializable] public class SaveException : CmsException { public SaveException (string message) : base (message) { } protected SaveException (SerializationInfo info, StreamingContext context) : base (info, context) { } public SaveException (string message, Exception innerException) : base (message, innerException) { } public SaveException () : base () { } } } f-spot-0.8.2/src/Core/FSpot.Cms/Cms/GammaTable.cs0000644000175000017500000000660411503404761021546 0ustar00rubenruben00000000000000/* * Cms.GammaTable.cs A very incomplete wrapper for lcms * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ using System; using System.IO; using System.Collections; using System.Runtime.InteropServices; using System.Reflection; using System.Runtime.Serialization; namespace Cms { public class GammaTable : IDisposable { private HandleRef handle; public HandleRef Handle { get { return handle; } } // internal struct GammaTableStruct { // public int Count; // public ushort StartOfData; // ushort array Count entries long // } public GammaTable (int count, double gamma) { handle = new HandleRef (this, NativeMethods.CmsBuildGamma (count, gamma)); } /* Does build a parametric curve based on parameters. Params[] does contain Gamma, a, b, c, d, e, f Type 1 : X = Y ^ Gamma | Gamma = Params[0] Type 2 : CIE 122-1966 Y = (aX + b)^Gamma | X >= -b/a Y = 0 | else Type 3: IEC 61966-3 Y = (aX + b)^Gamma | X <= -b/a Y = c | else Type 4: IEC 61966-2.1 (sRGB) Y = (aX + b)^Gamma | X >= d Y = cX | X < d Type 5: Y = (aX + b)^Gamma + e | X <= d Y = cX + f | else Giving negative values for Type does result in reversed curve. */ // FIXME type should be an enum public GammaTable (int entry_count, int type, double [] values) { handle = new HandleRef (this, NativeMethods.CmsBuildParametricGamma (entry_count, type, values)); } public GammaTable (ushort [] values) : this (values, 0, values.Length) { } public int Count { get { return NativeMethods.FCmsGammaTableGetCount (handle); } } public IntPtr Values { get { return NativeMethods.FCmsGammaTableGetValues (handle); } } public ushort this [int index] { get { unsafe { if (handle.Handle == (IntPtr)0) throw new CmsException (); if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (String.Format ("index {0} outside of count {1} for {2}", index, Count, handle.Handle)); ushort *data = (ushort *)Values; return data [index]; } } set { unsafe { if (handle.Handle == (IntPtr)0) throw new CmsException (); if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (String.Format ("index {0} outside of count {1} for handle {2}", index, Count, handle.Handle)); ushort *data = (ushort *)Values; data [index] = value; } } } public GammaTable (ushort [] values, int start_offset, int length) { #if true if (values == null) throw new ArgumentNullException ("values"); handle = new HandleRef (this, NativeMethods.FCmsGammaTableNew (values, start_offset, length)); //System.Console.WriteLine ("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhandle = {0}", handle.Handle); #else handle = new HandleRef (this, cmsAllocGamma (length)); //System.Console.WriteLine ("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhandle = {0}", handle.Handle); for (int i = 0; i < length; i++) this [i] = values [start_offset + i]; #endif } protected virtual void Cleanup () { NativeMethods.CmsFreeGamma (handle); } public void Dispose () { Cleanup (); System.GC.SuppressFinalize (this); } ~GammaTable () { Cleanup (); } } } f-spot-0.8.2/src/Core/FSpot.Cms/Cms/ColorCIELCh.cs0000644000175000017500000000106211503404761021533 0ustar00rubenruben00000000000000/* * Cms.ColorCIELCh.cs A very incomplete wrapper for lcms * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ using System; using System.IO; using System.Collections; using System.Runtime.InteropServices; using System.Reflection; using System.Runtime.Serialization; namespace Cms { public struct ColorCIELCh { public double L; public double C; public double h; public ColorCIELab ToLab () { ColorCIELab lab; NativeMethods.CmsLCh2Lab (out lab, ref this); return lab; } } } f-spot-0.8.2/src/Core/FSpot.Cms/Cms/IccProfileClass.cs0000644000175000017500000000105611503404761022555 0ustar00rubenruben00000000000000/* * Cms.IccProfileClass.cs A very incomplete wrapper for lcms * * Author(s): * Pascal de Bruijn * * This is free software. See COPYING for details. */ namespace Cms { public enum IccProfileClass : uint { Input = 0x73636e72, /* 'scnr' */ Display = 0x6D6e7472, /* 'mntr' */ Output = 0x70727472, /* 'prtr' */ Link = 0x6c696e6b, /* 'link' */ Abstract = 0x61627374, /* 'abst' */ ColorSpace = 0x73706163, /* 'spac' */ NamedColor = 0x6e6d636c, /* 'nmcl' */ Max = 0xffffffff, } } f-spot-0.8.2/src/Core/FSpot.Cms/Cms/Format.cs0000644000175000017500000000073211503404761021000 0ustar00rubenruben00000000000000/* * Cms.Format.cs A very incomplete wrapper for lcms * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ namespace Cms { public enum Format : uint { Rgb8 = 262169, Rgba8 = 262297, Rgba8Planar = 266393, Gbr8 = 263193, Rgb16 = 262170, Rgb16Planar = 266266, Rgba16 = 262298, Rgba16se = 264436, Rgb16se = 264218, Lab8 = 655385, Lab16 = 655386, Xyz16 = 589858, Yxy16 = 917530 } } f-spot-0.8.2/src/Core/FSpot.Cms/Cms/NativeMethods.cs0000644000175000017500000001620111503404761022320 0ustar00rubenruben00000000000000using System; using System.Runtime.InteropServices; namespace Cms { internal static class NativeMethods { [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsWhitePointFromTemp")] public static extern bool CmsWhitePointFromTemp(int TempSrc, out ColorCIExyY white_point); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsxyY2XYZ")] public static extern void CmsxyY2XYZ (out ColorCIEXYZ dest, ref ColorCIExyY src); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsD50_xyY")] public static extern IntPtr CmsD50xyY(); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsXYZ2xyY")] public static extern void CmsXYZ2xyY (out ColorCIExyY dest, ref ColorCIEXYZ source); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsXYZ2Lab")] public static extern void CmsXYZ2Lab (ref ColorCIEXYZ wp, out ColorCIELab lab, ref ColorCIEXYZ xyz); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsD50_XYZ")] public static extern IntPtr CmsD50XYZ(); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsLab2LCh")] public static extern void CmsLab2LCh (out ColorCIELCh lch, ref ColorCIELab lab); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsLab2XYZ")] public static extern void CmsLab2XYZ (ref ColorCIEXYZ wp, out ColorCIEXYZ xyz, ref ColorCIELab lab); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsLCh2Lab")] public static extern void CmsLCh2Lab (out ColorCIELab lab, ref ColorCIELCh lch); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsBuildGamma")] public static extern IntPtr CmsBuildGamma (int entry_count, double gamma); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsBuildParametricGamma")] public static extern IntPtr CmsBuildParametricGamma (int entry_count, int type, double [] values); // [DllImport("liblcms-1.0.0.dll")] // public static extern IntPtr cmsAllocGamma (int entry_count); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsFreeGamma")] public static extern void CmsFreeGamma (HandleRef handle); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsCreateMultiprofileTransform")] public static extern IntPtr CmsCreateMultiprofileTransform (HandleRef [] hProfiles, int nProfiles, Format InputFormat, Format OutputFormat, int Intent, uint dwFlags); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsCreateTransform")] public static extern IntPtr CmsCreateTransform(HandleRef Input, Format InputFormat, HandleRef Output, Format OutputFormat, int Intent, uint dwFlags); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsDoTransform")] public static extern void CmsDoTransform (HandleRef hTransform, IntPtr InputBuffer, IntPtr OutputBuffer, uint size); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsDeleteTransform")] public static extern void CmsDeleteTransform(HandleRef hTransform); [DllImport ("liblcms-1.0.0.dll", EntryPoint = "cmsCreateGrayProfile")] public static extern IntPtr CmsCreateGrayProfile (ref ColorCIExyY white_point, HandleRef transfer_function); [DllImport ("liblcms-1.0.0.dll", EntryPoint = "cmsCreateLabProfile")] public static extern IntPtr CmsCreateLabProfile (IntPtr foo); [DllImport ("liblcms-1.0.0.dll", EntryPoint = "cmsCreateLabProfile")] public static extern IntPtr CmsCreateLabProfile (out ColorCIExyY WhitePoint); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsCreate_sRGBProfile")] public static extern IntPtr CmsCreateSRGBProfile (); [DllImport("liblcms-1.0.0.dll", EntryPoint = "_cmsCreateProfilePlaceholder")] public static extern IntPtr CmsCreateProfilePlaceholder (); // [DllImport("liblcms-1.0.0.dll")] // public static extern IntPtr cmsCreateBCHSWabstractProfile(int nLUTPoints, // double Bright, // double Contrast, // double Hue, // double Saturation, // int TempSrc, // int TempDest); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsErrorAction")] public static extern void CmsErrorAction (int action); [DllImport ("liblcms-1.0.0.dll", EntryPoint = "cmsGetColorSpace")] public static extern uint CmsGetColorSpace (HandleRef hprofile); [DllImport ("liblcms-1.0.0.dll", EntryPoint = "cmsGetDeviceClass")] public static extern uint CmsGetDeviceClass (HandleRef hprofile); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsTakeProductDesc")] public extern static IntPtr CmsTakeProductDesc (HandleRef handle); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsTakeProductName")] public extern static IntPtr CmsTakeProductName (HandleRef handle); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsTakeModel")] public extern static IntPtr CmsTakeModel (HandleRef handle); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsTakeColorants")] public extern static bool CmsTakeColorants (out ColorCIEXYZTriple colors, HandleRef handle); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsTakeMediaBlackPoint")] public extern static bool CmsTakeMediaBlackPoint (out ColorCIEXYZ black, HandleRef handle); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsTakeMediaWhitePoint")] public extern static bool CmsTakeMediaWhitePoint (out ColorCIEXYZ wp, HandleRef handle); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsOpenProfileFromMem")] public static extern unsafe IntPtr CmsOpenProfileFromMem (byte *data, uint length); [DllImport("liblcms-1.0.0.dll", EntryPoint = "_cmsSaveProfileToMem")] public static extern unsafe bool CmsSaveProfileToMem (HandleRef profile, byte *mem, ref uint length); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsOpenProfileFromFile")] public static extern IntPtr CmsOpenProfileFromFile (string ICCProfile, string sAccess); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsCloseProfile")] public static extern int CmsCloseProfile (HandleRef hprofile); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsCreateRGBProfile")] public static extern IntPtr CmsCreateRGBProfile (out ColorCIExyY whitepoint, out ColorCIExyYTriple primaries, HandleRef [] gamma_table); [DllImport("liblcms-1.0.0.dll", EntryPoint = "cmsCreateLinearizationDeviceLink")] public static extern IntPtr CmsCreateLinearizationDeviceLink (IccColorSpace color_space, HandleRef [] tables); [DllImport("libfspot", EntryPoint = "f_cmsCreateBCHSWabstractProfile")] public static extern IntPtr FCmsCreateBCHSWabstractProfile(int nLUTPoints, double Exposure, double Bright, double Contrast, double Hue, double Saturation, ref ColorCIExyY src_wp, ref ColorCIExyY dest_wp, HandleRef [] tables); [DllImport ("libfspot", EntryPoint = "f_screen_get_profile")] public static extern IntPtr FScreenGetProfile (IntPtr screen); [DllImport ("libfspot", EntryPoint = "f_cms_gamma_table_new")] public static extern IntPtr FCmsGammaTableNew (ushort [] values, int start, int length); [DllImport ("libfspot", EntryPoint = "f_cms_gamma_table_get_values")] public static extern IntPtr FCmsGammaTableGetValues (HandleRef table); [DllImport ("libfspot", EntryPoint = "f_cms_gamma_table_get_count")] public static extern int FCmsGammaTableGetCount (HandleRef table); } } f-spot-0.8.2/src/Core/FSpot.Cms/Cms/CmsException.cs0000644000175000017500000000113711503404761022151 0ustar00rubenruben00000000000000/* * Cms.CmsException.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using System.Runtime.Serialization; namespace Cms { [Serializable] public class CmsException : System.Exception { public CmsException (string message) : base (message) { } protected CmsException (SerializationInfo info, StreamingContext context) : base (info, context) { } public CmsException (string message, Exception innerException) : base (message, innerException) { } public CmsException () : base () { } } } f-spot-0.8.2/src/Core/FSpot.Cms/Cms/ColorCIEXYZ.cs0000644000175000017500000000263511503404761021566 0ustar00rubenruben00000000000000/* * Cms.ColorCIEXYZ.cs A very incomplete wrapper for lcms * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ using System; using System.IO; using System.Collections; using System.Runtime.InteropServices; using System.Reflection; using System.Runtime.Serialization; namespace Cms { public struct ColorCIEXYZ { public double x; public double y; public double z; public ColorCIEXYZ (double x, double y, double z) { this.x = x; this.y = y; this.z = z; } public ColorCIExyY ToxyY () { ColorCIExyY dest; NativeMethods.CmsXYZ2xyY (out dest, ref this); return dest; } public ColorCIELab ToLab (ColorCIEXYZ wp) { ColorCIELab lab; NativeMethods.CmsXYZ2Lab (ref wp, out lab, ref this); return lab; } public static ColorCIEXYZ D50 { get { IntPtr ptr = NativeMethods.CmsD50XYZ (); return (ColorCIEXYZ) Marshal.PtrToStructure (ptr, typeof (ColorCIEXYZ)); } } public ColorCIELab ToLab (ColorCIExyY wp) { return ToLab (wp.ToXYZ ()); } public override string ToString () { return String.Format ("(x={0}, y={1}, z={2})", x, y, z); } } public struct ColorCIEXYZTriple { public ColorCIEXYZ Red; public ColorCIEXYZ Blue; public ColorCIEXYZ Green; ColorCIEXYZTriple (ColorCIEXYZ red, ColorCIEXYZ green, ColorCIEXYZ blue) { Red = red; Blue = blue; Green = green; } } } f-spot-0.8.2/src/Core/FSpot.Cms/Cms/ColorCIExyY.cs0000644000175000017500000000473111503404761021664 0ustar00rubenruben00000000000000/* * Cms.ColorCIExyY.cs A very incomplete wrapper for lcms * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ using System; using System.IO; using System.Collections; using System.Runtime.InteropServices; using System.Reflection; using System.Runtime.Serialization; namespace Cms { public struct ColorCIExyY { public double x; public double y; public double Y; public ColorCIExyY (double x, double y, double Y) { this.x = x; this.y = y; this.Y = Y; } public static ColorCIExyY WhitePointFromTemperature (int temp) { double x, y; CctTable.GetXY (temp, out x, out y); return new ColorCIExyY (x, y, 1.0); } public static ColorCIExyY WhitePointFromTemperatureCIE (int temp) { ColorCIExyY wp; NativeMethods.CmsWhitePointFromTemp (temp, out wp); return wp; } public static ColorCIExyY WhitePointFromTemperatureResource (int temp, string name) { ColorCIExyY wp; //const int line_size = 0x1e; using (Stream stream = Assembly.GetExecutingAssembly ().GetManifestResourceStream (name)) { StreamReader reader = new StreamReader (stream, System.Text.Encoding.ASCII); string line = null; for (int i = 0; i <= temp - 1000; i++) { line = reader.ReadLine (); } //System.Console.WriteLine (line); string [] subs = line.Split ('\t'); int ptemp = int.Parse (subs [0]); if (ptemp != temp) throw new CmsException (String.Format ("{0} != {1}", ptemp, temp)); double x = double.Parse (subs [1]); double y = double.Parse (subs [2]); wp = new ColorCIExyY (x, y, 1.0); return wp; } } public ColorCIEXYZ ToXYZ () { ColorCIEXYZ dest; NativeMethods.CmsxyY2XYZ (out dest, ref this); return dest; } public static ColorCIExyY D50 { get { IntPtr ptr = NativeMethods.CmsD50xyY (); return (ColorCIExyY) Marshal.PtrToStructure (ptr, typeof (ColorCIExyY)); } } public ColorCIELab ToLab (ColorCIExyY wp) { return this.ToXYZ ().ToLab (wp); } public ColorCIELab ToLab (ColorCIEXYZ wp) { return this.ToXYZ ().ToLab (wp); } public override string ToString () { return String.Format ("(x={0}, y={1}, Y={2})", x, y, Y); } } public struct ColorCIExyYTriple { public ColorCIExyY Red; public ColorCIExyY Green; public ColorCIExyY Blue; public ColorCIExyYTriple (ColorCIExyY red, ColorCIExyY green, ColorCIExyY blue) { Red = red; Green = green; Blue = blue; } } } f-spot-0.8.2/src/Core/FSpot.Cms/Cms/Transform.cs0000644000175000017500000000363411503404761021527 0ustar00rubenruben00000000000000/* * Cms.Transform.cs A very incomplete wrapper for lcms * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ using System; using System.IO; using System.Collections; using System.Runtime.InteropServices; using System.Reflection; using System.Runtime.Serialization; namespace Cms { public class Transform : IDisposable { private HandleRef handle; public HandleRef Handle { get { return handle; } } public Transform (Profile [] profiles, Format input_format, Format output_format, Intent intent, uint flags) { if (profiles == null) throw new ArgumentNullException ("profiles"); HandleRef [] handles = new HandleRef [profiles.Length]; for (int i = 0; i < profiles.Length; i++) { handles [i] = profiles [i].Handle; } this.handle = new HandleRef (this, NativeMethods.CmsCreateMultiprofileTransform (handles, handles.Length, input_format, output_format, (int)intent, flags)); } public Transform (Profile input, Format input_format, Profile output, Format output_format, Intent intent, uint flags) { if (input == null) throw new ArgumentNullException ("input"); if (output == null) throw new ArgumentNullException ("output"); this.handle = new HandleRef (this, NativeMethods.CmsCreateTransform (input.Handle, input_format, output.Handle, output_format, (int)intent, flags)); } // Fixme this should probably be more type stafe public void Apply (IntPtr input, IntPtr output, uint size) { NativeMethods.CmsDoTransform (Handle, input, output, size); } public void Dispose () { Cleanup (); System.GC.SuppressFinalize (this); } protected virtual void Cleanup () { NativeMethods.CmsDeleteTransform (this.handle); } ~Transform () { Cleanup (); } } } f-spot-0.8.2/src/Core/FSpot.Cms/Cms/IccColorSpace.cs0000644000175000017500000000317011503404761022220 0ustar00rubenruben00000000000000/* * Cms.IccColorSpace.cs A very incomplete wrapper for lcms * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ namespace Cms { public enum IccColorSpace : uint { XYZ = 0x58595A20, /* 'XYZ ' */ Lab = 0x4C616220, /* 'Lab ' */ Luv = 0x4C757620, /* 'Luv ' */ YCbCr = 0x59436272, /* 'YCbr' */ Yxy = 0x59787920, /* 'Yxy ' */ Rgb = 0x52474220, /* 'RGB ' */ Gray = 0x47524159, /* 'GRAY' */ Hsv = 0x48535620, /* 'HSV ' */ Hls = 0x484C5320, /* 'HLS ' */ Cmyk = 0x434D594B, /* 'CMYK' */ Cmy = 0x434D5920, /* 'CMY ' */ Color2 = 0x32434C52, /* '2CLR' */ Color3 = 0x33434C52, /* '3CLR' */ Color4 = 0x34434C52, /* '4CLR' */ Color5 = 0x35434C52, /* '5CLR' */ Color6 = 0x36434C52, /* '6CLR' */ Color7 = 0x37434C52, /* '7CLR' */ Color8 = 0x38434C52, /* '8CLR' */ Color9 = 0x39434C52, /* '9CLR' */ Color10 = 0x41434C52, /* 'ACLR' */ Color11 = 0x42434C52, /* 'BCLR' */ Color12 = 0x43434C52, /* 'CCLR' */ Color13 = 0x44434C52, /* 'DCLR' */ Color14 = 0x45434C52, /* 'ECLR' */ Color15 = 0x46434C52, /* 'FCLR' */ } } f-spot-0.8.2/src/Core/FSpot.Cms/Cms/CctTable.cs0000644000175000017500000354634011503404761021246 0ustar00rubenruben00000000000000namespace Cms { public static class CctTable { public static void GetXY (int temp, out double x, out double y) { x = XY[temp - 1000, 0]; y = XY[temp - 1000, 1]; } private static readonly double [,] XY = { {0.652756059, 0.344456906}, // 1000K {0.652614831, 0.344582115}, // 1001K {0.652473628, 0.344707233}, // 1002K {0.652332449, 0.344832258}, // 1003K {0.652191295, 0.344957192}, // 1004K {0.652050164, 0.345082033}, // 1005K {0.651909059, 0.345206781}, // 1006K {0.651767978, 0.345331436}, // 1007K {0.651626922, 0.345455998}, // 1008K {0.65148589, 0.345580467}, // 1009K {0.651344883, 0.345704843}, // 1010K {0.651203901, 0.345829125}, // 1011K {0.651062944, 0.345953312}, // 1012K {0.650922012, 0.346077406}, // 1013K {0.650781105, 0.346201406}, // 1014K {0.650640222, 0.346325311}, // 1015K {0.650499365, 0.346449121}, // 1016K {0.650358534, 0.346572837}, // 1017K {0.650217727, 0.346696457}, // 1018K {0.650076946, 0.346819982}, // 1019K {0.64993619, 0.346943412}, // 1020K {0.64979546, 0.347066746}, // 1021K {0.649654755, 0.347189984}, // 1022K {0.649514075, 0.347313126}, // 1023K {0.649373422, 0.347436172}, // 1024K {0.649232794, 0.347559121}, // 1025K {0.649092191, 0.347681974}, // 1026K {0.648951615, 0.34780473}, // 1027K {0.648811064, 0.347927389}, // 1028K {0.648670539, 0.348049951}, // 1029K {0.64853004, 0.348172415}, // 1030K {0.648389567, 0.348294782}, // 1031K {0.648249119, 0.348417051}, // 1032K {0.648108699, 0.348539223}, // 1033K {0.647968304, 0.348661296}, // 1034K {0.647827935, 0.34878327}, // 1035K {0.647687592, 0.348905147}, // 1036K {0.647547276, 0.349026924}, // 1037K {0.647406986, 0.349148603}, // 1038K {0.647266723, 0.349270183}, // 1039K {0.647126486, 0.349391664}, // 1040K {0.646986275, 0.349513045}, // 1041K {0.646846091, 0.349634327}, // 1042K {0.646705933, 0.349755509}, // 1043K {0.646565802, 0.349876591}, // 1044K {0.646425698, 0.349997574}, // 1045K {0.64628562, 0.350118455}, // 1046K {0.64614557, 0.350239237}, // 1047K {0.646005545, 0.350359918}, // 1048K {0.645865548, 0.350480498}, // 1049K {0.645725578, 0.350600977}, // 1050K {0.645585634, 0.350721356}, // 1051K {0.645445718, 0.350841633}, // 1052K {0.645305828, 0.350961808}, // 1053K {0.645165965, 0.351081882}, // 1054K {0.64502613, 0.351201854}, // 1055K {0.644886321, 0.351321725}, // 1056K {0.64474654, 0.351441493}, // 1057K {0.644606786, 0.351561159}, // 1058K {0.644467059, 0.351680723}, // 1059K {0.64432736, 0.351800184}, // 1060K {0.644187687, 0.351919542}, // 1061K {0.644048042, 0.352038797}, // 1062K {0.643908425, 0.35215795}, // 1063K {0.643768835, 0.352276999}, // 1064K {0.643629272, 0.352395945}, // 1065K {0.643489737, 0.352514787}, // 1066K {0.643350229, 0.352633526}, // 1067K {0.643210749, 0.352752161}, // 1068K {0.643071296, 0.352870692}, // 1069K {0.642931872, 0.352989119}, // 1070K {0.642792474, 0.353107441}, // 1071K {0.642653105, 0.353225659}, // 1072K {0.642513763, 0.353343773}, // 1073K {0.642374449, 0.353461782}, // 1074K {0.642235163, 0.353579685}, // 1075K {0.642095904, 0.353697484}, // 1076K {0.641956674, 0.353815178}, // 1077K {0.641817471, 0.353932766}, // 1078K {0.641678296, 0.354050249}, // 1079K {0.641539149, 0.354167626}, // 1080K {0.641400031, 0.354284898}, // 1081K {0.64126094, 0.354402063}, // 1082K {0.641121877, 0.354519123}, // 1083K {0.640982842, 0.354636076}, // 1084K {0.640843836, 0.354752923}, // 1085K {0.640704857, 0.354869664}, // 1086K {0.640565907, 0.354986298}, // 1087K {0.640426985, 0.355102825}, // 1088K {0.640288091, 0.355219245}, // 1089K {0.640149225, 0.355335558}, // 1090K {0.640010388, 0.355451764}, // 1091K {0.639871579, 0.355567863}, // 1092K {0.639732798, 0.355683854}, // 1093K {0.639594046, 0.355799738}, // 1094K {0.639455322, 0.355915514}, // 1095K {0.639316626, 0.356031182}, // 1096K {0.639177959, 0.356146742}, // 1097K {0.63903932, 0.356262194}, // 1098K {0.63890071, 0.356377538}, // 1099K {0.638762128, 0.356492773}, // 1100K {0.638623575, 0.3566079}, // 1101K {0.63848505, 0.356722918}, // 1102K {0.638346554, 0.356837828}, // 1103K {0.638208087, 0.356952628}, // 1104K {0.638069648, 0.35706732}, // 1105K {0.637931237, 0.357181902}, // 1106K {0.637792856, 0.357296375}, // 1107K {0.637654503, 0.357410739}, // 1108K {0.637516179, 0.357524993}, // 1109K {0.637377883, 0.357639137}, // 1110K {0.637239617, 0.357753172}, // 1111K {0.637101379, 0.357867097}, // 1112K {0.63696317, 0.357980912}, // 1113K {0.636824989, 0.358094616}, // 1114K {0.636686838, 0.358208211}, // 1115K {0.636548715, 0.358321695}, // 1116K {0.636410621, 0.358435068}, // 1117K {0.636272557, 0.358548331}, // 1118K {0.636134521, 0.358661483}, // 1119K {0.635996514, 0.358774524}, // 1120K {0.635858536, 0.358887454}, // 1121K {0.635720587, 0.359000274}, // 1122K {0.635582667, 0.359112982}, // 1123K {0.635444775, 0.359225578}, // 1124K {0.635306913, 0.359338063}, // 1125K {0.63516908, 0.359450437}, // 1126K {0.635031277, 0.359562699}, // 1127K {0.634893502, 0.359674849}, // 1128K {0.634755756, 0.359786888}, // 1129K {0.634618039, 0.359898814}, // 1130K {0.634480352, 0.360010628}, // 1131K {0.634342694, 0.36012233}, // 1132K {0.634205064, 0.36023392}, // 1133K {0.634067464, 0.360345397}, // 1134K {0.633929894, 0.360456762}, // 1135K {0.633792352, 0.360568014}, // 1136K {0.63365484, 0.360679153}, // 1137K {0.633517357, 0.360790179}, // 1138K {0.633379903, 0.360901093}, // 1139K {0.633242478, 0.361011893}, // 1140K {0.633105083, 0.36112258}, // 1141K {0.632967717, 0.361233154}, // 1142K {0.63283038, 0.361343615}, // 1143K {0.632693073, 0.361453962}, // 1144K {0.632555795, 0.361564195}, // 1145K {0.632418546, 0.361674315}, // 1146K {0.632281327, 0.361784321}, // 1147K {0.632144137, 0.361894213}, // 1148K {0.632006977, 0.362003991}, // 1149K {0.631869846, 0.362113655}, // 1150K {0.631732744, 0.362223205}, // 1151K {0.631595672, 0.362332641}, // 1152K {0.631458629, 0.362441962}, // 1153K {0.631321616, 0.362551169}, // 1154K {0.631184632, 0.362660261}, // 1155K {0.631047678, 0.362769238}, // 1156K {0.630910753, 0.362878101}, // 1157K {0.630773858, 0.362986849}, // 1158K {0.630636992, 0.363095482}, // 1159K {0.630500156, 0.363204}, // 1160K {0.630363349, 0.363312403}, // 1161K {0.630226572, 0.363420691}, // 1162K {0.630089824, 0.363528863}, // 1163K {0.629953106, 0.36363692}, // 1164K {0.629816418, 0.363744861}, // 1165K {0.629679759, 0.363852687}, // 1166K {0.62954313, 0.363960398}, // 1167K {0.629406531, 0.364067992}, // 1168K {0.629269961, 0.364175471}, // 1169K {0.62913342, 0.364282834}, // 1170K {0.62899691, 0.36439008}, // 1171K {0.628860429, 0.364497211}, // 1172K {0.628723978, 0.364604226}, // 1173K {0.628587556, 0.364711124}, // 1174K {0.628451164, 0.364817906}, // 1175K {0.628314802, 0.364924571}, // 1176K {0.628178469, 0.36503112}, // 1177K {0.628042167, 0.365137553}, // 1178K {0.627905893, 0.365243869}, // 1179K {0.62776965, 0.365350068}, // 1180K {0.627633437, 0.36545615}, // 1181K {0.627497253, 0.365562115}, // 1182K {0.627361099, 0.365667963}, // 1183K {0.627224974, 0.365773695}, // 1184K {0.62708888, 0.365879309}, // 1185K {0.626952815, 0.365984806}, // 1186K {0.62681678, 0.366090186}, // 1187K {0.626680775, 0.366195448}, // 1188K {0.6265448, 0.366300593}, // 1189K {0.626408854, 0.36640562}, // 1190K {0.626272938, 0.36651053}, // 1191K {0.626137053, 0.366615322}, // 1192K {0.626001197, 0.366719996}, // 1193K {0.62586537, 0.366824553}, // 1194K {0.625729574, 0.366928992}, // 1195K {0.625593807, 0.367033312}, // 1196K {0.625458071, 0.367137515}, // 1197K {0.625322364, 0.3672416}, // 1198K {0.625186687, 0.367345566}, // 1199K {0.62505104, 0.367449415}, // 1200K {0.624915423, 0.367553145}, // 1201K {0.624779836, 0.367656756}, // 1202K {0.624644279, 0.367760249}, // 1203K {0.624508751, 0.367863624}, // 1204K {0.624373254, 0.36796688}, // 1205K {0.624237786, 0.368070018}, // 1206K {0.624102349, 0.368173037}, // 1207K {0.623966941, 0.368275937}, // 1208K {0.623831563, 0.368378718}, // 1209K {0.623696216, 0.36848138}, // 1210K {0.623560898, 0.368583924}, // 1211K {0.62342561, 0.368686348}, // 1212K {0.623290352, 0.368788654}, // 1213K {0.623155124, 0.36889084}, // 1214K {0.623019926, 0.368992907}, // 1215K {0.622884758, 0.369094855}, // 1216K {0.62274962, 0.369196683}, // 1217K {0.622614512, 0.369298392}, // 1218K {0.622479434, 0.369399982}, // 1219K {0.622344386, 0.369501452}, // 1220K {0.622209368, 0.369602803}, // 1221K {0.62207438, 0.369704034}, // 1222K {0.621939422, 0.369805145}, // 1223K {0.621804494, 0.369906137}, // 1224K {0.621669596, 0.370007009}, // 1225K {0.621534728, 0.370107761}, // 1226K {0.621399891, 0.370208393}, // 1227K {0.621265083, 0.370308906}, // 1228K {0.621130305, 0.370409298}, // 1229K {0.620995557, 0.37050957}, // 1230K {0.620860839, 0.370609722}, // 1231K {0.620726152, 0.370709754}, // 1232K {0.620591494, 0.370809666}, // 1233K {0.620456867, 0.370909458}, // 1234K {0.620322269, 0.371009129}, // 1235K {0.620187702, 0.37110868}, // 1236K {0.620053165, 0.371208111}, // 1237K {0.619918658, 0.371307421}, // 1238K {0.61978418, 0.37140661}, // 1239K {0.619649733, 0.371505679}, // 1240K {0.619515316, 0.371604628}, // 1241K {0.61938093, 0.371703456}, // 1242K {0.619246573, 0.371802163}, // 1243K {0.619112246, 0.371900749}, // 1244K {0.61897795, 0.371999215}, // 1245K {0.618843683, 0.37209756}, // 1246K {0.618709447, 0.372195784}, // 1247K {0.618575241, 0.372293887}, // 1248K {0.618441065, 0.372391869}, // 1249K {0.618306919, 0.37248973}, // 1250K {0.618172803, 0.37258747}, // 1251K {0.618038717, 0.372685089}, // 1252K {0.617904662, 0.372782587}, // 1253K {0.617770637, 0.372879964}, // 1254K {0.617636641, 0.37297722}, // 1255K {0.617502676, 0.373074354}, // 1256K {0.617368741, 0.373171367}, // 1257K {0.617234837, 0.373268259}, // 1258K {0.617100962, 0.373365029}, // 1259K {0.616967117, 0.373461678}, // 1260K {0.616833303, 0.373558206}, // 1261K {0.616699519, 0.373654612}, // 1262K {0.616565765, 0.373750896}, // 1263K {0.616432041, 0.373847059}, // 1264K {0.616298348, 0.373943101}, // 1265K {0.616164684, 0.374039021}, // 1266K {0.616031051, 0.374134819}, // 1267K {0.615897448, 0.374230495}, // 1268K {0.615763875, 0.37432605}, // 1269K {0.615630333, 0.374421483}, // 1270K {0.61549682, 0.374516794}, // 1271K {0.615363338, 0.374611984}, // 1272K {0.615229886, 0.374707051}, // 1273K {0.615096464, 0.374801997}, // 1274K {0.614963072, 0.374896821}, // 1275K {0.614829711, 0.374991523}, // 1276K {0.61469638, 0.375086103}, // 1277K {0.614563079, 0.37518056}, // 1278K {0.614429808, 0.375274896}, // 1279K {0.614296567, 0.37536911}, // 1280K {0.614163357, 0.375463202}, // 1281K {0.614030177, 0.375557171}, // 1282K {0.613897027, 0.375651019}, // 1283K {0.613763907, 0.375744744}, // 1284K {0.613630818, 0.375838347}, // 1285K {0.613497759, 0.375931828}, // 1286K {0.61336473, 0.376025186}, // 1287K {0.613231731, 0.376118423}, // 1288K {0.613098763, 0.376211537}, // 1289K {0.612965825, 0.376304528}, // 1290K {0.612832917, 0.376397398}, // 1291K {0.612700039, 0.376490145}, // 1292K {0.612567192, 0.376582769}, // 1293K {0.612434375, 0.376675272}, // 1294K {0.612301588, 0.376767651}, // 1295K {0.612168831, 0.376859908}, // 1296K {0.612036105, 0.376952043}, // 1297K {0.611903409, 0.377044056}, // 1298K {0.611770743, 0.377135945}, // 1299K {0.611638108, 0.377227712}, // 1300K {0.611505502, 0.377319357}, // 1301K {0.611372928, 0.377410879}, // 1302K {0.611240383, 0.377502279}, // 1303K {0.611107869, 0.377593555}, // 1304K {0.610975385, 0.37768471}, // 1305K {0.610842931, 0.377775741}, // 1306K {0.610710508, 0.37786665}, // 1307K {0.610578115, 0.377957436}, // 1308K {0.610445752, 0.378048099}, // 1309K {0.610313419, 0.37813864}, // 1310K {0.610181117, 0.378229058}, // 1311K {0.610048845, 0.378319353}, // 1312K {0.609916604, 0.378409526}, // 1313K {0.609784393, 0.378499576}, // 1314K {0.609652212, 0.378589502}, // 1315K {0.609520061, 0.378679307}, // 1316K {0.609387941, 0.378768988}, // 1317K {0.609255851, 0.378858546}, // 1318K {0.609123792, 0.378947982}, // 1319K {0.608991763, 0.379037294}, // 1320K {0.608859764, 0.379126484}, // 1321K {0.608727795, 0.379215551}, // 1322K {0.608595857, 0.379304495}, // 1323K {0.608463949, 0.379393317}, // 1324K {0.608332072, 0.379482015}, // 1325K {0.608200225, 0.37957059}, // 1326K {0.608068408, 0.379659043}, // 1327K {0.607936622, 0.379747372}, // 1328K {0.607804866, 0.379835579}, // 1329K {0.607673141, 0.379923662}, // 1330K {0.607541446, 0.380011623}, // 1331K {0.607409781, 0.38009946}, // 1332K {0.607278146, 0.380187175}, // 1333K {0.607146542, 0.380274767}, // 1334K {0.607014969, 0.380362235}, // 1335K {0.606883426, 0.380449581}, // 1336K {0.606751913, 0.380536804}, // 1337K {0.60662043, 0.380623903}, // 1338K {0.606488978, 0.38071088}, // 1339K {0.606357557, 0.380797734}, // 1340K {0.606226166, 0.380884465}, // 1341K {0.606094805, 0.380971072}, // 1342K {0.605963475, 0.381057557}, // 1343K {0.605832175, 0.381143918}, // 1344K {0.605700905, 0.381230157}, // 1345K {0.605569666, 0.381316273}, // 1346K {0.605438458, 0.381402265}, // 1347K {0.605307279, 0.381488135}, // 1348K {0.605176132, 0.381573881}, // 1349K {0.605045014, 0.381659505}, // 1350K {0.604913928, 0.381745005}, // 1351K {0.604782871, 0.381830383}, // 1352K {0.604651845, 0.381915637}, // 1353K {0.60452085, 0.382000768}, // 1354K {0.604389885, 0.382085777}, // 1355K {0.604258951, 0.382170662}, // 1356K {0.604128047, 0.382255424}, // 1357K {0.603997173, 0.382340064}, // 1358K {0.60386633, 0.38242458}, // 1359K {0.603735517, 0.382508973}, // 1360K {0.603604735, 0.382593244}, // 1361K {0.603473984, 0.382677391}, // 1362K {0.603343263, 0.382761415}, // 1363K {0.603212572, 0.382845317}, // 1364K {0.603081912, 0.382929095}, // 1365K {0.602951283, 0.38301275}, // 1366K {0.602820684, 0.383096283}, // 1367K {0.602690115, 0.383179692}, // 1368K {0.602559577, 0.383262979}, // 1369K {0.60242907, 0.383346142}, // 1370K {0.602298593, 0.383429183}, // 1371K {0.602168146, 0.3835121}, // 1372K {0.602037731, 0.383594895}, // 1373K {0.601907345, 0.383677567}, // 1374K {0.601776991, 0.383760116}, // 1375K {0.601646666, 0.383842542}, // 1376K {0.601516373, 0.383924845}, // 1377K {0.60138611, 0.384007025}, // 1378K {0.601255877, 0.384089083}, // 1379K {0.601125676, 0.384171017}, // 1380K {0.600995504, 0.384252829}, // 1381K {0.600865364, 0.384334518}, // 1382K {0.600735253, 0.384416084}, // 1383K {0.600605174, 0.384497527}, // 1384K {0.600475125, 0.384578848}, // 1385K {0.600345107, 0.384660045}, // 1386K {0.600215119, 0.38474112}, // 1387K {0.600085162, 0.384822073}, // 1388K {0.599955236, 0.384902902}, // 1389K {0.59982534, 0.384983609}, // 1390K {0.599695474, 0.385064193}, // 1391K {0.59956564, 0.385144654}, // 1392K {0.599435836, 0.385224993}, // 1393K {0.599306063, 0.385305209}, // 1394K {0.59917632, 0.385385302}, // 1395K {0.599046608, 0.385465273}, // 1396K {0.598916927, 0.385545121}, // 1397K {0.598787276, 0.385624846}, // 1398K {0.598657656, 0.385704449}, // 1399K {0.598528067, 0.385783929}, // 1400K {0.598398509, 0.385863287}, // 1401K {0.598268981, 0.385942522}, // 1402K {0.598139483, 0.386021635}, // 1403K {0.598010017, 0.386100625}, // 1404K {0.597880581, 0.386179493}, // 1405K {0.597751176, 0.386258239}, // 1406K {0.597621802, 0.386336861}, // 1407K {0.597492458, 0.386415362}, // 1408K {0.597363145, 0.38649374}, // 1409K {0.597233863, 0.386571996}, // 1410K {0.597104612, 0.386650129}, // 1411K {0.596975391, 0.38672814}, // 1412K {0.596846201, 0.386806029}, // 1413K {0.596717042, 0.386883796}, // 1414K {0.596587914, 0.38696144}, // 1415K {0.596458816, 0.387038962}, // 1416K {0.596329749, 0.387116362}, // 1417K {0.596200713, 0.387193639}, // 1418K {0.596071708, 0.387270795}, // 1419K {0.595942734, 0.387347828}, // 1420K {0.59581379, 0.387424739}, // 1421K {0.595684877, 0.387501528}, // 1422K {0.595555995, 0.387578195}, // 1423K {0.595427144, 0.38765474}, // 1424K {0.595298324, 0.387731163}, // 1425K {0.595169534, 0.387807464}, // 1426K {0.595040776, 0.387883643}, // 1427K {0.594912048, 0.3879597}, // 1428K {0.594783351, 0.388035636}, // 1429K {0.594654685, 0.388111449}, // 1430K {0.59452605, 0.38818714}, // 1431K {0.594397445, 0.38826271}, // 1432K {0.594268872, 0.388338158}, // 1433K {0.594140329, 0.388413484}, // 1434K {0.594011818, 0.388488688}, // 1435K {0.593883337, 0.388563771}, // 1436K {0.593754887, 0.388638732}, // 1437K {0.593626468, 0.388713571}, // 1438K {0.59349808, 0.388788289}, // 1439K {0.593369723, 0.388862885}, // 1440K {0.593241397, 0.388937359}, // 1441K {0.593113102, 0.389011712}, // 1442K {0.592984838, 0.389085944}, // 1443K {0.592856604, 0.389160054}, // 1444K {0.592728402, 0.389234042}, // 1445K {0.592600231, 0.38930791}, // 1446K {0.592472091, 0.389381655}, // 1447K {0.592343981, 0.38945528}, // 1448K {0.592215903, 0.389528783}, // 1449K {0.592087856, 0.389602165}, // 1450K {0.591959839, 0.389675426}, // 1451K {0.591831854, 0.389748565}, // 1452K {0.5917039, 0.389821583}, // 1453K {0.591575977, 0.38989448}, // 1454K {0.591448085, 0.389967256}, // 1455K {0.591320223, 0.390039911}, // 1456K {0.591192393, 0.390112445}, // 1457K {0.591064594, 0.390184858}, // 1458K {0.590936827, 0.39025715}, // 1459K {0.59080909, 0.390329321}, // 1460K {0.590681384, 0.390401371}, // 1461K {0.590553709, 0.390473301}, // 1462K {0.590426066, 0.390545109}, // 1463K {0.590298454, 0.390616797}, // 1464K {0.590170872, 0.390688364}, // 1465K {0.590043322, 0.39075981}, // 1466K {0.589915803, 0.390831136}, // 1467K {0.589788315, 0.390902341}, // 1468K {0.589660859, 0.390973425}, // 1469K {0.589533433, 0.391044389}, // 1470K {0.589406039, 0.391115232}, // 1471K {0.589278676, 0.391185955}, // 1472K {0.589151344, 0.391256557}, // 1473K {0.589024043, 0.391327039}, // 1474K {0.588896774, 0.391397401}, // 1475K {0.588769535, 0.391467642}, // 1476K {0.588642328, 0.391537763}, // 1477K {0.588515152, 0.391607764}, // 1478K {0.588388008, 0.391677645}, // 1479K {0.588260894, 0.391747405}, // 1480K {0.588133812, 0.391817046}, // 1481K {0.588006762, 0.391886566}, // 1482K {0.587879742, 0.391955966}, // 1483K {0.587752754, 0.392025247}, // 1484K {0.587625797, 0.392094407}, // 1485K {0.587498871, 0.392163447}, // 1486K {0.587371977, 0.392232368}, // 1487K {0.587245114, 0.392301169}, // 1488K {0.587118282, 0.39236985}, // 1489K {0.586991482, 0.392438411}, // 1490K {0.586864713, 0.392506853}, // 1491K {0.586737975, 0.392575175}, // 1492K {0.586611269, 0.392643377}, // 1493K {0.586484594, 0.39271146}, // 1494K {0.586357951, 0.392779424}, // 1495K {0.586231339, 0.392847268}, // 1496K {0.586104758, 0.392914992}, // 1497K {0.585978209, 0.392982597}, // 1498K {0.585851691, 0.393050083}, // 1499K {0.585725205, 0.39311745}, // 1500K {0.58559875, 0.393184697}, // 1501K {0.585472326, 0.393251825}, // 1502K {0.585345934, 0.393318834}, // 1503K {0.585219574, 0.393385724}, // 1504K {0.585093245, 0.393452495}, // 1505K {0.584966947, 0.393519147}, // 1506K {0.584840681, 0.39358568}, // 1507K {0.584714447, 0.393652094}, // 1508K {0.584588244, 0.39371839}, // 1509K {0.584462072, 0.393784566}, // 1510K {0.584335933, 0.393850624}, // 1511K {0.584209824, 0.393916563}, // 1512K {0.584083747, 0.393982383}, // 1513K {0.583957702, 0.394048085}, // 1514K {0.583831689, 0.394113668}, // 1515K {0.583705707, 0.394179133}, // 1516K {0.583579756, 0.39424448}, // 1517K {0.583453838, 0.394309708}, // 1518K {0.58332795, 0.394374817}, // 1519K {0.583202095, 0.394439808}, // 1520K {0.583076271, 0.394504682}, // 1521K {0.582950479, 0.394569436}, // 1522K {0.582824718, 0.394634073}, // 1523K {0.582698989, 0.394698592}, // 1524K {0.582573292, 0.394762993}, // 1525K {0.582447627, 0.394827275}, // 1526K {0.582321993, 0.39489144}, // 1527K {0.582196391, 0.394955487}, // 1528K {0.582070821, 0.395019416}, // 1529K {0.581945282, 0.395083227}, // 1530K {0.581819775, 0.395146921}, // 1531K {0.5816943, 0.395210497}, // 1532K {0.581568857, 0.395273955}, // 1533K {0.581443446, 0.395337296}, // 1534K {0.581318066, 0.395400519}, // 1535K {0.581192718, 0.395463625}, // 1536K {0.581067402, 0.395526613}, // 1537K {0.580942118, 0.395589484}, // 1538K {0.580816866, 0.395652238}, // 1539K {0.580691645, 0.395714875}, // 1540K {0.580566457, 0.395777394}, // 1541K {0.5804413, 0.395839797}, // 1542K {0.580316175, 0.395902082}, // 1543K {0.580191082, 0.39596425}, // 1544K {0.580066021, 0.396026302}, // 1545K {0.579940992, 0.396088236}, // 1546K {0.579815995, 0.396150054}, // 1547K {0.579691029, 0.396211755}, // 1548K {0.579566096, 0.396273339}, // 1549K {0.579441195, 0.396334806}, // 1550K {0.579316325, 0.396396157}, // 1551K {0.579191488, 0.396457392}, // 1552K {0.579066683, 0.396518509}, // 1553K {0.578941909, 0.396579511}, // 1554K {0.578817168, 0.396640396}, // 1555K {0.578692459, 0.396701165}, // 1556K {0.578567781, 0.396761818}, // 1557K {0.578443136, 0.396822354}, // 1558K {0.578318523, 0.396882774}, // 1559K {0.578193942, 0.396943078}, // 1560K {0.578069393, 0.397003267}, // 1561K {0.577944876, 0.397063339}, // 1562K {0.577820391, 0.397123295}, // 1563K {0.577695939, 0.397183136}, // 1564K {0.577571518, 0.397242861}, // 1565K {0.57744713, 0.39730247}, // 1566K {0.577322774, 0.397361963}, // 1567K {0.57719845, 0.397421341}, // 1568K {0.577074158, 0.397480604}, // 1569K {0.576949899, 0.39753975}, // 1570K {0.576825671, 0.397598782}, // 1571K {0.576701476, 0.397657698}, // 1572K {0.576577313, 0.397716499}, // 1573K {0.576453183, 0.397775185}, // 1574K {0.576329085, 0.397833755}, // 1575K {0.576205018, 0.397892211}, // 1576K {0.576080985, 0.397950551}, // 1577K {0.575956983, 0.398008777}, // 1578K {0.575833014, 0.398066887}, // 1579K {0.575709077, 0.398124883}, // 1580K {0.575585173, 0.398182764}, // 1581K {0.5754613, 0.398240531}, // 1582K {0.575337461, 0.398298182}, // 1583K {0.575213653, 0.398355719}, // 1584K {0.575089878, 0.398413142}, // 1585K {0.574966136, 0.39847045}, // 1586K {0.574842425, 0.398527644}, // 1587K {0.574718747, 0.398584723}, // 1588K {0.574595102, 0.398641689}, // 1589K {0.574471489, 0.39869854}, // 1590K {0.574347909, 0.398755277}, // 1591K {0.574224361, 0.398811899}, // 1592K {0.574100845, 0.398868408}, // 1593K {0.573977362, 0.398924803}, // 1594K {0.573853912, 0.398981084}, // 1595K {0.573730494, 0.399037252}, // 1596K {0.573607108, 0.399093305}, // 1597K {0.573483756, 0.399149245}, // 1598K {0.573360435, 0.399205072}, // 1599K {0.573237148, 0.399260785}, // 1600K {0.573113892, 0.399316384}, // 1601K {0.57299067, 0.39937187}, // 1602K {0.57286748, 0.399427243}, // 1603K {0.572744323, 0.399482502}, // 1604K {0.572621198, 0.399537649}, // 1605K {0.572498106, 0.399592682}, // 1606K {0.572375047, 0.399647602}, // 1607K {0.57225202, 0.399702409}, // 1608K {0.572129026, 0.399757103}, // 1609K {0.572006065, 0.399811685}, // 1610K {0.571883137, 0.399866153}, // 1611K {0.571760241, 0.399920509}, // 1612K {0.571637378, 0.399974753}, // 1613K {0.571514548, 0.400028883}, // 1614K {0.57139175, 0.400082902}, // 1615K {0.571268985, 0.400136807}, // 1616K {0.571146254, 0.400190601}, // 1617K {0.571023554, 0.400244282}, // 1618K {0.570900888, 0.400297851}, // 1619K {0.570778255, 0.400351308}, // 1620K {0.570655654, 0.400404653}, // 1621K {0.570533087, 0.400457885}, // 1622K {0.570410552, 0.400511006}, // 1623K {0.57028805, 0.400564015}, // 1624K {0.570165581, 0.400616913}, // 1625K {0.570043145, 0.400669698}, // 1626K {0.569920742, 0.400722372}, // 1627K {0.569798372, 0.400774934}, // 1628K {0.569676034, 0.400827385}, // 1629K {0.56955373, 0.400879724}, // 1630K {0.569431459, 0.400931952}, // 1631K {0.569309221, 0.400984069}, // 1632K {0.569187015, 0.401036075}, // 1633K {0.569064843, 0.401087969}, // 1634K {0.568942704, 0.401139752}, // 1635K {0.568820598, 0.401191424}, // 1636K {0.568698525, 0.401242986}, // 1637K {0.568576485, 0.401294436}, // 1638K {0.568454478, 0.401345776}, // 1639K {0.568332504, 0.401397005}, // 1640K {0.568210564, 0.401448124}, // 1641K {0.568088656, 0.401499132}, // 1642K {0.567966782, 0.401550029}, // 1643K {0.567844941, 0.401600816}, // 1644K {0.567723133, 0.401651493}, // 1645K {0.567601358, 0.401702059}, // 1646K {0.567479617, 0.401752515}, // 1647K {0.567357908, 0.401802861}, // 1648K {0.567236233, 0.401853098}, // 1649K {0.567114591, 0.401903224}, // 1650K {0.566992983, 0.40195324}, // 1651K {0.566871408, 0.402003146}, // 1652K {0.566749866, 0.402052943}, // 1653K {0.566628357, 0.40210263}, // 1654K {0.566506882, 0.402152208}, // 1655K {0.56638544, 0.402201676}, // 1656K {0.566264031, 0.402251034}, // 1657K {0.566142656, 0.402300283}, // 1658K {0.566021314, 0.402349423}, // 1659K {0.565900005, 0.402398454}, // 1660K {0.56577873, 0.402447376}, // 1661K {0.565657488, 0.402496188}, // 1662K {0.56553628, 0.402544892}, // 1663K {0.565415105, 0.402593487}, // 1664K {0.565293964, 0.402641972}, // 1665K {0.565172856, 0.40269035}, // 1666K {0.565051782, 0.402738618}, // 1667K {0.564930741, 0.402786778}, // 1668K {0.564809733, 0.402834829}, // 1669K {0.56468876, 0.402882772}, // 1670K {0.564567819, 0.402930607}, // 1671K {0.564446913, 0.402978333}, // 1672K {0.56432604, 0.403025951}, // 1673K {0.5642052, 0.403073461}, // 1674K {0.564084394, 0.403120863}, // 1675K {0.563963622, 0.403168157}, // 1676K {0.563842883, 0.403215343}, // 1677K {0.563722178, 0.403262422}, // 1678K {0.563601507, 0.403309392}, // 1679K {0.563480869, 0.403356255}, // 1680K {0.563360265, 0.40340301}, // 1681K {0.563239695, 0.403449658}, // 1682K {0.563119158, 0.403496199}, // 1683K {0.562998655, 0.403542632}, // 1684K {0.562878186, 0.403588958}, // 1685K {0.562757751, 0.403635176}, // 1686K {0.56263735, 0.403681288}, // 1687K {0.562516982, 0.403727292}, // 1688K {0.562396648, 0.40377319}, // 1689K {0.562276348, 0.403818981}, // 1690K {0.562156082, 0.403864665}, // 1691K {0.562035849, 0.403910242}, // 1692K {0.561915651, 0.403955713}, // 1693K {0.561795486, 0.404001077}, // 1694K {0.561675355, 0.404046335}, // 1695K {0.561555258, 0.404091486}, // 1696K {0.561435195, 0.404136531}, // 1697K {0.561315166, 0.40418147}, // 1698K {0.561195171, 0.404226303}, // 1699K {0.56107521, 0.404271029}, // 1700K {0.560955283, 0.40431565}, // 1701K {0.56083539, 0.404360165}, // 1702K {0.560715531, 0.404404574}, // 1703K {0.560595706, 0.404448877}, // 1704K {0.560475915, 0.404493075}, // 1705K {0.560356158, 0.404537167}, // 1706K {0.560236435, 0.404581153}, // 1707K {0.560116746, 0.404625034}, // 1708K {0.559997092, 0.40466881}, // 1709K {0.559877471, 0.404712481}, // 1710K {0.559757885, 0.404756046}, // 1711K {0.559638332, 0.404799507}, // 1712K {0.559518814, 0.404842862}, // 1713K {0.55939933, 0.404886113}, // 1714K {0.55927988, 0.404929258}, // 1715K {0.559160465, 0.404972299}, // 1716K {0.559041083, 0.405015236}, // 1717K {0.558921736, 0.405058067}, // 1718K {0.558802423, 0.405100795}, // 1719K {0.558683145, 0.405143418}, // 1720K {0.5585639, 0.405185936}, // 1721K {0.55844469, 0.40522835}, // 1722K {0.558325515, 0.40527066}, // 1723K {0.558206373, 0.405312866}, // 1724K {0.558087266, 0.405354969}, // 1725K {0.557968193, 0.405396967}, // 1726K {0.557849155, 0.405438861}, // 1727K {0.557730151, 0.405480652}, // 1728K {0.557611181, 0.405522339}, // 1729K {0.557492246, 0.405563922}, // 1730K {0.557373345, 0.405605402}, // 1731K {0.557254479, 0.405646778}, // 1732K {0.557135647, 0.405688051}, // 1733K {0.557016849, 0.405729221}, // 1734K {0.556898086, 0.405770288}, // 1735K {0.556779358, 0.405811252}, // 1736K {0.556660664, 0.405852112}, // 1737K {0.556542004, 0.40589287}, // 1738K {0.55642338, 0.405933525}, // 1739K {0.556304789, 0.405974078}, // 1740K {0.556186233, 0.406014527}, // 1741K {0.556067712, 0.406054874}, // 1742K {0.555949226, 0.406095119}, // 1743K {0.555830774, 0.406135261}, // 1744K {0.555712356, 0.406175301}, // 1745K {0.555593974, 0.406215239}, // 1746K {0.555475626, 0.406255074}, // 1747K {0.555357312, 0.406294808}, // 1748K {0.555239034, 0.40633444}, // 1749K {0.55512079, 0.406373969}, // 1750K {0.55500258, 0.406413397}, // 1751K {0.554884406, 0.406452723}, // 1752K {0.554766266, 0.406491948}, // 1753K {0.554648161, 0.406531071}, // 1754K {0.554530091, 0.406570093}, // 1755K {0.554412055, 0.406609013}, // 1756K {0.554294054, 0.406647832}, // 1757K {0.554176089, 0.40668655}, // 1758K {0.554058158, 0.406725167}, // 1759K {0.553940261, 0.406763683}, // 1760K {0.5538224, 0.406802097}, // 1761K {0.553704574, 0.406840411}, // 1762K {0.553586782, 0.406878625}, // 1763K {0.553469026, 0.406916737}, // 1764K {0.553351304, 0.406954749}, // 1765K {0.553233617, 0.406992661}, // 1766K {0.553115965, 0.407030472}, // 1767K {0.552998348, 0.407068182}, // 1768K {0.552880767, 0.407105793}, // 1769K {0.55276322, 0.407143303}, // 1770K {0.552645708, 0.407180714}, // 1771K {0.552528231, 0.407218024}, // 1772K {0.552410789, 0.407255235}, // 1773K {0.552293383, 0.407292346}, // 1774K {0.552176011, 0.407329357}, // 1775K {0.552058674, 0.407366268}, // 1776K {0.551941373, 0.40740308}, // 1777K {0.551824106, 0.407439792}, // 1778K {0.551706875, 0.407476405}, // 1779K {0.551589679, 0.407512919}, // 1780K {0.551472518, 0.407549334}, // 1781K {0.551355392, 0.407585649}, // 1782K {0.551238302, 0.407621866}, // 1783K {0.551121246, 0.407657984}, // 1784K {0.551004226, 0.407694003}, // 1785K {0.550887241, 0.407729923}, // 1786K {0.550770291, 0.407765744}, // 1787K {0.550653377, 0.407801467}, // 1788K {0.550536498, 0.407837091}, // 1789K {0.550419654, 0.407872617}, // 1790K {0.550302845, 0.407908045}, // 1791K {0.550186072, 0.407943375}, // 1792K {0.550069334, 0.407978606}, // 1793K {0.549952631, 0.40801374}, // 1794K {0.549835964, 0.408048775}, // 1795K {0.549719332, 0.408083713}, // 1796K {0.549602736, 0.408118553}, // 1797K {0.549486175, 0.408153295}, // 1798K {0.549369649, 0.408187939}, // 1799K {0.549253159, 0.408222487}, // 1800K {0.549136704, 0.408256936}, // 1801K {0.549020285, 0.408291289}, // 1802K {0.548903901, 0.408325544}, // 1803K {0.548787553, 0.408359702}, // 1804K {0.54867124, 0.408393763}, // 1805K {0.548554962, 0.408427727}, // 1806K {0.548438721, 0.408461594}, // 1807K {0.548322514, 0.408495365}, // 1808K {0.548206344, 0.408529038}, // 1809K {0.548090209, 0.408562616}, // 1810K {0.547974109, 0.408596096}, // 1811K {0.547858045, 0.40862948}, // 1812K {0.547742017, 0.408662768}, // 1813K {0.547626024, 0.40869596}, // 1814K {0.547510067, 0.408729055}, // 1815K {0.547394146, 0.408762055}, // 1816K {0.54727826, 0.408794958}, // 1817K {0.54716241, 0.408827766}, // 1818K {0.547046596, 0.408860478}, // 1819K {0.546930817, 0.408893094}, // 1820K {0.546815074, 0.408925614}, // 1821K {0.546699367, 0.408958039}, // 1822K {0.546583696, 0.408990369}, // 1823K {0.546468061, 0.409022603}, // 1824K {0.546352461, 0.409054742}, // 1825K {0.546236897, 0.409086786}, // 1826K {0.546121369, 0.409118735}, // 1827K {0.546005876, 0.409150589}, // 1828K {0.54589042, 0.409182348}, // 1829K {0.545774999, 0.409214012}, // 1830K {0.545659615, 0.409245581}, // 1831K {0.545544266, 0.409277056}, // 1832K {0.545428953, 0.409308436}, // 1833K {0.545313676, 0.409339722}, // 1834K {0.545198435, 0.409370914}, // 1835K {0.54508323, 0.409402011}, // 1836K {0.54496806, 0.409433014}, // 1837K {0.544852927, 0.409463923}, // 1838K {0.54473783, 0.409494738}, // 1839K {0.544622769, 0.409525459}, // 1840K {0.544507744, 0.409556087}, // 1841K {0.544392754, 0.40958662}, // 1842K {0.544277801, 0.409617061}, // 1843K {0.544162884, 0.409647407}, // 1844K {0.544048003, 0.40967766}, // 1845K {0.543933158, 0.40970782}, // 1846K {0.543818349, 0.409737887}, // 1847K {0.543703577, 0.40976786}, // 1848K {0.54358884, 0.409797741}, // 1849K {0.54347414, 0.409827528}, // 1850K {0.543359475, 0.409857222}, // 1851K {0.543244847, 0.409886824}, // 1852K {0.543130255, 0.409916333}, // 1853K {0.5430157, 0.40994575}, // 1854K {0.54290118, 0.409975074}, // 1855K {0.542786697, 0.410004305}, // 1856K {0.54267225, 0.410033444}, // 1857K {0.542557839, 0.410062491}, // 1858K {0.542443464, 0.410091446}, // 1859K {0.542329126, 0.410120309}, // 1860K {0.542214824, 0.410149079}, // 1861K {0.542100558, 0.410177758}, // 1862K {0.541986329, 0.410206345}, // 1863K {0.541872136, 0.410234841}, // 1864K {0.541757979, 0.410263245}, // 1865K {0.541643859, 0.410291557}, // 1866K {0.541529775, 0.410319778}, // 1867K {0.541415727, 0.410347908}, // 1868K {0.541301716, 0.410375946}, // 1869K {0.541187741, 0.410403893}, // 1870K {0.541073803, 0.410431749}, // 1871K {0.540959901, 0.410459515}, // 1872K {0.540846035, 0.410487189}, // 1873K {0.540732206, 0.410514773}, // 1874K {0.540618414, 0.410542266}, // 1875K {0.540504658, 0.410569668}, // 1876K {0.540390938, 0.41059698}, // 1877K {0.540277255, 0.410624201}, // 1878K {0.540163609, 0.410651333}, // 1879K {0.540049999, 0.410678374}, // 1880K {0.539936426, 0.410705324}, // 1881K {0.539822889, 0.410732185}, // 1882K {0.539709389, 0.410758956}, // 1883K {0.539595925, 0.410785637}, // 1884K {0.539482498, 0.410812229}, // 1885K {0.539369108, 0.41083873}, // 1886K {0.539255754, 0.410865142}, // 1887K {0.539142437, 0.410891465}, // 1888K {0.539029156, 0.410917698}, // 1889K {0.538915913, 0.410943842}, // 1890K {0.538802706, 0.410969897}, // 1891K {0.538689535, 0.410995862}, // 1892K {0.538576402, 0.411021739}, // 1893K {0.538463305, 0.411047527}, // 1894K {0.538350245, 0.411073226}, // 1895K {0.538237221, 0.411098836}, // 1896K {0.538124234, 0.411124357}, // 1897K {0.538011285, 0.41114979}, // 1898K {0.537898372, 0.411175135}, // 1899K {0.537785495, 0.411200391}, // 1900K {0.537672656, 0.411225559}, // 1901K {0.537559853, 0.411250638}, // 1902K {0.537447088, 0.41127563}, // 1903K {0.537334359, 0.411300533}, // 1904K {0.537221667, 0.411325349}, // 1905K {0.537109012, 0.411350077}, // 1906K {0.536996393, 0.411374717}, // 1907K {0.536883812, 0.41139927}, // 1908K {0.536771268, 0.411423735}, // 1909K {0.53665876, 0.411448112}, // 1910K {0.53654629, 0.411472403}, // 1911K {0.536433856, 0.411496606}, // 1912K {0.536321459, 0.411520722}, // 1913K {0.5362091, 0.41154475}, // 1914K {0.536096777, 0.411568692}, // 1915K {0.535984492, 0.411592547}, // 1916K {0.535872243, 0.411616315}, // 1917K {0.535760031, 0.411639997}, // 1918K {0.535647857, 0.411663592}, // 1919K {0.535535719, 0.4116871}, // 1920K {0.535423619, 0.411710522}, // 1921K {0.535311556, 0.411733858}, // 1922K {0.53519953, 0.411757107}, // 1923K {0.535087541, 0.41178027}, // 1924K {0.534975589, 0.411803347}, // 1925K {0.534863674, 0.411826339}, // 1926K {0.534751796, 0.411849244}, // 1927K {0.534639956, 0.411872064}, // 1928K {0.534528152, 0.411894798}, // 1929K {0.534416386, 0.411917446}, // 1930K {0.534304657, 0.411940009}, // 1931K {0.534192965, 0.411962486}, // 1932K {0.534081311, 0.411984879}, // 1933K {0.533969694, 0.412007186}, // 1934K {0.533858113, 0.412029408}, // 1935K {0.533746571, 0.412051544}, // 1936K {0.533635065, 0.412073596}, // 1937K {0.533523597, 0.412095564}, // 1938K {0.533412166, 0.412117446}, // 1939K {0.533300772, 0.412139244}, // 1940K {0.533189416, 0.412160957}, // 1941K {0.533078097, 0.412182586}, // 1942K {0.532966815, 0.41220413}, // 1943K {0.532855571, 0.41222559}, // 1944K {0.532744364, 0.412246966}, // 1945K {0.532633194, 0.412268258}, // 1946K {0.532522062, 0.412289465}, // 1947K {0.532410967, 0.412310589}, // 1948K {0.53229991, 0.412331629}, // 1949K {0.53218889, 0.412352586}, // 1950K {0.532077907, 0.412373459}, // 1951K {0.531966962, 0.412394248}, // 1952K {0.531856054, 0.412414953}, // 1953K {0.531745184, 0.412435576}, // 1954K {0.531634352, 0.412456115}, // 1955K {0.531523556, 0.412476571}, // 1956K {0.531412799, 0.412496944}, // 1957K {0.531302078, 0.412517234}, // 1958K {0.531191396, 0.412537441}, // 1959K {0.531080751, 0.412557565}, // 1960K {0.530970143, 0.412577607}, // 1961K {0.530859573, 0.412597566}, // 1962K {0.53074904, 0.412617442}, // 1963K {0.530638546, 0.412637236}, // 1964K {0.530528088, 0.412656948}, // 1965K {0.530417669, 0.412676578}, // 1966K {0.530307286, 0.412696125}, // 1967K {0.530196942, 0.41271559}, // 1968K {0.530086635, 0.412734974}, // 1969K {0.529976366, 0.412754275}, // 1970K {0.529866135, 0.412773495}, // 1971K {0.529755941, 0.412792633}, // 1972K {0.529645785, 0.41281169}, // 1973K {0.529535666, 0.412830665}, // 1974K {0.529425585, 0.412849558}, // 1975K {0.529315542, 0.412868371}, // 1976K {0.529205537, 0.412887102}, // 1977K {0.529095569, 0.412905752}, // 1978K {0.52898564, 0.412924321}, // 1979K {0.528875747, 0.412942809}, // 1980K {0.528765893, 0.412961216}, // 1981K {0.528656077, 0.412979542}, // 1982K {0.528546298, 0.412997788}, // 1983K {0.528436557, 0.413015953}, // 1984K {0.528326854, 0.413034038}, // 1985K {0.528217188, 0.413052042}, // 1986K {0.528107561, 0.413069967}, // 1987K {0.527997971, 0.41308781}, // 1988K {0.52788842, 0.413105574}, // 1989K {0.527778906, 0.413123258}, // 1990K {0.52766943, 0.413140862}, // 1991K {0.527559992, 0.413158386}, // 1992K {0.527450591, 0.41317583}, // 1993K {0.527341229, 0.413193195}, // 1994K {0.527231905, 0.41321048}, // 1995K {0.527122618, 0.413227686}, // 1996K {0.527013369, 0.413244812}, // 1997K {0.526904159, 0.413261859}, // 1998K {0.526794986, 0.413278827}, // 1999K {0.526685851, 0.413295716}, // 2000K {0.526576755, 0.413312526}, // 2001K {0.526467696, 0.413329257}, // 2002K {0.526358675, 0.413345909}, // 2003K {0.526249693, 0.413362483}, // 2004K {0.526140748, 0.413378978}, // 2005K {0.526031841, 0.413395394}, // 2006K {0.525922973, 0.413411732}, // 2007K {0.525814142, 0.413427991}, // 2008K {0.52570535, 0.413444173}, // 2009K {0.525596595, 0.413460276}, // 2010K {0.525487879, 0.413476301}, // 2011K {0.525379201, 0.413492248}, // 2012K {0.52527056, 0.413508117}, // 2013K {0.525161958, 0.413523909}, // 2014K {0.525053394, 0.413539623}, // 2015K {0.524944869, 0.413555259}, // 2016K {0.524836381, 0.413570817}, // 2017K {0.524727931, 0.413586299}, // 2018K {0.52461952, 0.413601703}, // 2019K {0.524511147, 0.413617029}, // 2020K {0.524402812, 0.413632279}, // 2021K {0.524294515, 0.413647451}, // 2022K {0.524186256, 0.413662547}, // 2023K {0.524078036, 0.413677565}, // 2024K {0.523969854, 0.413692507}, // 2025K {0.52386171, 0.413707373}, // 2026K {0.523753604, 0.413722161}, // 2027K {0.523645536, 0.413736873}, // 2028K {0.523537507, 0.413751509}, // 2029K {0.523429516, 0.413766068}, // 2030K {0.523321563, 0.413780552}, // 2031K {0.523213649, 0.413794959}, // 2032K {0.523105773, 0.41380929}, // 2033K {0.522997935, 0.413823545}, // 2034K {0.522890135, 0.413837724}, // 2035K {0.522782374, 0.413851828}, // 2036K {0.522674651, 0.413865855}, // 2037K {0.522566967, 0.413879808}, // 2038K {0.522459321, 0.413893684}, // 2039K {0.522351713, 0.413907486}, // 2040K {0.522244143, 0.413921212}, // 2041K {0.522136612, 0.413934862}, // 2042K {0.522029119, 0.413948438}, // 2043K {0.521921665, 0.413961939}, // 2044K {0.521814249, 0.413975365}, // 2045K {0.521706871, 0.413988715}, // 2046K {0.521599532, 0.414001992}, // 2047K {0.521492232, 0.414015193}, // 2048K {0.521384969, 0.41402832}, // 2049K {0.521277745, 0.414041372}, // 2050K {0.52117056, 0.41405435}, // 2051K {0.521063413, 0.414067254}, // 2052K {0.520956305, 0.414080084}, // 2053K {0.520849235, 0.414092839}, // 2054K {0.520742203, 0.41410552}, // 2055K {0.52063521, 0.414118128}, // 2056K {0.520528256, 0.414130662}, // 2057K {0.52042134, 0.414143121}, // 2058K {0.520314462, 0.414155508}, // 2059K {0.520207623, 0.41416782}, // 2060K {0.520100823, 0.414180059}, // 2061K {0.519994061, 0.414192225}, // 2062K {0.519887338, 0.414204318}, // 2063K {0.519780653, 0.414216337}, // 2064K {0.519674007, 0.414228283}, // 2065K {0.519567399, 0.414240156}, // 2066K {0.51946083, 0.414251956}, // 2067K {0.5193543, 0.414263684}, // 2068K {0.519247808, 0.414275338}, // 2069K {0.519141355, 0.41428692}, // 2070K {0.51903494, 0.41429843}, // 2071K {0.518928564, 0.414309867}, // 2072K {0.518822227, 0.414321231}, // 2073K {0.518715928, 0.414332523}, // 2074K {0.518609668, 0.414343743}, // 2075K {0.518503447, 0.414354891}, // 2076K {0.518397264, 0.414365967}, // 2077K {0.51829112, 0.414376971}, // 2078K {0.518185015, 0.414387903}, // 2079K {0.518078948, 0.414398763}, // 2080K {0.51797292, 0.414409552}, // 2081K {0.517866931, 0.414420269}, // 2082K {0.517760981, 0.414430915}, // 2083K {0.517655069, 0.414441489}, // 2084K {0.517549196, 0.414451992}, // 2085K {0.517443361, 0.414462423}, // 2086K {0.517337566, 0.414472784}, // 2087K {0.517231809, 0.414483074}, // 2088K {0.517126091, 0.414493292}, // 2089K {0.517020411, 0.41450344}, // 2090K {0.516914771, 0.414513517}, // 2091K {0.516809169, 0.414523523}, // 2092K {0.516703606, 0.414533459}, // 2093K {0.516598082, 0.414543324}, // 2094K {0.516492596, 0.414553119}, // 2095K {0.51638715, 0.414562844}, // 2096K {0.516281742, 0.414572498}, // 2097K {0.516176373, 0.414582082}, // 2098K {0.516071043, 0.414591596}, // 2099K {0.515965752, 0.41460104}, // 2100K {0.515860499, 0.414610415}, // 2101K {0.515755286, 0.414619719}, // 2102K {0.515650111, 0.414628954}, // 2103K {0.515544975, 0.414638119}, // 2104K {0.515439878, 0.414647215}, // 2105K {0.51533482, 0.414656241}, // 2106K {0.5152298, 0.414665198}, // 2107K {0.51512482, 0.414674086}, // 2108K {0.515019879, 0.414682904}, // 2109K {0.514914976, 0.414691654}, // 2110K {0.514810112, 0.414700335}, // 2111K {0.514705288, 0.414708946}, // 2112K {0.514600502, 0.414717489}, // 2113K {0.514495755, 0.414725963}, // 2114K {0.514391047, 0.414734369}, // 2115K {0.514286378, 0.414742706}, // 2116K {0.514181748, 0.414750975}, // 2117K {0.514077157, 0.414759175}, // 2118K {0.513972605, 0.414767307}, // 2119K {0.513868092, 0.414775371}, // 2120K {0.513763618, 0.414783366}, // 2121K {0.513659182, 0.414791294}, // 2122K {0.513554786, 0.414799154}, // 2123K {0.513450429, 0.414806946}, // 2124K {0.513346111, 0.41481467}, // 2125K {0.513241832, 0.414822327}, // 2126K {0.513137592, 0.414829916}, // 2127K {0.51303339, 0.414837438}, // 2128K {0.512929228, 0.414844892}, // 2129K {0.512825105, 0.414852279}, // 2130K {0.512721021, 0.414859599}, // 2131K {0.512616976, 0.414866851}, // 2132K {0.51251297, 0.414874037}, // 2133K {0.512409003, 0.414881156}, // 2134K {0.512305075, 0.414888208}, // 2135K {0.512201187, 0.414895193}, // 2136K {0.512097337, 0.414902111}, // 2137K {0.511993526, 0.414908963}, // 2138K {0.511889755, 0.414915749}, // 2139K {0.511786022, 0.414922468}, // 2140K {0.511682329, 0.41492912}, // 2141K {0.511578675, 0.414935707}, // 2142K {0.51147506, 0.414942227}, // 2143K {0.511371484, 0.414948681}, // 2144K {0.511267947, 0.41495507}, // 2145K {0.511164449, 0.414961392}, // 2146K {0.51106099, 0.414967649}, // 2147K {0.510957571, 0.41497384}, // 2148K {0.510854191, 0.414979965}, // 2149K {0.510750849, 0.414986025}, // 2150K {0.510647547, 0.414992019}, // 2151K {0.510544284, 0.414997948}, // 2152K {0.510441061, 0.415003812}, // 2153K {0.510337876, 0.41500961}, // 2154K {0.510234731, 0.415015344}, // 2155K {0.510131625, 0.415021012}, // 2156K {0.510028557, 0.415026616}, // 2157K {0.50992553, 0.415032154}, // 2158K {0.509822541, 0.415037628}, // 2159K {0.509719592, 0.415043038}, // 2160K {0.509616681, 0.415048382}, // 2161K {0.50951381, 0.415053663}, // 2162K {0.509410978, 0.415058879}, // 2163K {0.509308186, 0.41506403}, // 2164K {0.509205432, 0.415069118}, // 2165K {0.509102718, 0.415074141}, // 2166K {0.509000043, 0.4150791}, // 2167K {0.508897408, 0.415083995}, // 2168K {0.508794811, 0.415088826}, // 2169K {0.508692254, 0.415093594}, // 2170K {0.508589736, 0.415098298}, // 2171K {0.508487257, 0.415102938}, // 2172K {0.508384818, 0.415107515}, // 2173K {0.508282418, 0.415112028}, // 2174K {0.508180057, 0.415116478}, // 2175K {0.508077735, 0.415120864}, // 2176K {0.507975453, 0.415125188}, // 2177K {0.50787321, 0.415129448}, // 2178K {0.507771006, 0.415133645}, // 2179K {0.507668841, 0.41513778}, // 2180K {0.507566716, 0.415141851}, // 2181K {0.50746463, 0.41514586}, // 2182K {0.507362584, 0.415149806}, // 2183K {0.507260576, 0.41515369}, // 2184K {0.507158608, 0.415157511}, // 2185K {0.50705668, 0.41516127}, // 2186K {0.50695479, 0.415164966}, // 2187K {0.50685294, 0.4151686}, // 2188K {0.50675113, 0.415172172}, // 2189K {0.506649358, 0.415175682}, // 2190K {0.506547626, 0.415179129}, // 2191K {0.506445934, 0.415182515}, // 2192K {0.50634428, 0.41518584}, // 2193K {0.506242666, 0.415189102}, // 2194K {0.506141092, 0.415192303}, // 2195K {0.506039557, 0.415195442}, // 2196K {0.505938061, 0.41519852}, // 2197K {0.505836604, 0.415201536}, // 2198K {0.505735187, 0.415204491}, // 2199K {0.505633809, 0.415207385}, // 2200K {0.505532471, 0.415210218}, // 2201K {0.505431172, 0.415212989}, // 2202K {0.505329912, 0.4152157}, // 2203K {0.505228692, 0.41521835}, // 2204K {0.505127511, 0.415220939}, // 2205K {0.505026369, 0.415223467}, // 2206K {0.504925267, 0.415225935}, // 2207K {0.504824204, 0.415228342}, // 2208K {0.504723181, 0.415230688}, // 2209K {0.504622197, 0.415232975}, // 2210K {0.504521253, 0.415235201}, // 2211K {0.504420348, 0.415237366}, // 2212K {0.504319482, 0.415239472}, // 2213K {0.504218656, 0.415241518}, // 2214K {0.504117869, 0.415243503}, // 2215K {0.504017121, 0.415245429}, // 2216K {0.503916413, 0.415247295}, // 2217K {0.503815745, 0.415249102}, // 2218K {0.503715116, 0.415250848}, // 2219K {0.503614526, 0.415252536}, // 2220K {0.503513976, 0.415254163}, // 2221K {0.503413465, 0.415255732}, // 2222K {0.503312994, 0.415257241}, // 2223K {0.503212562, 0.415258691}, // 2224K {0.503112169, 0.415260081}, // 2225K {0.503011816, 0.415261413}, // 2226K {0.502911503, 0.415262686}, // 2227K {0.502811229, 0.4152639}, // 2228K {0.502710994, 0.415265055}, // 2229K {0.502610799, 0.415266151}, // 2230K {0.502510643, 0.415267189}, // 2231K {0.502410527, 0.415268169}, // 2232K {0.50231045, 0.415269089}, // 2233K {0.502210413, 0.415269952}, // 2234K {0.502110415, 0.415270756}, // 2235K {0.502010457, 0.415271502}, // 2236K {0.501910538, 0.41527219}, // 2237K {0.501810659, 0.41527282}, // 2238K {0.501710819, 0.415273392}, // 2239K {0.501611018, 0.415273906}, // 2240K {0.501511258, 0.415274362}, // 2241K {0.501411536, 0.415274761}, // 2242K {0.501311854, 0.415275101}, // 2243K {0.501212212, 0.415275385}, // 2244K {0.501112609, 0.415275611}, // 2245K {0.501013045, 0.415275779}, // 2246K {0.500913522, 0.41527589}, // 2247K {0.500814037, 0.415275944}, // 2248K {0.500714592, 0.415275941}, // 2249K {0.500615187, 0.415275881}, // 2250K {0.500515821, 0.415275764}, // 2251K {0.500416495, 0.41527559}, // 2252K {0.500317208, 0.415275359}, // 2253K {0.500217961, 0.415275072}, // 2254K {0.500118753, 0.415274728}, // 2255K {0.500019584, 0.415274327}, // 2256K {0.499920456, 0.41527387}, // 2257K {0.499821366, 0.415273356}, // 2258K {0.499722317, 0.415272786}, // 2259K {0.499623307, 0.41527216}, // 2260K {0.499524336, 0.415271478}, // 2261K {0.499425405, 0.41527074}, // 2262K {0.499326513, 0.415269945}, // 2263K {0.499227661, 0.415269095}, // 2264K {0.499128849, 0.415268189}, // 2265K {0.499030076, 0.415267227}, // 2266K {0.498931342, 0.41526621}, // 2267K {0.498832648, 0.415265137}, // 2268K {0.498733994, 0.415264008}, // 2269K {0.498635379, 0.415262824}, // 2270K {0.498536804, 0.415261585}, // 2271K {0.498438268, 0.41526029}, // 2272K {0.498339772, 0.41525894}, // 2273K {0.498241315, 0.415257536}, // 2274K {0.498142898, 0.415256076}, // 2275K {0.49804452, 0.415254561}, // 2276K {0.497946182, 0.415252991}, // 2277K {0.497847884, 0.415251367}, // 2278K {0.497749625, 0.415249688}, // 2279K {0.497651406, 0.415247954}, // 2280K {0.497553226, 0.415246166}, // 2281K {0.497455085, 0.415244323}, // 2282K {0.497356985, 0.415242426}, // 2283K {0.497258924, 0.415240475}, // 2284K {0.497160902, 0.415238469}, // 2285K {0.49706292, 0.415236409}, // 2286K {0.496964977, 0.415234295}, // 2287K {0.496867075, 0.415232128}, // 2288K {0.496769211, 0.415229906}, // 2289K {0.496671387, 0.41522763}, // 2290K {0.496573603, 0.415225301}, // 2291K {0.496475858, 0.415222918}, // 2292K {0.496378153, 0.415220482}, // 2293K {0.496280488, 0.415217992}, // 2294K {0.496182862, 0.415215448}, // 2295K {0.496085275, 0.415212852}, // 2296K {0.495987728, 0.415210202}, // 2297K {0.495890221, 0.415207499}, // 2298K {0.495792753, 0.415204742}, // 2299K {0.495695325, 0.415201933}, // 2300K {0.495597937, 0.415199071}, // 2301K {0.495500588, 0.415196156}, // 2302K {0.495403278, 0.415193188}, // 2303K {0.495306008, 0.415190167}, // 2304K {0.495208778, 0.415187094}, // 2305K {0.495111587, 0.415183968}, // 2306K {0.495014436, 0.41518079}, // 2307K {0.494917324, 0.415177559}, // 2308K {0.494820252, 0.415174276}, // 2309K {0.494723219, 0.415170941}, // 2310K {0.494626226, 0.415167553}, // 2311K {0.494529273, 0.415164114}, // 2312K {0.494432359, 0.415160623}, // 2313K {0.494335485, 0.415157079}, // 2314K {0.49423865, 0.415153484}, // 2315K {0.494141855, 0.415149837}, // 2316K {0.494045099, 0.415146138}, // 2317K {0.493948383, 0.415142388}, // 2318K {0.493851707, 0.415138586}, // 2319K {0.49375507, 0.415134733}, // 2320K {0.493658473, 0.415130828}, // 2321K {0.493561915, 0.415126872}, // 2322K {0.493465397, 0.415122865}, // 2323K {0.493368918, 0.415118806}, // 2324K {0.493272479, 0.415114697}, // 2325K {0.493176079, 0.415110536}, // 2326K {0.493079719, 0.415106325}, // 2327K {0.492983399, 0.415102063}, // 2328K {0.492887118, 0.41509775}, // 2329K {0.492790877, 0.415093386}, // 2330K {0.492694675, 0.415088972}, // 2331K {0.492598513, 0.415084507}, // 2332K {0.49250239, 0.415079991}, // 2333K {0.492406307, 0.415075426}, // 2334K {0.492310264, 0.41507081}, // 2335K {0.49221426, 0.415066144}, // 2336K {0.492118295, 0.415061427}, // 2337K {0.49202237, 0.415056661}, // 2338K {0.491926485, 0.415051844}, // 2339K {0.491830639, 0.415046978}, // 2340K {0.491734833, 0.415042062}, // 2341K {0.491639066, 0.415037096}, // 2342K {0.491543339, 0.41503208}, // 2343K {0.491447652, 0.415027015}, // 2344K {0.491352004, 0.4150219}, // 2345K {0.491256395, 0.415016736}, // 2346K {0.491160826, 0.415011522}, // 2347K {0.491065297, 0.415006259}, // 2348K {0.490969807, 0.415000947}, // 2349K {0.490874356, 0.414995585}, // 2350K {0.490778946, 0.414990175}, // 2351K {0.490683574, 0.414984715}, // 2352K {0.490588242, 0.414979207}, // 2353K {0.49049295, 0.41497365}, // 2354K {0.490397698, 0.414968044}, // 2355K {0.490302484, 0.414962389}, // 2356K {0.490207311, 0.414956685}, // 2357K {0.490112177, 0.414950934}, // 2358K {0.490017082, 0.414945133}, // 2359K {0.489922027, 0.414939284}, // 2360K {0.489827011, 0.414933387}, // 2361K {0.489732035, 0.414927441}, // 2362K {0.489637099, 0.414921448}, // 2363K {0.489542202, 0.414915406}, // 2364K {0.489447344, 0.414909316}, // 2365K {0.489352526, 0.414903178}, // 2366K {0.489257748, 0.414896993}, // 2367K {0.489163009, 0.414890759}, // 2368K {0.489068309, 0.414884478}, // 2369K {0.488973649, 0.414878149}, // 2370K {0.488879029, 0.414871773}, // 2371K {0.488784448, 0.414865349}, // 2372K {0.488689907, 0.414858877}, // 2373K {0.488595405, 0.414852359}, // 2374K {0.488500942, 0.414845793}, // 2375K {0.488406519, 0.414839179}, // 2376K {0.488312136, 0.414832519}, // 2377K {0.488217792, 0.414825811}, // 2378K {0.488123487, 0.414819057}, // 2379K {0.488029222, 0.414812255}, // 2380K {0.487934997, 0.414805407}, // 2381K {0.487840811, 0.414798512}, // 2382K {0.487746664, 0.41479157}, // 2383K {0.487652557, 0.414784582}, // 2384K {0.487558489, 0.414777547}, // 2385K {0.487464461, 0.414770465}, // 2386K {0.487370472, 0.414763338}, // 2387K {0.487276523, 0.414756163}, // 2388K {0.487182613, 0.414748943}, // 2389K {0.487088743, 0.414741676}, // 2390K {0.486994912, 0.414734364}, // 2391K {0.48690112, 0.414727005}, // 2392K {0.486807369, 0.4147196}, // 2393K {0.486713656, 0.414712149}, // 2394K {0.486619983, 0.414704653}, // 2395K {0.486526349, 0.41469711}, // 2396K {0.486432755, 0.414689522}, // 2397K {0.4863392, 0.414681889}, // 2398K {0.486245685, 0.41467421}, // 2399K {0.486152209, 0.414666485}, // 2400K {0.486058773, 0.414658715}, // 2401K {0.485965376, 0.4146509}, // 2402K {0.485872018, 0.414643039}, // 2403K {0.4857787, 0.414635134}, // 2404K {0.485685421, 0.414627183}, // 2405K {0.485592182, 0.414619187}, // 2406K {0.485498982, 0.414611146}, // 2407K {0.485405821, 0.41460306}, // 2408K {0.4853127, 0.41459493}, // 2409K {0.485219618, 0.414586755}, // 2410K {0.485126576, 0.414578535}, // 2411K {0.485033573, 0.41457027}, // 2412K {0.484940609, 0.414561961}, // 2413K {0.484847685, 0.414553607}, // 2414K {0.4847548, 0.414545209}, // 2415K {0.484661955, 0.414536767}, // 2416K {0.484569149, 0.414528281}, // 2417K {0.484476382, 0.41451975}, // 2418K {0.484383655, 0.414511175}, // 2419K {0.484290967, 0.414502556}, // 2420K {0.484198318, 0.414493893}, // 2421K {0.484105709, 0.414485187}, // 2422K {0.484013139, 0.414476436}, // 2423K {0.483920609, 0.414467642}, // 2424K {0.483828118, 0.414458804}, // 2425K {0.483735666, 0.414449922}, // 2426K {0.483643254, 0.414440997}, // 2427K {0.48355088, 0.414432029}, // 2428K {0.483458547, 0.414423017}, // 2429K {0.483366252, 0.414413961}, // 2430K {0.483273997, 0.414404863}, // 2431K {0.483181781, 0.414395721}, // 2432K {0.483089605, 0.414386536}, // 2433K {0.482997468, 0.414377308}, // 2434K {0.48290537, 0.414368037}, // 2435K {0.482813311, 0.414358723}, // 2436K {0.482721292, 0.414349367}, // 2437K {0.482629312, 0.414339967}, // 2438K {0.482537372, 0.414330525}, // 2439K {0.48244547, 0.41432104}, // 2440K {0.482353608, 0.414311513}, // 2441K {0.482261786, 0.414301943}, // 2442K {0.482170002, 0.414292331}, // 2443K {0.482078258, 0.414282676}, // 2444K {0.481986553, 0.414272979}, // 2445K {0.481894887, 0.41426324}, // 2446K {0.481803261, 0.414253459}, // 2447K {0.481711674, 0.414243636}, // 2448K {0.481620126, 0.41423377}, // 2449K {0.481528618, 0.414223863}, // 2450K {0.481437148, 0.414213914}, // 2451K {0.481345718, 0.414203923}, // 2452K {0.481254327, 0.41419389}, // 2453K {0.481162976, 0.414183816}, // 2454K {0.481071663, 0.4141737}, // 2455K {0.48098039, 0.414163542}, // 2456K {0.480889156, 0.414153343}, // 2457K {0.480797961, 0.414143103}, // 2458K {0.480706806, 0.414132821}, // 2459K {0.480615689, 0.414122498}, // 2460K {0.480524612, 0.414112134}, // 2461K {0.480433574, 0.414101729}, // 2462K {0.480342576, 0.414091283}, // 2463K {0.480251616, 0.414080795}, // 2464K {0.480160696, 0.414070267}, // 2465K {0.480069815, 0.414059698}, // 2466K {0.479978973, 0.414049088}, // 2467K {0.47988817, 0.414038438}, // 2468K {0.479797406, 0.414027746}, // 2469K {0.479706682, 0.414017015}, // 2470K {0.479615996, 0.414006242}, // 2471K {0.47952535, 0.41399543}, // 2472K {0.479434743, 0.413984576}, // 2473K {0.479344175, 0.413973683}, // 2474K {0.479253647, 0.413962749}, // 2475K {0.479163157, 0.413951776}, // 2476K {0.479072706, 0.413940762}, // 2477K {0.478982295, 0.413929708}, // 2478K {0.478891923, 0.413918614}, // 2479K {0.47880159, 0.41390748}, // 2480K {0.478711296, 0.413896306}, // 2481K {0.478621041, 0.413885092}, // 2482K {0.478530825, 0.413873839}, // 2483K {0.478440648, 0.413862546}, // 2484K {0.47835051, 0.413851214}, // 2485K {0.478260412, 0.413839842}, // 2486K {0.478170352, 0.413828431}, // 2487K {0.478080332, 0.41381698}, // 2488K {0.47799035, 0.41380549}, // 2489K {0.477900408, 0.41379396}, // 2490K {0.477810505, 0.413782392}, // 2491K {0.477720641, 0.413770784}, // 2492K {0.477630816, 0.413759138}, // 2493K {0.477541029, 0.413747452}, // 2494K {0.477451282, 0.413735727}, // 2495K {0.477361574, 0.413723964}, // 2496K {0.477271905, 0.413712162}, // 2497K {0.477182275, 0.413700321}, // 2498K {0.477092684, 0.413688441}, // 2499K {0.477003132, 0.413676523}, // 2500K {0.476913619, 0.413664566}, // 2501K {0.476824145, 0.413652571}, // 2502K {0.47673471, 0.413640538}, // 2503K {0.476645314, 0.413628466}, // 2504K {0.476555957, 0.413616356}, // 2505K {0.476466639, 0.413604207}, // 2506K {0.47637736, 0.413592021}, // 2507K {0.476288119, 0.413579796}, // 2508K {0.476198918, 0.413567534}, // 2509K {0.476109756, 0.413555233}, // 2510K {0.476020633, 0.413542895}, // 2511K {0.475931548, 0.413530519}, // 2512K {0.475842503, 0.413518105}, // 2513K {0.475753496, 0.413505653}, // 2514K {0.475664529, 0.413493164}, // 2515K {0.4755756, 0.413480638}, // 2516K {0.47548671, 0.413468073}, // 2517K {0.475397859, 0.413455472}, // 2518K {0.475309047, 0.413442833}, // 2519K {0.475220274, 0.413430156}, // 2520K {0.47513154, 0.413417443}, // 2521K {0.475042844, 0.413404692}, // 2522K {0.474954188, 0.413391904}, // 2523K {0.47486557, 0.413379079}, // 2524K {0.474776991, 0.413366217}, // 2525K {0.474688451, 0.413353319}, // 2526K {0.47459995, 0.413340383}, // 2527K {0.474511488, 0.413327411}, // 2528K {0.474423065, 0.413314401}, // 2529K {0.47433468, 0.413301356}, // 2530K {0.474246334, 0.413288273}, // 2531K {0.474158027, 0.413275154}, // 2532K {0.474069759, 0.413261999}, // 2533K {0.47398153, 0.413248807}, // 2534K {0.473893339, 0.413235579}, // 2535K {0.473805187, 0.413222315}, // 2536K {0.473717074, 0.413209014}, // 2537K {0.473629, 0.413195677}, // 2538K {0.473540965, 0.413182304}, // 2539K {0.473452968, 0.413168895}, // 2540K {0.47336501, 0.41315545}, // 2541K {0.473277091, 0.41314197}, // 2542K {0.47318921, 0.413128453}, // 2543K {0.473101369, 0.413114901}, // 2544K {0.473013566, 0.413101312}, // 2545K {0.472925801, 0.413087689}, // 2546K {0.472838076, 0.413074029}, // 2547K {0.472750389, 0.413060334}, // 2548K {0.472662741, 0.413046604}, // 2549K {0.472575131, 0.413032838}, // 2550K {0.472487561, 0.413019037}, // 2551K {0.472400029, 0.4130052}, // 2552K {0.472312535, 0.412991329}, // 2553K {0.47222508, 0.412977422}, // 2554K {0.472137664, 0.41296348}, // 2555K {0.472050287, 0.412949503}, // 2556K {0.471962948, 0.412935491}, // 2557K {0.471875648, 0.412921444}, // 2558K {0.471788386, 0.412907362}, // 2559K {0.471701163, 0.412893246}, // 2560K {0.471613979, 0.412879095}, // 2561K {0.471526833, 0.412864909}, // 2562K {0.471439726, 0.412850688}, // 2563K {0.471352658, 0.412836433}, // 2564K {0.471265628, 0.412822144}, // 2565K {0.471178637, 0.412807819}, // 2566K {0.471091684, 0.412793461}, // 2567K {0.47100477, 0.412779068}, // 2568K {0.470917894, 0.412764642}, // 2569K {0.470831057, 0.41275018}, // 2570K {0.470744259, 0.412735685}, // 2571K {0.470657499, 0.412721156}, // 2572K {0.470570777, 0.412706593}, // 2573K {0.470484094, 0.412691995}, // 2574K {0.47039745, 0.412677364}, // 2575K {0.470310844, 0.412662699}, // 2576K {0.470224277, 0.412648}, // 2577K {0.470137748, 0.412633268}, // 2578K {0.470051257, 0.412618502}, // 2579K {0.469964805, 0.412603702}, // 2580K {0.469878392, 0.412588869}, // 2581K {0.469792017, 0.412574002}, // 2582K {0.46970568, 0.412559102}, // 2583K {0.469619382, 0.412544169}, // 2584K {0.469533122, 0.412529202}, // 2585K {0.469446901, 0.412514202}, // 2586K {0.469360718, 0.412499169}, // 2587K {0.469274574, 0.412484103}, // 2588K {0.469188468, 0.412469004}, // 2589K {0.4691024, 0.412453872}, // 2590K {0.469016371, 0.412438706}, // 2591K {0.46893038, 0.412423508}, // 2592K {0.468844428, 0.412408278}, // 2593K {0.468758514, 0.412393014}, // 2594K {0.468672638, 0.412377718}, // 2595K {0.468586801, 0.412362389}, // 2596K {0.468501002, 0.412347027}, // 2597K {0.468415241, 0.412331633}, // 2598K {0.468329519, 0.412316207}, // 2599K {0.468243835, 0.412300748}, // 2600K {0.468158189, 0.412285257}, // 2601K {0.468072582, 0.412269733}, // 2602K {0.467987013, 0.412254177}, // 2603K {0.467901482, 0.412238589}, // 2604K {0.46781599, 0.412222969}, // 2605K {0.467730535, 0.412207317}, // 2606K {0.467645119, 0.412191633}, // 2607K {0.467559742, 0.412175917}, // 2608K {0.467474402, 0.412160169}, // 2609K {0.467389101, 0.41214439}, // 2610K {0.467303838, 0.412128578}, // 2611K {0.467218613, 0.412112735}, // 2612K {0.467133427, 0.41209686}, // 2613K {0.467048279, 0.412080954}, // 2614K {0.466963169, 0.412065016}, // 2615K {0.466878097, 0.412049046}, // 2616K {0.466793063, 0.412033045}, // 2617K {0.466708067, 0.412017013}, // 2618K {0.46662311, 0.41200095}, // 2619K {0.466538191, 0.411984855}, // 2620K {0.46645331, 0.411968729}, // 2621K {0.466368467, 0.411952572}, // 2622K {0.466283662, 0.411936384}, // 2623K {0.466198895, 0.411920165}, // 2624K {0.466114167, 0.411903914}, // 2625K {0.466029476, 0.411887633}, // 2626K {0.465944824, 0.411871322}, // 2627K {0.46586021, 0.411854979}, // 2628K {0.465775634, 0.411838605}, // 2629K {0.465691096, 0.411822201}, // 2630K {0.465606596, 0.411805767}, // 2631K {0.465522134, 0.411789301}, // 2632K {0.46543771, 0.411772806}, // 2633K {0.465353324, 0.411756279}, // 2634K {0.465268976, 0.411739723}, // 2635K {0.465184666, 0.411723136}, // 2636K {0.465100395, 0.411706518}, // 2637K {0.465016161, 0.411689871}, // 2638K {0.464931965, 0.411673193}, // 2639K {0.464847807, 0.411656485}, // 2640K {0.464763687, 0.411639748}, // 2641K {0.464679606, 0.41162298}, // 2642K {0.464595562, 0.411606182}, // 2643K {0.464511556, 0.411589354}, // 2644K {0.464427588, 0.411572497}, // 2645K {0.464343658, 0.411555609}, // 2646K {0.464259766, 0.411538692}, // 2647K {0.464175911, 0.411521746}, // 2648K {0.464092095, 0.411504769}, // 2649K {0.464008317, 0.411487763}, // 2650K {0.463924576, 0.411470728}, // 2651K {0.463840874, 0.411453663}, // 2652K {0.463757209, 0.411436569}, // 2653K {0.463673582, 0.411419445}, // 2654K {0.463589993, 0.411402292}, // 2655K {0.463506442, 0.41138511}, // 2656K {0.463422929, 0.411367899}, // 2657K {0.463339453, 0.411350658}, // 2658K {0.463256015, 0.411333389}, // 2659K {0.463172616, 0.41131609}, // 2660K {0.463089253, 0.411298763}, // 2661K {0.463005929, 0.411281406}, // 2662K {0.462922643, 0.411264021}, // 2663K {0.462839394, 0.411246607}, // 2664K {0.462756183, 0.411229164}, // 2665K {0.46267301, 0.411211693}, // 2666K {0.462589874, 0.411194193}, // 2667K {0.462506777, 0.411176664}, // 2668K {0.462423717, 0.411159107}, // 2669K {0.462340694, 0.411141521}, // 2670K {0.46225771, 0.411123907}, // 2671K {0.462174763, 0.411106264}, // 2672K {0.462091854, 0.411088594}, // 2673K {0.462008982, 0.411070895}, // 2674K {0.461926149, 0.411053167}, // 2675K {0.461843352, 0.411035412}, // 2676K {0.461760594, 0.411017628}, // 2677K {0.461677873, 0.410999817}, // 2678K {0.46159519, 0.410981977}, // 2679K {0.461512544, 0.41096411}, // 2680K {0.461429936, 0.410946214}, // 2681K {0.461347366, 0.410928291}, // 2682K {0.461264833, 0.41091034}, // 2683K {0.461182338, 0.410892361}, // 2684K {0.46109988, 0.410874355}, // 2685K {0.46101746, 0.410856321}, // 2686K {0.460935078, 0.410838259}, // 2687K {0.460852733, 0.41082017}, // 2688K {0.460770425, 0.410802054}, // 2689K {0.460688155, 0.41078391}, // 2690K {0.460605923, 0.410765738}, // 2691K {0.460523728, 0.41074754}, // 2692K {0.460441571, 0.410729314}, // 2693K {0.460359451, 0.410711061}, // 2694K {0.460277369, 0.41069278}, // 2695K {0.460195324, 0.410674473}, // 2696K {0.460113316, 0.410656139}, // 2697K {0.460031346, 0.410637777}, // 2698K {0.459949414, 0.410619389}, // 2699K {0.459867518, 0.410600974}, // 2700K {0.459785661, 0.410582531}, // 2701K {0.45970384, 0.410564063}, // 2702K {0.459622058, 0.410545567}, // 2703K {0.459540312, 0.410527045}, // 2704K {0.459458604, 0.410508496}, // 2705K {0.459376933, 0.41048992}, // 2706K {0.4592953, 0.410471318}, // 2707K {0.459213704, 0.41045269}, // 2708K {0.459132145, 0.410434035}, // 2709K {0.459050624, 0.410415354}, // 2710K {0.45896914, 0.410396646}, // 2711K {0.458887693, 0.410377912}, // 2712K {0.458806283, 0.410359152}, // 2713K {0.458724911, 0.410340366}, // 2714K {0.458643576, 0.410321553}, // 2715K {0.458562279, 0.410302715}, // 2716K {0.458481018, 0.41028385}, // 2717K {0.458399795, 0.41026496}, // 2718K {0.458318609, 0.410246043}, // 2719K {0.458237461, 0.410227101}, // 2720K {0.458156349, 0.410208133}, // 2721K {0.458075275, 0.410189139}, // 2722K {0.457994238, 0.41017012}, // 2723K {0.457913238, 0.410151074}, // 2724K {0.457832276, 0.410132004}, // 2725K {0.45775135, 0.410112907}, // 2726K {0.457670462, 0.410093785}, // 2727K {0.457589611, 0.410074638}, // 2728K {0.457508797, 0.410055465}, // 2729K {0.45742802, 0.410036267}, // 2730K {0.45734728, 0.410017044}, // 2731K {0.457266578, 0.409997795}, // 2732K {0.457185912, 0.409978521}, // 2733K {0.457105284, 0.409959222}, // 2734K {0.457024692, 0.409939898}, // 2735K {0.456944138, 0.409920548}, // 2736K {0.456863621, 0.409901174}, // 2737K {0.45678314, 0.409881775}, // 2738K {0.456702697, 0.409862351}, // 2739K {0.456622291, 0.409842902}, // 2740K {0.456541922, 0.409823428}, // 2741K {0.45646159, 0.409803929}, // 2742K {0.456381294, 0.409784406}, // 2743K {0.456301036, 0.409764858}, // 2744K {0.456220815, 0.409745285}, // 2745K {0.456140631, 0.409725688}, // 2746K {0.456060484, 0.409706066}, // 2747K {0.455980373, 0.40968642}, // 2748K {0.4559003, 0.409666749}, // 2749K {0.455820263, 0.409647054}, // 2750K {0.455740264, 0.409627335}, // 2751K {0.455660301, 0.409607591}, // 2752K {0.455580375, 0.409587823}, // 2753K {0.455500486, 0.409568031}, // 2754K {0.455420634, 0.409548215}, // 2755K {0.455340819, 0.409528375}, // 2756K {0.45526104, 0.40950851}, // 2757K {0.455181299, 0.409488622}, // 2758K {0.455101594, 0.40946871}, // 2759K {0.455021926, 0.409448774}, // 2760K {0.454942295, 0.409428814}, // 2761K {0.454862701, 0.40940883}, // 2762K {0.454783143, 0.409388822}, // 2763K {0.454703622, 0.409368791}, // 2764K {0.454624138, 0.409348736}, // 2765K {0.454544691, 0.409328658}, // 2766K {0.454465281, 0.409308556}, // 2767K {0.454385907, 0.40928843}, // 2768K {0.45430657, 0.409268281}, // 2769K {0.454227269, 0.409248109}, // 2770K {0.454148005, 0.409227913}, // 2771K {0.454068778, 0.409207694}, // 2772K {0.453989588, 0.409187451}, // 2773K {0.453910434, 0.409167186}, // 2774K {0.453831317, 0.409146897}, // 2775K {0.453752237, 0.409126585}, // 2776K {0.453673193, 0.40910625}, // 2777K {0.453594186, 0.409085892}, // 2778K {0.453515215, 0.409065511}, // 2779K {0.453436281, 0.409045107}, // 2780K {0.453357384, 0.40902468}, // 2781K {0.453278523, 0.40900423}, // 2782K {0.453199699, 0.408983757}, // 2783K {0.453120911, 0.408963262}, // 2784K {0.45304216, 0.408942744}, // 2785K {0.452963445, 0.408922203}, // 2786K {0.452884767, 0.40890164}, // 2787K {0.452806125, 0.408881054}, // 2788K {0.45272752, 0.408860446}, // 2789K {0.452648951, 0.408839815}, // 2790K {0.452570419, 0.408819161}, // 2791K {0.452491924, 0.408798486}, // 2792K {0.452413464, 0.408777788}, // 2793K {0.452335041, 0.408757067}, // 2794K {0.452256655, 0.408736325}, // 2795K {0.452178305, 0.40871556}, // 2796K {0.452099991, 0.408694773}, // 2797K {0.452021714, 0.408673964}, // 2798K {0.451943473, 0.408653133}, // 2799K {0.451865269, 0.408632279}, // 2800K {0.451787101, 0.408611404}, // 2801K {0.451708969, 0.408590507}, // 2802K {0.451630873, 0.408569588}, // 2803K {0.451552814, 0.408548647}, // 2804K {0.451474791, 0.408527685}, // 2805K {0.451396805, 0.4085067}, // 2806K {0.451318855, 0.408485694}, // 2807K {0.451240941, 0.408464667}, // 2808K {0.451163063, 0.408443617}, // 2809K {0.451085222, 0.408422546}, // 2810K {0.451007416, 0.408401454}, // 2811K {0.450929647, 0.40838034}, // 2812K {0.450851915, 0.408359205}, // 2813K {0.450774218, 0.408338048}, // 2814K {0.450696558, 0.40831687}, // 2815K {0.450618934, 0.408295671}, // 2816K {0.450541346, 0.40827445}, // 2817K {0.450463794, 0.408253208}, // 2818K {0.450386278, 0.408231945}, // 2819K {0.450308799, 0.408210661}, // 2820K {0.450231355, 0.408189356}, // 2821K {0.450153948, 0.40816803}, // 2822K {0.450076577, 0.408146683}, // 2823K {0.449999242, 0.408125314}, // 2824K {0.449921943, 0.408103925}, // 2825K {0.44984468, 0.408082516}, // 2826K {0.449767453, 0.408061085}, // 2827K {0.449690262, 0.408039633}, // 2828K {0.449613107, 0.408018161}, // 2829K {0.449535988, 0.407996668}, // 2830K {0.449458906, 0.407975155}, // 2831K {0.449381859, 0.407953621}, // 2832K {0.449304848, 0.407932066}, // 2833K {0.449227873, 0.407910491}, // 2834K {0.449150935, 0.407888895}, // 2835K {0.449074032, 0.407867279}, // 2836K {0.448997165, 0.407845643}, // 2837K {0.448920334, 0.407823986}, // 2838K {0.448843539, 0.407802309}, // 2839K {0.448766779, 0.407780612}, // 2840K {0.448690056, 0.407758894}, // 2841K {0.448613369, 0.407737157}, // 2842K {0.448536717, 0.407715399}, // 2843K {0.448460101, 0.407693621}, // 2844K {0.448383522, 0.407671823}, // 2845K {0.448306978, 0.407650005}, // 2846K {0.448230469, 0.407628168}, // 2847K {0.448153997, 0.40760631}, // 2848K {0.44807756, 0.407584432}, // 2849K {0.44800116, 0.407562535}, // 2850K {0.447924795, 0.407540618}, // 2851K {0.447848465, 0.407518681}, // 2852K {0.447772172, 0.407496725}, // 2853K {0.447695914, 0.407474749}, // 2854K {0.447619692, 0.407452753}, // 2855K {0.447543506, 0.407430737}, // 2856K {0.447467355, 0.407408703}, // 2857K {0.44739124, 0.407386648}, // 2858K {0.447315161, 0.407364575}, // 2859K {0.447239117, 0.407342481}, // 2860K {0.447163109, 0.407320369}, // 2861K {0.447087137, 0.407298237}, // 2862K {0.4470112, 0.407276086}, // 2863K {0.446935299, 0.407253916}, // 2864K {0.446859434, 0.407231726}, // 2865K {0.446783604, 0.407209518}, // 2866K {0.44670781, 0.40718729}, // 2867K {0.446632051, 0.407165043}, // 2868K {0.446556328, 0.407142777}, // 2869K {0.44648064, 0.407120493}, // 2870K {0.446404988, 0.407098189}, // 2871K {0.446329372, 0.407075867}, // 2872K {0.446253791, 0.407053525}, // 2873K {0.446178245, 0.407031165}, // 2874K {0.446102735, 0.407008786}, // 2875K {0.446027261, 0.406986388}, // 2876K {0.445951822, 0.406963972}, // 2877K {0.445876418, 0.406941537}, // 2878K {0.44580105, 0.406919083}, // 2879K {0.445725717, 0.406896611}, // 2880K {0.445650419, 0.40687412}, // 2881K {0.445575157, 0.406851611}, // 2882K {0.445499931, 0.406829084}, // 2883K {0.44542474, 0.406806538}, // 2884K {0.445349584, 0.406783973}, // 2885K {0.445274463, 0.406761391}, // 2886K {0.445199378, 0.40673879}, // 2887K {0.445124328, 0.40671617}, // 2888K {0.445049314, 0.406693533}, // 2889K {0.444974334, 0.406670878}, // 2890K {0.44489939, 0.406648204}, // 2891K {0.444824482, 0.406625512}, // 2892K {0.444749608, 0.406602803}, // 2893K {0.44467477, 0.406580075}, // 2894K {0.444599967, 0.406557329}, // 2895K {0.444525199, 0.406534566}, // 2896K {0.444450467, 0.406511784}, // 2897K {0.44437577, 0.406488985}, // 2898K {0.444301108, 0.406466168}, // 2899K {0.444226481, 0.406443333}, // 2900K {0.444151889, 0.40642048}, // 2901K {0.444077332, 0.40639761}, // 2902K {0.444002811, 0.406374722}, // 2903K {0.443928324, 0.406351817}, // 2904K {0.443853873, 0.406328894}, // 2905K {0.443779457, 0.406305953}, // 2906K {0.443705076, 0.406282995}, // 2907K {0.44363073, 0.40626002}, // 2908K {0.443556419, 0.406237027}, // 2909K {0.443482143, 0.406214017}, // 2910K {0.443407903, 0.40619099}, // 2911K {0.443333697, 0.406167945}, // 2912K {0.443259526, 0.406144883}, // 2913K {0.44318539, 0.406121804}, // 2914K {0.443111289, 0.406098707}, // 2915K {0.443037224, 0.406075594}, // 2916K {0.442963193, 0.406052463}, // 2917K {0.442889197, 0.406029316}, // 2918K {0.442815236, 0.406006151}, // 2919K {0.44274131, 0.40598297}, // 2920K {0.442667419, 0.405959771}, // 2921K {0.442593563, 0.405936556}, // 2922K {0.442519741, 0.405913324}, // 2923K {0.442445955, 0.405890075}, // 2924K {0.442372203, 0.405866809}, // 2925K {0.442298487, 0.405843526}, // 2926K {0.442224805, 0.405820227}, // 2927K {0.442151158, 0.405796911}, // 2928K {0.442077545, 0.405773579}, // 2929K {0.442003968, 0.40575023}, // 2930K {0.441930425, 0.405726864}, // 2931K {0.441856917, 0.405703482}, // 2932K {0.441783444, 0.405680083}, // 2933K {0.441710006, 0.405656668}, // 2934K {0.441636602, 0.405633237}, // 2935K {0.441563233, 0.405609789}, // 2936K {0.441489899, 0.405586325}, // 2937K {0.4414166, 0.405562845}, // 2938K {0.441343335, 0.405539348}, // 2939K {0.441270105, 0.405515836}, // 2940K {0.441196909, 0.405492307}, // 2941K {0.441123748, 0.405468762}, // 2942K {0.441050622, 0.405445201}, // 2943K {0.44097753, 0.405421623}, // 2944K {0.440904473, 0.40539803}, // 2945K {0.440831451, 0.405374421}, // 2946K {0.440758463, 0.405350796}, // 2947K {0.44068551, 0.405327155}, // 2948K {0.440612591, 0.405303498}, // 2949K {0.440539707, 0.405279825}, // 2950K {0.440466857, 0.405256137}, // 2951K {0.440394042, 0.405232433}, // 2952K {0.440321262, 0.405208713}, // 2953K {0.440248516, 0.405184977}, // 2954K {0.440175804, 0.405161226}, // 2955K {0.440103127, 0.405137459}, // 2956K {0.440030484, 0.405113677}, // 2957K {0.439957876, 0.405089879}, // 2958K {0.439885302, 0.405066065}, // 2959K {0.439812763, 0.405042236}, // 2960K {0.439740258, 0.405018392}, // 2961K {0.439667787, 0.404994533}, // 2962K {0.439595351, 0.404970657}, // 2963K {0.439522949, 0.404946767}, // 2964K {0.439450581, 0.404922862}, // 2965K {0.439378248, 0.404898941}, // 2966K {0.439305949, 0.404875005}, // 2967K {0.439233685, 0.404851053}, // 2968K {0.439161454, 0.404827087}, // 2969K {0.439089258, 0.404803106}, // 2970K {0.439017097, 0.404779109}, // 2971K {0.438944969, 0.404755098}, // 2972K {0.438872876, 0.404731071}, // 2973K {0.438800817, 0.40470703}, // 2974K {0.438728792, 0.404682973}, // 2975K {0.438656802, 0.404658902}, // 2976K {0.438584845, 0.404634816}, // 2977K {0.438512923, 0.404610715}, // 2978K {0.438441035, 0.4045866}, // 2979K {0.438369181, 0.404562469}, // 2980K {0.438297362, 0.404538324}, // 2981K {0.438225576, 0.404514164}, // 2982K {0.438153824, 0.40448999}, // 2983K {0.438082107, 0.404465801}, // 2984K {0.438010424, 0.404441598}, // 2985K {0.437938775, 0.40441738}, // 2986K {0.437867159, 0.404393147}, // 2987K {0.437795578, 0.4043689}, // 2988K {0.437724031, 0.404344639}, // 2989K {0.437652518, 0.404320363}, // 2990K {0.437581039, 0.404296073}, // 2991K {0.437509594, 0.404271769}, // 2992K {0.437438183, 0.40424745}, // 2993K {0.437366806, 0.404223117}, // 2994K {0.437295463, 0.40419877}, // 2995K {0.437224154, 0.404174409}, // 2996K {0.437152879, 0.404150033}, // 2997K {0.437081637, 0.404125644}, // 2998K {0.43701043, 0.40410124}, // 2999K {0.436939256, 0.404076823}, // 3000K {0.436868117, 0.404052391}, // 3001K {0.436797011, 0.404027945}, // 3002K {0.436725939, 0.404003486}, // 3003K {0.436654901, 0.403979013}, // 3004K {0.436583897, 0.403954525}, // 3005K {0.436512926, 0.403930024}, // 3006K {0.43644199, 0.403905509}, // 3007K {0.436371087, 0.403880981}, // 3008K {0.436300218, 0.403856439}, // 3009K {0.436229382, 0.403831883}, // 3010K {0.436158581, 0.403807313}, // 3011K {0.436087813, 0.40378273}, // 3012K {0.436017079, 0.403758133}, // 3013K {0.435946378, 0.403733522}, // 3014K {0.435875711, 0.403708899}, // 3015K {0.435805078, 0.403684261}, // 3016K {0.435734479, 0.40365961}, // 3017K {0.435663913, 0.403634946}, // 3018K {0.435593381, 0.403610268}, // 3019K {0.435522883, 0.403585577}, // 3020K {0.435452418, 0.403560873}, // 3021K {0.435381987, 0.403536156}, // 3022K {0.435311589, 0.403511425}, // 3023K {0.435241225, 0.403486681}, // 3024K {0.435170894, 0.403461924}, // 3025K {0.435100597, 0.403437153}, // 3026K {0.435030334, 0.40341237}, // 3027K {0.434960104, 0.403387573}, // 3028K {0.434889907, 0.403362764}, // 3029K {0.434819744, 0.403337941}, // 3030K {0.434749615, 0.403313105}, // 3031K {0.434679519, 0.403288257}, // 3032K {0.434609456, 0.403263395}, // 3033K {0.434539427, 0.403238521}, // 3034K {0.434469432, 0.403213634}, // 3035K {0.434399469, 0.403188734}, // 3036K {0.43432954, 0.403163821}, // 3037K {0.434259645, 0.403138896}, // 3038K {0.434189783, 0.403113957}, // 3039K {0.434119954, 0.403089006}, // 3040K {0.434050159, 0.403064043}, // 3041K {0.433980397, 0.403039067}, // 3042K {0.433910668, 0.403014078}, // 3043K {0.433840972, 0.402989077}, // 3044K {0.43377131, 0.402964063}, // 3045K {0.433701681, 0.402939036}, // 3046K {0.433632086, 0.402913998}, // 3047K {0.433562523, 0.402888946}, // 3048K {0.433492994, 0.402863883}, // 3049K {0.433423498, 0.402838807}, // 3050K {0.433354035, 0.402813719}, // 3051K {0.433284606, 0.402788618}, // 3052K {0.43321521, 0.402763505}, // 3053K {0.433145846, 0.40273838}, // 3054K {0.433076516, 0.402713243}, // 3055K {0.43300722, 0.402688093}, // 3056K {0.432937956, 0.402662932}, // 3057K {0.432868725, 0.402637758}, // 3058K {0.432799528, 0.402612572}, // 3059K {0.432730363, 0.402587375}, // 3060K {0.432661232, 0.402562165}, // 3061K {0.432592134, 0.402536943}, // 3062K {0.432523069, 0.402511709}, // 3063K {0.432454036, 0.402486464}, // 3064K {0.432385037, 0.402461206}, // 3065K {0.432316071, 0.402435937}, // 3066K {0.432247138, 0.402410656}, // 3067K {0.432178238, 0.402385363}, // 3068K {0.43210937, 0.402360058}, // 3069K {0.432040536, 0.402334742}, // 3070K {0.431971735, 0.402309414}, // 3071K {0.431902966, 0.402284074}, // 3072K {0.431834231, 0.402258722}, // 3073K {0.431765528, 0.402233359}, // 3074K {0.431696859, 0.402207985}, // 3075K {0.431628222, 0.402182599}, // 3076K {0.431559618, 0.402157201}, // 3077K {0.431491047, 0.402131792}, // 3078K {0.431422508, 0.402106371}, // 3079K {0.431354003, 0.402080939}, // 3080K {0.43128553, 0.402055496}, // 3081K {0.43121709, 0.402030041}, // 3082K {0.431148683, 0.402004575}, // 3083K {0.431080309, 0.401979098}, // 3084K {0.431011967, 0.401953609}, // 3085K {0.430943658, 0.40192811}, // 3086K {0.430875382, 0.401902599}, // 3087K {0.430807139, 0.401877077}, // 3088K {0.430738928, 0.401851543}, // 3089K {0.43067075, 0.401825999}, // 3090K {0.430602605, 0.401800443}, // 3091K {0.430534492, 0.401774877}, // 3092K {0.430466412, 0.401749299}, // 3093K {0.430398364, 0.401723711}, // 3094K {0.430330349, 0.401698111}, // 3095K {0.430262367, 0.401672501}, // 3096K {0.430194417, 0.40164688}, // 3097K {0.4301265, 0.401621247}, // 3098K {0.430058616, 0.401595604}, // 3099K {0.429990764, 0.401569951}, // 3100K {0.429922944, 0.401544286}, // 3101K {0.429855157, 0.401518611}, // 3102K {0.429787403, 0.401492925}, // 3103K {0.429719681, 0.401467228}, // 3104K {0.429651992, 0.40144152}, // 3105K {0.429584335, 0.401415802}, // 3106K {0.42951671, 0.401390074}, // 3107K {0.429449118, 0.401364335}, // 3108K {0.429381558, 0.401338585}, // 3109K {0.429314031, 0.401312825}, // 3110K {0.429246536, 0.401287054}, // 3111K {0.429179073, 0.401261273}, // 3112K {0.429111643, 0.401235481}, // 3113K {0.429044245, 0.401209679}, // 3114K {0.42897688, 0.401183867}, // 3115K {0.428909547, 0.401158044}, // 3116K {0.428842246, 0.401132211}, // 3117K {0.428774977, 0.401106368}, // 3118K {0.428707741, 0.401080514}, // 3119K {0.428640537, 0.401054651}, // 3120K {0.428573365, 0.401028777}, // 3121K {0.428506226, 0.401002893}, // 3122K {0.428439119, 0.400976999}, // 3123K {0.428372044, 0.400951094}, // 3124K {0.428305001, 0.40092518}, // 3125K {0.42823799, 0.400899255}, // 3126K {0.428171012, 0.400873321}, // 3127K {0.428104065, 0.400847377}, // 3128K {0.428037151, 0.400821422}, // 3129K {0.427970269, 0.400795458}, // 3130K {0.427903419, 0.400769484}, // 3131K {0.427836601, 0.4007435}, // 3132K {0.427769816, 0.400717506}, // 3133K {0.427703062, 0.400691502}, // 3134K {0.42763634, 0.400665489}, // 3135K {0.427569651, 0.400639465}, // 3136K {0.427502993, 0.400613432}, // 3137K {0.427436368, 0.40058739}, // 3138K {0.427369775, 0.400561337}, // 3139K {0.427303213, 0.400535275}, // 3140K {0.427236684, 0.400509204}, // 3141K {0.427170186, 0.400483122}, // 3142K {0.42710372, 0.400457032}, // 3143K {0.427037287, 0.400430931}, // 3144K {0.426970885, 0.400404822}, // 3145K {0.426904515, 0.400378702}, // 3146K {0.426838177, 0.400352574}, // 3147K {0.426771871, 0.400326435}, // 3148K {0.426705597, 0.400300288}, // 3149K {0.426639355, 0.400274131}, // 3150K {0.426573145, 0.400247965}, // 3151K {0.426506966, 0.400221789}, // 3152K {0.426440819, 0.400195604}, // 3153K {0.426374704, 0.40016941}, // 3154K {0.426308621, 0.400143207}, // 3155K {0.42624257, 0.400116994}, // 3156K {0.42617655, 0.400090773}, // 3157K {0.426110562, 0.400064542}, // 3158K {0.426044606, 0.400038302}, // 3159K {0.425978681, 0.400012053}, // 3160K {0.425912788, 0.399985795}, // 3161K {0.425846927, 0.399959528}, // 3162K {0.425781098, 0.399933252}, // 3163K {0.4257153, 0.399906966}, // 3164K {0.425649534, 0.399880672}, // 3165K {0.4255838, 0.399854369}, // 3166K {0.425518097, 0.399828057}, // 3167K {0.425452426, 0.399801737}, // 3168K {0.425386786, 0.399775407}, // 3169K {0.425321178, 0.399749069}, // 3170K {0.425255601, 0.399722721}, // 3171K {0.425190056, 0.399696365}, // 3172K {0.425124543, 0.399670001}, // 3173K {0.425059061, 0.399643627}, // 3174K {0.424993611, 0.399617245}, // 3175K {0.424928192, 0.399590854}, // 3176K {0.424862804, 0.399564455}, // 3177K {0.424797449, 0.399538047}, // 3178K {0.424732124, 0.39951163}, // 3179K {0.424666831, 0.399485205}, // 3180K {0.424601569, 0.399458772}, // 3181K {0.424536339, 0.399432329}, // 3182K {0.42447114, 0.399405879}, // 3183K {0.424405973, 0.39937942}, // 3184K {0.424340837, 0.399352952}, // 3185K {0.424275732, 0.399326476}, // 3186K {0.424210659, 0.399299992}, // 3187K {0.424145617, 0.399273499}, // 3188K {0.424080606, 0.399246999}, // 3189K {0.424015627, 0.399220489}, // 3190K {0.423950679, 0.399193972}, // 3191K {0.423885762, 0.399167446}, // 3192K {0.423820876, 0.399140912}, // 3193K {0.423756022, 0.39911437}, // 3194K {0.423691199, 0.39908782}, // 3195K {0.423626407, 0.399061262}, // 3196K {0.423561646, 0.399034695}, // 3197K {0.423496917, 0.399008121}, // 3198K {0.423432219, 0.398981538}, // 3199K {0.423367552, 0.398954947}, // 3200K {0.423302916, 0.398928349}, // 3201K {0.423238311, 0.398901742}, // 3202K {0.423173737, 0.398875127}, // 3203K {0.423109194, 0.398848505}, // 3204K {0.423044683, 0.398821875}, // 3205K {0.422980202, 0.398795236}, // 3206K {0.422915753, 0.39876859}, // 3207K {0.422851335, 0.398741936}, // 3208K {0.422786947, 0.398715274}, // 3209K {0.422722591, 0.398688605}, // 3210K {0.422658266, 0.398661928}, // 3211K {0.422593972, 0.398635243}, // 3212K {0.422529708, 0.39860855}, // 3213K {0.422465476, 0.39858185}, // 3214K {0.422401275, 0.398555142}, // 3215K {0.422337104, 0.398528426}, // 3216K {0.422272965, 0.398501703}, // 3217K {0.422208856, 0.398474972}, // 3218K {0.422144778, 0.398448234}, // 3219K {0.422080732, 0.398421488}, // 3220K {0.422016716, 0.398394734}, // 3221K {0.421952731, 0.398367973}, // 3222K {0.421888776, 0.398341205}, // 3223K {0.421824853, 0.398314429}, // 3224K {0.42176096, 0.398287646}, // 3225K {0.421697098, 0.398260856}, // 3226K {0.421633267, 0.398234058}, // 3227K {0.421569467, 0.398207253}, // 3228K {0.421505698, 0.39818044}, // 3229K {0.421441959, 0.398153621}, // 3230K {0.421378251, 0.398126794}, // 3231K {0.421314574, 0.39809996}, // 3232K {0.421250927, 0.398073118}, // 3233K {0.421187311, 0.39804627}, // 3234K {0.421123726, 0.398019414}, // 3235K {0.421060171, 0.397992551}, // 3236K {0.420996648, 0.397965681}, // 3237K {0.420933154, 0.397938804}, // 3238K {0.420869692, 0.39791192}, // 3239K {0.42080626, 0.397885029}, // 3240K {0.420742858, 0.39785813}, // 3241K {0.420679487, 0.397831225}, // 3242K {0.420616147, 0.397804313}, // 3243K {0.420552837, 0.397777394}, // 3244K {0.420489558, 0.397750468}, // 3245K {0.420426309, 0.397723535}, // 3246K {0.420363091, 0.397696596}, // 3247K {0.420299903, 0.397669649}, // 3248K {0.420236746, 0.397642696}, // 3249K {0.420173619, 0.397615736}, // 3250K {0.420110523, 0.397588769}, // 3251K {0.420047457, 0.397561795}, // 3252K {0.419984421, 0.397534815}, // 3253K {0.419921416, 0.397507828}, // 3254K {0.419858442, 0.397480834}, // 3255K {0.419795497, 0.397453834}, // 3256K {0.419732584, 0.397426827}, // 3257K {0.4196697, 0.397399813}, // 3258K {0.419606847, 0.397372793}, // 3259K {0.419544024, 0.397345766}, // 3260K {0.419481231, 0.397318733}, // 3261K {0.419418469, 0.397291693}, // 3262K {0.419355737, 0.397264647}, // 3263K {0.419293035, 0.397237594}, // 3264K {0.419230364, 0.397210535}, // 3265K {0.419167723, 0.397183469}, // 3266K {0.419105112, 0.397156397}, // 3267K {0.419042531, 0.397129319}, // 3268K {0.41897998, 0.397102234}, // 3269K {0.41891746, 0.397075143}, // 3270K {0.41885497, 0.397048046}, // 3271K {0.41879251, 0.397020942}, // 3272K {0.41873008, 0.396993832}, // 3273K {0.41866768, 0.396966716}, // 3274K {0.41860531, 0.396939594}, // 3275K {0.418542971, 0.396912466}, // 3276K {0.418480661, 0.396885331}, // 3277K {0.418418382, 0.39685819}, // 3278K {0.418356132, 0.396831043}, // 3279K {0.418293913, 0.39680389}, // 3280K {0.418231724, 0.396776731}, // 3281K {0.418169565, 0.396749566}, // 3282K {0.418107435, 0.396722395}, // 3283K {0.418045336, 0.396695218}, // 3284K {0.417983267, 0.396668035}, // 3285K {0.417921228, 0.396640846}, // 3286K {0.417859218, 0.396613651}, // 3287K {0.417797239, 0.39658645}, // 3288K {0.417735289, 0.396559243}, // 3289K {0.41767337, 0.39653203}, // 3290K {0.41761148, 0.396504812}, // 3291K {0.41754962, 0.396477587}, // 3292K {0.41748779, 0.396450357}, // 3293K {0.41742599, 0.396423121}, // 3294K {0.41736422, 0.396395879}, // 3295K {0.417302479, 0.396368632}, // 3296K {0.417240769, 0.396341379}, // 3297K {0.417179088, 0.39631412}, // 3298K {0.417117437, 0.396286855}, // 3299K {0.417055815, 0.396259585}, // 3300K {0.416994224, 0.396232309}, // 3301K {0.416932662, 0.396205028}, // 3302K {0.41687113, 0.396177741}, // 3303K {0.416809628, 0.396150448}, // 3304K {0.416748155, 0.39612315}, // 3305K {0.416686712, 0.396095847}, // 3306K {0.416625299, 0.396068538}, // 3307K {0.416563915, 0.396041223}, // 3308K {0.416502561, 0.396013903}, // 3309K {0.416441237, 0.395986578}, // 3310K {0.416379942, 0.395959247}, // 3311K {0.416318677, 0.39593191}, // 3312K {0.416257441, 0.395904569}, // 3313K {0.416196235, 0.395877222}, // 3314K {0.416135059, 0.39584987}, // 3315K {0.416073912, 0.395822512}, // 3316K {0.416012794, 0.395795149}, // 3317K {0.415951706, 0.395767781}, // 3318K {0.415890648, 0.395740408}, // 3319K {0.415829619, 0.395713029}, // 3320K {0.41576862, 0.395685645}, // 3321K {0.41570765, 0.395658256}, // 3322K {0.415646709, 0.395630862}, // 3323K {0.415585798, 0.395603463}, // 3324K {0.415524917, 0.395576059}, // 3325K {0.415464064, 0.395548649}, // 3326K {0.415403242, 0.395521235}, // 3327K {0.415342448, 0.395493815}, // 3328K {0.415281684, 0.395466391}, // 3329K {0.415220949, 0.395438961}, // 3330K {0.415160244, 0.395411527}, // 3331K {0.415099568, 0.395384087}, // 3332K {0.415038921, 0.395356643}, // 3333K {0.414978304, 0.395329193}, // 3334K {0.414917715, 0.395301739}, // 3335K {0.414857156, 0.39527428}, // 3336K {0.414796627, 0.395246816}, // 3337K {0.414736126, 0.395219347}, // 3338K {0.414675655, 0.395191873}, // 3339K {0.414615213, 0.395164395}, // 3340K {0.4145548, 0.395136912}, // 3341K {0.414494417, 0.395109424}, // 3342K {0.414434062, 0.395081931}, // 3343K {0.414373737, 0.395054434}, // 3344K {0.414313441, 0.395026931}, // 3345K {0.414253173, 0.394999425}, // 3346K {0.414192936, 0.394971913}, // 3347K {0.414132727, 0.394944397}, // 3348K {0.414072547, 0.394916876}, // 3349K {0.414012396, 0.394889351}, // 3350K {0.413952275, 0.394861821}, // 3351K {0.413892182, 0.394834287}, // 3352K {0.413832119, 0.394806748}, // 3353K {0.413772084, 0.394779204}, // 3354K {0.413712078, 0.394751656}, // 3355K {0.413652102, 0.394724104}, // 3356K {0.413592154, 0.394696547}, // 3357K {0.413532236, 0.394668986}, // 3358K {0.413472346, 0.39464142}, // 3359K {0.413412485, 0.39461385}, // 3360K {0.413352653, 0.394586276}, // 3361K {0.413292851, 0.394558697}, // 3362K {0.413233077, 0.394531114}, // 3363K {0.413173331, 0.394503526}, // 3364K {0.413113615, 0.394475934}, // 3365K {0.413053928, 0.394448338}, // 3366K {0.412994269, 0.394420738}, // 3367K {0.412934639, 0.394393134}, // 3368K {0.412875038, 0.394365525}, // 3369K {0.412815466, 0.394337912}, // 3370K {0.412755923, 0.394310295}, // 3371K {0.412696408, 0.394282674}, // 3372K {0.412636922, 0.394255048}, // 3373K {0.412577465, 0.394227419}, // 3374K {0.412518037, 0.394199785}, // 3375K {0.412458637, 0.394172147}, // 3376K {0.412399266, 0.394144506}, // 3377K {0.412339924, 0.39411686}, // 3378K {0.41228061, 0.39408921}, // 3379K {0.412221325, 0.394061556}, // 3380K {0.412162069, 0.394033899}, // 3381K {0.412102841, 0.394006237}, // 3382K {0.412043642, 0.393978571}, // 3383K {0.411984471, 0.393950902}, // 3384K {0.411925329, 0.393923228}, // 3385K {0.411866216, 0.393895551}, // 3386K {0.411807131, 0.39386787}, // 3387K {0.411748075, 0.393840185}, // 3388K {0.411689047, 0.393812496}, // 3389K {0.411630048, 0.393784803}, // 3390K {0.411571077, 0.393757107}, // 3391K {0.411512135, 0.393729406}, // 3392K {0.411453221, 0.393701702}, // 3393K {0.411394336, 0.393673995}, // 3394K {0.411335479, 0.393646283}, // 3395K {0.411276651, 0.393618568}, // 3396K {0.411217851, 0.393590849}, // 3397K {0.411159079, 0.393563127}, // 3398K {0.411100336, 0.393535401}, // 3399K {0.411041621, 0.393507671}, // 3400K {0.410982935, 0.393479938}, // 3401K {0.410924276, 0.393452201}, // 3402K {0.410865647, 0.39342446}, // 3403K {0.410807045, 0.393396716}, // 3404K {0.410748472, 0.393368969}, // 3405K {0.410689927, 0.393341218}, // 3406K {0.410631411, 0.393313463}, // 3407K {0.410572922, 0.393285705}, // 3408K {0.410514462, 0.393257944}, // 3409K {0.410456031, 0.393230179}, // 3410K {0.410397627, 0.393202411}, // 3411K {0.410339252, 0.393174639}, // 3412K {0.410280904, 0.393146864}, // 3413K {0.410222585, 0.393119086}, // 3414K {0.410164295, 0.393091304}, // 3415K {0.410106032, 0.393063519}, // 3416K {0.410047798, 0.39303573}, // 3417K {0.409989591, 0.393007939}, // 3418K {0.409931413, 0.392980144}, // 3419K {0.409873263, 0.392952346}, // 3420K {0.409815141, 0.392924544}, // 3421K {0.409757047, 0.39289674}, // 3422K {0.409698981, 0.392868932}, // 3423K {0.409640943, 0.392841121}, // 3424K {0.409582933, 0.392813307}, // 3425K {0.409524951, 0.392785489}, // 3426K {0.409466997, 0.392757669}, // 3427K {0.409409071, 0.392729845}, // 3428K {0.409351174, 0.392702019}, // 3429K {0.409293304, 0.392674189}, // 3430K {0.409235462, 0.392646356}, // 3431K {0.409177648, 0.39261852}, // 3432K {0.409119862, 0.392590682}, // 3433K {0.409062103, 0.39256284}, // 3434K {0.409004373, 0.392534995}, // 3435K {0.408946671, 0.392507147}, // 3436K {0.408888996, 0.392479297}, // 3437K {0.40883135, 0.392451443}, // 3438K {0.408773731, 0.392423586}, // 3439K {0.40871614, 0.392395727}, // 3440K {0.408658577, 0.392367865}, // 3441K {0.408601041, 0.39234}, // 3442K {0.408543533, 0.392312132}, // 3443K {0.408486054, 0.392284261}, // 3444K {0.408428602, 0.392256387}, // 3445K {0.408371177, 0.392228511}, // 3446K {0.408313781, 0.392200631}, // 3447K {0.408256412, 0.39217275}, // 3448K {0.408199071, 0.392144865}, // 3449K {0.408141757, 0.392116977}, // 3450K {0.408084471, 0.392089087}, // 3451K {0.408027213, 0.392061194}, // 3452K {0.407969983, 0.392033299}, // 3453K {0.40791278, 0.392005401}, // 3454K {0.407855604, 0.3919775}, // 3455K {0.407798457, 0.391949597}, // 3456K {0.407741337, 0.391921691}, // 3457K {0.407684244, 0.391893782}, // 3458K {0.407627179, 0.391865871}, // 3459K {0.407570142, 0.391837957}, // 3460K {0.407513132, 0.391810041}, // 3461K {0.40745615, 0.391782123}, // 3462K {0.407399195, 0.391754201}, // 3463K {0.407342268, 0.391726278}, // 3464K {0.407285368, 0.391698351}, // 3465K {0.407228496, 0.391670423}, // 3466K {0.407171651, 0.391642492}, // 3467K {0.407114833, 0.391614558}, // 3468K {0.407058043, 0.391586622}, // 3469K {0.407001281, 0.391558684}, // 3470K {0.406944546, 0.391530744}, // 3471K {0.406887838, 0.391502801}, // 3472K {0.406831157, 0.391474855}, // 3473K {0.406774504, 0.391446908}, // 3474K {0.406717879, 0.391418958}, // 3475K {0.40666128, 0.391391006}, // 3476K {0.406604709, 0.391363051}, // 3477K {0.406548165, 0.391335094}, // 3478K {0.406491649, 0.391307136}, // 3479K {0.40643516, 0.391279174}, // 3480K {0.406378698, 0.391251211}, // 3481K {0.406322263, 0.391223245}, // 3482K {0.406265856, 0.391195278}, // 3483K {0.406209476, 0.391167308}, // 3484K {0.406153123, 0.391139336}, // 3485K {0.406096797, 0.391111362}, // 3486K {0.406040498, 0.391083386}, // 3487K {0.405984227, 0.391055407}, // 3488K {0.405927983, 0.391027427}, // 3489K {0.405871765, 0.390999444}, // 3490K {0.405815576, 0.39097146}, // 3491K {0.405759413, 0.390943474}, // 3492K {0.405703277, 0.390915485}, // 3493K {0.405647168, 0.390887495}, // 3494K {0.405591087, 0.390859502}, // 3495K {0.405535032, 0.390831508}, // 3496K {0.405479005, 0.390803511}, // 3497K {0.405423004, 0.390775513}, // 3498K {0.405367031, 0.390747513}, // 3499K {0.405311084, 0.390719511}, // 3500K {0.405255165, 0.390691507}, // 3501K {0.405199272, 0.390663501}, // 3502K {0.405143407, 0.390635493}, // 3503K {0.405087568, 0.390607484}, // 3504K {0.405031757, 0.390579472}, // 3505K {0.404975972, 0.390551459}, // 3506K {0.404920214, 0.390523444}, // 3507K {0.404864483, 0.390495428}, // 3508K {0.404808779, 0.390467409}, // 3509K {0.404753102, 0.390439389}, // 3510K {0.404697452, 0.390411367}, // 3511K {0.404641829, 0.390383344}, // 3512K {0.404586232, 0.390355318}, // 3513K {0.404530662, 0.390327291}, // 3514K {0.404475119, 0.390299263}, // 3515K {0.404419603, 0.390271232}, // 3516K {0.404364114, 0.3902432}, // 3517K {0.404308651, 0.390215167}, // 3518K {0.404253215, 0.390187132}, // 3519K {0.404197806, 0.390159095}, // 3520K {0.404142424, 0.390131057}, // 3521K {0.404087068, 0.390103017}, // 3522K {0.404031739, 0.390074976}, // 3523K {0.403976437, 0.390046933}, // 3524K {0.403921161, 0.390018888}, // 3525K {0.403865912, 0.389990842}, // 3526K {0.40381069, 0.389962795}, // 3527K {0.403755494, 0.389934746}, // 3528K {0.403700325, 0.389906696}, // 3529K {0.403645182, 0.389878644}, // 3530K {0.403590067, 0.389850591}, // 3531K {0.403534977, 0.389822537}, // 3532K {0.403479914, 0.389794481}, // 3533K {0.403424878, 0.389766423}, // 3534K {0.403369869, 0.389738365}, // 3535K {0.403314885, 0.389710305}, // 3536K {0.403259929, 0.389682243}, // 3537K {0.403204999, 0.389654181}, // 3538K {0.403150095, 0.389626117}, // 3539K {0.403095218, 0.389598052}, // 3540K {0.403040367, 0.389569985}, // 3541K {0.402985543, 0.389541917}, // 3542K {0.402930745, 0.389513848}, // 3543K {0.402875973, 0.389485778}, // 3544K {0.402821228, 0.389457707}, // 3545K {0.402766509, 0.389429634}, // 3546K {0.402711817, 0.38940156}, // 3547K {0.402657151, 0.389373485}, // 3548K {0.402602511, 0.389345409}, // 3549K {0.402547898, 0.389317332}, // 3550K {0.402493311, 0.389289254}, // 3551K {0.402438751, 0.389261174}, // 3552K {0.402384216, 0.389233094}, // 3553K {0.402329708, 0.389205012}, // 3554K {0.402275226, 0.389176929}, // 3555K {0.402220771, 0.389148846}, // 3556K {0.402166341, 0.389120761}, // 3557K {0.402111938, 0.389092675}, // 3558K {0.402057561, 0.389064588}, // 3559K {0.402003211, 0.3890365}, // 3560K {0.401948886, 0.389008412}, // 3561K {0.401894588, 0.388980322}, // 3562K {0.401840316, 0.388952231}, // 3563K {0.40178607, 0.38892414}, // 3564K {0.40173185, 0.388896047}, // 3565K {0.401677656, 0.388867954}, // 3566K {0.401623489, 0.388839859}, // 3567K {0.401569347, 0.388811764}, // 3568K {0.401515231, 0.388783668}, // 3569K {0.401461142, 0.388755571}, // 3570K {0.401407079, 0.388727473}, // 3571K {0.401353041, 0.388699374}, // 3572K {0.40129903, 0.388671275}, // 3573K {0.401245045, 0.388643175}, // 3574K {0.401191085, 0.388615074}, // 3575K {0.401137152, 0.388586972}, // 3576K {0.401083245, 0.38855887}, // 3577K {0.401029363, 0.388530766}, // 3578K {0.400975508, 0.388502662}, // 3579K {0.400921679, 0.388474558}, // 3580K {0.400867875, 0.388446452}, // 3581K {0.400814097, 0.388418346}, // 3582K {0.400760346, 0.388390239}, // 3583K {0.40070662, 0.388362132}, // 3584K {0.40065292, 0.388334024}, // 3585K {0.400599245, 0.388305915}, // 3586K {0.400545597, 0.388277806}, // 3587K {0.400491975, 0.388249696}, // 3588K {0.400438378, 0.388221586}, // 3589K {0.400384807, 0.388193475}, // 3590K {0.400331262, 0.388165363}, // 3591K {0.400277743, 0.388137251}, // 3592K {0.400224249, 0.388109138}, // 3593K {0.400170781, 0.388081025}, // 3594K {0.400117339, 0.388052911}, // 3595K {0.400063923, 0.388024797}, // 3596K {0.400010532, 0.387996682}, // 3597K {0.399957167, 0.387968567}, // 3598K {0.399903828, 0.387940451}, // 3599K {0.399850514, 0.387912335}, // 3600K {0.399797226, 0.387884219}, // 3601K {0.399743964, 0.387856102}, // 3602K {0.399690727, 0.387827984}, // 3603K {0.399637516, 0.387799867}, // 3604K {0.399584331, 0.387771749}, // 3605K {0.399531171, 0.38774363}, // 3606K {0.399478037, 0.387715511}, // 3607K {0.399424928, 0.387687392}, // 3608K {0.399371845, 0.387659273}, // 3609K {0.399318787, 0.387631153}, // 3610K {0.399265755, 0.387603033}, // 3611K {0.399212748, 0.387574913}, // 3612K {0.399159767, 0.387546792}, // 3613K {0.399106811, 0.387518671}, // 3614K {0.399053881, 0.38749055}, // 3615K {0.399000977, 0.387462429}, // 3616K {0.398948097, 0.387434307}, // 3617K {0.398895243, 0.387406186}, // 3618K {0.398842415, 0.387378064}, // 3619K {0.398789612, 0.387349941}, // 3620K {0.398736834, 0.387321819}, // 3621K {0.398684082, 0.387293697}, // 3622K {0.398631355, 0.387265574}, // 3623K {0.398578654, 0.387237451}, // 3624K {0.398525978, 0.387209329}, // 3625K {0.398473327, 0.387181206}, // 3626K {0.398420701, 0.387153083}, // 3627K {0.398368101, 0.38712496}, // 3628K {0.398315526, 0.387096836}, // 3629K {0.398262976, 0.387068713}, // 3630K {0.398210452, 0.38704059}, // 3631K {0.398157953, 0.387012467}, // 3632K {0.398105479, 0.386984343}, // 3633K {0.39805303, 0.38695622}, // 3634K {0.398000606, 0.386928097}, // 3635K {0.397948208, 0.386899973}, // 3636K {0.397895835, 0.38687185}, // 3637K {0.397843487, 0.386843727}, // 3638K {0.397791164, 0.386815604}, // 3639K {0.397738866, 0.386787481}, // 3640K {0.397686594, 0.386759358}, // 3641K {0.397634346, 0.386731235}, // 3642K {0.397582124, 0.386703112}, // 3643K {0.397529927, 0.38667499}, // 3644K {0.397477755, 0.386646867}, // 3645K {0.397425608, 0.386618745}, // 3646K {0.397373486, 0.386590623}, // 3647K {0.397321389, 0.386562501}, // 3648K {0.397269317, 0.386534379}, // 3649K {0.39721727, 0.386506257}, // 3650K {0.397165248, 0.386478136}, // 3651K {0.397113251, 0.386450015}, // 3652K {0.397061279, 0.386421894}, // 3653K {0.397009332, 0.386393773}, // 3654K {0.396957409, 0.386365652}, // 3655K {0.396905512, 0.386337532}, // 3656K {0.39685364, 0.386309412}, // 3657K {0.396801793, 0.386281293}, // 3658K {0.39674997, 0.386253173}, // 3659K {0.396698173, 0.386225054}, // 3660K {0.3966464, 0.386196936}, // 3661K {0.396594652, 0.386168817}, // 3662K {0.396542929, 0.386140699}, // 3663K {0.396491231, 0.386112582}, // 3664K {0.396439558, 0.386084465}, // 3665K {0.396387909, 0.386056348}, // 3666K {0.396336285, 0.386028231}, // 3667K {0.396284686, 0.386000115}, // 3668K {0.396233112, 0.385972}, // 3669K {0.396181563, 0.385943884}, // 3670K {0.396130038, 0.38591577}, // 3671K {0.396078538, 0.385887655}, // 3672K {0.396027063, 0.385859542}, // 3673K {0.395975612, 0.385831428}, // 3674K {0.395924186, 0.385803316}, // 3675K {0.395872785, 0.385775203}, // 3676K {0.395821409, 0.385747091}, // 3677K {0.395770057, 0.38571898}, // 3678K {0.395718729, 0.385690869}, // 3679K {0.395667427, 0.385662759}, // 3680K {0.395616149, 0.38563465}, // 3681K {0.395564895, 0.385606541}, // 3682K {0.395513667, 0.385578432}, // 3683K {0.395462462, 0.385550324}, // 3684K {0.395411283, 0.385522217}, // 3685K {0.395360127, 0.385494111}, // 3686K {0.395308997, 0.385466005}, // 3687K {0.395257891, 0.385437899}, // 3688K {0.395206809, 0.385409795}, // 3689K {0.395155752, 0.385381691}, // 3690K {0.395104719, 0.385353587}, // 3691K {0.395053711, 0.385325485}, // 3692K {0.395002728, 0.385297383}, // 3693K {0.394951768, 0.385269281}, // 3694K {0.394900834, 0.385241181}, // 3695K {0.394849923, 0.385213081}, // 3696K {0.394799037, 0.385184982}, // 3697K {0.394748176, 0.385156884}, // 3698K {0.394697338, 0.385128786}, // 3699K {0.394646526, 0.38510069}, // 3700K {0.394595737, 0.385072594}, // 3701K {0.394544973, 0.385044499}, // 3702K {0.394494233, 0.385016404}, // 3703K {0.394443518, 0.384988311}, // 3704K {0.394392826, 0.384960218}, // 3705K {0.39434216, 0.384932126}, // 3706K {0.394291517, 0.384904035}, // 3707K {0.394240899, 0.384875945}, // 3708K {0.394190304, 0.384847856}, // 3709K {0.394139735, 0.384819768}, // 3710K {0.394089189, 0.38479168}, // 3711K {0.394038667, 0.384763594}, // 3712K {0.39398817, 0.384735508}, // 3713K {0.393937697, 0.384707424}, // 3714K {0.393887248, 0.38467934}, // 3715K {0.393836824, 0.384651257}, // 3716K {0.393786423, 0.384623175}, // 3717K {0.393736047, 0.384595094}, // 3718K {0.393685694, 0.384567015}, // 3719K {0.393635366, 0.384538936}, // 3720K {0.393585062, 0.384510858}, // 3721K {0.393534782, 0.384482781}, // 3722K {0.393484526, 0.384454705}, // 3723K {0.393434294, 0.384426631}, // 3724K {0.393384087, 0.384398557}, // 3725K {0.393333903, 0.384370484}, // 3726K {0.393283743, 0.384342413}, // 3727K {0.393233607, 0.384314342}, // 3728K {0.393183496, 0.384286273}, // 3729K {0.393133408, 0.384258205}, // 3730K {0.393083344, 0.384230138}, // 3731K {0.393033304, 0.384202072}, // 3732K {0.392983288, 0.384174007}, // 3733K {0.392933296, 0.384145943}, // 3734K {0.392883328, 0.384117881}, // 3735K {0.392833384, 0.384089819}, // 3736K {0.392783464, 0.384061759}, // 3737K {0.392733568, 0.3840337}, // 3738K {0.392683695, 0.384005642}, // 3739K {0.392633847, 0.383977585}, // 3740K {0.392584022, 0.38394953}, // 3741K {0.392534221, 0.383921476}, // 3742K {0.392484444, 0.383893423}, // 3743K {0.392434691, 0.383865371}, // 3744K {0.392384961, 0.383837321}, // 3745K {0.392335256, 0.383809272}, // 3746K {0.392285574, 0.383781224}, // 3747K {0.392235916, 0.383753177}, // 3748K {0.392186281, 0.383725132}, // 3749K {0.39213667, 0.383697088}, // 3750K {0.392087083, 0.383669045}, // 3751K {0.39203752, 0.383641004}, // 3752K {0.391987981, 0.383612964}, // 3753K {0.391938465, 0.383584925}, // 3754K {0.391888973, 0.383556888}, // 3755K {0.391839504, 0.383528852}, // 3756K {0.391790059, 0.383500818}, // 3757K {0.391740638, 0.383472785}, // 3758K {0.39169124, 0.383444753}, // 3759K {0.391641866, 0.383416723}, // 3760K {0.391592516, 0.383388694}, // 3761K {0.391543189, 0.383360666}, // 3762K {0.391493886, 0.38333264}, // 3763K {0.391444606, 0.383304616}, // 3764K {0.39139535, 0.383276593}, // 3765K {0.391346117, 0.383248571}, // 3766K {0.391296908, 0.383220551}, // 3767K {0.391247722, 0.383192532}, // 3768K {0.39119856, 0.383164515}, // 3769K {0.391149422, 0.3831365}, // 3770K {0.391100306, 0.383108486}, // 3771K {0.391051215, 0.383080473}, // 3772K {0.391002146, 0.383052462}, // 3773K {0.390953102, 0.383024452}, // 3774K {0.39090408, 0.382996445}, // 3775K {0.390855082, 0.382968438}, // 3776K {0.390806108, 0.382940433}, // 3777K {0.390757156, 0.38291243}, // 3778K {0.390708228, 0.382884429}, // 3779K {0.390659324, 0.382856429}, // 3780K {0.390610443, 0.38282843}, // 3781K {0.390561585, 0.382800434}, // 3782K {0.39051275, 0.382772439}, // 3783K {0.390463939, 0.382744445}, // 3784K {0.390415151, 0.382716453}, // 3785K {0.390366387, 0.382688463}, // 3786K {0.390317646, 0.382660475}, // 3787K {0.390268927, 0.382632488}, // 3788K {0.390220233, 0.382604503}, // 3789K {0.390171561, 0.38257652}, // 3790K {0.390122913, 0.382548538}, // 3791K {0.390074288, 0.382520558}, // 3792K {0.390025686, 0.38249258}, // 3793K {0.389977107, 0.382464603}, // 3794K {0.389928551, 0.382436629}, // 3795K {0.389880019, 0.382408656}, // 3796K {0.389831509, 0.382380685}, // 3797K {0.389783023, 0.382352715}, // 3798K {0.38973456, 0.382324748}, // 3799K {0.38968612, 0.382296782}, // 3800K {0.389637704, 0.382268818}, // 3801K {0.38958931, 0.382240856}, // 3802K {0.389540939, 0.382212895}, // 3803K {0.389492592, 0.382184937}, // 3804K {0.389444267, 0.38215698}, // 3805K {0.389395966, 0.382129025}, // 3806K {0.389347687, 0.382101072}, // 3807K {0.389299432, 0.382073121}, // 3808K {0.389251199, 0.382045172}, // 3809K {0.38920299, 0.382017225}, // 3810K {0.389154803, 0.381989279}, // 3811K {0.38910664, 0.381961336}, // 3812K {0.389058499, 0.381933394}, // 3813K {0.389010381, 0.381905454}, // 3814K {0.388962287, 0.381877517}, // 3815K {0.388914215, 0.381849581}, // 3816K {0.388866166, 0.381821647}, // 3817K {0.38881814, 0.381793715}, // 3818K {0.388770137, 0.381765785}, // 3819K {0.388722157, 0.381737857}, // 3820K {0.388674199, 0.381709931}, // 3821K {0.388626265, 0.381682007}, // 3822K {0.388578353, 0.381654085}, // 3823K {0.388530464, 0.381626165}, // 3824K {0.388482598, 0.381598248}, // 3825K {0.388434755, 0.381570332}, // 3826K {0.388386934, 0.381542418}, // 3827K {0.388339136, 0.381514506}, // 3828K {0.388291361, 0.381486596}, // 3829K {0.388243609, 0.381458689}, // 3830K {0.38819588, 0.381430783}, // 3831K {0.388148173, 0.38140288}, // 3832K {0.388100489, 0.381374978}, // 3833K {0.388052827, 0.381347079}, // 3834K {0.388005188, 0.381319182}, // 3835K {0.387957572, 0.381291287}, // 3836K {0.387909979, 0.381263394}, // 3837K {0.387862408, 0.381235503}, // 3838K {0.38781486, 0.381207614}, // 3839K {0.387767335, 0.381179728}, // 3840K {0.387719832, 0.381151843}, // 3841K {0.387672352, 0.381123961}, // 3842K {0.387624894, 0.381096081}, // 3843K {0.387577459, 0.381068203}, // 3844K {0.387530046, 0.381040328}, // 3845K {0.387482656, 0.381012454}, // 3846K {0.387435289, 0.380984583}, // 3847K {0.387387944, 0.380956714}, // 3848K {0.387340621, 0.380928847}, // 3849K {0.387293321, 0.380900983}, // 3850K {0.387246044, 0.380873121}, // 3851K {0.387198789, 0.380845261}, // 3852K {0.387151557, 0.380817403}, // 3853K {0.387104346, 0.380789547}, // 3854K {0.387057159, 0.380761694}, // 3855K {0.387009994, 0.380733843}, // 3856K {0.386962851, 0.380705995}, // 3857K {0.386915731, 0.380678149}, // 3858K {0.386868633, 0.380650305}, // 3859K {0.386821557, 0.380622463}, // 3860K {0.386774504, 0.380594624}, // 3861K {0.386727473, 0.380566787}, // 3862K {0.386680465, 0.380538952}, // 3863K {0.386633478, 0.38051112}, // 3864K {0.386586515, 0.38048329}, // 3865K {0.386539573, 0.380455462}, // 3866K {0.386492654, 0.380427637}, // 3867K {0.386445757, 0.380399814}, // 3868K {0.386398882, 0.380371994}, // 3869K {0.38635203, 0.380344176}, // 3870K {0.3863052, 0.38031636}, // 3871K {0.386258392, 0.380288547}, // 3872K {0.386211606, 0.380260737}, // 3873K {0.386164843, 0.380232928}, // 3874K {0.386118101, 0.380205122}, // 3875K {0.386071382, 0.380177319}, // 3876K {0.386024685, 0.380149518}, // 3877K {0.38597801, 0.38012172}, // 3878K {0.385931358, 0.380093924}, // 3879K {0.385884727, 0.38006613}, // 3880K {0.385838119, 0.380038339}, // 3881K {0.385791533, 0.380010551}, // 3882K {0.385744969, 0.379982765}, // 3883K {0.385698427, 0.379954981}, // 3884K {0.385651907, 0.3799272}, // 3885K {0.385605409, 0.379899422}, // 3886K {0.385558933, 0.379871646}, // 3887K {0.38551248, 0.379843873}, // 3888K {0.385466048, 0.379816102}, // 3889K {0.385419638, 0.379788334}, // 3890K {0.38537325, 0.379760568}, // 3891K {0.385326885, 0.379732805}, // 3892K {0.385280541, 0.379705044}, // 3893K {0.385234219, 0.379677287}, // 3894K {0.38518792, 0.379649531}, // 3895K {0.385141642, 0.379621779}, // 3896K {0.385095386, 0.379594029}, // 3897K {0.385049152, 0.379566281}, // 3898K {0.38500294, 0.379538536}, // 3899K {0.38495675, 0.379510794}, // 3900K {0.384910582, 0.379483055}, // 3901K {0.384864436, 0.379455318}, // 3902K {0.384818311, 0.379427584}, // 3903K {0.384772208, 0.379399852}, // 3904K {0.384726128, 0.379372123}, // 3905K {0.384680069, 0.379344397}, // 3906K {0.384634032, 0.379316674}, // 3907K {0.384588016, 0.379288953}, // 3908K {0.384542023, 0.379261235}, // 3909K {0.384496051, 0.379233519}, // 3910K {0.384450101, 0.379205807}, // 3911K {0.384404173, 0.379178097}, // 3912K {0.384358267, 0.37915039}, // 3913K {0.384312382, 0.379122685}, // 3914K {0.384266519, 0.379094984}, // 3915K {0.384220678, 0.379067285}, // 3916K {0.384174858, 0.379039589}, // 3917K {0.384129061, 0.379011895}, // 3918K {0.384083285, 0.378984205}, // 3919K {0.38403753, 0.378956517}, // 3920K {0.383991797, 0.378928832}, // 3921K {0.383946086, 0.37890115}, // 3922K {0.383900397, 0.37887347}, // 3923K {0.383854729, 0.378845794}, // 3924K {0.383809082, 0.37881812}, // 3925K {0.383763458, 0.378790449}, // 3926K {0.383717855, 0.378762781}, // 3927K {0.383672273, 0.378735116}, // 3928K {0.383626713, 0.378707454}, // 3929K {0.383581175, 0.378679794}, // 3930K {0.383535658, 0.378652138}, // 3931K {0.383490162, 0.378624484}, // 3932K {0.383444689, 0.378596833}, // 3933K {0.383399236, 0.378569185}, // 3934K {0.383353805, 0.37854154}, // 3935K {0.383308396, 0.378513898}, // 3936K {0.383263008, 0.378486259}, // 3937K {0.383217642, 0.378458622}, // 3938K {0.383172297, 0.378430989}, // 3939K {0.383126973, 0.378403359}, // 3940K {0.383081671, 0.378375731}, // 3941K {0.383036391, 0.378348106}, // 3942K {0.382991131, 0.378320485}, // 3943K {0.382945893, 0.378292866}, // 3944K {0.382900677, 0.378265251}, // 3945K {0.382855482, 0.378237638}, // 3946K {0.382810308, 0.378210028}, // 3947K {0.382765156, 0.378182421}, // 3948K {0.382720025, 0.378154818}, // 3949K {0.382674915, 0.378127217}, // 3950K {0.382629826, 0.378099619}, // 3951K {0.382584759, 0.378072024}, // 3952K {0.382539713, 0.378044433}, // 3953K {0.382494689, 0.378016844}, // 3954K {0.382449685, 0.377989258}, // 3955K {0.382404703, 0.377961676}, // 3956K {0.382359742, 0.377934096}, // 3957K {0.382314803, 0.37790652}, // 3958K {0.382269884, 0.377878947}, // 3959K {0.382224987, 0.377851376}, // 3960K {0.382180111, 0.377823809}, // 3961K {0.382135256, 0.377796245}, // 3962K {0.382090422, 0.377768684}, // 3963K {0.38204561, 0.377741126}, // 3964K {0.382000819, 0.377713571}, // 3965K {0.381956048, 0.377686019}, // 3966K {0.381911299, 0.377658471}, // 3967K {0.381866571, 0.377630925}, // 3968K {0.381821864, 0.377603383}, // 3969K {0.381777179, 0.377575843}, // 3970K {0.381732514, 0.377548307}, // 3971K {0.38168787, 0.377520774}, // 3972K {0.381643248, 0.377493245}, // 3973K {0.381598646, 0.377465718}, // 3974K {0.381554066, 0.377438195}, // 3975K {0.381509506, 0.377410674}, // 3976K {0.381464968, 0.377383157}, // 3977K {0.38142045, 0.377355643}, // 3978K {0.381375954, 0.377328133}, // 3979K {0.381331478, 0.377300625}, // 3980K {0.381287024, 0.377273121}, // 3981K {0.38124259, 0.37724562}, // 3982K {0.381198178, 0.377218122}, // 3983K {0.381153786, 0.377190627}, // 3984K {0.381109415, 0.377163136}, // 3985K {0.381065065, 0.377135648}, // 3986K {0.381020736, 0.377108163}, // 3987K {0.380976428, 0.377080682}, // 3988K {0.380932141, 0.377053203}, // 3989K {0.380887875, 0.377025728}, // 3990K {0.380843629, 0.376998256}, // 3991K {0.380799404, 0.376970788}, // 3992K {0.380755201, 0.376943323}, // 3993K {0.380711018, 0.376915861}, // 3994K {0.380666855, 0.376888402}, // 3995K {0.380622714, 0.376860947}, // 3996K {0.380578593, 0.376833495}, // 3997K {0.380534494, 0.376806046}, // 3998K {0.380490414, 0.376778601}, // 3999K {0.380446356, 0.376751159}, // 4000K {0.380402319, 0.37672372}, // 4001K {0.380358302, 0.376696284}, // 4002K {0.380314305, 0.376668852}, // 4003K {0.38027033, 0.376641424}, // 4004K {0.380226375, 0.376613999}, // 4005K {0.380182441, 0.376586577}, // 4006K {0.380138528, 0.376559158}, // 4007K {0.380094635, 0.376531743}, // 4008K {0.380050763, 0.376504331}, // 4009K {0.380006911, 0.376476923}, // 4010K {0.379963081, 0.376449518}, // 4011K {0.37991927, 0.376422116}, // 4012K {0.379875481, 0.376394718}, // 4013K {0.379831712, 0.376367323}, // 4014K {0.379787963, 0.376339932}, // 4015K {0.379744236, 0.376312544}, // 4016K {0.379700528, 0.37628516}, // 4017K {0.379656841, 0.376257779}, // 4018K {0.379613175, 0.376230401}, // 4019K {0.37956953, 0.376203027}, // 4020K {0.379525904, 0.376175656}, // 4021K {0.3794823, 0.376148289}, // 4022K {0.379438715, 0.376120926}, // 4023K {0.379395152, 0.376093565}, // 4024K {0.379351609, 0.376066209}, // 4025K {0.379308086, 0.376038855}, // 4026K {0.379264583, 0.376011506}, // 4027K {0.379221102, 0.375984159}, // 4028K {0.37917764, 0.375956817}, // 4029K {0.379134199, 0.375929477}, // 4030K {0.379090778, 0.375902142}, // 4031K {0.379047378, 0.375874809}, // 4032K {0.379003998, 0.375847481}, // 4033K {0.378960639, 0.375820156}, // 4034K {0.3789173, 0.375792834}, // 4035K {0.378873981, 0.375765516}, // 4036K {0.378830682, 0.375738202}, // 4037K {0.378787404, 0.375710891}, // 4038K {0.378744146, 0.375683583}, // 4039K {0.378700909, 0.37565628}, // 4040K {0.378657692, 0.375628979}, // 4041K {0.378614495, 0.375601683}, // 4042K {0.378571318, 0.37557439}, // 4043K {0.378528162, 0.3755471}, // 4044K {0.378485025, 0.375519814}, // 4045K {0.378441909, 0.375492532}, // 4046K {0.378398814, 0.375465254}, // 4047K {0.378355738, 0.375437979}, // 4048K {0.378312683, 0.375410707}, // 4049K {0.378269648, 0.375383439}, // 4050K {0.378226633, 0.375356175}, // 4051K {0.378183638, 0.375328915}, // 4052K {0.378140664, 0.375301658}, // 4053K {0.378097709, 0.375274405}, // 4054K {0.378054775, 0.375247155}, // 4055K {0.378011861, 0.375219909}, // 4056K {0.377968967, 0.375192667}, // 4057K {0.377926093, 0.375165429}, // 4058K {0.377883239, 0.375138194}, // 4059K {0.377840405, 0.375110963}, // 4060K {0.377797591, 0.375083735}, // 4061K {0.377754798, 0.375056511}, // 4062K {0.377712024, 0.375029291}, // 4063K {0.377669271, 0.375002075}, // 4064K {0.377626537, 0.374974862}, // 4065K {0.377583823, 0.374947653}, // 4066K {0.37754113, 0.374920448}, // 4067K {0.377498456, 0.374893247}, // 4068K {0.377455803, 0.374866049}, // 4069K {0.377413169, 0.374838855}, // 4070K {0.377370556, 0.374811665}, // 4071K {0.377327962, 0.374784478}, // 4072K {0.377285388, 0.374757295}, // 4073K {0.377242835, 0.374730116}, // 4074K {0.377200301, 0.374702941}, // 4075K {0.377157787, 0.37467577}, // 4076K {0.377115293, 0.374648602}, // 4077K {0.377072819, 0.374621438}, // 4078K {0.377030364, 0.374594278}, // 4079K {0.37698793, 0.374567122}, // 4080K {0.376945515, 0.374539969}, // 4081K {0.376903121, 0.37451282}, // 4082K {0.376860746, 0.374485675}, // 4083K {0.376818391, 0.374458534}, // 4084K {0.376776056, 0.374431397}, // 4085K {0.37673374, 0.374404263}, // 4086K {0.376691444, 0.374377134}, // 4087K {0.376649169, 0.374350008}, // 4088K {0.376606912, 0.374322886}, // 4089K {0.376564676, 0.374295768}, // 4090K {0.376522459, 0.374268654}, // 4091K {0.376480263, 0.374241543}, // 4092K {0.376438085, 0.374214437}, // 4093K {0.376395928, 0.374187334}, // 4094K {0.37635379, 0.374160235}, // 4095K {0.376311672, 0.37413314}, // 4096K {0.376269574, 0.374106049}, // 4097K {0.376227495, 0.374078962}, // 4098K {0.376185436, 0.374051878}, // 4099K {0.376143397, 0.374024799}, // 4100K {0.376101377, 0.373997723}, // 4101K {0.376059377, 0.373970652}, // 4102K {0.376017396, 0.373943584}, // 4103K {0.375975435, 0.37391652}, // 4104K {0.375933494, 0.37388946}, // 4105K {0.375891572, 0.373862405}, // 4106K {0.37584967, 0.373835353}, // 4107K {0.375807788, 0.373808304}, // 4108K {0.375765925, 0.37378126}, // 4109K {0.375724081, 0.37375422}, // 4110K {0.375682257, 0.373727184}, // 4111K {0.375640453, 0.373700152}, // 4112K {0.375598668, 0.373673123}, // 4113K {0.375556902, 0.373646099}, // 4114K {0.375515156, 0.373619078}, // 4115K {0.37547343, 0.373592062}, // 4116K {0.375431723, 0.37356505}, // 4117K {0.375390035, 0.373538041}, // 4118K {0.375348367, 0.373511037}, // 4119K {0.375306718, 0.373484036}, // 4120K {0.375265089, 0.37345704}, // 4121K {0.375223479, 0.373430047}, // 4122K {0.375181889, 0.373403059}, // 4123K {0.375140318, 0.373376074}, // 4124K {0.375098766, 0.373349094}, // 4125K {0.375057234, 0.373322117}, // 4126K {0.375015721, 0.373295145}, // 4127K {0.374974227, 0.373268177}, // 4128K {0.374932753, 0.373241212}, // 4129K {0.374891298, 0.373214252}, // 4130K {0.374849863, 0.373187296}, // 4131K {0.374808446, 0.373160344}, // 4132K {0.374767049, 0.373133395}, // 4133K {0.374725672, 0.373106451}, // 4134K {0.374684313, 0.373079511}, // 4135K {0.374642974, 0.373052575}, // 4136K {0.374601654, 0.373025643}, // 4137K {0.374560354, 0.372998716}, // 4138K {0.374519072, 0.372971792}, // 4139K {0.37447781, 0.372944872}, // 4140K {0.374436567, 0.372917957}, // 4141K {0.374395343, 0.372891045}, // 4142K {0.374354139, 0.372864138}, // 4143K {0.374312953, 0.372837235}, // 4144K {0.374271787, 0.372810336}, // 4145K {0.37423064, 0.372783441}, // 4146K {0.374189512, 0.37275655}, // 4147K {0.374148403, 0.372729663}, // 4148K {0.374107313, 0.37270278}, // 4149K {0.374066243, 0.372675902}, // 4150K {0.374025191, 0.372649028}, // 4151K {0.373984159, 0.372622157}, // 4152K {0.373943146, 0.372595291}, // 4153K {0.373902151, 0.372568429}, // 4154K {0.373861176, 0.372541572}, // 4155K {0.37382022, 0.372514718}, // 4156K {0.373779283, 0.372487869}, // 4157K {0.373738365, 0.372461023}, // 4158K {0.373697466, 0.372434182}, // 4159K {0.373656586, 0.372407345}, // 4160K {0.373615725, 0.372380513}, // 4161K {0.373574883, 0.372353684}, // 4162K {0.37353406, 0.37232686}, // 4163K {0.373493256, 0.372300039}, // 4164K {0.373452471, 0.372273224}, // 4165K {0.373411705, 0.372246412}, // 4166K {0.373370958, 0.372219604}, // 4167K {0.37333023, 0.372192801}, // 4168K {0.373289521, 0.372166002}, // 4169K {0.37324883, 0.372139207}, // 4170K {0.373208159, 0.372112416}, // 4171K {0.373167506, 0.37208563}, // 4172K {0.373126872, 0.372058848}, // 4173K {0.373086258, 0.37203207}, // 4174K {0.373045662, 0.372005296}, // 4175K {0.373005084, 0.371978526}, // 4176K {0.372964526, 0.371951761}, // 4177K {0.372923987, 0.371925}, // 4178K {0.372883466, 0.371898243}, // 4179K {0.372842964, 0.371871491}, // 4180K {0.372802481, 0.371844743}, // 4181K {0.372762017, 0.371817999}, // 4182K {0.372721571, 0.371791259}, // 4183K {0.372681144, 0.371764524}, // 4184K {0.372640736, 0.371737793}, // 4185K {0.372600347, 0.371711066}, // 4186K {0.372559977, 0.371684344}, // 4187K {0.372519625, 0.371657625}, // 4188K {0.372479292, 0.371630911}, // 4189K {0.372438977, 0.371604202}, // 4190K {0.372398682, 0.371577497}, // 4191K {0.372358405, 0.371550796}, // 4192K {0.372318146, 0.371524099}, // 4193K {0.372277907, 0.371497407}, // 4194K {0.372237686, 0.371470719}, // 4195K {0.372197483, 0.371444035}, // 4196K {0.372157299, 0.371417356}, // 4197K {0.372117134, 0.371390681}, // 4198K {0.372076988, 0.37136401}, // 4199K {0.37203686, 0.371337344}, // 4200K {0.37199675, 0.371310682}, // 4201K {0.37195666, 0.371284024}, // 4202K {0.371916588, 0.371257371}, // 4203K {0.371876534, 0.371230722}, // 4204K {0.371836499, 0.371204078}, // 4205K {0.371796482, 0.371177437}, // 4206K {0.371756484, 0.371150802}, // 4207K {0.371716505, 0.37112417}, // 4208K {0.371676544, 0.371097543}, // 4209K {0.371636601, 0.371070921}, // 4210K {0.371596677, 0.371044302}, // 4211K {0.371556772, 0.371017689}, // 4212K {0.371516885, 0.370991079}, // 4213K {0.371477016, 0.370964474}, // 4214K {0.371437166, 0.370937873}, // 4215K {0.371397334, 0.370911277}, // 4216K {0.371357521, 0.370884685}, // 4217K {0.371317726, 0.370858098}, // 4218K {0.37127795, 0.370831515}, // 4219K {0.371238192, 0.370804936}, // 4220K {0.371198452, 0.370778362}, // 4221K {0.371158731, 0.370751793}, // 4222K {0.371119028, 0.370725227}, // 4223K {0.371079343, 0.370698667}, // 4224K {0.371039677, 0.37067211}, // 4225K {0.371000029, 0.370645558}, // 4226K {0.3709604, 0.370619011}, // 4227K {0.370920788, 0.370592468}, // 4228K {0.370881195, 0.370565929}, // 4229K {0.370841621, 0.370539395}, // 4230K {0.370802064, 0.370512865}, // 4231K {0.370762526, 0.37048634}, // 4232K {0.370723007, 0.37045982}, // 4233K {0.370683505, 0.370433303}, // 4234K {0.370644022, 0.370406792}, // 4235K {0.370604557, 0.370380284}, // 4236K {0.37056511, 0.370353782}, // 4237K {0.370525681, 0.370327283}, // 4238K {0.370486271, 0.37030079}, // 4239K {0.370446878, 0.3702743}, // 4240K {0.370407504, 0.370247816}, // 4241K {0.370368149, 0.370221335}, // 4242K {0.370328811, 0.37019486}, // 4243K {0.370289491, 0.370168388}, // 4244K {0.37025019, 0.370141922}, // 4245K {0.370210907, 0.370115459}, // 4246K {0.370171641, 0.370089002}, // 4247K {0.370132394, 0.370062549}, // 4248K {0.370093166, 0.3700361}, // 4249K {0.370053955, 0.370009656}, // 4250K {0.370014762, 0.369983216}, // 4251K {0.369975587, 0.369956781}, // 4252K {0.369936431, 0.369930351}, // 4253K {0.369897292, 0.369903925}, // 4254K {0.369858172, 0.369877504}, // 4255K {0.369819069, 0.369851087}, // 4256K {0.369779985, 0.369824675}, // 4257K {0.369740918, 0.369798267}, // 4258K {0.36970187, 0.369771864}, // 4259K {0.36966284, 0.369745465}, // 4260K {0.369623827, 0.369719071}, // 4261K {0.369584833, 0.369692682}, // 4262K {0.369545856, 0.369666297}, // 4263K {0.369506898, 0.369639917}, // 4264K {0.369467957, 0.369613541}, // 4265K {0.369429035, 0.36958717}, // 4266K {0.36939013, 0.369560804}, // 4267K {0.369351243, 0.369534442}, // 4268K {0.369312374, 0.369508085}, // 4269K {0.369273523, 0.369481732}, // 4270K {0.36923469, 0.369455384}, // 4271K {0.369195875, 0.369429041}, // 4272K {0.369157078, 0.369402702}, // 4273K {0.369118298, 0.369376368}, // 4274K {0.369079536, 0.369350038}, // 4275K {0.369040793, 0.369323713}, // 4276K {0.369002067, 0.369297393}, // 4277K {0.368963359, 0.369271077}, // 4278K {0.368924668, 0.369244766}, // 4279K {0.368885996, 0.36921846}, // 4280K {0.368847341, 0.369192158}, // 4281K {0.368808704, 0.369165861}, // 4282K {0.368770085, 0.369139568}, // 4283K {0.368731483, 0.369113281}, // 4284K {0.3686929, 0.369086997}, // 4285K {0.368654334, 0.369060719}, // 4286K {0.368615785, 0.369034445}, // 4287K {0.368577255, 0.369008176}, // 4288K {0.368538742, 0.368981911}, // 4289K {0.368500247, 0.368955651}, // 4290K {0.36846177, 0.368929396}, // 4291K {0.36842331, 0.368903146}, // 4292K {0.368384868, 0.3688769}, // 4293K {0.368346444, 0.368850659}, // 4294K {0.368308037, 0.368824422}, // 4295K {0.368269648, 0.368798191}, // 4296K {0.368231276, 0.368771964}, // 4297K {0.368192923, 0.368745741}, // 4298K {0.368154586, 0.368719524}, // 4299K {0.368116268, 0.368693311}, // 4300K {0.368077967, 0.368667102}, // 4301K {0.368039683, 0.368640899}, // 4302K {0.368001418, 0.3686147}, // 4303K {0.367963169, 0.368588506}, // 4304K {0.367924939, 0.368562316}, // 4305K {0.367886725, 0.368536132}, // 4306K {0.36784853, 0.368509952}, // 4307K {0.367810352, 0.368483777}, // 4308K {0.367772191, 0.368457606}, // 4309K {0.367734048, 0.36843144}, // 4310K {0.367695922, 0.368405279}, // 4311K {0.367657814, 0.368379123}, // 4312K {0.367619724, 0.368352972}, // 4313K {0.367581651, 0.368326825}, // 4314K {0.367543595, 0.368300683}, // 4315K {0.367505557, 0.368274545}, // 4316K {0.367467536, 0.368248413}, // 4317K {0.367429533, 0.368222285}, // 4318K {0.367391547, 0.368196162}, // 4319K {0.367353578, 0.368170044}, // 4320K {0.367315627, 0.36814393}, // 4321K {0.367277693, 0.368117822}, // 4322K {0.367239777, 0.368091718}, // 4323K {0.367201878, 0.368065618}, // 4324K {0.367163996, 0.368039524}, // 4325K {0.367126132, 0.368013434}, // 4326K {0.367088285, 0.36798735}, // 4327K {0.367050456, 0.36796127}, // 4328K {0.367012643, 0.367935194}, // 4329K {0.366974849, 0.367909124}, // 4330K {0.366937071, 0.367883058}, // 4331K {0.366899311, 0.367856997}, // 4332K {0.366861568, 0.367830941}, // 4333K {0.366823842, 0.36780489}, // 4334K {0.366786133, 0.367778844}, // 4335K {0.366748442, 0.367752802}, // 4336K {0.366710768, 0.367726765}, // 4337K {0.366673111, 0.367700733}, // 4338K {0.366635472, 0.367674706}, // 4339K {0.36659785, 0.367648684}, // 4340K {0.366560245, 0.367622666}, // 4341K {0.366522657, 0.367596653}, // 4342K {0.366485086, 0.367570645}, // 4343K {0.366447533, 0.367544642}, // 4344K {0.366409996, 0.367518644}, // 4345K {0.366372477, 0.367492651}, // 4346K {0.366334975, 0.367466662}, // 4347K {0.36629749, 0.367440679}, // 4348K {0.366260023, 0.3674147}, // 4349K {0.366222572, 0.367388726}, // 4350K {0.366185139, 0.367362757}, // 4351K {0.366147722, 0.367336792}, // 4352K {0.366110323, 0.367310833}, // 4353K {0.366072941, 0.367284878}, // 4354K {0.366035576, 0.367258929}, // 4355K {0.365998228, 0.367232984}, // 4356K {0.365960897, 0.367207044}, // 4357K {0.365923583, 0.367181109}, // 4358K {0.365886286, 0.367155178}, // 4359K {0.365849006, 0.367129253}, // 4360K {0.365811743, 0.367103333}, // 4361K {0.365774498, 0.367077417}, // 4362K {0.365737269, 0.367051506}, // 4363K {0.365700057, 0.367025601}, // 4364K {0.365662862, 0.3669997}, // 4365K {0.365625684, 0.366973804}, // 4366K {0.365588523, 0.366947912}, // 4367K {0.36555138, 0.366922026}, // 4368K {0.365514253, 0.366896145}, // 4369K {0.365477143, 0.366870268}, // 4370K {0.36544005, 0.366844397}, // 4371K {0.365402973, 0.36681853}, // 4372K {0.365365914, 0.366792669}, // 4373K {0.365328872, 0.366766812}, // 4374K {0.365291846, 0.36674096}, // 4375K {0.365254838, 0.366715113}, // 4376K {0.365217846, 0.366689271}, // 4377K {0.365180871, 0.366663434}, // 4378K {0.365143913, 0.366637602}, // 4379K {0.365106972, 0.366611774}, // 4380K {0.365070048, 0.366585952}, // 4381K {0.36503314, 0.366560135}, // 4382K {0.36499625, 0.366534322}, // 4383K {0.364959376, 0.366508515}, // 4384K {0.364922519, 0.366482712}, // 4385K {0.364885679, 0.366456915}, // 4386K {0.364848855, 0.366431122}, // 4387K {0.364812049, 0.366405334}, // 4388K {0.364775259, 0.366379551}, // 4389K {0.364738485, 0.366353773}, // 4390K {0.364701729, 0.366328001}, // 4391K {0.364664989, 0.366302233}, // 4392K {0.364628266, 0.36627647}, // 4393K {0.36459156, 0.366250712}, // 4394K {0.364554871, 0.366224959}, // 4395K {0.364518198, 0.366199211}, // 4396K {0.364481542, 0.366173468}, // 4397K {0.364444902, 0.36614773}, // 4398K {0.364408279, 0.366121996}, // 4399K {0.364371673, 0.366096268}, // 4400K {0.364335084, 0.366070545}, // 4401K {0.364298511, 0.366044827}, // 4402K {0.364261955, 0.366019114}, // 4403K {0.364225415, 0.365993405}, // 4404K {0.364188892, 0.365967702}, // 4405K {0.364152386, 0.365942004}, // 4406K {0.364115896, 0.365916311}, // 4407K {0.364079423, 0.365890623}, // 4408K {0.364042966, 0.365864939}, // 4409K {0.364006526, 0.365839261}, // 4410K {0.363970103, 0.365813588}, // 4411K {0.363933696, 0.36578792}, // 4412K {0.363897305, 0.365762256}, // 4413K {0.363860932, 0.365736598}, // 4414K {0.363824574, 0.365710945}, // 4415K {0.363788234, 0.365685297}, // 4416K {0.363751909, 0.365659654}, // 4417K {0.363715601, 0.365634015}, // 4418K {0.36367931, 0.365608382}, // 4419K {0.363643035, 0.365582754}, // 4420K {0.363606777, 0.365557131}, // 4421K {0.363570535, 0.365531513}, // 4422K {0.36353431, 0.3655059}, // 4423K {0.363498101, 0.365480292}, // 4424K {0.363461908, 0.365454689}, // 4425K {0.363425732, 0.365429091}, // 4426K {0.363389572, 0.365403498}, // 4427K {0.363353429, 0.365377911}, // 4428K {0.363317302, 0.365352328}, // 4429K {0.363281192, 0.36532675}, // 4430K {0.363245097, 0.365301177}, // 4431K {0.36320902, 0.36527561}, // 4432K {0.363172958, 0.365250047}, // 4433K {0.363136913, 0.36522449}, // 4434K {0.363100885, 0.365198937}, // 4435K {0.363064872, 0.36517339}, // 4436K {0.363028876, 0.365147848}, // 4437K {0.362992896, 0.36512231}, // 4438K {0.362956933, 0.365096778}, // 4439K {0.362920986, 0.365071251}, // 4440K {0.362885055, 0.365045729}, // 4441K {0.36284914, 0.365020212}, // 4442K {0.362813242, 0.3649947}, // 4443K {0.36277736, 0.364969193}, // 4444K {0.362741494, 0.364943691}, // 4445K {0.362705645, 0.364918195}, // 4446K {0.362669812, 0.364892703}, // 4447K {0.362633995, 0.364867217}, // 4448K {0.362598194, 0.364841735}, // 4449K {0.362562409, 0.364816259}, // 4450K {0.362526641, 0.364790788}, // 4451K {0.362490888, 0.364765322}, // 4452K {0.362455152, 0.36473986}, // 4453K {0.362419433, 0.364714405}, // 4454K {0.362383729, 0.364688954}, // 4455K {0.362348041, 0.364663508}, // 4456K {0.36231237, 0.364638067}, // 4457K {0.362276715, 0.364612632}, // 4458K {0.362241075, 0.364587201}, // 4459K {0.362205452, 0.364561776}, // 4460K {0.362169846, 0.364536356}, // 4461K {0.362134255, 0.364510941}, // 4462K {0.36209868, 0.364485531}, // 4463K {0.362063121, 0.364460126}, // 4464K {0.362027579, 0.364434726}, // 4465K {0.361992052, 0.364409331}, // 4466K {0.361956542, 0.364383942}, // 4467K {0.361921048, 0.364358558}, // 4468K {0.361885569, 0.364333178}, // 4469K {0.361850107, 0.364307804}, // 4470K {0.361814661, 0.364282435}, // 4471K {0.36177923, 0.364257071}, // 4472K {0.361743816, 0.364231713}, // 4473K {0.361708418, 0.364206359}, // 4474K {0.361673036, 0.364181011}, // 4475K {0.361637669, 0.364155667}, // 4476K {0.361602319, 0.364130329}, // 4477K {0.361566985, 0.364104996}, // 4478K {0.361531666, 0.364079668}, // 4479K {0.361496364, 0.364054346}, // 4480K {0.361461077, 0.364029028}, // 4481K {0.361425807, 0.364003716}, // 4482K {0.361390552, 0.363978408}, // 4483K {0.361355313, 0.363953106}, // 4484K {0.36132009, 0.363927809}, // 4485K {0.361284883, 0.363902518}, // 4486K {0.361249692, 0.363877231}, // 4487K {0.361214517, 0.363851949}, // 4488K {0.361179358, 0.363826673}, // 4489K {0.361144214, 0.363801402}, // 4490K {0.361109087, 0.363776136}, // 4491K {0.361073975, 0.363750875}, // 4492K {0.361038879, 0.36372562}, // 4493K {0.361003799, 0.363700369}, // 4494K {0.360968734, 0.363675124}, // 4495K {0.360933686, 0.363649884}, // 4496K {0.360898653, 0.363624649}, // 4497K {0.360863636, 0.363599419}, // 4498K {0.360828635, 0.363574195}, // 4499K {0.360793649, 0.363548975}, // 4500K {0.36075868, 0.363523761}, // 4501K {0.360723726, 0.363498552}, // 4502K {0.360688788, 0.363473349}, // 4503K {0.360653865, 0.36344815}, // 4504K {0.360618959, 0.363422957}, // 4505K {0.360584068, 0.363397768}, // 4506K {0.360549192, 0.363372585}, // 4507K {0.360514333, 0.363347407}, // 4508K {0.360479489, 0.363322235}, // 4509K {0.360444661, 0.363297067}, // 4510K {0.360409848, 0.363271905}, // 4511K {0.360375051, 0.363246748}, // 4512K {0.36034027, 0.363221596}, // 4513K {0.360305505, 0.36319645}, // 4514K {0.360270755, 0.363171309}, // 4515K {0.36023602, 0.363146172}, // 4516K {0.360201302, 0.363121041}, // 4517K {0.360166599, 0.363095916}, // 4518K {0.360131911, 0.363070795}, // 4519K {0.36009724, 0.36304568}, // 4520K {0.360062583, 0.36302057}, // 4521K {0.360027943, 0.362995465}, // 4522K {0.359993318, 0.362970365}, // 4523K {0.359958708, 0.362945271}, // 4524K {0.359924114, 0.362920182}, // 4525K {0.359889536, 0.362895098}, // 4526K {0.359854973, 0.362870019}, // 4527K {0.359820425, 0.362844946}, // 4528K {0.359785894, 0.362819877}, // 4529K {0.359751377, 0.362794814}, // 4530K {0.359716876, 0.362769757}, // 4531K {0.359682391, 0.362744704}, // 4532K {0.359647921, 0.362719657}, // 4533K {0.359613467, 0.362694615}, // 4534K {0.359579028, 0.362669578}, // 4535K {0.359544604, 0.362644546}, // 4536K {0.359510196, 0.36261952}, // 4537K {0.359475804, 0.362594499}, // 4538K {0.359441427, 0.362569483}, // 4539K {0.359407065, 0.362544473}, // 4540K {0.359372719, 0.362519467}, // 4541K {0.359338388, 0.362494467}, // 4542K {0.359304073, 0.362469472}, // 4543K {0.359269773, 0.362444483}, // 4544K {0.359235488, 0.362419499}, // 4545K {0.359201219, 0.36239452}, // 4546K {0.359166965, 0.362369546}, // 4547K {0.359132726, 0.362344577}, // 4548K {0.359098503, 0.362319614}, // 4549K {0.359064295, 0.362294656}, // 4550K {0.359030102, 0.362269703}, // 4551K {0.358995925, 0.362244756}, // 4552K {0.358961763, 0.362219814}, // 4553K {0.358927617, 0.362194877}, // 4554K {0.358893485, 0.362169945}, // 4555K {0.358859369, 0.362145019}, // 4556K {0.358825269, 0.362120098}, // 4557K {0.358791183, 0.362095182}, // 4558K {0.358757113, 0.362070271}, // 4559K {0.358723058, 0.362045366}, // 4560K {0.358689018, 0.362020466}, // 4561K {0.358654994, 0.361995572}, // 4562K {0.358620985, 0.361970682}, // 4563K {0.358586991, 0.361945798}, // 4564K {0.358553012, 0.361920919}, // 4565K {0.358519049, 0.361896046}, // 4566K {0.3584851, 0.361871178}, // 4567K {0.358451167, 0.361846315}, // 4568K {0.358417249, 0.361821457}, // 4569K {0.358383346, 0.361796605}, // 4570K {0.358349459, 0.361771758}, // 4571K {0.358315586, 0.361746916}, // 4572K {0.358281729, 0.361722079}, // 4573K {0.358247887, 0.361697248}, // 4574K {0.35821406, 0.361672422}, // 4575K {0.358180248, 0.361647602}, // 4576K {0.358146451, 0.361622787}, // 4577K {0.358112669, 0.361597977}, // 4578K {0.358078903, 0.361573172}, // 4579K {0.358045151, 0.361548373}, // 4580K {0.358011415, 0.361523579}, // 4581K {0.357977693, 0.36149879}, // 4582K {0.357943987, 0.361474006}, // 4583K {0.357910296, 0.361449228}, // 4584K {0.35787662, 0.361424456}, // 4585K {0.357842958, 0.361399688}, // 4586K {0.357809312, 0.361374926}, // 4587K {0.357775681, 0.361350169}, // 4588K {0.357742065, 0.361325418}, // 4589K {0.357708464, 0.361300671}, // 4590K {0.357674878, 0.361275931}, // 4591K {0.357641307, 0.361251195}, // 4592K {0.357607751, 0.361226465}, // 4593K {0.35757421, 0.36120174}, // 4594K {0.357540684, 0.36117702}, // 4595K {0.357507172, 0.361152306}, // 4596K {0.357473676, 0.361127597}, // 4597K {0.357440195, 0.361102894}, // 4598K {0.357406729, 0.361078195}, // 4599K {0.357373277, 0.361053503}, // 4600K {0.357339841, 0.361028815}, // 4601K {0.357306419, 0.361004133}, // 4602K {0.357273012, 0.360979456}, // 4603K {0.357239621, 0.360954784}, // 4604K {0.357206244, 0.360930118}, // 4605K {0.357172882, 0.360905457}, // 4606K {0.357139535, 0.360880802}, // 4607K {0.357106202, 0.360856152}, // 4608K {0.357072885, 0.360831507}, // 4609K {0.357039582, 0.360806867}, // 4610K {0.357006294, 0.360782233}, // 4611K {0.356973021, 0.360757604}, // 4612K {0.356939763, 0.360732981}, // 4613K {0.35690652, 0.360708363}, // 4614K {0.356873292, 0.36068375}, // 4615K {0.356840078, 0.360659142}, // 4616K {0.356806879, 0.36063454}, // 4617K {0.356773695, 0.360609944}, // 4618K {0.356740525, 0.360585352}, // 4619K {0.356707371, 0.360560766}, // 4620K {0.356674231, 0.360536186}, // 4621K {0.356641106, 0.360511611}, // 4622K {0.356607995, 0.360487041}, // 4623K {0.3565749, 0.360462476}, // 4624K {0.356541819, 0.360437917}, // 4625K {0.356508753, 0.360413363}, // 4626K {0.356475701, 0.360388815}, // 4627K {0.356442664, 0.360364272}, // 4628K {0.356409642, 0.360339734}, // 4629K {0.356376635, 0.360315201}, // 4630K {0.356343642, 0.360290674}, // 4631K {0.356310664, 0.360266153}, // 4632K {0.356277701, 0.360241637}, // 4633K {0.356244752, 0.360217126}, // 4634K {0.356211818, 0.36019262}, // 4635K {0.356178898, 0.36016812}, // 4636K {0.356145993, 0.360143625}, // 4637K {0.356113103, 0.360119136}, // 4638K {0.356080228, 0.360094652}, // 4639K {0.356047367, 0.360070173}, // 4640K {0.35601452, 0.3600457}, // 4641K {0.355981688, 0.360021232}, // 4642K {0.355948871, 0.35999677}, // 4643K {0.355916068, 0.359972313}, // 4644K {0.35588328, 0.359947861}, // 4645K {0.355850507, 0.359923415}, // 4646K {0.355817748, 0.359898974}, // 4647K {0.355785003, 0.359874538}, // 4648K {0.355752273, 0.359850108}, // 4649K {0.355719558, 0.359825683}, // 4650K {0.355686857, 0.359801264}, // 4651K {0.35565417, 0.35977685}, // 4652K {0.355621498, 0.359752441}, // 4653K {0.355588841, 0.359728038}, // 4654K {0.355556198, 0.35970364}, // 4655K {0.35552357, 0.359679248}, // 4656K {0.355490956, 0.359654861}, // 4657K {0.355458356, 0.359630479}, // 4658K {0.355425771, 0.359606103}, // 4659K {0.3553932, 0.359581732}, // 4660K {0.355360644, 0.359557367}, // 4661K {0.355328102, 0.359533007}, // 4662K {0.355295575, 0.359508652}, // 4663K {0.355263062, 0.359484303}, // 4664K {0.355230563, 0.359459959}, // 4665K {0.355198079, 0.359435621}, // 4666K {0.355165609, 0.359411288}, // 4667K {0.355133154, 0.35938696}, // 4668K {0.355100713, 0.359362638}, // 4669K {0.355068286, 0.359338321}, // 4670K {0.355035874, 0.35931401}, // 4671K {0.355003476, 0.359289704}, // 4672K {0.354971093, 0.359265403}, // 4673K {0.354938723, 0.359241108}, // 4674K {0.354906368, 0.359216818}, // 4675K {0.354874028, 0.359192534}, // 4676K {0.354841701, 0.359168255}, // 4677K {0.354809389, 0.359143981}, // 4678K {0.354777092, 0.359119713}, // 4679K {0.354744808, 0.359095451}, // 4680K {0.354712539, 0.359071193}, // 4681K {0.354680284, 0.359046942}, // 4682K {0.354648043, 0.359022695}, // 4683K {0.354615817, 0.358998454}, // 4684K {0.354583605, 0.358974219}, // 4685K {0.354551407, 0.358949988}, // 4686K {0.354519223, 0.358925764}, // 4687K {0.354487054, 0.358901544}, // 4688K {0.354454899, 0.35887733}, // 4689K {0.354422758, 0.358853122}, // 4690K {0.354390631, 0.358828919}, // 4691K {0.354358518, 0.358804721}, // 4692K {0.35432642, 0.358780529}, // 4693K {0.354294336, 0.358756342}, // 4694K {0.354262266, 0.358732161}, // 4695K {0.35423021, 0.358707985}, // 4696K {0.354198168, 0.358683815}, // 4697K {0.35416614, 0.35865965}, // 4698K {0.354134127, 0.35863549}, // 4699K {0.354102127, 0.358611336}, // 4700K {0.354070142, 0.358587187}, // 4701K {0.354038171, 0.358563044}, // 4702K {0.354006214, 0.358538906}, // 4703K {0.353974271, 0.358514774}, // 4704K {0.353942342, 0.358490647}, // 4705K {0.353910428, 0.358466525}, // 4706K {0.353878527, 0.358442409}, // 4707K {0.35384664, 0.358418298}, // 4708K {0.353814768, 0.358394193}, // 4709K {0.353782909, 0.358370093}, // 4710K {0.353751065, 0.358345999}, // 4711K {0.353719234, 0.35832191}, // 4712K {0.353687418, 0.358297826}, // 4713K {0.353655616, 0.358273748}, // 4714K {0.353623827, 0.358249676}, // 4715K {0.353592053, 0.358225609}, // 4716K {0.353560293, 0.358201547}, // 4717K {0.353528546, 0.358177491}, // 4718K {0.353496814, 0.35815344}, // 4719K {0.353465096, 0.358129394}, // 4720K {0.353433391, 0.358105354}, // 4721K {0.353401701, 0.35808132}, // 4722K {0.353370024, 0.358057291}, // 4723K {0.353338362, 0.358033267}, // 4724K {0.353306713, 0.358009249}, // 4725K {0.353275079, 0.357985237}, // 4726K {0.353243458, 0.357961229}, // 4727K {0.353211851, 0.357937228}, // 4728K {0.353180258, 0.357913231}, // 4729K {0.353148679, 0.35788924}, // 4730K {0.353117114, 0.357865255}, // 4731K {0.353085563, 0.357841275}, // 4732K {0.353054025, 0.357817301}, // 4733K {0.353022502, 0.357793332}, // 4734K {0.352990992, 0.357769368}, // 4735K {0.352959497, 0.35774541}, // 4736K {0.352928015, 0.357721457}, // 4737K {0.352896546, 0.35769751}, // 4738K {0.352865092, 0.357673568}, // 4739K {0.352833652, 0.357649632}, // 4740K {0.352802225, 0.357625701}, // 4741K {0.352770812, 0.357601776}, // 4742K {0.352739413, 0.357577856}, // 4743K {0.352708028, 0.357553941}, // 4744K {0.352676657, 0.357530032}, // 4745K {0.352645299, 0.357506129}, // 4746K {0.352613955, 0.357482231}, // 4747K {0.352582625, 0.357458338}, // 4748K {0.352551309, 0.357434451}, // 4749K {0.352520006, 0.357410569}, // 4750K {0.352488717, 0.357386693}, // 4751K {0.352457442, 0.357362823}, // 4752K {0.352426181, 0.357338957}, // 4753K {0.352394933, 0.357315098}, // 4754K {0.352363699, 0.357291243}, // 4755K {0.352332479, 0.357267394}, // 4756K {0.352301272, 0.357243551}, // 4757K {0.352270079, 0.357219713}, // 4758K {0.3522389, 0.357195881}, // 4759K {0.352207735, 0.357172054}, // 4760K {0.352176583, 0.357148232}, // 4761K {0.352145445, 0.357124416}, // 4762K {0.35211432, 0.357100606}, // 4763K {0.352083209, 0.357076801}, // 4764K {0.352052112, 0.357053001}, // 4765K {0.352021028, 0.357029207}, // 4766K {0.351989958, 0.357005418}, // 4767K {0.351958902, 0.356981635}, // 4768K {0.351927859, 0.356957857}, // 4769K {0.35189683, 0.356934085}, // 4770K {0.351865815, 0.356910318}, // 4771K {0.351834812, 0.356886557}, // 4772K {0.351803824, 0.356862801}, // 4773K {0.351772849, 0.356839051}, // 4774K {0.351741888, 0.356815306}, // 4775K {0.35171094, 0.356791567}, // 4776K {0.351680006, 0.356767833}, // 4777K {0.351649085, 0.356744105}, // 4778K {0.351618178, 0.356720382}, // 4779K {0.351587285, 0.356696664}, // 4780K {0.351556405, 0.356672952}, // 4781K {0.351525538, 0.356649246}, // 4782K {0.351494685, 0.356625545}, // 4783K {0.351463845, 0.356601849}, // 4784K {0.351433019, 0.356578159}, // 4785K {0.351402207, 0.356554475}, // 4786K {0.351371408, 0.356530796}, // 4787K {0.351340622, 0.356507122}, // 4788K {0.35130985, 0.356483454}, // 4789K {0.351279091, 0.356459792}, // 4790K {0.351248346, 0.356436134}, // 4791K {0.351217614, 0.356412483}, // 4792K {0.351186896, 0.356388837}, // 4793K {0.351156191, 0.356365196}, // 4794K {0.351125499, 0.356341561}, // 4795K {0.351094821, 0.356317931}, // 4796K {0.351064156, 0.356294307}, // 4797K {0.351033505, 0.356270688}, // 4798K {0.351002867, 0.356247075}, // 4799K {0.350972242, 0.356223468}, // 4800K {0.350941631, 0.356199865}, // 4801K {0.350911033, 0.356176269}, // 4802K {0.350880448, 0.356152677}, // 4803K {0.350849877, 0.356129092}, // 4804K {0.35081932, 0.356105511}, // 4805K {0.350788775, 0.356081937}, // 4806K {0.350758244, 0.356058367}, // 4807K {0.350727726, 0.356034804}, // 4808K {0.350697222, 0.356011245}, // 4809K {0.35066673, 0.355987692}, // 4810K {0.350636252, 0.355964145}, // 4811K {0.350605788, 0.355940603}, // 4812K {0.350575336, 0.355917067}, // 4813K {0.350544898, 0.355893536}, // 4814K {0.350514474, 0.355870011}, // 4815K {0.350484062, 0.355846491}, // 4816K {0.350453664, 0.355822977}, // 4817K {0.350423279, 0.355799468}, // 4818K {0.350392907, 0.355775965}, // 4819K {0.350362548, 0.355752467}, // 4820K {0.350332203, 0.355728975}, // 4821K {0.350301871, 0.355705488}, // 4822K {0.350271552, 0.355682006}, // 4823K {0.350241247, 0.355658531}, // 4824K {0.350210954, 0.35563506}, // 4825K {0.350180675, 0.355611595}, // 4826K {0.350150409, 0.355588136}, // 4827K {0.350120156, 0.355564682}, // 4828K {0.350089916, 0.355541234}, // 4829K {0.350059689, 0.355517791}, // 4830K {0.350029476, 0.355494354}, // 4831K {0.349999276, 0.355470922}, // 4832K {0.349969088, 0.355447495}, // 4833K {0.349938914, 0.355424075}, // 4834K {0.349908754, 0.355400659}, // 4835K {0.349878606, 0.355377249}, // 4836K {0.349848471, 0.355353845}, // 4837K {0.34981835, 0.355330446}, // 4838K {0.349788241, 0.355307053}, // 4839K {0.349758146, 0.355283665}, // 4840K {0.349728064, 0.355260283}, // 4841K {0.349697994, 0.355236906}, // 4842K {0.349667938, 0.355213535}, // 4843K {0.349637895, 0.355190169}, // 4844K {0.349607865, 0.355166808}, // 4845K {0.349577848, 0.355143454}, // 4846K {0.349547844, 0.355120104}, // 4847K {0.349517853, 0.355096761}, // 4848K {0.349487876, 0.355073422}, // 4849K {0.349457911, 0.35505009}, // 4850K {0.349427959, 0.355026762}, // 4851K {0.34939802, 0.35500344}, // 4852K {0.349368094, 0.354980124}, // 4853K {0.349338181, 0.354956813}, // 4854K {0.349308282, 0.354933508}, // 4855K {0.349278395, 0.354910208}, // 4856K {0.349248521, 0.354886914}, // 4857K {0.34921866, 0.354863625}, // 4858K {0.349188812, 0.354840342}, // 4859K {0.349158977, 0.354817064}, // 4860K {0.349129155, 0.354793792}, // 4861K {0.349099346, 0.354770526}, // 4862K {0.349069549, 0.354747264}, // 4863K {0.349039766, 0.354724009}, // 4864K {0.349009996, 0.354700758}, // 4865K {0.348980238, 0.354677514}, // 4866K {0.348950494, 0.354654275}, // 4867K {0.348920762, 0.354631041}, // 4868K {0.348891043, 0.354607813}, // 4869K {0.348861337, 0.35458459}, // 4870K {0.348831644, 0.354561373}, // 4871K {0.348801964, 0.354538161}, // 4872K {0.348772297, 0.354514955}, // 4873K {0.348742642, 0.354491755}, // 4874K {0.348713001, 0.35446856}, // 4875K {0.348683372, 0.35444537}, // 4876K {0.348653756, 0.354422186}, // 4877K {0.348624153, 0.354399007}, // 4878K {0.348594562, 0.354375834}, // 4879K {0.348564985, 0.354352667}, // 4880K {0.34853542, 0.354329505}, // 4881K {0.348505868, 0.354306348}, // 4882K {0.348476329, 0.354283197}, // 4883K {0.348446803, 0.354260052}, // 4884K {0.348417289, 0.354236912}, // 4885K {0.348387789, 0.354213777}, // 4886K {0.348358301, 0.354190648}, // 4887K {0.348328825, 0.354167525}, // 4888K {0.348299363, 0.354144407}, // 4889K {0.348269913, 0.354121294}, // 4890K {0.348240476, 0.354098188}, // 4891K {0.348211052, 0.354075086}, // 4892K {0.34818164, 0.35405199}, // 4893K {0.348152241, 0.3540289}, // 4894K {0.348122855, 0.354005815}, // 4895K {0.348093481, 0.353982736}, // 4896K {0.348064121, 0.353959662}, // 4897K {0.348034772, 0.353936593}, // 4898K {0.348005437, 0.353913531}, // 4899K {0.347976114, 0.353890473}, // 4900K {0.347946804, 0.353867421}, // 4901K {0.347917507, 0.353844375}, // 4902K {0.347888222, 0.353821334}, // 4903K {0.34785895, 0.353798299}, // 4904K {0.34782969, 0.353775269}, // 4905K {0.347800443, 0.353752245}, // 4906K {0.347771209, 0.353729226}, // 4907K {0.347741988, 0.353706213}, // 4908K {0.347712778, 0.353683206}, // 4909K {0.347683582, 0.353660203}, // 4910K {0.347654398, 0.353637207}, // 4911K {0.347625227, 0.353614216}, // 4912K {0.347596068, 0.35359123}, // 4913K {0.347566922, 0.35356825}, // 4914K {0.347537789, 0.353545275}, // 4915K {0.347508668, 0.353522306}, // 4916K {0.347479559, 0.353499342}, // 4917K {0.347450464, 0.353476384}, // 4918K {0.34742138, 0.353453432}, // 4919K {0.347392309, 0.353430485}, // 4920K {0.347363251, 0.353407543}, // 4921K {0.347334206, 0.353384607}, // 4922K {0.347305172, 0.353361677}, // 4923K {0.347276152, 0.353338752}, // 4924K {0.347247143, 0.353315832}, // 4925K {0.347218148, 0.353292918}, // 4926K {0.347189164, 0.35327001}, // 4927K {0.347160194, 0.353247107}, // 4928K {0.347131235, 0.353224209}, // 4929K {0.34710229, 0.353201317}, // 4930K {0.347073356, 0.353178431}, // 4931K {0.347044435, 0.35315555}, // 4932K {0.347015527, 0.353132675}, // 4933K {0.346986631, 0.353109805}, // 4934K {0.346957747, 0.35308694}, // 4935K {0.346928876, 0.353064082}, // 4936K {0.346900018, 0.353041228}, // 4937K {0.346871171, 0.35301838}, // 4938K {0.346842337, 0.352995538}, // 4939K {0.346813516, 0.352972701}, // 4940K {0.346784707, 0.35294987}, // 4941K {0.34675591, 0.352927044}, // 4942K {0.346727126, 0.352904224}, // 4943K {0.346698354, 0.352881409}, // 4944K {0.346669594, 0.3528586}, // 4945K {0.346640847, 0.352835796}, // 4946K {0.346612112, 0.352812998}, // 4947K {0.34658339, 0.352790205}, // 4948K {0.346554679, 0.352767418}, // 4949K {0.346525982, 0.352744637}, // 4950K {0.346497296, 0.35272186}, // 4951K {0.346468623, 0.35269909}, // 4952K {0.346439962, 0.352676325}, // 4953K {0.346411313, 0.352653565}, // 4954K {0.346382677, 0.352630811}, // 4955K {0.346354053, 0.352608062}, // 4956K {0.346325441, 0.352585319}, // 4957K {0.346296842, 0.352562582}, // 4958K {0.346268255, 0.35253985}, // 4959K {0.34623968, 0.352517123}, // 4960K {0.346211117, 0.352494402}, // 4961K {0.346182567, 0.352471687}, // 4962K {0.346154029, 0.352448977}, // 4963K {0.346125503, 0.352426272}, // 4964K {0.346096989, 0.352403573}, // 4965K {0.346068488, 0.35238088}, // 4966K {0.346039998, 0.352358192}, // 4967K {0.346011521, 0.352335509}, // 4968K {0.345983057, 0.352312832}, // 4969K {0.345954604, 0.352290161}, // 4970K {0.345926163, 0.352267495}, // 4971K {0.345897735, 0.352244834}, // 4972K {0.345869319, 0.35222218}, // 4973K {0.345840915, 0.35219953}, // 4974K {0.345812524, 0.352176886}, // 4975K {0.345784144, 0.352154248}, // 4976K {0.345755777, 0.352131615}, // 4977K {0.345727422, 0.352108988}, // 4978K {0.345699078, 0.352086366}, // 4979K {0.345670747, 0.352063749}, // 4980K {0.345642429, 0.352041139}, // 4981K {0.345614122, 0.352018533}, // 4982K {0.345585827, 0.351995934}, // 4983K {0.345557545, 0.351973339}, // 4984K {0.345529274, 0.35195075}, // 4985K {0.345501016, 0.351928167}, // 4986K {0.34547277, 0.351905589}, // 4987K {0.345444536, 0.351883017}, // 4988K {0.345416314, 0.35186045}, // 4989K {0.345388104, 0.351837889}, // 4990K {0.345359906, 0.351815333}, // 4991K {0.34533172, 0.351792783}, // 4992K {0.345303546, 0.351770238}, // 4993K {0.345275385, 0.351747699}, // 4994K {0.345247235, 0.351725165}, // 4995K {0.345219097, 0.351702637}, // 4996K {0.345190971, 0.351680114}, // 4997K {0.345162858, 0.351657597}, // 4998K {0.345134756, 0.351635086}, // 4999K {0.345106666, 0.351612579}, // 5000K {0.345078589, 0.351590079}, // 5001K {0.345050523, 0.351567583}, // 5002K {0.34502247, 0.351545094}, // 5003K {0.344994428, 0.35152261}, // 5004K {0.344966398, 0.351500131}, // 5005K {0.34493838, 0.351477658}, // 5006K {0.344910375, 0.35145519}, // 5007K {0.344882381, 0.351432728}, // 5008K {0.344854399, 0.351410271}, // 5009K {0.344826429, 0.35138782}, // 5010K {0.344798471, 0.351365375}, // 5011K {0.344770525, 0.351342934}, // 5012K {0.344742591, 0.3513205}, // 5013K {0.344714668, 0.351298071}, // 5014K {0.344686758, 0.351275647}, // 5015K {0.34465886, 0.351253229}, // 5016K {0.344630973, 0.351230816}, // 5017K {0.344603098, 0.351208409}, // 5018K {0.344575236, 0.351186007}, // 5019K {0.344547385, 0.351163611}, // 5020K {0.344519546, 0.351141221}, // 5021K {0.344491718, 0.351118836}, // 5022K {0.344463903, 0.351096456}, // 5023K {0.3444361, 0.351074082}, // 5024K {0.344408308, 0.351051713}, // 5025K {0.344380528, 0.35102935}, // 5026K {0.34435276, 0.351006992}, // 5027K {0.344325004, 0.35098464}, // 5028K {0.34429726, 0.350962294}, // 5029K {0.344269527, 0.350939953}, // 5030K {0.344241807, 0.350917617}, // 5031K {0.344214098, 0.350895287}, // 5032K {0.344186401, 0.350872962}, // 5033K {0.344158715, 0.350850643}, // 5034K {0.344131042, 0.350828329}, // 5035K {0.34410338, 0.350806021}, // 5036K {0.34407573, 0.350783719}, // 5037K {0.344048092, 0.350761421}, // 5038K {0.344020465, 0.35073913}, // 5039K {0.343992851, 0.350716844}, // 5040K {0.343965248, 0.350694563}, // 5041K {0.343937656, 0.350672288}, // 5042K {0.343910077, 0.350650018}, // 5043K {0.343882509, 0.350627754}, // 5044K {0.343854953, 0.350605495}, // 5045K {0.343827409, 0.350583242}, // 5046K {0.343799876, 0.350560994}, // 5047K {0.343772355, 0.350538752}, // 5048K {0.343744846, 0.350516516}, // 5049K {0.343717348, 0.350494284}, // 5050K {0.343689862, 0.350472059}, // 5051K {0.343662388, 0.350449838}, // 5052K {0.343634925, 0.350427624}, // 5053K {0.343607474, 0.350405414}, // 5054K {0.343580035, 0.350383211}, // 5055K {0.343552608, 0.350361012}, // 5056K {0.343525192, 0.35033882}, // 5057K {0.343497787, 0.350316632}, // 5058K {0.343470395, 0.350294451}, // 5059K {0.343443013, 0.350272274}, // 5060K {0.343415644, 0.350250103}, // 5061K {0.343388286, 0.350227938}, // 5062K {0.34336094, 0.350205778}, // 5063K {0.343333605, 0.350183624}, // 5064K {0.343306282, 0.350161475}, // 5065K {0.343278971, 0.350139332}, // 5066K {0.343251671, 0.350117194}, // 5067K {0.343224382, 0.350095061}, // 5068K {0.343197106, 0.350072934}, // 5069K {0.343169841, 0.350050813}, // 5070K {0.343142587, 0.350028697}, // 5071K {0.343115345, 0.350006587}, // 5072K {0.343088114, 0.349984482}, // 5073K {0.343060895, 0.349962382}, // 5074K {0.343033688, 0.349940288}, // 5075K {0.343006492, 0.3499182}, // 5076K {0.342979307, 0.349896117}, // 5077K {0.342952134, 0.349874039}, // 5078K {0.342924973, 0.349851967}, // 5079K {0.342897823, 0.3498299}, // 5080K {0.342870685, 0.349807839}, // 5081K {0.342843558, 0.349785784}, // 5082K {0.342816442, 0.349763734}, // 5083K {0.342789338, 0.349741689}, // 5084K {0.342762246, 0.34971965}, // 5085K {0.342735165, 0.349697616}, // 5086K {0.342708095, 0.349675588}, // 5087K {0.342681037, 0.349653565}, // 5088K {0.34265399, 0.349631548}, // 5089K {0.342626955, 0.349609536}, // 5090K {0.342599931, 0.34958753}, // 5091K {0.342572918, 0.349565529}, // 5092K {0.342545917, 0.349543534}, // 5093K {0.342518928, 0.349521544}, // 5094K {0.34249195, 0.349499559}, // 5095K {0.342464983, 0.34947758}, // 5096K {0.342438027, 0.349455607}, // 5097K {0.342411083, 0.349433639}, // 5098K {0.342384151, 0.349411677}, // 5099K {0.34235723, 0.34938972}, // 5100K {0.34233032, 0.349367768}, // 5101K {0.342303421, 0.349345822}, // 5102K {0.342276534, 0.349323881}, // 5103K {0.342249658, 0.349301946}, // 5104K {0.342222794, 0.349280017}, // 5105K {0.342195941, 0.349258092}, // 5106K {0.342169099, 0.349236174}, // 5107K {0.342142268, 0.34921426}, // 5108K {0.342115449, 0.349192353}, // 5109K {0.342088641, 0.34917045}, // 5110K {0.342061845, 0.349148554}, // 5111K {0.34203506, 0.349126662}, // 5112K {0.342008286, 0.349104776}, // 5113K {0.341981523, 0.349082896}, // 5114K {0.341954772, 0.349061021}, // 5115K {0.341928032, 0.349039152}, // 5116K {0.341901303, 0.349017287}, // 5117K {0.341874585, 0.348995429}, // 5118K {0.341847879, 0.348973576}, // 5119K {0.341821184, 0.348951728}, // 5120K {0.3417945, 0.348929886}, // 5121K {0.341767828, 0.348908049}, // 5122K {0.341741166, 0.348886218}, // 5123K {0.341714516, 0.348864392}, // 5124K {0.341687878, 0.348842572}, // 5125K {0.34166125, 0.348820757}, // 5126K {0.341634634, 0.348798948}, // 5127K {0.341608028, 0.348777144}, // 5128K {0.341581434, 0.348755346}, // 5129K {0.341554852, 0.348733553}, // 5130K {0.34152828, 0.348711765}, // 5131K {0.34150172, 0.348689983}, // 5132K {0.34147517, 0.348668206}, // 5133K {0.341448632, 0.348646435}, // 5134K {0.341422105, 0.34862467}, // 5135K {0.34139559, 0.348602909}, // 5136K {0.341369085, 0.348581155}, // 5137K {0.341342591, 0.348559405}, // 5138K {0.341316109, 0.348537661}, // 5139K {0.341289638, 0.348515923}, // 5140K {0.341263178, 0.34849419}, // 5141K {0.341236729, 0.348472463}, // 5142K {0.341210291, 0.348450741}, // 5143K {0.341183864, 0.348429024}, // 5144K {0.341157449, 0.348407313}, // 5145K {0.341131044, 0.348385607}, // 5146K {0.341104651, 0.348363907}, // 5147K {0.341078269, 0.348342212}, // 5148K {0.341051897, 0.348320523}, // 5149K {0.341025537, 0.348298839}, // 5150K {0.340999188, 0.348277161}, // 5151K {0.34097285, 0.348255488}, // 5152K {0.340946523, 0.34823382}, // 5153K {0.340920207, 0.348212158}, // 5154K {0.340893902, 0.348190502}, // 5155K {0.340867609, 0.34816885}, // 5156K {0.340841326, 0.348147205}, // 5157K {0.340815054, 0.348125564}, // 5158K {0.340788793, 0.34810393}, // 5159K {0.340762544, 0.3480823}, // 5160K {0.340736305, 0.348060676}, // 5161K {0.340710077, 0.348039058}, // 5162K {0.34068386, 0.348017445}, // 5163K {0.340657655, 0.347995837}, // 5164K {0.34063146, 0.347974235}, // 5165K {0.340605276, 0.347952638}, // 5166K {0.340579103, 0.347931047}, // 5167K {0.340552942, 0.347909461}, // 5168K {0.340526791, 0.347887881}, // 5169K {0.340500651, 0.347866306}, // 5170K {0.340474522, 0.347844736}, // 5171K {0.340448404, 0.347823172}, // 5172K {0.340422297, 0.347801614}, // 5173K {0.340396201, 0.347780061}, // 5174K {0.340370116, 0.347758513}, // 5175K {0.340344041, 0.34773697}, // 5176K {0.340317978, 0.347715434}, // 5177K {0.340291926, 0.347693902}, // 5178K {0.340265884, 0.347672376}, // 5179K {0.340239853, 0.347650856}, // 5180K {0.340213834, 0.34762934}, // 5181K {0.340187825, 0.347607831}, // 5182K {0.340161827, 0.347586326}, // 5183K {0.34013584, 0.347564828}, // 5184K {0.340109864, 0.347543334}, // 5185K {0.340083898, 0.347521846}, // 5186K {0.340057944, 0.347500364}, // 5187K {0.340032, 0.347478887}, // 5188K {0.340006067, 0.347457415}, // 5189K {0.339980145, 0.347435949}, // 5190K {0.339954234, 0.347414488}, // 5191K {0.339928334, 0.347393033}, // 5192K {0.339902444, 0.347371583}, // 5193K {0.339876566, 0.347350138}, // 5194K {0.339850698, 0.347328699}, // 5195K {0.339824841, 0.347307265}, // 5196K {0.339798995, 0.347285837}, // 5197K {0.339773159, 0.347264414}, // 5198K {0.339747335, 0.347242997}, // 5199K {0.339721521, 0.347221585}, // 5200K {0.339695718, 0.347200178}, // 5201K {0.339669925, 0.347178777}, // 5202K {0.339644144, 0.347157381}, // 5203K {0.339618373, 0.347135991}, // 5204K {0.339592613, 0.347114606}, // 5205K {0.339566864, 0.347093227}, // 5206K {0.339541125, 0.347071853}, // 5207K {0.339515398, 0.347050484}, // 5208K {0.339489681, 0.347029121}, // 5209K {0.339463974, 0.347007763}, // 5210K {0.339438279, 0.346986411}, // 5211K {0.339412594, 0.346965064}, // 5212K {0.33938692, 0.346943722}, // 5213K {0.339361256, 0.346922386}, // 5214K {0.339335603, 0.346901055}, // 5215K {0.339309961, 0.34687973}, // 5216K {0.33928433, 0.34685841}, // 5217K {0.339258709, 0.346837096}, // 5218K {0.339233099, 0.346815787}, // 5219K {0.3392075, 0.346794483}, // 5220K {0.339181911, 0.346773185}, // 5221K {0.339156333, 0.346751892}, // 5222K {0.339130765, 0.346730605}, // 5223K {0.339105209, 0.346709322}, // 5224K {0.339079663, 0.346688046}, // 5225K {0.339054127, 0.346666775}, // 5226K {0.339028602, 0.346645509}, // 5227K {0.339003088, 0.346624249}, // 5228K {0.338977584, 0.346602994}, // 5229K {0.338952092, 0.346581744}, // 5230K {0.338926609, 0.3465605}, // 5231K {0.338901137, 0.346539261}, // 5232K {0.338875676, 0.346518028}, // 5233K {0.338850226, 0.3464968}, // 5234K {0.338824786, 0.346475577}, // 5235K {0.338799356, 0.34645436}, // 5236K {0.338773937, 0.346433148}, // 5237K {0.338748529, 0.346411942}, // 5238K {0.338723131, 0.346390741}, // 5239K {0.338697744, 0.346369545}, // 5240K {0.338672368, 0.346348355}, // 5241K {0.338647001, 0.34632717}, // 5242K {0.338621646, 0.346305991}, // 5243K {0.338596301, 0.346284817}, // 5244K {0.338570966, 0.346263649}, // 5245K {0.338545643, 0.346242485}, // 5246K {0.338520329, 0.346221328}, // 5247K {0.338495026, 0.346200175}, // 5248K {0.338469734, 0.346179028}, // 5249K {0.338444452, 0.346157887}, // 5250K {0.338419181, 0.34613675}, // 5251K {0.33839392, 0.34611562}, // 5252K {0.338368669, 0.346094494}, // 5253K {0.338343429, 0.346073374}, // 5254K {0.3383182, 0.346052259}, // 5255K {0.338292981, 0.34603115}, // 5256K {0.338267772, 0.346010046}, // 5257K {0.338242574, 0.345988948}, // 5258K {0.338217386, 0.345967855}, // 5259K {0.338192209, 0.345946767}, // 5260K {0.338167043, 0.345925685}, // 5261K {0.338141886, 0.345904608}, // 5262K {0.33811674, 0.345883536}, // 5263K {0.338091605, 0.34586247}, // 5264K {0.33806648, 0.345841409}, // 5265K {0.338041365, 0.345820353}, // 5266K {0.338016261, 0.345799303}, // 5267K {0.337991167, 0.345778259}, // 5268K {0.337966084, 0.345757219}, // 5269K {0.337941011, 0.345736186}, // 5270K {0.337915948, 0.345715157}, // 5271K {0.337890896, 0.345694134}, // 5272K {0.337865854, 0.345673116}, // 5273K {0.337840822, 0.345652104}, // 5274K {0.337815801, 0.345631097}, // 5275K {0.33779079, 0.345610095}, // 5276K {0.33776579, 0.345589099}, // 5277K {0.3377408, 0.345568108}, // 5278K {0.33771582, 0.345547122}, // 5279K {0.33769085, 0.345526142}, // 5280K {0.337665891, 0.345505167}, // 5281K {0.337640943, 0.345484198}, // 5282K {0.337616004, 0.345463234}, // 5283K {0.337591076, 0.345442275}, // 5284K {0.337566158, 0.345421321}, // 5285K {0.337541251, 0.345400373}, // 5286K {0.337516353, 0.345379431}, // 5287K {0.337491466, 0.345358494}, // 5288K {0.33746659, 0.345337562}, // 5289K {0.337441723, 0.345316635}, // 5290K {0.337416867, 0.345295714}, // 5291K {0.337392021, 0.345274798}, // 5292K {0.337367186, 0.345253888}, // 5293K {0.33734236, 0.345232983}, // 5294K {0.337317545, 0.345212083}, // 5295K {0.337292741, 0.345191189}, // 5296K {0.337267946, 0.3451703}, // 5297K {0.337243162, 0.345149416}, // 5298K {0.337218388, 0.345128538}, // 5299K {0.337193624, 0.345107665}, // 5300K {0.33716887, 0.345086797}, // 5301K {0.337144127, 0.345065935}, // 5302K {0.337119393, 0.345045078}, // 5303K {0.33709467, 0.345024227}, // 5304K {0.337069958, 0.34500338}, // 5305K {0.337045255, 0.34498254}, // 5306K {0.337020562, 0.344961704}, // 5307K {0.33699588, 0.344940874}, // 5308K {0.336971208, 0.344920049}, // 5309K {0.336946546, 0.34489923}, // 5310K {0.336921894, 0.344878416}, // 5311K {0.336897253, 0.344857607}, // 5312K {0.336872621, 0.344836804}, // 5313K {0.336848, 0.344816006}, // 5314K {0.336823389, 0.344795213}, // 5315K {0.336798788, 0.344774426}, // 5316K {0.336774197, 0.344753644}, // 5317K {0.336749617, 0.344732867}, // 5318K {0.336725046, 0.344712096}, // 5319K {0.336700485, 0.34469133}, // 5320K {0.336675935, 0.344670569}, // 5321K {0.336651395, 0.344649814}, // 5322K {0.336626865, 0.344629064}, // 5323K {0.336602345, 0.344608319}, // 5324K {0.336577835, 0.34458758}, // 5325K {0.336553335, 0.344566846}, // 5326K {0.336528845, 0.344546117}, // 5327K {0.336504365, 0.344525394}, // 5328K {0.336479896, 0.344504676}, // 5329K {0.336455436, 0.344483964}, // 5330K {0.336430987, 0.344463256}, // 5331K {0.336406547, 0.344442554}, // 5332K {0.336382118, 0.344421858}, // 5333K {0.336357698, 0.344401166}, // 5334K {0.336333289, 0.34438048}, // 5335K {0.33630889, 0.3443598}, // 5336K {0.336284501, 0.344339125}, // 5337K {0.336260121, 0.344318455}, // 5338K {0.336235752, 0.34429779}, // 5339K {0.336211393, 0.344277131}, // 5340K {0.336187044, 0.344256477}, // 5341K {0.336162704, 0.344235828}, // 5342K {0.336138375, 0.344215185}, // 5343K {0.336114056, 0.344194547}, // 5344K {0.336089747, 0.344173914}, // 5345K {0.336065448, 0.344153286}, // 5346K {0.336041158, 0.344132664}, // 5347K {0.336016879, 0.344112048}, // 5348K {0.33599261, 0.344091436}, // 5349K {0.33596835, 0.34407083}, // 5350K {0.335944101, 0.344050229}, // 5351K {0.335919861, 0.344029634}, // 5352K {0.335895632, 0.344009044}, // 5353K {0.335871412, 0.343988459}, // 5354K {0.335847203, 0.343967879}, // 5355K {0.335823003, 0.343947305}, // 5356K {0.335798813, 0.343926736}, // 5357K {0.335774633, 0.343906172}, // 5358K {0.335750463, 0.343885614}, // 5359K {0.335726303, 0.343865061}, // 5360K {0.335702153, 0.343844513}, // 5361K {0.335678013, 0.343823971}, // 5362K {0.335653883, 0.343803434}, // 5363K {0.335629762, 0.343782902}, // 5364K {0.335605651, 0.343762376}, // 5365K {0.335581551, 0.343741855}, // 5366K {0.33555746, 0.343721339}, // 5367K {0.335533379, 0.343700828}, // 5368K {0.335509308, 0.343680323}, // 5369K {0.335485247, 0.343659823}, // 5370K {0.335461195, 0.343639328}, // 5371K {0.335437154, 0.343618839}, // 5372K {0.335413122, 0.343598355}, // 5373K {0.3353891, 0.343577876}, // 5374K {0.335365088, 0.343557403}, // 5375K {0.335341086, 0.343536934}, // 5376K {0.335317093, 0.343516472}, // 5377K {0.335293111, 0.343496014}, // 5378K {0.335269138, 0.343475562}, // 5379K {0.335245175, 0.343455115}, // 5380K {0.335221222, 0.343434673}, // 5381K {0.335197278, 0.343414237}, // 5382K {0.335173345, 0.343393805}, // 5383K {0.335149421, 0.34337338}, // 5384K {0.335125507, 0.343352959}, // 5385K {0.335101603, 0.343332544}, // 5386K {0.335077708, 0.343312134}, // 5387K {0.335053823, 0.343291729}, // 5388K {0.335029948, 0.34327133}, // 5389K {0.335006083, 0.343250936}, // 5390K {0.334982228, 0.343230547}, // 5391K {0.334958382, 0.343210163}, // 5392K {0.334934546, 0.343189785}, // 5393K {0.33491072, 0.343169412}, // 5394K {0.334886903, 0.343149044}, // 5395K {0.334863096, 0.343128682}, // 5396K {0.334839299, 0.343108325}, // 5397K {0.334815512, 0.343087973}, // 5398K {0.334791734, 0.343067626}, // 5399K {0.334767966, 0.343047285}, // 5400K {0.334744208, 0.343026949}, // 5401K {0.334720459, 0.343006618}, // 5402K {0.334696721, 0.342986292}, // 5403K {0.334672991, 0.342965972}, // 5404K {0.334649272, 0.342945657}, // 5405K {0.334625562, 0.342925348}, // 5406K {0.334601862, 0.342905043}, // 5407K {0.334578171, 0.342884744}, // 5408K {0.33455449, 0.34286445}, // 5409K {0.334530819, 0.342844161}, // 5410K {0.334507157, 0.342823878}, // 5411K {0.334483505, 0.3428036}, // 5412K {0.334459863, 0.342783327}, // 5413K {0.33443623, 0.342763059}, // 5414K {0.334412607, 0.342742797}, // 5415K {0.334388994, 0.34272254}, // 5416K {0.33436539, 0.342702288}, // 5417K {0.334341796, 0.342682042}, // 5418K {0.334318211, 0.3426618}, // 5419K {0.334294636, 0.342641564}, // 5420K {0.334271071, 0.342621334}, // 5421K {0.334247515, 0.342601108}, // 5422K {0.334223969, 0.342580888}, // 5423K {0.334200432, 0.342560673}, // 5424K {0.334176905, 0.342540463}, // 5425K {0.334153388, 0.342520259}, // 5426K {0.33412988, 0.342500059}, // 5427K {0.334106381, 0.342479865}, // 5428K {0.334082893, 0.342459677}, // 5429K {0.334059413, 0.342439493}, // 5430K {0.334035944, 0.342419315}, // 5431K {0.334012483, 0.342399142}, // 5432K {0.333989033, 0.342378974}, // 5433K {0.333965592, 0.342358812}, // 5434K {0.33394216, 0.342338654}, // 5435K {0.333918738, 0.342318502}, // 5436K {0.333895325, 0.342298356}, // 5437K {0.333871922, 0.342278214}, // 5438K {0.333848529, 0.342258078}, // 5439K {0.333825145, 0.342237947}, // 5440K {0.33380177, 0.342217821}, // 5441K {0.333778405, 0.3421977}, // 5442K {0.33375505, 0.342177585}, // 5443K {0.333731703, 0.342157475}, // 5444K {0.333708367, 0.34213737}, // 5445K {0.33368504, 0.34211727}, // 5446K {0.333661722, 0.342097176}, // 5447K {0.333638414, 0.342077087}, // 5448K {0.333615115, 0.342057003}, // 5449K {0.333591826, 0.342036924}, // 5450K {0.333568546, 0.342016851}, // 5451K {0.333545275, 0.341996782}, // 5452K {0.333522014, 0.341976719}, // 5453K {0.333498763, 0.341956661}, // 5454K {0.333475521, 0.341936609}, // 5455K {0.333452288, 0.341916561}, // 5456K {0.333429065, 0.341896519}, // 5457K {0.333405851, 0.341876482}, // 5458K {0.333382646, 0.341856451}, // 5459K {0.333359451, 0.341836424}, // 5460K {0.333336266, 0.341816403}, // 5461K {0.333313089, 0.341796387}, // 5462K {0.333289923, 0.341776376}, // 5463K {0.333266765, 0.341756371}, // 5464K {0.333243617, 0.34173637}, // 5465K {0.333220478, 0.341716375}, // 5466K {0.333197349, 0.341696385}, // 5467K {0.333174229, 0.3416764}, // 5468K {0.333151118, 0.341656421}, // 5469K {0.333128017, 0.341636447}, // 5470K {0.333104925, 0.341616477}, // 5471K {0.333081842, 0.341596514}, // 5472K {0.333058769, 0.341576555}, // 5473K {0.333035705, 0.341556601}, // 5474K {0.33301265, 0.341536653}, // 5475K {0.332989605, 0.34151671}, // 5476K {0.332966569, 0.341496772}, // 5477K {0.332943542, 0.34147684}, // 5478K {0.332920525, 0.341456912}, // 5479K {0.332897517, 0.34143699}, // 5480K {0.332874518, 0.341417073}, // 5481K {0.332851529, 0.341397161}, // 5482K {0.332828548, 0.341377254}, // 5483K {0.332805578, 0.341357353}, // 5484K {0.332782616, 0.341337457}, // 5485K {0.332759664, 0.341317566}, // 5486K {0.332736721, 0.34129768}, // 5487K {0.332713787, 0.341277799}, // 5488K {0.332690862, 0.341257924}, // 5489K {0.332667947, 0.341238053}, // 5490K {0.332645041, 0.341218188}, // 5491K {0.332622144, 0.341198328}, // 5492K {0.332599257, 0.341178474}, // 5493K {0.332576378, 0.341158624}, // 5494K {0.332553509, 0.34113878}, // 5495K {0.332530649, 0.341118941}, // 5496K {0.332507799, 0.341099107}, // 5497K {0.332484957, 0.341079278}, // 5498K {0.332462125, 0.341059454}, // 5499K {0.332439302, 0.341039636}, // 5500K {0.332416488, 0.341019823}, // 5501K {0.332393684, 0.341000015}, // 5502K {0.332370888, 0.340980212}, // 5503K {0.332348102, 0.340960414}, // 5504K {0.332325325, 0.340940622}, // 5505K {0.332302557, 0.340920834}, // 5506K {0.332279799, 0.340901052}, // 5507K {0.332257049, 0.340881275}, // 5508K {0.332234309, 0.340861503}, // 5509K {0.332211578, 0.340841737}, // 5510K {0.332188855, 0.340821975}, // 5511K {0.332166143, 0.340802219}, // 5512K {0.332143439, 0.340782468}, // 5513K {0.332120744, 0.340762722}, // 5514K {0.332098059, 0.340742981}, // 5515K {0.332075383, 0.340723246}, // 5516K {0.332052715, 0.340703515}, // 5517K {0.332030057, 0.34068379}, // 5518K {0.332007408, 0.34066407}, // 5519K {0.331984768, 0.340644355}, // 5520K {0.331962138, 0.340624645}, // 5521K {0.331939516, 0.340604941}, // 5522K {0.331916904, 0.340585241}, // 5523K {0.3318943, 0.340565547}, // 5524K {0.331871706, 0.340545858}, // 5525K {0.331849121, 0.340526174}, // 5526K {0.331826544, 0.340506495}, // 5527K {0.331803977, 0.340486821}, // 5528K {0.331781419, 0.340467153}, // 5529K {0.33175887, 0.340447489}, // 5530K {0.33173633, 0.340427831}, // 5531K {0.331713799, 0.340408178}, // 5532K {0.331691278, 0.34038853}, // 5533K {0.331668765, 0.340368887}, // 5534K {0.331646261, 0.34034925}, // 5535K {0.331623766, 0.340329617}, // 5536K {0.331601281, 0.34030999}, // 5537K {0.331578804, 0.340290368}, // 5538K {0.331556337, 0.340270751}, // 5539K {0.331533878, 0.340251139}, // 5540K {0.331511428, 0.340231532}, // 5541K {0.331488988, 0.340211931}, // 5542K {0.331466556, 0.340192334}, // 5543K {0.331444134, 0.340172743}, // 5544K {0.33142172, 0.340153157}, // 5545K {0.331399316, 0.340133576}, // 5546K {0.33137692, 0.340114}, // 5547K {0.331354533, 0.340094429}, // 5548K {0.331332156, 0.340074863}, // 5549K {0.331309787, 0.340055303}, // 5550K {0.331287427, 0.340035748}, // 5551K {0.331265077, 0.340016197}, // 5552K {0.331242735, 0.339996652}, // 5553K {0.331220402, 0.339977112}, // 5554K {0.331198078, 0.339957577}, // 5555K {0.331175763, 0.339938048}, // 5556K {0.331153457, 0.339918523}, // 5557K {0.33113116, 0.339899004}, // 5558K {0.331108872, 0.339879489}, // 5559K {0.331086593, 0.33985998}, // 5560K {0.331064323, 0.339840476}, // 5561K {0.331042061, 0.339820977}, // 5562K {0.331019809, 0.339801483}, // 5563K {0.330997565, 0.339781995}, // 5564K {0.330975331, 0.339762511}, // 5565K {0.330953105, 0.339743033}, // 5566K {0.330930888, 0.339723559}, // 5567K {0.33090868, 0.339704091}, // 5568K {0.330886481, 0.339684628}, // 5569K {0.330864291, 0.33966517}, // 5570K {0.330842109, 0.339645717}, // 5571K {0.330819937, 0.339626269}, // 5572K {0.330797773, 0.339606826}, // 5573K {0.330775619, 0.339587389}, // 5574K {0.330753473, 0.339567956}, // 5575K {0.330731336, 0.339548529}, // 5576K {0.330709208, 0.339529107}, // 5577K {0.330687088, 0.33950969}, // 5578K {0.330664978, 0.339490278}, // 5579K {0.330642876, 0.339470871}, // 5580K {0.330620783, 0.339451469}, // 5581K {0.330598699, 0.339432072}, // 5582K {0.330576624, 0.33941268}, // 5583K {0.330554558, 0.339393294}, // 5584K {0.3305325, 0.339373912}, // 5585K {0.330510451, 0.339354536}, // 5586K {0.330488411, 0.339335165}, // 5587K {0.33046638, 0.339315799}, // 5588K {0.330444358, 0.339296438}, // 5589K {0.330422344, 0.339277082}, // 5590K {0.330400339, 0.339257731}, // 5591K {0.330378343, 0.339238385}, // 5592K {0.330356356, 0.339219044}, // 5593K {0.330334378, 0.339199709}, // 5594K {0.330312408, 0.339180378}, // 5595K {0.330290447, 0.339161053}, // 5596K {0.330268495, 0.339141732}, // 5597K {0.330246551, 0.339122417}, // 5598K {0.330224617, 0.339103107}, // 5599K {0.330202691, 0.339083802}, // 5600K {0.330180773, 0.339064502}, // 5601K {0.330158865, 0.339045207}, // 5602K {0.330136965, 0.339025917}, // 5603K {0.330115074, 0.339006632}, // 5604K {0.330093192, 0.338987353}, // 5605K {0.330071318, 0.338968078}, // 5606K {0.330049453, 0.338948809}, // 5607K {0.330027597, 0.338929544}, // 5608K {0.33000575, 0.338910285}, // 5609K {0.329983911, 0.33889103}, // 5610K {0.329962081, 0.338871781}, // 5611K {0.329940259, 0.338852537}, // 5612K {0.329918447, 0.338833298}, // 5613K {0.329896643, 0.338814064}, // 5614K {0.329874847, 0.338794835}, // 5615K {0.329853061, 0.338775611}, // 5616K {0.329831283, 0.338756392}, // 5617K {0.329809513, 0.338737178}, // 5618K {0.329787752, 0.33871797}, // 5619K {0.329766, 0.338698766}, // 5620K {0.329744257, 0.338679567}, // 5621K {0.329722522, 0.338660374}, // 5622K {0.329700796, 0.338641186}, // 5623K {0.329679079, 0.338622002}, // 5624K {0.32965737, 0.338602824}, // 5625K {0.329635669, 0.33858365}, // 5626K {0.329613978, 0.338564482}, // 5627K {0.329592295, 0.338545319}, // 5628K {0.32957062, 0.338526161}, // 5629K {0.329548955, 0.338507008}, // 5630K {0.329527298, 0.33848786}, // 5631K {0.329505649, 0.338468717}, // 5632K {0.329484009, 0.338449579}, // 5633K {0.329462378, 0.338430446}, // 5634K {0.329440755, 0.338411318}, // 5635K {0.329419141, 0.338392195}, // 5636K {0.329397535, 0.338373078}, // 5637K {0.329375938, 0.338353965}, // 5638K {0.329354349, 0.338334857}, // 5639K {0.329332769, 0.338315755}, // 5640K {0.329311198, 0.338296657}, // 5641K {0.329289635, 0.338277564}, // 5642K {0.329268081, 0.338258477}, // 5643K {0.329246535, 0.338239394}, // 5644K {0.329224998, 0.338220317}, // 5645K {0.329203469, 0.338201245}, // 5646K {0.329181949, 0.338182177}, // 5647K {0.329160438, 0.338163115}, // 5648K {0.329138935, 0.338144058}, // 5649K {0.32911744, 0.338125005}, // 5650K {0.329095954, 0.338105958}, // 5651K {0.329074476, 0.338086916}, // 5652K {0.329053007, 0.338067879}, // 5653K {0.329031547, 0.338048847}, // 5654K {0.329010095, 0.338029819}, // 5655K {0.328988651, 0.338010797}, // 5656K {0.328967216, 0.33799178}, // 5657K {0.32894579, 0.337972768}, // 5658K {0.328924372, 0.337953761}, // 5659K {0.328902962, 0.337934759}, // 5660K {0.328881561, 0.337915762}, // 5661K {0.328860168, 0.33789677}, // 5662K {0.328838784, 0.337877783}, // 5663K {0.328817408, 0.337858801}, // 5664K {0.328796041, 0.337839824}, // 5665K {0.328774682, 0.337820852}, // 5666K {0.328753332, 0.337801885}, // 5667K {0.32873199, 0.337782923}, // 5668K {0.328710657, 0.337763966}, // 5669K {0.328689332, 0.337745015}, // 5670K {0.328668015, 0.337726068}, // 5671K {0.328646707, 0.337707126}, // 5672K {0.328625407, 0.337688189}, // 5673K {0.328604116, 0.337669257}, // 5674K {0.328582833, 0.33765033}, // 5675K {0.328561558, 0.337631408}, // 5676K {0.328540292, 0.337612491}, // 5677K {0.328519034, 0.33759358}, // 5678K {0.328497785, 0.337574673}, // 5679K {0.328476544, 0.337555771}, // 5680K {0.328455311, 0.337536874}, // 5681K {0.328434087, 0.337517982}, // 5682K {0.328412871, 0.337499095}, // 5683K {0.328391664, 0.337480213}, // 5684K {0.328370465, 0.337461336}, // 5685K {0.328349274, 0.337442464}, // 5686K {0.328328091, 0.337423598}, // 5687K {0.328306917, 0.337404736}, // 5688K {0.328285752, 0.337385879}, // 5689K {0.328264594, 0.337367027}, // 5690K {0.328243445, 0.33734818}, // 5691K {0.328222305, 0.337329338}, // 5692K {0.328201173, 0.337310501}, // 5693K {0.328180049, 0.337291669}, // 5694K {0.328158933, 0.337272842}, // 5695K {0.328137826, 0.33725402}, // 5696K {0.328116727, 0.337235203}, // 5697K {0.328095636, 0.337216391}, // 5698K {0.328074553, 0.337197583}, // 5699K {0.328053479, 0.337178781}, // 5700K {0.328032414, 0.337159984}, // 5701K {0.328011356, 0.337141192}, // 5702K {0.327990307, 0.337122405}, // 5703K {0.327969266, 0.337103623}, // 5704K {0.327948233, 0.337084845}, // 5705K {0.327927209, 0.337066073}, // 5706K {0.327906193, 0.337047306}, // 5707K {0.327885185, 0.337028543}, // 5708K {0.327864186, 0.337009786}, // 5709K {0.327843194, 0.336991033}, // 5710K {0.327822211, 0.336972286}, // 5711K {0.327801237, 0.336953543}, // 5712K {0.32778027, 0.336934806}, // 5713K {0.327759312, 0.336916073}, // 5714K {0.327738362, 0.336897346}, // 5715K {0.32771742, 0.336878623}, // 5716K {0.327696486, 0.336859905}, // 5717K {0.327675561, 0.336841192}, // 5718K {0.327654644, 0.336822485}, // 5719K {0.327633735, 0.336803782}, // 5720K {0.327612834, 0.336785084}, // 5721K {0.327591942, 0.336766391}, // 5722K {0.327571058, 0.336747703}, // 5723K {0.327550181, 0.33672902}, // 5724K {0.327529314, 0.336710342}, // 5725K {0.327508454, 0.336691669}, // 5726K {0.327487602, 0.336673001}, // 5727K {0.327466759, 0.336654337}, // 5728K {0.327445924, 0.336635679}, // 5729K {0.327425097, 0.336617026}, // 5730K {0.327404278, 0.336598377}, // 5731K {0.327383468, 0.336579734}, // 5732K {0.327362665, 0.336561095}, // 5733K {0.327341871, 0.336542462}, // 5734K {0.327321085, 0.336523833}, // 5735K {0.327300307, 0.336505209}, // 5736K {0.327279537, 0.33648659}, // 5737K {0.327258776, 0.336467976}, // 5738K {0.327238022, 0.336449368}, // 5739K {0.327217277, 0.336430764}, // 5740K {0.327196539, 0.336412164}, // 5741K {0.32717581, 0.33639357}, // 5742K {0.327155089, 0.336374981}, // 5743K {0.327134376, 0.336356397}, // 5744K {0.327113672, 0.336337818}, // 5745K {0.327092975, 0.336319243}, // 5746K {0.327072286, 0.336300674}, // 5747K {0.327051606, 0.336282109}, // 5748K {0.327030934, 0.336263549}, // 5749K {0.327010269, 0.336244995}, // 5750K {0.326989613, 0.336226445}, // 5751K {0.326968965, 0.3362079}, // 5752K {0.326948325, 0.33618936}, // 5753K {0.326927693, 0.336170825}, // 5754K {0.326907069, 0.336152295}, // 5755K {0.326886454, 0.336133769}, // 5756K {0.326865846, 0.336115249}, // 5757K {0.326845246, 0.336096734}, // 5758K {0.326824655, 0.336078223}, // 5759K {0.326804071, 0.336059718}, // 5760K {0.326783496, 0.336041217}, // 5761K {0.326762928, 0.336022721}, // 5762K {0.326742369, 0.33600423}, // 5763K {0.326721817, 0.335985744}, // 5764K {0.326701274, 0.335967263}, // 5765K {0.326680739, 0.335948787}, // 5766K {0.326660211, 0.335930316}, // 5767K {0.326639692, 0.335911849}, // 5768K {0.326619181, 0.335893388}, // 5769K {0.326598678, 0.335874931}, // 5770K {0.326578182, 0.33585648}, // 5771K {0.326557695, 0.335838033}, // 5772K {0.326537216, 0.335819591}, // 5773K {0.326516745, 0.335801154}, // 5774K {0.326496281, 0.335782722}, // 5775K {0.326475826, 0.335764295}, // 5776K {0.326455379, 0.335745873}, // 5777K {0.32643494, 0.335727455}, // 5778K {0.326414508, 0.335709043}, // 5779K {0.326394085, 0.335690635}, // 5780K {0.32637367, 0.335672232}, // 5781K {0.326353262, 0.335653834}, // 5782K {0.326332863, 0.335635441}, // 5783K {0.326312471, 0.335617053}, // 5784K {0.326292088, 0.33559867}, // 5785K {0.326271712, 0.335580292}, // 5786K {0.326251345, 0.335561918}, // 5787K {0.326230985, 0.33554355}, // 5788K {0.326210633, 0.335525186}, // 5789K {0.326190289, 0.335506827}, // 5790K {0.326169953, 0.335488473}, // 5791K {0.326149625, 0.335470124}, // 5792K {0.326129305, 0.33545178}, // 5793K {0.326108993, 0.335433441}, // 5794K {0.326088689, 0.335415106}, // 5795K {0.326068393, 0.335396776}, // 5796K {0.326048104, 0.335378452}, // 5797K {0.326027824, 0.335360132}, // 5798K {0.326007551, 0.335341817}, // 5799K {0.325987286, 0.335323507}, // 5800K {0.325967029, 0.335305201}, // 5801K {0.32594678, 0.335286901}, // 5802K {0.325926539, 0.335268605}, // 5803K {0.325906306, 0.335250315}, // 5804K {0.325886081, 0.335232029}, // 5805K {0.325865863, 0.335213748}, // 5806K {0.325845654, 0.335195472}, // 5807K {0.325825452, 0.335177201}, // 5808K {0.325805258, 0.335158934}, // 5809K {0.325785072, 0.335140673}, // 5810K {0.325764894, 0.335122416}, // 5811K {0.325744723, 0.335104164}, // 5812K {0.325724561, 0.335085917}, // 5813K {0.325704406, 0.335067675}, // 5814K {0.325684259, 0.335049438}, // 5815K {0.32566412, 0.335031205}, // 5816K {0.325643989, 0.335012978}, // 5817K {0.325623865, 0.334994755}, // 5818K {0.32560375, 0.334976537}, // 5819K {0.325583642, 0.334958324}, // 5820K {0.325563542, 0.334940116}, // 5821K {0.32554345, 0.334921912}, // 5822K {0.325523366, 0.334903714}, // 5823K {0.325503289, 0.33488552}, // 5824K {0.32548322, 0.334867331}, // 5825K {0.325463159, 0.334849147}, // 5826K {0.325443106, 0.334830968}, // 5827K {0.325423061, 0.334812793}, // 5828K {0.325403023, 0.334794624}, // 5829K {0.325382993, 0.334776459}, // 5830K {0.325362971, 0.334758299}, // 5831K {0.325342957, 0.334740144}, // 5832K {0.32532295, 0.334721994}, // 5833K {0.325302951, 0.334703848}, // 5834K {0.32528296, 0.334685708}, // 5835K {0.325262977, 0.334667572}, // 5836K {0.325243001, 0.334649441}, // 5837K {0.325223034, 0.334631315}, // 5838K {0.325203073, 0.334613193}, // 5839K {0.325183121, 0.334595077}, // 5840K {0.325163176, 0.334576965}, // 5841K {0.32514324, 0.334558858}, // 5842K {0.32512331, 0.334540756}, // 5843K {0.325103389, 0.334522659}, // 5844K {0.325083475, 0.334504567}, // 5845K {0.325063569, 0.334486479}, // 5846K {0.325043671, 0.334468396}, // 5847K {0.32502378, 0.334450318}, // 5848K {0.325003897, 0.334432245}, // 5849K {0.324984022, 0.334414177}, // 5850K {0.324964154, 0.334396113}, // 5851K {0.324944294, 0.334378054}, // 5852K {0.324924442, 0.33436}, // 5853K {0.324904598, 0.334341951}, // 5854K {0.324884761, 0.334323907}, // 5855K {0.324864932, 0.334305867}, // 5856K {0.32484511, 0.334287833}, // 5857K {0.324825296, 0.334269803}, // 5858K {0.32480549, 0.334251777}, // 5859K {0.324785692, 0.334233757}, // 5860K {0.324765901, 0.334215741}, // 5861K {0.324746117, 0.334197731}, // 5862K {0.324726342, 0.334179725}, // 5863K {0.324706574, 0.334161723}, // 5864K {0.324686814, 0.334143727}, // 5865K {0.324667061, 0.334125735}, // 5866K {0.324647316, 0.334107749}, // 5867K {0.324627578, 0.334089767}, // 5868K {0.324607849, 0.334071789}, // 5869K {0.324588126, 0.334053817}, // 5870K {0.324568412, 0.334035849}, // 5871K {0.324548705, 0.334017886}, // 5872K {0.324529005, 0.333999928}, // 5873K {0.324509314, 0.333981975}, // 5874K {0.324489629, 0.333964026}, // 5875K {0.324469953, 0.333946082}, // 5876K {0.324450284, 0.333928143}, // 5877K {0.324430622, 0.333910209}, // 5878K {0.324410969, 0.33389228}, // 5879K {0.324391322, 0.333874355}, // 5880K {0.324371684, 0.333856435}, // 5881K {0.324352053, 0.33383852}, // 5882K {0.324332429, 0.333820609}, // 5883K {0.324312813, 0.333802704}, // 5884K {0.324293205, 0.333784803}, // 5885K {0.324273604, 0.333766907}, // 5886K {0.32425401, 0.333749015}, // 5887K {0.324234425, 0.333731129}, // 5888K {0.324214847, 0.333713247}, // 5889K {0.324195276, 0.33369537}, // 5890K {0.324175713, 0.333677498}, // 5891K {0.324156157, 0.33365963}, // 5892K {0.324136609, 0.333641767}, // 5893K {0.324117068, 0.333623909}, // 5894K {0.324097535, 0.333606056}, // 5895K {0.32407801, 0.333588208}, // 5896K {0.324058492, 0.333570364}, // 5897K {0.324038981, 0.333552525}, // 5898K {0.324019478, 0.333534691}, // 5899K {0.323999983, 0.333516861}, // 5900K {0.323980495, 0.333499036}, // 5901K {0.323961014, 0.333481216}, // 5902K {0.323941541, 0.333463401}, // 5903K {0.323922076, 0.333445591}, // 5904K {0.323902618, 0.333427785}, // 5905K {0.323883167, 0.333409984}, // 5906K {0.323863724, 0.333392188}, // 5907K {0.323844289, 0.333374396}, // 5908K {0.32382486, 0.333356609}, // 5909K {0.32380544, 0.333338827}, // 5910K {0.323786027, 0.33332105}, // 5911K {0.323766621, 0.333303277}, // 5912K {0.323747222, 0.333285509}, // 5913K {0.323727832, 0.333267746}, // 5914K {0.323708448, 0.333249988}, // 5915K {0.323689072, 0.333232234}, // 5916K {0.323669704, 0.333214485}, // 5917K {0.323650343, 0.333196741}, // 5918K {0.323630989, 0.333179001}, // 5919K {0.323611643, 0.333161267}, // 5920K {0.323592304, 0.333143537}, // 5921K {0.323572972, 0.333125811}, // 5922K {0.323553648, 0.333108091}, // 5923K {0.323534332, 0.333090375}, // 5924K {0.323515023, 0.333072664}, // 5925K {0.323495721, 0.333054957}, // 5926K {0.323476427, 0.333037255}, // 5927K {0.32345714, 0.333019558}, // 5928K {0.32343786, 0.333001866}, // 5929K {0.323418588, 0.332984179}, // 5930K {0.323399323, 0.332966496}, // 5931K {0.323380066, 0.332948817}, // 5932K {0.323360816, 0.332931144}, // 5933K {0.323341573, 0.332913475}, // 5934K {0.323322338, 0.332895811}, // 5935K {0.32330311, 0.332878152}, // 5936K {0.323283889, 0.332860497}, // 5937K {0.323264676, 0.332842847}, // 5938K {0.32324547, 0.332825202}, // 5939K {0.323226272, 0.332807562}, // 5940K {0.323207081, 0.332789926}, // 5941K {0.323187897, 0.332772295}, // 5942K {0.32316872, 0.332754668}, // 5943K {0.323149551, 0.332737047}, // 5944K {0.323130389, 0.33271943}, // 5945K {0.323111235, 0.332701817}, // 5946K {0.323092088, 0.33268421}, // 5947K {0.323072948, 0.332666607}, // 5948K {0.323053816, 0.332649009}, // 5949K {0.32303469, 0.332631415}, // 5950K {0.323015573, 0.332613826}, // 5951K {0.322996462, 0.332596242}, // 5952K {0.322977359, 0.332578663}, // 5953K {0.322958263, 0.332561088}, // 5954K {0.322939174, 0.332543518}, // 5955K {0.322920093, 0.332525952}, // 5956K {0.322901019, 0.332508391}, // 5957K {0.322881952, 0.332490835}, // 5958K {0.322862893, 0.332473284}, // 5959K {0.32284384, 0.332455737}, // 5960K {0.322824795, 0.332438195}, // 5961K {0.322805758, 0.332420658}, // 5962K {0.322786727, 0.332403125}, // 5963K {0.322767704, 0.332385597}, // 5964K {0.322748688, 0.332368074}, // 5965K {0.32272968, 0.332350555}, // 5966K {0.322710678, 0.332333041}, // 5967K {0.322691684, 0.332315532}, // 5968K {0.322672698, 0.332298027}, // 5969K {0.322653718, 0.332280527}, // 5970K {0.322634746, 0.332263032}, // 5971K {0.32261578, 0.332245541}, // 5972K {0.322596822, 0.332228055}, // 5973K {0.322577872, 0.332210574}, // 5974K {0.322558928, 0.332193097}, // 5975K {0.322539992, 0.332175625}, // 5976K {0.322521063, 0.332158158}, // 5977K {0.322502141, 0.332140695}, // 5978K {0.322483227, 0.332123237}, // 5979K {0.322464319, 0.332105784}, // 5980K {0.322445419, 0.332088335}, // 5981K {0.322426526, 0.332070891}, // 5982K {0.32240764, 0.332053452}, // 5983K {0.322388762, 0.332036017}, // 5984K {0.32236989, 0.332018587}, // 5985K {0.322351026, 0.332001161}, // 5986K {0.322332169, 0.33198374}, // 5987K {0.322313319, 0.331966324}, // 5988K {0.322294477, 0.331948913}, // 5989K {0.322275641, 0.331931506}, // 5990K {0.322256813, 0.331914103}, // 5991K {0.322237992, 0.331896706}, // 5992K {0.322219178, 0.331879313}, // 5993K {0.322200371, 0.331861924}, // 5994K {0.322181571, 0.331844541}, // 5995K {0.322162778, 0.331827162}, // 5996K {0.322143993, 0.331809787}, // 5997K {0.322125215, 0.331792417}, // 5998K {0.322106444, 0.331775052}, // 5999K {0.32208768, 0.331757692}, // 6000K {0.322068923, 0.331740336}, // 6001K {0.322050173, 0.331722985}, // 6002K {0.32203143, 0.331705638}, // 6003K {0.322012695, 0.331688296}, // 6004K {0.321993967, 0.331670958}, // 6005K {0.321975245, 0.331653626}, // 6006K {0.321956531, 0.331636298}, // 6007K {0.321937824, 0.331618974}, // 6008K {0.321919124, 0.331601655}, // 6009K {0.321900431, 0.331584341}, // 6010K {0.321881746, 0.331567031}, // 6011K {0.321863067, 0.331549726}, // 6012K {0.321844395, 0.331532426}, // 6013K {0.321825731, 0.33151513}, // 6014K {0.321807073, 0.331497839}, // 6015K {0.321788423, 0.331480552}, // 6016K {0.32176978, 0.33146327}, // 6017K {0.321751144, 0.331445993}, // 6018K {0.321732515, 0.33142872}, // 6019K {0.321713893, 0.331411452}, // 6020K {0.321695278, 0.331394188}, // 6021K {0.32167667, 0.331376929}, // 6022K {0.321658069, 0.331359675}, // 6023K {0.321639475, 0.331342425}, // 6024K {0.321620888, 0.33132518}, // 6025K {0.321602308, 0.331307939}, // 6026K {0.321583736, 0.331290703}, // 6027K {0.32156517, 0.331273472}, // 6028K {0.321546612, 0.331256245}, // 6029K {0.32152806, 0.331239023}, // 6030K {0.321509515, 0.331221806}, // 6031K {0.321490978, 0.331204593}, // 6032K {0.321472447, 0.331187384}, // 6033K {0.321453924, 0.331170181}, // 6034K {0.321435407, 0.331152981}, // 6035K {0.321416898, 0.331135787}, // 6036K {0.321398395, 0.331118597}, // 6037K {0.3213799, 0.331101411}, // 6038K {0.321361411, 0.33108423}, // 6039K {0.32134293, 0.331067054}, // 6040K {0.321324455, 0.331049882}, // 6041K {0.321305988, 0.331032715}, // 6042K {0.321287527, 0.331015553}, // 6043K {0.321269074, 0.330998395}, // 6044K {0.321250627, 0.330981242}, // 6045K {0.321232188, 0.330964093}, // 6046K {0.321213755, 0.330946949}, // 6047K {0.321195329, 0.330929809}, // 6048K {0.321176911, 0.330912674}, // 6049K {0.321158499, 0.330895543}, // 6050K {0.321140094, 0.330878417}, // 6051K {0.321121696, 0.330861296}, // 6052K {0.321103306, 0.330844179}, // 6053K {0.321084922, 0.330827067}, // 6054K {0.321066545, 0.330809959}, // 6055K {0.321048175, 0.330792856}, // 6056K {0.321029811, 0.330775758}, // 6057K {0.321011455, 0.330758664}, // 6058K {0.320993106, 0.330741574}, // 6059K {0.320974764, 0.33072449}, // 6060K {0.320956428, 0.330707409}, // 6061K {0.3209381, 0.330690334}, // 6062K {0.320919778, 0.330673262}, // 6063K {0.320901464, 0.330656196}, // 6064K {0.320883156, 0.330639134}, // 6065K {0.320864855, 0.330622076}, // 6066K {0.320846561, 0.330605023}, // 6067K {0.320828274, 0.330587975}, // 6068K {0.320809994, 0.330570931}, // 6069K {0.320791721, 0.330553892}, // 6070K {0.320773454, 0.330536857}, // 6071K {0.320755195, 0.330519827}, // 6072K {0.320736942, 0.330502801}, // 6073K {0.320718696, 0.33048578}, // 6074K {0.320700458, 0.330468763}, // 6075K {0.320682226, 0.330451751}, // 6076K {0.320664, 0.330434744}, // 6077K {0.320645782, 0.330417741}, // 6078K {0.320627571, 0.330400742}, // 6079K {0.320609366, 0.330383749}, // 6080K {0.320591169, 0.330366759}, // 6081K {0.320572978, 0.330349774}, // 6082K {0.320554794, 0.330332794}, // 6083K {0.320536617, 0.330315818}, // 6084K {0.320518446, 0.330298847}, // 6085K {0.320500283, 0.33028188}, // 6086K {0.320482126, 0.330264918}, // 6087K {0.320463976, 0.33024796}, // 6088K {0.320445833, 0.330231007}, // 6089K {0.320427697, 0.330214059}, // 6090K {0.320409568, 0.330197115}, // 6091K {0.320391445, 0.330180175}, // 6092K {0.32037333, 0.33016324}, // 6093K {0.320355221, 0.33014631}, // 6094K {0.320337119, 0.330129384}, // 6095K {0.320319023, 0.330112462}, // 6096K {0.320300935, 0.330095545}, // 6097K {0.320282853, 0.330078633}, // 6098K {0.320264778, 0.330061725}, // 6099K {0.32024671, 0.330044821}, // 6100K {0.320228649, 0.330027922}, // 6101K {0.320210594, 0.330011028}, // 6102K {0.320192547, 0.329994138}, // 6103K {0.320174506, 0.329977253}, // 6104K {0.320156471, 0.329960372}, // 6105K {0.320138444, 0.329943495}, // 6106K {0.320120423, 0.329926624}, // 6107K {0.320102409, 0.329909756}, // 6108K {0.320084402, 0.329892893}, // 6109K {0.320066402, 0.329876035}, // 6110K {0.320048408, 0.329859181}, // 6111K {0.320030421, 0.329842332}, // 6112K {0.320012441, 0.329825487}, // 6113K {0.319994468, 0.329808646}, // 6114K {0.319976501, 0.32979181}, // 6115K {0.319958541, 0.329774979}, // 6116K {0.319940588, 0.329758152}, // 6117K {0.319922641, 0.32974133}, // 6118K {0.319904702, 0.329724512}, // 6119K {0.319886769, 0.329707698}, // 6120K {0.319868842, 0.329690889}, // 6121K {0.319850923, 0.329674085}, // 6122K {0.31983301, 0.329657285}, // 6123K {0.319815104, 0.329640489}, // 6124K {0.319797204, 0.329623698}, // 6125K {0.319779312, 0.329606912}, // 6126K {0.319761426, 0.32959013}, // 6127K {0.319743546, 0.329573352}, // 6128K {0.319725674, 0.329556579}, // 6129K {0.319707808, 0.329539811}, // 6130K {0.319689948, 0.329523046}, // 6131K {0.319672096, 0.329506287}, // 6132K {0.31965425, 0.329489532}, // 6133K {0.31963641, 0.329472781}, // 6134K {0.319618578, 0.329456035}, // 6135K {0.319600752, 0.329439293}, // 6136K {0.319582933, 0.329422555}, // 6137K {0.31956512, 0.329405823}, // 6138K {0.319547314, 0.329389094}, // 6139K {0.319529515, 0.32937237}, // 6140K {0.319511722, 0.329355651}, // 6141K {0.319493936, 0.329338936}, // 6142K {0.319476157, 0.329322225}, // 6143K {0.319458384, 0.329305519}, // 6144K {0.319440618, 0.329288818}, // 6145K {0.319422859, 0.32927212}, // 6146K {0.319405106, 0.329255428}, // 6147K {0.31938736, 0.329238739}, // 6148K {0.319369621, 0.329222056}, // 6149K {0.319351888, 0.329205376}, // 6150K {0.319334162, 0.329188701}, // 6151K {0.319316442, 0.329172031}, // 6152K {0.319298729, 0.329155365}, // 6153K {0.319281022, 0.329138703}, // 6154K {0.319263323, 0.329122046}, // 6155K {0.319245629, 0.329105393}, // 6156K {0.319227943, 0.329088745}, // 6157K {0.319210263, 0.329072101}, // 6158K {0.31919259, 0.329055462}, // 6159K {0.319174923, 0.329038827}, // 6160K {0.319157262, 0.329022197}, // 6161K {0.319139609, 0.329005571}, // 6162K {0.319121962, 0.328988949}, // 6163K {0.319104321, 0.328972332}, // 6164K {0.319086687, 0.328955719}, // 6165K {0.31906906, 0.328939111}, // 6166K {0.319051439, 0.328922507}, // 6167K {0.319033825, 0.328905908}, // 6168K {0.319016217, 0.328889313}, // 6169K {0.318998616, 0.328872722}, // 6170K {0.318981022, 0.328856136}, // 6171K {0.318963434, 0.328839554}, // 6172K {0.318945853, 0.328822977}, // 6173K {0.318928278, 0.328806404}, // 6174K {0.318910709, 0.328789836}, // 6175K {0.318893148, 0.328773272}, // 6176K {0.318875592, 0.328756712}, // 6177K {0.318858044, 0.328740157}, // 6178K {0.318840501, 0.328723606}, // 6179K {0.318822966, 0.32870706}, // 6180K {0.318805437, 0.328690518}, // 6181K {0.318787914, 0.32867398}, // 6182K {0.318770398, 0.328657447}, // 6183K {0.318752888, 0.328640919}, // 6184K {0.318735385, 0.328624394}, // 6185K {0.318717889, 0.328607874}, // 6186K {0.318700399, 0.328591359}, // 6187K {0.318682915, 0.328574848}, // 6188K {0.318665438, 0.328558341}, // 6189K {0.318647967, 0.328541839}, // 6190K {0.318630503, 0.328525341}, // 6191K {0.318613046, 0.328508848}, // 6192K {0.318595595, 0.328492359}, // 6193K {0.31857815, 0.328475874}, // 6194K {0.318560712, 0.328459394}, // 6195K {0.31854328, 0.328442918}, // 6196K {0.318525855, 0.328426446}, // 6197K {0.318508436, 0.328409979}, // 6198K {0.318491024, 0.328393517}, // 6199K {0.318473618, 0.328377058}, // 6200K {0.318456219, 0.328360605}, // 6201K {0.318438826, 0.328344155}, // 6202K {0.31842144, 0.32832771}, // 6203K {0.31840406, 0.328311269}, // 6204K {0.318386686, 0.328294833}, // 6205K {0.318369319, 0.328278401}, // 6206K {0.318351959, 0.328261973}, // 6207K {0.318334604, 0.32824555}, // 6208K {0.318317257, 0.328229131}, // 6209K {0.318299915, 0.328212717}, // 6210K {0.31828258, 0.328196307}, // 6211K {0.318265252, 0.328179901}, // 6212K {0.31824793, 0.3281635}, // 6213K {0.318230614, 0.328147103}, // 6214K {0.318213305, 0.32813071}, // 6215K {0.318196002, 0.328114322}, // 6216K {0.318178706, 0.328097939}, // 6217K {0.318161416, 0.328081559}, // 6218K {0.318144132, 0.328065184}, // 6219K {0.318126855, 0.328048813}, // 6220K {0.318109584, 0.328032447}, // 6221K {0.31809232, 0.328016085}, // 6222K {0.318075062, 0.327999727}, // 6223K {0.31805781, 0.327983374}, // 6224K {0.318040565, 0.327967025}, // 6225K {0.318023326, 0.327950681}, // 6226K {0.318006094, 0.327934341}, // 6227K {0.317988868, 0.327918005}, // 6228K {0.317971648, 0.327901674}, // 6229K {0.317954435, 0.327885346}, // 6230K {0.317937228, 0.327869024}, // 6231K {0.317920027, 0.327852705}, // 6232K {0.317902833, 0.327836391}, // 6233K {0.317885645, 0.327820082}, // 6234K {0.317868463, 0.327803776}, // 6235K {0.317851288, 0.327787475}, // 6236K {0.317834119, 0.327771179}, // 6237K {0.317816957, 0.327754887}, // 6238K {0.317799801, 0.327738599}, // 6239K {0.317782651, 0.327722315}, // 6240K {0.317765507, 0.327706036}, // 6241K {0.31774837, 0.327689761}, // 6242K {0.317731239, 0.32767349}, // 6243K {0.317714115, 0.327657224}, // 6244K {0.317696997, 0.327640962}, // 6245K {0.317679885, 0.327624705}, // 6246K {0.317662779, 0.327608452}, // 6247K {0.31764568, 0.327592203}, // 6248K {0.317628587, 0.327575958}, // 6249K {0.3176115, 0.327559718}, // 6250K {0.31759442, 0.327543482}, // 6251K {0.317577346, 0.327527251}, // 6252K {0.317560278, 0.327511023}, // 6253K {0.317543217, 0.327494801}, // 6254K {0.317526162, 0.327478582}, // 6255K {0.317509113, 0.327462368}, // 6256K {0.317492071, 0.327446158}, // 6257K {0.317475034, 0.327429952}, // 6258K {0.317458004, 0.327413751}, // 6259K {0.317440981, 0.327397554}, // 6260K {0.317423963, 0.327381361}, // 6261K {0.317406952, 0.327365173}, // 6262K {0.317389947, 0.327348989}, // 6263K {0.317372948, 0.32733281}, // 6264K {0.317355956, 0.327316634}, // 6265K {0.31733897, 0.327300463}, // 6266K {0.31732199, 0.327284296}, // 6267K {0.317305017, 0.327268134}, // 6268K {0.317288049, 0.327251976}, // 6269K {0.317271088, 0.327235822}, // 6270K {0.317254133, 0.327219673}, // 6271K {0.317237185, 0.327203527}, // 6272K {0.317220242, 0.327187386}, // 6273K {0.317203306, 0.32717125}, // 6274K {0.317186376, 0.327155118}, // 6275K {0.317169452, 0.32713899}, // 6276K {0.317152535, 0.327122866}, // 6277K {0.317135624, 0.327106747}, // 6278K {0.317118719, 0.327090631}, // 6279K {0.31710182, 0.327074521}, // 6280K {0.317084927, 0.327058414}, // 6281K {0.317068041, 0.327042312}, // 6282K {0.317051161, 0.327026214}, // 6283K {0.317034287, 0.327010121}, // 6284K {0.317017419, 0.326994031}, // 6285K {0.317000557, 0.326977946}, // 6286K {0.316983702, 0.326961865}, // 6287K {0.316966853, 0.326945789}, // 6288K {0.31695001, 0.326929717}, // 6289K {0.316933173, 0.326913649}, // 6290K {0.316916342, 0.326897585}, // 6291K {0.316899518, 0.326881526}, // 6292K {0.3168827, 0.326865471}, // 6293K {0.316865887, 0.32684942}, // 6294K {0.316849082, 0.326833374}, // 6295K {0.316832282, 0.326817331}, // 6296K {0.316815488, 0.326801294}, // 6297K {0.316798701, 0.32678526}, // 6298K {0.316781919, 0.32676923}, // 6299K {0.316765144, 0.326753205}, // 6300K {0.316748375, 0.326737185}, // 6301K {0.316731612, 0.326721168}, // 6302K {0.316714856, 0.326705156}, // 6303K {0.316698105, 0.326689148}, // 6304K {0.316681361, 0.326673144}, // 6305K {0.316664623, 0.326657144}, // 6306K {0.316647891, 0.326641149}, // 6307K {0.316631165, 0.326625158}, // 6308K {0.316614445, 0.326609171}, // 6309K {0.316597731, 0.326593189}, // 6310K {0.316581023, 0.326577211}, // 6311K {0.316564322, 0.326561237}, // 6312K {0.316547626, 0.326545267}, // 6313K {0.316530937, 0.326529302}, // 6314K {0.316514254, 0.326513341}, // 6315K {0.316497577, 0.326497384}, // 6316K {0.316480906, 0.326481431}, // 6317K {0.316464241, 0.326465483}, // 6318K {0.316447583, 0.326449538}, // 6319K {0.31643093, 0.326433599}, // 6320K {0.316414283, 0.326417663}, // 6321K {0.316397643, 0.326401731}, // 6322K {0.316381009, 0.326385804}, // 6323K {0.31636438, 0.326369881}, // 6324K {0.316347758, 0.326353963}, // 6325K {0.316331142, 0.326338048}, // 6326K {0.316314532, 0.326322138}, // 6327K {0.316297928, 0.326306232}, // 6328K {0.31628133, 0.32629033}, // 6329K {0.316264738, 0.326274433}, // 6330K {0.316248152, 0.32625854}, // 6331K {0.316231573, 0.326242651}, // 6332K {0.316214999, 0.326226766}, // 6333K {0.316198431, 0.326210885}, // 6334K {0.31618187, 0.326195009}, // 6335K {0.316165314, 0.326179137}, // 6336K {0.316148765, 0.326163269}, // 6337K {0.316132222, 0.326147405}, // 6338K {0.316115684, 0.326131546}, // 6339K {0.316099153, 0.326115691}, // 6340K {0.316082628, 0.32609984}, // 6341K {0.316066108, 0.326083993}, // 6342K {0.316049595, 0.32606815}, // 6343K {0.316033088, 0.326052312}, // 6344K {0.316016587, 0.326036478}, // 6345K {0.316000092, 0.326020648}, // 6346K {0.315983602, 0.326004823}, // 6347K {0.315967119, 0.325989001}, // 6348K {0.315950642, 0.325973184}, // 6349K {0.315934171, 0.325957371}, // 6350K {0.315917706, 0.325941562}, // 6351K {0.315901247, 0.325925757}, // 6352K {0.315884794, 0.325909957}, // 6353K {0.315868347, 0.325894161}, // 6354K {0.315851906, 0.325878369}, // 6355K {0.31583547, 0.325862581}, // 6356K {0.315819041, 0.325846798}, // 6357K {0.315802618, 0.325831018}, // 6358K {0.315786201, 0.325815243}, // 6359K {0.31576979, 0.325799472}, // 6360K {0.315753385, 0.325783705}, // 6361K {0.315736985, 0.325767943}, // 6362K {0.315720592, 0.325752185}, // 6363K {0.315704205, 0.32573643}, // 6364K {0.315687823, 0.32572068}, // 6365K {0.315671448, 0.325704935}, // 6366K {0.315655079, 0.325689193}, // 6367K {0.315638715, 0.325673456}, // 6368K {0.315622358, 0.325657723}, // 6369K {0.315606006, 0.325641994}, // 6370K {0.315589661, 0.325626269}, // 6371K {0.315573321, 0.325610548}, // 6372K {0.315556987, 0.325594832}, // 6373K {0.31554066, 0.325579119}, // 6374K {0.315524338, 0.325563411}, // 6375K {0.315508022, 0.325547707}, // 6376K {0.315491712, 0.325532008}, // 6377K {0.315475408, 0.325516312}, // 6378K {0.31545911, 0.325500621}, // 6379K {0.315442817, 0.325484934}, // 6380K {0.315426531, 0.325469251}, // 6381K {0.315410251, 0.325453572}, // 6382K {0.315393976, 0.325437897}, // 6383K {0.315377708, 0.325422227}, // 6384K {0.315361445, 0.32540656}, // 6385K {0.315345189, 0.325390898}, // 6386K {0.315328938, 0.32537524}, // 6387K {0.315312693, 0.325359586}, // 6388K {0.315296454, 0.325343937}, // 6389K {0.315280221, 0.325328291}, // 6390K {0.315263993, 0.32531265}, // 6391K {0.315247772, 0.325297013}, // 6392K {0.315231557, 0.32528138}, // 6393K {0.315215347, 0.325265751}, // 6394K {0.315199143, 0.325250126}, // 6395K {0.315182945, 0.325234506}, // 6396K {0.315166754, 0.32521889}, // 6397K {0.315150567, 0.325203277}, // 6398K {0.315134387, 0.325187669}, // 6399K {0.315118213, 0.325172065}, // 6400K {0.315102044, 0.325156466}, // 6401K {0.315085882, 0.32514087}, // 6402K {0.315069725, 0.325125279}, // 6403K {0.315053574, 0.325109691}, // 6404K {0.315037429, 0.325094108}, // 6405K {0.31502129, 0.325078529}, // 6406K {0.315005156, 0.325062954}, // 6407K {0.314989029, 0.325047384}, // 6408K {0.314972907, 0.325031817}, // 6409K {0.314956791, 0.325016255}, // 6410K {0.314940681, 0.325000696}, // 6411K {0.314924577, 0.324985142}, // 6412K {0.314908479, 0.324969592}, // 6413K {0.314892386, 0.324954046}, // 6414K {0.3148763, 0.324938505}, // 6415K {0.314860219, 0.324922967}, // 6416K {0.314844144, 0.324907434}, // 6417K {0.314828074, 0.324891904}, // 6418K {0.314812011, 0.324876379}, // 6419K {0.314795953, 0.324860858}, // 6420K {0.314779902, 0.324845341}, // 6421K {0.314763856, 0.324829828}, // 6422K {0.314747815, 0.32481432}, // 6423K {0.314731781, 0.324798815}, // 6424K {0.314715752, 0.324783315}, // 6425K {0.31469973, 0.324767818}, // 6426K {0.314683712, 0.324752326}, // 6427K {0.314667701, 0.324736838}, // 6428K {0.314651696, 0.324721354}, // 6429K {0.314635696, 0.324705874}, // 6430K {0.314619702, 0.324690399}, // 6431K {0.314603714, 0.324674927}, // 6432K {0.314587732, 0.324659459}, // 6433K {0.314571755, 0.324643996}, // 6434K {0.314555784, 0.324628537}, // 6435K {0.314539819, 0.324613082}, // 6436K {0.31452386, 0.324597631}, // 6437K {0.314507906, 0.324582184}, // 6438K {0.314491959, 0.324566741}, // 6439K {0.314476017, 0.324551302}, // 6440K {0.31446008, 0.324535868}, // 6441K {0.31444415, 0.324520437}, // 6442K {0.314428225, 0.324505011}, // 6443K {0.314412306, 0.324489588}, // 6444K {0.314396393, 0.32447417}, // 6445K {0.314380485, 0.324458756}, // 6446K {0.314364583, 0.324443346}, // 6447K {0.314348687, 0.32442794}, // 6448K {0.314332797, 0.324412538}, // 6449K {0.314316912, 0.32439714}, // 6450K {0.314301033, 0.324381747}, // 6451K {0.31428516, 0.324366357}, // 6452K {0.314269293, 0.324350972}, // 6453K {0.314253431, 0.32433559}, // 6454K {0.314237575, 0.324320213}, // 6455K {0.314221725, 0.32430484}, // 6456K {0.31420588, 0.324289471}, // 6457K {0.314190041, 0.324274106}, // 6458K {0.314174208, 0.324258745}, // 6459K {0.31415838, 0.324243388}, // 6460K {0.314142559, 0.324228035}, // 6461K {0.314126742, 0.324212687}, // 6462K {0.314110932, 0.324197342}, // 6463K {0.314095127, 0.324182002}, // 6464K {0.314079328, 0.324166665}, // 6465K {0.314063535, 0.324151333}, // 6466K {0.314047747, 0.324136004}, // 6467K {0.314031965, 0.32412068}, // 6468K {0.314016189, 0.32410536}, // 6469K {0.314000418, 0.324090044}, // 6470K {0.313984653, 0.324074732}, // 6471K {0.313968894, 0.324059424}, // 6472K {0.31395314, 0.32404412}, // 6473K {0.313937392, 0.32402882}, // 6474K {0.31392165, 0.324013524}, // 6475K {0.313905913, 0.323998233}, // 6476K {0.313890182, 0.323982945}, // 6477K {0.313874457, 0.323967662}, // 6478K {0.313858737, 0.323952382}, // 6479K {0.313843023, 0.323937107}, // 6480K {0.313827314, 0.323921835}, // 6481K {0.313811611, 0.323906568}, // 6482K {0.313795914, 0.323891305}, // 6483K {0.313780223, 0.323876045}, // 6484K {0.313764537, 0.32386079}, // 6485K {0.313748857, 0.323845539}, // 6486K {0.313733182, 0.323830292}, // 6487K {0.313717513, 0.323815049}, // 6488K {0.313701849, 0.32379981}, // 6489K {0.313686192, 0.323784575}, // 6490K {0.313670539, 0.323769344}, // 6491K {0.313654893, 0.323754117}, // 6492K {0.313639252, 0.323738895}, // 6493K {0.313623617, 0.323723676}, // 6494K {0.313607987, 0.323708461}, // 6495K {0.313592363, 0.32369325}, // 6496K {0.313576744, 0.323678044}, // 6497K {0.313561131, 0.323662841}, // 6498K {0.313545524, 0.323647643}, // 6499K {0.313529922, 0.323632448}, // 6500K {0.313514326, 0.323617258}, // 6501K {0.313498735, 0.323602071}, // 6502K {0.31348315, 0.323586889}, // 6503K {0.313467571, 0.32357171}, // 6504K {0.313451997, 0.323556536}, // 6505K {0.313436429, 0.323541366}, // 6506K {0.313420866, 0.323526199}, // 6507K {0.313405309, 0.323511037}, // 6508K {0.313389757, 0.323495879}, // 6509K {0.313374211, 0.323480725}, // 6510K {0.313358671, 0.323465575}, // 6511K {0.313343136, 0.323450428}, // 6512K {0.313327607, 0.323435286}, // 6513K {0.313312083, 0.323420148}, // 6514K {0.313296565, 0.323405014}, // 6515K {0.313281052, 0.323389884}, // 6516K {0.313265545, 0.323374758}, // 6517K {0.313250043, 0.323359636}, // 6518K {0.313234547, 0.323344518}, // 6519K {0.313219057, 0.323329403}, // 6520K {0.313203572, 0.323314293}, // 6521K {0.313188093, 0.323299187}, // 6522K {0.313172619, 0.323284085}, // 6523K {0.31315715, 0.323268987}, // 6524K {0.313141687, 0.323253893}, // 6525K {0.31312623, 0.323238803}, // 6526K {0.313110778, 0.323223717}, // 6527K {0.313095332, 0.323208635}, // 6528K {0.313079891, 0.323193557}, // 6529K {0.313064456, 0.323178483}, // 6530K {0.313049026, 0.323163413}, // 6531K {0.313033602, 0.323148347}, // 6532K {0.313018183, 0.323133285}, // 6533K {0.31300277, 0.323118227}, // 6534K {0.312987362, 0.323103173}, // 6535K {0.31297196, 0.323088123}, // 6536K {0.312956563, 0.323073077}, // 6537K {0.312941172, 0.323058035}, // 6538K {0.312925786, 0.323042997}, // 6539K {0.312910406, 0.323027963}, // 6540K {0.312895031, 0.323012933}, // 6541K {0.312879662, 0.322997907}, // 6542K {0.312864298, 0.322982885}, // 6543K {0.31284894, 0.322967867}, // 6544K {0.312833587, 0.322952853}, // 6545K {0.31281824, 0.322937842}, // 6546K {0.312802898, 0.322922836}, // 6547K {0.312787561, 0.322907834}, // 6548K {0.31277223, 0.322892836}, // 6549K {0.312756905, 0.322877842}, // 6550K {0.312741585, 0.322862851}, // 6551K {0.31272627, 0.322847865}, // 6552K {0.312710961, 0.322832883}, // 6553K {0.312695657, 0.322817904}, // 6554K {0.312680359, 0.32280293}, // 6555K {0.312665066, 0.32278796}, // 6556K {0.312649778, 0.322772993}, // 6557K {0.312634496, 0.322758031}, // 6558K {0.31261922, 0.322743072}, // 6559K {0.312603949, 0.322728118}, // 6560K {0.312588683, 0.322713167}, // 6561K {0.312573423, 0.322698221}, // 6562K {0.312558168, 0.322683278}, // 6563K {0.312542919, 0.322668339}, // 6564K {0.312527675, 0.322653404}, // 6565K {0.312512436, 0.322638474}, // 6566K {0.312497203, 0.322623547}, // 6567K {0.312481975, 0.322608624}, // 6568K {0.312466753, 0.322593705}, // 6569K {0.312451536, 0.32257879}, // 6570K {0.312436325, 0.322563879}, // 6571K {0.312421119, 0.322548972}, // 6572K {0.312405918, 0.322534069}, // 6573K {0.312390723, 0.32251917}, // 6574K {0.312375533, 0.322504275}, // 6575K {0.312360348, 0.322489384}, // 6576K {0.312345169, 0.322474496}, // 6577K {0.312329996, 0.322459613}, // 6578K {0.312314827, 0.322444733}, // 6579K {0.312299664, 0.322429858}, // 6580K {0.312284507, 0.322414986}, // 6581K {0.312269355, 0.322400119}, // 6582K {0.312254208, 0.322385255}, // 6583K {0.312239066, 0.322370396}, // 6584K {0.31222393, 0.32235554}, // 6585K {0.3122088, 0.322340688}, // 6586K {0.312193674, 0.32232584}, // 6587K {0.312178554, 0.322310996}, // 6588K {0.31216344, 0.322296156}, // 6589K {0.31214833, 0.32228132}, // 6590K {0.312133226, 0.322266488}, // 6591K {0.312118128, 0.322251659}, // 6592K {0.312103035, 0.322236835}, // 6593K {0.312087947, 0.322222015}, // 6594K {0.312072864, 0.322207198}, // 6595K {0.312057787, 0.322192386}, // 6596K {0.312042715, 0.322177577}, // 6597K {0.312027649, 0.322162772}, // 6598K {0.312012588, 0.322147972}, // 6599K {0.311997532, 0.322133175}, // 6600K {0.311982481, 0.322118382}, // 6601K {0.311967436, 0.322103593}, // 6602K {0.311952397, 0.322088808}, // 6603K {0.311937362, 0.322074026}, // 6604K {0.311922333, 0.322059249}, // 6605K {0.311907309, 0.322044476}, // 6606K {0.31189229, 0.322029706}, // 6607K {0.311877277, 0.322014941}, // 6608K {0.311862269, 0.322000179}, // 6609K {0.311847267, 0.321985421}, // 6610K {0.311832269, 0.321970667}, // 6611K {0.311817277, 0.321955918}, // 6612K {0.311802291, 0.321941171}, // 6613K {0.311787309, 0.321926429}, // 6614K {0.311772333, 0.321911691}, // 6615K {0.311757362, 0.321896957}, // 6616K {0.311742397, 0.321882226}, // 6617K {0.311727436, 0.3218675}, // 6618K {0.311712481, 0.321852777}, // 6619K {0.311697532, 0.321838059}, // 6620K {0.311682587, 0.321823344}, // 6621K {0.311667648, 0.321808633}, // 6622K {0.311652714, 0.321793926}, // 6623K {0.311637786, 0.321779223}, // 6624K {0.311622862, 0.321764523}, // 6625K {0.311607944, 0.321749828}, // 6626K {0.311593032, 0.321735136}, // 6627K {0.311578124, 0.321720449}, // 6628K {0.311563222, 0.321705765}, // 6629K {0.311548325, 0.321691085}, // 6630K {0.311533433, 0.321676409}, // 6631K {0.311518547, 0.321661737}, // 6632K {0.311503665, 0.321647069}, // 6633K {0.311488789, 0.321632405}, // 6634K {0.311473919, 0.321617744}, // 6635K {0.311459053, 0.321603088}, // 6636K {0.311444193, 0.321588435}, // 6637K {0.311429338, 0.321573786}, // 6638K {0.311414488, 0.321559141}, // 6639K {0.311399644, 0.3215445}, // 6640K {0.311384804, 0.321529863}, // 6641K {0.31136997, 0.32151523}, // 6642K {0.311355141, 0.3215006}, // 6643K {0.311340318, 0.321485975}, // 6644K {0.311325499, 0.321471353}, // 6645K {0.311310686, 0.321456735}, // 6646K {0.311295878, 0.321442121}, // 6647K {0.311281075, 0.321427511}, // 6648K {0.311266278, 0.321412905}, // 6649K {0.311251485, 0.321398302}, // 6650K {0.311236698, 0.321383704}, // 6651K {0.311221916, 0.321369109}, // 6652K {0.31120714, 0.321354518}, // 6653K {0.311192368, 0.321339931}, // 6654K {0.311177602, 0.321325348}, // 6655K {0.31116284, 0.321310769}, // 6656K {0.311148085, 0.321296194}, // 6657K {0.311133334, 0.321281622}, // 6658K {0.311118588, 0.321267055}, // 6659K {0.311103848, 0.321252491}, // 6660K {0.311089113, 0.321237931}, // 6661K {0.311074382, 0.321223375}, // 6662K {0.311059658, 0.321208822}, // 6663K {0.311044938, 0.321194274}, // 6664K {0.311030223, 0.321179729}, // 6665K {0.311015514, 0.321165188}, // 6666K {0.31100081, 0.321150652}, // 6667K {0.310986111, 0.321136118}, // 6668K {0.310971417, 0.321121589}, // 6669K {0.310956728, 0.321107064}, // 6670K {0.310942045, 0.321092542}, // 6671K {0.310927366, 0.321078025}, // 6672K {0.310912693, 0.321063511}, // 6673K {0.310898025, 0.321049001}, // 6674K {0.310883362, 0.321034494}, // 6675K {0.310868704, 0.321019992}, // 6676K {0.310854052, 0.321005493}, // 6677K {0.310839404, 0.320990999}, // 6678K {0.310824762, 0.320976508}, // 6679K {0.310810125, 0.320962021}, // 6680K {0.310795493, 0.320947537}, // 6681K {0.310780866, 0.320933058}, // 6682K {0.310766244, 0.320918582}, // 6683K {0.310751627, 0.320904111}, // 6684K {0.310737015, 0.320889643}, // 6685K {0.310722409, 0.320875179}, // 6686K {0.310707808, 0.320860718}, // 6687K {0.310693211, 0.320846262}, // 6688K {0.31067862, 0.320831809}, // 6689K {0.310664034, 0.32081736}, // 6690K {0.310649453, 0.320802915}, // 6691K {0.310634878, 0.320788474}, // 6692K {0.310620307, 0.320774036}, // 6693K {0.310605741, 0.320759603}, // 6694K {0.310591181, 0.320745173}, // 6695K {0.310576626, 0.320730747}, // 6696K {0.310562075, 0.320716325}, // 6697K {0.31054753, 0.320701906}, // 6698K {0.31053299, 0.320687492}, // 6699K {0.310518455, 0.320673081}, // 6700K {0.310503925, 0.320658674}, // 6701K {0.3104894, 0.320644271}, // 6702K {0.31047488, 0.320629872}, // 6703K {0.310460366, 0.320615476}, // 6704K {0.310445856, 0.320601084}, // 6705K {0.310431352, 0.320586696}, // 6706K {0.310416852, 0.320572312}, // 6707K {0.310402358, 0.320557932}, // 6708K {0.310387868, 0.320543555}, // 6709K {0.310373384, 0.320529182}, // 6710K {0.310358905, 0.320514813}, // 6711K {0.310344431, 0.320500448}, // 6712K {0.310329962, 0.320486087}, // 6713K {0.310315498, 0.320471729}, // 6714K {0.310301039, 0.320457375}, // 6715K {0.310286585, 0.320443025}, // 6716K {0.310272136, 0.320428679}, // 6717K {0.310257692, 0.320414336}, // 6718K {0.310243253, 0.320399998}, // 6719K {0.31022882, 0.320385663}, // 6720K {0.310214391, 0.320371332}, // 6721K {0.310199967, 0.320357004}, // 6722K {0.310185549, 0.320342681}, // 6723K {0.310171135, 0.320328361}, // 6724K {0.310156726, 0.320314045}, // 6725K {0.310142323, 0.320299733}, // 6726K {0.310127924, 0.320285424}, // 6727K {0.310113531, 0.320271119}, // 6728K {0.310099142, 0.320256818}, // 6729K {0.310084759, 0.320242521}, // 6730K {0.31007038, 0.320228228}, // 6731K {0.310056007, 0.320213938}, // 6732K {0.310041638, 0.320199652}, // 6733K {0.310027275, 0.32018537}, // 6734K {0.310012917, 0.320171092}, // 6735K {0.309998563, 0.320156817}, // 6736K {0.309984215, 0.320142547}, // 6737K {0.309969871, 0.32012828}, // 6738K {0.309955533, 0.320114016}, // 6739K {0.3099412, 0.320099757}, // 6740K {0.309926871, 0.320085501}, // 6741K {0.309912548, 0.320071249}, // 6742K {0.309898229, 0.320057001}, // 6743K {0.309883916, 0.320042756}, // 6744K {0.309869607, 0.320028515}, // 6745K {0.309855304, 0.320014278}, // 6746K {0.309841005, 0.320000045}, // 6747K {0.309826712, 0.319985816}, // 6748K {0.309812423, 0.31997159}, // 6749K {0.30979814, 0.319957368}, // 6750K {0.309783861, 0.31994315}, // 6751K {0.309769587, 0.319928935}, // 6752K {0.309755318, 0.319914724}, // 6753K {0.309741055, 0.319900517}, // 6754K {0.309726796, 0.319886314}, // 6755K {0.309712542, 0.319872115}, // 6756K {0.309698293, 0.319857919}, // 6757K {0.309684049, 0.319843727}, // 6758K {0.30966981, 0.319829539}, // 6759K {0.309655576, 0.319815354}, // 6760K {0.309641347, 0.319801173}, // 6761K {0.309627123, 0.319786996}, // 6762K {0.309612904, 0.319772823}, // 6763K {0.30959869, 0.319758653}, // 6764K {0.30958448, 0.319744487}, // 6765K {0.309570276, 0.319730325}, // 6766K {0.309556076, 0.319716166}, // 6767K {0.309541882, 0.319702012}, // 6768K {0.309527692, 0.319687861}, // 6769K {0.309513508, 0.319673713}, // 6770K {0.309499328, 0.31965957}, // 6771K {0.309485153, 0.31964543}, // 6772K {0.309470983, 0.319631294}, // 6773K {0.309456818, 0.319617162}, // 6774K {0.309442658, 0.319603033}, // 6775K {0.309428503, 0.319588908}, // 6776K {0.309414353, 0.319574787}, // 6777K {0.309400207, 0.319560669}, // 6778K {0.309386067, 0.319546555}, // 6779K {0.309371931, 0.319532445}, // 6780K {0.309357801, 0.319518339}, // 6781K {0.309343675, 0.319504236}, // 6782K {0.309329554, 0.319490137}, // 6783K {0.309315438, 0.319476042}, // 6784K {0.309301327, 0.319461951}, // 6785K {0.309287221, 0.319447863}, // 6786K {0.309273119, 0.319433779}, // 6787K {0.309259023, 0.319419698}, // 6788K {0.309244932, 0.319405622}, // 6789K {0.309230845, 0.319391549}, // 6790K {0.309216763, 0.319377479}, // 6791K {0.309202686, 0.319363414}, // 6792K {0.309188614, 0.319349352}, // 6793K {0.309174547, 0.319335294}, // 6794K {0.309160485, 0.319321239}, // 6795K {0.309146427, 0.319307188}, // 6796K {0.309132375, 0.319293141}, // 6797K {0.309118327, 0.319279098}, // 6798K {0.309104284, 0.319265058}, // 6799K {0.309090246, 0.319251022}, // 6800K {0.309076213, 0.31923699}, // 6801K {0.309062185, 0.319222961}, // 6802K {0.309048161, 0.319208936}, // 6803K {0.309034143, 0.319194915}, // 6804K {0.309020129, 0.319180897}, // 6805K {0.30900612, 0.319166883}, // 6806K {0.308992116, 0.319152873}, // 6807K {0.308978117, 0.319138866}, // 6808K {0.308964123, 0.319124864}, // 6809K {0.308950133, 0.319110864}, // 6810K {0.308936148, 0.319096869}, // 6811K {0.308922168, 0.319082877}, // 6812K {0.308908193, 0.319068889}, // 6813K {0.308894223, 0.319054905}, // 6814K {0.308880258, 0.319040924}, // 6815K {0.308866297, 0.319026947}, // 6816K {0.308852341, 0.319012973}, // 6817K {0.30883839, 0.318999003}, // 6818K {0.308824444, 0.318985037}, // 6819K {0.308810503, 0.318971075}, // 6820K {0.308796566, 0.318957116}, // 6821K {0.308782635, 0.318943161}, // 6822K {0.308768708, 0.31892921}, // 6823K {0.308754786, 0.318915262}, // 6824K {0.308740869, 0.318901318}, // 6825K {0.308726956, 0.318887377}, // 6826K {0.308713048, 0.318873441}, // 6827K {0.308699145, 0.318859507}, // 6828K {0.308685247, 0.318845578}, // 6829K {0.308671354, 0.318831652}, // 6830K {0.308657465, 0.31881773}, // 6831K {0.308643582, 0.318803812}, // 6832K {0.308629703, 0.318789897}, // 6833K {0.308615829, 0.318775986}, // 6834K {0.308601959, 0.318762078}, // 6835K {0.308588095, 0.318748174}, // 6836K {0.308574235, 0.318734274}, // 6837K {0.30856038, 0.318720377}, // 6838K {0.308546529, 0.318706485}, // 6839K {0.308532684, 0.318692595}, // 6840K {0.308518843, 0.31867871}, // 6841K {0.308505007, 0.318664828}, // 6842K {0.308491176, 0.318650949}, // 6843K {0.308477349, 0.318637075}, // 6844K {0.308463528, 0.318623204}, // 6845K {0.308449711, 0.318609336}, // 6846K {0.308435898, 0.318595472}, // 6847K {0.308422091, 0.318581612}, // 6848K {0.308408288, 0.318567756}, // 6849K {0.30839449, 0.318553903}, // 6850K {0.308380697, 0.318540054}, // 6851K {0.308366909, 0.318526208}, // 6852K {0.308353125, 0.318512366}, // 6853K {0.308339346, 0.318498528}, // 6854K {0.308325571, 0.318484693}, // 6855K {0.308311802, 0.318470862}, // 6856K {0.308298037, 0.318457035}, // 6857K {0.308284277, 0.318443211}, // 6858K {0.308270522, 0.318429391}, // 6859K {0.308256771, 0.318415574}, // 6860K {0.308243025, 0.318401761}, // 6861K {0.308229284, 0.318387952}, // 6862K {0.308215547, 0.318374146}, // 6863K {0.308201816, 0.318360344}, // 6864K {0.308188089, 0.318346546}, // 6865K {0.308174366, 0.318332751}, // 6866K {0.308160649, 0.31831896}, // 6867K {0.308146936, 0.318305172}, // 6868K {0.308133228, 0.318291388}, // 6869K {0.308119524, 0.318277608}, // 6870K {0.308105825, 0.318263831}, // 6871K {0.308092131, 0.318250058}, // 6872K {0.308078442, 0.318236289}, // 6873K {0.308064757, 0.318222523}, // 6874K {0.308051077, 0.31820876}, // 6875K {0.308037402, 0.318195002}, // 6876K {0.308023731, 0.318181247}, // 6877K {0.308010065, 0.318167495}, // 6878K {0.307996404, 0.318153747}, // 6879K {0.307982747, 0.318140003}, // 6880K {0.307969095, 0.318126262}, // 6881K {0.307955448, 0.318112525}, // 6882K {0.307941805, 0.318098792}, // 6883K {0.307928167, 0.318085062}, // 6884K {0.307914534, 0.318071336}, // 6885K {0.307900906, 0.318057613}, // 6886K {0.307887282, 0.318043894}, // 6887K {0.307873663, 0.318030178}, // 6888K {0.307860048, 0.318016467}, // 6889K {0.307846438, 0.318002758}, // 6890K {0.307832833, 0.317989054}, // 6891K {0.307819232, 0.317975353}, // 6892K {0.307805636, 0.317961655}, // 6893K {0.307792045, 0.317947961}, // 6894K {0.307778458, 0.317934271}, // 6895K {0.307764876, 0.317920584}, // 6896K {0.307751299, 0.317906901}, // 6897K {0.307737726, 0.317893221}, // 6898K {0.307724158, 0.317879545}, // 6899K {0.307710595, 0.317865873}, // 6900K {0.307697036, 0.317852204}, // 6901K {0.307683482, 0.317838539}, // 6902K {0.307669932, 0.317824877}, // 6903K {0.307656387, 0.317811219}, // 6904K {0.307642847, 0.317797564}, // 6905K {0.307629311, 0.317783913}, // 6906K {0.30761578, 0.317770266}, // 6907K {0.307602254, 0.317756622}, // 6908K {0.307588732, 0.317742982}, // 6909K {0.307575215, 0.317729345}, // 6910K {0.307561703, 0.317715712}, // 6911K {0.307548195, 0.317702083}, // 6912K {0.307534691, 0.317688457}, // 6913K {0.307521193, 0.317674834}, // 6914K {0.307507698, 0.317661215}, // 6915K {0.307494209, 0.3176476}, // 6916K {0.307480724, 0.317633989}, // 6917K {0.307467244, 0.31762038}, // 6918K {0.307453768, 0.317606776}, // 6919K {0.307440297, 0.317593175}, // 6920K {0.30742683, 0.317579577}, // 6921K {0.307413369, 0.317565983}, // 6922K {0.307399911, 0.317552393}, // 6923K {0.307386458, 0.317538806}, // 6924K {0.30737301, 0.317525223}, // 6925K {0.307359567, 0.317511643}, // 6926K {0.307346128, 0.317498067}, // 6927K {0.307332693, 0.317484495}, // 6928K {0.307319263, 0.317470926}, // 6929K {0.307305838, 0.31745736}, // 6930K {0.307292418, 0.317443798}, // 6931K {0.307279001, 0.31743024}, // 6932K {0.30726559, 0.317416685}, // 6933K {0.307252183, 0.317403134}, // 6934K {0.30723878, 0.317389586}, // 6935K {0.307225383, 0.317376042}, // 6936K {0.307211989, 0.317362501}, // 6937K {0.307198601, 0.317348964}, // 6938K {0.307185216, 0.31733543}, // 6939K {0.307171837, 0.3173219}, // 6940K {0.307158462, 0.317308374}, // 6941K {0.307145091, 0.317294851}, // 6942K {0.307131725, 0.317281331}, // 6943K {0.307118364, 0.317267816}, // 6944K {0.307105007, 0.317254303}, // 6945K {0.307091655, 0.317240794}, // 6946K {0.307078307, 0.317227289}, // 6947K {0.307064963, 0.317213787}, // 6948K {0.307051625, 0.317200289}, // 6949K {0.307038291, 0.317186794}, // 6950K {0.307024961, 0.317173303}, // 6951K {0.307011636, 0.317159815}, // 6952K {0.306998315, 0.317146331}, // 6953K {0.306984999, 0.317132851}, // 6954K {0.306971687, 0.317119374}, // 6955K {0.30695838, 0.3171059}, // 6956K {0.306945078, 0.31709243}, // 6957K {0.30693178, 0.317078963}, // 6958K {0.306918486, 0.3170655}, // 6959K {0.306905197, 0.317052041}, // 6960K {0.306891913, 0.317038585}, // 6961K {0.306878633, 0.317025132}, // 6962K {0.306865358, 0.317011683}, // 6963K {0.306852087, 0.316998238}, // 6964K {0.30683882, 0.316984796}, // 6965K {0.306825558, 0.316971358}, // 6966K {0.306812301, 0.316957923}, // 6967K {0.306799048, 0.316944491}, // 6968K {0.306785799, 0.316931063}, // 6969K {0.306772555, 0.316917639}, // 6970K {0.306759316, 0.316904218}, // 6971K {0.306746081, 0.316890801}, // 6972K {0.306732851, 0.316877387}, // 6973K {0.306719624, 0.316863976}, // 6974K {0.306706403, 0.31685057}, // 6975K {0.306693186, 0.316837166}, // 6976K {0.306679973, 0.316823766}, // 6977K {0.306666765, 0.31681037}, // 6978K {0.306653562, 0.316796977}, // 6979K {0.306640362, 0.316783588}, // 6980K {0.306627168, 0.316770202}, // 6981K {0.306613978, 0.316756819}, // 6982K {0.306600792, 0.31674344}, // 6983K {0.306587611, 0.316730065}, // 6984K {0.306574434, 0.316716693}, // 6985K {0.306561261, 0.316703325}, // 6986K {0.306548094, 0.31668996}, // 6987K {0.30653493, 0.316676598}, // 6988K {0.306521771, 0.31666324}, // 6989K {0.306508617, 0.316649886}, // 6990K {0.306495466, 0.316636535}, // 6991K {0.306482321, 0.316623187}, // 6992K {0.30646918, 0.316609843}, // 6993K {0.306456043, 0.316596502}, // 6994K {0.306442911, 0.316583165}, // 6995K {0.306429783, 0.316569832}, // 6996K {0.306416659, 0.316556502}, // 6997K {0.30640354, 0.316543175}, // 6998K {0.306390426, 0.316529852}, // 6999K {0.306377316, 0.316516532}, // 7000K {0.30636421, 0.316503216}, // 7001K {0.306351109, 0.316489903}, // 7002K {0.306338012, 0.316476594}, // 7003K {0.306324919, 0.316463288}, // 7004K {0.306311831, 0.316449986}, // 7005K {0.306298748, 0.316436687}, // 7006K {0.306285669, 0.316423391}, // 7007K {0.306272594, 0.316410099}, // 7008K {0.306259523, 0.316396811}, // 7009K {0.306246458, 0.316383526}, // 7010K {0.306233396, 0.316370244}, // 7011K {0.306220339, 0.316356966}, // 7012K {0.306207286, 0.316343691}, // 7013K {0.306194238, 0.31633042}, // 7014K {0.306181194, 0.316317153}, // 7015K {0.306168155, 0.316303888}, // 7016K {0.306155119, 0.316290627}, // 7017K {0.306142089, 0.31627737}, // 7018K {0.306129062, 0.316264116}, // 7019K {0.30611604, 0.316250866}, // 7020K {0.306103023, 0.316237619}, // 7021K {0.30609001, 0.316224375}, // 7022K {0.306077001, 0.316211135}, // 7023K {0.306063997, 0.316197898}, // 7024K {0.306050997, 0.316184665}, // 7025K {0.306038001, 0.316171435}, // 7026K {0.30602501, 0.316158209}, // 7027K {0.306012023, 0.316144986}, // 7028K {0.305999041, 0.316131767}, // 7029K {0.305986062, 0.316118551}, // 7030K {0.305973089, 0.316105338}, // 7031K {0.305960119, 0.316092129}, // 7032K {0.305947154, 0.316078923}, // 7033K {0.305934194, 0.316065721}, // 7034K {0.305921237, 0.316052522}, // 7035K {0.305908285, 0.316039327}, // 7036K {0.305895338, 0.316026135}, // 7037K {0.305882395, 0.316012947}, // 7038K {0.305869456, 0.315999762}, // 7039K {0.305856521, 0.31598658}, // 7040K {0.305843591, 0.315973402}, // 7041K {0.305830665, 0.315960227}, // 7042K {0.305817744, 0.315947056}, // 7043K {0.305804827, 0.315933888}, // 7044K {0.305791914, 0.315920723}, // 7045K {0.305779006, 0.315907562}, // 7046K {0.305766101, 0.315894405}, // 7047K {0.305753202, 0.31588125}, // 7048K {0.305740306, 0.3158681}, // 7049K {0.305727415, 0.315854952}, // 7050K {0.305714528, 0.315841808}, // 7051K {0.305701646, 0.315828668}, // 7052K {0.305688768, 0.315815531}, // 7053K {0.305675894, 0.315802397}, // 7054K {0.305663025, 0.315789267}, // 7055K {0.305650159, 0.31577614}, // 7056K {0.305637299, 0.315763016}, // 7057K {0.305624442, 0.315749896}, // 7058K {0.30561159, 0.31573678}, // 7059K {0.305598742, 0.315723667}, // 7060K {0.305585899, 0.315710557}, // 7061K {0.305573059, 0.31569745}, // 7062K {0.305560224, 0.315684347}, // 7063K {0.305547394, 0.315671248}, // 7064K {0.305534567, 0.315658152}, // 7065K {0.305521745, 0.315645059}, // 7066K {0.305508928, 0.31563197}, // 7067K {0.305496114, 0.315618884}, // 7068K {0.305483305, 0.315605801}, // 7069K {0.3054705, 0.315592722}, // 7070K {0.3054577, 0.315579646}, // 7071K {0.305444903, 0.315566574}, // 7072K {0.305432111, 0.315553505}, // 7073K {0.305419324, 0.315540439}, // 7074K {0.30540654, 0.315527377}, // 7075K {0.305393761, 0.315514318}, // 7076K {0.305380986, 0.315501263}, // 7077K {0.305368216, 0.315488211}, // 7078K {0.305355449, 0.315475162}, // 7079K {0.305342687, 0.315462117}, // 7080K {0.30532993, 0.315449075}, // 7081K {0.305317176, 0.315436037}, // 7082K {0.305304427, 0.315423002}, // 7083K {0.305291682, 0.31540997}, // 7084K {0.305278941, 0.315396942}, // 7085K {0.305266205, 0.315383917}, // 7086K {0.305253473, 0.315370895}, // 7087K {0.305240745, 0.315357877}, // 7088K {0.305228021, 0.315344862}, // 7089K {0.305215302, 0.315331851}, // 7090K {0.305202587, 0.315318843}, // 7091K {0.305189876, 0.315305838}, // 7092K {0.305177169, 0.315292837}, // 7093K {0.305164467, 0.315279839}, // 7094K {0.305151769, 0.315266845}, // 7095K {0.305139075, 0.315253854}, // 7096K {0.305126385, 0.315240866}, // 7097K {0.3051137, 0.315227881}, // 7098K {0.305101018, 0.3152149}, // 7099K {0.305088341, 0.315201923}, // 7100K {0.305075669, 0.315188949}, // 7101K {0.305063, 0.315175978}, // 7102K {0.305050336, 0.31516301}, // 7103K {0.305037676, 0.315150046}, // 7104K {0.30502502, 0.315137085}, // 7105K {0.305012369, 0.315124128}, // 7106K {0.304999721, 0.315111174}, // 7107K {0.304987078, 0.315098223}, // 7108K {0.304974439, 0.315085275}, // 7109K {0.304961805, 0.315072331}, // 7110K {0.304949174, 0.315059391}, // 7111K {0.304936548, 0.315046453}, // 7112K {0.304923926, 0.315033519}, // 7113K {0.304911308, 0.315020589}, // 7114K {0.304898694, 0.315007662}, // 7115K {0.304886085, 0.314994738}, // 7116K {0.30487348, 0.314981817}, // 7117K {0.304860879, 0.3149689}, // 7118K {0.304848282, 0.314955986}, // 7119K {0.304835689, 0.314943076}, // 7120K {0.304823101, 0.314930169}, // 7121K {0.304810517, 0.314917265}, // 7122K {0.304797936, 0.314904364}, // 7123K {0.304785361, 0.314891467}, // 7124K {0.304772789, 0.314878573}, // 7125K {0.304760221, 0.314865683}, // 7126K {0.304747658, 0.314852796}, // 7127K {0.304735099, 0.314839912}, // 7128K {0.304722544, 0.314827032}, // 7129K {0.304709993, 0.314814155}, // 7130K {0.304697447, 0.314801281}, // 7131K {0.304684904, 0.314788411}, // 7132K {0.304672366, 0.314775544}, // 7133K {0.304659832, 0.31476268}, // 7134K {0.304647302, 0.31474982}, // 7135K {0.304634777, 0.314736962}, // 7136K {0.304622255, 0.314724109}, // 7137K {0.304609738, 0.314711258}, // 7138K {0.304597224, 0.314698411}, // 7139K {0.304584715, 0.314685568}, // 7140K {0.304572211, 0.314672727}, // 7141K {0.30455971, 0.31465989}, // 7142K {0.304547213, 0.314647056}, // 7143K {0.304534721, 0.314634226}, // 7144K {0.304522232, 0.314621399}, // 7145K {0.304509748, 0.314608575}, // 7146K {0.304497268, 0.314595754}, // 7147K {0.304484793, 0.314582937}, // 7148K {0.304472321, 0.314570123}, // 7149K {0.304459853, 0.314557313}, // 7150K {0.30444739, 0.314544506}, // 7151K {0.304434931, 0.314531702}, // 7152K {0.304422475, 0.314518901}, // 7153K {0.304410024, 0.314506104}, // 7154K {0.304397578, 0.31449331}, // 7155K {0.304385135, 0.314480519}, // 7156K {0.304372696, 0.314467732}, // 7157K {0.304360262, 0.314454948}, // 7158K {0.304347831, 0.314442167}, // 7159K {0.304335405, 0.31442939}, // 7160K {0.304322983, 0.314416616}, // 7161K {0.304310565, 0.314403845}, // 7162K {0.304298151, 0.314391078}, // 7163K {0.304285741, 0.314378313}, // 7164K {0.304273336, 0.314365552}, // 7165K {0.304260934, 0.314352795}, // 7166K {0.304248537, 0.314340041}, // 7167K {0.304236144, 0.31432729}, // 7168K {0.304223754, 0.314314542}, // 7169K {0.304211369, 0.314301798}, // 7170K {0.304198988, 0.314289056}, // 7171K {0.304186611, 0.314276319}, // 7172K {0.304174239, 0.314263584}, // 7173K {0.30416187, 0.314250853}, // 7174K {0.304149505, 0.314238125}, // 7175K {0.304137145, 0.3142254}, // 7176K {0.304124788, 0.314212679}, // 7177K {0.304112436, 0.314199961}, // 7178K {0.304100088, 0.314187246}, // 7179K {0.304087744, 0.314174535}, // 7180K {0.304075404, 0.314161826}, // 7181K {0.304063068, 0.314149122}, // 7182K {0.304050736, 0.31413642}, // 7183K {0.304038408, 0.314123722}, // 7184K {0.304026084, 0.314111027}, // 7185K {0.304013764, 0.314098335}, // 7186K {0.304001449, 0.314085646}, // 7187K {0.303989137, 0.314072961}, // 7188K {0.30397683, 0.314060279}, // 7189K {0.303964526, 0.3140476}, // 7190K {0.303952227, 0.314034925}, // 7191K {0.303939932, 0.314022253}, // 7192K {0.303927641, 0.314009584}, // 7193K {0.303915354, 0.313996918}, // 7194K {0.303903071, 0.313984256}, // 7195K {0.303890792, 0.313971597}, // 7196K {0.303878517, 0.313958941}, // 7197K {0.303866246, 0.313946289}, // 7198K {0.303853979, 0.31393364}, // 7199K {0.303841716, 0.313920994}, // 7200K {0.303829457, 0.313908351}, // 7201K {0.303817203, 0.313895712}, // 7202K {0.303804952, 0.313883075}, // 7203K {0.303792705, 0.313870443}, // 7204K {0.303780463, 0.313857813}, // 7205K {0.303768224, 0.313845186}, // 7206K {0.30375599, 0.313832563}, // 7207K {0.303743759, 0.313819944}, // 7208K {0.303731533, 0.313807327}, // 7209K {0.303719311, 0.313794714}, // 7210K {0.303707092, 0.313782103}, // 7211K {0.303694878, 0.313769497}, // 7212K {0.303682668, 0.313756893}, // 7213K {0.303670461, 0.313744293}, // 7214K {0.303658259, 0.313731696}, // 7215K {0.303646061, 0.313719102}, // 7216K {0.303633867, 0.313706511}, // 7217K {0.303621676, 0.313693924}, // 7218K {0.30360949, 0.31368134}, // 7219K {0.303597308, 0.313668759}, // 7220K {0.30358513, 0.313656181}, // 7221K {0.303572956, 0.313643607}, // 7222K {0.303560786, 0.313631036}, // 7223K {0.30354862, 0.313618468}, // 7224K {0.303536457, 0.313605903}, // 7225K {0.303524299, 0.313593342}, // 7226K {0.303512145, 0.313580784}, // 7227K {0.303499995, 0.313568229}, // 7228K {0.303487849, 0.313555677}, // 7229K {0.303475707, 0.313543129}, // 7230K {0.303463569, 0.313530584}, // 7231K {0.303451435, 0.313518042}, // 7232K {0.303439305, 0.313505503}, // 7233K {0.303427178, 0.313492967}, // 7234K {0.303415056, 0.313480435}, // 7235K {0.303402938, 0.313467906}, // 7236K {0.303390824, 0.31345538}, // 7237K {0.303378714, 0.313442858}, // 7238K {0.303366608, 0.313430338}, // 7239K {0.303354505, 0.313417822}, // 7240K {0.303342407, 0.313405309}, // 7241K {0.303330313, 0.3133928}, // 7242K {0.303318222, 0.313380293}, // 7243K {0.303306136, 0.31336779}, // 7244K {0.303294054, 0.31335529}, // 7245K {0.303281975, 0.313342793}, // 7246K {0.303269901, 0.313330299}, // 7247K {0.30325783, 0.313317809}, // 7248K {0.303245764, 0.313305322}, // 7249K {0.303233701, 0.313292838}, // 7250K {0.303221643, 0.313280357}, // 7251K {0.303209588, 0.31326788}, // 7252K {0.303197538, 0.313255405}, // 7253K {0.303185491, 0.313242934}, // 7254K {0.303173448, 0.313230467}, // 7255K {0.303161409, 0.313218002}, // 7256K {0.303149374, 0.31320554}, // 7257K {0.303137344, 0.313193082}, // 7258K {0.303125317, 0.313180627}, // 7259K {0.303113294, 0.313168175}, // 7260K {0.303101274, 0.313155727}, // 7261K {0.303089259, 0.313143281}, // 7262K {0.303077248, 0.313130839}, // 7263K {0.303065241, 0.3131184}, // 7264K {0.303053238, 0.313105964}, // 7265K {0.303041238, 0.313093532}, // 7266K {0.303029243, 0.313081102}, // 7267K {0.303017251, 0.313068676}, // 7268K {0.303005264, 0.313056253}, // 7269K {0.30299328, 0.313043833}, // 7270K {0.3029813, 0.313031417}, // 7271K {0.302969324, 0.313019003}, // 7272K {0.302957352, 0.313006593}, // 7273K {0.302945384, 0.312994186}, // 7274K {0.30293342, 0.312981782}, // 7275K {0.30292146, 0.312969381}, // 7276K {0.302909504, 0.312956984}, // 7277K {0.302897552, 0.31294459}, // 7278K {0.302885603, 0.312932199}, // 7279K {0.302873659, 0.312919811}, // 7280K {0.302861718, 0.312907426}, // 7281K {0.302849782, 0.312895044}, // 7282K {0.302837849, 0.312882666}, // 7283K {0.30282592, 0.312870291}, // 7284K {0.302813995, 0.312857919}, // 7285K {0.302802074, 0.31284555}, // 7286K {0.302790157, 0.312833185}, // 7287K {0.302778243, 0.312820822}, // 7288K {0.302766334, 0.312808463}, // 7289K {0.302754428, 0.312796107}, // 7290K {0.302742527, 0.312783754}, // 7291K {0.302730629, 0.312771404}, // 7292K {0.302718735, 0.312759057}, // 7293K {0.302706845, 0.312746714}, // 7294K {0.302694959, 0.312734374}, // 7295K {0.302683077, 0.312722037}, // 7296K {0.302671199, 0.312709703}, // 7297K {0.302659324, 0.312697372}, // 7298K {0.302647454, 0.312685045}, // 7299K {0.302635587, 0.31267272}, // 7300K {0.302623724, 0.312660399}, // 7301K {0.302611865, 0.312648081}, // 7302K {0.30260001, 0.312635766}, // 7303K {0.302588159, 0.312623454}, // 7304K {0.302576312, 0.312611146}, // 7305K {0.302564468, 0.31259884}, // 7306K {0.302552629, 0.312586538}, // 7307K {0.302540793, 0.312574239}, // 7308K {0.302528961, 0.312561943}, // 7309K {0.302517133, 0.31254965}, // 7310K {0.302505309, 0.312537361}, // 7311K {0.302493489, 0.312525074}, // 7312K {0.302481672, 0.312512791}, // 7313K {0.30246986, 0.312500511}, // 7314K {0.302458051, 0.312488234}, // 7315K {0.302446246, 0.31247596}, // 7316K {0.302434445, 0.312463689}, // 7317K {0.302422648, 0.312451422}, // 7318K {0.302410855, 0.312439157}, // 7319K {0.302399065, 0.312426896}, // 7320K {0.302387279, 0.312414638}, // 7321K {0.302375497, 0.312402383}, // 7322K {0.302363719, 0.312390131}, // 7323K {0.302351945, 0.312377882}, // 7324K {0.302340175, 0.312365637}, // 7325K {0.302328408, 0.312353394}, // 7326K {0.302316646, 0.312341155}, // 7327K {0.302304887, 0.312328919}, // 7328K {0.302293132, 0.312316686}, // 7329K {0.302281381, 0.312304456}, // 7330K {0.302269633, 0.312292229}, // 7331K {0.30225789, 0.312280006}, // 7332K {0.30224615, 0.312267785}, // 7333K {0.302234414, 0.312255568}, // 7334K {0.302222682, 0.312243354}, // 7335K {0.302210954, 0.312231143}, // 7336K {0.302199229, 0.312218935}, // 7337K {0.302187508, 0.31220673}, // 7338K {0.302175792, 0.312194528}, // 7339K {0.302164079, 0.31218233}, // 7340K {0.302152369, 0.312170135}, // 7341K {0.302140664, 0.312157942}, // 7342K {0.302128962, 0.312145753}, // 7343K {0.302117264, 0.312133567}, // 7344K {0.30210557, 0.312121384}, // 7345K {0.30209388, 0.312109204}, // 7346K {0.302082194, 0.312097028}, // 7347K {0.302070511, 0.312084854}, // 7348K {0.302058832, 0.312072684}, // 7349K {0.302047157, 0.312060516}, // 7350K {0.302035486, 0.312048352}, // 7351K {0.302023818, 0.312036191}, // 7352K {0.302012155, 0.312024033}, // 7353K {0.302000495, 0.312011878}, // 7354K {0.301988839, 0.311999727}, // 7355K {0.301977186, 0.311987578}, // 7356K {0.301965538, 0.311975432}, // 7357K {0.301953893, 0.31196329}, // 7358K {0.301942252, 0.311951151}, // 7359K {0.301930615, 0.311939015}, // 7360K {0.301918981, 0.311926882}, // 7361K {0.301907351, 0.311914752}, // 7362K {0.301895725, 0.311902625}, // 7363K {0.301884103, 0.311890501}, // 7364K {0.301872485, 0.31187838}, // 7365K {0.30186087, 0.311866263}, // 7366K {0.301849259, 0.311854148}, // 7367K {0.301837652, 0.311842037}, // 7368K {0.301826049, 0.311829929}, // 7369K {0.301814449, 0.311817823}, // 7370K {0.301802853, 0.311805721}, // 7371K {0.301791261, 0.311793622}, // 7372K {0.301779673, 0.311781527}, // 7373K {0.301768088, 0.311769434}, // 7374K {0.301756508, 0.311757344}, // 7375K {0.30174493, 0.311745258}, // 7376K {0.301733357, 0.311733174}, // 7377K {0.301721787, 0.311721094}, // 7378K {0.301710222, 0.311709016}, // 7379K {0.30169866, 0.311696942}, // 7380K {0.301687101, 0.311684871}, // 7381K {0.301675547, 0.311672803}, // 7382K {0.301663996, 0.311660738}, // 7383K {0.301652448, 0.311648676}, // 7384K {0.301640905, 0.311636617}, // 7385K {0.301629365, 0.311624562}, // 7386K {0.301617829, 0.311612509}, // 7387K {0.301606297, 0.311600459}, // 7388K {0.301594769, 0.311588413}, // 7389K {0.301583244, 0.311576369}, // 7390K {0.301571723, 0.311564329}, // 7391K {0.301560205, 0.311552292}, // 7392K {0.301548692, 0.311540258}, // 7393K {0.301537182, 0.311528227}, // 7394K {0.301525676, 0.311516199}, // 7395K {0.301514173, 0.311504174}, // 7396K {0.301502674, 0.311492152}, // 7397K {0.301491179, 0.311480133}, // 7398K {0.301479688, 0.311468117}, // 7399K {0.3014682, 0.311456105}, // 7400K {0.301456717, 0.311444095}, // 7401K {0.301445236, 0.311432089}, // 7402K {0.30143376, 0.311420085}, // 7403K {0.301422287, 0.311408085}, // 7404K {0.301410818, 0.311396087}, // 7405K {0.301399353, 0.311384093}, // 7406K {0.301387891, 0.311372102}, // 7407K {0.301376433, 0.311360114}, // 7408K {0.301364978, 0.311348129}, // 7409K {0.301353528, 0.311336147}, // 7410K {0.301342081, 0.311324168}, // 7411K {0.301330638, 0.311312192}, // 7412K {0.301319198, 0.311300219}, // 7413K {0.301307762, 0.311288249}, // 7414K {0.30129633, 0.311276282}, // 7415K {0.301284902, 0.311264319}, // 7416K {0.301273477, 0.311252358}, // 7417K {0.301262056, 0.311240401}, // 7418K {0.301250638, 0.311228446}, // 7419K {0.301239224, 0.311216495}, // 7420K {0.301227814, 0.311204546}, // 7421K {0.301216408, 0.311192601}, // 7422K {0.301205005, 0.311180659}, // 7423K {0.301193606, 0.311168719}, // 7424K {0.30118221, 0.311156783}, // 7425K {0.301170819, 0.31114485}, // 7426K {0.301159431, 0.31113292}, // 7427K {0.301148046, 0.311120993}, // 7428K {0.301136665, 0.311109069}, // 7429K {0.301125288, 0.311097148}, // 7430K {0.301113915, 0.31108523}, // 7431K {0.301102545, 0.311073315}, // 7432K {0.301091179, 0.311061403}, // 7433K {0.301079816, 0.311049494}, // 7434K {0.301068458, 0.311037588}, // 7435K {0.301057102, 0.311025685}, // 7436K {0.301045751, 0.311013786}, // 7437K {0.301034403, 0.311001889}, // 7438K {0.301023059, 0.310989995}, // 7439K {0.301011718, 0.310978104}, // 7440K {0.301000381, 0.310966217}, // 7441K {0.300989048, 0.310954332}, // 7442K {0.300977718, 0.310942451}, // 7443K {0.300966392, 0.310930572}, // 7444K {0.30095507, 0.310918697}, // 7445K {0.300943751, 0.310906824}, // 7446K {0.300932436, 0.310894955}, // 7447K {0.300921125, 0.310883088}, // 7448K {0.300909817, 0.310871225}, // 7449K {0.300898512, 0.310859364}, // 7450K {0.300887212, 0.310847507}, // 7451K {0.300875915, 0.310835653}, // 7452K {0.300864621, 0.310823801}, // 7453K {0.300853332, 0.310811953}, // 7454K {0.300842046, 0.310800108}, // 7455K {0.300830763, 0.310788265}, // 7456K {0.300819484, 0.310776426}, // 7457K {0.300808209, 0.31076459}, // 7458K {0.300796937, 0.310752757}, // 7459K {0.300785669, 0.310740926}, // 7460K {0.300774405, 0.310729099}, // 7461K {0.300763144, 0.310717275}, // 7462K {0.300751887, 0.310705454}, // 7463K {0.300740633, 0.310693636}, // 7464K {0.300729383, 0.310681821}, // 7465K {0.300718137, 0.310670008}, // 7466K {0.300706894, 0.310658199}, // 7467K {0.300695655, 0.310646393}, // 7468K {0.300684419, 0.31063459}, // 7469K {0.300673188, 0.31062279}, // 7470K {0.300661959, 0.310610993}, // 7471K {0.300650734, 0.310599198}, // 7472K {0.300639513, 0.310587407}, // 7473K {0.300628296, 0.310575619}, // 7474K {0.300617082, 0.310563834}, // 7475K {0.300605871, 0.310552052}, // 7476K {0.300594664, 0.310540273}, // 7477K {0.300583461, 0.310528497}, // 7478K {0.300572261, 0.310516723}, // 7479K {0.300561065, 0.310504953}, // 7480K {0.300549873, 0.310493186}, // 7481K {0.300538684, 0.310481422}, // 7482K {0.300527498, 0.310469661}, // 7483K {0.300516317, 0.310457902}, // 7484K {0.300505138, 0.310446147}, // 7485K {0.300493964, 0.310434395}, // 7486K {0.300482793, 0.310422646}, // 7487K {0.300471625, 0.3104109}, // 7488K {0.300460461, 0.310399156}, // 7489K {0.300449301, 0.310387416}, // 7490K {0.300438144, 0.310375679}, // 7491K {0.300426991, 0.310363944}, // 7492K {0.300415841, 0.310352213}, // 7493K {0.300404695, 0.310340485}, // 7494K {0.300393553, 0.310328759}, // 7495K {0.300382414, 0.310317037}, // 7496K {0.300371278, 0.310305318}, // 7497K {0.300360146, 0.310293601}, // 7498K {0.300349018, 0.310281888}, // 7499K {0.300337893, 0.310270177}, // 7500K {0.300326772, 0.31025847}, // 7501K {0.300315654, 0.310246765}, // 7502K {0.30030454, 0.310235063}, // 7503K {0.30029343, 0.310223365}, // 7504K {0.300282323, 0.310211669}, // 7505K {0.300271219, 0.310199977}, // 7506K {0.300260119, 0.310188287}, // 7507K {0.300249023, 0.3101766}, // 7508K {0.30023793, 0.310164916}, // 7509K {0.300226841, 0.310153236}, // 7510K {0.300215755, 0.310141558}, // 7511K {0.300204672, 0.310129883}, // 7512K {0.300193594, 0.310118211}, // 7513K {0.300182519, 0.310106542}, // 7514K {0.300171447, 0.310094876}, // 7515K {0.300160379, 0.310083213}, // 7516K {0.300149314, 0.310071553}, // 7517K {0.300138253, 0.310059896}, // 7518K {0.300127195, 0.310048242}, // 7519K {0.300116141, 0.310036591}, // 7520K {0.300105091, 0.310024943}, // 7521K {0.300094044, 0.310013297}, // 7522K {0.300083, 0.310001655}, // 7523K {0.30007196, 0.309990016}, // 7524K {0.300060924, 0.309978379}, // 7525K {0.300049891, 0.309966746}, // 7526K {0.300038861, 0.309955115}, // 7527K {0.300027835, 0.309943488}, // 7528K {0.300016813, 0.309931863}, // 7529K {0.300005794, 0.309920241}, // 7530K {0.299994778, 0.309908623}, // 7531K {0.299983767, 0.309897007}, // 7532K {0.299972758, 0.309885394}, // 7533K {0.299961753, 0.309873784}, // 7534K {0.299950752, 0.309862177}, // 7535K {0.299939754, 0.309850573}, // 7536K {0.299928759, 0.309838972}, // 7537K {0.299917768, 0.309827374}, // 7538K {0.299906781, 0.309815779}, // 7539K {0.299895797, 0.309804187}, // 7540K {0.299884816, 0.309792597}, // 7541K {0.299873839, 0.309781011}, // 7542K {0.299862866, 0.309769428}, // 7543K {0.299851896, 0.309757847}, // 7544K {0.299840929, 0.30974627}, // 7545K {0.299829966, 0.309734695}, // 7546K {0.299819007, 0.309723123}, // 7547K {0.299808051, 0.309711555}, // 7548K {0.299797098, 0.309699989}, // 7549K {0.299786149, 0.309688426}, // 7550K {0.299775203, 0.309676866}, // 7551K {0.299764261, 0.309665309}, // 7552K {0.299753322, 0.309653755}, // 7553K {0.299742387, 0.309642203}, // 7554K {0.299731455, 0.309630655}, // 7555K {0.299720527, 0.30961911}, // 7556K {0.299709602, 0.309607567}, // 7557K {0.299698681, 0.309596028}, // 7558K {0.299687763, 0.309584491}, // 7559K {0.299676848, 0.309572958}, // 7560K {0.299665937, 0.309561427}, // 7561K {0.29965503, 0.309549899}, // 7562K {0.299644125, 0.309538374}, // 7563K {0.299633225, 0.309526852}, // 7564K {0.299622328, 0.309515333}, // 7565K {0.299611434, 0.309503817}, // 7566K {0.299600544, 0.309492304}, // 7567K {0.299589657, 0.309480793}, // 7568K {0.299578773, 0.309469286}, // 7569K {0.299567893, 0.309457781}, // 7570K {0.299557017, 0.30944628}, // 7571K {0.299546144, 0.309434781}, // 7572K {0.299535274, 0.309423285}, // 7573K {0.299524408, 0.309411793}, // 7574K {0.299513545, 0.309400303}, // 7575K {0.299502686, 0.309388815}, // 7576K {0.29949183, 0.309377331}, // 7577K {0.299480978, 0.30936585}, // 7578K {0.299470129, 0.309354372}, // 7579K {0.299459283, 0.309342896}, // 7580K {0.299448441, 0.309331424}, // 7581K {0.299437602, 0.309319954}, // 7582K {0.299426767, 0.309308487}, // 7583K {0.299415935, 0.309297023}, // 7584K {0.299405107, 0.309285563}, // 7585K {0.299394282, 0.309274104}, // 7586K {0.29938346, 0.309262649}, // 7587K {0.299372642, 0.309251197}, // 7588K {0.299361827, 0.309239748}, // 7589K {0.299351016, 0.309228301}, // 7590K {0.299340208, 0.309216858}, // 7591K {0.299329403, 0.309205417}, // 7592K {0.299318602, 0.309193979}, // 7593K {0.299307804, 0.309182544}, // 7594K {0.29929701, 0.309171112}, // 7595K {0.299286219, 0.309159683}, // 7596K {0.299275432, 0.309148257}, // 7597K {0.299264648, 0.309136833}, // 7598K {0.299253867, 0.309125413}, // 7599K {0.29924309, 0.309113995}, // 7600K {0.299232316, 0.309102581}, // 7601K {0.299221545, 0.309091169}, // 7602K {0.299210778, 0.30907976}, // 7603K {0.299200015, 0.309068354}, // 7604K {0.299189254, 0.30905695}, // 7605K {0.299178497, 0.30904555}, // 7606K {0.299167744, 0.309034153}, // 7607K {0.299156994, 0.309022758}, // 7608K {0.299146247, 0.309011366}, // 7609K {0.299135504, 0.308999978}, // 7610K {0.299124764, 0.308988592}, // 7611K {0.299114027, 0.308977209}, // 7612K {0.299103294, 0.308965828}, // 7613K {0.299092564, 0.308954451}, // 7614K {0.299081838, 0.308943077}, // 7615K {0.299071115, 0.308931705}, // 7616K {0.299060395, 0.308920336}, // 7617K {0.299049679, 0.30890897}, // 7618K {0.299038966, 0.308897607}, // 7619K {0.299028256, 0.308886247}, // 7620K {0.29901755, 0.30887489}, // 7621K {0.299006847, 0.308863536}, // 7622K {0.298996148, 0.308852184}, // 7623K {0.298985452, 0.308840836}, // 7624K {0.298974759, 0.30882949}, // 7625K {0.29896407, 0.308818147}, // 7626K {0.298953384, 0.308806807}, // 7627K {0.298942701, 0.308795469}, // 7628K {0.298932022, 0.308784135}, // 7629K {0.298921346, 0.308772804}, // 7630K {0.298910674, 0.308761475}, // 7631K {0.298900005, 0.308750149}, // 7632K {0.298889339, 0.308738826}, // 7633K {0.298878676, 0.308727506}, // 7634K {0.298868017, 0.308716189}, // 7635K {0.298857361, 0.308704875}, // 7636K {0.298846709, 0.308693563}, // 7637K {0.29883606, 0.308682254}, // 7638K {0.298825414, 0.308670948}, // 7639K {0.298814772, 0.308659645}, // 7640K {0.298804133, 0.308648345}, // 7641K {0.298793497, 0.308637048}, // 7642K {0.298782865, 0.308625754}, // 7643K {0.298772236, 0.308614462}, // 7644K {0.29876161, 0.308603173}, // 7645K {0.298750988, 0.308591887}, // 7646K {0.298740369, 0.308580604}, // 7647K {0.298729753, 0.308569324}, // 7648K {0.298719141, 0.308558047}, // 7649K {0.298708532, 0.308546772}, // 7650K {0.298697926, 0.3085355}, // 7651K {0.298687323, 0.308524231}, // 7652K {0.298676724, 0.308512965}, // 7653K {0.298666129, 0.308501702}, // 7654K {0.298655536, 0.308490442}, // 7655K {0.298644947, 0.308479184}, // 7656K {0.298634361, 0.30846793}, // 7657K {0.298623779, 0.308456678}, // 7658K {0.2986132, 0.308445429}, // 7659K {0.298602624, 0.308434182}, // 7660K {0.298592052, 0.308422939}, // 7661K {0.298581482, 0.308411698}, // 7662K {0.298570917, 0.308400461}, // 7663K {0.298560354, 0.308389226}, // 7664K {0.298549795, 0.308377994}, // 7665K {0.298539239, 0.308366764}, // 7666K {0.298528686, 0.308355538}, // 7667K {0.298518137, 0.308344314}, // 7668K {0.298507591, 0.308333094}, // 7669K {0.298497048, 0.308321876}, // 7670K {0.298486509, 0.308310661}, // 7671K {0.298475973, 0.308299448}, // 7672K {0.29846544, 0.308288239}, // 7673K {0.29845491, 0.308277032}, // 7674K {0.298444384, 0.308265828}, // 7675K {0.298433861, 0.308254627}, // 7676K {0.298423341, 0.308243429}, // 7677K {0.298412825, 0.308232233}, // 7678K {0.298402312, 0.308221041}, // 7679K {0.298391802, 0.308209851}, // 7680K {0.298381296, 0.308198664}, // 7681K {0.298370792, 0.30818748}, // 7682K {0.298360293, 0.308176298}, // 7683K {0.298349796, 0.30816512}, // 7684K {0.298339303, 0.308153944}, // 7685K {0.298328812, 0.308142771}, // 7686K {0.298318326, 0.308131601}, // 7687K {0.298307842, 0.308120434}, // 7688K {0.298297362, 0.308109269}, // 7689K {0.298286885, 0.308098108}, // 7690K {0.298276411, 0.308086949}, // 7691K {0.298265941, 0.308075792}, // 7692K {0.298255474, 0.308064639}, // 7693K {0.29824501, 0.308053489}, // 7694K {0.298234549, 0.308042341}, // 7695K {0.298224092, 0.308031196}, // 7696K {0.298213637, 0.308020054}, // 7697K {0.298203187, 0.308008915}, // 7698K {0.298192739, 0.307997778}, // 7699K {0.298182295, 0.307986644}, // 7700K {0.298171854, 0.307975513}, // 7701K {0.298161416, 0.307964385}, // 7702K {0.298150981, 0.30795326}, // 7703K {0.29814055, 0.307942137}, // 7704K {0.298130122, 0.307931018}, // 7705K {0.298119697, 0.307919901}, // 7706K {0.298109276, 0.307908786}, // 7707K {0.298098857, 0.307897675}, // 7708K {0.298088442, 0.307886566}, // 7709K {0.29807803, 0.307875461}, // 7710K {0.298067622, 0.307864357}, // 7711K {0.298057217, 0.307853257}, // 7712K {0.298046815, 0.30784216}, // 7713K {0.298036416, 0.307831065}, // 7714K {0.29802602, 0.307819973}, // 7715K {0.298015628, 0.307808884}, // 7716K {0.298005239, 0.307797798}, // 7717K {0.297994853, 0.307786714}, // 7718K {0.29798447, 0.307775633}, // 7719K {0.297974091, 0.307764555}, // 7720K {0.297963715, 0.30775348}, // 7721K {0.297953342, 0.307742408}, // 7722K {0.297942972, 0.307731338}, // 7723K {0.297932605, 0.307720271}, // 7724K {0.297922242, 0.307709207}, // 7725K {0.297911882, 0.307698145}, // 7726K {0.297901525, 0.307687087}, // 7727K {0.297891172, 0.307676031}, // 7728K {0.297880821, 0.307664978}, // 7729K {0.297870474, 0.307653928}, // 7730K {0.29786013, 0.30764288}, // 7731K {0.297849789, 0.307631835}, // 7732K {0.297839452, 0.307620793}, // 7733K {0.297829117, 0.307609754}, // 7734K {0.297818786, 0.307598718}, // 7735K {0.297808458, 0.307587684}, // 7736K {0.297798134, 0.307576653}, // 7737K {0.297787812, 0.307565625}, // 7738K {0.297777494, 0.3075546}, // 7739K {0.297767179, 0.307543577}, // 7740K {0.297756867, 0.307532557}, // 7741K {0.297746559, 0.30752154}, // 7742K {0.297736253, 0.307510526}, // 7743K {0.297725951, 0.307499514}, // 7744K {0.297715652, 0.307488505}, // 7745K {0.297705356, 0.307477499}, // 7746K {0.297695063, 0.307466496}, // 7747K {0.297684774, 0.307455495}, // 7748K {0.297674488, 0.307444497}, // 7749K {0.297664204, 0.307433502}, // 7750K {0.297653925, 0.30742251}, // 7751K {0.297643648, 0.30741152}, // 7752K {0.297633374, 0.307400533}, // 7753K {0.297623104, 0.307389549}, // 7754K {0.297612837, 0.307378568}, // 7755K {0.297602573, 0.307367589}, // 7756K {0.297592312, 0.307356613}, // 7757K {0.297582055, 0.30734564}, // 7758K {0.2975718, 0.30733467}, // 7759K {0.297561549, 0.307323702}, // 7760K {0.297551301, 0.307312737}, // 7761K {0.297541056, 0.307301775}, // 7762K {0.297530814, 0.307290816}, // 7763K {0.297520576, 0.307279859}, // 7764K {0.29751034, 0.307268905}, // 7765K {0.297500108, 0.307257954}, // 7766K {0.297489879, 0.307247006}, // 7767K {0.297479653, 0.30723606}, // 7768K {0.297469431, 0.307225117}, // 7769K {0.297459211, 0.307214177}, // 7770K {0.297448995, 0.307203239}, // 7771K {0.297438781, 0.307192305}, // 7772K {0.297428571, 0.307181373}, // 7773K {0.297418365, 0.307170443}, // 7774K {0.297408161, 0.307159517}, // 7775K {0.29739796, 0.307148593}, // 7776K {0.297387763, 0.307137672}, // 7777K {0.297377569, 0.307126753}, // 7778K {0.297367377, 0.307115838}, // 7779K {0.297357189, 0.307104925}, // 7780K {0.297347005, 0.307094014}, // 7781K {0.297336823, 0.307083107}, // 7782K {0.297326645, 0.307072202}, // 7783K {0.297316469, 0.3070613}, // 7784K {0.297306297, 0.307050401}, // 7785K {0.297296128, 0.307039504}, // 7786K {0.297285962, 0.30702861}, // 7787K {0.297275799, 0.307017719}, // 7788K {0.297265639, 0.307006831}, // 7789K {0.297255483, 0.306995945}, // 7790K {0.29724533, 0.306985062}, // 7791K {0.297235179, 0.306974182}, // 7792K {0.297225032, 0.306963304}, // 7793K {0.297214888, 0.306952429}, // 7794K {0.297204747, 0.306941557}, // 7795K {0.29719461, 0.306930688}, // 7796K {0.297184475, 0.306919821}, // 7797K {0.297174344, 0.306908957}, // 7798K {0.297164215, 0.306898096}, // 7799K {0.29715409, 0.306887237}, // 7800K {0.297143968, 0.306876381}, // 7801K {0.297133849, 0.306865528}, // 7802K {0.297123733, 0.306854678}, // 7803K {0.297113621, 0.30684383}, // 7804K {0.297103511, 0.306832985}, // 7805K {0.297093405, 0.306822142}, // 7806K {0.297083301, 0.306811303}, // 7807K {0.297073201, 0.306800466}, // 7808K {0.297063104, 0.306789631}, // 7809K {0.29705301, 0.3067788}, // 7810K {0.297042919, 0.306767971}, // 7811K {0.297032831, 0.306757145}, // 7812K {0.297022746, 0.306746321}, // 7813K {0.297012665, 0.306735501}, // 7814K {0.297002586, 0.306724683}, // 7815K {0.296992511, 0.306713867}, // 7816K {0.296982439, 0.306703055}, // 7817K {0.296972369, 0.306692245}, // 7818K {0.296962303, 0.306681437}, // 7819K {0.29695224, 0.306670633}, // 7820K {0.296942181, 0.306659831}, // 7821K {0.296932124, 0.306649032}, // 7822K {0.29692207, 0.306638235}, // 7823K {0.296912019, 0.306627441}, // 7824K {0.296901972, 0.30661665}, // 7825K {0.296891928, 0.306605862}, // 7826K {0.296881886, 0.306595076}, // 7827K {0.296871848, 0.306584293}, // 7828K {0.296861813, 0.306573512}, // 7829K {0.296851781, 0.306562735}, // 7830K {0.296841752, 0.30655196}, // 7831K {0.296831726, 0.306541187}, // 7832K {0.296821703, 0.306530418}, // 7833K {0.296811683, 0.306519651}, // 7834K {0.296801667, 0.306508886}, // 7835K {0.296791653, 0.306498125}, // 7836K {0.296781643, 0.306487366}, // 7837K {0.296771635, 0.306476609}, // 7838K {0.296761631, 0.306465856}, // 7839K {0.29675163, 0.306455105}, // 7840K {0.296741632, 0.306444357}, // 7841K {0.296731636, 0.306433611}, // 7842K {0.296721644, 0.306422868}, // 7843K {0.296711655, 0.306412128}, // 7844K {0.296701669, 0.30640139}, // 7845K {0.296691687, 0.306390655}, // 7846K {0.296681707, 0.306379923}, // 7847K {0.29667173, 0.306369194}, // 7848K {0.296661756, 0.306358467}, // 7849K {0.296651786, 0.306347743}, // 7850K {0.296641818, 0.306337021}, // 7851K {0.296631854, 0.306326302}, // 7852K {0.296621892, 0.306315586}, // 7853K {0.296611934, 0.306304872}, // 7854K {0.296601979, 0.306294161}, // 7855K {0.296592026, 0.306283453}, // 7856K {0.296582077, 0.306272748}, // 7857K {0.296572131, 0.306262045}, // 7858K {0.296562188, 0.306251344}, // 7859K {0.296552248, 0.306240647}, // 7860K {0.296542311, 0.306229952}, // 7861K {0.296532377, 0.30621926}, // 7862K {0.296522446, 0.30620857}, // 7863K {0.296512518, 0.306197883}, // 7864K {0.296502593, 0.306187199}, // 7865K {0.296492671, 0.306176517}, // 7866K {0.296482753, 0.306165838}, // 7867K {0.296472837, 0.306155162}, // 7868K {0.296462924, 0.306144488}, // 7869K {0.296453015, 0.306133817}, // 7870K {0.296443108, 0.306123149}, // 7871K {0.296433204, 0.306112483}, // 7872K {0.296423304, 0.30610182}, // 7873K {0.296413406, 0.306091159}, // 7874K {0.296403512, 0.306080501}, // 7875K {0.29639362, 0.306069846}, // 7876K {0.296383732, 0.306059194}, // 7877K {0.296373846, 0.306048544}, // 7878K {0.296363964, 0.306037897}, // 7879K {0.296354085, 0.306027252}, // 7880K {0.296344208, 0.30601661}, // 7881K {0.296334335, 0.306005971}, // 7882K {0.296324465, 0.305995334}, // 7883K {0.296314597, 0.3059847}, // 7884K {0.296304733, 0.305974069}, // 7885K {0.296294872, 0.30596344}, // 7886K {0.296285013, 0.305952814}, // 7887K {0.296275158, 0.30594219}, // 7888K {0.296265306, 0.305931569}, // 7889K {0.296255457, 0.305920951}, // 7890K {0.29624561, 0.305910336}, // 7891K {0.296235767, 0.305899723}, // 7892K {0.296225927, 0.305889112}, // 7893K {0.29621609, 0.305878505}, // 7894K {0.296206256, 0.305867899}, // 7895K {0.296196424, 0.305857297}, // 7896K {0.296186596, 0.305846697}, // 7897K {0.296176771, 0.3058361}, // 7898K {0.296166949, 0.305825505}, // 7899K {0.29615713, 0.305814914}, // 7900K {0.296147313, 0.305804324}, // 7901K {0.2961375, 0.305793738}, // 7902K {0.29612769, 0.305783154}, // 7903K {0.296117883, 0.305772572}, // 7904K {0.296108079, 0.305761993}, // 7905K {0.296098277, 0.305751417}, // 7906K {0.296088479, 0.305740844}, // 7907K {0.296078684, 0.305730273}, // 7908K {0.296068892, 0.305719704}, // 7909K {0.296059102, 0.305709139}, // 7910K {0.296049316, 0.305698575}, // 7911K {0.296039533, 0.305688015}, // 7912K {0.296029752, 0.305677457}, // 7913K {0.296019975, 0.305666902}, // 7914K {0.2960102, 0.305656349}, // 7915K {0.296000429, 0.305645799}, // 7916K {0.295990661, 0.305635252}, // 7917K {0.295980895, 0.305624707}, // 7918K {0.295971133, 0.305614165}, // 7919K {0.295961373, 0.305603625}, // 7920K {0.295951617, 0.305593088}, // 7921K {0.295941863, 0.305582554}, // 7922K {0.295932112, 0.305572022}, // 7923K {0.295922365, 0.305561493}, // 7924K {0.29591262, 0.305550966}, // 7925K {0.295902878, 0.305540442}, // 7926K {0.29589314, 0.305529921}, // 7927K {0.295883404, 0.305519402}, // 7928K {0.295873671, 0.305508886}, // 7929K {0.295863941, 0.305498373}, // 7930K {0.295854214, 0.305487862}, // 7931K {0.29584449, 0.305477353}, // 7932K {0.295834769, 0.305466848}, // 7933K {0.295825051, 0.305456344}, // 7934K {0.295815336, 0.305445844}, // 7935K {0.295805624, 0.305435346}, // 7936K {0.295795915, 0.305424851}, // 7937K {0.295786209, 0.305414358}, // 7938K {0.295776506, 0.305403868}, // 7939K {0.295766805, 0.30539338}, // 7940K {0.295757108, 0.305382895}, // 7941K {0.295747413, 0.305372413}, // 7942K {0.295737722, 0.305361933}, // 7943K {0.295728033, 0.305351456}, // 7944K {0.295718348, 0.305340981}, // 7945K {0.295708665, 0.305330509}, // 7946K {0.295698985, 0.30532004}, // 7947K {0.295689309, 0.305309573}, // 7948K {0.295679635, 0.305299108}, // 7949K {0.295669964, 0.305288647}, // 7950K {0.295660296, 0.305278188}, // 7951K {0.295650631, 0.305267731}, // 7952K {0.295640969, 0.305257277}, // 7953K {0.29563131, 0.305246826}, // 7954K {0.295621653, 0.305236377}, // 7955K {0.295612, 0.305225931}, // 7956K {0.29560235, 0.305215487}, // 7957K {0.295592702, 0.305205046}, // 7958K {0.295583058, 0.305194608}, // 7959K {0.295573416, 0.305184172}, // 7960K {0.295563777, 0.305173739}, // 7961K {0.295554141, 0.305163308}, // 7962K {0.295544509, 0.30515288}, // 7963K {0.295534879, 0.305142454}, // 7964K {0.295525252, 0.305132031}, // 7965K {0.295515628, 0.305121611}, // 7966K {0.295506006, 0.305111193}, // 7967K {0.295496388, 0.305100778}, // 7968K {0.295486773, 0.305090365}, // 7969K {0.29547716, 0.305079955}, // 7970K {0.295467551, 0.305069547}, // 7971K {0.295457944, 0.305059142}, // 7972K {0.29544834, 0.30504874}, // 7973K {0.29543874, 0.30503834}, // 7974K {0.295429142, 0.305027942}, // 7975K {0.295419547, 0.305017548}, // 7976K {0.295409954, 0.305007155}, // 7977K {0.295400365, 0.304996766}, // 7978K {0.295390779, 0.304986379}, // 7979K {0.295381196, 0.304975994}, // 7980K {0.295371615, 0.304965612}, // 7981K {0.295362037, 0.304955233}, // 7982K {0.295352463, 0.304944856}, // 7983K {0.295342891, 0.304934482}, // 7984K {0.295333322, 0.30492411}, // 7985K {0.295323756, 0.304913741}, // 7986K {0.295314193, 0.304903374}, // 7987K {0.295304633, 0.30489301}, // 7988K {0.295295075, 0.304882649}, // 7989K {0.295285521, 0.30487229}, // 7990K {0.295275969, 0.304861933}, // 7991K {0.29526642, 0.30485158}, // 7992K {0.295256875, 0.304841228}, // 7993K {0.295247332, 0.30483088}, // 7994K {0.295237792, 0.304820533}, // 7995K {0.295228255, 0.30481019}, // 7996K {0.29521872, 0.304799849}, // 7997K {0.295209189, 0.30478951}, // 7998K {0.29519966, 0.304779174}, // 7999K {0.295190135, 0.304768841}, // 8000K {0.295180612, 0.30475851}, // 8001K {0.295171092, 0.304748181}, // 8002K {0.295161575, 0.304737855}, // 8003K {0.295152061, 0.304727532}, // 8004K {0.295142549, 0.304717211}, // 8005K {0.295133041, 0.304706893}, // 8006K {0.295123535, 0.304696578}, // 8007K {0.295114033, 0.304686264}, // 8008K {0.295104533, 0.304675954}, // 8009K {0.295095036, 0.304665646}, // 8010K {0.295085542, 0.30465534}, // 8011K {0.295076051, 0.304645037}, // 8012K {0.295066562, 0.304634737}, // 8013K {0.295057077, 0.304624439}, // 8014K {0.295047594, 0.304614144}, // 8015K {0.295038114, 0.304603851}, // 8016K {0.295028637, 0.30459356}, // 8017K {0.295019163, 0.304583273}, // 8018K {0.295009692, 0.304572987}, // 8019K {0.295000223, 0.304562705}, // 8020K {0.294990758, 0.304552424}, // 8021K {0.294981295, 0.304542147}, // 8022K {0.294971835, 0.304531872}, // 8023K {0.294962378, 0.304521599}, // 8024K {0.294952924, 0.304511329}, // 8025K {0.294943473, 0.304501061}, // 8026K {0.294934025, 0.304490796}, // 8027K {0.294924579, 0.304480534}, // 8028K {0.294915136, 0.304470274}, // 8029K {0.294905696, 0.304460016}, // 8030K {0.294896259, 0.304449761}, // 8031K {0.294886825, 0.304439509}, // 8032K {0.294877393, 0.304429259}, // 8033K {0.294867965, 0.304419012}, // 8034K {0.294858539, 0.304408767}, // 8035K {0.294849116, 0.304398524}, // 8036K {0.294839696, 0.304388284}, // 8037K {0.294830279, 0.304378047}, // 8038K {0.294820864, 0.304367812}, // 8039K {0.294811453, 0.30435758}, // 8040K {0.294802044, 0.30434735}, // 8041K {0.294792638, 0.304337123}, // 8042K {0.294783235, 0.304326898}, // 8043K {0.294773835, 0.304316676}, // 8044K {0.294764437, 0.304306456}, // 8045K {0.294755043, 0.304296239}, // 8046K {0.294745651, 0.304286024}, // 8047K {0.294736262, 0.304275812}, // 8048K {0.294726876, 0.304265602}, // 8049K {0.294717492, 0.304255395}, // 8050K {0.294708112, 0.30424519}, // 8051K {0.294698734, 0.304234988}, // 8052K {0.294689359, 0.304224788}, // 8053K {0.294679987, 0.304214591}, // 8054K {0.294670618, 0.304204396}, // 8055K {0.294661251, 0.304194204}, // 8056K {0.294651887, 0.304184014}, // 8057K {0.294642527, 0.304173827}, // 8058K {0.294633168, 0.304163643}, // 8059K {0.294623813, 0.30415346}, // 8060K {0.294614461, 0.304143281}, // 8061K {0.294605111, 0.304133103}, // 8062K {0.294595764, 0.304122929}, // 8063K {0.29458642, 0.304112756}, // 8064K {0.294577079, 0.304102587}, // 8065K {0.29456774, 0.304092419}, // 8066K {0.294558405, 0.304082255}, // 8067K {0.294549072, 0.304072092}, // 8068K {0.294539742, 0.304061933}, // 8069K {0.294530415, 0.304051775}, // 8070K {0.29452109, 0.304041621}, // 8071K {0.294511768, 0.304031468}, // 8072K {0.29450245, 0.304021319}, // 8073K {0.294493133, 0.304011171}, // 8074K {0.29448382, 0.304001026}, // 8075K {0.29447451, 0.303990884}, // 8076K {0.294465202, 0.303980744}, // 8077K {0.294455897, 0.303970607}, // 8078K {0.294446595, 0.303960472}, // 8079K {0.294437295, 0.30395034}, // 8080K {0.294427999, 0.30394021}, // 8081K {0.294418705, 0.303930082}, // 8082K {0.294409414, 0.303919957}, // 8083K {0.294400126, 0.303909835}, // 8084K {0.29439084, 0.303899715}, // 8085K {0.294381557, 0.303889597}, // 8086K {0.294372278, 0.303879482}, // 8087K {0.294363, 0.303869369}, // 8088K {0.294353726, 0.303859259}, // 8089K {0.294344454, 0.303849152}, // 8090K {0.294335186, 0.303839047}, // 8091K {0.294325919, 0.303828944}, // 8092K {0.294316656, 0.303818844}, // 8093K {0.294307396, 0.303808746}, // 8094K {0.294298138, 0.303798651}, // 8095K {0.294288883, 0.303788558}, // 8096K {0.294279631, 0.303778468}, // 8097K {0.294270381, 0.30376838}, // 8098K {0.294261134, 0.303758294}, // 8099K {0.29425189, 0.303748211}, // 8100K {0.294242649, 0.303738131}, // 8101K {0.294233411, 0.303728053}, // 8102K {0.294224175, 0.303717977}, // 8103K {0.294214942, 0.303707904}, // 8104K {0.294205712, 0.303697834}, // 8105K {0.294196484, 0.303687766}, // 8106K {0.29418726, 0.3036777}, // 8107K {0.294178038, 0.303667637}, // 8108K {0.294168819, 0.303657576}, // 8109K {0.294159602, 0.303647518}, // 8110K {0.294150389, 0.303637462}, // 8111K {0.294141178, 0.303627408}, // 8112K {0.29413197, 0.303617357}, // 8113K {0.294122764, 0.303607309}, // 8114K {0.294113561, 0.303597263}, // 8115K {0.294104361, 0.303587219}, // 8116K {0.294095164, 0.303577178}, // 8117K {0.29408597, 0.30356714}, // 8118K {0.294076778, 0.303557103}, // 8119K {0.294067589, 0.30354707}, // 8120K {0.294058403, 0.303537038}, // 8121K {0.294049219, 0.303527009}, // 8122K {0.294040038, 0.303516983}, // 8123K {0.29403086, 0.303506959}, // 8124K {0.294021685, 0.303496938}, // 8125K {0.294012512, 0.303486918}, // 8126K {0.294003343, 0.303476902}, // 8127K {0.293994175, 0.303466888}, // 8128K {0.293985011, 0.303456876}, // 8129K {0.293975849, 0.303446867}, // 8130K {0.29396669, 0.30343686}, // 8131K {0.293957534, 0.303426855}, // 8132K {0.293948381, 0.303416853}, // 8133K {0.29393923, 0.303406854}, // 8134K {0.293930082, 0.303396857}, // 8135K {0.293920937, 0.303386862}, // 8136K {0.293911794, 0.30337687}, // 8137K {0.293902654, 0.30336688}, // 8138K {0.293893517, 0.303356893}, // 8139K {0.293884382, 0.303346908}, // 8140K {0.293875251, 0.303336926}, // 8141K {0.293866122, 0.303326946}, // 8142K {0.293856995, 0.303316968}, // 8143K {0.293847872, 0.303306993}, // 8144K {0.293838751, 0.30329702}, // 8145K {0.293829632, 0.30328705}, // 8146K {0.293820517, 0.303277082}, // 8147K {0.293811404, 0.303267117}, // 8148K {0.293802294, 0.303257154}, // 8149K {0.293793187, 0.303247193}, // 8150K {0.293784082, 0.303237235}, // 8151K {0.29377498, 0.303227279}, // 8152K {0.293765881, 0.303217326}, // 8153K {0.293756784, 0.303207375}, // 8154K {0.29374769, 0.303197427}, // 8155K {0.293738599, 0.303187481}, // 8156K {0.293729511, 0.303177537}, // 8157K {0.293720425, 0.303167596}, // 8158K {0.293711342, 0.303157657}, // 8159K {0.293702262, 0.303147721}, // 8160K {0.293693184, 0.303137787}, // 8161K {0.293684109, 0.303127856}, // 8162K {0.293675037, 0.303117926}, // 8163K {0.293665967, 0.303108}, // 8164K {0.2936569, 0.303098076}, // 8165K {0.293647836, 0.303088154}, // 8166K {0.293638774, 0.303078234}, // 8167K {0.293629715, 0.303068317}, // 8168K {0.293620659, 0.303058403}, // 8169K {0.293611606, 0.303048491}, // 8170K {0.293602555, 0.303038581}, // 8171K {0.293593507, 0.303028674}, // 8172K {0.293584461, 0.303018769}, // 8173K {0.293575418, 0.303008866}, // 8174K {0.293566378, 0.302998966}, // 8175K {0.293557341, 0.302989069}, // 8176K {0.293548306, 0.302979173}, // 8177K {0.293539274, 0.30296928}, // 8178K {0.293530245, 0.30295939}, // 8179K {0.293521218, 0.302949502}, // 8180K {0.293512194, 0.302939616}, // 8181K {0.293503172, 0.302929733}, // 8182K {0.293494154, 0.302919852}, // 8183K {0.293485138, 0.302909974}, // 8184K {0.293476124, 0.302900098}, // 8185K {0.293467113, 0.302890224}, // 8186K {0.293458105, 0.302880353}, // 8187K {0.2934491, 0.302870484}, // 8188K {0.293440097, 0.302860618}, // 8189K {0.293431097, 0.302850754}, // 8190K {0.2934221, 0.302840892}, // 8191K {0.293413105, 0.302831033}, // 8192K {0.293404113, 0.302821176}, // 8193K {0.293395123, 0.302811321}, // 8194K {0.293386137, 0.302801469}, // 8195K {0.293377152, 0.30279162}, // 8196K {0.293368171, 0.302781772}, // 8197K {0.293359192, 0.302771928}, // 8198K {0.293350216, 0.302762085}, // 8199K {0.293341242, 0.302752245}, // 8200K {0.293332272, 0.302742407}, // 8201K {0.293323303, 0.302732572}, // 8202K {0.293314338, 0.302722739}, // 8203K {0.293305375, 0.302712909}, // 8204K {0.293296414, 0.30270308}, // 8205K {0.293287457, 0.302693255}, // 8206K {0.293278502, 0.302683431}, // 8207K {0.293269549, 0.30267361}, // 8208K {0.2932606, 0.302663792}, // 8209K {0.293251653, 0.302653976}, // 8210K {0.293242708, 0.302644162}, // 8211K {0.293233766, 0.30263435}, // 8212K {0.293224827, 0.302624541}, // 8213K {0.293215891, 0.302614735}, // 8214K {0.293206957, 0.30260493}, // 8215K {0.293198026, 0.302595128}, // 8216K {0.293189097, 0.302585329}, // 8217K {0.293180171, 0.302575532}, // 8218K {0.293171248, 0.302565737}, // 8219K {0.293162327, 0.302555944}, // 8220K {0.293153409, 0.302546154}, // 8221K {0.293144493, 0.302536367}, // 8222K {0.29313558, 0.302526581}, // 8223K {0.29312667, 0.302516798}, // 8224K {0.293117762, 0.302507018}, // 8225K {0.293108857, 0.30249724}, // 8226K {0.293099955, 0.302487464}, // 8227K {0.293091055, 0.302477691}, // 8228K {0.293082158, 0.302467919}, // 8229K {0.293073264, 0.302458151}, // 8230K {0.293064372, 0.302448384}, // 8231K {0.293055483, 0.30243862}, // 8232K {0.293046596, 0.302428859}, // 8233K {0.293037712, 0.3024191}, // 8234K {0.29302883, 0.302409343}, // 8235K {0.293019952, 0.302399588}, // 8236K {0.293011075, 0.302389836}, // 8237K {0.293002202, 0.302380086}, // 8238K {0.292993331, 0.302370339}, // 8239K {0.292984462, 0.302360594}, // 8240K {0.292975597, 0.302350851}, // 8241K {0.292966733, 0.302341111}, // 8242K {0.292957873, 0.302331373}, // 8243K {0.292949015, 0.302321637}, // 8244K {0.29294016, 0.302311904}, // 8245K {0.292931307, 0.302302173}, // 8246K {0.292922457, 0.302292445}, // 8247K {0.292913609, 0.302282719}, // 8248K {0.292904764, 0.302272995}, // 8249K {0.292895922, 0.302263273}, // 8250K {0.292887082, 0.302253554}, // 8251K {0.292878245, 0.302243837}, // 8252K {0.29286941, 0.302234123}, // 8253K {0.292860578, 0.302224411}, // 8254K {0.292851749, 0.302214701}, // 8255K {0.292842922, 0.302204994}, // 8256K {0.292834098, 0.302195289}, // 8257K {0.292825276, 0.302185586}, // 8258K {0.292816457, 0.302175886}, // 8259K {0.292807641, 0.302166188}, // 8260K {0.292798827, 0.302156492}, // 8261K {0.292790016, 0.302146799}, // 8262K {0.292781207, 0.302137108}, // 8263K {0.292772401, 0.30212742}, // 8264K {0.292763597, 0.302117733}, // 8265K {0.292754796, 0.30210805}, // 8266K {0.292745998, 0.302098368}, // 8267K {0.292737202, 0.302088689}, // 8268K {0.292728409, 0.302079012}, // 8269K {0.292719619, 0.302069337}, // 8270K {0.29271083, 0.302059665}, // 8271K {0.292702045, 0.302049995}, // 8272K {0.292693262, 0.302040328}, // 8273K {0.292684482, 0.302030663}, // 8274K {0.292675704, 0.302021}, // 8275K {0.292666929, 0.302011339}, // 8276K {0.292658156, 0.302001681}, // 8277K {0.292649386, 0.301992025}, // 8278K {0.292640619, 0.301982372}, // 8279K {0.292631854, 0.301972721}, // 8280K {0.292623091, 0.301963072}, // 8281K {0.292614332, 0.301953425}, // 8282K {0.292605574, 0.301943781}, // 8283K {0.29259682, 0.301934139}, // 8284K {0.292588068, 0.3019245}, // 8285K {0.292579318, 0.301914863}, // 8286K {0.292570571, 0.301905228}, // 8287K {0.292561827, 0.301895595}, // 8288K {0.292553085, 0.301885965}, // 8289K {0.292544346, 0.301876337}, // 8290K {0.292535609, 0.301866712}, // 8291K {0.292526875, 0.301857088}, // 8292K {0.292518143, 0.301847467}, // 8293K {0.292509414, 0.301837849}, // 8294K {0.292500687, 0.301828233}, // 8295K {0.292491963, 0.301818619}, // 8296K {0.292483242, 0.301809007}, // 8297K {0.292474523, 0.301799398}, // 8298K {0.292465807, 0.301789791}, // 8299K {0.292457093, 0.301780186}, // 8300K {0.292448382, 0.301770584}, // 8301K {0.292439673, 0.301760984}, // 8302K {0.292430967, 0.301751386}, // 8303K {0.292422263, 0.301741791}, // 8304K {0.292413562, 0.301732197}, // 8305K {0.292404863, 0.301722607}, // 8306K {0.292396167, 0.301713018}, // 8307K {0.292387474, 0.301703432}, // 8308K {0.292378783, 0.301693848}, // 8309K {0.292370095, 0.301684267}, // 8310K {0.292361409, 0.301674688}, // 8311K {0.292352726, 0.301665111}, // 8312K {0.292344045, 0.301655536}, // 8313K {0.292335366, 0.301645964}, // 8314K {0.292326691, 0.301636394}, // 8315K {0.292318018, 0.301626826}, // 8316K {0.292309347, 0.301617261}, // 8317K {0.292300679, 0.301607698}, // 8318K {0.292292013, 0.301598137}, // 8319K {0.29228335, 0.301588578}, // 8320K {0.292274689, 0.301579022}, // 8321K {0.292266031, 0.301569468}, // 8322K {0.292257376, 0.301559917}, // 8323K {0.292248723, 0.301550368}, // 8324K {0.292240072, 0.301540821}, // 8325K {0.292231424, 0.301531276}, // 8326K {0.292222779, 0.301521734}, // 8327K {0.292214136, 0.301512194}, // 8328K {0.292205496, 0.301502656}, // 8329K {0.292196858, 0.30149312}, // 8330K {0.292188222, 0.301483587}, // 8331K {0.29217959, 0.301474056}, // 8332K {0.292170959, 0.301464528}, // 8333K {0.292162331, 0.301455002}, // 8334K {0.292153706, 0.301445478}, // 8335K {0.292145083, 0.301435956}, // 8336K {0.292136463, 0.301426437}, // 8337K {0.292127845, 0.301416919}, // 8338K {0.29211923, 0.301407405}, // 8339K {0.292110617, 0.301397892}, // 8340K {0.292102007, 0.301388382}, // 8341K {0.292093399, 0.301378874}, // 8342K {0.292084794, 0.301369368}, // 8343K {0.292076191, 0.301359865}, // 8344K {0.292067591, 0.301350364}, // 8345K {0.292058993, 0.301340865}, // 8346K {0.292050398, 0.301331368}, // 8347K {0.292041805, 0.301321874}, // 8348K {0.292033214, 0.301312382}, // 8349K {0.292024627, 0.301302893}, // 8350K {0.292016041, 0.301293405}, // 8351K {0.292007459, 0.30128392}, // 8352K {0.291998878, 0.301274437}, // 8353K {0.2919903, 0.301264957}, // 8354K {0.291981725, 0.301255478}, // 8355K {0.291973152, 0.301246002}, // 8356K {0.291964582, 0.301236529}, // 8357K {0.291956014, 0.301227057}, // 8358K {0.291947449, 0.301217588}, // 8359K {0.291938886, 0.301208121}, // 8360K {0.291930325, 0.301198657}, // 8361K {0.291921768, 0.301189194}, // 8362K {0.291913212, 0.301179734}, // 8363K {0.291904659, 0.301170276}, // 8364K {0.291896109, 0.301160821}, // 8365K {0.291887561, 0.301151368}, // 8366K {0.291879015, 0.301141917}, // 8367K {0.291870472, 0.301132468}, // 8368K {0.291861932, 0.301123022}, // 8369K {0.291853394, 0.301113577}, // 8370K {0.291844858, 0.301104136}, // 8371K {0.291836325, 0.301094696}, // 8372K {0.291827794, 0.301085259}, // 8373K {0.291819266, 0.301075823}, // 8374K {0.29181074, 0.301066391}, // 8375K {0.291802217, 0.30105696}, // 8376K {0.291793696, 0.301047532}, // 8377K {0.291785178, 0.301038106}, // 8378K {0.291776662, 0.301028682}, // 8379K {0.291768149, 0.30101926}, // 8380K {0.291759638, 0.301009841}, // 8381K {0.291751129, 0.301000424}, // 8382K {0.291742623, 0.300991009}, // 8383K {0.29173412, 0.300981597}, // 8384K {0.291725619, 0.300972187}, // 8385K {0.29171712, 0.300962779}, // 8386K {0.291708624, 0.300953373}, // 8387K {0.29170013, 0.30094397}, // 8388K {0.291691639, 0.300934568}, // 8389K {0.29168315, 0.300925169}, // 8390K {0.291674664, 0.300915773}, // 8391K {0.29166618, 0.300906378}, // 8392K {0.291657699, 0.300896986}, // 8393K {0.29164922, 0.300887596}, // 8394K {0.291640743, 0.300878208}, // 8395K {0.291632269, 0.300868823}, // 8396K {0.291623798, 0.30085944}, // 8397K {0.291615329, 0.300850059}, // 8398K {0.291606862, 0.30084068}, // 8399K {0.291598398, 0.300831304}, // 8400K {0.291589936, 0.30082193}, // 8401K {0.291581476, 0.300812558}, // 8402K {0.291573019, 0.300803188}, // 8403K {0.291564565, 0.30079382}, // 8404K {0.291556113, 0.300784455}, // 8405K {0.291547663, 0.300775092}, // 8406K {0.291539216, 0.300765732}, // 8407K {0.291530771, 0.300756373}, // 8408K {0.291522329, 0.300747017}, // 8409K {0.291513889, 0.300737663}, // 8410K {0.291505452, 0.300728311}, // 8411K {0.291497017, 0.300718962}, // 8412K {0.291488584, 0.300709614}, // 8413K {0.291480154, 0.300700269}, // 8414K {0.291471727, 0.300690926}, // 8415K {0.291463301, 0.300681586}, // 8416K {0.291454879, 0.300672248}, // 8417K {0.291446458, 0.300662911}, // 8418K {0.29143804, 0.300653578}, // 8419K {0.291429625, 0.300644246}, // 8420K {0.291421212, 0.300634917}, // 8421K {0.291412801, 0.300625589}, // 8422K {0.291404393, 0.300616264}, // 8423K {0.291395987, 0.300606942}, // 8424K {0.291387583, 0.300597621}, // 8425K {0.291379182, 0.300588303}, // 8426K {0.291370784, 0.300578987}, // 8427K {0.291362388, 0.300569673}, // 8428K {0.291353994, 0.300560362}, // 8429K {0.291345603, 0.300551052}, // 8430K {0.291337214, 0.300541745}, // 8431K {0.291328827, 0.30053244}, // 8432K {0.291320443, 0.300523138}, // 8433K {0.291312062, 0.300513837}, // 8434K {0.291303682, 0.300504539}, // 8435K {0.291295306, 0.300495243}, // 8436K {0.291286931, 0.300485949}, // 8437K {0.291278559, 0.300476658}, // 8438K {0.29127019, 0.300467368}, // 8439K {0.291261822, 0.300458081}, // 8440K {0.291253458, 0.300448796}, // 8441K {0.291245095, 0.300439514}, // 8442K {0.291236735, 0.300430233}, // 8443K {0.291228378, 0.300420955}, // 8444K {0.291220022, 0.300411679}, // 8445K {0.29121167, 0.300402405}, // 8446K {0.291203319, 0.300393134}, // 8447K {0.291194971, 0.300383864}, // 8448K {0.291186626, 0.300374597}, // 8449K {0.291178283, 0.300365332}, // 8450K {0.291169942, 0.300356069}, // 8451K {0.291161604, 0.300346809}, // 8452K {0.291153268, 0.300337551}, // 8453K {0.291144934, 0.300328294}, // 8454K {0.291136603, 0.300319041}, // 8455K {0.291128274, 0.300309789}, // 8456K {0.291119948, 0.300300539}, // 8457K {0.291111624, 0.300291292}, // 8458K {0.291103302, 0.300282047}, // 8459K {0.291094983, 0.300272804}, // 8460K {0.291086666, 0.300263564}, // 8461K {0.291078352, 0.300254325}, // 8462K {0.29107004, 0.300245089}, // 8463K {0.29106173, 0.300235855}, // 8464K {0.291053423, 0.300226623}, // 8465K {0.291045118, 0.300217393}, // 8466K {0.291036815, 0.300208166}, // 8467K {0.291028515, 0.300198941}, // 8468K {0.291020217, 0.300189718}, // 8469K {0.291011922, 0.300180497}, // 8470K {0.291003629, 0.300171278}, // 8471K {0.290995338, 0.300162062}, // 8472K {0.29098705, 0.300152848}, // 8473K {0.290978764, 0.300143636}, // 8474K {0.290970481, 0.300134426}, // 8475K {0.2909622, 0.300125218}, // 8476K {0.290953921, 0.300116013}, // 8477K {0.290945644, 0.300106809}, // 8478K {0.29093737, 0.300097608}, // 8479K {0.290929099, 0.300088409}, // 8480K {0.29092083, 0.300079213}, // 8481K {0.290912563, 0.300070018}, // 8482K {0.290904298, 0.300060826}, // 8483K {0.290896036, 0.300051636}, // 8484K {0.290887776, 0.300042448}, // 8485K {0.290879519, 0.300033262}, // 8486K {0.290871264, 0.300024079}, // 8487K {0.290863011, 0.300014897}, // 8488K {0.290854761, 0.300005718}, // 8489K {0.290846513, 0.299996541}, // 8490K {0.290838267, 0.299987366}, // 8491K {0.290830024, 0.299978194}, // 8492K {0.290821783, 0.299969023}, // 8493K {0.290813544, 0.299959855}, // 8494K {0.290805308, 0.299950689}, // 8495K {0.290797074, 0.299941525}, // 8496K {0.290788843, 0.299932364}, // 8497K {0.290780614, 0.299923204}, // 8498K {0.290772387, 0.299914047}, // 8499K {0.290764163, 0.299904892}, // 8500K {0.290755941, 0.299895739}, // 8501K {0.290747721, 0.299886588}, // 8502K {0.290739503, 0.299877439}, // 8503K {0.290731288, 0.299868293}, // 8504K {0.290723076, 0.299859148}, // 8505K {0.290714865, 0.299850006}, // 8506K {0.290706657, 0.299840866}, // 8507K {0.290698452, 0.299831729}, // 8508K {0.290690249, 0.299822593}, // 8509K {0.290682048, 0.29981346}, // 8510K {0.290673849, 0.299804328}, // 8511K {0.290665653, 0.299795199}, // 8512K {0.290657459, 0.299786072}, // 8513K {0.290649267, 0.299776948}, // 8514K {0.290641078, 0.299767825}, // 8515K {0.290632891, 0.299758705}, // 8516K {0.290624706, 0.299749587}, // 8517K {0.290616524, 0.299740471}, // 8518K {0.290608344, 0.299731357}, // 8519K {0.290600167, 0.299722245}, // 8520K {0.290591992, 0.299713135}, // 8521K {0.290583819, 0.299704028}, // 8522K {0.290575648, 0.299694923}, // 8523K {0.29056748, 0.29968582}, // 8524K {0.290559314, 0.299676719}, // 8525K {0.29055115, 0.29966762}, // 8526K {0.290542989, 0.299658524}, // 8527K {0.29053483, 0.299649429}, // 8528K {0.290526673, 0.299640337}, // 8529K {0.290518519, 0.299631247}, // 8530K {0.290510367, 0.299622159}, // 8531K {0.290502218, 0.299613073}, // 8532K {0.29049407, 0.299603989}, // 8533K {0.290485925, 0.299594908}, // 8534K {0.290477783, 0.299585829}, // 8535K {0.290469642, 0.299576752}, // 8536K {0.290461504, 0.299567677}, // 8537K {0.290453368, 0.299558604}, // 8538K {0.290445235, 0.299549533}, // 8539K {0.290437104, 0.299540464}, // 8540K {0.290428975, 0.299531398}, // 8541K {0.290420849, 0.299522334}, // 8542K {0.290412725, 0.299513272}, // 8543K {0.290404603, 0.299504212}, // 8544K {0.290396483, 0.299495154}, // 8545K {0.290388366, 0.299486098}, // 8546K {0.290380251, 0.299477045}, // 8547K {0.290372139, 0.299467994}, // 8548K {0.290364028, 0.299458944}, // 8549K {0.29035592, 0.299449897}, // 8550K {0.290347815, 0.299440852}, // 8551K {0.290339711, 0.29943181}, // 8552K {0.29033161, 0.299422769}, // 8553K {0.290323511, 0.299413731}, // 8554K {0.290315415, 0.299404694}, // 8555K {0.290307321, 0.29939566}, // 8556K {0.290299229, 0.299386628}, // 8557K {0.290291139, 0.299377598}, // 8558K {0.290283052, 0.29936857}, // 8559K {0.290274967, 0.299359545}, // 8560K {0.290266884, 0.299350521}, // 8561K {0.290258804, 0.2993415}, // 8562K {0.290250726, 0.299332481}, // 8563K {0.29024265, 0.299323464}, // 8564K {0.290234577, 0.299314449}, // 8565K {0.290226505, 0.299305436}, // 8566K {0.290218437, 0.299296425}, // 8567K {0.29021037, 0.299287417}, // 8568K {0.290202306, 0.29927841}, // 8569K {0.290194243, 0.299269406}, // 8570K {0.290186184, 0.299260404}, // 8571K {0.290178126, 0.299251404}, // 8572K {0.290170071, 0.299242406}, // 8573K {0.290162018, 0.29923341}, // 8574K {0.290153968, 0.299224417}, // 8575K {0.290145919, 0.299215425}, // 8576K {0.290137873, 0.299206436}, // 8577K {0.290129829, 0.299197448}, // 8578K {0.290121788, 0.299188463}, // 8579K {0.290113749, 0.29917948}, // 8580K {0.290105712, 0.299170499}, // 8581K {0.290097677, 0.299161521}, // 8582K {0.290089645, 0.299152544}, // 8583K {0.290081615, 0.29914357}, // 8584K {0.290073587, 0.299134597}, // 8585K {0.290065561, 0.299125627}, // 8586K {0.290057538, 0.299116659}, // 8587K {0.290049517, 0.299107693}, // 8588K {0.290041498, 0.299098729}, // 8589K {0.290033482, 0.299089767}, // 8590K {0.290025468, 0.299080808}, // 8591K {0.290017456, 0.29907185}, // 8592K {0.290009446, 0.299062895}, // 8593K {0.290001439, 0.299053941}, // 8594K {0.289993433, 0.29904499}, // 8595K {0.289985431, 0.299036041}, // 8596K {0.28997743, 0.299027094}, // 8597K {0.289969432, 0.29901815}, // 8598K {0.289961436, 0.299009207}, // 8599K {0.289953442, 0.299000266}, // 8600K {0.28994545, 0.298991328}, // 8601K {0.289937461, 0.298982391}, // 8602K {0.289929474, 0.298973457}, // 8603K {0.289921489, 0.298964525}, // 8604K {0.289913507, 0.298955595}, // 8605K {0.289905526, 0.298946667}, // 8606K {0.289897548, 0.298937741}, // 8607K {0.289889573, 0.298928817}, // 8608K {0.289881599, 0.298919896}, // 8609K {0.289873628, 0.298910976}, // 8610K {0.289865659, 0.298902059}, // 8611K {0.289857692, 0.298893144}, // 8612K {0.289849728, 0.29888423}, // 8613K {0.289841765, 0.298875319}, // 8614K {0.289833806, 0.29886641}, // 8615K {0.289825848, 0.298857504}, // 8616K {0.289817892, 0.298848599}, // 8617K {0.289809939, 0.298839696}, // 8618K {0.289801988, 0.298830796}, // 8619K {0.289794039, 0.298821897}, // 8620K {0.289786093, 0.298813001}, // 8621K {0.289778149, 0.298804106}, // 8622K {0.289770206, 0.298795214}, // 8623K {0.289762267, 0.298786324}, // 8624K {0.289754329, 0.298777436}, // 8625K {0.289746394, 0.29876855}, // 8626K {0.289738461, 0.298759667}, // 8627K {0.28973053, 0.298750785}, // 8628K {0.289722601, 0.298741905}, // 8629K {0.289714675, 0.298733028}, // 8630K {0.289706751, 0.298724152}, // 8631K {0.289698829, 0.298715279}, // 8632K {0.289690909, 0.298706408}, // 8633K {0.289682992, 0.298697539}, // 8634K {0.289675077, 0.298688672}, // 8635K {0.289667164, 0.298679807}, // 8636K {0.289659253, 0.298670944}, // 8637K {0.289651344, 0.298662083}, // 8638K {0.289643438, 0.298653224}, // 8639K {0.289635534, 0.298644368}, // 8640K {0.289627632, 0.298635513}, // 8641K {0.289619733, 0.298626661}, // 8642K {0.289611835, 0.29861781}, // 8643K {0.28960394, 0.298608962}, // 8644K {0.289596047, 0.298600116}, // 8645K {0.289588157, 0.298591272}, // 8646K {0.289580268, 0.29858243}, // 8647K {0.289572382, 0.29857359}, // 8648K {0.289564498, 0.298564752}, // 8649K {0.289556616, 0.298555916}, // 8650K {0.289548736, 0.298547083}, // 8651K {0.289540859, 0.298538251}, // 8652K {0.289532984, 0.298529422}, // 8653K {0.289525111, 0.298520594}, // 8654K {0.28951724, 0.298511769}, // 8655K {0.289509372, 0.298502946}, // 8656K {0.289501505, 0.298494124}, // 8657K {0.289493641, 0.298485305}, // 8658K {0.289485779, 0.298476488}, // 8659K {0.289477919, 0.298467673}, // 8660K {0.289470062, 0.29845886}, // 8661K {0.289462207, 0.298450049}, // 8662K {0.289454354, 0.298441241}, // 8663K {0.289446503, 0.298432434}, // 8664K {0.289438654, 0.298423629}, // 8665K {0.289430808, 0.298414827}, // 8666K {0.289422963, 0.298406026}, // 8667K {0.289415121, 0.298397228}, // 8668K {0.289407282, 0.298388432}, // 8669K {0.289399444, 0.298379637}, // 8670K {0.289391608, 0.298370845}, // 8671K {0.289383775, 0.298362055}, // 8672K {0.289375944, 0.298353267}, // 8673K {0.289368115, 0.298344481}, // 8674K {0.289360289, 0.298335697}, // 8675K {0.289352464, 0.298326915}, // 8676K {0.289344642, 0.298318135}, // 8677K {0.289336822, 0.298309357}, // 8678K {0.289329004, 0.298300582}, // 8679K {0.289321188, 0.298291808}, // 8680K {0.289313375, 0.298283037}, // 8681K {0.289305564, 0.298274267}, // 8682K {0.289297755, 0.2982655}, // 8683K {0.289289948, 0.298256734}, // 8684K {0.289282143, 0.298247971}, // 8685K {0.28927434, 0.29823921}, // 8686K {0.28926654, 0.29823045}, // 8687K {0.289258742, 0.298221693}, // 8688K {0.289250946, 0.298212938}, // 8689K {0.289243152, 0.298204185}, // 8690K {0.28923536, 0.298195434}, // 8691K {0.289227571, 0.298186685}, // 8692K {0.289219784, 0.298177938}, // 8693K {0.289211999, 0.298169193}, // 8694K {0.289204216, 0.298160451}, // 8695K {0.289196435, 0.29815171}, // 8696K {0.289188657, 0.298142971}, // 8697K {0.28918088, 0.298134235}, // 8698K {0.289173106, 0.2981255}, // 8699K {0.289165334, 0.298116768}, // 8700K {0.289157564, 0.298108037}, // 8701K {0.289149797, 0.298099309}, // 8702K {0.289142031, 0.298090582}, // 8703K {0.289134268, 0.298081858}, // 8704K {0.289126507, 0.298073136}, // 8705K {0.289118748, 0.298064415}, // 8706K {0.289110991, 0.298055697}, // 8707K {0.289103236, 0.298046981}, // 8708K {0.289095484, 0.298038267}, // 8709K {0.289087734, 0.298029555}, // 8710K {0.289079985, 0.298020845}, // 8711K {0.28907224, 0.298012137}, // 8712K {0.289064496, 0.298003431}, // 8713K {0.289056754, 0.297994727}, // 8714K {0.289049015, 0.297986025}, // 8715K {0.289041277, 0.297977325}, // 8716K {0.289033542, 0.297968628}, // 8717K {0.289025809, 0.297959932}, // 8718K {0.289018078, 0.297951238}, // 8719K {0.28901035, 0.297942547}, // 8720K {0.289002623, 0.297933857}, // 8721K {0.288994899, 0.297925169}, // 8722K {0.288987177, 0.297916484}, // 8723K {0.288979457, 0.2979078}, // 8724K {0.288971739, 0.297899119}, // 8725K {0.288964023, 0.297890439}, // 8726K {0.28895631, 0.297881762}, // 8727K {0.288948598, 0.297873086}, // 8728K {0.288940889, 0.297864413}, // 8729K {0.288933182, 0.297855742}, // 8730K {0.288925477, 0.297847072}, // 8731K {0.288917774, 0.297838405}, // 8732K {0.288910073, 0.29782974}, // 8733K {0.288902375, 0.297821077}, // 8734K {0.288894679, 0.297812416}, // 8735K {0.288886984, 0.297803756}, // 8736K {0.288879292, 0.297795099}, // 8737K {0.288871602, 0.297786444}, // 8738K {0.288863915, 0.297777791}, // 8739K {0.288856229, 0.29776914}, // 8740K {0.288848545, 0.297760491}, // 8741K {0.288840864, 0.297751844}, // 8742K {0.288833185, 0.297743199}, // 8743K {0.288825508, 0.297734556}, // 8744K {0.288817833, 0.297725915}, // 8745K {0.28881016, 0.297717276}, // 8746K {0.288802489, 0.297708639}, // 8747K {0.288794821, 0.297700004}, // 8748K {0.288787154, 0.297691371}, // 8749K {0.28877949, 0.297682741}, // 8750K {0.288771828, 0.297674112}, // 8751K {0.288764168, 0.297665485}, // 8752K {0.28875651, 0.29765686}, // 8753K {0.288748854, 0.297648237}, // 8754K {0.288741201, 0.297639617}, // 8755K {0.288733549, 0.297630998}, // 8756K {0.2887259, 0.297622381}, // 8757K {0.288718253, 0.297613766}, // 8758K {0.288710608, 0.297605154}, // 8759K {0.288702965, 0.297596543}, // 8760K {0.288695324, 0.297587934}, // 8761K {0.288687685, 0.297579328}, // 8762K {0.288680049, 0.297570723}, // 8763K {0.288672414, 0.29756212}, // 8764K {0.288664782, 0.29755352}, // 8765K {0.288657152, 0.297544921}, // 8766K {0.288649524, 0.297536324}, // 8767K {0.288641898, 0.29752773}, // 8768K {0.288634274, 0.297519137}, // 8769K {0.288626652, 0.297510546}, // 8770K {0.288619032, 0.297501958}, // 8771K {0.288611415, 0.297493371}, // 8772K {0.288603799, 0.297484787}, // 8773K {0.288596186, 0.297476204}, // 8774K {0.288588575, 0.297467623}, // 8775K {0.288580966, 0.297459045}, // 8776K {0.288573359, 0.297450468}, // 8777K {0.288565754, 0.297441894}, // 8778K {0.288558151, 0.297433321}, // 8779K {0.288550551, 0.29742475}, // 8780K {0.288542952, 0.297416182}, // 8781K {0.288535356, 0.297407615}, // 8782K {0.288527762, 0.297399051}, // 8783K {0.28852017, 0.297390488}, // 8784K {0.288512579, 0.297381927}, // 8785K {0.288504992, 0.297373369}, // 8786K {0.288497406, 0.297364812}, // 8787K {0.288489822, 0.297356258}, // 8788K {0.28848224, 0.297347705}, // 8789K {0.288474661, 0.297339154}, // 8790K {0.288467083, 0.297330606}, // 8791K {0.288459508, 0.297322059}, // 8792K {0.288451935, 0.297313514}, // 8793K {0.288444364, 0.297304972}, // 8794K {0.288436795, 0.297296431}, // 8795K {0.288429228, 0.297287892}, // 8796K {0.288421663, 0.297279356}, // 8797K {0.2884141, 0.297270821}, // 8798K {0.288406539, 0.297262288}, // 8799K {0.288398981, 0.297253758}, // 8800K {0.288391424, 0.297245229}, // 8801K {0.28838387, 0.297236702}, // 8802K {0.288376318, 0.297228177}, // 8803K {0.288368767, 0.297219655}, // 8804K {0.288361219, 0.297211134}, // 8805K {0.288353673, 0.297202615}, // 8806K {0.288346129, 0.297194098}, // 8807K {0.288338587, 0.297185583}, // 8808K {0.288331048, 0.29717707}, // 8809K {0.28832351, 0.29716856}, // 8810K {0.288315974, 0.297160051}, // 8811K {0.288308441, 0.297151544}, // 8812K {0.28830091, 0.297143039}, // 8813K {0.28829338, 0.297134536}, // 8814K {0.288285853, 0.297126035}, // 8815K {0.288278328, 0.297117536}, // 8816K {0.288270805, 0.297109039}, // 8817K {0.288263284, 0.297100544}, // 8818K {0.288255765, 0.297092051}, // 8819K {0.288248248, 0.29708356}, // 8820K {0.288240733, 0.29707507}, // 8821K {0.28823322, 0.297066583}, // 8822K {0.28822571, 0.297058098}, // 8823K {0.288218201, 0.297049615}, // 8824K {0.288210695, 0.297041134}, // 8825K {0.28820319, 0.297032654}, // 8826K {0.288195688, 0.297024177}, // 8827K {0.288188188, 0.297015702}, // 8828K {0.28818069, 0.297007229}, // 8829K {0.288173193, 0.296998757}, // 8830K {0.288165699, 0.296990288}, // 8831K {0.288158207, 0.29698182}, // 8832K {0.288150718, 0.296973355}, // 8833K {0.28814323, 0.296964891}, // 8834K {0.288135744, 0.29695643}, // 8835K {0.28812826, 0.29694797}, // 8836K {0.288120779, 0.296939513}, // 8837K {0.288113299, 0.296931057}, // 8838K {0.288105821, 0.296922603}, // 8839K {0.288098346, 0.296914152}, // 8840K {0.288090873, 0.296905702}, // 8841K {0.288083401, 0.296897254}, // 8842K {0.288075932, 0.296888808}, // 8843K {0.288068465, 0.296880364}, // 8844K {0.288061, 0.296871922}, // 8845K {0.288053536, 0.296863483}, // 8846K {0.288046075, 0.296855045}, // 8847K {0.288038616, 0.296846608}, // 8848K {0.28803116, 0.296838174}, // 8849K {0.288023705, 0.296829742}, // 8850K {0.288016252, 0.296821312}, // 8851K {0.288008801, 0.296812884}, // 8852K {0.288001352, 0.296804458}, // 8853K {0.287993906, 0.296796033}, // 8854K {0.287986461, 0.296787611}, // 8855K {0.287979018, 0.296779191}, // 8856K {0.287971578, 0.296770772}, // 8857K {0.28796414, 0.296762356}, // 8858K {0.287956703, 0.296753941}, // 8859K {0.287949269, 0.296745529}, // 8860K {0.287941836, 0.296737118}, // 8861K {0.287934406, 0.296728709}, // 8862K {0.287926978, 0.296720303}, // 8863K {0.287919552, 0.296711898}, // 8864K {0.287912128, 0.296703495}, // 8865K {0.287904705, 0.296695094}, // 8866K {0.287897285, 0.296686695}, // 8867K {0.287889867, 0.296678298}, // 8868K {0.287882451, 0.296669903}, // 8869K {0.287875037, 0.29666151}, // 8870K {0.287867625, 0.296653119}, // 8871K {0.287860216, 0.29664473}, // 8872K {0.287852808, 0.296636343}, // 8873K {0.287845402, 0.296627957}, // 8874K {0.287837998, 0.296619574}, // 8875K {0.287830596, 0.296611193}, // 8876K {0.287823197, 0.296602813}, // 8877K {0.287815799, 0.296594436}, // 8878K {0.287808403, 0.29658606}, // 8879K {0.28780101, 0.296577686}, // 8880K {0.287793618, 0.296569315}, // 8881K {0.287786229, 0.296560945}, // 8882K {0.287778841, 0.296552577}, // 8883K {0.287771456, 0.296544211}, // 8884K {0.287764072, 0.296535847}, // 8885K {0.287756691, 0.296527485}, // 8886K {0.287749311, 0.296519125}, // 8887K {0.287741934, 0.296510767}, // 8888K {0.287734559, 0.296502411}, // 8889K {0.287727185, 0.296494056}, // 8890K {0.287719814, 0.296485704}, // 8891K {0.287712445, 0.296477354}, // 8892K {0.287705078, 0.296469005}, // 8893K {0.287697712, 0.296460659}, // 8894K {0.287690349, 0.296452314}, // 8895K {0.287682988, 0.296443971}, // 8896K {0.287675629, 0.29643563}, // 8897K {0.287668272, 0.296427292}, // 8898K {0.287660916, 0.296418955}, // 8899K {0.287653563, 0.29641062}, // 8900K {0.287646212, 0.296402287}, // 8901K {0.287638863, 0.296393955}, // 8902K {0.287631516, 0.296385626}, // 8903K {0.287624171, 0.296377299}, // 8904K {0.287616828, 0.296368974}, // 8905K {0.287609487, 0.29636065}, // 8906K {0.287602148, 0.296352329}, // 8907K {0.287594811, 0.296344009}, // 8908K {0.287587476, 0.296335691}, // 8909K {0.287580143, 0.296327376}, // 8910K {0.287572812, 0.296319062}, // 8911K {0.287565483, 0.29631075}, // 8912K {0.287558156, 0.29630244}, // 8913K {0.287550831, 0.296294132}, // 8914K {0.287543508, 0.296285826}, // 8915K {0.287536187, 0.296277522}, // 8916K {0.287528868, 0.296269219}, // 8917K {0.287521551, 0.296260919}, // 8918K {0.287514236, 0.296252621}, // 8919K {0.287506923, 0.296244324}, // 8920K {0.287499612, 0.296236029}, // 8921K {0.287492303, 0.296227737}, // 8922K {0.287484996, 0.296219446}, // 8923K {0.287477691, 0.296211157}, // 8924K {0.287470388, 0.29620287}, // 8925K {0.287463087, 0.296194585}, // 8926K {0.287455788, 0.296186302}, // 8927K {0.287448491, 0.29617802}, // 8928K {0.287441196, 0.296169741}, // 8929K {0.287433903, 0.296161464}, // 8930K {0.287426612, 0.296153188}, // 8931K {0.287419323, 0.296144915}, // 8932K {0.287412036, 0.296136643}, // 8933K {0.287404751, 0.296128373}, // 8934K {0.287397468, 0.296120105}, // 8935K {0.287390187, 0.296111839}, // 8936K {0.287382908, 0.296103575}, // 8937K {0.28737563, 0.296095313}, // 8938K {0.287368355, 0.296087053}, // 8939K {0.287361082, 0.296078795}, // 8940K {0.287353811, 0.296070538}, // 8941K {0.287346542, 0.296062284}, // 8942K {0.287339275, 0.296054031}, // 8943K {0.28733201, 0.29604578}, // 8944K {0.287324746, 0.296037531}, // 8945K {0.287317485, 0.296029284}, // 8946K {0.287310226, 0.296021039}, // 8947K {0.287302969, 0.296012796}, // 8948K {0.287295713, 0.296004555}, // 8949K {0.28728846, 0.295996316}, // 8950K {0.287281209, 0.295988078}, // 8951K {0.287273959, 0.295979843}, // 8952K {0.287266712, 0.295971609}, // 8953K {0.287259467, 0.295963377}, // 8954K {0.287252223, 0.295955148}, // 8955K {0.287244982, 0.29594692}, // 8956K {0.287237742, 0.295938694}, // 8957K {0.287230505, 0.295930469}, // 8958K {0.287223269, 0.295922247}, // 8959K {0.287216036, 0.295914027}, // 8960K {0.287208804, 0.295905808}, // 8961K {0.287201575, 0.295897592}, // 8962K {0.287194347, 0.295889377}, // 8963K {0.287187121, 0.295881164}, // 8964K {0.287179898, 0.295872953}, // 8965K {0.287172676, 0.295864744}, // 8966K {0.287165456, 0.295856537}, // 8967K {0.287158238, 0.295848332}, // 8968K {0.287151022, 0.295840129}, // 8969K {0.287143808, 0.295831927}, // 8970K {0.287136597, 0.295823728}, // 8971K {0.287129387, 0.29581553}, // 8972K {0.287122179, 0.295807334}, // 8973K {0.287114973, 0.29579914}, // 8974K {0.287107768, 0.295790948}, // 8975K {0.287100566, 0.295782758}, // 8976K {0.287093366, 0.29577457}, // 8977K {0.287086168, 0.295766383}, // 8978K {0.287078972, 0.295758199}, // 8979K {0.287071777, 0.295750016}, // 8980K {0.287064585, 0.295741836}, // 8981K {0.287057395, 0.295733657}, // 8982K {0.287050206, 0.29572548}, // 8983K {0.28704302, 0.295717305}, // 8984K {0.287035835, 0.295709131}, // 8985K {0.287028653, 0.29570096}, // 8986K {0.287021472, 0.295692791}, // 8987K {0.287014293, 0.295684623}, // 8988K {0.287007117, 0.295676457}, // 8989K {0.286999942, 0.295668293}, // 8990K {0.286992769, 0.295660131}, // 8991K {0.286985598, 0.295651971}, // 8992K {0.286978429, 0.295643813}, // 8993K {0.286971262, 0.295635657}, // 8994K {0.286964097, 0.295627502}, // 8995K {0.286956934, 0.29561935}, // 8996K {0.286949773, 0.295611199}, // 8997K {0.286942614, 0.29560305}, // 8998K {0.286935457, 0.295594903}, // 8999K {0.286928301, 0.295586758}, // 9000K {0.286921148, 0.295578615}, // 9001K {0.286913996, 0.295570474}, // 9002K {0.286906847, 0.295562334}, // 9003K {0.286899699, 0.295554196}, // 9004K {0.286892554, 0.295546061}, // 9005K {0.28688541, 0.295537927}, // 9006K {0.286878268, 0.295529795}, // 9007K {0.286871128, 0.295521665}, // 9008K {0.286863991, 0.295513536}, // 9009K {0.286856855, 0.29550541}, // 9010K {0.286849721, 0.295497285}, // 9011K {0.286842588, 0.295489163}, // 9012K {0.286835458, 0.295481042}, // 9013K {0.28682833, 0.295472923}, // 9014K {0.286821204, 0.295464806}, // 9015K {0.286814079, 0.29545669}, // 9016K {0.286806957, 0.295448577}, // 9017K {0.286799837, 0.295440466}, // 9018K {0.286792718, 0.295432356}, // 9019K {0.286785601, 0.295424248}, // 9020K {0.286778487, 0.295416142}, // 9021K {0.286771374, 0.295408038}, // 9022K {0.286764263, 0.295399936}, // 9023K {0.286757154, 0.295391835}, // 9024K {0.286750047, 0.295383737}, // 9025K {0.286742942, 0.29537564}, // 9026K {0.286735839, 0.295367545}, // 9027K {0.286728737, 0.295359452}, // 9028K {0.286721638, 0.295351361}, // 9029K {0.286714541, 0.295343272}, // 9030K {0.286707445, 0.295335185}, // 9031K {0.286700352, 0.295327099}, // 9032K {0.28669326, 0.295319015}, // 9033K {0.28668617, 0.295310934}, // 9034K {0.286679082, 0.295302854}, // 9035K {0.286671996, 0.295294775}, // 9036K {0.286664912, 0.295286699}, // 9037K {0.28665783, 0.295278625}, // 9038K {0.28665075, 0.295270552}, // 9039K {0.286643672, 0.295262481}, // 9040K {0.286636596, 0.295254412}, // 9041K {0.286629521, 0.295246345}, // 9042K {0.286622449, 0.29523828}, // 9043K {0.286615378, 0.295230217}, // 9044K {0.286608309, 0.295222155}, // 9045K {0.286601243, 0.295214096}, // 9046K {0.286594178, 0.295206038}, // 9047K {0.286587115, 0.295197982}, // 9048K {0.286580054, 0.295189928}, // 9049K {0.286572994, 0.295181875}, // 9050K {0.286565937, 0.295173825}, // 9051K {0.286558882, 0.295165776}, // 9052K {0.286551828, 0.29515773}, // 9053K {0.286544777, 0.295149685}, // 9054K {0.286537727, 0.295141642}, // 9055K {0.286530679, 0.2951336}, // 9056K {0.286523634, 0.295125561}, // 9057K {0.28651659, 0.295117523}, // 9058K {0.286509548, 0.295109488}, // 9059K {0.286502507, 0.295101454}, // 9060K {0.286495469, 0.295093422}, // 9061K {0.286488433, 0.295085391}, // 9062K {0.286481398, 0.295077363}, // 9063K {0.286474366, 0.295069336}, // 9064K {0.286467335, 0.295061312}, // 9065K {0.286460306, 0.295053289}, // 9066K {0.286453279, 0.295045268}, // 9067K {0.286446254, 0.295037249}, // 9068K {0.286439231, 0.295029231}, // 9069K {0.28643221, 0.295021216}, // 9070K {0.286425191, 0.295013202}, // 9071K {0.286418173, 0.29500519}, // 9072K {0.286411158, 0.29499718}, // 9073K {0.286404144, 0.294989172}, // 9074K {0.286397132, 0.294981165}, // 9075K {0.286390123, 0.294973161}, // 9076K {0.286383115, 0.294965158}, // 9077K {0.286376108, 0.294957157}, // 9078K {0.286369104, 0.294949158}, // 9079K {0.286362102, 0.294941161}, // 9080K {0.286355101, 0.294933165}, // 9081K {0.286348103, 0.294925172}, // 9082K {0.286341106, 0.29491718}, // 9083K {0.286334111, 0.29490919}, // 9084K {0.286327119, 0.294901202}, // 9085K {0.286320127, 0.294893215}, // 9086K {0.286313138, 0.294885231}, // 9087K {0.286306151, 0.294877248}, // 9088K {0.286299166, 0.294869267}, // 9089K {0.286292182, 0.294861288}, // 9090K {0.2862852, 0.294853311}, // 9091K {0.286278221, 0.294845335}, // 9092K {0.286271243, 0.294837362}, // 9093K {0.286264267, 0.29482939}, // 9094K {0.286257293, 0.29482142}, // 9095K {0.28625032, 0.294813452}, // 9096K {0.28624335, 0.294805486}, // 9097K {0.286236381, 0.294797521}, // 9098K {0.286229415, 0.294789558}, // 9099K {0.28622245, 0.294781598}, // 9100K {0.286215487, 0.294773639}, // 9101K {0.286208526, 0.294765681}, // 9102K {0.286201567, 0.294757726}, // 9103K {0.286194609, 0.294749772}, // 9104K {0.286187654, 0.29474182}, // 9105K {0.2861807, 0.29473387}, // 9106K {0.286173749, 0.294725922}, // 9107K {0.286166799, 0.294717976}, // 9108K {0.286159851, 0.294710031}, // 9109K {0.286152905, 0.294702089}, // 9110K {0.286145961, 0.294694148}, // 9111K {0.286139018, 0.294686208}, // 9112K {0.286132078, 0.294678271}, // 9113K {0.286125139, 0.294670336}, // 9114K {0.286118202, 0.294662402}, // 9115K {0.286111267, 0.29465447}, // 9116K {0.286104334, 0.29464654}, // 9117K {0.286097403, 0.294638612}, // 9118K {0.286090473, 0.294630685}, // 9119K {0.286083546, 0.29462276}, // 9120K {0.28607662, 0.294614837}, // 9121K {0.286069696, 0.294606916}, // 9122K {0.286062774, 0.294598997}, // 9123K {0.286055854, 0.29459108}, // 9124K {0.286048936, 0.294583164}, // 9125K {0.28604202, 0.29457525}, // 9126K {0.286035105, 0.294567338}, // 9127K {0.286028192, 0.294559428}, // 9128K {0.286021282, 0.294551519}, // 9129K {0.286014373, 0.294543612}, // 9130K {0.286007465, 0.294535708}, // 9131K {0.28600056, 0.294527805}, // 9132K {0.285993657, 0.294519903}, // 9133K {0.285986755, 0.294512004}, // 9134K {0.285979855, 0.294504106}, // 9135K {0.285972957, 0.29449621}, // 9136K {0.285966061, 0.294488316}, // 9137K {0.285959167, 0.294480424}, // 9138K {0.285952275, 0.294472533}, // 9139K {0.285945384, 0.294464644}, // 9140K {0.285938496, 0.294456758}, // 9141K {0.285931609, 0.294448872}, // 9142K {0.285924724, 0.294440989}, // 9143K {0.28591784, 0.294433107}, // 9144K {0.285910959, 0.294425228}, // 9145K {0.28590408, 0.29441735}, // 9146K {0.285897202, 0.294409474}, // 9147K {0.285890326, 0.294401599}, // 9148K {0.285883452, 0.294393726}, // 9149K {0.28587658, 0.294385856}, // 9150K {0.28586971, 0.294377987}, // 9151K {0.285862841, 0.294370119}, // 9152K {0.285855975, 0.294362254}, // 9153K {0.28584911, 0.29435439}, // 9154K {0.285842247, 0.294346528}, // 9155K {0.285835386, 0.294338668}, // 9156K {0.285828526, 0.29433081}, // 9157K {0.285821669, 0.294322953}, // 9158K {0.285814813, 0.294315099}, // 9159K {0.285807959, 0.294307246}, // 9160K {0.285801107, 0.294299394}, // 9161K {0.285794257, 0.294291545}, // 9162K {0.285787409, 0.294283697}, // 9163K {0.285780562, 0.294275852}, // 9164K {0.285773718, 0.294268007}, // 9165K {0.285766875, 0.294260165}, // 9166K {0.285760034, 0.294252325}, // 9167K {0.285753195, 0.294244486}, // 9168K {0.285746357, 0.294236649}, // 9169K {0.285739522, 0.294228814}, // 9170K {0.285732688, 0.29422098}, // 9171K {0.285725856, 0.294213149}, // 9172K {0.285719026, 0.294205319}, // 9173K {0.285712198, 0.294197491}, // 9174K {0.285705371, 0.294189664}, // 9175K {0.285698547, 0.29418184}, // 9176K {0.285691724, 0.294174017}, // 9177K {0.285684903, 0.294166196}, // 9178K {0.285678083, 0.294158377}, // 9179K {0.285671266, 0.29415056}, // 9180K {0.285664451, 0.294142744}, // 9181K {0.285657637, 0.29413493}, // 9182K {0.285650825, 0.294127118}, // 9183K {0.285644015, 0.294119308}, // 9184K {0.285637206, 0.294111499}, // 9185K {0.2856304, 0.294103692}, // 9186K {0.285623595, 0.294095887}, // 9187K {0.285616792, 0.294088084}, // 9188K {0.285609991, 0.294080282}, // 9189K {0.285603192, 0.294072482}, // 9190K {0.285596395, 0.294064684}, // 9191K {0.285589599, 0.294056888}, // 9192K {0.285582805, 0.294049094}, // 9193K {0.285576013, 0.294041301}, // 9194K {0.285569223, 0.29403351}, // 9195K {0.285562435, 0.294025721}, // 9196K {0.285555648, 0.294017934}, // 9197K {0.285548863, 0.294010148}, // 9198K {0.28554208, 0.294002364}, // 9199K {0.285535299, 0.293994582}, // 9200K {0.28552852, 0.293986802}, // 9201K {0.285521742, 0.293979023}, // 9202K {0.285514966, 0.293971246}, // 9203K {0.285508192, 0.293963471}, // 9204K {0.28550142, 0.293955698}, // 9205K {0.28549465, 0.293947926}, // 9206K {0.285487881, 0.293940156}, // 9207K {0.285481114, 0.293932388}, // 9208K {0.285474349, 0.293924622}, // 9209K {0.285467586, 0.293916858}, // 9210K {0.285460825, 0.293909095}, // 9211K {0.285454065, 0.293901334}, // 9212K {0.285447307, 0.293893575}, // 9213K {0.285440551, 0.293885817}, // 9214K {0.285433797, 0.293878061}, // 9215K {0.285427044, 0.293870307}, // 9216K {0.285420294, 0.293862555}, // 9217K {0.285413545, 0.293854804}, // 9218K {0.285406798, 0.293847056}, // 9219K {0.285400052, 0.293839309}, // 9220K {0.285393309, 0.293831563}, // 9221K {0.285386567, 0.29382382}, // 9222K {0.285379827, 0.293816078}, // 9223K {0.285373089, 0.293808338}, // 9224K {0.285366353, 0.2938006}, // 9225K {0.285359618, 0.293792863}, // 9226K {0.285352886, 0.293785129}, // 9227K {0.285346155, 0.293777396}, // 9228K {0.285339425, 0.293769664}, // 9229K {0.285332698, 0.293761935}, // 9230K {0.285325972, 0.293754207}, // 9231K {0.285319248, 0.293746481}, // 9232K {0.285312526, 0.293738757}, // 9233K {0.285305806, 0.293731034}, // 9234K {0.285299087, 0.293723313}, // 9235K {0.285292371, 0.293715594}, // 9236K {0.285285656, 0.293707877}, // 9237K {0.285278943, 0.293700161}, // 9238K {0.285272231, 0.293692448}, // 9239K {0.285265522, 0.293684735}, // 9240K {0.285258814, 0.293677025}, // 9241K {0.285252108, 0.293669316}, // 9242K {0.285245403, 0.29366161}, // 9243K {0.285238701, 0.293653904}, // 9244K {0.285232, 0.293646201}, // 9245K {0.285225301, 0.293638499}, // 9246K {0.285218604, 0.293630799}, // 9247K {0.285211908, 0.293623101}, // 9248K {0.285205215, 0.293615405}, // 9249K {0.285198523, 0.29360771}, // 9250K {0.285191833, 0.293600017}, // 9251K {0.285185144, 0.293592326}, // 9252K {0.285178458, 0.293584636}, // 9253K {0.285171773, 0.293576948}, // 9254K {0.28516509, 0.293569262}, // 9255K {0.285158408, 0.293561578}, // 9256K {0.285151729, 0.293553895}, // 9257K {0.285145051, 0.293546215}, // 9258K {0.285138375, 0.293538535}, // 9259K {0.285131701, 0.293530858}, // 9260K {0.285125028, 0.293523182}, // 9261K {0.285118358, 0.293515508}, // 9262K {0.285111689, 0.293507836}, // 9263K {0.285105022, 0.293500166}, // 9264K {0.285098356, 0.293492497}, // 9265K {0.285091692, 0.29348483}, // 9266K {0.28508503, 0.293477165}, // 9267K {0.28507837, 0.293469501}, // 9268K {0.285071712, 0.293461839}, // 9269K {0.285065055, 0.293454179}, // 9270K {0.2850584, 0.293446521}, // 9271K {0.285051747, 0.293438864}, // 9272K {0.285045096, 0.293431209}, // 9273K {0.285038446, 0.293423556}, // 9274K {0.285031798, 0.293415904}, // 9275K {0.285025152, 0.293408254}, // 9276K {0.285018508, 0.293400606}, // 9277K {0.285011865, 0.29339296}, // 9278K {0.285005224, 0.293385315}, // 9279K {0.284998585, 0.293377672}, // 9280K {0.284991948, 0.293370031}, // 9281K {0.284985312, 0.293362392}, // 9282K {0.284978678, 0.293354754}, // 9283K {0.284972046, 0.293347118}, // 9284K {0.284965416, 0.293339484}, // 9285K {0.284958787, 0.293331851}, // 9286K {0.28495216, 0.29332422}, // 9287K {0.284945535, 0.293316591}, // 9288K {0.284938912, 0.293308963}, // 9289K {0.28493229, 0.293301338}, // 9290K {0.28492567, 0.293293714}, // 9291K {0.284919052, 0.293286091}, // 9292K {0.284912436, 0.293278471}, // 9293K {0.284905821, 0.293270852}, // 9294K {0.284899208, 0.293263235}, // 9295K {0.284892597, 0.293255619}, // 9296K {0.284885988, 0.293248005}, // 9297K {0.28487938, 0.293240393}, // 9298K {0.284872774, 0.293232783}, // 9299K {0.28486617, 0.293225174}, // 9300K {0.284859567, 0.293217567}, // 9301K {0.284852966, 0.293209962}, // 9302K {0.284846367, 0.293202359}, // 9303K {0.28483977, 0.293194757}, // 9304K {0.284833175, 0.293187157}, // 9305K {0.284826581, 0.293179558}, // 9306K {0.284819989, 0.293171962}, // 9307K {0.284813398, 0.293164367}, // 9308K {0.28480681, 0.293156774}, // 9309K {0.284800223, 0.293149182}, // 9310K {0.284793638, 0.293141592}, // 9311K {0.284787054, 0.293134004}, // 9312K {0.284780472, 0.293126417}, // 9313K {0.284773892, 0.293118833}, // 9314K {0.284767314, 0.29311125}, // 9315K {0.284760738, 0.293103668}, // 9316K {0.284754163, 0.293096089}, // 9317K {0.28474759, 0.293088511}, // 9318K {0.284741019, 0.293080934}, // 9319K {0.284734449, 0.29307336}, // 9320K {0.284727881, 0.293065787}, // 9321K {0.284721315, 0.293058216}, // 9322K {0.28471475, 0.293050646}, // 9323K {0.284708188, 0.293043079}, // 9324K {0.284701627, 0.293035513}, // 9325K {0.284695067, 0.293027948}, // 9326K {0.28468851, 0.293020385}, // 9327K {0.284681954, 0.293012825}, // 9328K {0.2846754, 0.293005265}, // 9329K {0.284668848, 0.292997708}, // 9330K {0.284662297, 0.292990152}, // 9331K {0.284655748, 0.292982598}, // 9332K {0.284649201, 0.292975045}, // 9333K {0.284642655, 0.292967494}, // 9334K {0.284636111, 0.292959945}, // 9335K {0.284629569, 0.292952398}, // 9336K {0.284623029, 0.292944852}, // 9337K {0.28461649, 0.292937308}, // 9338K {0.284609953, 0.292929765}, // 9339K {0.284603418, 0.292922225}, // 9340K {0.284596884, 0.292914686}, // 9341K {0.284590353, 0.292907148}, // 9342K {0.284583823, 0.292899613}, // 9343K {0.284577294, 0.292892079}, // 9344K {0.284570767, 0.292884547}, // 9345K {0.284564242, 0.292877016}, // 9346K {0.284557719, 0.292869487}, // 9347K {0.284551198, 0.29286196}, // 9348K {0.284544678, 0.292854435}, // 9349K {0.28453816, 0.292846911}, // 9350K {0.284531643, 0.292839389}, // 9351K {0.284525128, 0.292831868}, // 9352K {0.284518615, 0.292824349}, // 9353K {0.284512104, 0.292816832}, // 9354K {0.284505594, 0.292809317}, // 9355K {0.284499087, 0.292801803}, // 9356K {0.28449258, 0.292794291}, // 9357K {0.284486076, 0.292786781}, // 9358K {0.284479573, 0.292779272}, // 9359K {0.284473072, 0.292771765}, // 9360K {0.284466572, 0.29276426}, // 9361K {0.284460075, 0.292756756}, // 9362K {0.284453579, 0.292749254}, // 9363K {0.284447084, 0.292741754}, // 9364K {0.284440592, 0.292734255}, // 9365K {0.284434101, 0.292726758}, // 9366K {0.284427612, 0.292719263}, // 9367K {0.284421124, 0.292711769}, // 9368K {0.284414638, 0.292704278}, // 9369K {0.284408154, 0.292696787}, // 9370K {0.284401672, 0.292689299}, // 9371K {0.284395191, 0.292681812}, // 9372K {0.284388712, 0.292674327}, // 9373K {0.284382234, 0.292666843}, // 9374K {0.284375759, 0.292659361}, // 9375K {0.284369285, 0.292651881}, // 9376K {0.284362812, 0.292644402}, // 9377K {0.284356342, 0.292636926}, // 9378K {0.284349873, 0.29262945}, // 9379K {0.284343406, 0.292621977}, // 9380K {0.28433694, 0.292614505}, // 9381K {0.284330476, 0.292607035}, // 9382K {0.284324014, 0.292599566}, // 9383K {0.284317554, 0.292592099}, // 9384K {0.284311095, 0.292584634}, // 9385K {0.284304638, 0.292577171}, // 9386K {0.284298182, 0.292569709}, // 9387K {0.284291728, 0.292562249}, // 9388K {0.284285276, 0.29255479}, // 9389K {0.284278826, 0.292547333}, // 9390K {0.284272377, 0.292539878}, // 9391K {0.28426593, 0.292532424}, // 9392K {0.284259485, 0.292524973}, // 9393K {0.284253041, 0.292517522}, // 9394K {0.284246599, 0.292510074}, // 9395K {0.284240159, 0.292502627}, // 9396K {0.28423372, 0.292495182}, // 9397K {0.284227283, 0.292487738}, // 9398K {0.284220848, 0.292480296}, // 9399K {0.284214414, 0.292472856}, // 9400K {0.284207982, 0.292465417}, // 9401K {0.284201552, 0.29245798}, // 9402K {0.284195124, 0.292450545}, // 9403K {0.284188697, 0.292443112}, // 9404K {0.284182271, 0.29243568}, // 9405K {0.284175848, 0.292428249}, // 9406K {0.284169426, 0.292420821}, // 9407K {0.284163006, 0.292413394}, // 9408K {0.284156587, 0.292405968}, // 9409K {0.28415017, 0.292398545}, // 9410K {0.284143755, 0.292391123}, // 9411K {0.284137342, 0.292383702}, // 9412K {0.28413093, 0.292376283}, // 9413K {0.284124519, 0.292368866}, // 9414K {0.284118111, 0.292361451}, // 9415K {0.284111704, 0.292354037}, // 9416K {0.284105299, 0.292346625}, // 9417K {0.284098895, 0.292339215}, // 9418K {0.284092493, 0.292331806}, // 9419K {0.284086093, 0.292324399}, // 9420K {0.284079695, 0.292316993}, // 9421K {0.284073298, 0.292309589}, // 9422K {0.284066902, 0.292302187}, // 9423K {0.284060509, 0.292294786}, // 9424K {0.284054117, 0.292287387}, // 9425K {0.284047727, 0.29227999}, // 9426K {0.284041338, 0.292272595}, // 9427K {0.284034951, 0.292265201}, // 9428K {0.284028566, 0.292257808}, // 9429K {0.284022182, 0.292250417}, // 9430K {0.2840158, 0.292243028}, // 9431K {0.28400942, 0.292235641}, // 9432K {0.284003041, 0.292228255}, // 9433K {0.283996664, 0.292220871}, // 9434K {0.283990289, 0.292213489}, // 9435K {0.283983915, 0.292206108}, // 9436K {0.283977543, 0.292198729}, // 9437K {0.283971173, 0.292191351}, // 9438K {0.283964804, 0.292183975}, // 9439K {0.283958437, 0.292176601}, // 9440K {0.283952072, 0.292169228}, // 9441K {0.283945708, 0.292161857}, // 9442K {0.283939346, 0.292154488}, // 9443K {0.283932986, 0.29214712}, // 9444K {0.283926627, 0.292139754}, // 9445K {0.28392027, 0.292132389}, // 9446K {0.283913914, 0.292125027}, // 9447K {0.28390756, 0.292117665}, // 9448K {0.283901208, 0.292110306}, // 9449K {0.283894857, 0.292102948}, // 9450K {0.283888508, 0.292095592}, // 9451K {0.283882161, 0.292088237}, // 9452K {0.283875815, 0.292080884}, // 9453K {0.283869471, 0.292073533}, // 9454K {0.283863129, 0.292066183}, // 9455K {0.283856788, 0.292058835}, // 9456K {0.283850449, 0.292051488}, // 9457K {0.283844112, 0.292044143}, // 9458K {0.283837776, 0.2920368}, // 9459K {0.283831442, 0.292029459}, // 9460K {0.283825109, 0.292022119}, // 9461K {0.283818779, 0.29201478}, // 9462K {0.283812449, 0.292007444}, // 9463K {0.283806122, 0.292000108}, // 9464K {0.283799796, 0.291992775}, // 9465K {0.283793471, 0.291985443}, // 9466K {0.283787149, 0.291978113}, // 9467K {0.283780828, 0.291970784}, // 9468K {0.283774508, 0.291963457}, // 9469K {0.28376819, 0.291956132}, // 9470K {0.283761874, 0.291948808}, // 9471K {0.28375556, 0.291941486}, // 9472K {0.283749247, 0.291934166}, // 9473K {0.283742936, 0.291926847}, // 9474K {0.283736626, 0.29191953}, // 9475K {0.283730318, 0.291912214}, // 9476K {0.283724012, 0.2919049}, // 9477K {0.283717707, 0.291897588}, // 9478K {0.283711404, 0.291890277}, // 9479K {0.283705102, 0.291882968}, // 9480K {0.283698802, 0.291875661}, // 9481K {0.283692504, 0.291868355}, // 9482K {0.283686208, 0.291861051}, // 9483K {0.283679913, 0.291853748}, // 9484K {0.283673619, 0.291846447}, // 9485K {0.283667328, 0.291839148}, // 9486K {0.283661037, 0.29183185}, // 9487K {0.283654749, 0.291824554}, // 9488K {0.283648462, 0.291817259}, // 9489K {0.283642177, 0.291809966}, // 9490K {0.283635893, 0.291802675}, // 9491K {0.283629611, 0.291795385}, // 9492K {0.283623331, 0.291788097}, // 9493K {0.283617052, 0.291780811}, // 9494K {0.283610775, 0.291773526}, // 9495K {0.2836045, 0.291766243}, // 9496K {0.283598226, 0.291758961}, // 9497K {0.283591953, 0.291751681}, // 9498K {0.283585683, 0.291744402}, // 9499K {0.283579414, 0.291737126}, // 9500K {0.283573146, 0.29172985}, // 9501K {0.283566881, 0.291722577}, // 9502K {0.283560616, 0.291715305}, // 9503K {0.283554354, 0.291708035}, // 9504K {0.283548093, 0.291700766}, // 9505K {0.283541834, 0.291693499}, // 9506K {0.283535576, 0.291686233}, // 9507K {0.28352932, 0.291678969}, // 9508K {0.283523065, 0.291671707}, // 9509K {0.283516812, 0.291664446}, // 9510K {0.283510561, 0.291657187}, // 9511K {0.283504311, 0.29164993}, // 9512K {0.283498063, 0.291642674}, // 9513K {0.283491817, 0.291635419}, // 9514K {0.283485572, 0.291628167}, // 9515K {0.283479329, 0.291620916}, // 9516K {0.283473087, 0.291613666}, // 9517K {0.283466847, 0.291606418}, // 9518K {0.283460609, 0.291599172}, // 9519K {0.283454372, 0.291591927}, // 9520K {0.283448137, 0.291584684}, // 9521K {0.283441903, 0.291577443}, // 9522K {0.283435671, 0.291570203}, // 9523K {0.28342944, 0.291562965}, // 9524K {0.283423212, 0.291555728}, // 9525K {0.283416984, 0.291548493}, // 9526K {0.283410759, 0.291541259}, // 9527K {0.283404535, 0.291534027}, // 9528K {0.283398312, 0.291526797}, // 9529K {0.283392092, 0.291519568}, // 9530K {0.283385872, 0.291512341}, // 9531K {0.283379655, 0.291505116}, // 9532K {0.283373439, 0.291497892}, // 9533K {0.283367224, 0.29149067}, // 9534K {0.283361012, 0.291483449}, // 9535K {0.2833548, 0.29147623}, // 9536K {0.283348591, 0.291469012}, // 9537K {0.283342383, 0.291461796}, // 9538K {0.283336176, 0.291454582}, // 9539K {0.283329971, 0.291447369}, // 9540K {0.283323768, 0.291440158}, // 9541K {0.283317567, 0.291432948}, // 9542K {0.283311367, 0.29142574}, // 9543K {0.283305168, 0.291418534}, // 9544K {0.283298971, 0.291411329}, // 9545K {0.283292776, 0.291404126}, // 9546K {0.283286582, 0.291396924}, // 9547K {0.28328039, 0.291389724}, // 9548K {0.2832742, 0.291382526}, // 9549K {0.283268011, 0.291375329}, // 9550K {0.283261823, 0.291368134}, // 9551K {0.283255638, 0.29136094}, // 9552K {0.283249453, 0.291353748}, // 9553K {0.283243271, 0.291346558}, // 9554K {0.28323709, 0.291339369}, // 9555K {0.28323091, 0.291332181}, // 9556K {0.283224733, 0.291324995}, // 9557K {0.283218556, 0.291317811}, // 9558K {0.283212382, 0.291310629}, // 9559K {0.283206209, 0.291303448}, // 9560K {0.283200037, 0.291296268}, // 9561K {0.283193867, 0.29128909}, // 9562K {0.283187699, 0.291281914}, // 9563K {0.283181532, 0.291274739}, // 9564K {0.283175367, 0.291267566}, // 9565K {0.283169203, 0.291260395}, // 9566K {0.283163041, 0.291253225}, // 9567K {0.283156881, 0.291246056}, // 9568K {0.283150722, 0.29123889}, // 9569K {0.283144565, 0.291231724}, // 9570K {0.283138409, 0.291224561}, // 9571K {0.283132255, 0.291217399}, // 9572K {0.283126102, 0.291210238}, // 9573K {0.283119951, 0.291203079}, // 9574K {0.283113802, 0.291195922}, // 9575K {0.283107654, 0.291188766}, // 9576K {0.283101508, 0.291181612}, // 9577K {0.283095363, 0.291174459}, // 9578K {0.28308922, 0.291167308}, // 9579K {0.283083078, 0.291160159}, // 9580K {0.283076938, 0.291153011}, // 9581K {0.2830708, 0.291145865}, // 9582K {0.283064663, 0.29113872}, // 9583K {0.283058528, 0.291131577}, // 9584K {0.283052394, 0.291124435}, // 9585K {0.283046262, 0.291117295}, // 9586K {0.283040131, 0.291110157}, // 9587K {0.283034002, 0.29110302}, // 9588K {0.283027875, 0.291095885}, // 9589K {0.283021749, 0.291088751}, // 9590K {0.283015625, 0.291081619}, // 9591K {0.283009502, 0.291074488}, // 9592K {0.283003381, 0.291067359}, // 9593K {0.282997261, 0.291060231}, // 9594K {0.282991143, 0.291053105}, // 9595K {0.282985027, 0.291045981}, // 9596K {0.282978912, 0.291038858}, // 9597K {0.282972798, 0.291031737}, // 9598K {0.282966687, 0.291024617}, // 9599K {0.282960576, 0.291017499}, // 9600K {0.282954468, 0.291010383}, // 9601K {0.282948361, 0.291003268}, // 9602K {0.282942255, 0.290996154}, // 9603K {0.282936151, 0.290989043}, // 9604K {0.282930048, 0.290981932}, // 9605K {0.282923948, 0.290974824}, // 9606K {0.282917848, 0.290967716}, // 9607K {0.28291175, 0.290960611}, // 9608K {0.282905654, 0.290953507}, // 9609K {0.28289956, 0.290946404}, // 9610K {0.282893466, 0.290939303}, // 9611K {0.282887375, 0.290932204}, // 9612K {0.282881285, 0.290925106}, // 9613K {0.282875196, 0.29091801}, // 9614K {0.282869109, 0.290910915}, // 9615K {0.282863024, 0.290903822}, // 9616K {0.28285694, 0.290896731}, // 9617K {0.282850858, 0.290889641}, // 9618K {0.282844777, 0.290882552}, // 9619K {0.282838698, 0.290875465}, // 9620K {0.282832621, 0.29086838}, // 9621K {0.282826545, 0.290861296}, // 9622K {0.28282047, 0.290854214}, // 9623K {0.282814397, 0.290847133}, // 9624K {0.282808326, 0.290840054}, // 9625K {0.282802256, 0.290832976}, // 9626K {0.282796187, 0.2908259}, // 9627K {0.282790121, 0.290818826}, // 9628K {0.282784055, 0.290811753}, // 9629K {0.282777992, 0.290804681}, // 9630K {0.28277193, 0.290797612}, // 9631K {0.282765869, 0.290790543}, // 9632K {0.28275981, 0.290783477}, // 9633K {0.282753752, 0.290776411}, // 9634K {0.282747696, 0.290769348}, // 9635K {0.282741642, 0.290762286}, // 9636K {0.282735589, 0.290755225}, // 9637K {0.282729538, 0.290748166}, // 9638K {0.282723488, 0.290741109}, // 9639K {0.282717439, 0.290734053}, // 9640K {0.282711393, 0.290726998}, // 9641K {0.282705347, 0.290719945}, // 9642K {0.282699304, 0.290712894}, // 9643K {0.282693262, 0.290705844}, // 9644K {0.282687221, 0.290698796}, // 9645K {0.282681182, 0.29069175}, // 9646K {0.282675144, 0.290684705}, // 9647K {0.282669108, 0.290677661}, // 9648K {0.282663074, 0.290670619}, // 9649K {0.282657041, 0.290663578}, // 9650K {0.28265101, 0.290656539}, // 9651K {0.28264498, 0.290649502}, // 9652K {0.282638951, 0.290642466}, // 9653K {0.282632925, 0.290635432}, // 9654K {0.282626899, 0.290628399}, // 9655K {0.282620875, 0.290621368}, // 9656K {0.282614853, 0.290614338}, // 9657K {0.282608833, 0.29060731}, // 9658K {0.282602813, 0.290600283}, // 9659K {0.282596796, 0.290593258}, // 9660K {0.28259078, 0.290586235}, // 9661K {0.282584765, 0.290579213}, // 9662K {0.282578752, 0.290572192}, // 9663K {0.28257274, 0.290565173}, // 9664K {0.28256673, 0.290558156}, // 9665K {0.282560722, 0.29055114}, // 9666K {0.282554715, 0.290544126}, // 9667K {0.28254871, 0.290537113}, // 9668K {0.282542706, 0.290530102}, // 9669K {0.282536703, 0.290523092}, // 9670K {0.282530702, 0.290516084}, // 9671K {0.282524703, 0.290509077}, // 9672K {0.282518705, 0.290502072}, // 9673K {0.282512709, 0.290495068}, // 9674K {0.282506714, 0.290488066}, // 9675K {0.282500721, 0.290481065}, // 9676K {0.282494729, 0.290474066}, // 9677K {0.282488739, 0.290467069}, // 9678K {0.28248275, 0.290460073}, // 9679K {0.282476763, 0.290453078}, // 9680K {0.282470777, 0.290446085}, // 9681K {0.282464793, 0.290439094}, // 9682K {0.28245881, 0.290432104}, // 9683K {0.282452829, 0.290425116}, // 9684K {0.282446849, 0.290418129}, // 9685K {0.282440871, 0.290411144}, // 9686K {0.282434895, 0.29040416}, // 9687K {0.28242892, 0.290397178}, // 9688K {0.282422946, 0.290390197}, // 9689K {0.282416974, 0.290383218}, // 9690K {0.282411003, 0.29037624}, // 9691K {0.282405034, 0.290369264}, // 9692K {0.282399067, 0.290362289}, // 9693K {0.282393101, 0.290355316}, // 9694K {0.282387136, 0.290348345}, // 9695K {0.282381173, 0.290341375}, // 9696K {0.282375212, 0.290334406}, // 9697K {0.282369252, 0.290327439}, // 9698K {0.282363293, 0.290320473}, // 9699K {0.282357336, 0.290313509}, // 9700K {0.282351381, 0.290306547}, // 9701K {0.282345427, 0.290299586}, // 9702K {0.282339474, 0.290292627}, // 9703K {0.282333523, 0.290285669}, // 9704K {0.282327574, 0.290278712}, // 9705K {0.282321626, 0.290271757}, // 9706K {0.282315679, 0.290264804}, // 9707K {0.282309734, 0.290257852}, // 9708K {0.282303791, 0.290250902}, // 9709K {0.282297849, 0.290243953}, // 9710K {0.282291909, 0.290237006}, // 9711K {0.28228597, 0.29023006}, // 9712K {0.282280032, 0.290223116}, // 9713K {0.282274096, 0.290216173}, // 9714K {0.282268162, 0.290209231}, // 9715K {0.282262229, 0.290202292}, // 9716K {0.282256297, 0.290195353}, // 9717K {0.282250367, 0.290188417}, // 9718K {0.282244439, 0.290181482}, // 9719K {0.282238512, 0.290174548}, // 9720K {0.282232586, 0.290167616}, // 9721K {0.282226662, 0.290160685}, // 9722K {0.28222074, 0.290153756}, // 9723K {0.282214819, 0.290146828}, // 9724K {0.282208899, 0.290139902}, // 9725K {0.282202981, 0.290132977}, // 9726K {0.282197065, 0.290126054}, // 9727K {0.28219115, 0.290119132}, // 9728K {0.282185236, 0.290112212}, // 9729K {0.282179324, 0.290105294}, // 9730K {0.282173414, 0.290098376}, // 9731K {0.282167504, 0.290091461}, // 9732K {0.282161597, 0.290084547}, // 9733K {0.282155691, 0.290077634}, // 9734K {0.282149786, 0.290070723}, // 9735K {0.282143883, 0.290063813}, // 9736K {0.282137981, 0.290056905}, // 9737K {0.282132081, 0.290049999}, // 9738K {0.282126183, 0.290043094}, // 9739K {0.282120285, 0.29003619}, // 9740K {0.28211439, 0.290029288}, // 9741K {0.282108495, 0.290022387}, // 9742K {0.282102603, 0.290015488}, // 9743K {0.282096712, 0.290008591}, // 9744K {0.282090822, 0.290001694}, // 9745K {0.282084933, 0.2899948}, // 9746K {0.282079047, 0.289987907}, // 9747K {0.282073161, 0.289981015}, // 9748K {0.282067277, 0.289974125}, // 9749K {0.282061395, 0.289967236}, // 9750K {0.282055514, 0.289960349}, // 9751K {0.282049635, 0.289953464}, // 9752K {0.282043757, 0.289946579}, // 9753K {0.28203788, 0.289939697}, // 9754K {0.282032005, 0.289932816}, // 9755K {0.282026132, 0.289925936}, // 9756K {0.28202026, 0.289919058}, // 9757K {0.282014389, 0.289912181}, // 9758K {0.28200852, 0.289905306}, // 9759K {0.282002653, 0.289898432}, // 9760K {0.281996787, 0.28989156}, // 9761K {0.281990922, 0.28988469}, // 9762K {0.281985059, 0.28987782}, // 9763K {0.281979197, 0.289870953}, // 9764K {0.281973337, 0.289864086}, // 9765K {0.281967478, 0.289857222}, // 9766K {0.281961621, 0.289850358}, // 9767K {0.281955765, 0.289843497}, // 9768K {0.281949911, 0.289836636}, // 9769K {0.281944058, 0.289829778}, // 9770K {0.281938206, 0.28982292}, // 9771K {0.281932356, 0.289816065}, // 9772K {0.281926508, 0.28980921}, // 9773K {0.281920661, 0.289802357}, // 9774K {0.281914815, 0.289795506}, // 9775K {0.281908971, 0.289788656}, // 9776K {0.281903129, 0.289781808}, // 9777K {0.281897288, 0.289774961}, // 9778K {0.281891448, 0.289768116}, // 9779K {0.28188561, 0.289761272}, // 9780K {0.281879773, 0.289754429}, // 9781K {0.281873938, 0.289747588}, // 9782K {0.281868104, 0.289740749}, // 9783K {0.281862272, 0.289733911}, // 9784K {0.281856441, 0.289727074}, // 9785K {0.281850611, 0.289720239}, // 9786K {0.281844783, 0.289713406}, // 9787K {0.281838957, 0.289706574}, // 9788K {0.281833132, 0.289699743}, // 9789K {0.281827308, 0.289692914}, // 9790K {0.281821486, 0.289686086}, // 9791K {0.281815665, 0.28967926}, // 9792K {0.281809846, 0.289672435}, // 9793K {0.281804028, 0.289665612}, // 9794K {0.281798212, 0.289658791}, // 9795K {0.281792397, 0.28965197}, // 9796K {0.281786584, 0.289645152}, // 9797K {0.281780772, 0.289638334}, // 9798K {0.281774961, 0.289631518}, // 9799K {0.281769152, 0.289624704}, // 9800K {0.281763345, 0.289617891}, // 9801K {0.281757539, 0.28961108}, // 9802K {0.281751734, 0.28960427}, // 9803K {0.281745931, 0.289597462}, // 9804K {0.281740129, 0.289590655}, // 9805K {0.281734329, 0.289583849}, // 9806K {0.28172853, 0.289577045}, // 9807K {0.281722732, 0.289570243}, // 9808K {0.281716936, 0.289563441}, // 9809K {0.281711142, 0.289556642}, // 9810K {0.281705349, 0.289549844}, // 9811K {0.281699557, 0.289543047}, // 9812K {0.281693767, 0.289536252}, // 9813K {0.281687978, 0.289529458}, // 9814K {0.281682191, 0.289522666}, // 9815K {0.281676405, 0.289515875}, // 9816K {0.281670621, 0.289509086}, // 9817K {0.281664838, 0.289502298}, // 9818K {0.281659056, 0.289495512}, // 9819K {0.281653276, 0.289488727}, // 9820K {0.281647498, 0.289481943}, // 9821K {0.28164172, 0.289475161}, // 9822K {0.281635945, 0.289468381}, // 9823K {0.28163017, 0.289461602}, // 9824K {0.281624398, 0.289454824}, // 9825K {0.281618626, 0.289448048}, // 9826K {0.281612856, 0.289441273}, // 9827K {0.281607088, 0.2894345}, // 9828K {0.281601321, 0.289427728}, // 9829K {0.281595555, 0.289420958}, // 9830K {0.281589791, 0.289414189}, // 9831K {0.281584028, 0.289407422}, // 9832K {0.281578267, 0.289400656}, // 9833K {0.281572507, 0.289393891}, // 9834K {0.281566748, 0.289387128}, // 9835K {0.281560991, 0.289380367}, // 9836K {0.281555236, 0.289373607}, // 9837K {0.281549482, 0.289366848}, // 9838K {0.281543729, 0.289360091}, // 9839K {0.281537978, 0.289353335}, // 9840K {0.281532228, 0.289346581}, // 9841K {0.281526479, 0.289339828}, // 9842K {0.281520732, 0.289333077}, // 9843K {0.281514987, 0.289326327}, // 9844K {0.281509243, 0.289319579}, // 9845K {0.2815035, 0.289312832}, // 9846K {0.281497759, 0.289306087}, // 9847K {0.281492019, 0.289299342}, // 9848K {0.281486281, 0.2892926}, // 9849K {0.281480544, 0.289285859}, // 9850K {0.281474808, 0.289279119}, // 9851K {0.281469074, 0.289272381}, // 9852K {0.281463341, 0.289265644}, // 9853K {0.28145761, 0.289258909}, // 9854K {0.28145188, 0.289252175}, // 9855K {0.281446152, 0.289245443}, // 9856K {0.281440425, 0.289238712}, // 9857K {0.281434699, 0.289231982}, // 9858K {0.281428975, 0.289225254}, // 9859K {0.281423253, 0.289218527}, // 9860K {0.281417531, 0.289211802}, // 9861K {0.281411811, 0.289205079}, // 9862K {0.281406093, 0.289198356}, // 9863K {0.281400376, 0.289191635}, // 9864K {0.28139466, 0.289184916}, // 9865K {0.281388946, 0.289178198}, // 9866K {0.281383233, 0.289171482}, // 9867K {0.281377522, 0.289164767}, // 9868K {0.281371812, 0.289158053}, // 9869K {0.281366104, 0.289151341}, // 9870K {0.281360397, 0.28914463}, // 9871K {0.281354691, 0.289137921}, // 9872K {0.281348987, 0.289131213}, // 9873K {0.281343284, 0.289124507}, // 9874K {0.281337583, 0.289117802}, // 9875K {0.281331883, 0.289111099}, // 9876K {0.281326184, 0.289104397}, // 9877K {0.281320487, 0.289097696}, // 9878K {0.281314791, 0.289090997}, // 9879K {0.281309097, 0.289084299}, // 9880K {0.281303404, 0.289077603}, // 9881K {0.281297712, 0.289070908}, // 9882K {0.281292022, 0.289064215}, // 9883K {0.281286334, 0.289057523}, // 9884K {0.281280646, 0.289050832}, // 9885K {0.281274961, 0.289044143}, // 9886K {0.281269276, 0.289037455}, // 9887K {0.281263593, 0.289030769}, // 9888K {0.281257912, 0.289024085}, // 9889K {0.281252231, 0.289017401}, // 9890K {0.281246553, 0.289010719}, // 9891K {0.281240875, 0.289004039}, // 9892K {0.281235199, 0.28899736}, // 9893K {0.281229525, 0.288990682}, // 9894K {0.281223851, 0.288984006}, // 9895K {0.28121818, 0.288977332}, // 9896K {0.281212509, 0.288970658}, // 9897K {0.28120684, 0.288963986}, // 9898K {0.281201173, 0.288957316}, // 9899K {0.281195507, 0.288950647}, // 9900K {0.281189842, 0.28894398}, // 9901K {0.281184179, 0.288937313}, // 9902K {0.281178517, 0.288930649}, // 9903K {0.281172856, 0.288923986}, // 9904K {0.281167197, 0.288917324}, // 9905K {0.281161539, 0.288910663}, // 9906K {0.281155883, 0.288904004}, // 9907K {0.281150228, 0.288897347}, // 9908K {0.281144575, 0.288890691}, // 9909K {0.281138922, 0.288884036}, // 9910K {0.281133272, 0.288877383}, // 9911K {0.281127622, 0.288870731}, // 9912K {0.281121974, 0.288864081}, // 9913K {0.281116328, 0.288857432}, // 9914K {0.281110683, 0.288850784}, // 9915K {0.281105039, 0.288844138}, // 9916K {0.281099397, 0.288837494}, // 9917K {0.281093756, 0.28883085}, // 9918K {0.281088116, 0.288824208}, // 9919K {0.281082478, 0.288817568}, // 9920K {0.281076841, 0.288810929}, // 9921K {0.281071206, 0.288804292}, // 9922K {0.281065572, 0.288797655}, // 9923K {0.28105994, 0.288791021}, // 9924K {0.281054308, 0.288784387}, // 9925K {0.281048679, 0.288777756}, // 9926K {0.28104305, 0.288771125}, // 9927K {0.281037423, 0.288764496}, // 9928K {0.281031798, 0.288757869}, // 9929K {0.281026173, 0.288751242}, // 9930K {0.28102055, 0.288744618}, // 9931K {0.281014929, 0.288737994}, // 9932K {0.281009309, 0.288731372}, // 9933K {0.28100369, 0.288724752}, // 9934K {0.280998073, 0.288718133}, // 9935K {0.280992457, 0.288711515}, // 9936K {0.280986843, 0.288704899}, // 9937K {0.28098123, 0.288698284}, // 9938K {0.280975618, 0.288691671}, // 9939K {0.280970007, 0.288685059}, // 9940K {0.280964398, 0.288678448}, // 9941K {0.280958791, 0.288671839}, // 9942K {0.280953185, 0.288665231}, // 9943K {0.28094758, 0.288658625}, // 9944K {0.280941976, 0.28865202}, // 9945K {0.280936374, 0.288645417}, // 9946K {0.280930774, 0.288638815}, // 9947K {0.280925174, 0.288632214}, // 9948K {0.280919577, 0.288625615}, // 9949K {0.28091398, 0.288619017}, // 9950K {0.280908385, 0.28861242}, // 9951K {0.280902791, 0.288605825}, // 9952K {0.280897199, 0.288599232}, // 9953K {0.280891608, 0.288592639}, // 9954K {0.280886018, 0.288586049}, // 9955K {0.28088043, 0.288579459}, // 9956K {0.280874843, 0.288572871}, // 9957K {0.280869258, 0.288566285}, // 9958K {0.280863673, 0.2885597}, // 9959K {0.280858091, 0.288553116}, // 9960K {0.280852509, 0.288546534}, // 9961K {0.280846929, 0.288539953}, // 9962K {0.280841351, 0.288533373}, // 9963K {0.280835773, 0.288526795}, // 9964K {0.280830198, 0.288520218}, // 9965K {0.280824623, 0.288513643}, // 9966K {0.28081905, 0.288507069}, // 9967K {0.280813478, 0.288500497}, // 9968K {0.280807908, 0.288493926}, // 9969K {0.280802339, 0.288487356}, // 9970K {0.280796771, 0.288480788}, // 9971K {0.280791205, 0.288474221}, // 9972K {0.28078564, 0.288467655}, // 9973K {0.280780076, 0.288461091}, // 9974K {0.280774514, 0.288454529}, // 9975K {0.280768954, 0.288447967}, // 9976K {0.280763394, 0.288441407}, // 9977K {0.280757836, 0.288434849}, // 9978K {0.280752279, 0.288428292}, // 9979K {0.280746724, 0.288421736}, // 9980K {0.28074117, 0.288415182}, // 9981K {0.280735617, 0.288408629}, // 9982K {0.280730066, 0.288402078}, // 9983K {0.280724516, 0.288395528}, // 9984K {0.280718968, 0.288388979}, // 9985K {0.280713421, 0.288382432}, // 9986K {0.280707875, 0.288375886}, // 9987K {0.280702331, 0.288369341}, // 9988K {0.280696788, 0.288362798}, // 9989K {0.280691246, 0.288356257}, // 9990K {0.280685706, 0.288349716}, // 9991K {0.280680167, 0.288343177}, // 9992K {0.280674629, 0.28833664}, // 9993K {0.280669093, 0.288330104}, // 9994K {0.280663558, 0.288323569}, // 9995K {0.280658024, 0.288317036}, // 9996K {0.280652492, 0.288310504}, // 9997K {0.280646961, 0.288303973}, // 9998K {0.280641432, 0.288297444}, // 9999K {0.280635904, 0.288290916}, // 10000K {0.280630377, 0.28828439}, // 10001K {0.280624852, 0.288277865}, // 10002K {0.280619328, 0.288271342}, // 10003K {0.280613805, 0.288264819}, // 10004K {0.280608284, 0.288258299}, // 10005K {0.280602764, 0.288251779}, // 10006K {0.280597245, 0.288245261}, // 10007K {0.280591728, 0.288238745}, // 10008K {0.280586212, 0.288232229}, // 10009K {0.280580697, 0.288225716}, // 10010K {0.280575184, 0.288219203}, // 10011K {0.280569672, 0.288212692}, // 10012K {0.280564162, 0.288206182}, // 10013K {0.280558653, 0.288199674}, // 10014K {0.280553145, 0.288193167}, // 10015K {0.280547638, 0.288186662}, // 10016K {0.280542133, 0.288180158}, // 10017K {0.28053663, 0.288173655}, // 10018K {0.280531127, 0.288167153}, // 10019K {0.280525626, 0.288160653}, // 10020K {0.280520127, 0.288154155}, // 10021K {0.280514628, 0.288147658}, // 10022K {0.280509131, 0.288141162}, // 10023K {0.280503635, 0.288134667}, // 10024K {0.280498141, 0.288128174}, // 10025K {0.280492648, 0.288121683}, // 10026K {0.280487157, 0.288115192}, // 10027K {0.280481666, 0.288108703}, // 10028K {0.280476177, 0.288102216}, // 10029K {0.28047069, 0.28809573}, // 10030K {0.280465204, 0.288089245}, // 10031K {0.280459719, 0.288082762}, // 10032K {0.280454235, 0.288076279}, // 10033K {0.280448753, 0.288069799}, // 10034K {0.280443272, 0.28806332}, // 10035K {0.280437792, 0.288056842}, // 10036K {0.280432314, 0.288050365}, // 10037K {0.280426837, 0.28804389}, // 10038K {0.280421362, 0.288037416}, // 10039K {0.280415888, 0.288030944}, // 10040K {0.280410415, 0.288024473}, // 10041K {0.280404943, 0.288018003}, // 10042K {0.280399473, 0.288011535}, // 10043K {0.280394004, 0.288005068}, // 10044K {0.280388537, 0.287998603}, // 10045K {0.280383071, 0.287992139}, // 10046K {0.280377606, 0.287985676}, // 10047K {0.280372142, 0.287979214}, // 10048K {0.28036668, 0.287972754}, // 10049K {0.280361219, 0.287966296}, // 10050K {0.28035576, 0.287959838}, // 10051K {0.280350302, 0.287953383}, // 10052K {0.280344845, 0.287946928}, // 10053K {0.280339389, 0.287940475}, // 10054K {0.280333935, 0.287934023}, // 10055K {0.280328482, 0.287927573}, // 10056K {0.280323031, 0.287921124}, // 10057K {0.280317581, 0.287914676}, // 10058K {0.280312132, 0.28790823}, // 10059K {0.280306684, 0.287901785}, // 10060K {0.280301238, 0.287895341}, // 10061K {0.280295793, 0.287888899}, // 10062K {0.28029035, 0.287882458}, // 10063K {0.280284908, 0.287876019}, // 10064K {0.280279467, 0.287869581}, // 10065K {0.280274027, 0.287863144}, // 10066K {0.280268589, 0.287856709}, // 10067K {0.280263152, 0.287850275}, // 10068K {0.280257716, 0.287843842}, // 10069K {0.280252282, 0.287837411}, // 10070K {0.280246849, 0.287830981}, // 10071K {0.280241418, 0.287824552}, // 10072K {0.280235987, 0.287818125}, // 10073K {0.280230558, 0.287811699}, // 10074K {0.280225131, 0.287805275}, // 10075K {0.280219705, 0.287798852}, // 10076K {0.28021428, 0.28779243}, // 10077K {0.280208856, 0.287786009}, // 10078K {0.280203434, 0.28777959}, // 10079K {0.280198013, 0.287773173}, // 10080K {0.280192593, 0.287766757}, // 10081K {0.280187175, 0.287760342}, // 10082K {0.280181757, 0.287753928}, // 10083K {0.280176342, 0.287747516}, // 10084K {0.280170927, 0.287741105}, // 10085K {0.280165514, 0.287734695}, // 10086K {0.280160102, 0.287728287}, // 10087K {0.280154692, 0.287721881}, // 10088K {0.280149283, 0.287715475}, // 10089K {0.280143875, 0.287709071}, // 10090K {0.280138469, 0.287702668}, // 10091K {0.280133063, 0.287696267}, // 10092K {0.280127659, 0.287689867}, // 10093K {0.280122257, 0.287683468}, // 10094K {0.280116856, 0.287677071}, // 10095K {0.280111456, 0.287670675}, // 10096K {0.280106057, 0.287664281}, // 10097K {0.28010066, 0.287657887}, // 10098K {0.280095264, 0.287651495}, // 10099K {0.280089869, 0.287645105}, // 10100K {0.280084476, 0.287638716}, // 10101K {0.280079084, 0.287632328}, // 10102K {0.280073693, 0.287625942}, // 10103K {0.280068303, 0.287619556}, // 10104K {0.280062915, 0.287613173}, // 10105K {0.280057528, 0.28760679}, // 10106K {0.280052143, 0.287600409}, // 10107K {0.280046759, 0.287594029}, // 10108K {0.280041376, 0.287587651}, // 10109K {0.280035994, 0.287581274}, // 10110K {0.280030614, 0.287574898}, // 10111K {0.280025235, 0.287568524}, // 10112K {0.280019857, 0.287562151}, // 10113K {0.280014481, 0.28755578}, // 10114K {0.280009106, 0.287549409}, // 10115K {0.280003732, 0.28754304}, // 10116K {0.279998359, 0.287536673}, // 10117K {0.279992988, 0.287530306}, // 10118K {0.279987618, 0.287523942}, // 10119K {0.27998225, 0.287517578}, // 10120K {0.279976883, 0.287511216}, // 10121K {0.279971517, 0.287504855}, // 10122K {0.279966152, 0.287498495}, // 10123K {0.279960789, 0.287492137}, // 10124K {0.279955427, 0.287485781}, // 10125K {0.279950066, 0.287479425}, // 10126K {0.279944706, 0.287473071}, // 10127K {0.279939348, 0.287466718}, // 10128K {0.279933991, 0.287460367}, // 10129K {0.279928636, 0.287454017}, // 10130K {0.279923282, 0.287447668}, // 10131K {0.279917929, 0.28744132}, // 10132K {0.279912577, 0.287434974}, // 10133K {0.279907227, 0.287428629}, // 10134K {0.279901878, 0.287422286}, // 10135K {0.27989653, 0.287415944}, // 10136K {0.279891183, 0.287409603}, // 10137K {0.279885838, 0.287403264}, // 10138K {0.279880494, 0.287396926}, // 10139K {0.279875152, 0.287390589}, // 10140K {0.27986981, 0.287384254}, // 10141K {0.27986447, 0.28737792}, // 10142K {0.279859132, 0.287371587}, // 10143K {0.279853794, 0.287365256}, // 10144K {0.279848458, 0.287358925}, // 10145K {0.279843123, 0.287352597}, // 10146K {0.27983779, 0.287346269}, // 10147K {0.279832457, 0.287339943}, // 10148K {0.279827127, 0.287333619}, // 10149K {0.279821797, 0.287327295}, // 10150K {0.279816468, 0.287320973}, // 10151K {0.279811141, 0.287314653}, // 10152K {0.279805816, 0.287308333}, // 10153K {0.279800491, 0.287302015}, // 10154K {0.279795168, 0.287295698}, // 10155K {0.279789846, 0.287289383}, // 10156K {0.279784525, 0.287283069}, // 10157K {0.279779206, 0.287276756}, // 10158K {0.279773888, 0.287270445}, // 10159K {0.279768571, 0.287264135}, // 10160K {0.279763255, 0.287257826}, // 10161K {0.279757941, 0.287251519}, // 10162K {0.279752628, 0.287245213}, // 10163K {0.279747317, 0.287238908}, // 10164K {0.279742006, 0.287232605}, // 10165K {0.279736697, 0.287226302}, // 10166K {0.279731389, 0.287220002}, // 10167K {0.279726083, 0.287213702}, // 10168K {0.279720777, 0.287207404}, // 10169K {0.279715473, 0.287201107}, // 10170K {0.279710171, 0.287194812}, // 10171K {0.279704869, 0.287188518}, // 10172K {0.279699569, 0.287182225}, // 10173K {0.27969427, 0.287175934}, // 10174K {0.279688973, 0.287169643}, // 10175K {0.279683676, 0.287163355}, // 10176K {0.279678381, 0.287157067}, // 10177K {0.279673088, 0.287150781}, // 10178K {0.279667795, 0.287144496}, // 10179K {0.279662504, 0.287138212}, // 10180K {0.279657214, 0.28713193}, // 10181K {0.279651926, 0.287125649}, // 10182K {0.279646638, 0.28711937}, // 10183K {0.279641352, 0.287113092}, // 10184K {0.279636067, 0.287106815}, // 10185K {0.279630784, 0.287100539}, // 10186K {0.279625501, 0.287094265}, // 10187K {0.27962022, 0.287087992}, // 10188K {0.279614941, 0.28708172}, // 10189K {0.279609662, 0.28707545}, // 10190K {0.279604385, 0.287069181}, // 10191K {0.279599109, 0.287062913}, // 10192K {0.279593835, 0.287056647}, // 10193K {0.279588561, 0.287050382}, // 10194K {0.279583289, 0.287044118}, // 10195K {0.279578018, 0.287037855}, // 10196K {0.279572749, 0.287031594}, // 10197K {0.27956748, 0.287025334}, // 10198K {0.279562213, 0.287019076}, // 10199K {0.279556948, 0.287012819}, // 10200K {0.279551683, 0.287006563}, // 10201K {0.27954642, 0.287000308}, // 10202K {0.279541158, 0.286994055}, // 10203K {0.279535897, 0.286987803}, // 10204K {0.279530638, 0.286981553}, // 10205K {0.27952538, 0.286975303}, // 10206K {0.279520123, 0.286969055}, // 10207K {0.279514867, 0.286962809}, // 10208K {0.279509613, 0.286956563}, // 10209K {0.27950436, 0.286950319}, // 10210K {0.279499108, 0.286944077}, // 10211K {0.279493858, 0.286937835}, // 10212K {0.279488608, 0.286931595}, // 10213K {0.27948336, 0.286925356}, // 10214K {0.279478113, 0.286919119}, // 10215K {0.279472868, 0.286912883}, // 10216K {0.279467624, 0.286906648}, // 10217K {0.279462381, 0.286900414}, // 10218K {0.279457139, 0.286894182}, // 10219K {0.279451898, 0.286887951}, // 10220K {0.279446659, 0.286881721}, // 10221K {0.279441421, 0.286875493}, // 10222K {0.279436185, 0.286869266}, // 10223K {0.279430949, 0.28686304}, // 10224K {0.279425715, 0.286856816}, // 10225K {0.279420482, 0.286850593}, // 10226K {0.27941525, 0.286844371}, // 10227K {0.27941002, 0.28683815}, // 10228K {0.279404791, 0.286831931}, // 10229K {0.279399563, 0.286825713}, // 10230K {0.279394336, 0.286819497}, // 10231K {0.279389111, 0.286813281}, // 10232K {0.279383887, 0.286807067}, // 10233K {0.279378664, 0.286800855}, // 10234K {0.279373442, 0.286794643}, // 10235K {0.279368222, 0.286788433}, // 10236K {0.279363003, 0.286782224}, // 10237K {0.279357785, 0.286776017}, // 10238K {0.279352568, 0.286769811}, // 10239K {0.279347353, 0.286763606}, // 10240K {0.279342139, 0.286757402}, // 10241K {0.279336926, 0.2867512}, // 10242K {0.279331714, 0.286744999}, // 10243K {0.279326504, 0.286738799}, // 10244K {0.279321295, 0.286732601}, // 10245K {0.279316087, 0.286726404}, // 10246K {0.27931088, 0.286720208}, // 10247K {0.279305675, 0.286714013}, // 10248K {0.279300471, 0.28670782}, // 10249K {0.279295268, 0.286701628}, // 10250K {0.279290066, 0.286695438}, // 10251K {0.279284866, 0.286689248}, // 10252K {0.279279667, 0.28668306}, // 10253K {0.279274469, 0.286676874}, // 10254K {0.279269272, 0.286670688}, // 10255K {0.279264077, 0.286664504}, // 10256K {0.279258882, 0.286658321}, // 10257K {0.27925369, 0.28665214}, // 10258K {0.279248498, 0.286645959}, // 10259K {0.279243307, 0.28663978}, // 10260K {0.279238118, 0.286633603}, // 10261K {0.27923293, 0.286627426}, // 10262K {0.279227744, 0.286621251}, // 10263K {0.279222558, 0.286615077}, // 10264K {0.279217374, 0.286608905}, // 10265K {0.279212191, 0.286602734}, // 10266K {0.279207009, 0.286596564}, // 10267K {0.279201829, 0.286590395}, // 10268K {0.279196649, 0.286584228}, // 10269K {0.279191471, 0.286578062}, // 10270K {0.279186295, 0.286571897}, // 10271K {0.279181119, 0.286565734}, // 10272K {0.279175945, 0.286559571}, // 10273K {0.279170772, 0.28655341}, // 10274K {0.2791656, 0.286547251}, // 10275K {0.279160429, 0.286541092}, // 10276K {0.27915526, 0.286534935}, // 10277K {0.279150092, 0.28652878}, // 10278K {0.279144925, 0.286522625}, // 10279K {0.279139759, 0.286516472}, // 10280K {0.279134595, 0.28651032}, // 10281K {0.279129431, 0.286504169}, // 10282K {0.279124269, 0.28649802}, // 10283K {0.279119109, 0.286491872}, // 10284K {0.279113949, 0.286485725}, // 10285K {0.279108791, 0.28647958}, // 10286K {0.279103634, 0.286473436}, // 10287K {0.279098478, 0.286467293}, // 10288K {0.279093324, 0.286461151}, // 10289K {0.27908817, 0.286455011}, // 10290K {0.279083018, 0.286448872}, // 10291K {0.279077867, 0.286442734}, // 10292K {0.279072718, 0.286436597}, // 10293K {0.279067569, 0.286430462}, // 10294K {0.279062422, 0.286424328}, // 10295K {0.279057276, 0.286418195}, // 10296K {0.279052131, 0.286412064}, // 10297K {0.279046988, 0.286405934}, // 10298K {0.279041845, 0.286399805}, // 10299K {0.279036704, 0.286393677}, // 10300K {0.279031564, 0.286387551}, // 10301K {0.279026426, 0.286381426}, // 10302K {0.279021288, 0.286375302}, // 10303K {0.279016152, 0.28636918}, // 10304K {0.279011017, 0.286363059}, // 10305K {0.279005884, 0.286356939}, // 10306K {0.279000751, 0.28635082}, // 10307K {0.27899562, 0.286344703}, // 10308K {0.27899049, 0.286338587}, // 10309K {0.278985361, 0.286332472}, // 10310K {0.278980233, 0.286326359}, // 10311K {0.278975107, 0.286320246}, // 10312K {0.278969982, 0.286314135}, // 10313K {0.278964858, 0.286308026}, // 10314K {0.278959735, 0.286301917}, // 10315K {0.278954614, 0.28629581}, // 10316K {0.278949493, 0.286289704}, // 10317K {0.278944374, 0.286283599}, // 10318K {0.278939257, 0.286277496}, // 10319K {0.27893414, 0.286271394}, // 10320K {0.278929025, 0.286265293}, // 10321K {0.27892391, 0.286259194}, // 10322K {0.278918797, 0.286253095}, // 10323K {0.278913686, 0.286246998}, // 10324K {0.278908575, 0.286240903}, // 10325K {0.278903466, 0.286234808}, // 10326K {0.278898358, 0.286228715}, // 10327K {0.278893251, 0.286222623}, // 10328K {0.278888145, 0.286216532}, // 10329K {0.278883041, 0.286210443}, // 10330K {0.278877937, 0.286204355}, // 10331K {0.278872835, 0.286198268}, // 10332K {0.278867734, 0.286192182}, // 10333K {0.278862635, 0.286186098}, // 10334K {0.278857536, 0.286180015}, // 10335K {0.278852439, 0.286173933}, // 10336K {0.278847343, 0.286167853}, // 10337K {0.278842249, 0.286161773}, // 10338K {0.278837155, 0.286155695}, // 10339K {0.278832063, 0.286149619}, // 10340K {0.278826972, 0.286143543}, // 10341K {0.278821882, 0.286137469}, // 10342K {0.278816793, 0.286131396}, // 10343K {0.278811705, 0.286125324}, // 10344K {0.278806619, 0.286119254}, // 10345K {0.278801534, 0.286113185}, // 10346K {0.27879645, 0.286107117}, // 10347K {0.278791367, 0.28610105}, // 10348K {0.278786286, 0.286094985}, // 10349K {0.278781206, 0.286088921}, // 10350K {0.278776127, 0.286082858}, // 10351K {0.278771049, 0.286076796}, // 10352K {0.278765972, 0.286070736}, // 10353K {0.278760897, 0.286064677}, // 10354K {0.278755822, 0.286058619}, // 10355K {0.278750749, 0.286052562}, // 10356K {0.278745678, 0.286046507}, // 10357K {0.278740607, 0.286040453}, // 10358K {0.278735537, 0.2860344}, // 10359K {0.278730469, 0.286028349}, // 10360K {0.278725402, 0.286022298}, // 10361K {0.278720336, 0.286016249}, // 10362K {0.278715272, 0.286010202}, // 10363K {0.278710208, 0.286004155}, // 10364K {0.278705146, 0.28599811}, // 10365K {0.278700085, 0.285992066}, // 10366K {0.278695025, 0.285986023}, // 10367K {0.278689967, 0.285979982}, // 10368K {0.278684909, 0.285973941}, // 10369K {0.278679853, 0.285967902}, // 10370K {0.278674798, 0.285961865}, // 10371K {0.278669744, 0.285955828}, // 10372K {0.278664691, 0.285949793}, // 10373K {0.27865964, 0.285943759}, // 10374K {0.27865459, 0.285937726}, // 10375K {0.278649541, 0.285931695}, // 10376K {0.278644493, 0.285925664}, // 10377K {0.278639446, 0.285919635}, // 10378K {0.278634401, 0.285913608}, // 10379K {0.278629356, 0.285907581}, // 10380K {0.278624313, 0.285901556}, // 10381K {0.278619272, 0.285895532}, // 10382K {0.278614231, 0.285889509}, // 10383K {0.278609191, 0.285883488}, // 10384K {0.278604153, 0.285877467}, // 10385K {0.278599116, 0.285871448}, // 10386K {0.27859408, 0.285865431}, // 10387K {0.278589045, 0.285859414}, // 10388K {0.278584012, 0.285853399}, // 10389K {0.278578979, 0.285847385}, // 10390K {0.278573948, 0.285841372}, // 10391K {0.278568918, 0.285835361}, // 10392K {0.278563889, 0.28582935}, // 10393K {0.278558862, 0.285823341}, // 10394K {0.278553835, 0.285817334}, // 10395K {0.27854881, 0.285811327}, // 10396K {0.278543786, 0.285805322}, // 10397K {0.278538763, 0.285799318}, // 10398K {0.278533742, 0.285793315}, // 10399K {0.278528721, 0.285787313}, // 10400K {0.278523702, 0.285781313}, // 10401K {0.278518684, 0.285775314}, // 10402K {0.278513667, 0.285769316}, // 10403K {0.278508651, 0.285763319}, // 10404K {0.278503637, 0.285757324}, // 10405K {0.278498623, 0.28575133}, // 10406K {0.278493611, 0.285745337}, // 10407K {0.2784886, 0.285739345}, // 10408K {0.27848359, 0.285733355}, // 10409K {0.278478582, 0.285727366}, // 10410K {0.278473574, 0.285721378}, // 10411K {0.278468568, 0.285715391}, // 10412K {0.278463563, 0.285709406}, // 10413K {0.278458559, 0.285703421}, // 10414K {0.278453556, 0.285697439}, // 10415K {0.278448555, 0.285691457}, // 10416K {0.278443554, 0.285685476}, // 10417K {0.278438555, 0.285679497}, // 10418K {0.278433557, 0.285673519}, // 10419K {0.27842856, 0.285667542}, // 10420K {0.278423565, 0.285661567}, // 10421K {0.27841857, 0.285655592}, // 10422K {0.278413577, 0.285649619}, // 10423K {0.278408585, 0.285643647}, // 10424K {0.278403594, 0.285637677}, // 10425K {0.278398604, 0.285631707}, // 10426K {0.278393616, 0.285625739}, // 10427K {0.278388628, 0.285619772}, // 10428K {0.278383642, 0.285613807}, // 10429K {0.278378657, 0.285607842}, // 10430K {0.278373673, 0.285601879}, // 10431K {0.27836869, 0.285595917}, // 10432K {0.278363709, 0.285589956}, // 10433K {0.278358728, 0.285583997}, // 10434K {0.278353749, 0.285578038}, // 10435K {0.278348771, 0.285572081}, // 10436K {0.278343794, 0.285566125}, // 10437K {0.278338819, 0.285560171}, // 10438K {0.278333844, 0.285554217}, // 10439K {0.278328871, 0.285548265}, // 10440K {0.278323899, 0.285542314}, // 10441K {0.278318928, 0.285536364}, // 10442K {0.278313958, 0.285530416}, // 10443K {0.278308989, 0.285524469}, // 10444K {0.278304022, 0.285518523}, // 10445K {0.278299055, 0.285512578}, // 10446K {0.27829409, 0.285506634}, // 10447K {0.278289126, 0.285500692}, // 10448K {0.278284163, 0.285494751}, // 10449K {0.278279202, 0.285488811}, // 10450K {0.278274241, 0.285482872}, // 10451K {0.278269282, 0.285476935}, // 10452K {0.278264324, 0.285470999}, // 10453K {0.278259367, 0.285465064}, // 10454K {0.278254411, 0.28545913}, // 10455K {0.278249456, 0.285453197}, // 10456K {0.278244503, 0.285447266}, // 10457K {0.27823955, 0.285441336}, // 10458K {0.278234599, 0.285435407}, // 10459K {0.278229649, 0.285429479}, // 10460K {0.2782247, 0.285423553}, // 10461K {0.278219753, 0.285417628}, // 10462K {0.278214806, 0.285411704}, // 10463K {0.278209861, 0.285405781}, // 10464K {0.278204917, 0.285399859}, // 10465K {0.278199973, 0.285393939}, // 10466K {0.278195032, 0.28538802}, // 10467K {0.278190091, 0.285382102}, // 10468K {0.278185151, 0.285376185}, // 10469K {0.278180213, 0.28537027}, // 10470K {0.278175276, 0.285364356}, // 10471K {0.27817034, 0.285358443}, // 10472K {0.278165405, 0.285352531}, // 10473K {0.278160471, 0.28534662}, // 10474K {0.278155538, 0.285340711}, // 10475K {0.278150607, 0.285334803}, // 10476K {0.278145677, 0.285328896}, // 10477K {0.278140747, 0.28532299}, // 10478K {0.278135819, 0.285317085}, // 10479K {0.278130893, 0.285311182}, // 10480K {0.278125967, 0.28530528}, // 10481K {0.278121042, 0.285299379}, // 10482K {0.278116119, 0.285293479}, // 10483K {0.278111197, 0.285287581}, // 10484K {0.278106276, 0.285281684}, // 10485K {0.278101356, 0.285275788}, // 10486K {0.278096437, 0.285269893}, // 10487K {0.27809152, 0.285263999}, // 10488K {0.278086603, 0.285258107}, // 10489K {0.278081688, 0.285252216}, // 10490K {0.278076774, 0.285246326}, // 10491K {0.278071861, 0.285240437}, // 10492K {0.278066949, 0.28523455}, // 10493K {0.278062038, 0.285228663}, // 10494K {0.278057129, 0.285222778}, // 10495K {0.27805222, 0.285216894}, // 10496K {0.278047313, 0.285211012}, // 10497K {0.278042407, 0.28520513}, // 10498K {0.278037502, 0.28519925}, // 10499K {0.278032598, 0.285193371}, // 10500K {0.278027696, 0.285187493}, // 10501K {0.278022794, 0.285181616}, // 10502K {0.278017894, 0.285175741}, // 10503K {0.278012994, 0.285169866}, // 10504K {0.278008096, 0.285163993}, // 10505K {0.278003199, 0.285158122}, // 10506K {0.277998304, 0.285152251}, // 10507K {0.277993409, 0.285146381}, // 10508K {0.277988516, 0.285140513}, // 10509K {0.277983623, 0.285134646}, // 10510K {0.277978732, 0.28512878}, // 10511K {0.277973842, 0.285122916}, // 10512K {0.277968953, 0.285117052}, // 10513K {0.277964065, 0.28511119}, // 10514K {0.277959179, 0.285105329}, // 10515K {0.277954293, 0.285099469}, // 10516K {0.277949409, 0.285093611}, // 10517K {0.277944526, 0.285087753}, // 10518K {0.277939644, 0.285081897}, // 10519K {0.277934763, 0.285076042}, // 10520K {0.277929883, 0.285070189}, // 10521K {0.277925004, 0.285064336}, // 10522K {0.277920127, 0.285058485}, // 10523K {0.27791525, 0.285052634}, // 10524K {0.277910375, 0.285046785}, // 10525K {0.277905501, 0.285040938}, // 10526K {0.277900628, 0.285035091}, // 10527K {0.277895756, 0.285029246}, // 10528K {0.277890886, 0.285023401}, // 10529K {0.277886016, 0.285017558}, // 10530K {0.277881148, 0.285011717}, // 10531K {0.27787628, 0.285005876}, // 10532K {0.277871414, 0.285000037}, // 10533K {0.277866549, 0.284994198}, // 10534K {0.277861685, 0.284988361}, // 10535K {0.277856823, 0.284982526}, // 10536K {0.277851961, 0.284976691}, // 10537K {0.277847101, 0.284970858}, // 10538K {0.277842241, 0.284965025}, // 10539K {0.277837383, 0.284959194}, // 10540K {0.277832526, 0.284953364}, // 10541K {0.27782767, 0.284947536}, // 10542K {0.277822815, 0.284941708}, // 10543K {0.277817962, 0.284935882}, // 10544K {0.277813109, 0.284930057}, // 10545K {0.277808258, 0.284924233}, // 10546K {0.277803408, 0.284918411}, // 10547K {0.277798558, 0.284912589}, // 10548K {0.27779371, 0.284906769}, // 10549K {0.277788863, 0.28490095}, // 10550K {0.277784018, 0.284895132}, // 10551K {0.277779173, 0.284889315}, // 10552K {0.27777433, 0.284883499}, // 10553K {0.277769487, 0.284877685}, // 10554K {0.277764646, 0.284871872}, // 10555K {0.277759806, 0.28486606}, // 10556K {0.277754967, 0.284860249}, // 10557K {0.277750129, 0.28485444}, // 10558K {0.277745292, 0.284848631}, // 10559K {0.277740457, 0.284842824}, // 10560K {0.277735622, 0.284837018}, // 10561K {0.277730789, 0.284831213}, // 10562K {0.277725957, 0.28482541}, // 10563K {0.277721125, 0.284819607}, // 10564K {0.277716296, 0.284813806}, // 10565K {0.277711467, 0.284808006}, // 10566K {0.277706639, 0.284802207}, // 10567K {0.277701812, 0.284796409}, // 10568K {0.277696987, 0.284790613}, // 10569K {0.277692162, 0.284784817}, // 10570K {0.277687339, 0.284779023}, // 10571K {0.277682517, 0.28477323}, // 10572K {0.277677696, 0.284767438}, // 10573K {0.277672876, 0.284761648}, // 10574K {0.277668057, 0.284755858}, // 10575K {0.27766324, 0.28475007}, // 10576K {0.277658423, 0.284744283}, // 10577K {0.277653608, 0.284738497}, // 10578K {0.277648793, 0.284732712}, // 10579K {0.27764398, 0.284726929}, // 10580K {0.277639168, 0.284721147}, // 10581K {0.277634357, 0.284715365}, // 10582K {0.277629547, 0.284709585}, // 10583K {0.277624739, 0.284703807}, // 10584K {0.277619931, 0.284698029}, // 10585K {0.277615125, 0.284692253}, // 10586K {0.277610319, 0.284686477}, // 10587K {0.277605515, 0.284680703}, // 10588K {0.277600712, 0.28467493}, // 10589K {0.27759591, 0.284669159}, // 10590K {0.277591109, 0.284663388}, // 10591K {0.277586309, 0.284657619}, // 10592K {0.277581511, 0.28465185}, // 10593K {0.277576713, 0.284646083}, // 10594K {0.277571917, 0.284640318}, // 10595K {0.277567121, 0.284634553}, // 10596K {0.277562327, 0.284628789}, // 10597K {0.277557534, 0.284623027}, // 10598K {0.277552742, 0.284617266}, // 10599K {0.277547951, 0.284611506}, // 10600K {0.277543161, 0.284605747}, // 10601K {0.277538373, 0.28459999}, // 10602K {0.277533585, 0.284594233}, // 10603K {0.277528799, 0.284588478}, // 10604K {0.277524013, 0.284582724}, // 10605K {0.277519229, 0.284576971}, // 10606K {0.277514446, 0.284571219}, // 10607K {0.277509664, 0.284565469}, // 10608K {0.277504883, 0.284559719}, // 10609K {0.277500103, 0.284553971}, // 10610K {0.277495324, 0.284548224}, // 10611K {0.277490547, 0.284542478}, // 10612K {0.27748577, 0.284536733}, // 10613K {0.277480995, 0.28453099}, // 10614K {0.277476221, 0.284525247}, // 10615K {0.277471448, 0.284519506}, // 10616K {0.277466676, 0.284513766}, // 10617K {0.277461905, 0.284508027}, // 10618K {0.277457135, 0.28450229}, // 10619K {0.277452366, 0.284496553}, // 10620K {0.277447598, 0.284490818}, // 10621K {0.277442832, 0.284485084}, // 10622K {0.277438066, 0.284479351}, // 10623K {0.277433302, 0.284473619}, // 10624K {0.277428539, 0.284467888}, // 10625K {0.277423777, 0.284462158}, // 10626K {0.277419016, 0.28445643}, // 10627K {0.277414256, 0.284450703}, // 10628K {0.277409497, 0.284444977}, // 10629K {0.277404739, 0.284439252}, // 10630K {0.277399983, 0.284433528}, // 10631K {0.277395227, 0.284427806}, // 10632K {0.277390473, 0.284422084}, // 10633K {0.277385719, 0.284416364}, // 10634K {0.277380967, 0.284410645}, // 10635K {0.277376216, 0.284404927}, // 10636K {0.277371466, 0.28439921}, // 10637K {0.277366717, 0.284393495}, // 10638K {0.277361969, 0.284387781}, // 10639K {0.277357222, 0.284382067}, // 10640K {0.277352477, 0.284376355}, // 10641K {0.277347732, 0.284370644}, // 10642K {0.277342989, 0.284364935}, // 10643K {0.277338246, 0.284359226}, // 10644K {0.277333505, 0.284353519}, // 10645K {0.277328765, 0.284347812}, // 10646K {0.277324026, 0.284342107}, // 10647K {0.277319288, 0.284336403}, // 10648K {0.277314551, 0.2843307}, // 10649K {0.277309815, 0.284324999}, // 10650K {0.277305081, 0.284319298}, // 10651K {0.277300347, 0.284313599}, // 10652K {0.277295614, 0.284307901}, // 10653K {0.277290883, 0.284302204}, // 10654K {0.277286153, 0.284296508}, // 10655K {0.277281423, 0.284290813}, // 10656K {0.277276695, 0.28428512}, // 10657K {0.277271968, 0.284279427}, // 10658K {0.277267242, 0.284273736}, // 10659K {0.277262517, 0.284268046}, // 10660K {0.277257793, 0.284262357}, // 10661K {0.277253071, 0.284256669}, // 10662K {0.277248349, 0.284250983}, // 10663K {0.277243629, 0.284245297}, // 10664K {0.277238909, 0.284239613}, // 10665K {0.277234191, 0.28423393}, // 10666K {0.277229474, 0.284228248}, // 10667K {0.277224757, 0.284222567}, // 10668K {0.277220042, 0.284216887}, // 10669K {0.277215328, 0.284211209}, // 10670K {0.277210615, 0.284205532}, // 10671K {0.277205904, 0.284199855}, // 10672K {0.277201193, 0.28419418}, // 10673K {0.277196483, 0.284188506}, // 10674K {0.277191775, 0.284182834}, // 10675K {0.277187067, 0.284177162}, // 10676K {0.277182361, 0.284171491}, // 10677K {0.277177655, 0.284165822}, // 10678K {0.277172951, 0.284160154}, // 10679K {0.277168248, 0.284154487}, // 10680K {0.277163546, 0.284148821}, // 10681K {0.277158845, 0.284143156}, // 10682K {0.277154145, 0.284137493}, // 10683K {0.277149446, 0.28413183}, // 10684K {0.277144748, 0.284126169}, // 10685K {0.277140052, 0.284120509}, // 10686K {0.277135356, 0.28411485}, // 10687K {0.277130661, 0.284109192}, // 10688K {0.277125968, 0.284103535}, // 10689K {0.277121276, 0.28409788}, // 10690K {0.277116584, 0.284092225}, // 10691K {0.277111894, 0.284086572}, // 10692K {0.277107205, 0.28408092}, // 10693K {0.277102517, 0.284075269}, // 10694K {0.27709783, 0.284069619}, // 10695K {0.277093144, 0.284063971}, // 10696K {0.277088459, 0.284058323}, // 10697K {0.277083776, 0.284052677}, // 10698K {0.277079093, 0.284047031}, // 10699K {0.277074411, 0.284041387}, // 10700K {0.277069731, 0.284035744}, // 10701K {0.277065051, 0.284030103}, // 10702K {0.277060373, 0.284024462}, // 10703K {0.277055696, 0.284018822}, // 10704K {0.27705102, 0.284013184}, // 10705K {0.277046344, 0.284007547}, // 10706K {0.27704167, 0.284001911}, // 10707K {0.277036997, 0.283996276}, // 10708K {0.277032325, 0.283990642}, // 10709K {0.277027655, 0.283985009}, // 10710K {0.277022985, 0.283979377}, // 10711K {0.277018316, 0.283973747}, // 10712K {0.277013648, 0.283968118}, // 10713K {0.277008982, 0.28396249}, // 10714K {0.277004316, 0.283956863}, // 10715K {0.276999652, 0.283951237}, // 10716K {0.276994989, 0.283945612}, // 10717K {0.276990326, 0.283939988}, // 10718K {0.276985665, 0.283934366}, // 10719K {0.276981005, 0.283928745}, // 10720K {0.276976346, 0.283923124}, // 10721K {0.276971688, 0.283917505}, // 10722K {0.276967031, 0.283911887}, // 10723K {0.276962375, 0.283906271}, // 10724K {0.27695772, 0.283900655}, // 10725K {0.276953066, 0.283895041}, // 10726K {0.276948414, 0.283889427}, // 10727K {0.276943762, 0.283883815}, // 10728K {0.276939112, 0.283878204}, // 10729K {0.276934462, 0.283872594}, // 10730K {0.276929814, 0.283866985}, // 10731K {0.276925166, 0.283861377}, // 10732K {0.27692052, 0.283855771}, // 10733K {0.276915875, 0.283850165}, // 10734K {0.276911231, 0.283844561}, // 10735K {0.276906588, 0.283838958}, // 10736K {0.276901946, 0.283833356}, // 10737K {0.276897305, 0.283827755}, // 10738K {0.276892665, 0.283822155}, // 10739K {0.276888026, 0.283816556}, // 10740K {0.276883388, 0.283810959}, // 10741K {0.276878751, 0.283805362}, // 10742K {0.276874116, 0.283799767}, // 10743K {0.276869481, 0.283794173}, // 10744K {0.276864848, 0.28378858}, // 10745K {0.276860215, 0.283782988}, // 10746K {0.276855584, 0.283777397}, // 10747K {0.276850953, 0.283771808}, // 10748K {0.276846324, 0.283766219}, // 10749K {0.276841696, 0.283760632}, // 10750K {0.276837069, 0.283755046}, // 10751K {0.276832442, 0.28374946}, // 10752K {0.276827817, 0.283743876}, // 10753K {0.276823193, 0.283738294}, // 10754K {0.27681857, 0.283732712}, // 10755K {0.276813949, 0.283727131}, // 10756K {0.276809328, 0.283721552}, // 10757K {0.276804708, 0.283715973}, // 10758K {0.276800089, 0.283710396}, // 10759K {0.276795471, 0.28370482}, // 10760K {0.276790855, 0.283699245}, // 10761K {0.276786239, 0.283693671}, // 10762K {0.276781625, 0.283688098}, // 10763K {0.276777011, 0.283682527}, // 10764K {0.276772399, 0.283676956}, // 10765K {0.276767788, 0.283671387}, // 10766K {0.276763177, 0.283665819}, // 10767K {0.276758568, 0.283660251}, // 10768K {0.27675396, 0.283654685}, // 10769K {0.276749353, 0.28364912}, // 10770K {0.276744747, 0.283643557}, // 10771K {0.276740141, 0.283637994}, // 10772K {0.276735537, 0.283632432}, // 10773K {0.276730935, 0.283626872}, // 10774K {0.276726333, 0.283621313}, // 10775K {0.276721732, 0.283615755}, // 10776K {0.276717132, 0.283610198}, // 10777K {0.276712533, 0.283604642}, // 10778K {0.276707936, 0.283599087}, // 10779K {0.276703339, 0.283593533}, // 10780K {0.276698743, 0.28358798}, // 10781K {0.276694149, 0.283582429}, // 10782K {0.276689555, 0.283576879}, // 10783K {0.276684963, 0.283571329}, // 10784K {0.276680371, 0.283565781}, // 10785K {0.276675781, 0.283560234}, // 10786K {0.276671192, 0.283554688}, // 10787K {0.276666603, 0.283549144}, // 10788K {0.276662016, 0.2835436}, // 10789K {0.27665743, 0.283538057}, // 10790K {0.276652845, 0.283532516}, // 10791K {0.276648261, 0.283526976}, // 10792K {0.276643678, 0.283521436}, // 10793K {0.276639096, 0.283515898}, // 10794K {0.276634515, 0.283510361}, // 10795K {0.276629935, 0.283504825}, // 10796K {0.276625356, 0.283499291}, // 10797K {0.276620778, 0.283493757}, // 10798K {0.276616201, 0.283488225}, // 10799K {0.276611626, 0.283482693}, // 10800K {0.276607051, 0.283477163}, // 10801K {0.276602477, 0.283471634}, // 10802K {0.276597905, 0.283466105}, // 10803K {0.276593333, 0.283460579}, // 10804K {0.276588762, 0.283455053}, // 10805K {0.276584193, 0.283449528}, // 10806K {0.276579624, 0.283444004}, // 10807K {0.276575057, 0.283438482}, // 10808K {0.276570491, 0.28343296}, // 10809K {0.276565925, 0.28342744}, // 10810K {0.276561361, 0.283421921}, // 10811K {0.276556798, 0.283416403}, // 10812K {0.276552235, 0.283410886}, // 10813K {0.276547674, 0.28340537}, // 10814K {0.276543114, 0.283399855}, // 10815K {0.276538555, 0.283394341}, // 10816K {0.276533997, 0.283388829}, // 10817K {0.27652944, 0.283383317}, // 10818K {0.276524884, 0.283377807}, // 10819K {0.276520329, 0.283372298}, // 10820K {0.276515775, 0.28336679}, // 10821K {0.276511222, 0.283361282}, // 10822K {0.27650667, 0.283355777}, // 10823K {0.276502119, 0.283350272}, // 10824K {0.276497569, 0.283344768}, // 10825K {0.27649302, 0.283339265}, // 10826K {0.276488473, 0.283333764}, // 10827K {0.276483926, 0.283328263}, // 10828K {0.27647938, 0.283322764}, // 10829K {0.276474836, 0.283317266}, // 10830K {0.276470292, 0.283311769}, // 10831K {0.276465749, 0.283306273}, // 10832K {0.276461208, 0.283300778}, // 10833K {0.276456667, 0.283295284}, // 10834K {0.276452128, 0.283289791}, // 10835K {0.276447589, 0.2832843}, // 10836K {0.276443052, 0.283278809}, // 10837K {0.276438516, 0.28327332}, // 10838K {0.27643398, 0.283267832}, // 10839K {0.276429446, 0.283262344}, // 10840K {0.276424912, 0.283256858}, // 10841K {0.27642038, 0.283251373}, // 10842K {0.276415849, 0.283245889}, // 10843K {0.276411319, 0.283240407}, // 10844K {0.276406789, 0.283234925}, // 10845K {0.276402261, 0.283229444}, // 10846K {0.276397734, 0.283223965}, // 10847K {0.276393208, 0.283218486}, // 10848K {0.276388683, 0.283213009}, // 10849K {0.276384159, 0.283207533}, // 10850K {0.276379636, 0.283202058}, // 10851K {0.276375114, 0.283196584}, // 10852K {0.276370593, 0.283191111}, // 10853K {0.276366073, 0.283185639}, // 10854K {0.276361554, 0.283180168}, // 10855K {0.276357036, 0.283174698}, // 10856K {0.276352519, 0.28316923}, // 10857K {0.276348003, 0.283163762}, // 10858K {0.276343488, 0.283158296}, // 10859K {0.276338974, 0.283152831}, // 10860K {0.276334461, 0.283147367}, // 10861K {0.276329949, 0.283141903}, // 10862K {0.276325439, 0.283136441}, // 10863K {0.276320929, 0.283130981}, // 10864K {0.27631642, 0.283125521}, // 10865K {0.276311912, 0.283120062}, // 10866K {0.276307406, 0.283114604}, // 10867K {0.2763029, 0.283109148}, // 10868K {0.276298395, 0.283103692}, // 10869K {0.276293892, 0.283098238}, // 10870K {0.276289389, 0.283092785}, // 10871K {0.276284887, 0.283087333}, // 10872K {0.276280387, 0.283081881}, // 10873K {0.276275887, 0.283076431}, // 10874K {0.276271389, 0.283070983}, // 10875K {0.276266891, 0.283065535}, // 10876K {0.276262395, 0.283060088}, // 10877K {0.276257899, 0.283054642}, // 10878K {0.276253404, 0.283049198}, // 10879K {0.276248911, 0.283043754}, // 10880K {0.276244419, 0.283038312}, // 10881K {0.276239927, 0.283032871}, // 10882K {0.276235437, 0.28302743}, // 10883K {0.276230947, 0.283021991}, // 10884K {0.276226459, 0.283016553}, // 10885K {0.276221971, 0.283011116}, // 10886K {0.276217485, 0.28300568}, // 10887K {0.276213, 0.283000246}, // 10888K {0.276208515, 0.282994812}, // 10889K {0.276204032, 0.282989379}, // 10890K {0.27619955, 0.282983948}, // 10891K {0.276195068, 0.282978517}, // 10892K {0.276190588, 0.282973088}, // 10893K {0.276186109, 0.28296766}, // 10894K {0.27618163, 0.282962233}, // 10895K {0.276177153, 0.282956806}, // 10896K {0.276172677, 0.282951381}, // 10897K {0.276168201, 0.282945957}, // 10898K {0.276163727, 0.282940535}, // 10899K {0.276159254, 0.282935113}, // 10900K {0.276154782, 0.282929692}, // 10901K {0.276150311, 0.282924272}, // 10902K {0.27614584, 0.282918854}, // 10903K {0.276141371, 0.282913436}, // 10904K {0.276136903, 0.28290802}, // 10905K {0.276132436, 0.282902605}, // 10906K {0.276127969, 0.282897191}, // 10907K {0.276123504, 0.282891777}, // 10908K {0.27611904, 0.282886365}, // 10909K {0.276114577, 0.282880954}, // 10910K {0.276110115, 0.282875544}, // 10911K {0.276105654, 0.282870136}, // 10912K {0.276101193, 0.282864728}, // 10913K {0.276096734, 0.282859321}, // 10914K {0.276092276, 0.282853916}, // 10915K {0.276087819, 0.282848511}, // 10916K {0.276083363, 0.282843108}, // 10917K {0.276078908, 0.282837705}, // 10918K {0.276074454, 0.282832304}, // 10919K {0.27607, 0.282826904}, // 10920K {0.276065548, 0.282821505}, // 10921K {0.276061097, 0.282816107}, // 10922K {0.276056647, 0.28281071}, // 10923K {0.276052198, 0.282805314}, // 10924K {0.27604775, 0.282799919}, // 10925K {0.276043303, 0.282794525}, // 10926K {0.276038857, 0.282789132}, // 10927K {0.276034411, 0.282783741}, // 10928K {0.276029967, 0.28277835}, // 10929K {0.276025524, 0.282772961}, // 10930K {0.276021082, 0.282767572}, // 10931K {0.276016641, 0.282762185}, // 10932K {0.276012201, 0.282756799}, // 10933K {0.276007762, 0.282751414}, // 10934K {0.276003324, 0.282746029}, // 10935K {0.275998886, 0.282740646}, // 10936K {0.27599445, 0.282735264}, // 10937K {0.275990015, 0.282729884}, // 10938K {0.275985581, 0.282724504}, // 10939K {0.275981148, 0.282719125}, // 10940K {0.275976716, 0.282713747}, // 10941K {0.275972285, 0.282708371}, // 10942K {0.275967854, 0.282702995}, // 10943K {0.275963425, 0.282697621}, // 10944K {0.275958997, 0.282692247}, // 10945K {0.27595457, 0.282686875}, // 10946K {0.275950144, 0.282681504}, // 10947K {0.275945719, 0.282676133}, // 10948K {0.275941294, 0.282670764}, // 10949K {0.275936871, 0.282665396}, // 10950K {0.275932449, 0.282660029}, // 10951K {0.275928028, 0.282654663}, // 10952K {0.275923608, 0.282649298}, // 10953K {0.275919188, 0.282643934}, // 10954K {0.27591477, 0.282638572}, // 10955K {0.275910353, 0.28263321}, // 10956K {0.275905937, 0.282627849}, // 10957K {0.275901521, 0.28262249}, // 10958K {0.275897107, 0.282617131}, // 10959K {0.275892694, 0.282611774}, // 10960K {0.275888281, 0.282606418}, // 10961K {0.27588387, 0.282601062}, // 10962K {0.27587946, 0.282595708}, // 10963K {0.27587505, 0.282590355}, // 10964K {0.275870642, 0.282585003}, // 10965K {0.275866235, 0.282579652}, // 10966K {0.275861828, 0.282574302}, // 10967K {0.275857423, 0.282568953}, // 10968K {0.275853019, 0.282563605}, // 10969K {0.275848615, 0.282558258}, // 10970K {0.275844213, 0.282552912}, // 10971K {0.275839811, 0.282547568}, // 10972K {0.275835411, 0.282542224}, // 10973K {0.275831011, 0.282536881}, // 10974K {0.275826613, 0.28253154}, // 10975K {0.275822216, 0.2825262}, // 10976K {0.275817819, 0.28252086}, // 10977K {0.275813424, 0.282515522}, // 10978K {0.275809029, 0.282510185}, // 10979K {0.275804635, 0.282504848}, // 10980K {0.275800243, 0.282499513}, // 10981K {0.275795851, 0.282494179}, // 10982K {0.275791461, 0.282488846}, // 10983K {0.275787071, 0.282483514}, // 10984K {0.275782682, 0.282478183}, // 10985K {0.275778295, 0.282472853}, // 10986K {0.275773908, 0.282467524}, // 10987K {0.275769522, 0.282462197}, // 10988K {0.275765138, 0.28245687}, // 10989K {0.275760754, 0.282451544}, // 10990K {0.275756371, 0.28244622}, // 10991K {0.275751989, 0.282440896}, // 10992K {0.275747609, 0.282435574}, // 10993K {0.275743229, 0.282430252}, // 10994K {0.27573885, 0.282424932}, // 10995K {0.275734472, 0.282419613}, // 10996K {0.275730095, 0.282414294}, // 10997K {0.275725719, 0.282408977}, // 10998K {0.275721345, 0.282403661}, // 10999K {0.275716971, 0.282398346}, // 11000K {0.275712598, 0.282393032}, // 11001K {0.275708226, 0.282387719}, // 11002K {0.275703855, 0.282382407}, // 11003K {0.275699485, 0.282377096}, // 11004K {0.275695116, 0.282371786}, // 11005K {0.275690747, 0.282366477}, // 11006K {0.27568638, 0.28236117}, // 11007K {0.275682014, 0.282355863}, // 11008K {0.275677649, 0.282350557}, // 11009K {0.275673285, 0.282345253}, // 11010K {0.275668922, 0.282339949}, // 11011K {0.27566456, 0.282334647}, // 11012K {0.275660198, 0.282329345}, // 11013K {0.275655838, 0.282324045}, // 11014K {0.275651479, 0.282318745}, // 11015K {0.27564712, 0.282313447}, // 11016K {0.275642763, 0.28230815}, // 11017K {0.275638407, 0.282302854}, // 11018K {0.275634051, 0.282297559}, // 11019K {0.275629697, 0.282292264}, // 11020K {0.275625343, 0.282286971}, // 11021K {0.275620991, 0.282281679}, // 11022K {0.275616639, 0.282276388}, // 11023K {0.275612289, 0.282271098}, // 11024K {0.275607939, 0.28226581}, // 11025K {0.27560359, 0.282260522}, // 11026K {0.275599243, 0.282255235}, // 11027K {0.275594896, 0.282249949}, // 11028K {0.27559055, 0.282244664}, // 11029K {0.275586206, 0.282239381}, // 11030K {0.275581862, 0.282234098}, // 11031K {0.275577519, 0.282228817}, // 11032K {0.275573177, 0.282223536}, // 11033K {0.275568836, 0.282218257}, // 11034K {0.275564496, 0.282212978}, // 11035K {0.275560157, 0.282207701}, // 11036K {0.275555819, 0.282202424}, // 11037K {0.275551482, 0.282197149}, // 11038K {0.275547146, 0.282191875}, // 11039K {0.275542811, 0.282186602}, // 11040K {0.275538477, 0.282181329}, // 11041K {0.275534144, 0.282176058}, // 11042K {0.275529812, 0.282170788}, // 11043K {0.275525481, 0.282165519}, // 11044K {0.27552115, 0.282160251}, // 11045K {0.275516821, 0.282154984}, // 11046K {0.275512493, 0.282149718}, // 11047K {0.275508165, 0.282144453}, // 11048K {0.275503839, 0.282139189}, // 11049K {0.275499514, 0.282133926}, // 11050K {0.275495189, 0.282128665}, // 11051K {0.275490866, 0.282123404}, // 11052K {0.275486543, 0.282118144}, // 11053K {0.275482221, 0.282112885}, // 11054K {0.275477901, 0.282107628}, // 11055K {0.275473581, 0.282102371}, // 11056K {0.275469262, 0.282097116}, // 11057K {0.275464945, 0.282091861}, // 11058K {0.275460628, 0.282086607}, // 11059K {0.275456312, 0.282081355}, // 11060K {0.275451997, 0.282076104}, // 11061K {0.275447683, 0.282070853}, // 11062K {0.27544337, 0.282065604}, // 11063K {0.275439058, 0.282060355}, // 11064K {0.275434747, 0.282055108}, // 11065K {0.275430437, 0.282049862}, // 11066K {0.275426128, 0.282044617}, // 11067K {0.27542182, 0.282039372}, // 11068K {0.275417513, 0.282034129}, // 11069K {0.275413206, 0.282028887}, // 11070K {0.275408901, 0.282023646}, // 11071K {0.275404597, 0.282018406}, // 11072K {0.275400293, 0.282013167}, // 11073K {0.275395991, 0.282007929}, // 11074K {0.275391689, 0.282002692}, // 11075K {0.275387389, 0.281997456}, // 11076K {0.275383089, 0.281992221}, // 11077K {0.275378791, 0.281986987}, // 11078K {0.275374493, 0.281981754}, // 11079K {0.275370196, 0.281976523}, // 11080K {0.275365901, 0.281971292}, // 11081K {0.275361606, 0.281966062}, // 11082K {0.275357312, 0.281960833}, // 11083K {0.275353019, 0.281955606}, // 11084K {0.275348727, 0.281950379}, // 11085K {0.275344436, 0.281945153}, // 11086K {0.275340146, 0.281939929}, // 11087K {0.275335857, 0.281934705}, // 11088K {0.275331569, 0.281929482}, // 11089K {0.275327282, 0.281924261}, // 11090K {0.275322995, 0.28191904}, // 11091K {0.27531871, 0.281913821}, // 11092K {0.275314426, 0.281908602}, // 11093K {0.275310142, 0.281903385}, // 11094K {0.27530586, 0.281898169}, // 11095K {0.275301579, 0.281892953}, // 11096K {0.275297298, 0.281887739}, // 11097K {0.275293018, 0.281882526}, // 11098K {0.27528874, 0.281877313}, // 11099K {0.275284462, 0.281872102}, // 11100K {0.275280185, 0.281866892}, // 11101K {0.27527591, 0.281861682}, // 11102K {0.275271635, 0.281856474}, // 11103K {0.275267361, 0.281851267}, // 11104K {0.275263088, 0.281846061}, // 11105K {0.275258816, 0.281840856}, // 11106K {0.275254545, 0.281835652}, // 11107K {0.275250275, 0.281830449}, // 11108K {0.275246005, 0.281825246}, // 11109K {0.275241737, 0.281820045}, // 11110K {0.27523747, 0.281814845}, // 11111K {0.275233203, 0.281809646}, // 11112K {0.275228938, 0.281804448}, // 11113K {0.275224674, 0.281799251}, // 11114K {0.27522041, 0.281794055}, // 11115K {0.275216148, 0.281788861}, // 11116K {0.275211886, 0.281783667}, // 11117K {0.275207625, 0.281778474}, // 11118K {0.275203365, 0.281773282}, // 11119K {0.275199107, 0.281768091}, // 11120K {0.275194849, 0.281762901}, // 11121K {0.275190592, 0.281757712}, // 11122K {0.275186336, 0.281752525}, // 11123K {0.275182081, 0.281747338}, // 11124K {0.275177827, 0.281742152}, // 11125K {0.275173574, 0.281736967}, // 11126K {0.275169321, 0.281731784}, // 11127K {0.27516507, 0.281726601}, // 11128K {0.27516082, 0.281721419}, // 11129K {0.27515657, 0.281716238}, // 11130K {0.275152322, 0.281711059}, // 11131K {0.275148074, 0.28170588}, // 11132K {0.275143828, 0.281700702}, // 11133K {0.275139582, 0.281695526}, // 11134K {0.275135337, 0.28169035}, // 11135K {0.275131094, 0.281685176}, // 11136K {0.275126851, 0.281680002}, // 11137K {0.275122609, 0.28167483}, // 11138K {0.275118368, 0.281669658}, // 11139K {0.275114128, 0.281664487}, // 11140K {0.275109889, 0.281659318}, // 11141K {0.27510565, 0.281654149}, // 11142K {0.275101413, 0.281648982}, // 11143K {0.275097177, 0.281643815}, // 11144K {0.275092942, 0.28163865}, // 11145K {0.275088707, 0.281633486}, // 11146K {0.275084474, 0.281628322}, // 11147K {0.275080241, 0.28162316}, // 11148K {0.27507601, 0.281617998}, // 11149K {0.275071779, 0.281612838}, // 11150K {0.275067549, 0.281607678}, // 11151K {0.27506332, 0.28160252}, // 11152K {0.275059092, 0.281597363}, // 11153K {0.275054865, 0.281592206}, // 11154K {0.275050639, 0.281587051}, // 11155K {0.275046414, 0.281581897}, // 11156K {0.27504219, 0.281576743}, // 11157K {0.275037967, 0.281571591}, // 11158K {0.275033745, 0.281566439}, // 11159K {0.275029523, 0.281561289}, // 11160K {0.275025303, 0.28155614}, // 11161K {0.275021083, 0.281550992}, // 11162K {0.275016865, 0.281545844}, // 11163K {0.275012647, 0.281540698}, // 11164K {0.27500843, 0.281535553}, // 11165K {0.275004214, 0.281530408}, // 11166K {0.274999999, 0.281525265}, // 11167K {0.274995786, 0.281520123}, // 11168K {0.274991573, 0.281514982}, // 11169K {0.27498736, 0.281509841}, // 11170K {0.274983149, 0.281504702}, // 11171K {0.274978939, 0.281499564}, // 11172K {0.27497473, 0.281494427}, // 11173K {0.274970521, 0.28148929}, // 11174K {0.274966314, 0.281484155}, // 11175K {0.274962107, 0.281479021}, // 11176K {0.274957902, 0.281473888}, // 11177K {0.274953697, 0.281468755}, // 11178K {0.274949493, 0.281463624}, // 11179K {0.27494529, 0.281458494}, // 11180K {0.274941088, 0.281453365}, // 11181K {0.274936887, 0.281448237}, // 11182K {0.274932687, 0.281443109}, // 11183K {0.274928488, 0.281437983}, // 11184K {0.27492429, 0.281432858}, // 11185K {0.274920093, 0.281427734}, // 11186K {0.274915896, 0.28142261}, // 11187K {0.274911701, 0.281417488}, // 11188K {0.274907506, 0.281412367}, // 11189K {0.274903313, 0.281407247}, // 11190K {0.27489912, 0.281402128}, // 11191K {0.274894928, 0.281397009}, // 11192K {0.274890737, 0.281391892}, // 11193K {0.274886548, 0.281386776}, // 11194K {0.274882359, 0.281381661}, // 11195K {0.27487817, 0.281376547}, // 11196K {0.274873983, 0.281371433}, // 11197K {0.274869797, 0.281366321}, // 11198K {0.274865612, 0.28136121}, // 11199K {0.274861427, 0.2813561}, // 11200K {0.274857244, 0.28135099}, // 11201K {0.274853061, 0.281345882}, // 11202K {0.27484888, 0.281340775}, // 11203K {0.274844699, 0.281335669}, // 11204K {0.274840519, 0.281330563}, // 11205K {0.27483634, 0.281325459}, // 11206K {0.274832162, 0.281320356}, // 11207K {0.274827985, 0.281315254}, // 11208K {0.274823809, 0.281310152}, // 11209K {0.274819634, 0.281305052}, // 11210K {0.274815459, 0.281299953}, // 11211K {0.274811286, 0.281294855}, // 11212K {0.274807113, 0.281289757}, // 11213K {0.274802942, 0.281284661}, // 11214K {0.274798771, 0.281279566}, // 11215K {0.274794601, 0.281274471}, // 11216K {0.274790433, 0.281269378}, // 11217K {0.274786265, 0.281264286}, // 11218K {0.274782098, 0.281259194}, // 11219K {0.274777932, 0.281254104}, // 11220K {0.274773766, 0.281249015}, // 11221K {0.274769602, 0.281243926}, // 11222K {0.274765439, 0.281238839}, // 11223K {0.274761276, 0.281233753}, // 11224K {0.274757115, 0.281228667}, // 11225K {0.274752954, 0.281223583}, // 11226K {0.274748794, 0.281218499}, // 11227K {0.274744636, 0.281213417}, // 11228K {0.274740478, 0.281208336}, // 11229K {0.274736321, 0.281203255}, // 11230K {0.274732165, 0.281198176}, // 11231K {0.274728009, 0.281193097}, // 11232K {0.274723855, 0.28118802}, // 11233K {0.274719702, 0.281182943}, // 11234K {0.274715549, 0.281177868}, // 11235K {0.274711398, 0.281172793}, // 11236K {0.274707247, 0.28116772}, // 11237K {0.274703098, 0.281162647}, // 11238K {0.274698949, 0.281157576}, // 11239K {0.274694801, 0.281152505}, // 11240K {0.274690654, 0.281147436}, // 11241K {0.274686508, 0.281142367}, // 11242K {0.274682363, 0.281137299}, // 11243K {0.274678218, 0.281132233}, // 11244K {0.274674075, 0.281127167}, // 11245K {0.274669932, 0.281122103}, // 11246K {0.274665791, 0.281117039}, // 11247K {0.27466165, 0.281111976}, // 11248K {0.274657511, 0.281106914}, // 11249K {0.274653372, 0.281101854}, // 11250K {0.274649234, 0.281096794}, // 11251K {0.274645097, 0.281091735}, // 11252K {0.274640961, 0.281086678}, // 11253K {0.274636825, 0.281081621}, // 11254K {0.274632691, 0.281076565}, // 11255K {0.274628558, 0.28107151}, // 11256K {0.274624425, 0.281066456}, // 11257K {0.274620293, 0.281061403}, // 11258K {0.274616163, 0.281056352}, // 11259K {0.274612033, 0.281051301}, // 11260K {0.274607904, 0.281046251}, // 11261K {0.274603776, 0.281041202}, // 11262K {0.274599649, 0.281036154}, // 11263K {0.274595523, 0.281031107}, // 11264K {0.274591397, 0.281026061}, // 11265K {0.274587273, 0.281021016}, // 11266K {0.27458315, 0.281015972}, // 11267K {0.274579027, 0.281010929}, // 11268K {0.274574905, 0.281005887}, // 11269K {0.274570784, 0.281000846}, // 11270K {0.274566664, 0.280995806}, // 11271K {0.274562545, 0.280990767}, // 11272K {0.274558427, 0.280985728}, // 11273K {0.27455431, 0.280980691}, // 11274K {0.274550194, 0.280975655}, // 11275K {0.274546078, 0.28097062}, // 11276K {0.274541964, 0.280965586}, // 11277K {0.27453785, 0.280960552}, // 11278K {0.274533738, 0.28095552}, // 11279K {0.274529626, 0.280950489}, // 11280K {0.274525515, 0.280945458}, // 11281K {0.274521405, 0.280940429}, // 11282K {0.274517296, 0.280935401}, // 11283K {0.274513187, 0.280930373}, // 11284K {0.27450908, 0.280925347}, // 11285K {0.274504974, 0.280920321}, // 11286K {0.274500868, 0.280915297}, // 11287K {0.274496763, 0.280910273}, // 11288K {0.274492659, 0.280905251}, // 11289K {0.274488557, 0.280900229}, // 11290K {0.274484455, 0.280895209}, // 11291K {0.274480354, 0.280890189}, // 11292K {0.274476253, 0.28088517}, // 11293K {0.274472154, 0.280880153}, // 11294K {0.274468056, 0.280875136}, // 11295K {0.274463958, 0.28087012}, // 11296K {0.274459861, 0.280865105}, // 11297K {0.274455766, 0.280860092}, // 11298K {0.274451671, 0.280855079}, // 11299K {0.274447577, 0.280850067}, // 11300K {0.274443484, 0.280845056}, // 11301K {0.274439392, 0.280840046}, // 11302K {0.2744353, 0.280835037}, // 11303K {0.27443121, 0.280830029}, // 11304K {0.27442712, 0.280825022}, // 11305K {0.274423032, 0.280820016}, // 11306K {0.274418944, 0.280815011}, // 11307K {0.274414857, 0.280810007}, // 11308K {0.274410771, 0.280805004}, // 11309K {0.274406686, 0.280800002}, // 11310K {0.274402602, 0.280795001}, // 11311K {0.274398519, 0.28079}, // 11312K {0.274394436, 0.280785001}, // 11313K {0.274390355, 0.280780003}, // 11314K {0.274386274, 0.280775006}, // 11315K {0.274382194, 0.280770009}, // 11316K {0.274378115, 0.280765014}, // 11317K {0.274374037, 0.280760019}, // 11318K {0.27436996, 0.280755026}, // 11319K {0.274365884, 0.280750034}, // 11320K {0.274361809, 0.280745042}, // 11321K {0.274357734, 0.280740051}, // 11322K {0.274353661, 0.280735062}, // 11323K {0.274349588, 0.280730073}, // 11324K {0.274345516, 0.280725086}, // 11325K {0.274341446, 0.280720099}, // 11326K {0.274337376, 0.280715113}, // 11327K {0.274333306, 0.280710128}, // 11328K {0.274329238, 0.280705145}, // 11329K {0.274325171, 0.280700162}, // 11330K {0.274321104, 0.28069518}, // 11331K {0.274317039, 0.280690199}, // 11332K {0.274312974, 0.280685219}, // 11333K {0.27430891, 0.28068024}, // 11334K {0.274304847, 0.280675262}, // 11335K {0.274300785, 0.280670285}, // 11336K {0.274296724, 0.280665309}, // 11337K {0.274292664, 0.280660334}, // 11338K {0.274288604, 0.280655359}, // 11339K {0.274284546, 0.280650386}, // 11340K {0.274280488, 0.280645414}, // 11341K {0.274276431, 0.280640443}, // 11342K {0.274272375, 0.280635472}, // 11343K {0.27426832, 0.280630503}, // 11344K {0.274264266, 0.280625534}, // 11345K {0.274260213, 0.280620567}, // 11346K {0.27425616, 0.2806156}, // 11347K {0.274252109, 0.280610635}, // 11348K {0.274248058, 0.28060567}, // 11349K {0.274244008, 0.280600707}, // 11350K {0.274239959, 0.280595744}, // 11351K {0.274235911, 0.280590782}, // 11352K {0.274231864, 0.280585822}, // 11353K {0.274227818, 0.280580862}, // 11354K {0.274223773, 0.280575903}, // 11355K {0.274219728, 0.280570945}, // 11356K {0.274215684, 0.280565988}, // 11357K {0.274211642, 0.280561032}, // 11358K {0.2742076, 0.280556077}, // 11359K {0.274203559, 0.280551123}, // 11360K {0.274199519, 0.28054617}, // 11361K {0.274195479, 0.280541218}, // 11362K {0.274191441, 0.280536267}, // 11363K {0.274187403, 0.280531316}, // 11364K {0.274183367, 0.280526367}, // 11365K {0.274179331, 0.280521419}, // 11366K {0.274175296, 0.280516471}, // 11367K {0.274171262, 0.280511525}, // 11368K {0.274167229, 0.280506579}, // 11369K {0.274163197, 0.280501635}, // 11370K {0.274159165, 0.280496691}, // 11371K {0.274155135, 0.280491749}, // 11372K {0.274151105, 0.280486807}, // 11373K {0.274147076, 0.280481866}, // 11374K {0.274143048, 0.280476926}, // 11375K {0.274139021, 0.280471988}, // 11376K {0.274134995, 0.28046705}, // 11377K {0.27413097, 0.280462113}, // 11378K {0.274126945, 0.280457177}, // 11379K {0.274122922, 0.280452242}, // 11380K {0.274118899, 0.280447308}, // 11381K {0.274114877, 0.280442375}, // 11382K {0.274110856, 0.280437443}, // 11383K {0.274106836, 0.280432511}, // 11384K {0.274102817, 0.280427581}, // 11385K {0.274098799, 0.280422652}, // 11386K {0.274094781, 0.280417723}, // 11387K {0.274090764, 0.280412796}, // 11388K {0.274086749, 0.280407869}, // 11389K {0.274082734, 0.280402944}, // 11390K {0.27407872, 0.280398019}, // 11391K {0.274074707, 0.280393096}, // 11392K {0.274070694, 0.280388173}, // 11393K {0.274066683, 0.280383251}, // 11394K {0.274062672, 0.280378331}, // 11395K {0.274058663, 0.280373411}, // 11396K {0.274054654, 0.280368492}, // 11397K {0.274050646, 0.280363574}, // 11398K {0.274046639, 0.280358657}, // 11399K {0.274042632, 0.280353741}, // 11400K {0.274038627, 0.280348826}, // 11401K {0.274034622, 0.280343912}, // 11402K {0.274030619, 0.280338998}, // 11403K {0.274026616, 0.280334086}, // 11404K {0.274022614, 0.280329175}, // 11405K {0.274018613, 0.280324264}, // 11406K {0.274014613, 0.280319355}, // 11407K {0.274010613, 0.280314446}, // 11408K {0.274006615, 0.280309539}, // 11409K {0.274002617, 0.280304632}, // 11410K {0.273998621, 0.280299726}, // 11411K {0.273994625, 0.280294822}, // 11412K {0.27399063, 0.280289918}, // 11413K {0.273986635, 0.280285015}, // 11414K {0.273982642, 0.280280113}, // 11415K {0.27397865, 0.280275212}, // 11416K {0.273974658, 0.280270312}, // 11417K {0.273970667, 0.280265413}, // 11418K {0.273966677, 0.280260515}, // 11419K {0.273962688, 0.280255618}, // 11420K {0.2739587, 0.280250721}, // 11421K {0.273954713, 0.280245826}, // 11422K {0.273950727, 0.280240932}, // 11423K {0.273946741, 0.280236038}, // 11424K {0.273942756, 0.280231146}, // 11425K {0.273938772, 0.280226254}, // 11426K {0.273934789, 0.280221364}, // 11427K {0.273930807, 0.280216474}, // 11428K {0.273926826, 0.280211585}, // 11429K {0.273922845, 0.280206697}, // 11430K {0.273918866, 0.280201811}, // 11431K {0.273914887, 0.280196925}, // 11432K {0.273910909, 0.28019204}, // 11433K {0.273906932, 0.280187155}, // 11434K {0.273902956, 0.280182272}, // 11435K {0.273898981, 0.28017739}, // 11436K {0.273895006, 0.280172509}, // 11437K {0.273891033, 0.280167629}, // 11438K {0.27388706, 0.280162749}, // 11439K {0.273883088, 0.280157871}, // 11440K {0.273879117, 0.280152993}, // 11441K {0.273875147, 0.280148117}, // 11442K {0.273871177, 0.280143241}, // 11443K {0.273867209, 0.280138366}, // 11444K {0.273863241, 0.280133493}, // 11445K {0.273859274, 0.28012862}, // 11446K {0.273855309, 0.280123748}, // 11447K {0.273851343, 0.280118877}, // 11448K {0.273847379, 0.280114007}, // 11449K {0.273843416, 0.280109138}, // 11450K {0.273839453, 0.280104269}, // 11451K {0.273835492, 0.280099402}, // 11452K {0.273831531, 0.280094536}, // 11453K {0.273827571, 0.280089671}, // 11454K {0.273823612, 0.280084806}, // 11455K {0.273819653, 0.280079943}, // 11456K {0.273815696, 0.28007508}, // 11457K {0.273811739, 0.280070218}, // 11458K {0.273807784, 0.280065358}, // 11459K {0.273803829, 0.280060498}, // 11460K {0.273799875, 0.280055639}, // 11461K {0.273795922, 0.280050781}, // 11462K {0.273791969, 0.280045924}, // 11463K {0.273788018, 0.280041068}, // 11464K {0.273784067, 0.280036213}, // 11465K {0.273780117, 0.280031359}, // 11466K {0.273776168, 0.280026505}, // 11467K {0.27377222, 0.280021653}, // 11468K {0.273768273, 0.280016802}, // 11469K {0.273764327, 0.280011951}, // 11470K {0.273760381, 0.280007101}, // 11471K {0.273756436, 0.280002253}, // 11472K {0.273752492, 0.279997405}, // 11473K {0.273748549, 0.279992558}, // 11474K {0.273744607, 0.279987712}, // 11475K {0.273740666, 0.279982867}, // 11476K {0.273736725, 0.279978023}, // 11477K {0.273732786, 0.27997318}, // 11478K {0.273728847, 0.279968338}, // 11479K {0.273724909, 0.279963497}, // 11480K {0.273720972, 0.279958657}, // 11481K {0.273717035, 0.279953817}, // 11482K {0.2737131, 0.279948979}, // 11483K {0.273709165, 0.279944141}, // 11484K {0.273705232, 0.279939305}, // 11485K {0.273701299, 0.279934469}, // 11486K {0.273697367, 0.279929634}, // 11487K {0.273693435, 0.2799248}, // 11488K {0.273689505, 0.279919967}, // 11489K {0.273685576, 0.279915135}, // 11490K {0.273681647, 0.279910304}, // 11491K {0.273677719, 0.279905474}, // 11492K {0.273673792, 0.279900645}, // 11493K {0.273669866, 0.279895817}, // 11494K {0.27366594, 0.279890989}, // 11495K {0.273662016, 0.279886163}, // 11496K {0.273658092, 0.279881337}, // 11497K {0.273654169, 0.279876513}, // 11498K {0.273650247, 0.279871689}, // 11499K {0.273646326, 0.279866866}, // 11500K {0.273642406, 0.279862044}, // 11501K {0.273638486, 0.279857223}, // 11502K {0.273634568, 0.279852403}, // 11503K {0.27363065, 0.279847584}, // 11504K {0.273626733, 0.279842766}, // 11505K {0.273622817, 0.279837949}, // 11506K {0.273618902, 0.279833133}, // 11507K {0.273614987, 0.279828317}, // 11508K {0.273611073, 0.279823503}, // 11509K {0.273607161, 0.279818689}, // 11510K {0.273603249, 0.279813876}, // 11511K {0.273599338, 0.279809065}, // 11512K {0.273595427, 0.279804254}, // 11513K {0.273591518, 0.279799444}, // 11514K {0.273587609, 0.279794635}, // 11515K {0.273583701, 0.279789827}, // 11516K {0.273579795, 0.27978502}, // 11517K {0.273575888, 0.279780213}, // 11518K {0.273571983, 0.279775408}, // 11519K {0.273568079, 0.279770604}, // 11520K {0.273564175, 0.2797658}, // 11521K {0.273560272, 0.279760998}, // 11522K {0.27355637, 0.279756196}, // 11523K {0.273552469, 0.279751395}, // 11524K {0.273548569, 0.279746595}, // 11525K {0.27354467, 0.279741796}, // 11526K {0.273540771, 0.279736998}, // 11527K {0.273536873, 0.279732201}, // 11528K {0.273532976, 0.279727405}, // 11529K {0.27352908, 0.27972261}, // 11530K {0.273525185, 0.279717815}, // 11531K {0.27352129, 0.279713022}, // 11532K {0.273517397, 0.27970823}, // 11533K {0.273513504, 0.279703438}, // 11534K {0.273509612, 0.279698647}, // 11535K {0.273505721, 0.279693857}, // 11536K {0.27350183, 0.279689069}, // 11537K {0.273497941, 0.279684281}, // 11538K {0.273494052, 0.279679494}, // 11539K {0.273490164, 0.279674707}, // 11540K {0.273486277, 0.279669922}, // 11541K {0.273482391, 0.279665138}, // 11542K {0.273478506, 0.279660354}, // 11543K {0.273474621, 0.279655572}, // 11544K {0.273470738, 0.27965079}, // 11545K {0.273466855, 0.27964601}, // 11546K {0.273462973, 0.27964123}, // 11547K {0.273459092, 0.279636451}, // 11548K {0.273455211, 0.279631673}, // 11549K {0.273451332, 0.279626896}, // 11550K {0.273447453, 0.27962212}, // 11551K {0.273443575, 0.279617345}, // 11552K {0.273439698, 0.27961257}, // 11553K {0.273435822, 0.279607797}, // 11554K {0.273431946, 0.279603024}, // 11555K {0.273428071, 0.279598253}, // 11556K {0.273424198, 0.279593482}, // 11557K {0.273420325, 0.279588712}, // 11558K {0.273416453, 0.279583943}, // 11559K {0.273412581, 0.279579175}, // 11560K {0.273408711, 0.279574408}, // 11561K {0.273404841, 0.279569642}, // 11562K {0.273400972, 0.279564877}, // 11563K {0.273397104, 0.279560113}, // 11564K {0.273393237, 0.279555349}, // 11565K {0.273389371, 0.279550587}, // 11566K {0.273385505, 0.279545825}, // 11567K {0.27338164, 0.279541064}, // 11568K {0.273377776, 0.279536304}, // 11569K {0.273373913, 0.279531545}, // 11570K {0.273370051, 0.279526787}, // 11571K {0.27336619, 0.27952203}, // 11572K {0.273362329, 0.279517274}, // 11573K {0.273358469, 0.279512519}, // 11574K {0.27335461, 0.279507764}, // 11575K {0.273350752, 0.279503011}, // 11576K {0.273346895, 0.279498258}, // 11577K {0.273343038, 0.279493506}, // 11578K {0.273339182, 0.279488756}, // 11579K {0.273335327, 0.279484006}, // 11580K {0.273331473, 0.279479257}, // 11581K {0.27332762, 0.279474509}, // 11582K {0.273323768, 0.279469761}, // 11583K {0.273319916, 0.279465015}, // 11584K {0.273316065, 0.27946027}, // 11585K {0.273312215, 0.279455525}, // 11586K {0.273308366, 0.279450782}, // 11587K {0.273304518, 0.279446039}, // 11588K {0.27330067, 0.279441297}, // 11589K {0.273296823, 0.279436556}, // 11590K {0.273292977, 0.279431816}, // 11591K {0.273289132, 0.279427077}, // 11592K {0.273285288, 0.279422339}, // 11593K {0.273281444, 0.279417602}, // 11594K {0.273277602, 0.279412865}, // 11595K {0.27327376, 0.27940813}, // 11596K {0.273269919, 0.279403395}, // 11597K {0.273266079, 0.279398661}, // 11598K {0.273262239, 0.279393929}, // 11599K {0.273258401, 0.279389197}, // 11600K {0.273254563, 0.279384466}, // 11601K {0.273250726, 0.279379736}, // 11602K {0.27324689, 0.279375006}, // 11603K {0.273243054, 0.279370278}, // 11604K {0.27323922, 0.279365551}, // 11605K {0.273235386, 0.279360824}, // 11606K {0.273231553, 0.279356098}, // 11607K {0.273227721, 0.279351374}, // 11608K {0.27322389, 0.27934665}, // 11609K {0.273220059, 0.279341927}, // 11610K {0.27321623, 0.279337205}, // 11611K {0.273212401, 0.279332484}, // 11612K {0.273208573, 0.279327763}, // 11613K {0.273204746, 0.279323044}, // 11614K {0.273200919, 0.279318325}, // 11615K {0.273197094, 0.279313608}, // 11616K {0.273193269, 0.279308891}, // 11617K {0.273189445, 0.279304175}, // 11618K {0.273185622, 0.27929946}, // 11619K {0.273181799, 0.279294746}, // 11620K {0.273177978, 0.279290033}, // 11621K {0.273174157, 0.279285321}, // 11622K {0.273170337, 0.27928061}, // 11623K {0.273166518, 0.279275899}, // 11624K {0.273162699, 0.279271189}, // 11625K {0.273158882, 0.279266481}, // 11626K {0.273155065, 0.279261773}, // 11627K {0.273151249, 0.279257066}, // 11628K {0.273147434, 0.27925236}, // 11629K {0.27314362, 0.279247655}, // 11630K {0.273139806, 0.279242951}, // 11631K {0.273135994, 0.279238247}, // 11632K {0.273132182, 0.279233545}, // 11633K {0.273128371, 0.279228843}, // 11634K {0.27312456, 0.279224143}, // 11635K {0.273120751, 0.279219443}, // 11636K {0.273116942, 0.279214744}, // 11637K {0.273113134, 0.279210046}, // 11638K {0.273109327, 0.279205349}, // 11639K {0.273105521, 0.279200653}, // 11640K {0.273101716, 0.279195957}, // 11641K {0.273097911, 0.279191263}, // 11642K {0.273094107, 0.279186569}, // 11643K {0.273090304, 0.279181876}, // 11644K {0.273086502, 0.279177185}, // 11645K {0.273082701, 0.279172494}, // 11646K {0.2730789, 0.279167804}, // 11647K {0.2730751, 0.279163115}, // 11648K {0.273071301, 0.279158426}, // 11649K {0.273067503, 0.279153739}, // 11650K {0.273063705, 0.279149052}, // 11651K {0.273059909, 0.279144367}, // 11652K {0.273056113, 0.279139682}, // 11653K {0.273052318, 0.279134998}, // 11654K {0.273048524, 0.279130315}, // 11655K {0.27304473, 0.279125633}, // 11656K {0.273040938, 0.279120952}, // 11657K {0.273037146, 0.279116272}, // 11658K {0.273033355, 0.279111592}, // 11659K {0.273029565, 0.279106914}, // 11660K {0.273025775, 0.279102236}, // 11661K {0.273021986, 0.279097559}, // 11662K {0.273018199, 0.279092883}, // 11663K {0.273014412, 0.279088208}, // 11664K {0.273010625, 0.279083534}, // 11665K {0.27300684, 0.279078861}, // 11666K {0.273003055, 0.279074189}, // 11667K {0.272999271, 0.279069517}, // 11668K {0.272995488, 0.279064847}, // 11669K {0.272991706, 0.279060177}, // 11670K {0.272987925, 0.279055508}, // 11671K {0.272984144, 0.27905084}, // 11672K {0.272980364, 0.279046173}, // 11673K {0.272976585, 0.279041507}, // 11674K {0.272972807, 0.279036841}, // 11675K {0.272969029, 0.279032177}, // 11676K {0.272965253, 0.279027513}, // 11677K {0.272961477, 0.279022851}, // 11678K {0.272957702, 0.279018189}, // 11679K {0.272953927, 0.279013528}, // 11680K {0.272950154, 0.279008868}, // 11681K {0.272946381, 0.279004209}, // 11682K {0.272942609, 0.27899955}, // 11683K {0.272938838, 0.278994893}, // 11684K {0.272935068, 0.278990237}, // 11685K {0.272931298, 0.278985581}, // 11686K {0.27292753, 0.278980926}, // 11687K {0.272923762, 0.278976272}, // 11688K {0.272919994, 0.278971619}, // 11689K {0.272916228, 0.278966967}, // 11690K {0.272912462, 0.278962316}, // 11691K {0.272908698, 0.278957665}, // 11692K {0.272904934, 0.278953016}, // 11693K {0.27290117, 0.278948367}, // 11694K {0.272897408, 0.278943719}, // 11695K {0.272893646, 0.278939072}, // 11696K {0.272889886, 0.278934426}, // 11697K {0.272886126, 0.278929781}, // 11698K {0.272882366, 0.278925137}, // 11699K {0.272878608, 0.278920493}, // 11700K {0.27287485, 0.278915851}, // 11701K {0.272871093, 0.278911209}, // 11702K {0.272867337, 0.278906568}, // 11703K {0.272863582, 0.278901929}, // 11704K {0.272859827, 0.278897289}, // 11705K {0.272856074, 0.278892651}, // 11706K {0.272852321, 0.278888014}, // 11707K {0.272848569, 0.278883378}, // 11708K {0.272844817, 0.278878742}, // 11709K {0.272841067, 0.278874107}, // 11710K {0.272837317, 0.278869474}, // 11711K {0.272833568, 0.278864841}, // 11712K {0.27282982, 0.278860208}, // 11713K {0.272826072, 0.278855577}, // 11714K {0.272822326, 0.278850947}, // 11715K {0.27281858, 0.278846317}, // 11716K {0.272814835, 0.278841689}, // 11717K {0.27281109, 0.278837061}, // 11718K {0.272807347, 0.278832434}, // 11719K {0.272803604, 0.278827808}, // 11720K {0.272799862, 0.278823183}, // 11721K {0.272796121, 0.278818559}, // 11722K {0.272792381, 0.278813936}, // 11723K {0.272788641, 0.278809313}, // 11724K {0.272784902, 0.278804691}, // 11725K {0.272781164, 0.278800071}, // 11726K {0.272777427, 0.278795451}, // 11727K {0.272773691, 0.278790832}, // 11728K {0.272769955, 0.278786213}, // 11729K {0.27276622, 0.278781596}, // 11730K {0.272762486, 0.27877698}, // 11731K {0.272758753, 0.278772364}, // 11732K {0.27275502, 0.278767749}, // 11733K {0.272751288, 0.278763136}, // 11734K {0.272747557, 0.278758523}, // 11735K {0.272743827, 0.278753911}, // 11736K {0.272740098, 0.278749299}, // 11737K {0.272736369, 0.278744689}, // 11738K {0.272732641, 0.278740079}, // 11739K {0.272728914, 0.278735471}, // 11740K {0.272725188, 0.278730863}, // 11741K {0.272721462, 0.278726256}, // 11742K {0.272717738, 0.27872165}, // 11743K {0.272714014, 0.278717045}, // 11744K {0.27271029, 0.27871244}, // 11745K {0.272706568, 0.278707837}, // 11746K {0.272702846, 0.278703234}, // 11747K {0.272699126, 0.278698633}, // 11748K {0.272695406, 0.278694032}, // 11749K {0.272691686, 0.278689432}, // 11750K {0.272687968, 0.278684833}, // 11751K {0.27268425, 0.278680234}, // 11752K {0.272680533, 0.278675637}, // 11753K {0.272676817, 0.27867104}, // 11754K {0.272673102, 0.278666445}, // 11755K {0.272669387, 0.27866185}, // 11756K {0.272665673, 0.278657256}, // 11757K {0.27266196, 0.278652663}, // 11758K {0.272658248, 0.27864807}, // 11759K {0.272654536, 0.278643479}, // 11760K {0.272650825, 0.278638888}, // 11761K {0.272647116, 0.278634299}, // 11762K {0.272643406, 0.27862971}, // 11763K {0.272639698, 0.278625122}, // 11764K {0.27263599, 0.278620535}, // 11765K {0.272632283, 0.278615948}, // 11766K {0.272628577, 0.278611363}, // 11767K {0.272624872, 0.278606779}, // 11768K {0.272621167, 0.278602195}, // 11769K {0.272617464, 0.278597612}, // 11770K {0.272613761, 0.27859303}, // 11771K {0.272610058, 0.278588449}, // 11772K {0.272606357, 0.278583869}, // 11773K {0.272602656, 0.278579289}, // 11774K {0.272598956, 0.278574711}, // 11775K {0.272595257, 0.278570133}, // 11776K {0.272591559, 0.278565556}, // 11777K {0.272587861, 0.27856098}, // 11778K {0.272584165, 0.278556405}, // 11779K {0.272580469, 0.278551831}, // 11780K {0.272576773, 0.278547258}, // 11781K {0.272573079, 0.278542685}, // 11782K {0.272569385, 0.278538113}, // 11783K {0.272565692, 0.278533543}, // 11784K {0.272562, 0.278528973}, // 11785K {0.272558308, 0.278524403}, // 11786K {0.272554618, 0.278519835}, // 11787K {0.272550928, 0.278515268}, // 11788K {0.272547239, 0.278510701}, // 11789K {0.27254355, 0.278506136}, // 11790K {0.272539863, 0.278501571}, // 11791K {0.272536176, 0.278497007}, // 11792K {0.27253249, 0.278492444}, // 11793K {0.272528805, 0.278487881}, // 11794K {0.27252512, 0.27848332}, // 11795K {0.272521436, 0.278478759}, // 11796K {0.272517753, 0.278474199}, // 11797K {0.272514071, 0.278469641}, // 11798K {0.27251039, 0.278465083}, // 11799K {0.272506709, 0.278460525}, // 11800K {0.272503029, 0.278455969}, // 11801K {0.27249935, 0.278451414}, // 11802K {0.272495672, 0.278446859}, // 11803K {0.272491994, 0.278442305}, // 11804K {0.272488317, 0.278437752}, // 11805K {0.272484641, 0.2784332}, // 11806K {0.272480966, 0.278428649}, // 11807K {0.272477291, 0.278424099}, // 11808K {0.272473618, 0.278419549}, // 11809K {0.272469944, 0.278415}, // 11810K {0.272466272, 0.278410452}, // 11811K {0.272462601, 0.278405905}, // 11812K {0.27245893, 0.278401359}, // 11813K {0.27245526, 0.278396814}, // 11814K {0.272451591, 0.27839227}, // 11815K {0.272447922, 0.278387726}, // 11816K {0.272444255, 0.278383183}, // 11817K {0.272440588, 0.278378641}, // 11818K {0.272436922, 0.2783741}, // 11819K {0.272433256, 0.27836956}, // 11820K {0.272429592, 0.278365021}, // 11821K {0.272425928, 0.278360482}, // 11822K {0.272422265, 0.278355945}, // 11823K {0.272418602, 0.278351408}, // 11824K {0.272414941, 0.278346872}, // 11825K {0.27241128, 0.278342337}, // 11826K {0.27240762, 0.278337802}, // 11827K {0.272403961, 0.278333269}, // 11828K {0.272400302, 0.278328736}, // 11829K {0.272396644, 0.278324205}, // 11830K {0.272392987, 0.278319674}, // 11831K {0.272389331, 0.278315144}, // 11832K {0.272385675, 0.278310614}, // 11833K {0.272382021, 0.278306086}, // 11834K {0.272378367, 0.278301559}, // 11835K {0.272374714, 0.278297032}, // 11836K {0.272371061, 0.278292506}, // 11837K {0.272367409, 0.278287981}, // 11838K {0.272363758, 0.278283457}, // 11839K {0.272360108, 0.278278934}, // 11840K {0.272356459, 0.278274411}, // 11841K {0.27235281, 0.278269889}, // 11842K {0.272349162, 0.278265369}, // 11843K {0.272345515, 0.278260849}, // 11844K {0.272341869, 0.27825633}, // 11845K {0.272338223, 0.278251811}, // 11846K {0.272334578, 0.278247294}, // 11847K {0.272330934, 0.278242777}, // 11848K {0.27232729, 0.278238262}, // 11849K {0.272323648, 0.278233747}, // 11850K {0.272320006, 0.278229233}, // 11851K {0.272316365, 0.278224719}, // 11852K {0.272312724, 0.278220207}, // 11853K {0.272309085, 0.278215696}, // 11854K {0.272305446, 0.278211185}, // 11855K {0.272301808, 0.278206675}, // 11856K {0.272298171, 0.278202166}, // 11857K {0.272294534, 0.278197658}, // 11858K {0.272290898, 0.27819315}, // 11859K {0.272287263, 0.278188644}, // 11860K {0.272283629, 0.278184138}, // 11861K {0.272279995, 0.278179633}, // 11862K {0.272276362, 0.278175129}, // 11863K {0.27227273, 0.278170626}, // 11864K {0.272269099, 0.278166124}, // 11865K {0.272265468, 0.278161622}, // 11866K {0.272261838, 0.278157122}, // 11867K {0.272258209, 0.278152622}, // 11868K {0.272254581, 0.278148123}, // 11869K {0.272250954, 0.278143625}, // 11870K {0.272247327, 0.278139128}, // 11871K {0.272243701, 0.278134631}, // 11872K {0.272240075, 0.278130136}, // 11873K {0.272236451, 0.278125641}, // 11874K {0.272232827, 0.278121147}, // 11875K {0.272229204, 0.278116654}, // 11876K {0.272225582, 0.278112161}, // 11877K {0.27222196, 0.27810767}, // 11878K {0.272218339, 0.278103179}, // 11879K {0.272214719, 0.278098689}, // 11880K {0.2722111, 0.278094201}, // 11881K {0.272207481, 0.278089712}, // 11882K {0.272203863, 0.278085225}, // 11883K {0.272200246, 0.278080739}, // 11884K {0.27219663, 0.278076253}, // 11885K {0.272193014, 0.278071768}, // 11886K {0.2721894, 0.278067284}, // 11887K {0.272185785, 0.278062801}, // 11888K {0.272182172, 0.278058319}, // 11889K {0.272178559, 0.278053837}, // 11890K {0.272174948, 0.278049357}, // 11891K {0.272171337, 0.278044877}, // 11892K {0.272167726, 0.278040398}, // 11893K {0.272164117, 0.27803592}, // 11894K {0.272160508, 0.278031443}, // 11895K {0.2721569, 0.278026966}, // 11896K {0.272153292, 0.27802249}, // 11897K {0.272149686, 0.278018016}, // 11898K {0.27214608, 0.278013542}, // 11899K {0.272142475, 0.278009069}, // 11900K {0.27213887, 0.278004596}, // 11901K {0.272135267, 0.278000125}, // 11902K {0.272131664, 0.277995654}, // 11903K {0.272128061, 0.277991184}, // 11904K {0.27212446, 0.277986715}, // 11905K {0.272120859, 0.277982247}, // 11906K {0.272117259, 0.27797778}, // 11907K {0.27211366, 0.277973313}, // 11908K {0.272110062, 0.277968847}, // 11909K {0.272106464, 0.277964383}, // 11910K {0.272102867, 0.277959919}, // 11911K {0.272099271, 0.277955455}, // 11912K {0.272095675, 0.277950993}, // 11913K {0.272092081, 0.277946531}, // 11914K {0.272088487, 0.277942071}, // 11915K {0.272084893, 0.277937611}, // 11916K {0.272081301, 0.277933152}, // 11917K {0.272077709, 0.277928693}, // 11918K {0.272074118, 0.277924236}, // 11919K {0.272070528, 0.277919779}, // 11920K {0.272066938, 0.277915324}, // 11921K {0.272063349, 0.277910869}, // 11922K {0.272059761, 0.277906414}, // 11923K {0.272056174, 0.277901961}, // 11924K {0.272052587, 0.277897509}, // 11925K {0.272049001, 0.277893057}, // 11926K {0.272045416, 0.277888606}, // 11927K {0.272041832, 0.277884156}, // 11928K {0.272038248, 0.277879707}, // 11929K {0.272034665, 0.277875259}, // 11930K {0.272031083, 0.277870811}, // 11931K {0.272027502, 0.277866364}, // 11932K {0.272023921, 0.277861918}, // 11933K {0.272020341, 0.277857473}, // 11934K {0.272016762, 0.277853029}, // 11935K {0.272013183, 0.277848586}, // 11936K {0.272009606, 0.277844143}, // 11937K {0.272006029, 0.277839701}, // 11938K {0.272002452, 0.27783526}, // 11939K {0.271998877, 0.27783082}, // 11940K {0.271995302, 0.277826381}, // 11941K {0.271991728, 0.277821942}, // 11942K {0.271988155, 0.277817505}, // 11943K {0.271984582, 0.277813068}, // 11944K {0.27198101, 0.277808632}, // 11945K {0.271977439, 0.277804196}, // 11946K {0.271973869, 0.277799762}, // 11947K {0.271970299, 0.277795329}, // 11948K {0.27196673, 0.277790896}, // 11949K {0.271963162, 0.277786464}, // 11950K {0.271959594, 0.277782033}, // 11951K {0.271956028, 0.277777602}, // 11952K {0.271952462, 0.277773173}, // 11953K {0.271948896, 0.277768744}, // 11954K {0.271945332, 0.277764316}, // 11955K {0.271941768, 0.277759889}, // 11956K {0.271938205, 0.277755463}, // 11957K {0.271934643, 0.277751038}, // 11958K {0.271931081, 0.277746613}, // 11959K {0.27192752, 0.277742189}, // 11960K {0.27192396, 0.277737766}, // 11961K {0.271920401, 0.277733344}, // 11962K {0.271916842, 0.277728923}, // 11963K {0.271913284, 0.277724502}, // 11964K {0.271909727, 0.277720083}, // 11965K {0.27190617, 0.277715664}, // 11966K {0.271902615, 0.277711246}, // 11967K {0.27189906, 0.277706829}, // 11968K {0.271895505, 0.277702412}, // 11969K {0.271891952, 0.277697997}, // 11970K {0.271888399, 0.277693582}, // 11971K {0.271884847, 0.277689168}, // 11972K {0.271881295, 0.277684755}, // 11973K {0.271877745, 0.277680342}, // 11974K {0.271874195, 0.277675931}, // 11975K {0.271870646, 0.27767152}, // 11976K {0.271867097, 0.27766711}, // 11977K {0.271863549, 0.277662701}, // 11978K {0.271860002, 0.277658293}, // 11979K {0.271856456, 0.277653885}, // 11980K {0.27185291, 0.277649479}, // 11981K {0.271849366, 0.277645073}, // 11982K {0.271845822, 0.277640668}, // 11983K {0.271842278, 0.277636263}, // 11984K {0.271838736, 0.27763186}, // 11985K {0.271835194, 0.277627457}, // 11986K {0.271831652, 0.277623056}, // 11987K {0.271828112, 0.277618655}, // 11988K {0.271824572, 0.277614255}, // 11989K {0.271821033, 0.277609855}, // 11990K {0.271817495, 0.277605457}, // 11991K {0.271813957, 0.277601059}, // 11992K {0.27181042, 0.277596662}, // 11993K {0.271806884, 0.277592266}, // 11994K {0.271803349, 0.277587871}, // 11995K {0.271799814, 0.277583476}, // 11996K {0.27179628, 0.277579082}, // 11997K {0.271792747, 0.277574689}, // 11998K {0.271789215, 0.277570297}, // 11999K {0.271785683, 0.277565906}, // 12000K {0.271782152, 0.277561516}, // 12001K {0.271778621, 0.277557126}, // 12002K {0.271775092, 0.277552737}, // 12003K {0.271771563, 0.277548349}, // 12004K {0.271768035, 0.277543962}, // 12005K {0.271764507, 0.277539576}, // 12006K {0.27176098, 0.27753519}, // 12007K {0.271757454, 0.277530805}, // 12008K {0.271753929, 0.277526421}, // 12009K {0.271750405, 0.277522038}, // 12010K {0.271746881, 0.277517656}, // 12011K {0.271743358, 0.277513274}, // 12012K {0.271739835, 0.277508893}, // 12013K {0.271736314, 0.277504513}, // 12014K {0.271732793, 0.277500134}, // 12015K {0.271729272, 0.277495756}, // 12016K {0.271725753, 0.277491378}, // 12017K {0.271722234, 0.277487001}, // 12018K {0.271718716, 0.277482626}, // 12019K {0.271715199, 0.27747825}, // 12020K {0.271711682, 0.277473876}, // 12021K {0.271708166, 0.277469503}, // 12022K {0.271704651, 0.27746513}, // 12023K {0.271701136, 0.277460758}, // 12024K {0.271697623, 0.277456387}, // 12025K {0.271694109, 0.277452016}, // 12026K {0.271690597, 0.277447647}, // 12027K {0.271687086, 0.277443278}, // 12028K {0.271683575, 0.27743891}, // 12029K {0.271680064, 0.277434543}, // 12030K {0.271676555, 0.277430177}, // 12031K {0.271673046, 0.277425811}, // 12032K {0.271669538, 0.277421447}, // 12033K {0.271666031, 0.277417083}, // 12034K {0.271662524, 0.27741272}, // 12035K {0.271659018, 0.277408357}, // 12036K {0.271655513, 0.277403996}, // 12037K {0.271652009, 0.277399635}, // 12038K {0.271648505, 0.277395275}, // 12039K {0.271645002, 0.277390916}, // 12040K {0.2716415, 0.277386558}, // 12041K {0.271637998, 0.277382201}, // 12042K {0.271634497, 0.277377844}, // 12043K {0.271630997, 0.277373488}, // 12044K {0.271627498, 0.277369133}, // 12045K {0.271623999, 0.277364779}, // 12046K {0.271620501, 0.277360425}, // 12047K {0.271617003, 0.277356072}, // 12048K {0.271613507, 0.277351721}, // 12049K {0.271610011, 0.277347369}, // 12050K {0.271606516, 0.277343019}, // 12051K {0.271603021, 0.27733867}, // 12052K {0.271599527, 0.277334321}, // 12053K {0.271596034, 0.277329973}, // 12054K {0.271592542, 0.277325626}, // 12055K {0.27158905, 0.27732128}, // 12056K {0.27158556, 0.277316934}, // 12057K {0.271582069, 0.277312589}, // 12058K {0.27157858, 0.277308245}, // 12059K {0.271575091, 0.277303902}, // 12060K {0.271571603, 0.27729956}, // 12061K {0.271568116, 0.277295219}, // 12062K {0.271564629, 0.277290878}, // 12063K {0.271561143, 0.277286538}, // 12064K {0.271557658, 0.277282199}, // 12065K {0.271554173, 0.27727786}, // 12066K {0.27155069, 0.277273523}, // 12067K {0.271547206, 0.277269186}, // 12068K {0.271543724, 0.27726485}, // 12069K {0.271540242, 0.277260515}, // 12070K {0.271536761, 0.277256181}, // 12071K {0.271533281, 0.277251847}, // 12072K {0.271529802, 0.277247514}, // 12073K {0.271526323, 0.277243182}, // 12074K {0.271522845, 0.277238851}, // 12075K {0.271519367, 0.277234521}, // 12076K {0.27151589, 0.277230191}, // 12077K {0.271512414, 0.277225862}, // 12078K {0.271508939, 0.277221534}, // 12079K {0.271505464, 0.277217207}, // 12080K {0.271501991, 0.27721288}, // 12081K {0.271498517, 0.277208555}, // 12082K {0.271495045, 0.27720423}, // 12083K {0.271491573, 0.277199906}, // 12084K {0.271488102, 0.277195583}, // 12085K {0.271484632, 0.27719126}, // 12086K {0.271481162, 0.277186938}, // 12087K {0.271477693, 0.277182617}, // 12088K {0.271474225, 0.277178297}, // 12089K {0.271470757, 0.277173978}, // 12090K {0.27146729, 0.277169659}, // 12091K {0.271463824, 0.277165342}, // 12092K {0.271460359, 0.277161025}, // 12093K {0.271456894, 0.277156709}, // 12094K {0.27145343, 0.277152393}, // 12095K {0.271449967, 0.277148079}, // 12096K {0.271446504, 0.277143765}, // 12097K {0.271443042, 0.277139452}, // 12098K {0.271439581, 0.27713514}, // 12099K {0.27143612, 0.277130828}, // 12100K {0.271432661, 0.277126517}, // 12101K {0.271429201, 0.277122208}, // 12102K {0.271425743, 0.277117899}, // 12103K {0.271422285, 0.27711359}, // 12104K {0.271418828, 0.277109283}, // 12105K {0.271415372, 0.277104976}, // 12106K {0.271411916, 0.27710067}, // 12107K {0.271408461, 0.277096365}, // 12108K {0.271405007, 0.277092061}, // 12109K {0.271401554, 0.277087757}, // 12110K {0.271398101, 0.277083454}, // 12111K {0.271394649, 0.277079152}, // 12112K {0.271391197, 0.277074851}, // 12113K {0.271387747, 0.277070551}, // 12114K {0.271384297, 0.277066251}, // 12115K {0.271380847, 0.277061952}, // 12116K {0.271377399, 0.277057654}, // 12117K {0.271373951, 0.277053357}, // 12118K {0.271370504, 0.27704906}, // 12119K {0.271367057, 0.277044765}, // 12120K {0.271363611, 0.27704047}, // 12121K {0.271360166, 0.277036176}, // 12122K {0.271356722, 0.277031882}, // 12123K {0.271353278, 0.27702759}, // 12124K {0.271349835, 0.277023298}, // 12125K {0.271346393, 0.277019007}, // 12126K {0.271342951, 0.277014717}, // 12127K {0.27133951, 0.277010427}, // 12128K {0.27133607, 0.277006139}, // 12129K {0.27133263, 0.277001851}, // 12130K {0.271329192, 0.276997564}, // 12131K {0.271325753, 0.276993277}, // 12132K {0.271322316, 0.276988992}, // 12133K {0.271318879, 0.276984707}, // 12134K {0.271315443, 0.276980423}, // 12135K {0.271312008, 0.27697614}, // 12136K {0.271308573, 0.276971857}, // 12137K {0.271305139, 0.276967576}, // 12138K {0.271301706, 0.276963295}, // 12139K {0.271298273, 0.276959015}, // 12140K {0.271294841, 0.276954736}, // 12141K {0.27129141, 0.276950457}, // 12142K {0.27128798, 0.276946179}, // 12143K {0.27128455, 0.276941902}, // 12144K {0.271281121, 0.276937626}, // 12145K {0.271277692, 0.276933351}, // 12146K {0.271274265, 0.276929076}, // 12147K {0.271270838, 0.276924802}, // 12148K {0.271267411, 0.276920529}, // 12149K {0.271263986, 0.276916257}, // 12150K {0.271260561, 0.276911985}, // 12151K {0.271257136, 0.276907715}, // 12152K {0.271253713, 0.276903445}, // 12153K {0.27125029, 0.276899176}, // 12154K {0.271246868, 0.276894907}, // 12155K {0.271243446, 0.27689064}, // 12156K {0.271240025, 0.276886373}, // 12157K {0.271236605, 0.276882107}, // 12158K {0.271233186, 0.276877841}, // 12159K {0.271229767, 0.276873577}, // 12160K {0.271226349, 0.276869313}, // 12161K {0.271222932, 0.27686505}, // 12162K {0.271219515, 0.276860788}, // 12163K {0.271216099, 0.276856527}, // 12164K {0.271212684, 0.276852266}, // 12165K {0.271209269, 0.276848006}, // 12166K {0.271205855, 0.276843747}, // 12167K {0.271202442, 0.276839489}, // 12168K {0.27119903, 0.276835231}, // 12169K {0.271195618, 0.276830975}, // 12170K {0.271192207, 0.276826719}, // 12171K {0.271188796, 0.276822463}, // 12172K {0.271185386, 0.276818209}, // 12173K {0.271181977, 0.276813955}, // 12174K {0.271178569, 0.276809702}, // 12175K {0.271175161, 0.27680545}, // 12176K {0.271171754, 0.276801199}, // 12177K {0.271168348, 0.276796948}, // 12178K {0.271164942, 0.276792699}, // 12179K {0.271161537, 0.27678845}, // 12180K {0.271158133, 0.276784201}, // 12181K {0.271154729, 0.276779954}, // 12182K {0.271151326, 0.276775707}, // 12183K {0.271147924, 0.276771461}, // 12184K {0.271144523, 0.276767216}, // 12185K {0.271141122, 0.276762972}, // 12186K {0.271137722, 0.276758728}, // 12187K {0.271134322, 0.276754485}, // 12188K {0.271130923, 0.276750243}, // 12189K {0.271127525, 0.276746002}, // 12190K {0.271124128, 0.276741761}, // 12191K {0.271120731, 0.276737522}, // 12192K {0.271117335, 0.276733283}, // 12193K {0.27111394, 0.276729044}, // 12194K {0.271110545, 0.276724807}, // 12195K {0.271107151, 0.27672057}, // 12196K {0.271103758, 0.276716334}, // 12197K {0.271100365, 0.276712099}, // 12198K {0.271096973, 0.276707865}, // 12199K {0.271093582, 0.276703631}, // 12200K {0.271090191, 0.276699398}, // 12201K {0.271086801, 0.276695166}, // 12202K {0.271083412, 0.276690935}, // 12203K {0.271080023, 0.276686704}, // 12204K {0.271076636, 0.276682475}, // 12205K {0.271073248, 0.276678246}, // 12206K {0.271069862, 0.276674017}, // 12207K {0.271066476, 0.27666979}, // 12208K {0.271063091, 0.276665563}, // 12209K {0.271059706, 0.276661337}, // 12210K {0.271056323, 0.276657112}, // 12211K {0.27105294, 0.276652888}, // 12212K {0.271049557, 0.276648664}, // 12213K {0.271046175, 0.276644441}, // 12214K {0.271042794, 0.276640219}, // 12215K {0.271039414, 0.276635998}, // 12216K {0.271036034, 0.276631777}, // 12217K {0.271032655, 0.276627557}, // 12218K {0.271029277, 0.276623338}, // 12219K {0.271025899, 0.27661912}, // 12220K {0.271022522, 0.276614902}, // 12221K {0.271019146, 0.276610686}, // 12222K {0.27101577, 0.27660647}, // 12223K {0.271012395, 0.276602254}, // 12224K {0.271009021, 0.27659804}, // 12225K {0.271005648, 0.276593826}, // 12226K {0.271002275, 0.276589613}, // 12227K {0.270998902, 0.276585401}, // 12228K {0.270995531, 0.27658119}, // 12229K {0.27099216, 0.276576979}, // 12230K {0.27098879, 0.276572769}, // 12231K {0.27098542, 0.27656856}, // 12232K {0.270982051, 0.276564352}, // 12233K {0.270978683, 0.276560144}, // 12234K {0.270975316, 0.276555937}, // 12235K {0.270971949, 0.276551731}, // 12236K {0.270968583, 0.276547526}, // 12237K {0.270965217, 0.276543321}, // 12238K {0.270961852, 0.276539118}, // 12239K {0.270958488, 0.276534915}, // 12240K {0.270955125, 0.276530712}, // 12241K {0.270951762, 0.276526511}, // 12242K {0.2709484, 0.27652231}, // 12243K {0.270945039, 0.27651811}, // 12244K {0.270941678, 0.276513911}, // 12245K {0.270938318, 0.276509712}, // 12246K {0.270934958, 0.276505515}, // 12247K {0.2709316, 0.276501318}, // 12248K {0.270928241, 0.276497122}, // 12249K {0.270924884, 0.276492926}, // 12250K {0.270921527, 0.276488731}, // 12251K {0.270918171, 0.276484537}, // 12252K {0.270914816, 0.276480344}, // 12253K {0.270911461, 0.276476152}, // 12254K {0.270908107, 0.27647196}, // 12255K {0.270904754, 0.276467769}, // 12256K {0.270901401, 0.276463579}, // 12257K {0.270898049, 0.27645939}, // 12258K {0.270894698, 0.276455201}, // 12259K {0.270891347, 0.276451013}, // 12260K {0.270887997, 0.276446826}, // 12261K {0.270884648, 0.27644264}, // 12262K {0.270881299, 0.276438454}, // 12263K {0.270877951, 0.27643427}, // 12264K {0.270874604, 0.276430086}, // 12265K {0.270871257, 0.276425902}, // 12266K {0.270867911, 0.27642172}, // 12267K {0.270864566, 0.276417538}, // 12268K {0.270861221, 0.276413357}, // 12269K {0.270857877, 0.276409177}, // 12270K {0.270854534, 0.276404997}, // 12271K {0.270851191, 0.276400818}, // 12272K {0.27084785, 0.27639664}, // 12273K {0.270844508, 0.276392463}, // 12274K {0.270841168, 0.276388286}, // 12275K {0.270837828, 0.276384111}, // 12276K {0.270834488, 0.276379936}, // 12277K {0.27083115, 0.276375761}, // 12278K {0.270827812, 0.276371588}, // 12279K {0.270824475, 0.276367415}, // 12280K {0.270821138, 0.276363243}, // 12281K {0.270817802, 0.276359072}, // 12282K {0.270814467, 0.276354901}, // 12283K {0.270811132, 0.276350732}, // 12284K {0.270807798, 0.276346563}, // 12285K {0.270804465, 0.276342394}, // 12286K {0.270801132, 0.276338227}, // 12287K {0.2707978, 0.27633406}, // 12288K {0.270794469, 0.276329894}, // 12289K {0.270791138, 0.276325729}, // 12290K {0.270787808, 0.276321564}, // 12291K {0.270784479, 0.276317401}, // 12292K {0.27078115, 0.276313238}, // 12293K {0.270777822, 0.276309075}, // 12294K {0.270774495, 0.276304914}, // 12295K {0.270771169, 0.276300753}, // 12296K {0.270767843, 0.276296593}, // 12297K {0.270764517, 0.276292434}, // 12298K {0.270761193, 0.276288276}, // 12299K {0.270757869, 0.276284118}, // 12300K {0.270754545, 0.276279961}, // 12301K {0.270751223, 0.276275805}, // 12302K {0.270747901, 0.276271649}, // 12303K {0.270744579, 0.276267494}, // 12304K {0.270741259, 0.27626334}, // 12305K {0.270737939, 0.276259187}, // 12306K {0.270734619, 0.276255035}, // 12307K {0.270731301, 0.276250883}, // 12308K {0.270727983, 0.276246732}, // 12309K {0.270724665, 0.276242582}, // 12310K {0.270721349, 0.276238432}, // 12311K {0.270718033, 0.276234283}, // 12312K {0.270714717, 0.276230135}, // 12313K {0.270711403, 0.276225988}, // 12314K {0.270708088, 0.276221842}, // 12315K {0.270704775, 0.276217696}, // 12316K {0.270701462, 0.276213551}, // 12317K {0.27069815, 0.276209407}, // 12318K {0.270694839, 0.276205263}, // 12319K {0.270691528, 0.27620112}, // 12320K {0.270688218, 0.276196978}, // 12321K {0.270684909, 0.276192837}, // 12322K {0.2706816, 0.276188696}, // 12323K {0.270678292, 0.276184557}, // 12324K {0.270674984, 0.276180418}, // 12325K {0.270671678, 0.276176279}, // 12326K {0.270668371, 0.276172142}, // 12327K {0.270665066, 0.276168005}, // 12328K {0.270661761, 0.276163869}, // 12329K {0.270658457, 0.276159733}, // 12330K {0.270655153, 0.276155599}, // 12331K {0.270651851, 0.276151465}, // 12332K {0.270648548, 0.276147332}, // 12333K {0.270645247, 0.2761432}, // 12334K {0.270641946, 0.276139068}, // 12335K {0.270638646, 0.276134937}, // 12336K {0.270635346, 0.276130807}, // 12337K {0.270632047, 0.276126678}, // 12338K {0.270628749, 0.276122549}, // 12339K {0.270625452, 0.276118421}, // 12340K {0.270622155, 0.276114294}, // 12341K {0.270618858, 0.276110167}, // 12342K {0.270615563, 0.276106042}, // 12343K {0.270612268, 0.276101917}, // 12344K {0.270608973, 0.276097793}, // 12345K {0.27060568, 0.276093669}, // 12346K {0.270602387, 0.276089546}, // 12347K {0.270599094, 0.276085424}, // 12348K {0.270595803, 0.276081303}, // 12349K {0.270592512, 0.276077183}, // 12350K {0.270589221, 0.276073063}, // 12351K {0.270585932, 0.276068944}, // 12352K {0.270582642, 0.276064826}, // 12353K {0.270579354, 0.276060708}, // 12354K {0.270576066, 0.276056591}, // 12355K {0.270572779, 0.276052475}, // 12356K {0.270569493, 0.27604836}, // 12357K {0.270566207, 0.276044245}, // 12358K {0.270562922, 0.276040131}, // 12359K {0.270559637, 0.276036018}, // 12360K {0.270556353, 0.276031906}, // 12361K {0.27055307, 0.276027794}, // 12362K {0.270549788, 0.276023683}, // 12363K {0.270546506, 0.276019573}, // 12364K {0.270543224, 0.276015464}, // 12365K {0.270539944, 0.276011355}, // 12366K {0.270536664, 0.276007247}, // 12367K {0.270533385, 0.27600314}, // 12368K {0.270530106, 0.275999034}, // 12369K {0.270526828, 0.275994928}, // 12370K {0.270523551, 0.275990823}, // 12371K {0.270520274, 0.275986719}, // 12372K {0.270516998, 0.275982615}, // 12373K {0.270513723, 0.275978512}, // 12374K {0.270510448, 0.27597441}, // 12375K {0.270507174, 0.275970309}, // 12376K {0.2705039, 0.275966208}, // 12377K {0.270500628, 0.275962108}, // 12378K {0.270497355, 0.275958009}, // 12379K {0.270494084, 0.275953911}, // 12380K {0.270490813, 0.275949813}, // 12381K {0.270487543, 0.275945716}, // 12382K {0.270484273, 0.27594162}, // 12383K {0.270481004, 0.275937525}, // 12384K {0.270477736, 0.27593343}, // 12385K {0.270474469, 0.275929336}, // 12386K {0.270471202, 0.275925243}, // 12387K {0.270467935, 0.27592115}, // 12388K {0.27046467, 0.275917058}, // 12389K {0.270461405, 0.275912967}, // 12390K {0.27045814, 0.275908877}, // 12391K {0.270454876, 0.275904788}, // 12392K {0.270451613, 0.275900699}, // 12393K {0.270448351, 0.275896611}, // 12394K {0.270445089, 0.275892523}, // 12395K {0.270441828, 0.275888437}, // 12396K {0.270438568, 0.275884351}, // 12397K {0.270435308, 0.275880265}, // 12398K {0.270432048, 0.275876181}, // 12399K {0.27042879, 0.275872097}, // 12400K {0.270425532, 0.275868014}, // 12401K {0.270422275, 0.275863932}, // 12402K {0.270419018, 0.27585985}, // 12403K {0.270415762, 0.27585577}, // 12404K {0.270412507, 0.27585169}, // 12405K {0.270409252, 0.27584761}, // 12406K {0.270405998, 0.275843532}, // 12407K {0.270402745, 0.275839454}, // 12408K {0.270399492, 0.275835377}, // 12409K {0.27039624, 0.2758313}, // 12410K {0.270392988, 0.275827224}, // 12411K {0.270389737, 0.275823149}, // 12412K {0.270386487, 0.275819075}, // 12413K {0.270383238, 0.275815002}, // 12414K {0.270379989, 0.275810929}, // 12415K {0.270376741, 0.275806857}, // 12416K {0.270373493, 0.275802785}, // 12417K {0.270370246, 0.275798715}, // 12418K {0.270367, 0.275794645}, // 12419K {0.270363754, 0.275790576}, // 12420K {0.270360509, 0.275786507}, // 12421K {0.270357264, 0.27578244}, // 12422K {0.270354021, 0.275778373}, // 12423K {0.270350778, 0.275774307}, // 12424K {0.270347535, 0.275770241}, // 12425K {0.270344293, 0.275766176}, // 12426K {0.270341052, 0.275762112}, // 12427K {0.270337811, 0.275758049}, // 12428K {0.270334572, 0.275753986}, // 12429K {0.270331332, 0.275749924}, // 12430K {0.270328094, 0.275745863}, // 12431K {0.270324856, 0.275741803}, // 12432K {0.270321618, 0.275737743}, // 12433K {0.270318382, 0.275733684}, // 12434K {0.270315145, 0.275729626}, // 12435K {0.27031191, 0.275725568}, // 12436K {0.270308675, 0.275721511}, // 12437K {0.270305441, 0.275717455}, // 12438K {0.270302207, 0.2757134}, // 12439K {0.270298975, 0.275709345}, // 12440K {0.270295742, 0.275705291}, // 12441K {0.270292511, 0.275701238}, // 12442K {0.27028928, 0.275697186}, // 12443K {0.270286049, 0.275693134}, // 12444K {0.27028282, 0.275689083}, // 12445K {0.270279591, 0.275685033}, // 12446K {0.270276362, 0.275680983}, // 12447K {0.270273134, 0.275676934}, // 12448K {0.270269907, 0.275672886}, // 12449K {0.270266681, 0.275668839}, // 12450K {0.270263455, 0.275664792}, // 12451K {0.270260229, 0.275660746}, // 12452K {0.270257005, 0.275656701}, // 12453K {0.270253781, 0.275652656}, // 12454K {0.270250557, 0.275648612}, // 12455K {0.270247335, 0.275644569}, // 12456K {0.270244113, 0.275640527}, // 12457K {0.270240891, 0.275636485}, // 12458K {0.27023767, 0.275632444}, // 12459K {0.27023445, 0.275628404}, // 12460K {0.270231231, 0.275624365}, // 12461K {0.270228012, 0.275620326}, // 12462K {0.270224793, 0.275616288}, // 12463K {0.270221576, 0.27561225}, // 12464K {0.270218359, 0.275608214}, // 12465K {0.270215142, 0.275604178}, // 12466K {0.270211927, 0.275600143}, // 12467K {0.270208712, 0.275596108}, // 12468K {0.270205497, 0.275592075}, // 12469K {0.270202283, 0.275588042}, // 12470K {0.27019907, 0.275584009}, // 12471K {0.270195857, 0.275579978}, // 12472K {0.270192646, 0.275575947}, // 12473K {0.270189434, 0.275571917}, // 12474K {0.270186224, 0.275567887}, // 12475K {0.270183013, 0.275563859}, // 12476K {0.270179804, 0.275559831}, // 12477K {0.270176595, 0.275555803}, // 12478K {0.270173387, 0.275551777}, // 12479K {0.27017018, 0.275547751}, // 12480K {0.270166973, 0.275543726}, // 12481K {0.270163766, 0.275539701}, // 12482K {0.270160561, 0.275535678}, // 12483K {0.270157356, 0.275531655}, // 12484K {0.270154151, 0.275527632}, // 12485K {0.270150948, 0.275523611}, // 12486K {0.270147744, 0.27551959}, // 12487K {0.270144542, 0.27551557}, // 12488K {0.27014134, 0.27551155}, // 12489K {0.270138139, 0.275507532}, // 12490K {0.270134938, 0.275503514}, // 12491K {0.270131738, 0.275499497}, // 12492K {0.270128539, 0.27549548}, // 12493K {0.27012534, 0.275491464}, // 12494K {0.270122142, 0.275487449}, // 12495K {0.270118945, 0.275483435}, // 12496K {0.270115748, 0.275479421}, // 12497K {0.270112552, 0.275475408}, // 12498K {0.270109356, 0.275471396}, // 12499K {0.270106161, 0.275467384}, // 12500K {0.270102967, 0.275463373}, // 12501K {0.270099773, 0.275459363}, // 12502K {0.27009658, 0.275455354}, // 12503K {0.270093388, 0.275451345}, // 12504K {0.270090196, 0.275447337}, // 12505K {0.270087005, 0.27544333}, // 12506K {0.270083814, 0.275439323}, // 12507K {0.270080624, 0.275435317}, // 12508K {0.270077435, 0.275431312}, // 12509K {0.270074246, 0.275427308}, // 12510K {0.270071058, 0.275423304}, // 12511K {0.270067871, 0.275419301}, // 12512K {0.270064684, 0.275415299}, // 12513K {0.270061498, 0.275411297}, // 12514K {0.270058312, 0.275407296}, // 12515K {0.270055127, 0.275403296}, // 12516K {0.270051943, 0.275399297}, // 12517K {0.270048759, 0.275395298}, // 12518K {0.270045576, 0.2753913}, // 12519K {0.270042394, 0.275387302}, // 12520K {0.270039212, 0.275383306}, // 12521K {0.270036031, 0.27537931}, // 12522K {0.27003285, 0.275375315}, // 12523K {0.27002967, 0.27537132}, // 12524K {0.270026491, 0.275367326}, // 12525K {0.270023312, 0.275363333}, // 12526K {0.270020134, 0.275359341}, // 12527K {0.270016957, 0.275355349}, // 12528K {0.27001378, 0.275351358}, // 12529K {0.270010604, 0.275347368}, // 12530K {0.270007428, 0.275343379}, // 12531K {0.270004253, 0.27533939}, // 12532K {0.270001079, 0.275335402}, // 12533K {0.269997905, 0.275331414}, // 12534K {0.269994732, 0.275327428}, // 12535K {0.269991559, 0.275323442}, // 12536K {0.269988387, 0.275319456}, // 12537K {0.269985216, 0.275315472}, // 12538K {0.269982046, 0.275311488}, // 12539K {0.269978876, 0.275307505}, // 12540K {0.269975706, 0.275303522}, // 12541K {0.269972537, 0.27529954}, // 12542K {0.269969369, 0.275295559}, // 12543K {0.269966202, 0.275291579}, // 12544K {0.269963035, 0.275287599}, // 12545K {0.269959869, 0.27528362}, // 12546K {0.269956703, 0.275279642}, // 12547K {0.269953538, 0.275275664}, // 12548K {0.269950373, 0.275271688}, // 12549K {0.26994721, 0.275267712}, // 12550K {0.269944046, 0.275263736}, // 12551K {0.269940884, 0.275259761}, // 12552K {0.269937722, 0.275255787}, // 12553K {0.269934561, 0.275251814}, // 12554K {0.2699314, 0.275247841}, // 12555K {0.26992824, 0.27524387}, // 12556K {0.26992508, 0.275239898}, // 12557K {0.269921921, 0.275235928}, // 12558K {0.269918763, 0.275231958}, // 12559K {0.269915606, 0.275227989}, // 12560K {0.269912449, 0.27522402}, // 12561K {0.269909292, 0.275220053}, // 12562K {0.269906136, 0.275216086}, // 12563K {0.269902981, 0.27521212}, // 12564K {0.269899827, 0.275208154}, // 12565K {0.269896673, 0.275204189}, // 12566K {0.269893519, 0.275200225}, // 12567K {0.269890367, 0.275196261}, // 12568K {0.269887215, 0.275192299}, // 12569K {0.269884063, 0.275188336}, // 12570K {0.269880912, 0.275184375}, // 12571K {0.269877762, 0.275180414}, // 12572K {0.269874613, 0.275176454}, // 12573K {0.269871463, 0.275172495}, // 12574K {0.269868315, 0.275168537}, // 12575K {0.269865167, 0.275164579}, // 12576K {0.26986202, 0.275160621}, // 12577K {0.269858874, 0.275156665}, // 12578K {0.269855728, 0.275152709}, // 12579K {0.269852582, 0.275148754}, // 12580K {0.269849438, 0.2751448}, // 12581K {0.269846294, 0.275140846}, // 12582K {0.26984315, 0.275136893}, // 12583K {0.269840007, 0.275132941}, // 12584K {0.269836865, 0.275128989}, // 12585K {0.269833723, 0.275125038}, // 12586K {0.269830582, 0.275121088}, // 12587K {0.269827442, 0.275117139}, // 12588K {0.269824302, 0.27511319}, // 12589K {0.269821163, 0.275109242}, // 12590K {0.269818024, 0.275105294}, // 12591K {0.269814886, 0.275101348}, // 12592K {0.269811749, 0.275097402}, // 12593K {0.269808612, 0.275093456}, // 12594K {0.269805476, 0.275089512}, // 12595K {0.26980234, 0.275085568}, // 12596K {0.269799206, 0.275081624}, // 12597K {0.269796071, 0.275077682}, // 12598K {0.269792938, 0.27507374}, // 12599K {0.269789804, 0.275069799}, // 12600K {0.269786672, 0.275065858}, // 12601K {0.26978354, 0.275061919}, // 12602K {0.269780409, 0.27505798}, // 12603K {0.269777278, 0.275054041}, // 12604K {0.269774148, 0.275050104}, // 12605K {0.269771019, 0.275046167}, // 12606K {0.26976789, 0.27504223}, // 12607K {0.269764762, 0.275038295}, // 12608K {0.269761634, 0.27503436}, // 12609K {0.269758507, 0.275030426}, // 12610K {0.269755381, 0.275026492}, // 12611K {0.269752255, 0.275022559}, // 12612K {0.26974913, 0.275018627}, // 12613K {0.269746005, 0.275014696}, // 12614K {0.269742881, 0.275010765}, // 12615K {0.269739758, 0.275006835}, // 12616K {0.269736635, 0.275002906}, // 12617K {0.269733513, 0.274998977}, // 12618K {0.269730391, 0.274995049}, // 12619K {0.269727271, 0.274991122}, // 12620K {0.26972415, 0.274987195}, // 12621K {0.26972103, 0.274983269}, // 12622K {0.269717911, 0.274979344}, // 12623K {0.269714793, 0.27497542}, // 12624K {0.269711675, 0.274971496}, // 12625K {0.269708558, 0.274967573}, // 12626K {0.269705441, 0.27496365}, // 12627K {0.269702325, 0.274959729}, // 12628K {0.269699209, 0.274955807}, // 12629K {0.269696095, 0.274951887}, // 12630K {0.26969298, 0.274947967}, // 12631K {0.269689867, 0.274944048}, // 12632K {0.269686754, 0.27494013}, // 12633K {0.269683641, 0.274936213}, // 12634K {0.269680529, 0.274932296}, // 12635K {0.269677418, 0.274928379}, // 12636K {0.269674308, 0.274924464}, // 12637K {0.269671197, 0.274920549}, // 12638K {0.269668088, 0.274916635}, // 12639K {0.269664979, 0.274912721}, // 12640K {0.269661871, 0.274908809}, // 12641K {0.269658763, 0.274904897}, // 12642K {0.269655656, 0.274900985}, // 12643K {0.26965255, 0.274897074}, // 12644K {0.269649444, 0.274893164}, // 12645K {0.269646339, 0.274889255}, // 12646K {0.269643234, 0.274885346}, // 12647K {0.26964013, 0.274881439}, // 12648K {0.269637027, 0.274877531}, // 12649K {0.269633924, 0.274873625}, // 12650K {0.269630822, 0.274869719}, // 12651K {0.26962772, 0.274865814}, // 12652K {0.269624619, 0.274861909}, // 12653K {0.269621519, 0.274858005}, // 12654K {0.269618419, 0.274854102}, // 12655K {0.26961532, 0.2748502}, // 12656K {0.269612221, 0.274846298}, // 12657K {0.269609123, 0.274842397}, // 12658K {0.269606026, 0.274838496}, // 12659K {0.269602929, 0.274834597}, // 12660K {0.269599833, 0.274830697}, // 12661K {0.269596738, 0.274826799}, // 12662K {0.269593643, 0.274822901}, // 12663K {0.269590548, 0.274819004}, // 12664K {0.269587454, 0.274815108}, // 12665K {0.269584361, 0.274811213}, // 12666K {0.269581269, 0.274807318}, // 12667K {0.269578177, 0.274803423}, // 12668K {0.269575085, 0.27479953}, // 12669K {0.269571994, 0.274795637}, // 12670K {0.269568904, 0.274791745}, // 12671K {0.269565815, 0.274787853}, // 12672K {0.269562726, 0.274783962}, // 12673K {0.269559637, 0.274780072}, // 12674K {0.269556549, 0.274776183}, // 12675K {0.269553462, 0.274772294}, // 12676K {0.269550376, 0.274768406}, // 12677K {0.26954729, 0.274764518}, // 12678K {0.269544204, 0.274760632}, // 12679K {0.269541119, 0.274756746}, // 12680K {0.269538035, 0.27475286}, // 12681K {0.269534951, 0.274748976}, // 12682K {0.269531868, 0.274745092}, // 12683K {0.269528786, 0.274741208}, // 12684K {0.269525704, 0.274737326}, // 12685K {0.269522623, 0.274733444}, // 12686K {0.269519542, 0.274729562}, // 12687K {0.269516462, 0.274725682}, // 12688K {0.269513383, 0.274721802}, // 12689K {0.269510304, 0.274717923}, // 12690K {0.269507226, 0.274714044}, // 12691K {0.269504148, 0.274710166}, // 12692K {0.269501071, 0.274706289}, // 12693K {0.269497994, 0.274702412}, // 12694K {0.269494919, 0.274698537}, // 12695K {0.269491843, 0.274694661}, // 12696K {0.269488769, 0.274690787}, // 12697K {0.269485694, 0.274686913}, // 12698K {0.269482621, 0.27468304}, // 12699K {0.269479548, 0.274679168}, // 12700K {0.269476476, 0.274675296}, // 12701K {0.269473404, 0.274671425}, // 12702K {0.269470333, 0.274667554}, // 12703K {0.269467262, 0.274663684}, // 12704K {0.269464192, 0.274659815}, // 12705K {0.269461123, 0.274655947}, // 12706K {0.269458054, 0.274652079}, // 12707K {0.269454986, 0.274648212}, // 12708K {0.269451918, 0.274644346}, // 12709K {0.269448851, 0.27464048}, // 12710K {0.269445785, 0.274636615}, // 12711K {0.269442719, 0.274632751}, // 12712K {0.269439654, 0.274628887}, // 12713K {0.269436589, 0.274625024}, // 12714K {0.269433525, 0.274621162}, // 12715K {0.269430462, 0.2746173}, // 12716K {0.269427399, 0.27461344}, // 12717K {0.269424337, 0.274609579}, // 12718K {0.269421275, 0.27460572}, // 12719K {0.269418214, 0.274601861}, // 12720K {0.269415154, 0.274598002}, // 12721K {0.269412094, 0.274594145}, // 12722K {0.269409034, 0.274590288}, // 12723K {0.269405976, 0.274586432}, // 12724K {0.269402918, 0.274582576}, // 12725K {0.26939986, 0.274578721}, // 12726K {0.269396803, 0.274574867}, // 12727K {0.269393747, 0.274571014}, // 12728K {0.269390691, 0.274567161}, // 12729K {0.269387636, 0.274563309}, // 12730K {0.269384581, 0.274559457}, // 12731K {0.269381527, 0.274555606}, // 12732K {0.269378474, 0.274551756}, // 12733K {0.269375421, 0.274547907}, // 12734K {0.269372369, 0.274544058}, // 12735K {0.269369317, 0.27454021}, // 12736K {0.269366266, 0.274536362}, // 12737K {0.269363215, 0.274532516}, // 12738K {0.269360166, 0.274528669}, // 12739K {0.269357116, 0.274524824}, // 12740K {0.269354068, 0.274520979}, // 12741K {0.269351019, 0.274517135}, // 12742K {0.269347972, 0.274513292}, // 12743K {0.269344925, 0.274509449}, // 12744K {0.269341878, 0.274505607}, // 12745K {0.269338833, 0.274501765}, // 12746K {0.269335788, 0.274497925}, // 12747K {0.269332743, 0.274494085}, // 12748K {0.269329699, 0.274490245}, // 12749K {0.269326655, 0.274486407}, // 12750K {0.269323613, 0.274482568}, // 12751K {0.26932057, 0.274478731}, // 12752K {0.269317529, 0.274474894}, // 12753K {0.269314487, 0.274471058}, // 12754K {0.269311447, 0.274467223}, // 12755K {0.269308407, 0.274463388}, // 12756K {0.269305368, 0.274459554}, // 12757K {0.269302329, 0.274455721}, // 12758K {0.269299291, 0.274451888}, // 12759K {0.269296253, 0.274448056}, // 12760K {0.269293216, 0.274444225}, // 12761K {0.26929018, 0.274440394}, // 12762K {0.269287144, 0.274436564}, // 12763K {0.269284109, 0.274432735}, // 12764K {0.269281074, 0.274428906}, // 12765K {0.26927804, 0.274425078}, // 12766K {0.269275006, 0.274421251}, // 12767K {0.269271973, 0.274417424}, // 12768K {0.269268941, 0.274413598}, // 12769K {0.269265909, 0.274409772}, // 12770K {0.269262878, 0.274405948}, // 12771K {0.269259847, 0.274402124}, // 12772K {0.269256817, 0.2743983}, // 12773K {0.269253788, 0.274394478}, // 12774K {0.269250759, 0.274390656}, // 12775K {0.269247731, 0.274386834}, // 12776K {0.269244703, 0.274383014}, // 12777K {0.269241676, 0.274379194}, // 12778K {0.26923865, 0.274375374}, // 12779K {0.269235624, 0.274371556}, // 12780K {0.269232598, 0.274367737}, // 12781K {0.269229573, 0.27436392}, // 12782K {0.269226549, 0.274360103}, // 12783K {0.269223526, 0.274356287}, // 12784K {0.269220502, 0.274352472}, // 12785K {0.26921748, 0.274348657}, // 12786K {0.269214458, 0.274344843}, // 12787K {0.269211437, 0.27434103}, // 12788K {0.269208416, 0.274337217}, // 12789K {0.269205396, 0.274333405}, // 12790K {0.269202376, 0.274329594}, // 12791K {0.269199357, 0.274325783}, // 12792K {0.269196339, 0.274321973}, // 12793K {0.269193321, 0.274318164}, // 12794K {0.269190304, 0.274314355}, // 12795K {0.269187287, 0.274310547}, // 12796K {0.269184271, 0.274306739}, // 12797K {0.269181256, 0.274302933}, // 12798K {0.269178241, 0.274299127}, // 12799K {0.269175226, 0.274295321}, // 12800K {0.269172212, 0.274291516}, // 12801K {0.269169199, 0.274287712}, // 12802K {0.269166187, 0.274283909}, // 12803K {0.269163174, 0.274280106}, // 12804K {0.269160163, 0.274276304}, // 12805K {0.269157152, 0.274272502}, // 12806K {0.269154142, 0.274268702}, // 12807K {0.269151132, 0.274264902}, // 12808K {0.269148123, 0.274261102}, // 12809K {0.269145114, 0.274257303}, // 12810K {0.269142106, 0.274253505}, // 12811K {0.269139099, 0.274249708}, // 12812K {0.269136092, 0.274245911}, // 12813K {0.269133086, 0.274242115}, // 12814K {0.26913008, 0.274238319}, // 12815K {0.269127075, 0.274234524}, // 12816K {0.26912407, 0.27423073}, // 12817K {0.269121066, 0.274226937}, // 12818K {0.269118063, 0.274223144}, // 12819K {0.26911506, 0.274219352}, // 12820K {0.269112058, 0.27421556}, // 12821K {0.269109056, 0.274211769}, // 12822K {0.269106055, 0.274207979}, // 12823K {0.269103054, 0.274204189}, // 12824K {0.269100054, 0.2742004}, // 12825K {0.269097055, 0.274196612}, // 12826K {0.269094056, 0.274192825}, // 12827K {0.269091058, 0.274189038}, // 12828K {0.26908806, 0.274185251}, // 12829K {0.269085063, 0.274181466}, // 12830K {0.269082066, 0.274177681}, // 12831K {0.26907907, 0.274173896}, // 12832K {0.269076075, 0.274170113}, // 12833K {0.26907308, 0.27416633}, // 12834K {0.269070086, 0.274162547}, // 12835K {0.269067092, 0.274158766}, // 12836K {0.269064099, 0.274154985}, // 12837K {0.269061106, 0.274151204}, // 12838K {0.269058114, 0.274147425}, // 12839K {0.269055123, 0.274143646}, // 12840K {0.269052132, 0.274139867}, // 12841K {0.269049142, 0.274136089}, // 12842K {0.269046152, 0.274132312}, // 12843K {0.269043163, 0.274128536}, // 12844K {0.269040175, 0.27412476}, // 12845K {0.269037187, 0.274120985}, // 12846K {0.269034199, 0.27411721}, // 12847K {0.269031212, 0.274113437}, // 12848K {0.269028226, 0.274109663}, // 12849K {0.26902524, 0.274105891}, // 12850K {0.269022255, 0.274102119}, // 12851K {0.269019271, 0.274098348}, // 12852K {0.269016287, 0.274094577}, // 12853K {0.269013303, 0.274090807}, // 12854K {0.269010321, 0.274087038}, // 12855K {0.269007338, 0.27408327}, // 12856K {0.269004357, 0.274079502}, // 12857K {0.269001375, 0.274075734}, // 12858K {0.268998395, 0.274071968}, // 12859K {0.268995415, 0.274068202}, // 12860K {0.268992435, 0.274064436}, // 12861K {0.268989457, 0.274060672}, // 12862K {0.268986478, 0.274056908}, // 12863K {0.268983501, 0.274053144}, // 12864K {0.268980523, 0.274049382}, // 12865K {0.268977547, 0.27404562}, // 12866K {0.268974571, 0.274041858}, // 12867K {0.268971595, 0.274038097}, // 12868K {0.26896862, 0.274034337}, // 12869K {0.268965646, 0.274030578}, // 12870K {0.268962672, 0.274026819}, // 12871K {0.268959699, 0.274023061}, // 12872K {0.268956726, 0.274019303}, // 12873K {0.268953754, 0.274015546}, // 12874K {0.268950783, 0.27401179}, // 12875K {0.268947812, 0.274008035}, // 12876K {0.268944842, 0.27400428}, // 12877K {0.268941872, 0.274000526}, // 12878K {0.268938903, 0.273996772}, // 12879K {0.268935934, 0.273993019}, // 12880K {0.268932966, 0.273989267}, // 12881K {0.268929998, 0.273985515}, // 12882K {0.268927031, 0.273981764}, // 12883K {0.268924065, 0.273978014}, // 12884K {0.268921099, 0.273974264}, // 12885K {0.268918134, 0.273970515}, // 12886K {0.268915169, 0.273966766}, // 12887K {0.268912205, 0.273963019}, // 12888K {0.268909241, 0.273959272}, // 12889K {0.268906278, 0.273955525}, // 12890K {0.268903316, 0.273951779}, // 12891K {0.268900354, 0.273948034}, // 12892K {0.268897392, 0.27394429}, // 12893K {0.268894432, 0.273940546}, // 12894K {0.268891471, 0.273936802}, // 12895K {0.268888512, 0.27393306}, // 12896K {0.268885553, 0.273929318}, // 12897K {0.268882594, 0.273925577}, // 12898K {0.268879636, 0.273921836}, // 12899K {0.268876679, 0.273918096}, // 12900K {0.268873722, 0.273914357}, // 12901K {0.268870766, 0.273910618}, // 12902K {0.26886781, 0.27390688}, // 12903K {0.268864855, 0.273903142}, // 12904K {0.2688619, 0.273899406}, // 12905K {0.268858946, 0.27389567}, // 12906K {0.268855993, 0.273891934}, // 12907K {0.26885304, 0.273888199}, // 12908K {0.268850088, 0.273884465}, // 12909K {0.268847136, 0.273880731}, // 12910K {0.268844184, 0.273876999}, // 12911K {0.268841234, 0.273873266}, // 12912K {0.268838284, 0.273869535}, // 12913K {0.268835334, 0.273865804}, // 12914K {0.268832385, 0.273862073}, // 12915K {0.268829437, 0.273858344}, // 12916K {0.268826489, 0.273854615}, // 12917K {0.268823542, 0.273850886}, // 12918K {0.268820595, 0.273847159}, // 12919K {0.268817649, 0.273843431}, // 12920K {0.268814703, 0.273839705}, // 12921K {0.268811758, 0.273835979}, // 12922K {0.268808813, 0.273832254}, // 12923K {0.268805869, 0.273828529}, // 12924K {0.268802926, 0.273824806}, // 12925K {0.268799983, 0.273821082}, // 12926K {0.268797041, 0.27381736}, // 12927K {0.268794099, 0.273813638}, // 12928K {0.268791158, 0.273809916}, // 12929K {0.268788217, 0.273806196}, // 12930K {0.268785277, 0.273802476}, // 12931K {0.268782338, 0.273798756}, // 12932K {0.268779399, 0.273795038}, // 12933K {0.268776461, 0.273791319}, // 12934K {0.268773523, 0.273787602}, // 12935K {0.268770585, 0.273783885}, // 12936K {0.268767649, 0.273780169}, // 12937K {0.268764713, 0.273776453}, // 12938K {0.268761777, 0.273772738}, // 12939K {0.268758842, 0.273769024}, // 12940K {0.268755908, 0.273765311}, // 12941K {0.268752974, 0.273761598}, // 12942K {0.26875004, 0.273757885}, // 12943K {0.268747107, 0.273754173}, // 12944K {0.268744175, 0.273750462}, // 12945K {0.268741243, 0.273746752}, // 12946K {0.268738312, 0.273743042}, // 12947K {0.268735382, 0.273739333}, // 12948K {0.268732452, 0.273735624}, // 12949K {0.268729522, 0.273731917}, // 12950K {0.268726593, 0.273728209}, // 12951K {0.268723665, 0.273724503}, // 12952K {0.268720737, 0.273720797}, // 12953K {0.26871781, 0.273717091}, // 12954K {0.268714883, 0.273713387}, // 12955K {0.268711957, 0.273709683}, // 12956K {0.268709031, 0.273705979}, // 12957K {0.268706106, 0.273702276}, // 12958K {0.268703182, 0.273698574}, // 12959K {0.268700258, 0.273694873}, // 12960K {0.268697334, 0.273691172}, // 12961K {0.268694411, 0.273687472}, // 12962K {0.268691489, 0.273683772}, // 12963K {0.268688567, 0.273680073}, // 12964K {0.268685646, 0.273676375}, // 12965K {0.268682726, 0.273672677}, // 12966K {0.268679806, 0.27366898}, // 12967K {0.268676886, 0.273665284}, // 12968K {0.268673967, 0.273661588}, // 12969K {0.268671049, 0.273657893}, // 12970K {0.268668131, 0.273654198}, // 12971K {0.268665213, 0.273650504}, // 12972K {0.268662297, 0.273646811}, // 12973K {0.26865938, 0.273643119}, // 12974K {0.268656465, 0.273639427}, // 12975K {0.26865355, 0.273635735}, // 12976K {0.268650635, 0.273632045}, // 12977K {0.268647721, 0.273628355}, // 12978K {0.268644808, 0.273624665}, // 12979K {0.268641895, 0.273620976}, // 12980K {0.268638982, 0.273617288}, // 12981K {0.26863607, 0.273613601}, // 12982K {0.268633159, 0.273609914}, // 12983K {0.268630248, 0.273606227}, // 12984K {0.268627338, 0.273602542}, // 12985K {0.268624429, 0.273598857}, // 12986K {0.26862152, 0.273595172}, // 12987K {0.268618611, 0.273591489}, // 12988K {0.268615703, 0.273587806}, // 12989K {0.268612796, 0.273584123}, // 12990K {0.268609889, 0.273580441}, // 12991K {0.268606982, 0.27357676}, // 12992K {0.268604077, 0.27357308}, // 12993K {0.268601171, 0.2735694}, // 12994K {0.268598267, 0.27356572}, // 12995K {0.268595363, 0.273562042}, // 12996K {0.268592459, 0.273558364}, // 12997K {0.268589556, 0.273554686}, // 12998K {0.268586653, 0.273551009}, // 12999K {0.268583751, 0.273547333}, // 13000K {0.26858085, 0.273543658}, // 13001K {0.268577949, 0.273539983}, // 13002K {0.268575049, 0.273536309}, // 13003K {0.268572149, 0.273532635}, // 13004K {0.26856925, 0.273528962}, // 13005K {0.268566351, 0.27352529}, // 13006K {0.268563453, 0.273521618}, // 13007K {0.268560556, 0.273517947}, // 13008K {0.268557659, 0.273514276}, // 13009K {0.268554762, 0.273510606}, // 13010K {0.268551866, 0.273506937}, // 13011K {0.268548971, 0.273503269}, // 13012K {0.268546076, 0.273499601}, // 13013K {0.268543182, 0.273495933}, // 13014K {0.268540288, 0.273492267}, // 13015K {0.268537395, 0.273488601}, // 13016K {0.268534502, 0.273484935}, // 13017K {0.26853161, 0.27348127}, // 13018K {0.268528718, 0.273477606}, // 13019K {0.268525827, 0.273473943}, // 13020K {0.268522937, 0.27347028}, // 13021K {0.268520047, 0.273466617}, // 13022K {0.268517157, 0.273462956}, // 13023K {0.268514268, 0.273459295}, // 13024K {0.26851138, 0.273455634}, // 13025K {0.268508492, 0.273451974}, // 13026K {0.268505605, 0.273448315}, // 13027K {0.268502718, 0.273444657}, // 13028K {0.268499832, 0.273440999}, // 13029K {0.268496947, 0.273437341}, // 13030K {0.268494062, 0.273433685}, // 13031K {0.268491177, 0.273430029}, // 13032K {0.268488293, 0.273426373}, // 13033K {0.26848541, 0.273422719}, // 13034K {0.268482527, 0.273419064}, // 13035K {0.268479644, 0.273415411}, // 13036K {0.268476763, 0.273411758}, // 13037K {0.268473881, 0.273408106}, // 13038K {0.268471001, 0.273404454}, // 13039K {0.26846812, 0.273400803}, // 13040K {0.268465241, 0.273397153}, // 13041K {0.268462362, 0.273393503}, // 13042K {0.268459483, 0.273389854}, // 13043K {0.268456605, 0.273386205}, // 13044K {0.268453728, 0.273382557}, // 13045K {0.268450851, 0.27337891}, // 13046K {0.268447974, 0.273375263}, // 13047K {0.268445098, 0.273371617}, // 13048K {0.268442223, 0.273367972}, // 13049K {0.268439348, 0.273364327}, // 13050K {0.268436474, 0.273360683}, // 13051K {0.2684336, 0.273357039}, // 13052K {0.268430727, 0.273353396}, // 13053K {0.268427855, 0.273349754}, // 13054K {0.268424983, 0.273346112}, // 13055K {0.268422111, 0.273342471}, // 13056K {0.26841924, 0.273338831}, // 13057K {0.26841637, 0.273335191}, // 13058K {0.2684135, 0.273331552}, // 13059K {0.26841063, 0.273327913}, // 13060K {0.268407761, 0.273324275}, // 13061K {0.268404893, 0.273320638}, // 13062K {0.268402025, 0.273317001}, // 13063K {0.268399158, 0.273313365}, // 13064K {0.268396291, 0.27330973}, // 13065K {0.268393425, 0.273306095}, // 13066K {0.26839056, 0.273302461}, // 13067K {0.268387695, 0.273298827}, // 13068K {0.26838483, 0.273295194}, // 13069K {0.268381966, 0.273291562}, // 13070K {0.268379103, 0.27328793}, // 13071K {0.26837624, 0.273284299}, // 13072K {0.268373377, 0.273280668}, // 13073K {0.268370515, 0.273277039}, // 13074K {0.268367654, 0.273273409}, // 13075K {0.268364793, 0.273269781}, // 13076K {0.268361933, 0.273266153}, // 13077K {0.268359073, 0.273262525}, // 13078K {0.268356214, 0.273258899}, // 13079K {0.268353355, 0.273255272}, // 13080K {0.268350497, 0.273251647}, // 13081K {0.26834764, 0.273248022}, // 13082K {0.268344783, 0.273244398}, // 13083K {0.268341926, 0.273240774}, // 13084K {0.26833907, 0.273237151}, // 13085K {0.268336215, 0.273233528}, // 13086K {0.26833336, 0.273229907}, // 13087K {0.268330505, 0.273226285}, // 13088K {0.268327652, 0.273222665}, // 13089K {0.268324798, 0.273219045}, // 13090K {0.268321946, 0.273215425}, // 13091K {0.268319093, 0.273211807}, // 13092K {0.268316242, 0.273208189}, // 13093K {0.26831339, 0.273204571}, // 13094K {0.26831054, 0.273200954}, // 13095K {0.26830769, 0.273197338}, // 13096K {0.26830484, 0.273193722}, // 13097K {0.268301991, 0.273190107}, // 13098K {0.268299143, 0.273186493}, // 13099K {0.268296295, 0.273182879}, // 13100K {0.268293447, 0.273179266}, // 13101K {0.2682906, 0.273175653}, // 13102K {0.268287754, 0.273172041}, // 13103K {0.268284908, 0.27316843}, // 13104K {0.268282063, 0.273164819}, // 13105K {0.268279218, 0.273161209}, // 13106K {0.268276374, 0.273157599}, // 13107K {0.26827353, 0.273153991}, // 13108K {0.268270687, 0.273150382}, // 13109K {0.268267844, 0.273146775}, // 13110K {0.268265002, 0.273143168}, // 13111K {0.268262161, 0.273139561}, // 13112K {0.26825932, 0.273135955}, // 13113K {0.268256479, 0.27313235}, // 13114K {0.268253639, 0.273128746}, // 13115K {0.2682508, 0.273125142}, // 13116K {0.268247961, 0.273121538}, // 13117K {0.268245122, 0.273117935}, // 13118K {0.268242284, 0.273114333}, // 13119K {0.268239447, 0.273110732}, // 13120K {0.26823661, 0.273107131}, // 13121K {0.268233774, 0.273103531}, // 13122K {0.268230938, 0.273099931}, // 13123K {0.268228103, 0.273096332}, // 13124K {0.268225268, 0.273092733}, // 13125K {0.268222434, 0.273089136}, // 13126K {0.2682196, 0.273085538}, // 13127K {0.268216767, 0.273081942}, // 13128K {0.268213935, 0.273078346}, // 13129K {0.268211103, 0.27307475}, // 13130K {0.268208271, 0.273071155}, // 13131K {0.26820544, 0.273067561}, // 13132K {0.26820261, 0.273063968}, // 13133K {0.26819978, 0.273060375}, // 13134K {0.26819695, 0.273056782}, // 13135K {0.268194121, 0.273053191}, // 13136K {0.268191293, 0.2730496}, // 13137K {0.268188465, 0.273046009}, // 13138K {0.268185638, 0.273042419}, // 13139K {0.268182811, 0.27303883}, // 13140K {0.268179985, 0.273035241}, // 13141K {0.268177159, 0.273031653}, // 13142K {0.268174334, 0.273028066}, // 13143K {0.268171509, 0.273024479}, // 13144K {0.268168685, 0.273020893}, // 13145K {0.268165862, 0.273017307}, // 13146K {0.268163039, 0.273013722}, // 13147K {0.268160216, 0.273010137}, // 13148K {0.268157394, 0.273006554}, // 13149K {0.268154572, 0.27300297}, // 13150K {0.268151751, 0.272999388}, // 13151K {0.268148931, 0.272995806}, // 13152K {0.268146111, 0.272992225}, // 13153K {0.268143292, 0.272988644}, // 13154K {0.268140473, 0.272985064}, // 13155K {0.268137654, 0.272981484}, // 13156K {0.268134837, 0.272977905}, // 13157K {0.268132019, 0.272974327}, // 13158K {0.268129203, 0.272970749}, // 13159K {0.268126386, 0.272967172}, // 13160K {0.268123571, 0.272963595}, // 13161K {0.268120755, 0.27296002}, // 13162K {0.268117941, 0.272956444}, // 13163K {0.268115126, 0.27295287}, // 13164K {0.268112313, 0.272949295}, // 13165K {0.2681095, 0.272945722}, // 13166K {0.268106687, 0.272942149}, // 13167K {0.268103875, 0.272938577}, // 13168K {0.268101063, 0.272935005}, // 13169K {0.268098252, 0.272931434}, // 13170K {0.268095442, 0.272927864}, // 13171K {0.268092632, 0.272924294}, // 13172K {0.268089823, 0.272920725}, // 13173K {0.268087014, 0.272917156}, // 13174K {0.268084205, 0.272913588}, // 13175K {0.268081397, 0.27291002}, // 13176K {0.26807859, 0.272906454}, // 13177K {0.268075783, 0.272902887}, // 13178K {0.268072977, 0.272899322}, // 13179K {0.268070171, 0.272895757}, // 13180K {0.268067366, 0.272892192}, // 13181K {0.268064561, 0.272888629}, // 13182K {0.268061757, 0.272885065}, // 13183K {0.268058953, 0.272881503}, // 13184K {0.26805615, 0.272877941}, // 13185K {0.268053347, 0.272874379}, // 13186K {0.268050545, 0.272870819}, // 13187K {0.268047743, 0.272867259}, // 13188K {0.268044942, 0.272863699}, // 13189K {0.268042142, 0.27286014}, // 13190K {0.268039341, 0.272856582}, // 13191K {0.268036542, 0.272853024}, // 13192K {0.268033743, 0.272849467}, // 13193K {0.268030944, 0.27284591}, // 13194K {0.268028146, 0.272842354}, // 13195K {0.268025349, 0.272838799}, // 13196K {0.268022552, 0.272835244}, // 13197K {0.268019756, 0.27283169}, // 13198K {0.26801696, 0.272828136}, // 13199K {0.268014164, 0.272824583}, // 13200K {0.268011369, 0.272821031}, // 13201K {0.268008575, 0.272817479}, // 13202K {0.268005781, 0.272813928}, // 13203K {0.268002988, 0.272810378}, // 13204K {0.268000195, 0.272806828}, // 13205K {0.267997403, 0.272803278}, // 13206K {0.267994611, 0.27279973}, // 13207K {0.26799182, 0.272796181}, // 13208K {0.267989029, 0.272792634}, // 13209K {0.267986239, 0.272789087}, // 13210K {0.267983449, 0.272785541}, // 13211K {0.26798066, 0.272781995}, // 13212K {0.267977871, 0.27277845}, // 13213K {0.267975083, 0.272774905}, // 13214K {0.267972295, 0.272771361}, // 13215K {0.267969508, 0.272767818}, // 13216K {0.267966722, 0.272764275}, // 13217K {0.267963936, 0.272760733}, // 13218K {0.26796115, 0.272757191}, // 13219K {0.267958365, 0.27275365}, // 13220K {0.26795558, 0.27275011}, // 13221K {0.267952796, 0.27274657}, // 13222K {0.267950013, 0.272743031}, // 13223K {0.26794723, 0.272739493}, // 13224K {0.267944447, 0.272735955}, // 13225K {0.267941665, 0.272732417}, // 13226K {0.267938884, 0.272728881}, // 13227K {0.267936103, 0.272725344}, // 13228K {0.267933323, 0.272721809}, // 13229K {0.267930543, 0.272718274}, // 13230K {0.267927763, 0.27271474}, // 13231K {0.267924984, 0.272711206}, // 13232K {0.267922206, 0.272707673}, // 13233K {0.267919428, 0.27270414}, // 13234K {0.267916651, 0.272700608}, // 13235K {0.267913874, 0.272697077}, // 13236K {0.267911098, 0.272693546}, // 13237K {0.267908322, 0.272690016}, // 13238K {0.267905547, 0.272686486}, // 13239K {0.267902772, 0.272682957}, // 13240K {0.267899998, 0.272679429}, // 13241K {0.267897224, 0.272675901}, // 13242K {0.267894451, 0.272672374}, // 13243K {0.267891678, 0.272668847}, // 13244K {0.267888906, 0.272665321}, // 13245K {0.267886134, 0.272661795}, // 13246K {0.267883363, 0.272658271}, // 13247K {0.267880592, 0.272654746}, // 13248K {0.267877822, 0.272651223}, // 13249K {0.267875053, 0.2726477}, // 13250K {0.267872283, 0.272644177}, // 13251K {0.267869515, 0.272640655}, // 13252K {0.267866747, 0.272637134}, // 13253K {0.267863979, 0.272633613}, // 13254K {0.267861212, 0.272630093}, // 13255K {0.267858445, 0.272626574}, // 13256K {0.267855679, 0.272623055}, // 13257K {0.267852914, 0.272619537}, // 13258K {0.267850149, 0.272616019}, // 13259K {0.267847384, 0.272612502}, // 13260K {0.26784462, 0.272608985}, // 13261K {0.267841857, 0.272605469}, // 13262K {0.267839094, 0.272601954}, // 13263K {0.267836331, 0.272598439}, // 13264K {0.267833569, 0.272594925}, // 13265K {0.267830808, 0.272591411}, // 13266K {0.267828047, 0.272587899}, // 13267K {0.267825286, 0.272584386}, // 13268K {0.267822527, 0.272580874}, // 13269K {0.267819767, 0.272577363}, // 13270K {0.267817008, 0.272573853}, // 13271K {0.26781425, 0.272570343}, // 13272K {0.267811492, 0.272566833}, // 13273K {0.267808735, 0.272563324}, // 13274K {0.267805978, 0.272559816}, // 13275K {0.267803221, 0.272556308}, // 13276K {0.267800465, 0.272552801}, // 13277K {0.26779771, 0.272549295}, // 13278K {0.267794955, 0.272545789}, // 13279K {0.267792201, 0.272542284}, // 13280K {0.267789447, 0.272538779}, // 13281K {0.267786694, 0.272535275}, // 13282K {0.267783941, 0.272531771}, // 13283K {0.267781189, 0.272528268}, // 13284K {0.267778437, 0.272524766}, // 13285K {0.267775685, 0.272521264}, // 13286K {0.267772935, 0.272517763}, // 13287K {0.267770184, 0.272514263}, // 13288K {0.267767435, 0.272510763}, // 13289K {0.267764685, 0.272507263}, // 13290K {0.267761937, 0.272503764}, // 13291K {0.267759188, 0.272500266}, // 13292K {0.267756441, 0.272496769}, // 13293K {0.267753693, 0.272493271}, // 13294K {0.267750947, 0.272489775}, // 13295K {0.2677482, 0.272486279}, // 13296K {0.267745455, 0.272482784}, // 13297K {0.267742709, 0.272479289}, // 13298K {0.267739965, 0.272475795}, // 13299K {0.267737221, 0.272472302}, // 13300K {0.267734477, 0.272468809}, // 13301K {0.267731734, 0.272465316}, // 13302K {0.267728991, 0.272461825}, // 13303K {0.267726249, 0.272458333}, // 13304K {0.267723507, 0.272454843}, // 13305K {0.267720766, 0.272451353}, // 13306K {0.267718025, 0.272447863}, // 13307K {0.267715285, 0.272444375}, // 13308K {0.267712545, 0.272440886}, // 13309K {0.267709806, 0.272437399}, // 13310K {0.267707068, 0.272433912}, // 13311K {0.267704329, 0.272430425}, // 13312K {0.267701592, 0.272426939}, // 13313K {0.267698855, 0.272423454}, // 13314K {0.267696118, 0.272419969}, // 13315K {0.267693382, 0.272416485}, // 13316K {0.267690646, 0.272413002}, // 13317K {0.267687911, 0.272409519}, // 13318K {0.267685176, 0.272406036}, // 13319K {0.267682442, 0.272402554}, // 13320K {0.267679709, 0.272399073}, // 13321K {0.267676976, 0.272395593}, // 13322K {0.267674243, 0.272392112}, // 13323K {0.267671511, 0.272388633}, // 13324K {0.267668779, 0.272385154}, // 13325K {0.267666048, 0.272381676}, // 13326K {0.267663317, 0.272378198}, // 13327K {0.267660587, 0.272374721}, // 13328K {0.267657858, 0.272371244}, // 13329K {0.267655129, 0.272367769}, // 13330K {0.2676524, 0.272364293}, // 13331K {0.267649672, 0.272360818}, // 13332K {0.267646944, 0.272357344}, // 13333K {0.267644217, 0.272353871}, // 13334K {0.267641491, 0.272350397}, // 13335K {0.267638764, 0.272346925}, // 13336K {0.267636039, 0.272343453}, // 13337K {0.267633314, 0.272339982}, // 13338K {0.267630589, 0.272336511}, // 13339K {0.267627865, 0.272333041}, // 13340K {0.267625141, 0.272329571}, // 13341K {0.267622418, 0.272326102}, // 13342K {0.267619696, 0.272322634}, // 13343K {0.267616974, 0.272319166}, // 13344K {0.267614252, 0.272315699}, // 13345K {0.267611531, 0.272312232}, // 13346K {0.26760881, 0.272308766}, // 13347K {0.26760609, 0.272305301}, // 13348K {0.267603371, 0.272301836}, // 13349K {0.267600651, 0.272298372}, // 13350K {0.267597933, 0.272294908}, // 13351K {0.267595215, 0.272291445}, // 13352K {0.267592497, 0.272287982}, // 13353K {0.26758978, 0.27228452}, // 13354K {0.267587063, 0.272281059}, // 13355K {0.267584347, 0.272277598}, // 13356K {0.267581632, 0.272274138}, // 13357K {0.267578916, 0.272270678}, // 13358K {0.267576202, 0.272267219}, // 13359K {0.267573488, 0.27226376}, // 13360K {0.267570774, 0.272260302}, // 13361K {0.267568061, 0.272256845}, // 13362K {0.267565348, 0.272253388}, // 13363K {0.267562636, 0.272249932}, // 13364K {0.267559925, 0.272246476}, // 13365K {0.267557213, 0.272243021}, // 13366K {0.267554503, 0.272239567}, // 13367K {0.267551793, 0.272236113}, // 13368K {0.267549083, 0.27223266}, // 13369K {0.267546374, 0.272229207}, // 13370K {0.267543665, 0.272225755}, // 13371K {0.267540957, 0.272222303}, // 13372K {0.267538249, 0.272218852}, // 13373K {0.267535542, 0.272215402}, // 13374K {0.267532835, 0.272211952}, // 13375K {0.267530129, 0.272208503}, // 13376K {0.267527423, 0.272205054}, // 13377K {0.267524718, 0.272201606}, // 13378K {0.267522014, 0.272198158}, // 13379K {0.267519309, 0.272194711}, // 13380K {0.267516606, 0.272191265}, // 13381K {0.267513902, 0.272187819}, // 13382K {0.2675112, 0.272184374}, // 13383K {0.267508497, 0.272180929}, // 13384K {0.267505796, 0.272177485}, // 13385K {0.267503094, 0.272174041}, // 13386K {0.267500394, 0.272170599}, // 13387K {0.267497693, 0.272167156}, // 13388K {0.267494994, 0.272163714}, // 13389K {0.267492294, 0.272160273}, // 13390K {0.267489596, 0.272156833}, // 13391K {0.267486897, 0.272153392}, // 13392K {0.2674842, 0.272149953}, // 13393K {0.267481502, 0.272146514}, // 13394K {0.267478805, 0.272143076}, // 13395K {0.267476109, 0.272139638}, // 13396K {0.267473413, 0.272136201}, // 13397K {0.267470718, 0.272132764}, // 13398K {0.267468023, 0.272129328}, // 13399K {0.267465329, 0.272125893}, // 13400K {0.267462635, 0.272122458}, // 13401K {0.267459942, 0.272119023}, // 13402K {0.267457249, 0.27211559}, // 13403K {0.267454556, 0.272112156}, // 13404K {0.267451865, 0.272108724}, // 13405K {0.267449173, 0.272105292}, // 13406K {0.267446482, 0.27210186}, // 13407K {0.267443792, 0.272098429}, // 13408K {0.267441102, 0.272094999}, // 13409K {0.267438412, 0.272091569}, // 13410K {0.267435724, 0.27208814}, // 13411K {0.267433035, 0.272084712}, // 13412K {0.267430347, 0.272081284}, // 13413K {0.26742766, 0.272077856}, // 13414K {0.267424973, 0.272074429}, // 13415K {0.267422286, 0.272071003}, // 13416K {0.2674196, 0.272067577}, // 13417K {0.267416915, 0.272064152}, // 13418K {0.26741423, 0.272060727}, // 13419K {0.267411545, 0.272057303}, // 13420K {0.267408861, 0.27205388}, // 13421K {0.267406178, 0.272050457}, // 13422K {0.267403495, 0.272047035}, // 13423K {0.267400812, 0.272043613}, // 13424K {0.26739813, 0.272040192}, // 13425K {0.267395448, 0.272036771}, // 13426K {0.267392767, 0.272033351}, // 13427K {0.267390087, 0.272029932}, // 13428K {0.267387407, 0.272026513}, // 13429K {0.267384727, 0.272023095}, // 13430K {0.267382048, 0.272019677}, // 13431K {0.267379369, 0.27201626}, // 13432K {0.267376691, 0.272012843}, // 13433K {0.267374013, 0.272009427}, // 13434K {0.267371336, 0.272006012}, // 13435K {0.267368659, 0.272002597}, // 13436K {0.267365983, 0.271999182}, // 13437K {0.267363307, 0.271995769}, // 13438K {0.267360632, 0.271992355}, // 13439K {0.267357957, 0.271988943}, // 13440K {0.267355283, 0.271985531}, // 13441K {0.267352609, 0.271982119}, // 13442K {0.267349936, 0.271978708}, // 13443K {0.267347263, 0.271975298}, // 13444K {0.267344591, 0.271971888}, // 13445K {0.267341919, 0.271968479}, // 13446K {0.267339248, 0.27196507}, // 13447K {0.267336577, 0.271961662}, // 13448K {0.267333906, 0.271958255}, // 13449K {0.267331237, 0.271954848}, // 13450K {0.267328567, 0.271951441}, // 13451K {0.267325898, 0.271948035}, // 13452K {0.26732323, 0.27194463}, // 13453K {0.267320562, 0.271941225}, // 13454K {0.267317894, 0.271937821}, // 13455K {0.267315227, 0.271934418}, // 13456K {0.267312561, 0.271931015}, // 13457K {0.267309895, 0.271927612}, // 13458K {0.267307229, 0.27192421}, // 13459K {0.267304564, 0.271920809}, // 13460K {0.2673019, 0.271917408}, // 13461K {0.267299236, 0.271914008}, // 13462K {0.267296572, 0.271910609}, // 13463K {0.267293909, 0.27190721}, // 13464K {0.267291246, 0.271903811}, // 13465K {0.267288584, 0.271900413}, // 13466K {0.267285923, 0.271897016}, // 13467K {0.267283261, 0.271893619}, // 13468K {0.267280601, 0.271890223}, // 13469K {0.267277941, 0.271886827}, // 13470K {0.267275281, 0.271883432}, // 13471K {0.267272622, 0.271880038}, // 13472K {0.267269963, 0.271876644}, // 13473K {0.267267305, 0.27187325}, // 13474K {0.267264647, 0.271869858}, // 13475K {0.26726199, 0.271866465}, // 13476K {0.267259333, 0.271863074}, // 13477K {0.267256676, 0.271859682}, // 13478K {0.267254021, 0.271856292}, // 13479K {0.267251365, 0.271852902}, // 13480K {0.26724871, 0.271849512}, // 13481K {0.267246056, 0.271846124}, // 13482K {0.267243402, 0.271842735}, // 13483K {0.267240748, 0.271839348}, // 13484K {0.267238096, 0.27183596}, // 13485K {0.267235443, 0.271832574}, // 13486K {0.267232791, 0.271829188}, // 13487K {0.26723014, 0.271825802}, // 13488K {0.267227488, 0.271822417}, // 13489K {0.267224838, 0.271819033}, // 13490K {0.267222188, 0.271815649}, // 13491K {0.267219538, 0.271812266}, // 13492K {0.267216889, 0.271808883}, // 13493K {0.267214241, 0.271805501}, // 13494K {0.267211592, 0.271802119}, // 13495K {0.267208945, 0.271798738}, // 13496K {0.267206297, 0.271795358}, // 13497K {0.267203651, 0.271791978}, // 13498K {0.267201005, 0.271788599}, // 13499K {0.267198359, 0.27178522}, // 13500K {0.267195713, 0.271781842}, // 13501K {0.267193069, 0.271778464}, // 13502K {0.267190424, 0.271775087}, // 13503K {0.267187781, 0.27177171}, // 13504K {0.267185137, 0.271768334}, // 13505K {0.267182494, 0.271764959}, // 13506K {0.267179852, 0.271761584}, // 13507K {0.26717721, 0.27175821}, // 13508K {0.267174569, 0.271754836}, // 13509K {0.267171928, 0.271751463}, // 13510K {0.267169287, 0.27174809}, // 13511K {0.267166647, 0.271744718}, // 13512K {0.267164008, 0.271741347}, // 13513K {0.267161368, 0.271737976}, // 13514K {0.26715873, 0.271734605}, // 13515K {0.267156092, 0.271731236}, // 13516K {0.267153454, 0.271727866}, // 13517K {0.267150817, 0.271724498}, // 13518K {0.26714818, 0.271721129}, // 13519K {0.267145544, 0.271717762}, // 13520K {0.267142908, 0.271714395}, // 13521K {0.267140273, 0.271711028}, // 13522K {0.267137638, 0.271707662}, // 13523K {0.267135004, 0.271704297}, // 13524K {0.26713237, 0.271700932}, // 13525K {0.267129737, 0.271697568}, // 13526K {0.267127104, 0.271694204}, // 13527K {0.267124472, 0.271690841}, // 13528K {0.26712184, 0.271687479}, // 13529K {0.267119209, 0.271684117}, // 13530K {0.267116578, 0.271680755}, // 13531K {0.267113947, 0.271677394}, // 13532K {0.267111317, 0.271674034}, // 13533K {0.267108688, 0.271670674}, // 13534K {0.267106059, 0.271667315}, // 13535K {0.26710343, 0.271663956}, // 13536K {0.267100802, 0.271660598}, // 13537K {0.267098174, 0.27165724}, // 13538K {0.267095547, 0.271653883}, // 13539K {0.26709292, 0.271650527}, // 13540K {0.267090294, 0.271647171}, // 13541K {0.267087668, 0.271643816}, // 13542K {0.267085043, 0.271640461}, // 13543K {0.267082418, 0.271637107}, // 13544K {0.267079794, 0.271633753}, // 13545K {0.26707717, 0.2716304}, // 13546K {0.267074547, 0.271627047}, // 13547K {0.267071924, 0.271623695}, // 13548K {0.267069302, 0.271620344}, // 13549K {0.26706668, 0.271616993}, // 13550K {0.267064058, 0.271613642}, // 13551K {0.267061437, 0.271610293}, // 13552K {0.267058817, 0.271606943}, // 13553K {0.267056197, 0.271603595}, // 13554K {0.267053577, 0.271600247}, // 13555K {0.267050958, 0.271596899}, // 13556K {0.267048339, 0.271593552}, // 13557K {0.267045721, 0.271590205}, // 13558K {0.267043104, 0.271586859}, // 13559K {0.267040486, 0.271583514}, // 13560K {0.26703787, 0.271580169}, // 13561K {0.267035253, 0.271576825}, // 13562K {0.267032638, 0.271573481}, // 13563K {0.267030022, 0.271570138}, // 13564K {0.267027408, 0.271566795}, // 13565K {0.267024793, 0.271563453}, // 13566K {0.267022179, 0.271560112}, // 13567K {0.267019566, 0.271556771}, // 13568K {0.267016953, 0.27155343}, // 13569K {0.26701434, 0.271550091}, // 13570K {0.267011728, 0.271546751}, // 13571K {0.267009117, 0.271543413}, // 13572K {0.267006506, 0.271540074}, // 13573K {0.267003895, 0.271536737}, // 13574K {0.267001285, 0.2715334}, // 13575K {0.266998675, 0.271530063}, // 13576K {0.266996066, 0.271526727}, // 13577K {0.266993457, 0.271523391}, // 13578K {0.266990849, 0.271520057}, // 13579K {0.266988241, 0.271516722}, // 13580K {0.266985634, 0.271513388}, // 13581K {0.266983027, 0.271510055}, // 13582K {0.266980421, 0.271506722}, // 13583K {0.266977815, 0.27150339}, // 13584K {0.26697521, 0.271500059}, // 13585K {0.266972605, 0.271496728}, // 13586K {0.26697, 0.271493397}, // 13587K {0.266967396, 0.271490067}, // 13588K {0.266964792, 0.271486738}, // 13589K {0.266962189, 0.271483409}, // 13590K {0.266959587, 0.271480081}, // 13591K {0.266956985, 0.271476753}, // 13592K {0.266954383, 0.271473426}, // 13593K {0.266951782, 0.271470099}, // 13594K {0.266949181, 0.271466773}, // 13595K {0.266946581, 0.271463447}, // 13596K {0.266943981, 0.271460122}, // 13597K {0.266941381, 0.271456798}, // 13598K {0.266938783, 0.271453474}, // 13599K {0.266936184, 0.27145015}, // 13600K {0.266933586, 0.271446828}, // 13601K {0.266930989, 0.271443505}, // 13602K {0.266928392, 0.271440184}, // 13603K {0.266925795, 0.271436862}, // 13604K {0.266923199, 0.271433542}, // 13605K {0.266920604, 0.271430222}, // 13606K {0.266918008, 0.271426902}, // 13607K {0.266915414, 0.271423583}, // 13608K {0.26691282, 0.271420265}, // 13609K {0.266910226, 0.271416947}, // 13610K {0.266907632, 0.271413629}, // 13611K {0.26690504, 0.271410312}, // 13612K {0.266902447, 0.271406996}, // 13613K {0.266899855, 0.27140368}, // 13614K {0.266897264, 0.271400365}, // 13615K {0.266894673, 0.271397051}, // 13616K {0.266892083, 0.271393736}, // 13617K {0.266889493, 0.271390423}, // 13618K {0.266886903, 0.27138711}, // 13619K {0.266884314, 0.271383797}, // 13620K {0.266881725, 0.271380486}, // 13621K {0.266879137, 0.271377174}, // 13622K {0.266876549, 0.271373863}, // 13623K {0.266873962, 0.271370553}, // 13624K {0.266871375, 0.271367243}, // 13625K {0.266868789, 0.271363934}, // 13626K {0.266866203, 0.271360626}, // 13627K {0.266863618, 0.271357317}, // 13628K {0.266861033, 0.27135401}, // 13629K {0.266858449, 0.271350703}, // 13630K {0.266855865, 0.271347396}, // 13631K {0.266853281, 0.27134409}, // 13632K {0.266850698, 0.271340785}, // 13633K {0.266848115, 0.27133748}, // 13634K {0.266845533, 0.271334176}, // 13635K {0.266842952, 0.271330872}, // 13636K {0.26684037, 0.271327569}, // 13637K {0.26683779, 0.271324266}, // 13638K {0.266835209, 0.271320964}, // 13639K {0.26683263, 0.271317663}, // 13640K {0.26683005, 0.271314361}, // 13641K {0.266827471, 0.271311061}, // 13642K {0.266824893, 0.271307761}, // 13643K {0.266822315, 0.271304462}, // 13644K {0.266819738, 0.271301163}, // 13645K {0.26681716, 0.271297864}, // 13646K {0.266814584, 0.271294567}, // 13647K {0.266812008, 0.271291269}, // 13648K {0.266809432, 0.271287973}, // 13649K {0.266806857, 0.271284676}, // 13650K {0.266804282, 0.271281381}, // 13651K {0.266801708, 0.271278086}, // 13652K {0.266799134, 0.271274791}, // 13653K {0.266796561, 0.271271497}, // 13654K {0.266793988, 0.271268204}, // 13655K {0.266791415, 0.271264911}, // 13656K {0.266788844, 0.271261618}, // 13657K {0.266786272, 0.271258327}, // 13658K {0.266783701, 0.271255035}, // 13659K {0.26678113, 0.271251745}, // 13660K {0.26677856, 0.271248454}, // 13661K {0.266775991, 0.271245165}, // 13662K {0.266773421, 0.271241875}, // 13663K {0.266770853, 0.271238587}, // 13664K {0.266768284, 0.271235299}, // 13665K {0.266765717, 0.271232011}, // 13666K {0.266763149, 0.271228724}, // 13667K {0.266760582, 0.271225438}, // 13668K {0.266758016, 0.271222152}, // 13669K {0.26675545, 0.271218867}, // 13670K {0.266752884, 0.271215582}, // 13671K {0.266750319, 0.271212297}, // 13672K {0.266747755, 0.271209014}, // 13673K {0.26674519, 0.271205731}, // 13674K {0.266742627, 0.271202448}, // 13675K {0.266740064, 0.271199166}, // 13676K {0.266737501, 0.271195884}, // 13677K {0.266734938, 0.271192603}, // 13678K {0.266732377, 0.271189322}, // 13679K {0.266729815, 0.271186043}, // 13680K {0.266727254, 0.271182763}, // 13681K {0.266724694, 0.271179484}, // 13682K {0.266722134, 0.271176206}, // 13683K {0.266719574, 0.271172928}, // 13684K {0.266717015, 0.271169651}, // 13685K {0.266714456, 0.271166374}, // 13686K {0.266711898, 0.271163098}, // 13687K {0.26670934, 0.271159822}, // 13688K {0.266706783, 0.271156547}, // 13689K {0.266704226, 0.271153272}, // 13690K {0.26670167, 0.271149998}, // 13691K {0.266699114, 0.271146725}, // 13692K {0.266696559, 0.271143451}, // 13693K {0.266694004, 0.271140179}, // 13694K {0.266691449, 0.271136907}, // 13695K {0.266688895, 0.271133636}, // 13696K {0.266686341, 0.271130365}, // 13697K {0.266683788, 0.271127094}, // 13698K {0.266681235, 0.271123825}, // 13699K {0.266678683, 0.271120555}, // 13700K {0.266676131, 0.271117287}, // 13701K {0.26667358, 0.271114018}, // 13702K {0.266671029, 0.271110751}, // 13703K {0.266668479, 0.271107484}, // 13704K {0.266665929, 0.271104217}, // 13705K {0.266663379, 0.271100951}, // 13706K {0.26666083, 0.271097686}, // 13707K {0.266658281, 0.271094421}, // 13708K {0.266655733, 0.271091156}, // 13709K {0.266653186, 0.271087892}, // 13710K {0.266650638, 0.271084629}, // 13711K {0.266648091, 0.271081366}, // 13712K {0.266645545, 0.271078104}, // 13713K {0.266642999, 0.271074842}, // 13714K {0.266640454, 0.271071581}, // 13715K {0.266637909, 0.27106832}, // 13716K {0.266635364, 0.27106506}, // 13717K {0.26663282, 0.2710618}, // 13718K {0.266630276, 0.271058541}, // 13719K {0.266627733, 0.271055282}, // 13720K {0.266625191, 0.271052024}, // 13721K {0.266622648, 0.271048767}, // 13722K {0.266620106, 0.27104551}, // 13723K {0.266617565, 0.271042253}, // 13724K {0.266615024, 0.271038997}, // 13725K {0.266612484, 0.271035742}, // 13726K {0.266609944, 0.271032487}, // 13727K {0.266607404, 0.271029233}, // 13728K {0.266604865, 0.271025979}, // 13729K {0.266602326, 0.271022726}, // 13730K {0.266599788, 0.271019473}, // 13731K {0.26659725, 0.271016221}, // 13732K {0.266594713, 0.271012969}, // 13733K {0.266592176, 0.271009718}, // 13734K {0.26658964, 0.271006467}, // 13735K {0.266587104, 0.271003217}, // 13736K {0.266584568, 0.270999968}, // 13737K {0.266582033, 0.270996719}, // 13738K {0.266579499, 0.27099347}, // 13739K {0.266576965, 0.270990222}, // 13740K {0.266574431, 0.270986975}, // 13741K {0.266571898, 0.270983728}, // 13742K {0.266569365, 0.270980481}, // 13743K {0.266566833, 0.270977236}, // 13744K {0.266564301, 0.27097399}, // 13745K {0.266561769, 0.270970745}, // 13746K {0.266559238, 0.270967501}, // 13747K {0.266556708, 0.270964257}, // 13748K {0.266554178, 0.270961014}, // 13749K {0.266551648, 0.270957772}, // 13750K {0.266549119, 0.270954529}, // 13751K {0.26654659, 0.270951288}, // 13752K {0.266544062, 0.270948047}, // 13753K {0.266541534, 0.270944806}, // 13754K {0.266539007, 0.270941566}, // 13755K {0.26653648, 0.270938327}, // 13756K {0.266533953, 0.270935088}, // 13757K {0.266531427, 0.270931849}, // 13758K {0.266528902, 0.270928611}, // 13759K {0.266526377, 0.270925374}, // 13760K {0.266523852, 0.270922137}, // 13761K {0.266521328, 0.270918901}, // 13762K {0.266518804, 0.270915665}, // 13763K {0.26651628, 0.27091243}, // 13764K {0.266513758, 0.270909195}, // 13765K {0.266511235, 0.270905961}, // 13766K {0.266508713, 0.270902727}, // 13767K {0.266506192, 0.270899494}, // 13768K {0.26650367, 0.270896261}, // 13769K {0.26650115, 0.270893029}, // 13770K {0.26649863, 0.270889797}, // 13771K {0.26649611, 0.270886566}, // 13772K {0.26649359, 0.270883336}, // 13773K {0.266491072, 0.270880106}, // 13774K {0.266488553, 0.270876876}, // 13775K {0.266486035, 0.270873647}, // 13776K {0.266483518, 0.270870419}, // 13777K {0.266481001, 0.270867191}, // 13778K {0.266478484, 0.270863964}, // 13779K {0.266475968, 0.270860737}, // 13780K {0.266473452, 0.27085751}, // 13781K {0.266470937, 0.270854285}, // 13782K {0.266468422, 0.270851059}, // 13783K {0.266465907, 0.270847835}, // 13784K {0.266463393, 0.27084461}, // 13785K {0.26646088, 0.270841387}, // 13786K {0.266458367, 0.270838163}, // 13787K {0.266455854, 0.270834941}, // 13788K {0.266453342, 0.270831719}, // 13789K {0.26645083, 0.270828497}, // 13790K {0.266448319, 0.270825276}, // 13791K {0.266445808, 0.270822055}, // 13792K {0.266443298, 0.270818835}, // 13793K {0.266440788, 0.270815616}, // 13794K {0.266438278, 0.270812397}, // 13795K {0.266435769, 0.270809178}, // 13796K {0.266433261, 0.27080596}, // 13797K {0.266430753, 0.270802743}, // 13798K {0.266428245, 0.270799526}, // 13799K {0.266425738, 0.27079631}, // 13800K {0.266423231, 0.270793094}, // 13801K {0.266420724, 0.270789879}, // 13802K {0.266418218, 0.270786664}, // 13803K {0.266415713, 0.270783449}, // 13804K {0.266413208, 0.270780236}, // 13805K {0.266410703, 0.270777022}, // 13806K {0.266408199, 0.27077381}, // 13807K {0.266405695, 0.270770597}, // 13808K {0.266403192, 0.270767386}, // 13809K {0.266400689, 0.270764175}, // 13810K {0.266398187, 0.270760964}, // 13811K {0.266395685, 0.270757754}, // 13812K {0.266393183, 0.270754544}, // 13813K {0.266390682, 0.270751335}, // 13814K {0.266388181, 0.270748127}, // 13815K {0.266385681, 0.270744919}, // 13816K {0.266383182, 0.270741711}, // 13817K {0.266380682, 0.270738504}, // 13818K {0.266378183, 0.270735298}, // 13819K {0.266375685, 0.270732092}, // 13820K {0.266373187, 0.270728886}, // 13821K {0.266370689, 0.270725681}, // 13822K {0.266368192, 0.270722477}, // 13823K {0.266365696, 0.270719273}, // 13824K {0.266363199, 0.27071607}, // 13825K {0.266360704, 0.270712867}, // 13826K {0.266358208, 0.270709665}, // 13827K {0.266355713, 0.270706463}, // 13828K {0.266353219, 0.270703262}, // 13829K {0.266350725, 0.270700061}, // 13830K {0.266348231, 0.270696861}, // 13831K {0.266345738, 0.270693661}, // 13832K {0.266343246, 0.270690462}, // 13833K {0.266340753, 0.270687263}, // 13834K {0.266338262, 0.270684065}, // 13835K {0.26633577, 0.270680867}, // 13836K {0.266333279, 0.27067767}, // 13837K {0.266330789, 0.270674473}, // 13838K {0.266328299, 0.270671277}, // 13839K {0.266325809, 0.270668082}, // 13840K {0.26632332, 0.270664887}, // 13841K {0.266320831, 0.270661692}, // 13842K {0.266318343, 0.270658498}, // 13843K {0.266315855, 0.270655305}, // 13844K {0.266313368, 0.270652112}, // 13845K {0.266310881, 0.270648919}, // 13846K {0.266308394, 0.270645727}, // 13847K {0.266305908, 0.270642536}, // 13848K {0.266303422, 0.270639345}, // 13849K {0.266300937, 0.270636155}, // 13850K {0.266298452, 0.270632965}, // 13851K {0.266295968, 0.270629775}, // 13852K {0.266293484, 0.270626587}, // 13853K {0.266291001, 0.270623398}, // 13854K {0.266288518, 0.27062021}, // 13855K {0.266286035, 0.270617023}, // 13856K {0.266283553, 0.270613836}, // 13857K {0.266281071, 0.27061065}, // 13858K {0.26627859, 0.270607464}, // 13859K {0.266276109, 0.270604279}, // 13860K {0.266273629, 0.270601094}, // 13861K {0.266271149, 0.27059791}, // 13862K {0.266268669, 0.270594727}, // 13863K {0.26626619, 0.270591543}, // 13864K {0.266263711, 0.270588361}, // 13865K {0.266261233, 0.270585179}, // 13866K {0.266258755, 0.270581997}, // 13867K {0.266256278, 0.270578816}, // 13868K {0.266253801, 0.270575635}, // 13869K {0.266251325, 0.270572455}, // 13870K {0.266248849, 0.270569276}, // 13871K {0.266246373, 0.270566097}, // 13872K {0.266243898, 0.270562918}, // 13873K {0.266241423, 0.27055974}, // 13874K {0.266238949, 0.270556563}, // 13875K {0.266236475, 0.270553386}, // 13876K {0.266234002, 0.270550209}, // 13877K {0.266231529, 0.270547033}, // 13878K {0.266229056, 0.270543858}, // 13879K {0.266226584, 0.270540683}, // 13880K {0.266224112, 0.270537508}, // 13881K {0.266221641, 0.270534334}, // 13882K {0.26621917, 0.270531161}, // 13883K {0.2662167, 0.270527988}, // 13884K {0.26621423, 0.270524816}, // 13885K {0.266211761, 0.270521644}, // 13886K {0.266209291, 0.270518473}, // 13887K {0.266206823, 0.270515302}, // 13888K {0.266204355, 0.270512131}, // 13889K {0.266201887, 0.270508962}, // 13890K {0.26619942, 0.270505792}, // 13891K {0.266196953, 0.270502624}, // 13892K {0.266194486, 0.270499455}, // 13893K {0.26619202, 0.270496287}, // 13894K {0.266189555, 0.27049312}, // 13895K {0.266187089, 0.270489953}, // 13896K {0.266184625, 0.270486787}, // 13897K {0.26618216, 0.270483622}, // 13898K {0.266179697, 0.270480456}, // 13899K {0.266177233, 0.270477292}, // 13900K {0.26617477, 0.270474127}, // 13901K {0.266172308, 0.270470964}, // 13902K {0.266169845, 0.270467801}, // 13903K {0.266167384, 0.270464638}, // 13904K {0.266164922, 0.270461476}, // 13905K {0.266162462, 0.270458314}, // 13906K {0.266160001, 0.270455153}, // 13907K {0.266157541, 0.270451992}, // 13908K {0.266155082, 0.270448832}, // 13909K {0.266152623, 0.270445673}, // 13910K {0.266150164, 0.270442514}, // 13911K {0.266147706, 0.270439355}, // 13912K {0.266145248, 0.270436197}, // 13913K {0.266142791, 0.27043304}, // 13914K {0.266140334, 0.270429882}, // 13915K {0.266137877, 0.270426726}, // 13916K {0.266135421, 0.27042357}, // 13917K {0.266132965, 0.270420414}, // 13918K {0.26613051, 0.270417259}, // 13919K {0.266128055, 0.270414105}, // 13920K {0.266125601, 0.270410951}, // 13921K {0.266123147, 0.270407797}, // 13922K {0.266120694, 0.270404644}, // 13923K {0.266118241, 0.270401492}, // 13924K {0.266115788, 0.27039834}, // 13925K {0.266113336, 0.270395189}, // 13926K {0.266110884, 0.270392038}, // 13927K {0.266108433, 0.270388887}, // 13928K {0.266105982, 0.270385737}, // 13929K {0.266103531, 0.270382588}, // 13930K {0.266101081, 0.270379439}, // 13931K {0.266098632, 0.270376291}, // 13932K {0.266096182, 0.270373143}, // 13933K {0.266093734, 0.270369995}, // 13934K {0.266091285, 0.270366848}, // 13935K {0.266088837, 0.270363702}, // 13936K {0.26608639, 0.270360556}, // 13937K {0.266083943, 0.270357411}, // 13938K {0.266081496, 0.270354266}, // 13939K {0.26607905, 0.270351122}, // 13940K {0.266076604, 0.270347978}, // 13941K {0.266074159, 0.270344834}, // 13942K {0.266071714, 0.270341692}, // 13943K {0.26606927, 0.270338549}, // 13944K {0.266066825, 0.270335407}, // 13945K {0.266064382, 0.270332266}, // 13946K {0.266061939, 0.270329125}, // 13947K {0.266059496, 0.270325985}, // 13948K {0.266057054, 0.270322845}, // 13949K {0.266054612, 0.270319706}, // 13950K {0.26605217, 0.270316567}, // 13951K {0.266049729, 0.270313429}, // 13952K {0.266047288, 0.270310291}, // 13953K {0.266044848, 0.270307154}, // 13954K {0.266042409, 0.270304017}, // 13955K {0.266039969, 0.270300881}, // 13956K {0.26603753, 0.270297745}, // 13957K {0.266035092, 0.27029461}, // 13958K {0.266032654, 0.270291475}, // 13959K {0.266030216, 0.270288341}, // 13960K {0.266027779, 0.270285207}, // 13961K {0.266025342, 0.270282074}, // 13962K {0.266022906, 0.270278941}, // 13963K {0.26602047, 0.270275809}, // 13964K {0.266018034, 0.270272677}, // 13965K {0.266015599, 0.270269546}, // 13966K {0.266013165, 0.270266415}, // 13967K {0.26601073, 0.270263285}, // 13968K {0.266008297, 0.270260155}, // 13969K {0.266005863, 0.270257026}, // 13970K {0.26600343, 0.270253897}, // 13971K {0.266000998, 0.270250769}, // 13972K {0.265998566, 0.270247641}, // 13973K {0.265996134, 0.270244514}, // 13974K {0.265993703, 0.270241388}, // 13975K {0.265991272, 0.270238261}, // 13976K {0.265988841, 0.270235136}, // 13977K {0.265986411, 0.27023201}, // 13978K {0.265983982, 0.270228886}, // 13979K {0.265981553, 0.270225762}, // 13980K {0.265979124, 0.270222638}, // 13981K {0.265976696, 0.270219515}, // 13982K {0.265974268, 0.270216392}, // 13983K {0.265971841, 0.27021327}, // 13984K {0.265969414, 0.270210148}, // 13985K {0.265966987, 0.270207027}, // 13986K {0.265964561, 0.270203906}, // 13987K {0.265962135, 0.270200786}, // 13988K {0.26595971, 0.270197666}, // 13989K {0.265957285, 0.270194547}, // 13990K {0.26595486, 0.270191429}, // 13991K {0.265952436, 0.27018831}, // 13992K {0.265950013, 0.270185193}, // 13993K {0.26594759, 0.270182076}, // 13994K {0.265945167, 0.270178959}, // 13995K {0.265942744, 0.270175843}, // 13996K {0.265940323, 0.270172727}, // 13997K {0.265937901, 0.270169612}, // 13998K {0.26593548, 0.270166497}, // 13999K {0.265933059, 0.270163383}, // 14000K {0.265930639, 0.270160269}, // 14001K {0.265928219, 0.270157156}, // 14002K {0.2659258, 0.270154044}, // 14003K {0.265923381, 0.270150931}, // 14004K {0.265920962, 0.27014782}, // 14005K {0.265918544, 0.270144709}, // 14006K {0.265916127, 0.270141598}, // 14007K {0.265913709, 0.270138488}, // 14008K {0.265911292, 0.270135378}, // 14009K {0.265908876, 0.270132269}, // 14010K {0.26590646, 0.27012916}, // 14011K {0.265904044, 0.270126052}, // 14012K {0.265901629, 0.270122944}, // 14013K {0.265899214, 0.270119837}, // 14014K {0.2658968, 0.27011673}, // 14015K {0.265894386, 0.270113624}, // 14016K {0.265891973, 0.270110518}, // 14017K {0.26588956, 0.270107413}, // 14018K {0.265887147, 0.270104309}, // 14019K {0.265884735, 0.270101204}, // 14020K {0.265882323, 0.270098101}, // 14021K {0.265879911, 0.270094997}, // 14022K {0.265877501, 0.270091895}, // 14023K {0.26587509, 0.270088792}, // 14024K {0.26587268, 0.270085691}, // 14025K {0.26587027, 0.27008259}, // 14026K {0.265867861, 0.270079489}, // 14027K {0.265865452, 0.270076389}, // 14028K {0.265863044, 0.270073289}, // 14029K {0.265860635, 0.27007019}, // 14030K {0.265858228, 0.270067091}, // 14031K {0.265855821, 0.270063993}, // 14032K {0.265853414, 0.270060895}, // 14033K {0.265851008, 0.270057798}, // 14034K {0.265848602, 0.270054701}, // 14035K {0.265846196, 0.270051605}, // 14036K {0.265843791, 0.270048509}, // 14037K {0.265841386, 0.270045414}, // 14038K {0.265838982, 0.270042319}, // 14039K {0.265836578, 0.270039224}, // 14040K {0.265834175, 0.270036131}, // 14041K {0.265831772, 0.270033037}, // 14042K {0.265829369, 0.270029945}, // 14043K {0.265826967, 0.270026852}, // 14044K {0.265824565, 0.27002376}, // 14045K {0.265822164, 0.270020669}, // 14046K {0.265819763, 0.270017578}, // 14047K {0.265817362, 0.270014488}, // 14048K {0.265814962, 0.270011398}, // 14049K {0.265812563, 0.270008309}, // 14050K {0.265810163, 0.27000522}, // 14051K {0.265807765, 0.270002132}, // 14052K {0.265805366, 0.269999044}, // 14053K {0.265802968, 0.269995956}, // 14054K {0.265800571, 0.26999287}, // 14055K {0.265798173, 0.269989783}, // 14056K {0.265795777, 0.269986697}, // 14057K {0.26579338, 0.269983612}, // 14058K {0.265790984, 0.269980527}, // 14059K {0.265788589, 0.269977443}, // 14060K {0.265786194, 0.269974359}, // 14061K {0.265783799, 0.269971275}, // 14062K {0.265781405, 0.269968192}, // 14063K {0.265779011, 0.26996511}, // 14064K {0.265776618, 0.269962028}, // 14065K {0.265774225, 0.269958946}, // 14066K {0.265771832, 0.269955866}, // 14067K {0.26576944, 0.269952785}, // 14068K {0.265767048, 0.269949705}, // 14069K {0.265764657, 0.269946626}, // 14070K {0.265762266, 0.269943547}, // 14071K {0.265759875, 0.269940468}, // 14072K {0.265757485, 0.26993739}, // 14073K {0.265755096, 0.269934313}, // 14074K {0.265752706, 0.269931236}, // 14075K {0.265750317, 0.269928159}, // 14076K {0.265747929, 0.269925083}, // 14077K {0.265745541, 0.269922007}, // 14078K {0.265743153, 0.269918932}, // 14079K {0.265740766, 0.269915858}, // 14080K {0.265738379, 0.269912784}, // 14081K {0.265735993, 0.26990971}, // 14082K {0.265733607, 0.269906637}, // 14083K {0.265731221, 0.269903564}, // 14084K {0.265728836, 0.269900492}, // 14085K {0.265726452, 0.269897421}, // 14086K {0.265724067, 0.269894349}, // 14087K {0.265721683, 0.269891279}, // 14088K {0.2657193, 0.269888209}, // 14089K {0.265716917, 0.269885139}, // 14090K {0.265714534, 0.26988207}, // 14091K {0.265712152, 0.269879001}, // 14092K {0.26570977, 0.269875933}, // 14093K {0.265707389, 0.269872865}, // 14094K {0.265705008, 0.269869798}, // 14095K {0.265702627, 0.269866731}, // 14096K {0.265700247, 0.269863665}, // 14097K {0.265697867, 0.269860599}, // 14098K {0.265695488, 0.269857534}, // 14099K {0.265693109, 0.269854469}, // 14100K {0.26569073, 0.269851405}, // 14101K {0.265688352, 0.269848341}, // 14102K {0.265685975, 0.269845278}, // 14103K {0.265683597, 0.269842215}, // 14104K {0.26568122, 0.269839153}, // 14105K {0.265678844, 0.269836091}, // 14106K {0.265676468, 0.269833029}, // 14107K {0.265674092, 0.269829968}, // 14108K {0.265671717, 0.269826908}, // 14109K {0.265669342, 0.269823848}, // 14110K {0.265666968, 0.269820789}, // 14111K {0.265664594, 0.26981773}, // 14112K {0.26566222, 0.269814671}, // 14113K {0.265659847, 0.269811613}, // 14114K {0.265657474, 0.269808556}, // 14115K {0.265655102, 0.269805499}, // 14116K {0.26565273, 0.269802442}, // 14117K {0.265650358, 0.269799386}, // 14118K {0.265647987, 0.269796331}, // 14119K {0.265645616, 0.269793276}, // 14120K {0.265643246, 0.269790221}, // 14121K {0.265640876, 0.269787167}, // 14122K {0.265638507, 0.269784114}, // 14123K {0.265636138, 0.269781061}, // 14124K {0.265633769, 0.269778008}, // 14125K {0.265631401, 0.269774956}, // 14126K {0.265629033, 0.269771904}, // 14127K {0.265626665, 0.269768853}, // 14128K {0.265624298, 0.269765802}, // 14129K {0.265621932, 0.269762752}, // 14130K {0.265619566, 0.269759702}, // 14131K {0.2656172, 0.269756653}, // 14132K {0.265614834, 0.269753605}, // 14133K {0.265612469, 0.269750556}, // 14134K {0.265610105, 0.269747509}, // 14135K {0.265607741, 0.269744461}, // 14136K {0.265605377, 0.269741414}, // 14137K {0.265603014, 0.269738368}, // 14138K {0.265600651, 0.269735322}, // 14139K {0.265598288, 0.269732277}, // 14140K {0.265595926, 0.269729232}, // 14141K {0.265593564, 0.269726188}, // 14142K {0.265591203, 0.269723144}, // 14143K {0.265588842, 0.2697201}, // 14144K {0.265586481, 0.269717058}, // 14145K {0.265584121, 0.269714015}, // 14146K {0.265581762, 0.269710973}, // 14147K {0.265579402, 0.269707932}, // 14148K {0.265577043, 0.269704891}, // 14149K {0.265574685, 0.26970185}, // 14150K {0.265572327, 0.26969881}, // 14151K {0.265569969, 0.269695771}, // 14152K {0.265567612, 0.269692732}, // 14153K {0.265565255, 0.269689693}, // 14154K {0.265562899, 0.269686655}, // 14155K {0.265560543, 0.269683617}, // 14156K {0.265558187, 0.26968058}, // 14157K {0.265555832, 0.269677544}, // 14158K {0.265553477, 0.269674507}, // 14159K {0.265551123, 0.269671472}, // 14160K {0.265548769, 0.269668437}, // 14161K {0.265546415, 0.269665402}, // 14162K {0.265544062, 0.269662368}, // 14163K {0.265541709, 0.269659334}, // 14164K {0.265539357, 0.269656301}, // 14165K {0.265537005, 0.269653268}, // 14166K {0.265534653, 0.269650235}, // 14167K {0.265532302, 0.269647204}, // 14168K {0.265529951, 0.269644172}, // 14169K {0.265527601, 0.269641141}, // 14170K {0.265525251, 0.269638111}, // 14171K {0.265522901, 0.269635081}, // 14172K {0.265520552, 0.269632052}, // 14173K {0.265518204, 0.269629023}, // 14174K {0.265515855, 0.269625994}, // 14175K {0.265513507, 0.269622966}, // 14176K {0.26551116, 0.269619939}, // 14177K {0.265508813, 0.269616912}, // 14178K {0.265506466, 0.269613885}, // 14179K {0.26550412, 0.269610859}, // 14180K {0.265501774, 0.269607834}, // 14181K {0.265499428, 0.269604808}, // 14182K {0.265497083, 0.269601784}, // 14183K {0.265494739, 0.26959876}, // 14184K {0.265492394, 0.269595736}, // 14185K {0.26549005, 0.269592713}, // 14186K {0.265487707, 0.26958969}, // 14187K {0.265485364, 0.269586668}, // 14188K {0.265483021, 0.269583646}, // 14189K {0.265480679, 0.269580625}, // 14190K {0.265478337, 0.269577604}, // 14191K {0.265475996, 0.269574584}, // 14192K {0.265473654, 0.269571564}, // 14193K {0.265471314, 0.269568545}, // 14194K {0.265468974, 0.269565526}, // 14195K {0.265466634, 0.269562507}, // 14196K {0.265464294, 0.269559489}, // 14197K {0.265461955, 0.269556472}, // 14198K {0.265459617, 0.269553455}, // 14199K {0.265457278, 0.269550438}, // 14200K {0.26545494, 0.269547422}, // 14201K {0.265452603, 0.269544407}, // 14202K {0.265450266, 0.269541392}, // 14203K {0.265447929, 0.269538377}, // 14204K {0.265445593, 0.269535363}, // 14205K {0.265443257, 0.269532349}, // 14206K {0.265440922, 0.269529336}, // 14207K {0.265438587, 0.269526324}, // 14208K {0.265436252, 0.269523311}, // 14209K {0.265433918, 0.2695203}, // 14210K {0.265431584, 0.269517288}, // 14211K {0.265429251, 0.269514278}, // 14212K {0.265426918, 0.269511267}, // 14213K {0.265424585, 0.269508258}, // 14214K {0.265422253, 0.269505248}, // 14215K {0.265419921, 0.269502239}, // 14216K {0.26541759, 0.269499231}, // 14217K {0.265415259, 0.269496223}, // 14218K {0.265412928, 0.269493216}, // 14219K {0.265410598, 0.269490209}, // 14220K {0.265408268, 0.269487202}, // 14221K {0.265405938, 0.269484196}, // 14222K {0.265403609, 0.269481191}, // 14223K {0.265401281, 0.269478185}, // 14224K {0.265398953, 0.269475181}, // 14225K {0.265396625, 0.269472177}, // 14226K {0.265394297, 0.269469173}, // 14227K {0.26539197, 0.26946617}, // 14228K {0.265389644, 0.269463167}, // 14229K {0.265387317, 0.269460165}, // 14230K {0.265384992, 0.269457163}, // 14231K {0.265382666, 0.269454162}, // 14232K {0.265380341, 0.269451161}, // 14233K {0.265378016, 0.269448161}, // 14234K {0.265375692, 0.269445161}, // 14235K {0.265373368, 0.269442162}, // 14236K {0.265371045, 0.269439163}, // 14237K {0.265368722, 0.269436164}, // 14238K {0.265366399, 0.269433166}, // 14239K {0.265364077, 0.269430169}, // 14240K {0.265361755, 0.269427172}, // 14241K {0.265359434, 0.269424175}, // 14242K {0.265357113, 0.269421179}, // 14243K {0.265354792, 0.269418184}, // 14244K {0.265352472, 0.269415189}, // 14245K {0.265350152, 0.269412194}, // 14246K {0.265347832, 0.2694092}, // 14247K {0.265345513, 0.269406206}, // 14248K {0.265343195, 0.269403213}, // 14249K {0.265340876, 0.26940022}, // 14250K {0.265338559, 0.269397228}, // 14251K {0.265336241, 0.269394236}, // 14252K {0.265333924, 0.269391245}, // 14253K {0.265331607, 0.269388254}, // 14254K {0.265329291, 0.269385263}, // 14255K {0.265326975, 0.269382274}, // 14256K {0.26532466, 0.269379284}, // 14257K {0.265322345, 0.269376295}, // 14258K {0.26532003, 0.269373307}, // 14259K {0.265317716, 0.269370319}, // 14260K {0.265315402, 0.269367331}, // 14261K {0.265313088, 0.269364344}, // 14262K {0.265310775, 0.269361357}, // 14263K {0.265308462, 0.269358371}, // 14264K {0.26530615, 0.269355385}, // 14265K {0.265303838, 0.2693524}, // 14266K {0.265301526, 0.269349415}, // 14267K {0.265299215, 0.269346431}, // 14268K {0.265296905, 0.269343447}, // 14269K {0.265294594, 0.269340464}, // 14270K {0.265292284, 0.269337481}, // 14271K {0.265289975, 0.269334499}, // 14272K {0.265287666, 0.269331517}, // 14273K {0.265285357, 0.269328535}, // 14274K {0.265283048, 0.269325554}, // 14275K {0.26528074, 0.269322574}, // 14276K {0.265278433, 0.269319594}, // 14277K {0.265276126, 0.269316614}, // 14278K {0.265273819, 0.269313635}, // 14279K {0.265271512, 0.269310657}, // 14280K {0.265269206, 0.269307678}, // 14281K {0.265266901, 0.269304701}, // 14282K {0.265264596, 0.269301723}, // 14283K {0.265262291, 0.269298747}, // 14284K {0.265259986, 0.26929577}, // 14285K {0.265257682, 0.269292795}, // 14286K {0.265255379, 0.269289819}, // 14287K {0.265253075, 0.269286844}, // 14288K {0.265250773, 0.26928387}, // 14289K {0.26524847, 0.269280896}, // 14290K {0.265246168, 0.269277923}, // 14291K {0.265243866, 0.26927495}, // 14292K {0.265241565, 0.269271977}, // 14293K {0.265239264, 0.269269005}, // 14294K {0.265236964, 0.269266033}, // 14295K {0.265234663, 0.269263062}, // 14296K {0.265232364, 0.269260091}, // 14297K {0.265230064, 0.269257121}, // 14298K {0.265227766, 0.269254152}, // 14299K {0.265225467, 0.269251182}, // 14300K {0.265223169, 0.269248213}, // 14301K {0.265220871, 0.269245245}, // 14302K {0.265218574, 0.269242277}, // 14303K {0.265216277, 0.26923931}, // 14304K {0.26521398, 0.269236343}, // 14305K {0.265211684, 0.269233376}, // 14306K {0.265209388, 0.26923041}, // 14307K {0.265207093, 0.269227445}, // 14308K {0.265204798, 0.26922448}, // 14309K {0.265202503, 0.269221515}, // 14310K {0.265200209, 0.269218551}, // 14311K {0.265197915, 0.269215587}, // 14312K {0.265195622, 0.269212624}, // 14313K {0.265193329, 0.269209661}, // 14314K {0.265191036, 0.269206699}, // 14315K {0.265188744, 0.269203737}, // 14316K {0.265186452, 0.269200776}, // 14317K {0.26518416, 0.269197815}, // 14318K {0.265181869, 0.269194855}, // 14319K {0.265179578, 0.269191895}, // 14320K {0.265177288, 0.269188935}, // 14321K {0.265174998, 0.269185976}, // 14322K {0.265172709, 0.269183018}, // 14323K {0.265170419, 0.269180059}, // 14324K {0.265168131, 0.269177102}, // 14325K {0.265165842, 0.269174145}, // 14326K {0.265163554, 0.269171188}, // 14327K {0.265161267, 0.269168232}, // 14328K {0.26515898, 0.269165276}, // 14329K {0.265156693, 0.269162321}, // 14330K {0.265154406, 0.269159366}, // 14331K {0.26515212, 0.269156411}, // 14332K {0.265149835, 0.269153457}, // 14333K {0.265147549, 0.269150504}, // 14334K {0.265145264, 0.269147551}, // 14335K {0.26514298, 0.269144598}, // 14336K {0.265140696, 0.269141646}, // 14337K {0.265138412, 0.269138695}, // 14338K {0.265136129, 0.269135744}, // 14339K {0.265133846, 0.269132793}, // 14340K {0.265131563, 0.269129843}, // 14341K {0.265129281, 0.269126893}, // 14342K {0.265126999, 0.269123944}, // 14343K {0.265124718, 0.269120995}, // 14344K {0.265122437, 0.269118047}, // 14345K {0.265120157, 0.269115099}, // 14346K {0.265117876, 0.269112151}, // 14347K {0.265115596, 0.269109204}, // 14348K {0.265113317, 0.269106258}, // 14349K {0.265111038, 0.269103312}, // 14350K {0.265108759, 0.269100366}, // 14351K {0.265106481, 0.269097421}, // 14352K {0.265104203, 0.269094476}, // 14353K {0.265101926, 0.269091532}, // 14354K {0.265099649, 0.269088588}, // 14355K {0.265097372, 0.269085645}, // 14356K {0.265095096, 0.269082702}, // 14357K {0.26509282, 0.26907976}, // 14358K {0.265090544, 0.269076818}, // 14359K {0.265088269, 0.269073876}, // 14360K {0.265085994, 0.269070935}, // 14361K {0.26508372, 0.269067995}, // 14362K {0.265081446, 0.269065055}, // 14363K {0.265079172, 0.269062115}, // 14364K {0.265076899, 0.269059176}, // 14365K {0.265074626, 0.269056237}, // 14366K {0.265072353, 0.269053299}, // 14367K {0.265070081, 0.269050361}, // 14368K {0.26506781, 0.269047424}, // 14369K {0.265065538, 0.269044487}, // 14370K {0.265063267, 0.269041551}, // 14371K {0.265060997, 0.269038615}, // 14372K {0.265058727, 0.26903568}, // 14373K {0.265056457, 0.269032745}, // 14374K {0.265054187, 0.26902981}, // 14375K {0.265051918, 0.269026876}, // 14376K {0.26504965, 0.269023942}, // 14377K {0.265047382, 0.269021009}, // 14378K {0.265045114, 0.269018076}, // 14379K {0.265042846, 0.269015144}, // 14380K {0.265040579, 0.269012212}, // 14381K {0.265038312, 0.269009281}, // 14382K {0.265036046, 0.26900635}, // 14383K {0.26503378, 0.26900342}, // 14384K {0.265031515, 0.26900049}, // 14385K {0.26502925, 0.26899756}, // 14386K {0.265026985, 0.268994631}, // 14387K {0.26502472, 0.268991703}, // 14388K {0.265022456, 0.268988775}, // 14389K {0.265020193, 0.268985847}, // 14390K {0.265017929, 0.26898292}, // 14391K {0.265015667, 0.268979993}, // 14392K {0.265013404, 0.268977067}, // 14393K {0.265011142, 0.268974141}, // 14394K {0.26500888, 0.268971215}, // 14395K {0.265006619, 0.26896829}, // 14396K {0.265004358, 0.268965366}, // 14397K {0.265002098, 0.268962442}, // 14398K {0.264999837, 0.268959518}, // 14399K {0.264997578, 0.268956595}, // 14400K {0.264995318, 0.268953673}, // 14401K {0.264993059, 0.268950751}, // 14402K {0.2649908, 0.268947829}, // 14403K {0.264988542, 0.268944908}, // 14404K {0.264986284, 0.268941987}, // 14405K {0.264984027, 0.268939066}, // 14406K {0.26498177, 0.268936146}, // 14407K {0.264979513, 0.268933227}, // 14408K {0.264977257, 0.268930308}, // 14409K {0.264975001, 0.268927389}, // 14410K {0.264972745, 0.268924471}, // 14411K {0.26497049, 0.268921554}, // 14412K {0.264968235, 0.268918637}, // 14413K {0.264965981, 0.26891572}, // 14414K {0.264963727, 0.268912804}, // 14415K {0.264961473, 0.268909888}, // 14416K {0.26495922, 0.268906973}, // 14417K {0.264956967, 0.268904058}, // 14418K {0.264954714, 0.268901143}, // 14419K {0.264952462, 0.268898229}, // 14420K {0.26495021, 0.268895316}, // 14421K {0.264947959, 0.268892403}, // 14422K {0.264945708, 0.26888949}, // 14423K {0.264943457, 0.268886578}, // 14424K {0.264941207, 0.268883666}, // 14425K {0.264938957, 0.268880755}, // 14426K {0.264936708, 0.268877844}, // 14427K {0.264934458, 0.268874934}, // 14428K {0.26493221, 0.268872024}, // 14429K {0.264929961, 0.268869114}, // 14430K {0.264927713, 0.268866205}, // 14431K {0.264925466, 0.268863297}, // 14432K {0.264923219, 0.268860389}, // 14433K {0.264920972, 0.268857481}, // 14434K {0.264918725, 0.268854574}, // 14435K {0.264916479, 0.268851667}, // 14436K {0.264914233, 0.268848761}, // 14437K {0.264911988, 0.268845855}, // 14438K {0.264909743, 0.26884295}, // 14439K {0.264907499, 0.268840045}, // 14440K {0.264905255, 0.26883714}, // 14441K {0.264903011, 0.268834236}, // 14442K {0.264900767, 0.268831333}, // 14443K {0.264898524, 0.26882843}, // 14444K {0.264896282, 0.268825527}, // 14445K {0.264894039, 0.268822625}, // 14446K {0.264891797, 0.268819723}, // 14447K {0.264889556, 0.268816822}, // 14448K {0.264887315, 0.268813921}, // 14449K {0.264885074, 0.268811021}, // 14450K {0.264882834, 0.268808121}, // 14451K {0.264880594, 0.268805221}, // 14452K {0.264878354, 0.268802322}, // 14453K {0.264876115, 0.268799424}, // 14454K {0.264873876, 0.268796526}, // 14455K {0.264871637, 0.268793628}, // 14456K {0.264869399, 0.268790731}, // 14457K {0.264867161, 0.268787834}, // 14458K {0.264864924, 0.268784938}, // 14459K {0.264862687, 0.268782042}, // 14460K {0.26486045, 0.268779146}, // 14461K {0.264858214, 0.268776251}, // 14462K {0.264855978, 0.268773357}, // 14463K {0.264853743, 0.268770463}, // 14464K {0.264851508, 0.268767569}, // 14465K {0.264849273, 0.268764676}, // 14466K {0.264847039, 0.268761783}, // 14467K {0.264844805, 0.268758891}, // 14468K {0.264842571, 0.268755999}, // 14469K {0.264840338, 0.268753108}, // 14470K {0.264838105, 0.268750217}, // 14471K {0.264835873, 0.268747326}, // 14472K {0.26483364, 0.268744436}, // 14473K {0.264831409, 0.268741547}, // 14474K {0.264829177, 0.268738658}, // 14475K {0.264826946, 0.268735769}, // 14476K {0.264824716, 0.268732881}, // 14477K {0.264822486, 0.268729993}, // 14478K {0.264820256, 0.268727106}, // 14479K {0.264818026, 0.268724219}, // 14480K {0.264815797, 0.268721332}, // 14481K {0.264813568, 0.268718446}, // 14482K {0.26481134, 0.268715561}, // 14483K {0.264809112, 0.268712676}, // 14484K {0.264806885, 0.268709791}, // 14485K {0.264804657, 0.268706907}, // 14486K {0.264802431, 0.268704023}, // 14487K {0.264800204, 0.26870114}, // 14488K {0.264797978, 0.268698257}, // 14489K {0.264795752, 0.268695375}, // 14490K {0.264793527, 0.268692493}, // 14491K {0.264791302, 0.268689611}, // 14492K {0.264789077, 0.26868673}, // 14493K {0.264786853, 0.268683849}, // 14494K {0.264784629, 0.268680969}, // 14495K {0.264782406, 0.26867809}, // 14496K {0.264780183, 0.26867521}, // 14497K {0.26477796, 0.268672331}, // 14498K {0.264775738, 0.268669453}, // 14499K {0.264773516, 0.268666575}, // 14500K {0.264771294, 0.268663698}, // 14501K {0.264769073, 0.268660821}, // 14502K {0.264766852, 0.268657944}, // 14503K {0.264764632, 0.268655068}, // 14504K {0.264762411, 0.268652192}, // 14505K {0.264760192, 0.268649317}, // 14506K {0.264757972, 0.268646442}, // 14507K {0.264755753, 0.268643568}, // 14508K {0.264753535, 0.268640694}, // 14509K {0.264751316, 0.26863782}, // 14510K {0.264749099, 0.268634947}, // 14511K {0.264746881, 0.268632075}, // 14512K {0.264744664, 0.268629203}, // 14513K {0.264742447, 0.268626331}, // 14514K {0.264740231, 0.26862346}, // 14515K {0.264738015, 0.268620589}, // 14516K {0.264735799, 0.268617719}, // 14517K {0.264733584, 0.268614849}, // 14518K {0.264731369, 0.268611979}, // 14519K {0.264729155, 0.26860911}, // 14520K {0.26472694, 0.268606242}, // 14521K {0.264724727, 0.268603374}, // 14522K {0.264722513, 0.268600506}, // 14523K {0.2647203, 0.268597639}, // 14524K {0.264718088, 0.268594772}, // 14525K {0.264715875, 0.268591906}, // 14526K {0.264713663, 0.26858904}, // 14527K {0.264711452, 0.268586174}, // 14528K {0.264709241, 0.268583309}, // 14529K {0.26470703, 0.268580445}, // 14530K {0.264704819, 0.268577581}, // 14531K {0.264702609, 0.268574717}, // 14532K {0.2647004, 0.268571854}, // 14533K {0.26469819, 0.268568991}, // 14534K {0.264695981, 0.268566129}, // 14535K {0.264693773, 0.268563267}, // 14536K {0.264691565, 0.268560405}, // 14537K {0.264689357, 0.268557544}, // 14538K {0.264687149, 0.268554684}, // 14539K {0.264684942, 0.268551823}, // 14540K {0.264682735, 0.268548964}, // 14541K {0.264680529, 0.268546104}, // 14542K {0.264678323, 0.268543246}, // 14543K {0.264676117, 0.268540387}, // 14544K {0.264673912, 0.268537529}, // 14545K {0.264671707, 0.268534672}, // 14546K {0.264669503, 0.268531815}, // 14547K {0.264667299, 0.268528958}, // 14548K {0.264665095, 0.268526102}, // 14549K {0.264662891, 0.268523246}, // 14550K {0.264660688, 0.268520391}, // 14551K {0.264658486, 0.268517536}, // 14552K {0.264656283, 0.268514682}, // 14553K {0.264654081, 0.268511828}, // 14554K {0.26465188, 0.268508974}, // 14555K {0.264649679, 0.268506121}, // 14556K {0.264647478, 0.268503269}, // 14557K {0.264645277, 0.268500417}, // 14558K {0.264643077, 0.268497565}, // 14559K {0.264640878, 0.268494714}, // 14560K {0.264638678, 0.268491863}, // 14561K {0.264636479, 0.268489012}, // 14562K {0.264634281, 0.268486162}, // 14563K {0.264632082, 0.268483313}, // 14564K {0.264629885, 0.268480464}, // 14565K {0.264627687, 0.268477615}, // 14566K {0.26462549, 0.268474767}, // 14567K {0.264623293, 0.268471919}, // 14568K {0.264621097, 0.268469072}, // 14569K {0.264618901, 0.268466225}, // 14570K {0.264616705, 0.268463378}, // 14571K {0.26461451, 0.268460532}, // 14572K {0.264612315, 0.268457687}, // 14573K {0.26461012, 0.268454842}, // 14574K {0.264607926, 0.268451997}, // 14575K {0.264605732, 0.268449153}, // 14576K {0.264603539, 0.268446309}, // 14577K {0.264601346, 0.268443466}, // 14578K {0.264599153, 0.268440623}, // 14579K {0.264596961, 0.26843778}, // 14580K {0.264594768, 0.268434938}, // 14581K {0.264592577, 0.268432096}, // 14582K {0.264590386, 0.268429255}, // 14583K {0.264588195, 0.268426414}, // 14584K {0.264586004, 0.268423574}, // 14585K {0.264583814, 0.268420734}, // 14586K {0.264581624, 0.268417895}, // 14587K {0.264579435, 0.268415056}, // 14588K {0.264577246, 0.268412217}, // 14589K {0.264575057, 0.268409379}, // 14590K {0.264572869, 0.268406542}, // 14591K {0.264570681, 0.268403704}, // 14592K {0.264568493, 0.268400867}, // 14593K {0.264566306, 0.268398031}, // 14594K {0.264564119, 0.268395195}, // 14595K {0.264561932, 0.26839236}, // 14596K {0.264559746, 0.268389525}, // 14597K {0.26455756, 0.26838669}, // 14598K {0.264555375, 0.268383856}, // 14599K {0.26455319, 0.268381022}, // 14600K {0.264551005, 0.268378189}, // 14601K {0.264548821, 0.268375356}, // 14602K {0.264546637, 0.268372524}, // 14603K {0.264544453, 0.268369692}, // 14604K {0.26454227, 0.26836686}, // 14605K {0.264540087, 0.268364029}, // 14606K {0.264537905, 0.268361198}, // 14607K {0.264535723, 0.268358368}, // 14608K {0.264533541, 0.268355538}, // 14609K {0.264531359, 0.268352709}, // 14610K {0.264529178, 0.26834988}, // 14611K {0.264526998, 0.268347051}, // 14612K {0.264524817, 0.268344223}, // 14613K {0.264522637, 0.268341396}, // 14614K {0.264520458, 0.268338568}, // 14615K {0.264518279, 0.268335742}, // 14616K {0.2645161, 0.268332915}, // 14617K {0.264513921, 0.268330089}, // 14618K {0.264511743, 0.268327264}, // 14619K {0.264509565, 0.268324439}, // 14620K {0.264507388, 0.268321614}, // 14621K {0.264505211, 0.26831879}, // 14622K {0.264503034, 0.268315967}, // 14623K {0.264500858, 0.268313143}, // 14624K {0.264498682, 0.26831032}, // 14625K {0.264496506, 0.268307498}, // 14626K {0.264494331, 0.268304676}, // 14627K {0.264492156, 0.268301855}, // 14628K {0.264489982, 0.268299033}, // 14629K {0.264487807, 0.268296213}, // 14630K {0.264485634, 0.268293393}, // 14631K {0.26448346, 0.268290573}, // 14632K {0.264481287, 0.268287753}, // 14633K {0.264479114, 0.268284934}, // 14634K {0.264476942, 0.268282116}, // 14635K {0.26447477, 0.268279298}, // 14636K {0.264472598, 0.26827648}, // 14637K {0.264470427, 0.268273663}, // 14638K {0.264468256, 0.268270846}, // 14639K {0.264466086, 0.26826803}, // 14640K {0.264463916, 0.268265214}, // 14641K {0.264461746, 0.268262399}, // 14642K {0.264459576, 0.268259584}, // 14643K {0.264457407, 0.268256769}, // 14644K {0.264455239, 0.268253955}, // 14645K {0.26445307, 0.268251141}, // 14646K {0.264450902, 0.268248328}, // 14647K {0.264448735, 0.268245515}, // 14648K {0.264446567, 0.268242702}, // 14649K {0.2644444, 0.26823989}, // 14650K {0.264442234, 0.268237079}, // 14651K {0.264440068, 0.268234268}, // 14652K {0.264437902, 0.268231457}, // 14653K {0.264435736, 0.268228647}, // 14654K {0.264433571, 0.268225837}, // 14655K {0.264431406, 0.268223027}, // 14656K {0.264429242, 0.268220218}, // 14657K {0.264427078, 0.26821741}, // 14658K {0.264424914, 0.268214602}, // 14659K {0.264422751, 0.268211794}, // 14660K {0.264420588, 0.268208987}, // 14661K {0.264418425, 0.26820618}, // 14662K {0.264416263, 0.268203374}, // 14663K {0.264414101, 0.268200568}, // 14664K {0.26441194, 0.268197762}, // 14665K {0.264409778, 0.268194957}, // 14666K {0.264407618, 0.268192152}, // 14667K {0.264405457, 0.268189348}, // 14668K {0.264403297, 0.268186544}, // 14669K {0.264401137, 0.268183741}, // 14670K {0.264398978, 0.268180938}, // 14671K {0.264396819, 0.268178135}, // 14672K {0.26439466, 0.268175333}, // 14673K {0.264392502, 0.268172532}, // 14674K {0.264390344, 0.26816973}, // 14675K {0.264388186, 0.26816693}, // 14676K {0.264386029, 0.268164129}, // 14677K {0.264383872, 0.268161329}, // 14678K {0.264381716, 0.26815853}, // 14679K {0.26437956, 0.268155731}, // 14680K {0.264377404, 0.268152932}, // 14681K {0.264375248, 0.268150134}, // 14682K {0.264373093, 0.268147336}, // 14683K {0.264370939, 0.268144539}, // 14684K {0.264368784, 0.268141742}, // 14685K {0.26436663, 0.268138945}, // 14686K {0.264364477, 0.268136149}, // 14687K {0.264362323, 0.268133354}, // 14688K {0.26436017, 0.268130558}, // 14689K {0.264358018, 0.268127764}, // 14690K {0.264355866, 0.268124969}, // 14691K {0.264353714, 0.268122175}, // 14692K {0.264351562, 0.268119382}, // 14693K {0.264349411, 0.268116589}, // 14694K {0.26434726, 0.268113796}, // 14695K {0.26434511, 0.268111004}, // 14696K {0.26434296, 0.268108212}, // 14697K {0.26434081, 0.268105421}, // 14698K {0.264338661, 0.26810263}, // 14699K {0.264336512, 0.268099839}, // 14700K {0.264334363, 0.268097049}, // 14701K {0.264332215, 0.26809426}, // 14702K {0.264330067, 0.26809147}, // 14703K {0.264327919, 0.268088682}, // 14704K {0.264325772, 0.268085893}, // 14705K {0.264323625, 0.268083105}, // 14706K {0.264321479, 0.268080318}, // 14707K {0.264319332, 0.268077531}, // 14708K {0.264317187, 0.268074744}, // 14709K {0.264315041, 0.268071958}, // 14710K {0.264312896, 0.268069172}, // 14711K {0.264310751, 0.268066386}, // 14712K {0.264308607, 0.268063602}, // 14713K {0.264306463, 0.268060817}, // 14714K {0.264304319, 0.268058033}, // 14715K {0.264302176, 0.268055249}, // 14716K {0.264300033, 0.268052466}, // 14717K {0.26429789, 0.268049683}, // 14718K {0.264295748, 0.268046901}, // 14719K {0.264293606, 0.268044119}, // 14720K {0.264291464, 0.268041337}, // 14721K {0.264289323, 0.268038556}, // 14722K {0.264287182, 0.268035775}, // 14723K {0.264285042, 0.268032995}, // 14724K {0.264282902, 0.268030215}, // 14725K {0.264280762, 0.268027436}, // 14726K {0.264278623, 0.268024657}, // 14727K {0.264276484, 0.268021878}, // 14728K {0.264274345, 0.2680191}, // 14729K {0.264272206, 0.268016322}, // 14730K {0.264270068, 0.268013545}, // 14731K {0.264267931, 0.268010768}, // 14732K {0.264265793, 0.268007992}, // 14733K {0.264263657, 0.268005216}, // 14734K {0.26426152, 0.26800244}, // 14735K {0.264259384, 0.267999665}, // 14736K {0.264257248, 0.26799689}, // 14737K {0.264255112, 0.267994116}, // 14738K {0.264252977, 0.267991342}, // 14739K {0.264250842, 0.267988569}, // 14740K {0.264248708, 0.267985796}, // 14741K {0.264246574, 0.267983023}, // 14742K {0.26424444, 0.267980251}, // 14743K {0.264242306, 0.267977479}, // 14744K {0.264240173, 0.267974708}, // 14745K {0.264238041, 0.267971937}, // 14746K {0.264235908, 0.267969166}, // 14747K {0.264233776, 0.267966396}, // 14748K {0.264231645, 0.267963626}, // 14749K {0.264229513, 0.267960857}, // 14750K {0.264227382, 0.267958088}, // 14751K {0.264225252, 0.26795532}, // 14752K {0.264223121, 0.267952552}, // 14753K {0.264220992, 0.267949784}, // 14754K {0.264218862, 0.267947017}, // 14755K {0.264216733, 0.26794425}, // 14756K {0.264214604, 0.267941484}, // 14757K {0.264212475, 0.267938718}, // 14758K {0.264210347, 0.267935953}, // 14759K {0.26420822, 0.267933188}, // 14760K {0.264206092, 0.267930423}, // 14761K {0.264203965, 0.267927659}, // 14762K {0.264201838, 0.267924895}, // 14763K {0.264199712, 0.267922132}, // 14764K {0.264197586, 0.267919369}, // 14765K {0.26419546, 0.267916607}, // 14766K {0.264193335, 0.267913845}, // 14767K {0.26419121, 0.267911083}, // 14768K {0.264189085, 0.267908322}, // 14769K {0.264186961, 0.267905561}, // 14770K {0.264184837, 0.267902801}, // 14771K {0.264182713, 0.267900041}, // 14772K {0.26418059, 0.267897281}, // 14773K {0.264178467, 0.267894522}, // 14774K {0.264176345, 0.267891763}, // 14775K {0.264174223, 0.267889005}, // 14776K {0.264172101, 0.267886247}, // 14777K {0.264169979, 0.26788349}, // 14778K {0.264167858, 0.267880733}, // 14779K {0.264165737, 0.267877976}, // 14780K {0.264163617, 0.26787522}, // 14781K {0.264161497, 0.267872464}, // 14782K {0.264159377, 0.267869709}, // 14783K {0.264157258, 0.267866954}, // 14784K {0.264155139, 0.267864199}, // 14785K {0.26415302, 0.267861445}, // 14786K {0.264150902, 0.267858692}, // 14787K {0.264148784, 0.267855938}, // 14788K {0.264146666, 0.267853186}, // 14789K {0.264144549, 0.267850433}, // 14790K {0.264142432, 0.267847681}, // 14791K {0.264140315, 0.26784493}, // 14792K {0.264138199, 0.267842179}, // 14793K {0.264136083, 0.267839428}, // 14794K {0.264133967, 0.267836678}, // 14795K {0.264131852, 0.267833928}, // 14796K {0.264129737, 0.267831178}, // 14797K {0.264127623, 0.267828429}, // 14798K {0.264125509, 0.26782568}, // 14799K {0.264123395, 0.267822932}, // 14800K {0.264121281, 0.267820184}, // 14801K {0.264119168, 0.267817437}, // 14802K {0.264117055, 0.26781469}, // 14803K {0.264114943, 0.267811944}, // 14804K {0.264112831, 0.267809198}, // 14805K {0.264110719, 0.267806452}, // 14806K {0.264108608, 0.267803707}, // 14807K {0.264106497, 0.267800962}, // 14808K {0.264104386, 0.267798217}, // 14809K {0.264102276, 0.267795473}, // 14810K {0.264100166, 0.26779273}, // 14811K {0.264098056, 0.267789986}, // 14812K {0.264095947, 0.267787244}, // 14813K {0.264093838, 0.267784501}, // 14814K {0.264091729, 0.267781759}, // 14815K {0.264089621, 0.267779018}, // 14816K {0.264087513, 0.267776277}, // 14817K {0.264085405, 0.267773536}, // 14818K {0.264083298, 0.267770796}, // 14819K {0.264081191, 0.267768056}, // 14820K {0.264079085, 0.267765316}, // 14821K {0.264076979, 0.267762577}, // 14822K {0.264074873, 0.267759839}, // 14823K {0.264072767, 0.267757101}, // 14824K {0.264070662, 0.267754363}, // 14825K {0.264068557, 0.267751625}, // 14826K {0.264066453, 0.267748889}, // 14827K {0.264064349, 0.267746152}, // 14828K {0.264062245, 0.267743416}, // 14829K {0.264060142, 0.26774068}, // 14830K {0.264058039, 0.267737945}, // 14831K {0.264055936, 0.26773521}, // 14832K {0.264053833, 0.267732476}, // 14833K {0.264051731, 0.267729742}, // 14834K {0.26404963, 0.267727008}, // 14835K {0.264047528, 0.267724275}, // 14836K {0.264045427, 0.267721542}, // 14837K {0.264043327, 0.26771881}, // 14838K {0.264041226, 0.267716078}, // 14839K {0.264039126, 0.267713346}, // 14840K {0.264037027, 0.267710615}, // 14841K {0.264034928, 0.267707884}, // 14842K {0.264032829, 0.267705154}, // 14843K {0.26403073, 0.267702424}, // 14844K {0.264028632, 0.267699695}, // 14845K {0.264026534, 0.267696966}, // 14846K {0.264024436, 0.267694237}, // 14847K {0.264022339, 0.267691509}, // 14848K {0.264020242, 0.267688781}, // 14849K {0.264018146, 0.267686053}, // 14850K {0.26401605, 0.267683327}, // 14851K {0.264013954, 0.2676806}, // 14852K {0.264011858, 0.267677874}, // 14853K {0.264009763, 0.267675148}, // 14854K {0.264007668, 0.267672423}, // 14855K {0.264005574, 0.267669698}, // 14856K {0.26400348, 0.267666973}, // 14857K {0.264001386, 0.267664249}, // 14858K {0.263999292, 0.267661526}, // 14859K {0.263997199, 0.267658802}, // 14860K {0.263995107, 0.267656079}, // 14861K {0.263993014, 0.267653357}, // 14862K {0.263990922, 0.267650635}, // 14863K {0.26398883, 0.267647913}, // 14864K {0.263986739, 0.267645192}, // 14865K {0.263984648, 0.267642471}, // 14866K {0.263982557, 0.267639751}, // 14867K {0.263980467, 0.267637031}, // 14868K {0.263978377, 0.267634311}, // 14869K {0.263976287, 0.267631592}, // 14870K {0.263974198, 0.267628874}, // 14871K {0.263972109, 0.267626155}, // 14872K {0.26397002, 0.267623437}, // 14873K {0.263967932, 0.26762072}, // 14874K {0.263965844, 0.267618003}, // 14875K {0.263963756, 0.267615286}, // 14876K {0.263961669, 0.26761257}, // 14877K {0.263959582, 0.267609854}, // 14878K {0.263957496, 0.267607139}, // 14879K {0.263955409, 0.267604424}, // 14880K {0.263953323, 0.267601709}, // 14881K {0.263951238, 0.267598995}, // 14882K {0.263949153, 0.267596281}, // 14883K {0.263947068, 0.267593568}, // 14884K {0.263944983, 0.267590855}, // 14885K {0.263942899, 0.267588142}, // 14886K {0.263940815, 0.26758543}, // 14887K {0.263938732, 0.267582718}, // 14888K {0.263936649, 0.267580007}, // 14889K {0.263934566, 0.267577296}, // 14890K {0.263932483, 0.267574586}, // 14891K {0.263930401, 0.267571875}, // 14892K {0.263928319, 0.267569166}, // 14893K {0.263926238, 0.267566456}, // 14894K {0.263924157, 0.267563748}, // 14895K {0.263922076, 0.267561039}, // 14896K {0.263919995, 0.267558331}, // 14897K {0.263917915, 0.267555624}, // 14898K {0.263915835, 0.267552916}, // 14899K {0.263913756, 0.267550209}, // 14900K {0.263911677, 0.267547503}, // 14901K {0.263909598, 0.267544797}, // 14902K {0.26390752, 0.267542092}, // 14903K {0.263905442, 0.267539386}, // 14904K {0.263903364, 0.267536682}, // 14905K {0.263901286, 0.267533977}, // 14906K {0.263899209, 0.267531273}, // 14907K {0.263897133, 0.26752857}, // 14908K {0.263895056, 0.267525867}, // 14909K {0.26389298, 0.267523164}, // 14910K {0.263890905, 0.267520462}, // 14911K {0.263888829, 0.26751776}, // 14912K {0.263886754, 0.267515058}, // 14913K {0.263884679, 0.267512357}, // 14914K {0.263882605, 0.267509656}, // 14915K {0.263880531, 0.267506956}, // 14916K {0.263878457, 0.267504256}, // 14917K {0.263876384, 0.267501557}, // 14918K {0.263874311, 0.267498858}, // 14919K {0.263872238, 0.267496159}, // 14920K {0.263870166, 0.267493461}, // 14921K {0.263868094, 0.267490763}, // 14922K {0.263866022, 0.267488066}, // 14923K {0.263863951, 0.267485369}, // 14924K {0.26386188, 0.267482672}, // 14925K {0.26385981, 0.267479976}, // 14926K {0.263857739, 0.26747728}, // 14927K {0.263855669, 0.267474585}, // 14928K {0.2638536, 0.26747189}, // 14929K {0.26385153, 0.267469195}, // 14930K {0.263849461, 0.267466501}, // 14931K {0.263847393, 0.267463807}, // 14932K {0.263845325, 0.267461114}, // 14933K {0.263843257, 0.267458421}, // 14934K {0.263841189, 0.267455728}, // 14935K {0.263839122, 0.267453036}, // 14936K {0.263837055, 0.267450345}, // 14937K {0.263834988, 0.267447653}, // 14938K {0.263832922, 0.267444962}, // 14939K {0.263830856, 0.267442272}, // 14940K {0.263828791, 0.267439582}, // 14941K {0.263826725, 0.267436892}, // 14942K {0.26382466, 0.267434203}, // 14943K {0.263822596, 0.267431514}, // 14944K {0.263820532, 0.267428825}, // 14945K {0.263818468, 0.267426137}, // 14946K {0.263816404, 0.26742345}, // 14947K {0.263814341, 0.267420762}, // 14948K {0.263812278, 0.267418076}, // 14949K {0.263810215, 0.267415389}, // 14950K {0.263808153, 0.267412703}, // 14951K {0.263806091, 0.267410017}, // 14952K {0.26380403, 0.267407332}, // 14953K {0.263801969, 0.267404647}, // 14954K {0.263799908, 0.267401963}, // 14955K {0.263797847, 0.267399279}, // 14956K {0.263795787, 0.267396595}, // 14957K {0.263793727, 0.267393912}, // 14958K {0.263791668, 0.267391229}, // 14959K {0.263789608, 0.267388547}, // 14960K {0.26378755, 0.267385865}, // 14961K {0.263785491, 0.267383183}, // 14962K {0.263783433, 0.267380502}, // 14963K {0.263781375, 0.267377821}, // 14964K {0.263779317, 0.267375141}, // 14965K {0.26377726, 0.267372461}, // 14966K {0.263775203, 0.267369782}, // 14967K {0.263773147, 0.267367102}, // 14968K {0.263771091, 0.267364424}, // 14969K {0.263769035, 0.267361745}, // 14970K {0.263766979, 0.267359067}, // 14971K {0.263764924, 0.26735639}, // 14972K {0.263762869, 0.267353713}, // 14973K {0.263760815, 0.267351036}, // 14974K {0.263758761, 0.267348359}, // 14975K {0.263756707, 0.267345684}, // 14976K {0.263754653, 0.267343008}, // 14977K {0.2637526, 0.267340333}, // 14978K {0.263750547, 0.267337658}, // 14979K {0.263748495, 0.267334984}, // 14980K {0.263746443, 0.26733231}, // 14981K {0.263744391, 0.267329636}, // 14982K {0.263742339, 0.267326963}, // 14983K {0.263740288, 0.267324291}, // 14984K {0.263738237, 0.267321618}, // 14985K {0.263736187, 0.267318946}, // 14986K {0.263734136, 0.267316275}, // 14987K {0.263732087, 0.267313604}, // 14988K {0.263730037, 0.267310933}, // 14989K {0.263727988, 0.267308263}, // 14990K {0.263725939, 0.267305593}, // 14991K {0.263723891, 0.267302923}, // 14992K {0.263721842, 0.267300254}, // 14993K {0.263719794, 0.267297585}, // 14994K {0.263717747, 0.267294917}, // 14995K {0.2637157, 0.267292249}, // 14996K {0.263713653, 0.267289582}, // 14997K {0.263711606, 0.267286915}, // 14998K {0.26370956, 0.267284248}, // 14999K {0.263707514, 0.267281582}, // 15000K {0.263705469, 0.267278916}, // 15001K {0.263703424, 0.26727625}, // 15002K {0.263701379, 0.267273585}, // 15003K {0.263699334, 0.26727092}, // 15004K {0.26369729, 0.267268256}, // 15005K {0.263695246, 0.267265592}, // 15006K {0.263693203, 0.267262929}, // 15007K {0.263691159, 0.267260266}, // 15008K {0.263689117, 0.267257603}, // 15009K {0.263687074, 0.267254941}, // 15010K {0.263685032, 0.267252279}, // 15011K {0.26368299, 0.267249617}, // 15012K {0.263680948, 0.267246956}, // 15013K {0.263678907, 0.267244296}, // 15014K {0.263676866, 0.267241635}, // 15015K {0.263674826, 0.267238975}, // 15016K {0.263672785, 0.267236316}, // 15017K {0.263670746, 0.267233657}, // 15018K {0.263668706, 0.267230998}, // 15019K {0.263666667, 0.26722834}, // 15020K {0.263664628, 0.267225682}, // 15021K {0.263662589, 0.267223024}, // 15022K {0.263660551, 0.267220367}, // 15023K {0.263658513, 0.267217711}, // 15024K {0.263656476, 0.267215054}, // 15025K {0.263654438, 0.267212398}, // 15026K {0.263652401, 0.267209743}, // 15027K {0.263650365, 0.267207088}, // 15028K {0.263648328, 0.267204433}, // 15029K {0.263646293, 0.267201779}, // 15030K {0.263644257, 0.267199125}, // 15031K {0.263642222, 0.267196471}, // 15032K {0.263640187, 0.267193818}, // 15033K {0.263638152, 0.267191166}, // 15034K {0.263636118, 0.267188513}, // 15035K {0.263634084, 0.267185861}, // 15036K {0.26363205, 0.26718321}, // 15037K {0.263630017, 0.267180559}, // 15038K {0.263627984, 0.267177908}, // 15039K {0.263625951, 0.267175258}, // 15040K {0.263623919, 0.267172608}, // 15041K {0.263621887, 0.267169958}, // 15042K {0.263619855, 0.267167309}, // 15043K {0.263617824, 0.26716466}, // 15044K {0.263615793, 0.267162012}, // 15045K {0.263613762, 0.267159364}, // 15046K {0.263611732, 0.267156716}, // 15047K {0.263609702, 0.267154069}, // 15048K {0.263607672, 0.267151422}, // 15049K {0.263605643, 0.267148776}, // 15050K {0.263603614, 0.26714613}, // 15051K {0.263601585, 0.267143485}, // 15052K {0.263599557, 0.267140839}, // 15053K {0.263597529, 0.267138195}, // 15054K {0.263595501, 0.26713555}, // 15055K {0.263593474, 0.267132906}, // 15056K {0.263591447, 0.267130263}, // 15057K {0.26358942, 0.267127619}, // 15058K {0.263587393, 0.267124977}, // 15059K {0.263585367, 0.267122334}, // 15060K {0.263583342, 0.267119692}, // 15061K {0.263581316, 0.267117051}, // 15062K {0.263579291, 0.267114409}, // 15063K {0.263577266, 0.267111769}, // 15064K {0.263575242, 0.267109128}, // 15065K {0.263573218, 0.267106488}, // 15066K {0.263571194, 0.267103849}, // 15067K {0.26356917, 0.267101209}, // 15068K {0.263567147, 0.267098571}, // 15069K {0.263565124, 0.267095932}, // 15070K {0.263563102, 0.267093294}, // 15071K {0.26356108, 0.267090656}, // 15072K {0.263559058, 0.267088019}, // 15073K {0.263557036, 0.267085382}, // 15074K {0.263555015, 0.267082746}, // 15075K {0.263552994, 0.26708011}, // 15076K {0.263550974, 0.267077474}, // 15077K {0.263548954, 0.267074839}, // 15078K {0.263546934, 0.267072204}, // 15079K {0.263544914, 0.267069569}, // 15080K {0.263542895, 0.267066935}, // 15081K {0.263540876, 0.267064301}, // 15082K {0.263538857, 0.267061668}, // 15083K {0.263536839, 0.267059035}, // 15084K {0.263534821, 0.267056403}, // 15085K {0.263532804, 0.267053771}, // 15086K {0.263530786, 0.267051139}, // 15087K {0.263528769, 0.267048507}, // 15088K {0.263526753, 0.267045877}, // 15089K {0.263524737, 0.267043246}, // 15090K {0.263522721, 0.267040616}, // 15091K {0.263520705, 0.267037986}, // 15092K {0.26351869, 0.267035357}, // 15093K {0.263516675, 0.267032728}, // 15094K {0.26351466, 0.267030099}, // 15095K {0.263512646, 0.267027471}, // 15096K {0.263510632, 0.267024843}, // 15097K {0.263508618, 0.267022216}, // 15098K {0.263506604, 0.267019589}, // 15099K {0.263504591, 0.267016962}, // 15100K {0.263502579, 0.267014336}, // 15101K {0.263500566, 0.26701171}, // 15102K {0.263498554, 0.267009084}, // 15103K {0.263496542, 0.267006459}, // 15104K {0.263494531, 0.267003835}, // 15105K {0.26349252, 0.26700121}, // 15106K {0.263490509, 0.266998586}, // 15107K {0.263488499, 0.266995963}, // 15108K {0.263486489, 0.26699334}, // 15109K {0.263484479, 0.266990717}, // 15110K {0.263482469, 0.266988095}, // 15111K {0.26348046, 0.266985473}, // 15112K {0.263478451, 0.266982851}, // 15113K {0.263476443, 0.26698023}, // 15114K {0.263474434, 0.266977609}, // 15115K {0.263472427, 0.266974989}, // 15116K {0.263470419, 0.266972369}, // 15117K {0.263468412, 0.266969749}, // 15118K {0.263466405, 0.26696713}, // 15119K {0.263464398, 0.266964511}, // 15120K {0.263462392, 0.266961893}, // 15121K {0.263460386, 0.266959275}, // 15122K {0.263458381, 0.266956657}, // 15123K {0.263456375, 0.26695404}, // 15124K {0.26345437, 0.266951423}, // 15125K {0.263452366, 0.266948807}, // 15126K {0.263450361, 0.266946191}, // 15127K {0.263448357, 0.266943575}, // 15128K {0.263446354, 0.26694096}, // 15129K {0.26344435, 0.266938345}, // 15130K {0.263442347, 0.26693573}, // 15131K {0.263440344, 0.266933116}, // 15132K {0.263438342, 0.266930503}, // 15133K {0.26343634, 0.266927889}, // 15134K {0.263434338, 0.266925276}, // 15135K {0.263432337, 0.266922664}, // 15136K {0.263430336, 0.266920051}, // 15137K {0.263428335, 0.26691744}, // 15138K {0.263426334, 0.266914828}, // 15139K {0.263424334, 0.266912217}, // 15140K {0.263422335, 0.266909607}, // 15141K {0.263420335, 0.266906996}, // 15142K {0.263418336, 0.266904387}, // 15143K {0.263416337, 0.266901777}, // 15144K {0.263414338, 0.266899168}, // 15145K {0.26341234, 0.266896559}, // 15146K {0.263410342, 0.266893951}, // 15147K {0.263408345, 0.266891343}, // 15148K {0.263406347, 0.266888736}, // 15149K {0.263404351, 0.266886129}, // 15150K {0.263402354, 0.266883522}, // 15151K {0.263400358, 0.266880916}, // 15152K {0.263398362, 0.26687831}, // 15153K {0.263396366, 0.266875704}, // 15154K {0.263394371, 0.266873099}, // 15155K {0.263392376, 0.266870494}, // 15156K {0.263390381, 0.26686789}, // 15157K {0.263388387, 0.266865286}, // 15158K {0.263386393, 0.266862682}, // 15159K {0.263384399, 0.266860079}, // 15160K {0.263382405, 0.266857476}, // 15161K {0.263380412, 0.266854873}, // 15162K {0.26337842, 0.266852271}, // 15163K {0.263376427, 0.26684967}, // 15164K {0.263374435, 0.266847068}, // 15165K {0.263372443, 0.266844467}, // 15166K {0.263370452, 0.266841867}, // 15167K {0.26336846, 0.266839267}, // 15168K {0.26336647, 0.266836667}, // 15169K {0.263364479, 0.266834068}, // 15170K {0.263362489, 0.266831469}, // 15171K {0.263360499, 0.26682887}, // 15172K {0.263358509, 0.266826272}, // 15173K {0.26335652, 0.266823674}, // 15174K {0.263354531, 0.266821077}, // 15175K {0.263352543, 0.266818479}, // 15176K {0.263350554, 0.266815883}, // 15177K {0.263348566, 0.266813287}, // 15178K {0.263346579, 0.266810691}, // 15179K {0.263344591, 0.266808095}, // 15180K {0.263342604, 0.2668055}, // 15181K {0.263340618, 0.266802905}, // 15182K {0.263338631, 0.266800311}, // 15183K {0.263336645, 0.266797717}, // 15184K {0.263334659, 0.266795123}, // 15185K {0.263332674, 0.26679253}, // 15186K {0.263330689, 0.266789937}, // 15187K {0.263328704, 0.266787345}, // 15188K {0.263326719, 0.266784753}, // 15189K {0.263324735, 0.266782161}, // 15190K {0.263322751, 0.26677957}, // 15191K {0.263320768, 0.266776979}, // 15192K {0.263318785, 0.266774389}, // 15193K {0.263316802, 0.266771798}, // 15194K {0.263314819, 0.266769209}, // 15195K {0.263312837, 0.266766619}, // 15196K {0.263310855, 0.26676403}, // 15197K {0.263308873, 0.266761442}, // 15198K {0.263306892, 0.266758854}, // 15199K {0.263304911, 0.266756266}, // 15200K {0.26330293, 0.266753678}, // 15201K {0.26330095, 0.266751091}, // 15202K {0.26329897, 0.266748505}, // 15203K {0.26329699, 0.266745918}, // 15204K {0.263295011, 0.266743333}, // 15205K {0.263293032, 0.266740747}, // 15206K {0.263291053, 0.266738162}, // 15207K {0.263289074, 0.266735577}, // 15208K {0.263287096, 0.266732993}, // 15209K {0.263285118, 0.266730409}, // 15210K {0.263283141, 0.266727825}, // 15211K {0.263281164, 0.266725242}, // 15212K {0.263279187, 0.266722659}, // 15213K {0.26327721, 0.266720077}, // 15214K {0.263275234, 0.266717495}, // 15215K {0.263273258, 0.266714913}, // 15216K {0.263271282, 0.266712332}, // 15217K {0.263269307, 0.266709751}, // 15218K {0.263267332, 0.26670717}, // 15219K {0.263265357, 0.26670459}, // 15220K {0.263263383, 0.26670201}, // 15221K {0.263261409, 0.266699431}, // 15222K {0.263259435, 0.266696852}, // 15223K {0.263257462, 0.266694273}, // 15224K {0.263255489, 0.266691695}, // 15225K {0.263253516, 0.266689117}, // 15226K {0.263251544, 0.26668654}, // 15227K {0.263249571, 0.266683963}, // 15228K {0.2632476, 0.266681386}, // 15229K {0.263245628, 0.26667881}, // 15230K {0.263243657, 0.266676234}, // 15231K {0.263241686, 0.266673658}, // 15232K {0.263239715, 0.266671083}, // 15233K {0.263237745, 0.266668508}, // 15234K {0.263235775, 0.266665934}, // 15235K {0.263233805, 0.26666336}, // 15236K {0.263231836, 0.266660786}, // 15237K {0.263229867, 0.266658213}, // 15238K {0.263227898, 0.26665564}, // 15239K {0.26322593, 0.266653068}, // 15240K {0.263223962, 0.266650495}, // 15241K {0.263221994, 0.266647924}, // 15242K {0.263220027, 0.266645352}, // 15243K {0.26321806, 0.266642781}, // 15244K {0.263216093, 0.266640211}, // 15245K {0.263214126, 0.26663764}, // 15246K {0.26321216, 0.266635071}, // 15247K {0.263210194, 0.266632501}, // 15248K {0.263208229, 0.266629932}, // 15249K {0.263206264, 0.266627363}, // 15250K {0.263204299, 0.266624795}, // 15251K {0.263202334, 0.266622227}, // 15252K {0.26320037, 0.26661966}, // 15253K {0.263198406, 0.266617092}, // 15254K {0.263196442, 0.266614526}, // 15255K {0.263194479, 0.266611959}, // 15256K {0.263192516, 0.266609393}, // 15257K {0.263190553, 0.266606827}, // 15258K {0.26318859, 0.266604262}, // 15259K {0.263186628, 0.266601697}, // 15260K {0.263184666, 0.266599133}, // 15261K {0.263182705, 0.266596569}, // 15262K {0.263180744, 0.266594005}, // 15263K {0.263178783, 0.266591441}, // 15264K {0.263176822, 0.266588878}, // 15265K {0.263174862, 0.266586316}, // 15266K {0.263172902, 0.266583753}, // 15267K {0.263170943, 0.266581192}, // 15268K {0.263168983, 0.26657863}, // 15269K {0.263167024, 0.266576069}, // 15270K {0.263165066, 0.266573508}, // 15271K {0.263163107, 0.266570948}, // 15272K {0.263161149, 0.266568388}, // 15273K {0.263159191, 0.266565828}, // 15274K {0.263157234, 0.266563269}, // 15275K {0.263155277, 0.26656071}, // 15276K {0.26315332, 0.266558152}, // 15277K {0.263151364, 0.266555594}, // 15278K {0.263149407, 0.266553036}, // 15279K {0.263147451, 0.266550479}, // 15280K {0.263145496, 0.266547922}, // 15281K {0.263143541, 0.266545365}, // 15282K {0.263141586, 0.266542809}, // 15283K {0.263139631, 0.266540253}, // 15284K {0.263137677, 0.266537698}, // 15285K {0.263135723, 0.266535143}, // 15286K {0.263133769, 0.266532588}, // 15287K {0.263131816, 0.266530034}, // 15288K {0.263129863, 0.26652748}, // 15289K {0.26312791, 0.266524926}, // 15290K {0.263125957, 0.266522373}, // 15291K {0.263124005, 0.26651982}, // 15292K {0.263122053, 0.266517268}, // 15293K {0.263120102, 0.266514716}, // 15294K {0.263118151, 0.266512164}, // 15295K {0.2631162, 0.266509613}, // 15296K {0.263114249, 0.266507062}, // 15297K {0.263112299, 0.266504511}, // 15298K {0.263110349, 0.266501961}, // 15299K {0.263108399, 0.266499411}, // 15300K {0.26310645, 0.266496862}, // 15301K {0.263104501, 0.266494313}, // 15302K {0.263102552, 0.266491764}, // 15303K {0.263100604, 0.266489216}, // 15304K {0.263098655, 0.266486668}, // 15305K {0.263096708, 0.26648412}, // 15306K {0.26309476, 0.266481573}, // 15307K {0.263092813, 0.266479026}, // 15308K {0.263090866, 0.26647648}, // 15309K {0.263088919, 0.266473934}, // 15310K {0.263086973, 0.266471388}, // 15311K {0.263085027, 0.266468843}, // 15312K {0.263083082, 0.266466298}, // 15313K {0.263081136, 0.266463753}, // 15314K {0.263079191, 0.266461209}, // 15315K {0.263077246, 0.266458665}, // 15316K {0.263075302, 0.266456122}, // 15317K {0.263073358, 0.266453579}, // 15318K {0.263071414, 0.266451036}, // 15319K {0.263069471, 0.266448494}, // 15320K {0.263067527, 0.266445952}, // 15321K {0.263065585, 0.266443411}, // 15322K {0.263063642, 0.266440869}, // 15323K {0.2630617, 0.266438329}, // 15324K {0.263059758, 0.266435788}, // 15325K {0.263057816, 0.266433248}, // 15326K {0.263055875, 0.266430709}, // 15327K {0.263053934, 0.266428169}, // 15328K {0.263051993, 0.26642563}, // 15329K {0.263050053, 0.266423092}, // 15330K {0.263048113, 0.266420554}, // 15331K {0.263046173, 0.266418016}, // 15332K {0.263044233, 0.266415478}, // 15333K {0.263042294, 0.266412941}, // 15334K {0.263040355, 0.266410405}, // 15335K {0.263038417, 0.266407868}, // 15336K {0.263036478, 0.266405332}, // 15337K {0.26303454, 0.266402797}, // 15338K {0.263032603, 0.266400262}, // 15339K {0.263030665, 0.266397727}, // 15340K {0.263028728, 0.266395192}, // 15341K {0.263026792, 0.266392658}, // 15342K {0.263024855, 0.266390125}, // 15343K {0.263022919, 0.266387591}, // 15344K {0.263020983, 0.266385058}, // 15345K {0.263019048, 0.266382526}, // 15346K {0.263017113, 0.266379994}, // 15347K {0.263015178, 0.266377462}, // 15348K {0.263013243, 0.26637493}, // 15349K {0.263011309, 0.266372399}, // 15350K {0.263009375, 0.266369868}, // 15351K {0.263007441, 0.266367338}, // 15352K {0.263005508, 0.266364808}, // 15353K {0.263003575, 0.266362279}, // 15354K {0.263001642, 0.266359749}, // 15355K {0.26299971, 0.26635722}, // 15356K {0.262997778, 0.266354692}, // 15357K {0.262995846, 0.266352164}, // 15358K {0.262993914, 0.266349636}, // 15359K {0.262991983, 0.266347109}, // 15360K {0.262990052, 0.266344582}, // 15361K {0.262988121, 0.266342055}, // 15362K {0.262986191, 0.266339529}, // 15363K {0.262984261, 0.266337003}, // 15364K {0.262982331, 0.266334477}, // 15365K {0.262980402, 0.266331952}, // 15366K {0.262978473, 0.266329428}, // 15367K {0.262976544, 0.266326903}, // 15368K {0.262974616, 0.266324379}, // 15369K {0.262972688, 0.266321855}, // 15370K {0.26297076, 0.266319332}, // 15371K {0.262968832, 0.266316809}, // 15372K {0.262966905, 0.266314287}, // 15373K {0.262964978, 0.266311765}, // 15374K {0.262963051, 0.266309243}, // 15375K {0.262961125, 0.266306721}, // 15376K {0.262959199, 0.2663042}, // 15377K {0.262957273, 0.26630168}, // 15378K {0.262955348, 0.266299159}, // 15379K {0.262953423, 0.266296639}, // 15380K {0.262951498, 0.26629412}, // 15381K {0.262949573, 0.2662916}, // 15382K {0.262947649, 0.266289082}, // 15383K {0.262945725, 0.266286563}, // 15384K {0.262943802, 0.266284045}, // 15385K {0.262941878, 0.266281527}, // 15386K {0.262939955, 0.26627901}, // 15387K {0.262938033, 0.266276493}, // 15388K {0.26293611, 0.266273976}, // 15389K {0.262934188, 0.26627146}, // 15390K {0.262932266, 0.266268944}, // 15391K {0.262930345, 0.266266429}, // 15392K {0.262928424, 0.266263913}, // 15393K {0.262926503, 0.266261399}, // 15394K {0.262924582, 0.266258884}, // 15395K {0.262922662, 0.26625637}, // 15396K {0.262920742, 0.266253857}, // 15397K {0.262918822, 0.266251343}, // 15398K {0.262916903, 0.26624883}, // 15399K {0.262914984, 0.266246318}, // 15400K {0.262913065, 0.266243806}, // 15401K {0.262911147, 0.266241294}, // 15402K {0.262909229, 0.266238782}, // 15403K {0.262907311, 0.266236271}, // 15404K {0.262905393, 0.26623376}, // 15405K {0.262903476, 0.26623125}, // 15406K {0.262901559, 0.26622874}, // 15407K {0.262899643, 0.26622623}, // 15408K {0.262897726, 0.266223721}, // 15409K {0.26289581, 0.266221212}, // 15410K {0.262893894, 0.266218704}, // 15411K {0.262891979, 0.266216196}, // 15412K {0.262890064, 0.266213688}, // 15413K {0.262888149, 0.26621118}, // 15414K {0.262886235, 0.266208673}, // 15415K {0.26288432, 0.266206167}, // 15416K {0.262882406, 0.26620366}, // 15417K {0.262880493, 0.266201154}, // 15418K {0.262878579, 0.266198649}, // 15419K {0.262876666, 0.266196143}, // 15420K {0.262874754, 0.266193639}, // 15421K {0.262872841, 0.266191134}, // 15422K {0.262870929, 0.26618863}, // 15423K {0.262869017, 0.266186126}, // 15424K {0.262867106, 0.266183623}, // 15425K {0.262865195, 0.26618112}, // 15426K {0.262863284, 0.266178617}, // 15427K {0.262861373, 0.266176115}, // 15428K {0.262859463, 0.266173613}, // 15429K {0.262857553, 0.266171111}, // 15430K {0.262855643, 0.26616861}, // 15431K {0.262853734, 0.266166109}, // 15432K {0.262851825, 0.266163609}, // 15433K {0.262849916, 0.266161109}, // 15434K {0.262848007, 0.266158609}, // 15435K {0.262846099, 0.26615611}, // 15436K {0.262844191, 0.266153611}, // 15437K {0.262842284, 0.266151112}, // 15438K {0.262840376, 0.266148614}, // 15439K {0.262838469, 0.266146116}, // 15440K {0.262836563, 0.266143618}, // 15441K {0.262834656, 0.266141121}, // 15442K {0.26283275, 0.266138624}, // 15443K {0.262830844, 0.266136128}, // 15444K {0.262828939, 0.266133632}, // 15445K {0.262827034, 0.266131136}, // 15446K {0.262825129, 0.266128641}, // 15447K {0.262823224, 0.266126146}, // 15448K {0.26282132, 0.266123651}, // 15449K {0.262819416, 0.266121157}, // 15450K {0.262817512, 0.266118663}, // 15451K {0.262815609, 0.26611617}, // 15452K {0.262813706, 0.266113676}, // 15453K {0.262811803, 0.266111184}, // 15454K {0.2628099, 0.266108691}, // 15455K {0.262807998, 0.266106199}, // 15456K {0.262806096, 0.266103707}, // 15457K {0.262804195, 0.266101216}, // 15458K {0.262802293, 0.266098725}, // 15459K {0.262800392, 0.266096235}, // 15460K {0.262798492, 0.266093744}, // 15461K {0.262796591, 0.266091254}, // 15462K {0.262794691, 0.266088765}, // 15463K {0.262792791, 0.266086276}, // 15464K {0.262790892, 0.266083787}, // 15465K {0.262788993, 0.266081299}, // 15466K {0.262787094, 0.26607881}, // 15467K {0.262785195, 0.266076323}, // 15468K {0.262783297, 0.266073835}, // 15469K {0.262781399, 0.266071348}, // 15470K {0.262779501, 0.266068862}, // 15471K {0.262777603, 0.266066376}, // 15472K {0.262775706, 0.26606389}, // 15473K {0.26277381, 0.266061404}, // 15474K {0.262771913, 0.266058919}, // 15475K {0.262770017, 0.266056434}, // 15476K {0.262768121, 0.26605395}, // 15477K {0.262766225, 0.266051466}, // 15478K {0.26276433, 0.266048982}, // 15479K {0.262762435, 0.266046499}, // 15480K {0.26276054, 0.266044016}, // 15481K {0.262758646, 0.266041533}, // 15482K {0.262756751, 0.266039051}, // 15483K {0.262754858, 0.266036569}, // 15484K {0.262752964, 0.266034087}, // 15485K {0.262751071, 0.266031606}, // 15486K {0.262749178, 0.266029125}, // 15487K {0.262747285, 0.266026645}, // 15488K {0.262745393, 0.266024165}, // 15489K {0.262743501, 0.266021685}, // 15490K {0.262741609, 0.266019206}, // 15491K {0.262739717, 0.266016727}, // 15492K {0.262737826, 0.266014248}, // 15493K {0.262735935, 0.26601177}, // 15494K {0.262734045, 0.266009292}, // 15495K {0.262732154, 0.266006814}, // 15496K {0.262730264, 0.266004337}, // 15497K {0.262728375, 0.26600186}, // 15498K {0.262726485, 0.265999384}, // 15499K {0.262724596, 0.265996908}, // 15500K {0.262722707, 0.265994432}, // 15501K {0.262720819, 0.265991956}, // 15502K {0.26271893, 0.265989481}, // 15503K {0.262717043, 0.265987007}, // 15504K {0.262715155, 0.265984532}, // 15505K {0.262713268, 0.265982058}, // 15506K {0.26271138, 0.265979585}, // 15507K {0.262709494, 0.265977112}, // 15508K {0.262707607, 0.265974639}, // 15509K {0.262705721, 0.265972166}, // 15510K {0.262703835, 0.265969694}, // 15511K {0.26270195, 0.265967222}, // 15512K {0.262700064, 0.265964751}, // 15513K {0.262698179, 0.26596228}, // 15514K {0.262696295, 0.265959809}, // 15515K {0.26269441, 0.265957339}, // 15516K {0.262692526, 0.265954869}, // 15517K {0.262690642, 0.265952399}, // 15518K {0.262688759, 0.26594993}, // 15519K {0.262686876, 0.265947461}, // 15520K {0.262684993, 0.265944992}, // 15521K {0.26268311, 0.265942524}, // 15522K {0.262681228, 0.265940056}, // 15523K {0.262679346, 0.265937589}, // 15524K {0.262677464, 0.265935122}, // 15525K {0.262675583, 0.265932655}, // 15526K {0.262673701, 0.265930189}, // 15527K {0.262671821, 0.265927722}, // 15528K {0.26266994, 0.265925257}, // 15529K {0.26266806, 0.265922791}, // 15530K {0.26266618, 0.265920326}, // 15531K {0.2626643, 0.265917862}, // 15532K {0.262662421, 0.265915398}, // 15533K {0.262660542, 0.265912934}, // 15534K {0.262658663, 0.26591047}, // 15535K {0.262656784, 0.265908007}, // 15536K {0.262654906, 0.265905544}, // 15537K {0.262653028, 0.265903082}, // 15538K {0.262651151, 0.26590062}, // 15539K {0.262649273, 0.265898158}, // 15540K {0.262647396, 0.265895696}, // 15541K {0.262645519, 0.265893235}, // 15542K {0.262643643, 0.265890775}, // 15543K {0.262641767, 0.265888314}, // 15544K {0.262639891, 0.265885854}, // 15545K {0.262638015, 0.265883395}, // 15546K {0.26263614, 0.265880936}, // 15547K {0.262634265, 0.265878477}, // 15548K {0.26263239, 0.265876018}, // 15549K {0.262630516, 0.26587356}, // 15550K {0.262628642, 0.265871102}, // 15551K {0.262626768, 0.265868645}, // 15552K {0.262624895, 0.265866188}, // 15553K {0.262623021, 0.265863731}, // 15554K {0.262621148, 0.265861275}, // 15555K {0.262619276, 0.265858818}, // 15556K {0.262617403, 0.265856363}, // 15557K {0.262615531, 0.265853908}, // 15558K {0.262613659, 0.265851453}, // 15559K {0.262611788, 0.265848998}, // 15560K {0.262609917, 0.265846544}, // 15561K {0.262608046, 0.26584409}, // 15562K {0.262606175, 0.265841636}, // 15563K {0.262604305, 0.265839183}, // 15564K {0.262602435, 0.26583673}, // 15565K {0.262600565, 0.265834278}, // 15566K {0.262598696, 0.265831826}, // 15567K {0.262596827, 0.265829374}, // 15568K {0.262594958, 0.265826922}, // 15569K {0.262593089, 0.265824471}, // 15570K {0.262591221, 0.265822021}, // 15571K {0.262589353, 0.26581957}, // 15572K {0.262587485, 0.26581712}, // 15573K {0.262585618, 0.265814671}, // 15574K {0.262583751, 0.265812222}, // 15575K {0.262581884, 0.265809773}, // 15576K {0.262580017, 0.265807324}, // 15577K {0.262578151, 0.265804876}, // 15578K {0.262576285, 0.265802428}, // 15579K {0.26257442, 0.26579998}, // 15580K {0.262572554, 0.265797533}, // 15581K {0.262570689, 0.265795087}, // 15582K {0.262568824, 0.26579264}, // 15583K {0.26256696, 0.265790194}, // 15584K {0.262565096, 0.265787748}, // 15585K {0.262563232, 0.265785303}, // 15586K {0.262561368, 0.265782858}, // 15587K {0.262559505, 0.265780413}, // 15588K {0.262557642, 0.265777969}, // 15589K {0.262555779, 0.265775525}, // 15590K {0.262553917, 0.265773081}, // 15591K {0.262552054, 0.265770638}, // 15592K {0.262550193, 0.265768195}, // 15593K {0.262548331, 0.265765753}, // 15594K {0.26254647, 0.265763311}, // 15595K {0.262544609, 0.265760869}, // 15596K {0.262542748, 0.265758427}, // 15597K {0.262540887, 0.265755986}, // 15598K {0.262539027, 0.265753545}, // 15599K {0.262537167, 0.265751105}, // 15600K {0.262535308, 0.265748665}, // 15601K {0.262533449, 0.265746225}, // 15602K {0.26253159, 0.265743786}, // 15603K {0.262529731, 0.265741347}, // 15604K {0.262527873, 0.265738908}, // 15605K {0.262526014, 0.26573647}, // 15606K {0.262524157, 0.265734032}, // 15607K {0.262522299, 0.265731594}, // 15608K {0.262520442, 0.265729157}, // 15609K {0.262518585, 0.26572672}, // 15610K {0.262516728, 0.265724284}, // 15611K {0.262514872, 0.265721848}, // 15612K {0.262513016, 0.265719412}, // 15613K {0.26251116, 0.265716976}, // 15614K {0.262509304, 0.265714541}, // 15615K {0.262507449, 0.265712106}, // 15616K {0.262505594, 0.265709672}, // 15617K {0.262503739, 0.265707238}, // 15618K {0.262501885, 0.265704804}, // 15619K {0.262500031, 0.265702371}, // 15620K {0.262498177, 0.265699938}, // 15621K {0.262496324, 0.265697505}, // 15622K {0.262494471, 0.265695073}, // 15623K {0.262492618, 0.265692641}, // 15624K {0.262490765, 0.265690209}, // 15625K {0.262488913, 0.265687778}, // 15626K {0.262487061, 0.265685347}, // 15627K {0.262485209, 0.265682917}, // 15628K {0.262483357, 0.265680486}, // 15629K {0.262481506, 0.265678057}, // 15630K {0.262479655, 0.265675627}, // 15631K {0.262477805, 0.265673198}, // 15632K {0.262475954, 0.265670769}, // 15633K {0.262474104, 0.265668341}, // 15634K {0.262472254, 0.265665913}, // 15635K {0.262470405, 0.265663485}, // 15636K {0.262468556, 0.265661057}, // 15637K {0.262466707, 0.26565863}, // 15638K {0.262464858, 0.265656204}, // 15639K {0.26246301, 0.265653777}, // 15640K {0.262461162, 0.265651351}, // 15641K {0.262459314, 0.265648926}, // 15642K {0.262457467, 0.2656465}, // 15643K {0.262455619, 0.265644076}, // 15644K {0.262453772, 0.265641651}, // 15645K {0.262451926, 0.265639227}, // 15646K {0.26245008, 0.265636803}, // 15647K {0.262448234, 0.265634379}, // 15648K {0.262446388, 0.265631956}, // 15649K {0.262444542, 0.265629533}, // 15650K {0.262442697, 0.265627111}, // 15651K {0.262440852, 0.265624689}, // 15652K {0.262439008, 0.265622267}, // 15653K {0.262437163, 0.265619845}, // 15654K {0.262435319, 0.265617424}, // 15655K {0.262433476, 0.265615004}, // 15656K {0.262431632, 0.265612583}, // 15657K {0.262429789, 0.265610163}, // 15658K {0.262427946, 0.265607743}, // 15659K {0.262426103, 0.265605324}, // 15660K {0.262424261, 0.265602905}, // 15661K {0.262422419, 0.265600486}, // 15662K {0.262420577, 0.265598068}, // 15663K {0.262418736, 0.26559565}, // 15664K {0.262416895, 0.265593233}, // 15665K {0.262415054, 0.265590815}, // 15666K {0.262413213, 0.265588398}, // 15667K {0.262411373, 0.265585982}, // 15668K {0.262409533, 0.265583566}, // 15669K {0.262407693, 0.26558115}, // 15670K {0.262405854, 0.265578734}, // 15671K {0.262404014, 0.265576319}, // 15672K {0.262402175, 0.265573904}, // 15673K {0.262400337, 0.26557149}, // 15674K {0.262398498, 0.265569076}, // 15675K {0.26239666, 0.265566662}, // 15676K {0.262394823, 0.265564249}, // 15677K {0.262392985, 0.265561836}, // 15678K {0.262391148, 0.265559423}, // 15679K {0.262389311, 0.26555701}, // 15680K {0.262387474, 0.265554598}, // 15681K {0.262385638, 0.265552187}, // 15682K {0.262383802, 0.265549775}, // 15683K {0.262381966, 0.265547364}, // 15684K {0.262380131, 0.265544954}, // 15685K {0.262378296, 0.265542544}, // 15686K {0.262376461, 0.265540134}, // 15687K {0.262374626, 0.265537724}, // 15688K {0.262372792, 0.265535315}, // 15689K {0.262370958, 0.265532906}, // 15690K {0.262369124, 0.265530497}, // 15691K {0.26236729, 0.265528089}, // 15692K {0.262365457, 0.265525681}, // 15693K {0.262363624, 0.265523274}, // 15694K {0.262361792, 0.265520866}, // 15695K {0.262359959, 0.26551846}, // 15696K {0.262358127, 0.265516053}, // 15697K {0.262356295, 0.265513647}, // 15698K {0.262354464, 0.265511241}, // 15699K {0.262352632, 0.265508836}, // 15700K {0.262350802, 0.265506431}, // 15701K {0.262348971, 0.265504026}, // 15702K {0.26234714, 0.265501622}, // 15703K {0.26234531, 0.265499218}, // 15704K {0.262343481, 0.265496814}, // 15705K {0.262341651, 0.26549441}, // 15706K {0.262339822, 0.265492007}, // 15707K {0.262337993, 0.265489605}, // 15708K {0.262336164, 0.265487202}, // 15709K {0.262334336, 0.2654848}, // 15710K {0.262332508, 0.265482399}, // 15711K {0.26233068, 0.265479998}, // 15712K {0.262328852, 0.265477597}, // 15713K {0.262327025, 0.265475196}, // 15714K {0.262325198, 0.265472796}, // 15715K {0.262323371, 0.265470396}, // 15716K {0.262321545, 0.265467996}, // 15717K {0.262319719, 0.265465597}, // 15718K {0.262317893, 0.265463198}, // 15719K {0.262316067, 0.2654608}, // 15720K {0.262314242, 0.265458401}, // 15721K {0.262312417, 0.265456004}, // 15722K {0.262310592, 0.265453606}, // 15723K {0.262308768, 0.265451209}, // 15724K {0.262306943, 0.265448812}, // 15725K {0.262305119, 0.265446416}, // 15726K {0.262303296, 0.26544402}, // 15727K {0.262301472, 0.265441624}, // 15728K {0.262299649, 0.265439228}, // 15729K {0.262297827, 0.265436833}, // 15730K {0.262296004, 0.265434439}, // 15731K {0.262294182, 0.265432044}, // 15732K {0.26229236, 0.26542965}, // 15733K {0.262290538, 0.265427256}, // 15734K {0.262288717, 0.265424863}, // 15735K {0.262286896, 0.26542247}, // 15736K {0.262285075, 0.265420077}, // 15737K {0.262283255, 0.265417685}, // 15738K {0.262281434, 0.265415293}, // 15739K {0.262279614, 0.265412901}, // 15740K {0.262277795, 0.26541051}, // 15741K {0.262275975, 0.265408119}, // 15742K {0.262274156, 0.265405728}, // 15743K {0.262272337, 0.265403338}, // 15744K {0.262270519, 0.265400948}, // 15745K {0.2622687, 0.265398559}, // 15746K {0.262266882, 0.265396169}, // 15747K {0.262265065, 0.265393781}, // 15748K {0.262263247, 0.265391392}, // 15749K {0.26226143, 0.265389004}, // 15750K {0.262259613, 0.265386616}, // 15751K {0.262257797, 0.265384228}, // 15752K {0.26225598, 0.265381841}, // 15753K {0.262254164, 0.265379454}, // 15754K {0.262252348, 0.265377068}, // 15755K {0.262250533, 0.265374682}, // 15756K {0.262248718, 0.265372296}, // 15757K {0.262246903, 0.26536991}, // 15758K {0.262245088, 0.265367525}, // 15759K {0.262243274, 0.26536514}, // 15760K {0.26224146, 0.265362756}, // 15761K {0.262239646, 0.265360372}, // 15762K {0.262237832, 0.265357988}, // 15763K {0.262236019, 0.265355605}, // 15764K {0.262234206, 0.265353222}, // 15765K {0.262232393, 0.265350839}, // 15766K {0.262230581, 0.265348456}, // 15767K {0.262228769, 0.265346074}, // 15768K {0.262226957, 0.265343693}, // 15769K {0.262225145, 0.265341311}, // 15770K {0.262223334, 0.26533893}, // 15771K {0.262221523, 0.265336549}, // 15772K {0.262219712, 0.265334169}, // 15773K {0.262217902, 0.265331789}, // 15774K {0.262216092, 0.265329409}, // 15775K {0.262214282, 0.26532703}, // 15776K {0.262212472, 0.265324651}, // 15777K {0.262210663, 0.265322272}, // 15778K {0.262208854, 0.265319894}, // 15779K {0.262207045, 0.265317516}, // 15780K {0.262205236, 0.265315139}, // 15781K {0.262203428, 0.265312761}, // 15782K {0.26220162, 0.265310384}, // 15783K {0.262199813, 0.265308008}, // 15784K {0.262198005, 0.265305631}, // 15785K {0.262196198, 0.265303255}, // 15786K {0.262194391, 0.26530088}, // 15787K {0.262192585, 0.265298505}, // 15788K {0.262190778, 0.26529613}, // 15789K {0.262188972, 0.265293755}, // 15790K {0.262187167, 0.265291381}, // 15791K {0.262185361, 0.265289007}, // 15792K {0.262183556, 0.265286634}, // 15793K {0.262181751, 0.26528426}, // 15794K {0.262179946, 0.265281887}, // 15795K {0.262178142, 0.265279515}, // 15796K {0.262176338, 0.265277143}, // 15797K {0.262174534, 0.265274771}, // 15798K {0.262172731, 0.265272399}, // 15799K {0.262170927, 0.265270028}, // 15800K {0.262169124, 0.265267657}, // 15801K {0.262167322, 0.265265287}, // 15802K {0.262165519, 0.265262917}, // 15803K {0.262163717, 0.265260547}, // 15804K {0.262161915, 0.265258177}, // 15805K {0.262160114, 0.265255808}, // 15806K {0.262158312, 0.265253439}, // 15807K {0.262156511, 0.265251071}, // 15808K {0.26215471, 0.265248703}, // 15809K {0.26215291, 0.265246335}, // 15810K {0.26215111, 0.265243968}, // 15811K {0.26214931, 0.2652416}, // 15812K {0.26214751, 0.265239234}, // 15813K {0.262145711, 0.265236867}, // 15814K {0.262143912, 0.265234501}, // 15815K {0.262142113, 0.265232135}, // 15816K {0.262140314, 0.26522977}, // 15817K {0.262138516, 0.265227405}, // 15818K {0.262136718, 0.26522504}, // 15819K {0.26213492, 0.265222676}, // 15820K {0.262133123, 0.265220312}, // 15821K {0.262131326, 0.265217948}, // 15822K {0.262129529, 0.265215585}, // 15823K {0.262127732, 0.265213222}, // 15824K {0.262125936, 0.265210859}, // 15825K {0.26212414, 0.265208496}, // 15826K {0.262122344, 0.265206134}, // 15827K {0.262120548, 0.265203773}, // 15828K {0.262118753, 0.265201411}, // 15829K {0.262116958, 0.26519905}, // 15830K {0.262115164, 0.26519669}, // 15831K {0.262113369, 0.265194329}, // 15832K {0.262111575, 0.265191969}, // 15833K {0.262109781, 0.26518961}, // 15834K {0.262107987, 0.26518725}, // 15835K {0.262106194, 0.265184891}, // 15836K {0.262104401, 0.265182533}, // 15837K {0.262102608, 0.265180174}, // 15838K {0.262100816, 0.265177816}, // 15839K {0.262099024, 0.265175459}, // 15840K {0.262097232, 0.265173101}, // 15841K {0.26209544, 0.265170744}, // 15842K {0.262093649, 0.265168388}, // 15843K {0.262091857, 0.265166031}, // 15844K {0.262090067, 0.265163675}, // 15845K {0.262088276, 0.26516132}, // 15846K {0.262086486, 0.265158964}, // 15847K {0.262084696, 0.265156609}, // 15848K {0.262082906, 0.265154255}, // 15849K {0.262081116, 0.2651519}, // 15850K {0.262079327, 0.265149546}, // 15851K {0.262077538, 0.265147193}, // 15852K {0.26207575, 0.265144839}, // 15853K {0.262073961, 0.265142487}, // 15854K {0.262072173, 0.265140134}, // 15855K {0.262070385, 0.265137782}, // 15856K {0.262068598, 0.26513543}, // 15857K {0.26206681, 0.265133078}, // 15858K {0.262065023, 0.265130727}, // 15859K {0.262063237, 0.265128376}, // 15860K {0.26206145, 0.265126025}, // 15861K {0.262059664, 0.265123675}, // 15862K {0.262057878, 0.265121325}, // 15863K {0.262056092, 0.265118975}, // 15864K {0.262054307, 0.265116626}, // 15865K {0.262052522, 0.265114277}, // 15866K {0.262050737, 0.265111929}, // 15867K {0.262048952, 0.26510958}, // 15868K {0.262047168, 0.265107232}, // 15869K {0.262045384, 0.265104885}, // 15870K {0.2620436, 0.265102537}, // 15871K {0.262041817, 0.265100191}, // 15872K {0.262040034, 0.265097844}, // 15873K {0.262038251, 0.265095498}, // 15874K {0.262036468, 0.265093152}, // 15875K {0.262034686, 0.265090806}, // 15876K {0.262032904, 0.265088461}, // 15877K {0.262031122, 0.265086116}, // 15878K {0.26202934, 0.265083771}, // 15879K {0.262027559, 0.265081427}, // 15880K {0.262025778, 0.265079083}, // 15881K {0.262023997, 0.26507674}, // 15882K {0.262022217, 0.265074396}, // 15883K {0.262020436, 0.265072053}, // 15884K {0.262018656, 0.265069711}, // 15885K {0.262016877, 0.265067369}, // 15886K {0.262015097, 0.265065027}, // 15887K {0.262013318, 0.265062685}, // 15888K {0.262011539, 0.265060344}, // 15889K {0.262009761, 0.265058003}, // 15890K {0.262007982, 0.265055662}, // 15891K {0.262006204, 0.265053322}, // 15892K {0.262004427, 0.265050982}, // 15893K {0.262002649, 0.265048642}, // 15894K {0.262000872, 0.265046303}, // 15895K {0.261999095, 0.265043964}, // 15896K {0.261997318, 0.265041626}, // 15897K {0.261995542, 0.265039287}, // 15898K {0.261993766, 0.265036949}, // 15899K {0.26199199, 0.265034612}, // 15900K {0.261990214, 0.265032275}, // 15901K {0.261988439, 0.265029938}, // 15902K {0.261986664, 0.265027601}, // 15903K {0.261984889, 0.265025265}, // 15904K {0.261983114, 0.265022929}, // 15905K {0.26198134, 0.265020593}, // 15906K {0.261979566, 0.265018258}, // 15907K {0.261977793, 0.265015923}, // 15908K {0.261976019, 0.265013588}, // 15909K {0.261974246, 0.265011254}, // 15910K {0.261972473, 0.26500892}, // 15911K {0.2619707, 0.265006586}, // 15912K {0.261968928, 0.265004253}, // 15913K {0.261967156, 0.26500192}, // 15914K {0.261965384, 0.264999588}, // 15915K {0.261963613, 0.264997255}, // 15916K {0.261961841, 0.264994923}, // 15917K {0.26196007, 0.264992592}, // 15918K {0.2619583, 0.26499026}, // 15919K {0.261956529, 0.264987929}, // 15920K {0.261954759, 0.264985599}, // 15921K {0.261952989, 0.264983268}, // 15922K {0.261951219, 0.264980939}, // 15923K {0.26194945, 0.264978609}, // 15924K {0.261947681, 0.26497628}, // 15925K {0.261945912, 0.264973951}, // 15926K {0.261944143, 0.264971622}, // 15927K {0.261942375, 0.264969294}, // 15928K {0.261940607, 0.264966966}, // 15929K {0.261938839, 0.264964638}, // 15930K {0.261937072, 0.264962311}, // 15931K {0.261935304, 0.264959984}, // 15932K {0.261933537, 0.264957657}, // 15933K {0.261931771, 0.264955331}, // 15934K {0.261930004, 0.264953005}, // 15935K {0.261928238, 0.264950679}, // 15936K {0.261926472, 0.264948354}, // 15937K {0.261924707, 0.264946029}, // 15938K {0.261922941, 0.264943704}, // 15939K {0.261921176, 0.264941379}, // 15940K {0.261919411, 0.264939055}, // 15941K {0.261917647, 0.264936732}, // 15942K {0.261915882, 0.264934408}, // 15943K {0.261914118, 0.264932085}, // 15944K {0.261912355, 0.264929763}, // 15945K {0.261910591, 0.26492744}, // 15946K {0.261908828, 0.264925118}, // 15947K {0.261907065, 0.264922796}, // 15948K {0.261905302, 0.264920475}, // 15949K {0.26190354, 0.264918154}, // 15950K {0.261901778, 0.264915833}, // 15951K {0.261900016, 0.264913513}, // 15952K {0.261898254, 0.264911193}, // 15953K {0.261896493, 0.264908873}, // 15954K {0.261894732, 0.264906554}, // 15955K {0.261892971, 0.264904234}, // 15956K {0.261891211, 0.264901916}, // 15957K {0.26188945, 0.264899597}, // 15958K {0.26188769, 0.264897279}, // 15959K {0.261885931, 0.264894961}, // 15960K {0.261884171, 0.264892644}, // 15961K {0.261882412, 0.264890327}, // 15962K {0.261880653, 0.26488801}, // 15963K {0.261878894, 0.264885693}, // 15964K {0.261877136, 0.264883377}, // 15965K {0.261875378, 0.264881062}, // 15966K {0.26187362, 0.264878746}, // 15967K {0.261871862, 0.264876431}, // 15968K {0.261870105, 0.264874116}, // 15969K {0.261868348, 0.264871802}, // 15970K {0.261866591, 0.264869487}, // 15971K {0.261864835, 0.264867173}, // 15972K {0.261863078, 0.26486486}, // 15973K {0.261861322, 0.264862547}, // 15974K {0.261859567, 0.264860234}, // 15975K {0.261857811, 0.264857921}, // 15976K {0.261856056, 0.264855609}, // 15977K {0.261854301, 0.264853297}, // 15978K {0.261852546, 0.264850986}, // 15979K {0.261850792, 0.264848674}, // 15980K {0.261849038, 0.264846364}, // 15981K {0.261847284, 0.264844053}, // 15982K {0.26184553, 0.264841743}, // 15983K {0.261843777, 0.264839433}, // 15984K {0.261842024, 0.264837123}, // 15985K {0.261840271, 0.264834814}, // 15986K {0.261838519, 0.264832505}, // 15987K {0.261836766, 0.264830196}, // 15988K {0.261835014, 0.264827888}, // 15989K {0.261833262, 0.26482558}, // 15990K {0.261831511, 0.264823272}, // 15991K {0.26182976, 0.264820965}, // 15992K {0.261828009, 0.264818658}, // 15993K {0.261826258, 0.264816352}, // 15994K {0.261824508, 0.264814045}, // 15995K {0.261822758, 0.264811739}, // 15996K {0.261821008, 0.264809434}, // 15997K {0.261819258, 0.264807128}, // 15998K {0.261817509, 0.264804823}, // 15999K {0.26181576, 0.264802518}, // 16000K {0.261814011, 0.264800214}, // 16001K {0.261812262, 0.26479791}, // 16002K {0.261810514, 0.264795606}, // 16003K {0.261808766, 0.264793303}, // 16004K {0.261807018, 0.264791}, // 16005K {0.261805271, 0.264788697}, // 16006K {0.261803523, 0.264786395}, // 16007K {0.261801776, 0.264784092}, // 16008K {0.26180003, 0.264781791}, // 16009K {0.261798283, 0.264779489}, // 16010K {0.261796537, 0.264777188}, // 16011K {0.261794791, 0.264774887}, // 16012K {0.261793045, 0.264772587}, // 16013K {0.2617913, 0.264770287}, // 16014K {0.261789555, 0.264767987}, // 16015K {0.26178781, 0.264765687}, // 16016K {0.261786065, 0.264763388}, // 16017K {0.261784321, 0.264761089}, // 16018K {0.261782577, 0.264758791}, // 16019K {0.261780833, 0.264756493}, // 16020K {0.26177909, 0.264754195}, // 16021K {0.261777346, 0.264751897}, // 16022K {0.261775603, 0.2647496}, // 16023K {0.261773861, 0.264747303}, // 16024K {0.261772118, 0.264745006}, // 16025K {0.261770376, 0.26474271}, // 16026K {0.261768634, 0.264740414}, // 16027K {0.261766892, 0.264738119}, // 16028K {0.261765151, 0.264735823}, // 16029K {0.26176341, 0.264733528}, // 16030K {0.261761669, 0.264731234}, // 16031K {0.261759928, 0.264728939}, // 16032K {0.261758188, 0.264726645}, // 16033K {0.261756448, 0.264724352}, // 16034K {0.261754708, 0.264722058}, // 16035K {0.261752968, 0.264719765}, // 16036K {0.261751229, 0.264717473}, // 16037K {0.26174949, 0.26471518}, // 16038K {0.261747751, 0.264712888}, // 16039K {0.261746012, 0.264710597}, // 16040K {0.261744274, 0.264708305}, // 16041K {0.261742536, 0.264706014}, // 16042K {0.261740798, 0.264703723}, // 16043K {0.261739061, 0.264701433}, // 16044K {0.261737324, 0.264699143}, // 16045K {0.261735587, 0.264696853}, // 16046K {0.26173385, 0.264694563}, // 16047K {0.261732114, 0.264692274}, // 16048K {0.261730377, 0.264689985}, // 16049K {0.261728641, 0.264687697}, // 16050K {0.261726906, 0.264685409}, // 16051K {0.26172517, 0.264683121}, // 16052K {0.261723435, 0.264680833}, // 16053K {0.2617217, 0.264678546}, // 16054K {0.261719966, 0.264676259}, // 16055K {0.261718231, 0.264673973}, // 16056K {0.261716497, 0.264671686}, // 16057K {0.261714763, 0.264669401}, // 16058K {0.26171303, 0.264667115}, // 16059K {0.261711297, 0.26466483}, // 16060K {0.261709564, 0.264662545}, // 16061K {0.261707831, 0.26466026}, // 16062K {0.261706098, 0.264657976}, // 16063K {0.261704366, 0.264655692}, // 16064K {0.261702634, 0.264653408}, // 16065K {0.261700902, 0.264651125}, // 16066K {0.261699171, 0.264648842}, // 16067K {0.26169744, 0.264646559}, // 16068K {0.261695709, 0.264644277}, // 16069K {0.261693978, 0.264641994}, // 16070K {0.261692247, 0.264639713}, // 16071K {0.261690517, 0.264637431}, // 16072K {0.261688787, 0.26463515}, // 16073K {0.261687058, 0.264632869}, // 16074K {0.261685328, 0.264630589}, // 16075K {0.261683599, 0.264628309}, // 16076K {0.26168187, 0.264626029}, // 16077K {0.261680142, 0.264623749}, // 16078K {0.261678413, 0.26462147}, // 16079K {0.261676685, 0.264619191}, // 16080K {0.261674957, 0.264616913}, // 16081K {0.26167323, 0.264614635}, // 16082K {0.261671503, 0.264612357}, // 16083K {0.261669776, 0.264610079}, // 16084K {0.261668049, 0.264607802}, // 16085K {0.261666322, 0.264605525}, // 16086K {0.261664596, 0.264603248}, // 16087K {0.26166287, 0.264600972}, // 16088K {0.261661144, 0.264598696}, // 16089K {0.261659419, 0.26459642}, // 16090K {0.261657694, 0.264594145}, // 16091K {0.261655969, 0.26459187}, // 16092K {0.261654244, 0.264589595}, // 16093K {0.261652519, 0.264587321}, // 16094K {0.261650795, 0.264585047}, // 16095K {0.261649071, 0.264582773}, // 16096K {0.261647348, 0.2645805}, // 16097K {0.261645624, 0.264578227}, // 16098K {0.261643901, 0.264575954}, // 16099K {0.261642178, 0.264573681}, // 16100K {0.261640456, 0.264571409}, // 16101K {0.261638733, 0.264569137}, // 16102K {0.261637011, 0.264566866}, // 16103K {0.261635289, 0.264564595}, // 16104K {0.261633568, 0.264562324}, // 16105K {0.261631846, 0.264560053}, // 16106K {0.261630125, 0.264557783}, // 16107K {0.261628404, 0.264555513}, // 16108K {0.261626684, 0.264553244}, // 16109K {0.261624963, 0.264550974}, // 16110K {0.261623243, 0.264548705}, // 16111K {0.261621524, 0.264546437}, // 16112K {0.261619804, 0.264544168}, // 16113K {0.261618085, 0.2645419}, // 16114K {0.261616366, 0.264539633}, // 16115K {0.261614647, 0.264537365}, // 16116K {0.261612929, 0.264535098}, // 16117K {0.26161121, 0.264532832}, // 16118K {0.261609492, 0.264530565}, // 16119K {0.261607775, 0.264528299}, // 16120K {0.261606057, 0.264526033}, // 16121K {0.26160434, 0.264523768}, // 16122K {0.261602623, 0.264521503}, // 16123K {0.261600906, 0.264519238}, // 16124K {0.26159919, 0.264516973}, // 16125K {0.261597474, 0.264514709}, // 16126K {0.261595758, 0.264512445}, // 16127K {0.261594042, 0.264510182}, // 16128K {0.261592327, 0.264507918}, // 16129K {0.261590612, 0.264505656}, // 16130K {0.261588897, 0.264503393}, // 16131K {0.261587182, 0.264501131}, // 16132K {0.261585468, 0.264498869}, // 16133K {0.261583754, 0.264496607}, // 16134K {0.26158204, 0.264494346}, // 16135K {0.261580326, 0.264492085}, // 16136K {0.261578613, 0.264489824}, // 16137K {0.2615769, 0.264487564}, // 16138K {0.261575187, 0.264485304}, // 16139K {0.261573474, 0.264483044}, // 16140K {0.261571762, 0.264480784}, // 16141K {0.26157005, 0.264478525}, // 16142K {0.261568338, 0.264476266}, // 16143K {0.261566627, 0.264474008}, // 16144K {0.261564915, 0.26447175}, // 16145K {0.261563204, 0.264469492}, // 16146K {0.261561494, 0.264467234}, // 16147K {0.261559783, 0.264464977}, // 16148K {0.261558073, 0.26446272}, // 16149K {0.261556363, 0.264460464}, // 16150K {0.261554653, 0.264458207}, // 16151K {0.261552944, 0.264455951}, // 16152K {0.261551234, 0.264453696}, // 16153K {0.261549525, 0.264451441}, // 16154K {0.261547817, 0.264449185}, // 16155K {0.261546108, 0.264446931}, // 16156K {0.2615444, 0.264444676}, // 16157K {0.261542692, 0.264442422}, // 16158K {0.261540984, 0.264440169}, // 16159K {0.261539277, 0.264437915}, // 16160K {0.26153757, 0.264435662}, // 16161K {0.261535863, 0.264433409}, // 16162K {0.261534156, 0.264431157}, // 16163K {0.26153245, 0.264428905}, // 16164K {0.261530744, 0.264426653}, // 16165K {0.261529038, 0.264424401}, // 16166K {0.261527332, 0.26442215}, // 16167K {0.261525627, 0.264419899}, // 16168K {0.261523921, 0.264417648}, // 16169K {0.261522217, 0.264415398}, // 16170K {0.261520512, 0.264413148}, // 16171K {0.261518808, 0.264410899}, // 16172K {0.261517103, 0.264408649}, // 16173K {0.2615154, 0.2644064}, // 16174K {0.261513696, 0.264404152}, // 16175K {0.261511993, 0.264401903}, // 16176K {0.261510289, 0.264399655}, // 16177K {0.261508587, 0.264397407}, // 16178K {0.261506884, 0.26439516}, // 16179K {0.261505182, 0.264392913}, // 16180K {0.26150348, 0.264390666}, // 16181K {0.261501778, 0.264388419}, // 16182K {0.261500076, 0.264386173}, // 16183K {0.261498375, 0.264383927}, // 16184K {0.261496674, 0.264381682}, // 16185K {0.261494973, 0.264379436}, // 16186K {0.261493272, 0.264377192}, // 16187K {0.261491572, 0.264374947}, // 16188K {0.261489872, 0.264372703}, // 16189K {0.261488172, 0.264370459}, // 16190K {0.261486473, 0.264368215}, // 16191K {0.261484774, 0.264365972}, // 16192K {0.261483075, 0.264363728}, // 16193K {0.261481376, 0.264361486}, // 16194K {0.261479677, 0.264359243}, // 16195K {0.261477979, 0.264357001}, // 16196K {0.261476281, 0.264354759}, // 16197K {0.261474583, 0.264352518}, // 16198K {0.261472886, 0.264350277}, // 16199K {0.261471188, 0.264348036}, // 16200K {0.261469491, 0.264345795}, // 16201K {0.261467795, 0.264343555}, // 16202K {0.261466098, 0.264341315}, // 16203K {0.261464402, 0.264339076}, // 16204K {0.261462706, 0.264336836}, // 16205K {0.26146101, 0.264334597}, // 16206K {0.261459315, 0.264332359}, // 16207K {0.26145762, 0.26433012}, // 16208K {0.261455925, 0.264327882}, // 16209K {0.26145423, 0.264325644}, // 16210K {0.261452535, 0.264323407}, // 16211K {0.261450841, 0.26432117}, // 16212K {0.261449147, 0.264318933}, // 16213K {0.261447453, 0.264316697}, // 16214K {0.26144576, 0.26431446}, // 16215K {0.261444067, 0.264312224}, // 16216K {0.261442374, 0.264309989}, // 16217K {0.261440681, 0.264307754}, // 16218K {0.261438989, 0.264305519}, // 16219K {0.261437297, 0.264303284}, // 16220K {0.261435605, 0.26430105}, // 16221K {0.261433913, 0.264298816}, // 16222K {0.261432222, 0.264296582}, // 16223K {0.26143053, 0.264294349}, // 16224K {0.261428839, 0.264292116}, // 16225K {0.261427149, 0.264289883}, // 16226K {0.261425458, 0.26428765}, // 16227K {0.261423768, 0.264285418}, // 16228K {0.261422078, 0.264283187}, // 16229K {0.261420389, 0.264280955}, // 16230K {0.261418699, 0.264278724}, // 16231K {0.26141701, 0.264276493}, // 16232K {0.261415321, 0.264274262}, // 16233K {0.261413632, 0.264272032}, // 16234K {0.261411944, 0.264269802}, // 16235K {0.261410256, 0.264267572}, // 16236K {0.261408568, 0.264265343}, // 16237K {0.26140688, 0.264263114}, // 16238K {0.261405193, 0.264260885}, // 16239K {0.261403506, 0.264258657}, // 16240K {0.261401819, 0.264256429}, // 16241K {0.261400132, 0.264254201}, // 16242K {0.261398446, 0.264251974}, // 16243K {0.26139676, 0.264249747}, // 16244K {0.261395074, 0.26424752}, // 16245K {0.261393388, 0.264245293}, // 16246K {0.261391703, 0.264243067}, // 16247K {0.261390018, 0.264240841}, // 16248K {0.261388333, 0.264238615}, // 16249K {0.261386648, 0.26423639}, // 16250K {0.261384964, 0.264234165}, // 16251K {0.26138328, 0.26423194}, // 16252K {0.261381596, 0.264229716}, // 16253K {0.261379912, 0.264227492}, // 16254K {0.261378229, 0.264225268}, // 16255K {0.261376545, 0.264223045}, // 16256K {0.261374863, 0.264220822}, // 16257K {0.26137318, 0.264218599}, // 16258K {0.261371498, 0.264216376}, // 16259K {0.261369815, 0.264214154}, // 16260K {0.261368134, 0.264211932}, // 16261K {0.261366452, 0.264209711}, // 16262K {0.261364771, 0.264207489}, // 16263K {0.261363089, 0.264205268}, // 16264K {0.261361409, 0.264203048}, // 16265K {0.261359728, 0.264200827}, // 16266K {0.261358048, 0.264198607}, // 16267K {0.261356367, 0.264196388}, // 16268K {0.261354688, 0.264194168}, // 16269K {0.261353008, 0.264191949}, // 16270K {0.261351329, 0.26418973}, // 16271K {0.261349649, 0.264187512}, // 16272K {0.261347971, 0.264185293}, // 16273K {0.261346292, 0.264183076}, // 16274K {0.261344614, 0.264180858}, // 16275K {0.261342935, 0.264178641}, // 16276K {0.261341257, 0.264176424}, // 16277K {0.26133958, 0.264174207}, // 16278K {0.261337902, 0.264171991}, // 16279K {0.261336225, 0.264169775}, // 16280K {0.261334548, 0.264167559}, // 16281K {0.261332872, 0.264165344}, // 16282K {0.261331195, 0.264163128}, // 16283K {0.261329519, 0.264160914}, // 16284K {0.261327843, 0.264158699}, // 16285K {0.261326168, 0.264156485}, // 16286K {0.261324492, 0.264154271}, // 16287K {0.261322817, 0.264152057}, // 16288K {0.261321142, 0.264149844}, // 16289K {0.261319468, 0.264147631}, // 16290K {0.261317793, 0.264145419}, // 16291K {0.261316119, 0.264143206}, // 16292K {0.261314445, 0.264140994}, // 16293K {0.261312772, 0.264138782}, // 16294K {0.261311098, 0.264136571}, // 16295K {0.261309425, 0.26413436}, // 16296K {0.261307752, 0.264132149}, // 16297K {0.261306079, 0.264129939}, // 16298K {0.261304407, 0.264127728}, // 16299K {0.261302735, 0.264125519}, // 16300K {0.261301063, 0.264123309}, // 16301K {0.261299391, 0.2641211}, // 16302K {0.26129772, 0.264118891}, // 16303K {0.261296049, 0.264116682}, // 16304K {0.261294378, 0.264114474}, // 16305K {0.261292707, 0.264112266}, // 16306K {0.261291037, 0.264110058}, // 16307K {0.261289367, 0.26410785}, // 16308K {0.261287697, 0.264105643}, // 16309K {0.261286027, 0.264103436}, // 16310K {0.261284358, 0.26410123}, // 16311K {0.261282688, 0.264099024}, // 16312K {0.261281019, 0.264096818}, // 16313K {0.261279351, 0.264094612}, // 16314K {0.261277682, 0.264092407}, // 16315K {0.261276014, 0.264090202}, // 16316K {0.261274346, 0.264087997}, // 16317K {0.261272678, 0.264085793}, // 16318K {0.261271011, 0.264083589}, // 16319K {0.261269344, 0.264081385}, // 16320K {0.261267677, 0.264079181}, // 16321K {0.26126601, 0.264076978}, // 16322K {0.261264344, 0.264074775}, // 16323K {0.261262677, 0.264072573}, // 16324K {0.261261011, 0.264070371}, // 16325K {0.261259346, 0.264068169}, // 16326K {0.26125768, 0.264065967}, // 16327K {0.261256015, 0.264063766}, // 16328K {0.26125435, 0.264061565}, // 16329K {0.261252685, 0.264059364}, // 16330K {0.261251021, 0.264057164}, // 16331K {0.261249357, 0.264054964}, // 16332K {0.261247693, 0.264052764}, // 16333K {0.261246029, 0.264050564}, // 16334K {0.261244365, 0.264048365}, // 16335K {0.261242702, 0.264046166}, // 16336K {0.261241039, 0.264043968}, // 16337K {0.261239376, 0.264041769}, // 16338K {0.261237714, 0.264039571}, // 16339K {0.261236052, 0.264037374}, // 16340K {0.26123439, 0.264035176}, // 16341K {0.261232728, 0.264032979}, // 16342K {0.261231066, 0.264030782}, // 16343K {0.261229405, 0.264028586}, // 16344K {0.261227744, 0.26402639}, // 16345K {0.261226083, 0.264024194}, // 16346K {0.261224423, 0.264021998}, // 16347K {0.261222762, 0.264019803}, // 16348K {0.261221102, 0.264017608}, // 16349K {0.261219442, 0.264015414}, // 16350K {0.261217783, 0.264013219}, // 16351K {0.261216123, 0.264011025}, // 16352K {0.261214464, 0.264008831}, // 16353K {0.261212806, 0.264006638}, // 16354K {0.261211147, 0.264004445}, // 16355K {0.261209489, 0.264002252}, // 16356K {0.261207831, 0.26400006}, // 16357K {0.261206173, 0.263997867}, // 16358K {0.261204515, 0.263995676}, // 16359K {0.261202858, 0.263993484}, // 16360K {0.261201201, 0.263991293}, // 16361K {0.261199544, 0.263989102}, // 16362K {0.261197887, 0.263986911}, // 16363K {0.261196231, 0.263984721}, // 16364K {0.261194575, 0.26398253}, // 16365K {0.261192919, 0.263980341}, // 16366K {0.261191263, 0.263978151}, // 16367K {0.261189608, 0.263975962}, // 16368K {0.261187953, 0.263973773}, // 16369K {0.261186298, 0.263971585}, // 16370K {0.261184643, 0.263969396}, // 16371K {0.261182989, 0.263967208}, // 16372K {0.261181334, 0.263965021}, // 16373K {0.26117968, 0.263962833}, // 16374K {0.261178027, 0.263960646}, // 16375K {0.261176373, 0.263958459}, // 16376K {0.26117472, 0.263956273}, // 16377K {0.261173067, 0.263954087}, // 16378K {0.261171414, 0.263951901}, // 16379K {0.261169762, 0.263949715}, // 16380K {0.26116811, 0.26394753}, // 16381K {0.261166458, 0.263945345}, // 16382K {0.261164806, 0.263943161}, // 16383K {0.261163155, 0.263940976}, // 16384K {0.261161503, 0.263938792}, // 16385K {0.261159852, 0.263936608}, // 16386K {0.261158202, 0.263934425}, // 16387K {0.261156551, 0.263932242}, // 16388K {0.261154901, 0.263930059}, // 16389K {0.261153251, 0.263927876}, // 16390K {0.261151601, 0.263925694}, // 16391K {0.261149951, 0.263923512}, // 16392K {0.261148302, 0.263921331}, // 16393K {0.261146653, 0.263919149}, // 16394K {0.261145004, 0.263916968}, // 16395K {0.261143356, 0.263914788}, // 16396K {0.261141707, 0.263912607}, // 16397K {0.261140059, 0.263910427}, // 16398K {0.261138411, 0.263908247}, // 16399K {0.261136764, 0.263906068}, // 16400K {0.261135116, 0.263903888}, // 16401K {0.261133469, 0.26390171}, // 16402K {0.261131822, 0.263899531}, // 16403K {0.261130176, 0.263897353}, // 16404K {0.261128529, 0.263895175}, // 16405K {0.261126883, 0.263892997}, // 16406K {0.261125237, 0.263890819}, // 16407K {0.261123592, 0.263888642}, // 16408K {0.261121946, 0.263886465}, // 16409K {0.261120301, 0.263884289}, // 16410K {0.261118656, 0.263882113}, // 16411K {0.261117012, 0.263879937}, // 16412K {0.261115367, 0.263877761}, // 16413K {0.261113723, 0.263875586}, // 16414K {0.261112079, 0.263873411}, // 16415K {0.261110435, 0.263871236}, // 16416K {0.261108792, 0.263869062}, // 16417K {0.261107149, 0.263866888}, // 16418K {0.261105506, 0.263864714}, // 16419K {0.261103863, 0.26386254}, // 16420K {0.26110222, 0.263860367}, // 16421K {0.261100578, 0.263858194}, // 16422K {0.261098936, 0.263856021}, // 16423K {0.261097294, 0.263853849}, // 16424K {0.261095653, 0.263851677}, // 16425K {0.261094011, 0.263849505}, // 16426K {0.26109237, 0.263847334}, // 16427K {0.26109073, 0.263845163}, // 16428K {0.261089089, 0.263842992}, // 16429K {0.261087449, 0.263840821}, // 16430K {0.261085809, 0.263838651}, // 16431K {0.261084169, 0.263836481}, // 16432K {0.261082529, 0.263834312}, // 16433K {0.26108089, 0.263832142}, // 16434K {0.261079251, 0.263829973}, // 16435K {0.261077612, 0.263827804}, // 16436K {0.261075973, 0.263825636}, // 16437K {0.261074335, 0.263823468}, // 16438K {0.261072696, 0.2638213}, // 16439K {0.261071059, 0.263819132}, // 16440K {0.261069421, 0.263816965}, // 16441K {0.261067783, 0.263814798}, // 16442K {0.261066146, 0.263812632}, // 16443K {0.261064509, 0.263810465}, // 16444K {0.261062873, 0.263808299}, // 16445K {0.261061236, 0.263806133}, // 16446K {0.2610596, 0.263803968}, // 16447K {0.261057964, 0.263801803}, // 16448K {0.261056328, 0.263799638}, // 16449K {0.261054693, 0.263797473}, // 16450K {0.261053057, 0.263795309}, // 16451K {0.261051422, 0.263793145}, // 16452K {0.261049788, 0.263790981}, // 16453K {0.261048153, 0.263788818}, // 16454K {0.261046519, 0.263786655}, // 16455K {0.261044885, 0.263784492}, // 16456K {0.261043251, 0.26378233}, // 16457K {0.261041617, 0.263780168}, // 16458K {0.261039984, 0.263778006}, // 16459K {0.261038351, 0.263775844}, // 16460K {0.261036718, 0.263773683}, // 16461K {0.261035085, 0.263771522}, // 16462K {0.261033453, 0.263769361}, // 16463K {0.261031821, 0.263767201}, // 16464K {0.261030189, 0.263765041}, // 16465K {0.261028557, 0.263762881}, // 16466K {0.261026926, 0.263760721}, // 16467K {0.261025294, 0.263758562}, // 16468K {0.261023664, 0.263756403}, // 16469K {0.261022033, 0.263754244}, // 16470K {0.261020402, 0.263752086}, // 16471K {0.261018772, 0.263749928}, // 16472K {0.261017142, 0.26374777}, // 16473K {0.261015512, 0.263745613}, // 16474K {0.261013883, 0.263743456}, // 16475K {0.261012254, 0.263741299}, // 16476K {0.261010625, 0.263739142}, // 16477K {0.261008996, 0.263736986}, // 16478K {0.261007367, 0.26373483}, // 16479K {0.261005739, 0.263732674}, // 16480K {0.261004111, 0.263730519}, // 16481K {0.261002483, 0.263728364}, // 16482K {0.261000855, 0.263726209}, // 16483K {0.260999228, 0.263724055}, // 16484K {0.260997601, 0.263721901}, // 16485K {0.260995974, 0.263719747}, // 16486K {0.260994347, 0.263717593}, // 16487K {0.260992721, 0.26371544}, // 16488K {0.260991095, 0.263713287}, // 16489K {0.260989469, 0.263711134}, // 16490K {0.260987843, 0.263708982}, // 16491K {0.260986218, 0.26370683}, // 16492K {0.260984592, 0.263704678}, // 16493K {0.260982967, 0.263702526}, // 16494K {0.260981343, 0.263700375}, // 16495K {0.260979718, 0.263698224}, // 16496K {0.260978094, 0.263696073}, // 16497K {0.26097647, 0.263693923}, // 16498K {0.260974846, 0.263691773}, // 16499K {0.260973223, 0.263689623}, // 16500K {0.260971599, 0.263687474}, // 16501K {0.260969976, 0.263685325}, // 16502K {0.260968353, 0.263683176}, // 16503K {0.260966731, 0.263681027}, // 16504K {0.260965108, 0.263678879}, // 16505K {0.260963486, 0.263676731}, // 16506K {0.260961864, 0.263674583}, // 16507K {0.260960243, 0.263672436}, // 16508K {0.260958621, 0.263670289}, // 16509K {0.260957, 0.263668142}, // 16510K {0.260955379, 0.263665995}, // 16511K {0.260953758, 0.263663849}, // 16512K {0.260952138, 0.263661703}, // 16513K {0.260950518, 0.263659558}, // 16514K {0.260948898, 0.263657412}, // 16515K {0.260947278, 0.263655267}, // 16516K {0.260945658, 0.263653122}, // 16517K {0.260944039, 0.263650978}, // 16518K {0.26094242, 0.263648834}, // 16519K {0.260940801, 0.26364669}, // 16520K {0.260939183, 0.263644546}, // 16521K {0.260937564, 0.263642403}, // 16522K {0.260935946, 0.26364026}, // 16523K {0.260934328, 0.263638117}, // 16524K {0.260932711, 0.263635975}, // 16525K {0.260931093, 0.263633833}, // 16526K {0.260929476, 0.263631691}, // 16527K {0.260927859, 0.26362955}, // 16528K {0.260926243, 0.263627408}, // 16529K {0.260924626, 0.263625267}, // 16530K {0.26092301, 0.263623127}, // 16531K {0.260921394, 0.263620986}, // 16532K {0.260919778, 0.263618846}, // 16533K {0.260918163, 0.263616707}, // 16534K {0.260916548, 0.263614567}, // 16535K {0.260914933, 0.263612428}, // 16536K {0.260913318, 0.263610289}, // 16537K {0.260911703, 0.26360815}, // 16538K {0.260910089, 0.263606012}, // 16539K {0.260908475, 0.263603874}, // 16540K {0.260906861, 0.263601736}, // 16541K {0.260905247, 0.263599599}, // 16542K {0.260903634, 0.263597462}, // 16543K {0.260902021, 0.263595325}, // 16544K {0.260900408, 0.263593188}, // 16545K {0.260898795, 0.263591052}, // 16546K {0.260897183, 0.263588916}, // 16547K {0.260895571, 0.263586781}, // 16548K {0.260893959, 0.263584645}, // 16549K {0.260892347, 0.26358251}, // 16550K {0.260890736, 0.263580375}, // 16551K {0.260889124, 0.263578241}, // 16552K {0.260887513, 0.263576107}, // 16553K {0.260885903, 0.263573973}, // 16554K {0.260884292, 0.263571839}, // 16555K {0.260882682, 0.263569706}, // 16556K {0.260881072, 0.263567573}, // 16557K {0.260879462, 0.26356544}, // 16558K {0.260877852, 0.263563307}, // 16559K {0.260876243, 0.263561175}, // 16560K {0.260874634, 0.263559043}, // 16561K {0.260873025, 0.263556912}, // 16562K {0.260871416, 0.26355478}, // 16563K {0.260869808, 0.263552649}, // 16564K {0.260868199, 0.263550519}, // 16565K {0.260866592, 0.263548388}, // 16566K {0.260864984, 0.263546258}, // 16567K {0.260863376, 0.263544128}, // 16568K {0.260861769, 0.263541999}, // 16569K {0.260860162, 0.26353987}, // 16570K {0.260858555, 0.263537741}, // 16571K {0.260856949, 0.263535612}, // 16572K {0.260855342, 0.263533483}, // 16573K {0.260853736, 0.263531355}, // 16574K {0.26085213, 0.263529228}, // 16575K {0.260850525, 0.2635271}, // 16576K {0.260848919, 0.263524973}, // 16577K {0.260847314, 0.263522846}, // 16578K {0.260845709, 0.263520719}, // 16579K {0.260844105, 0.263518593}, // 16580K {0.2608425, 0.263516467}, // 16581K {0.260840896, 0.263514341}, // 16582K {0.260839292, 0.263512216}, // 16583K {0.260837688, 0.26351009}, // 16584K {0.260836085, 0.263507965}, // 16585K {0.260834482, 0.263505841}, // 16586K {0.260832878, 0.263503717}, // 16587K {0.260831276, 0.263501592}, // 16588K {0.260829673, 0.263499469}, // 16589K {0.260828071, 0.263497345}, // 16590K {0.260826469, 0.263495222}, // 16591K {0.260824867, 0.263493099}, // 16592K {0.260823265, 0.263490977}, // 16593K {0.260821664, 0.263488854}, // 16594K {0.260820063, 0.263486732}, // 16595K {0.260818462, 0.263484611}, // 16596K {0.260816861, 0.263482489}, // 16597K {0.26081526, 0.263480368}, // 16598K {0.26081366, 0.263478247}, // 16599K {0.26081206, 0.263476127}, // 16600K {0.26081046, 0.263474006}, // 16601K {0.260808861, 0.263471886}, // 16602K {0.260807261, 0.263469767}, // 16603K {0.260805662, 0.263467647}, // 16604K {0.260804064, 0.263465528}, // 16605K {0.260802465, 0.263463409}, // 16606K {0.260800867, 0.263461291}, // 16607K {0.260799268, 0.263459172}, // 16608K {0.26079767, 0.263457055}, // 16609K {0.260796073, 0.263454937}, // 16610K {0.260794475, 0.263452819}, // 16611K {0.260792878, 0.263450702}, // 16612K {0.260791281, 0.263448586}, // 16613K {0.260789684, 0.263446469}, // 16614K {0.260788088, 0.263444353}, // 16615K {0.260786492, 0.263442237}, // 16616K {0.260784896, 0.263440121}, // 16617K {0.2607833, 0.263438006}, // 16618K {0.260781704, 0.263435891}, // 16619K {0.260780109, 0.263433776}, // 16620K {0.260778514, 0.263431661}, // 16621K {0.260776919, 0.263429547}, // 16622K {0.260775324, 0.263427433}, // 16623K {0.26077373, 0.26342532}, // 16624K {0.260772135, 0.263423206}, // 16625K {0.260770541, 0.263421093}, // 16626K {0.260768948, 0.26341898}, // 16627K {0.260767354, 0.263416868}, // 16628K {0.260765761, 0.263414756}, // 16629K {0.260764168, 0.263412644}, // 16630K {0.260762575, 0.263410532}, // 16631K {0.260760982, 0.263408421}, // 16632K {0.26075939, 0.26340631}, // 16633K {0.260757798, 0.263404199}, // 16634K {0.260756206, 0.263402089}, // 16635K {0.260754614, 0.263399978}, // 16636K {0.260753023, 0.263397868}, // 16637K {0.260751432, 0.263395759}, // 16638K {0.260749841, 0.26339365}, // 16639K {0.26074825, 0.26339154}, // 16640K {0.26074666, 0.263389432}, // 16641K {0.260745069, 0.263387323}, // 16642K {0.260743479, 0.263385215}, // 16643K {0.260741889, 0.263383107}, // 16644K {0.2607403, 0.263381}, // 16645K {0.260738711, 0.263378892}, // 16646K {0.260737121, 0.263376785}, // 16647K {0.260735533, 0.263374678}, // 16648K {0.260733944, 0.263372572}, // 16649K {0.260732355, 0.263370466}, // 16650K {0.260730767, 0.26336836}, // 16651K {0.260729179, 0.263366254}, // 16652K {0.260727592, 0.263364149}, // 16653K {0.260726004, 0.263362044}, // 16654K {0.260724417, 0.263359939}, // 16655K {0.26072283, 0.263357835}, // 16656K {0.260721243, 0.263355731}, // 16657K {0.260719656, 0.263353627}, // 16658K {0.26071807, 0.263351523}, // 16659K {0.260716484, 0.26334942}, // 16660K {0.260714898, 0.263347317}, // 16661K {0.260713312, 0.263345214}, // 16662K {0.260711727, 0.263343111}, // 16663K {0.260710142, 0.263341009}, // 16664K {0.260708557, 0.263338907}, // 16665K {0.260706972, 0.263336806}, // 16666K {0.260705387, 0.263334704}, // 16667K {0.260703803, 0.263332603}, // 16668K {0.260702219, 0.263330503}, // 16669K {0.260700635, 0.263328402}, // 16670K {0.260699052, 0.263326302}, // 16671K {0.260697468, 0.263324202}, // 16672K {0.260695885, 0.263322103}, // 16673K {0.260694302, 0.263320003}, // 16674K {0.26069272, 0.263317904}, // 16675K {0.260691137, 0.263315805}, // 16676K {0.260689555, 0.263313707}, // 16677K {0.260687973, 0.263311609}, // 16678K {0.260686391, 0.263309511}, // 16679K {0.26068481, 0.263307413}, // 16680K {0.260683228, 0.263305316}, // 16681K {0.260681647, 0.263303219}, // 16682K {0.260680066, 0.263301122}, // 16683K {0.260678486, 0.263299026}, // 16684K {0.260676905, 0.263296929}, // 16685K {0.260675325, 0.263294833}, // 16686K {0.260673745, 0.263292738}, // 16687K {0.260672166, 0.263290643}, // 16688K {0.260670586, 0.263288547}, // 16689K {0.260669007, 0.263286453}, // 16690K {0.260667428, 0.263284358}, // 16691K {0.260665849, 0.263282264}, // 16692K {0.26066427, 0.26328017}, // 16693K {0.260662692, 0.263278076}, // 16694K {0.260661114, 0.263275983}, // 16695K {0.260659536, 0.26327389}, // 16696K {0.260657959, 0.263271797}, // 16697K {0.260656381, 0.263269705}, // 16698K {0.260654804, 0.263267612}, // 16699K {0.260653227, 0.263265521}, // 16700K {0.26065165, 0.263263429}, // 16701K {0.260650074, 0.263261338}, // 16702K {0.260648497, 0.263259246}, // 16703K {0.260646921, 0.263257156}, // 16704K {0.260645346, 0.263255065}, // 16705K {0.26064377, 0.263252975}, // 16706K {0.260642195, 0.263250885}, // 16707K {0.260640619, 0.263248795}, // 16708K {0.260639045, 0.263246706}, // 16709K {0.26063747, 0.263244617}, // 16710K {0.260635895, 0.263242528}, // 16711K {0.260634321, 0.263240439}, // 16712K {0.260632747, 0.263238351}, // 16713K {0.260631173, 0.263236263}, // 16714K {0.2606296, 0.263234175}, // 16715K {0.260628027, 0.263232088}, // 16716K {0.260626453, 0.263230001}, // 16717K {0.260624881, 0.263227914}, // 16718K {0.260623308, 0.263225828}, // 16719K {0.260621736, 0.263223741}, // 16720K {0.260620163, 0.263221655}, // 16721K {0.260618591, 0.26321957}, // 16722K {0.26061702, 0.263217484}, // 16723K {0.260615448, 0.263215399}, // 16724K {0.260613877, 0.263213314}, // 16725K {0.260612306, 0.26321123}, // 16726K {0.260610735, 0.263209145}, // 16727K {0.260609164, 0.263207061}, // 16728K {0.260607594, 0.263204977}, // 16729K {0.260606024, 0.263202894}, // 16730K {0.260604454, 0.263200811}, // 16731K {0.260602884, 0.263198728}, // 16732K {0.260601315, 0.263196645}, // 16733K {0.260599746, 0.263194563}, // 16734K {0.260598177, 0.263192481}, // 16735K {0.260596608, 0.263190399}, // 16736K {0.260595039, 0.263188318}, // 16737K {0.260593471, 0.263186237}, // 16738K {0.260591903, 0.263184156}, // 16739K {0.260590335, 0.263182075}, // 16740K {0.260588767, 0.263179995}, // 16741K {0.2605872, 0.263177915}, // 16742K {0.260585633, 0.263175835}, // 16743K {0.260584066, 0.263173755}, // 16744K {0.260582499, 0.263171676}, // 16745K {0.260580932, 0.263169597}, // 16746K {0.260579366, 0.263167518}, // 16747K {0.2605778, 0.26316544}, // 16748K {0.260576234, 0.263163362}, // 16749K {0.260574669, 0.263161284}, // 16750K {0.260573103, 0.263159206}, // 16751K {0.260571538, 0.263157129}, // 16752K {0.260569973, 0.263155052}, // 16753K {0.260568408, 0.263152976}, // 16754K {0.260566844, 0.263150899}, // 16755K {0.26056528, 0.263148823}, // 16756K {0.260563716, 0.263146747}, // 16757K {0.260562152, 0.263144671}, // 16758K {0.260560588, 0.263142596}, // 16759K {0.260559025, 0.263140521}, // 16760K {0.260557462, 0.263138446}, // 16761K {0.260555899, 0.263136372}, // 16762K {0.260554336, 0.263134298}, // 16763K {0.260552774, 0.263132224}, // 16764K {0.260551211, 0.26313015}, // 16765K {0.260549649, 0.263128077}, // 16766K {0.260548088, 0.263126004}, // 16767K {0.260546526, 0.263123931}, // 16768K {0.260544965, 0.263121859}, // 16769K {0.260543404, 0.263119786}, // 16770K {0.260541843, 0.263117714}, // 16771K {0.260540282, 0.263115643}, // 16772K {0.260538722, 0.263113571}, // 16773K {0.260537161, 0.2631115}, // 16774K {0.260535602, 0.263109429}, // 16775K {0.260534042, 0.263107359}, // 16776K {0.260532482, 0.263105289}, // 16777K {0.260530923, 0.263103219}, // 16778K {0.260529364, 0.263101149}, // 16779K {0.260527805, 0.263099079}, // 16780K {0.260526246, 0.26309701}, // 16781K {0.260524688, 0.263094941}, // 16782K {0.26052313, 0.263092873}, // 16783K {0.260521572, 0.263090804}, // 16784K {0.260520014, 0.263088736}, // 16785K {0.260518456, 0.263086669}, // 16786K {0.260516899, 0.263084601}, // 16787K {0.260515342, 0.263082534}, // 16788K {0.260513785, 0.263080467}, // 16789K {0.260512229, 0.2630784}, // 16790K {0.260510672, 0.263076334}, // 16791K {0.260509116, 0.263074268}, // 16792K {0.26050756, 0.263072202}, // 16793K {0.260506004, 0.263070137}, // 16794K {0.260504449, 0.263068071}, // 16795K {0.260502894, 0.263066006}, // 16796K {0.260501339, 0.263063942}, // 16797K {0.260499784, 0.263061877}, // 16798K {0.260498229, 0.263059813}, // 16799K {0.260496675, 0.263057749}, // 16800K {0.260495121, 0.263055686}, // 16801K {0.260493567, 0.263053622}, // 16802K {0.260492013, 0.263051559}, // 16803K {0.260490459, 0.263049497}, // 16804K {0.260488906, 0.263047434}, // 16805K {0.260487353, 0.263045372}, // 16806K {0.2604858, 0.26304331}, // 16807K {0.260484248, 0.263041248}, // 16808K {0.260482695, 0.263039187}, // 16809K {0.260481143, 0.263037126}, // 16810K {0.260479591, 0.263035065}, // 16811K {0.260478039, 0.263033005}, // 16812K {0.260476488, 0.263030944}, // 16813K {0.260474937, 0.263028884}, // 16814K {0.260473386, 0.263026825}, // 16815K {0.260471835, 0.263024765}, // 16816K {0.260470284, 0.263022706}, // 16817K {0.260468734, 0.263020647}, // 16818K {0.260467184, 0.263018589}, // 16819K {0.260465634, 0.26301653}, // 16820K {0.260464084, 0.263014472}, // 16821K {0.260462535, 0.263012415}, // 16822K {0.260460985, 0.263010357}, // 16823K {0.260459436, 0.2630083}, // 16824K {0.260457887, 0.263006243}, // 16825K {0.260456339, 0.263004186}, // 16826K {0.260454791, 0.26300213}, // 16827K {0.260453242, 0.263000074}, // 16828K {0.260451694, 0.262998018}, // 16829K {0.260450147, 0.262995963}, // 16830K {0.260448599, 0.262993907}, // 16831K {0.260447052, 0.262991852}, // 16832K {0.260445505, 0.262989798}, // 16833K {0.260443958, 0.262987743}, // 16834K {0.260442412, 0.262985689}, // 16835K {0.260440865, 0.262983635}, // 16836K {0.260439319, 0.262981582}, // 16837K {0.260437773, 0.262979528}, // 16838K {0.260436227, 0.262977475}, // 16839K {0.260434682, 0.262975422}, // 16840K {0.260433137, 0.26297337}, // 16841K {0.260431592, 0.262971318}, // 16842K {0.260430047, 0.262969266}, // 16843K {0.260428502, 0.262967214}, // 16844K {0.260426958, 0.262965163}, // 16845K {0.260425414, 0.262963112}, // 16846K {0.26042387, 0.262961061}, // 16847K {0.260422326, 0.26295901}, // 16848K {0.260420782, 0.26295696}, // 16849K {0.260419239, 0.26295491}, // 16850K {0.260417696, 0.26295286}, // 16851K {0.260416153, 0.262950811}, // 16852K {0.260414611, 0.262948761}, // 16853K {0.260413068, 0.262946712}, // 16854K {0.260411526, 0.262944664}, // 16855K {0.260409984, 0.262942615}, // 16856K {0.260408442, 0.262940567}, // 16857K {0.260406901, 0.262938519}, // 16858K {0.26040536, 0.262936472}, // 16859K {0.260403819, 0.262934425}, // 16860K {0.260402278, 0.262932378}, // 16861K {0.260400737, 0.262930331}, // 16862K {0.260399197, 0.262928284}, // 16863K {0.260397656, 0.262926238}, // 16864K {0.260396117, 0.262924192}, // 16865K {0.260394577, 0.262922147}, // 16866K {0.260393037, 0.262920101}, // 16867K {0.260391498, 0.262918056}, // 16868K {0.260389959, 0.262916012}, // 16869K {0.26038842, 0.262913967}, // 16870K {0.260386881, 0.262911923}, // 16871K {0.260385343, 0.262909879}, // 16872K {0.260383805, 0.262907835}, // 16873K {0.260382267, 0.262905792}, // 16874K {0.260380729, 0.262903749}, // 16875K {0.260379191, 0.262901706}, // 16876K {0.260377654, 0.262899663}, // 16877K {0.260376117, 0.262897621}, // 16878K {0.26037458, 0.262895579}, // 16879K {0.260373043, 0.262893537}, // 16880K {0.260371507, 0.262891495}, // 16881K {0.260369971, 0.262889454}, // 16882K {0.260368435, 0.262887413}, // 16883K {0.260366899, 0.262885372}, // 16884K {0.260365363, 0.262883332}, // 16885K {0.260363828, 0.262881292}, // 16886K {0.260362293, 0.262879252}, // 16887K {0.260360758, 0.262877212}, // 16888K {0.260359223, 0.262875173}, // 16889K {0.260357689, 0.262873134}, // 16890K {0.260356155, 0.262871095}, // 16891K {0.260354621, 0.262869057}, // 16892K {0.260353087, 0.262867019}, // 16893K {0.260351553, 0.262864981}, // 16894K {0.26035002, 0.262862943}, // 16895K {0.260348487, 0.262860906}, // 16896K {0.260346954, 0.262858868}, // 16897K {0.260345421, 0.262856832}, // 16898K {0.260343889, 0.262854795}, // 16899K {0.260342356, 0.262852759}, // 16900K {0.260340824, 0.262850723}, // 16901K {0.260339292, 0.262848687}, // 16902K {0.260337761, 0.262846651}, // 16903K {0.260336229, 0.262844616}, // 16904K {0.260334698, 0.262842581}, // 16905K {0.260333167, 0.262840546}, // 16906K {0.260331636, 0.262838512}, // 16907K {0.260330106, 0.262836478}, // 16908K {0.260328576, 0.262834444}, // 16909K {0.260327046, 0.26283241}, // 16910K {0.260325516, 0.262830377}, // 16911K {0.260323986, 0.262828344}, // 16912K {0.260322457, 0.262826311}, // 16913K {0.260320927, 0.262824279}, // 16914K {0.260319398, 0.262822246}, // 16915K {0.26031787, 0.262820215}, // 16916K {0.260316341, 0.262818183}, // 16917K {0.260314813, 0.262816151}, // 16918K {0.260313285, 0.26281412}, // 16919K {0.260311757, 0.262812089}, // 16920K {0.260310229, 0.262810059}, // 16921K {0.260308701, 0.262808028}, // 16922K {0.260307174, 0.262805998}, // 16923K {0.260305647, 0.262803969}, // 16924K {0.26030412, 0.262801939}, // 16925K {0.260302594, 0.26279991}, // 16926K {0.260301067, 0.262797881}, // 16927K {0.260299541, 0.262795852}, // 16928K {0.260298015, 0.262793824}, // 16929K {0.26029649, 0.262791796}, // 16930K {0.260294964, 0.262789768}, // 16931K {0.260293439, 0.26278774}, // 16932K {0.260291914, 0.262785713}, // 16933K {0.260290389, 0.262783686}, // 16934K {0.260288864, 0.262781659}, // 16935K {0.26028734, 0.262779632}, // 16936K {0.260285815, 0.262777606}, // 16937K {0.260284291, 0.26277558}, // 16938K {0.260282768, 0.262773554}, // 16939K {0.260281244, 0.262771529}, // 16940K {0.260279721, 0.262769504}, // 16941K {0.260278198, 0.262767479}, // 16942K {0.260276675, 0.262765454}, // 16943K {0.260275152, 0.26276343}, // 16944K {0.26027363, 0.262761406}, // 16945K {0.260272107, 0.262759382}, // 16946K {0.260270585, 0.262757358}, // 16947K {0.260269063, 0.262755335}, // 16948K {0.260267542, 0.262753312}, // 16949K {0.26026602, 0.262751289}, // 16950K {0.260264499, 0.262749267}, // 16951K {0.260262978, 0.262747245}, // 16952K {0.260261458, 0.262745223}, // 16953K {0.260259937, 0.262743201}, // 16954K {0.260258417, 0.26274118}, // 16955K {0.260256897, 0.262739158}, // 16956K {0.260255377, 0.262737138}, // 16957K {0.260253857, 0.262735117}, // 16958K {0.260252338, 0.262733097}, // 16959K {0.260250818, 0.262731077}, // 16960K {0.260249299, 0.262729057}, // 16961K {0.260247781, 0.262727037}, // 16962K {0.260246262, 0.262725018}, // 16963K {0.260244744, 0.262722999}, // 16964K {0.260243226, 0.26272098}, // 16965K {0.260241708, 0.262718962}, // 16966K {0.26024019, 0.262716944}, // 16967K {0.260238672, 0.262714926}, // 16968K {0.260237155, 0.262712908}, // 16969K {0.260235638, 0.262710891}, // 16970K {0.260234121, 0.262708874}, // 16971K {0.260232605, 0.262706857}, // 16972K {0.260231088, 0.262704841}, // 16973K {0.260229572, 0.262702824}, // 16974K {0.260228056, 0.262700808}, // 16975K {0.26022654, 0.262698792}, // 16976K {0.260225025, 0.262696777}, // 16977K {0.260223509, 0.262694762}, // 16978K {0.260221994, 0.262692747}, // 16979K {0.260220479, 0.262690732}, // 16980K {0.260218964, 0.262688718}, // 16981K {0.26021745, 0.262686704}, // 16982K {0.260215936, 0.26268469}, // 16983K {0.260214422, 0.262682676}, // 16984K {0.260212908, 0.262680663}, // 16985K {0.260211394, 0.26267865}, // 16986K {0.260209881, 0.262676637}, // 16987K {0.260208368, 0.262674625}, // 16988K {0.260206855, 0.262672612}, // 16989K {0.260205342, 0.2626706}, // 16990K {0.260203829, 0.262668589}, // 16991K {0.260202317, 0.262666577}, // 16992K {0.260200805, 0.262664566}, // 16993K {0.260199293, 0.262662555}, // 16994K {0.260197781, 0.262660544}, // 16995K {0.26019627, 0.262658534}, // 16996K {0.260194758, 0.262656524}, // 16997K {0.260193247, 0.262654514}, // 16998K {0.260191737, 0.262652505}, // 16999K {0.260190226, 0.262650495}, // 17000K {0.260188716, 0.262648486}, // 17001K {0.260187205, 0.262646477}, // 17002K {0.260185695, 0.262644469}, // 17003K {0.260184186, 0.262642461}, // 17004K {0.260182676, 0.262640453}, // 17005K {0.260181167, 0.262638445}, // 17006K {0.260179658, 0.262636438}, // 17007K {0.260178149, 0.26263443}, // 17008K {0.26017664, 0.262632424}, // 17009K {0.260175132, 0.262630417}, // 17010K {0.260173623, 0.262628411}, // 17011K {0.260172115, 0.262626404}, // 17012K {0.260170607, 0.262624399}, // 17013K {0.2601691, 0.262622393}, // 17014K {0.260167592, 0.262620388}, // 17015K {0.260166085, 0.262618383}, // 17016K {0.260164578, 0.262616378}, // 17017K {0.260163071, 0.262614373}, // 17018K {0.260161565, 0.262612369}, // 17019K {0.260160059, 0.262610365}, // 17020K {0.260158552, 0.262608362}, // 17021K {0.260157047, 0.262606358}, // 17022K {0.260155541, 0.262604355}, // 17023K {0.260154035, 0.262602352}, // 17024K {0.26015253, 0.262600349}, // 17025K {0.260151025, 0.262598347}, // 17026K {0.26014952, 0.262596345}, // 17027K {0.260148016, 0.262594343}, // 17028K {0.260146511, 0.262592342}, // 17029K {0.260145007, 0.26259034}, // 17030K {0.260143503, 0.262588339}, // 17031K {0.260141999, 0.262586338}, // 17032K {0.260140496, 0.262584338}, // 17033K {0.260138992, 0.262582338}, // 17034K {0.260137489, 0.262580338}, // 17035K {0.260135986, 0.262578338}, // 17036K {0.260134483, 0.262576339}, // 17037K {0.260132981, 0.262574339}, // 17038K {0.260131479, 0.262572341}, // 17039K {0.260129977, 0.262570342}, // 17040K {0.260128475, 0.262568344}, // 17041K {0.260126973, 0.262566345}, // 17042K {0.260125472, 0.262564348}, // 17043K {0.26012397, 0.26256235}, // 17044K {0.260122469, 0.262560353}, // 17045K {0.260120968, 0.262558356}, // 17046K {0.260119468, 0.262556359}, // 17047K {0.260117968, 0.262554362}, // 17048K {0.260116467, 0.262552366}, // 17049K {0.260114967, 0.26255037}, // 17050K {0.260113468, 0.262548374}, // 17051K {0.260111968, 0.262546379}, // 17052K {0.260110469, 0.262544384}, // 17053K {0.26010897, 0.262542389}, // 17054K {0.260107471, 0.262540394}, // 17055K {0.260105972, 0.2625384}, // 17056K {0.260104474, 0.262536406}, // 17057K {0.260102975, 0.262534412}, // 17058K {0.260101477, 0.262532418}, // 17059K {0.26009998, 0.262530425}, // 17060K {0.260098482, 0.262528432}, // 17061K {0.260096984, 0.262526439}, // 17062K {0.260095487, 0.262524446}, // 17063K {0.26009399, 0.262522454}, // 17064K {0.260092493, 0.262520462}, // 17065K {0.260090997, 0.26251847}, // 17066K {0.260089501, 0.262516479}, // 17067K {0.260088004, 0.262514488}, // 17068K {0.260086509, 0.262512497}, // 17069K {0.260085013, 0.262510506}, // 17070K {0.260083517, 0.262508515}, // 17071K {0.260082022, 0.262506525}, // 17072K {0.260080527, 0.262504535}, // 17073K {0.260079032, 0.262502546}, // 17074K {0.260077537, 0.262500556}, // 17075K {0.260076043, 0.262498567}, // 17076K {0.260074549, 0.262496578}, // 17077K {0.260073055, 0.26249459}, // 17078K {0.260071561, 0.262492601}, // 17079K {0.260070067, 0.262490613}, // 17080K {0.260068574, 0.262488626}, // 17081K {0.260067081, 0.262486638}, // 17082K {0.260065588, 0.262484651}, // 17083K {0.260064095, 0.262482664}, // 17084K {0.260062602, 0.262480677}, // 17085K {0.26006111, 0.262478691}, // 17086K {0.260059618, 0.262476704}, // 17087K {0.260058126, 0.262474718}, // 17088K {0.260056634, 0.262472733}, // 17089K {0.260055143, 0.262470747}, // 17090K {0.260053651, 0.262468762}, // 17091K {0.26005216, 0.262466777}, // 17092K {0.260050669, 0.262464793}, // 17093K {0.260049179, 0.262462808}, // 17094K {0.260047688, 0.262460824}, // 17095K {0.260046198, 0.26245884}, // 17096K {0.260044708, 0.262456857}, // 17097K {0.260043218, 0.262454873}, // 17098K {0.260041729, 0.26245289}, // 17099K {0.260040239, 0.262450907}, // 17100K {0.26003875, 0.262448925}, // 17101K {0.260037261, 0.262446943}, // 17102K {0.260035772, 0.262444961}, // 17103K {0.260034284, 0.262442979}, // 17104K {0.260032795, 0.262440997}, // 17105K {0.260031307, 0.262439016}, // 17106K {0.260029819, 0.262437035}, // 17107K {0.260028332, 0.262435055}, // 17108K {0.260026844, 0.262433074}, // 17109K {0.260025357, 0.262431094}, // 17110K {0.26002387, 0.262429114}, // 17111K {0.260022383, 0.262427134}, // 17112K {0.260020896, 0.262425155}, // 17113K {0.26001941, 0.262423176}, // 17114K {0.260017923, 0.262421197}, // 17115K {0.260016437, 0.262419218}, // 17116K {0.260014951, 0.26241724}, // 17117K {0.260013466, 0.262415262}, // 17118K {0.26001198, 0.262413284}, // 17119K {0.260010495, 0.262411307}, // 17120K {0.26000901, 0.262409329}, // 17121K {0.260007525, 0.262407352}, // 17122K {0.260006041, 0.262405375}, // 17123K {0.260004556, 0.262403399}, // 17124K {0.260003072, 0.262401423}, // 17125K {0.260001588, 0.262399447}, // 17126K {0.260000105, 0.262397471}, // 17127K {0.259998621, 0.262395495}, // 17128K {0.259997138, 0.26239352}, // 17129K {0.259995655, 0.262391545}, // 17130K {0.259994172, 0.262389571}, // 17131K {0.259992689, 0.262387596}, // 17132K {0.259991207, 0.262385622}, // 17133K {0.259989724, 0.262383648}, // 17134K {0.259988242, 0.262381675}, // 17135K {0.25998676, 0.262379701}, // 17136K {0.259985279, 0.262377728}, // 17137K {0.259983797, 0.262375755}, // 17138K {0.259982316, 0.262373783}, // 17139K {0.259980835, 0.26237181}, // 17140K {0.259979354, 0.262369838}, // 17141K {0.259977873, 0.262367866}, // 17142K {0.259976393, 0.262365895}, // 17143K {0.259974913, 0.262363923}, // 17144K {0.259973433, 0.262361952}, // 17145K {0.259971953, 0.262359982}, // 17146K {0.259970474, 0.262358011}, // 17147K {0.259968994, 0.262356041}, // 17148K {0.259967515, 0.262354071}, // 17149K {0.259966036, 0.262352101}, // 17150K {0.259964557, 0.262350132}, // 17151K {0.259963079, 0.262348162}, // 17152K {0.2599616, 0.262346193}, // 17153K {0.259960122, 0.262344225}, // 17154K {0.259958644, 0.262342256}, // 17155K {0.259957167, 0.262340288}, // 17156K {0.259955689, 0.26233832}, // 17157K {0.259954212, 0.262336353}, // 17158K {0.259952735, 0.262334385}, // 17159K {0.259951258, 0.262332418}, // 17160K {0.259949781, 0.262330451}, // 17161K {0.259948305, 0.262328485}, // 17162K {0.259946829, 0.262326518}, // 17163K {0.259945352, 0.262324552}, // 17164K {0.259943877, 0.262322586}, // 17165K {0.259942401, 0.262320621}, // 17166K {0.259940926, 0.262318655}, // 17167K {0.25993945, 0.26231669}, // 17168K {0.259937975, 0.262314726}, // 17169K {0.259936501, 0.262312761}, // 17170K {0.259935026, 0.262310797}, // 17171K {0.259933552, 0.262308833}, // 17172K {0.259932077, 0.262306869}, // 17173K {0.259930603, 0.262304905}, // 17174K {0.25992913, 0.262302942}, // 17175K {0.259927656, 0.262300979}, // 17176K {0.259926183, 0.262299016}, // 17177K {0.25992471, 0.262297054}, // 17178K {0.259923237, 0.262295092}, // 17179K {0.259921764, 0.26229313}, // 17180K {0.259920291, 0.262291168}, // 17181K {0.259918819, 0.262289207}, // 17182K {0.259917347, 0.262287245}, // 17183K {0.259915875, 0.262285285}, // 17184K {0.259914403, 0.262283324}, // 17185K {0.259912932, 0.262281363}, // 17186K {0.259911461, 0.262279403}, // 17187K {0.259909989, 0.262277443}, // 17188K {0.259908519, 0.262275484}, // 17189K {0.259907048, 0.262273524}, // 17190K {0.259905577, 0.262271565}, // 17191K {0.259904107, 0.262269606}, // 17192K {0.259902637, 0.262267648}, // 17193K {0.259901167, 0.262265689}, // 17194K {0.259899698, 0.262263731}, // 17195K {0.259898228, 0.262261774}, // 17196K {0.259896759, 0.262259816}, // 17197K {0.25989529, 0.262257859}, // 17198K {0.259893821, 0.262255902}, // 17199K {0.259892353, 0.262253945}, // 17200K {0.259890884, 0.262251988}, // 17201K {0.259889416, 0.262250032}, // 17202K {0.259887948, 0.262248076}, // 17203K {0.25988648, 0.26224612}, // 17204K {0.259885013, 0.262244165}, // 17205K {0.259883545, 0.262242209}, // 17206K {0.259882078, 0.262240254}, // 17207K {0.259880611, 0.2622383}, // 17208K {0.259879144, 0.262236345}, // 17209K {0.259877678, 0.262234391}, // 17210K {0.259876211, 0.262232437}, // 17211K {0.259874745, 0.262230483}, // 17212K {0.259873279, 0.26222853}, // 17213K {0.259871814, 0.262226577}, // 17214K {0.259870348, 0.262224624}, // 17215K {0.259868883, 0.262222671}, // 17216K {0.259867418, 0.262220719}, // 17217K {0.259865953, 0.262218767}, // 17218K {0.259864488, 0.262216815}, // 17219K {0.259863023, 0.262214863}, // 17220K {0.259861559, 0.262212912}, // 17221K {0.259860095, 0.26221096}, // 17222K {0.259858631, 0.26220901}, // 17223K {0.259857168, 0.262207059}, // 17224K {0.259855704, 0.262205109}, // 17225K {0.259854241, 0.262203158}, // 17226K {0.259852778, 0.262201209}, // 17227K {0.259851315, 0.262199259}, // 17228K {0.259849852, 0.26219731}, // 17229K {0.25984839, 0.262195361}, // 17230K {0.259846927, 0.262193412}, // 17231K {0.259845465, 0.262191463}, // 17232K {0.259844004, 0.262189515}, // 17233K {0.259842542, 0.262187567}, // 17234K {0.25984108, 0.262185619}, // 17235K {0.259839619, 0.262183671}, // 17236K {0.259838158, 0.262181724}, // 17237K {0.259836697, 0.262179777}, // 17238K {0.259835237, 0.26217783}, // 17239K {0.259833776, 0.262175884}, // 17240K {0.259832316, 0.262173937}, // 17241K {0.259830856, 0.262171991}, // 17242K {0.259829396, 0.262170046}, // 17243K {0.259827937, 0.2621681}, // 17244K {0.259826477, 0.262166155}, // 17245K {0.259825018, 0.26216421}, // 17246K {0.259823559, 0.262162265}, // 17247K {0.2598221, 0.262160321}, // 17248K {0.259820642, 0.262158376}, // 17249K {0.259819183, 0.262156432}, // 17250K {0.259817725, 0.262154489}, // 17251K {0.259816267, 0.262152545}, // 17252K {0.25981481, 0.262150602}, // 17253K {0.259813352, 0.262148659}, // 17254K {0.259811895, 0.262146716}, // 17255K {0.259810438, 0.262144774}, // 17256K {0.259808981, 0.262142832}, // 17257K {0.259807524, 0.26214089}, // 17258K {0.259806067, 0.262138948}, // 17259K {0.259804611, 0.262137007}, // 17260K {0.259803155, 0.262135066}, // 17261K {0.259801699, 0.262133125}, // 17262K {0.259800243, 0.262131184}, // 17263K {0.259798788, 0.262129244}, // 17264K {0.259797332, 0.262127303}, // 17265K {0.259795877, 0.262125364}, // 17266K {0.259794422, 0.262123424}, // 17267K {0.259792968, 0.262121485}, // 17268K {0.259791513, 0.262119545}, // 17269K {0.259790059, 0.262117606}, // 17270K {0.259788605, 0.262115668}, // 17271K {0.259787151, 0.262113729}, // 17272K {0.259785697, 0.262111791}, // 17273K {0.259784244, 0.262109854}, // 17274K {0.25978279, 0.262107916}, // 17275K {0.259781337, 0.262105979}, // 17276K {0.259779884, 0.262104041}, // 17277K {0.259778432, 0.262102105}, // 17278K {0.259776979, 0.262100168}, // 17279K {0.259775527, 0.262098232}, // 17280K {0.259774075, 0.262096296}, // 17281K {0.259772623, 0.26209436}, // 17282K {0.259771171, 0.262092424}, // 17283K {0.25976972, 0.262090489}, // 17284K {0.259768268, 0.262088554}, // 17285K {0.259766817, 0.262086619}, // 17286K {0.259765367, 0.262084684}, // 17287K {0.259763916, 0.26208275}, // 17288K {0.259762465, 0.262080816}, // 17289K {0.259761015, 0.262078882}, // 17290K {0.259759565, 0.262076949}, // 17291K {0.259758115, 0.262075015}, // 17292K {0.259756666, 0.262073082}, // 17293K {0.259755216, 0.262071149}, // 17294K {0.259753767, 0.262069217}, // 17295K {0.259752318, 0.262067285}, // 17296K {0.259750869, 0.262065353}, // 17297K {0.25974942, 0.262063421}, // 17298K {0.259747972, 0.262061489}, // 17299K {0.259746524, 0.262059558}, // 17300K {0.259745076, 0.262057627}, // 17301K {0.259743628, 0.262055696}, // 17302K {0.25974218, 0.262053766}, // 17303K {0.259740733, 0.262051835}, // 17304K {0.259739286, 0.262049905}, // 17305K {0.259737838, 0.262047976}, // 17306K {0.259736392, 0.262046046}, // 17307K {0.259734945, 0.262044117}, // 17308K {0.259733499, 0.262042188}, // 17309K {0.259732052, 0.262040259}, // 17310K {0.259730606, 0.262038331}, // 17311K {0.259729161, 0.262036402}, // 17312K {0.259727715, 0.262034474}, // 17313K {0.25972627, 0.262032547}, // 17314K {0.259724824, 0.262030619}, // 17315K {0.259723379, 0.262028692}, // 17316K {0.259721934, 0.262026765}, // 17317K {0.25972049, 0.262024838}, // 17318K {0.259719045, 0.262022912}, // 17319K {0.259717601, 0.262020985}, // 17320K {0.259716157, 0.26201906}, // 17321K {0.259714713, 0.262017134}, // 17322K {0.25971327, 0.262015208}, // 17323K {0.259711826, 0.262013283}, // 17324K {0.259710383, 0.262011358}, // 17325K {0.25970894, 0.262009433}, // 17326K {0.259707497, 0.262007509}, // 17327K {0.259706055, 0.262005585}, // 17328K {0.259704612, 0.262003661}, // 17329K {0.25970317, 0.262001737}, // 17330K {0.259701728, 0.261999814}, // 17331K {0.259700286, 0.26199789}, // 17332K {0.259698845, 0.261995967}, // 17333K {0.259697403, 0.261994045}, // 17334K {0.259695962, 0.261992122}, // 17335K {0.259694521, 0.2619902}, // 17336K {0.25969308, 0.261988278}, // 17337K {0.25969164, 0.261986356}, // 17338K {0.259690199, 0.261984435}, // 17339K {0.259688759, 0.261982514}, // 17340K {0.259687319, 0.261980593}, // 17341K {0.259685879, 0.261978672}, // 17342K {0.25968444, 0.261976752}, // 17343K {0.259683, 0.261974831}, // 17344K {0.259681561, 0.261972911}, // 17345K {0.259680122, 0.261970992}, // 17346K {0.259678683, 0.261969072}, // 17347K {0.259677245, 0.261967153}, // 17348K {0.259675806, 0.261965234}, // 17349K {0.259674368, 0.261963315}, // 17350K {0.25967293, 0.261961397}, // 17351K {0.259671492, 0.261959479}, // 17352K {0.259670055, 0.261957561}, // 17353K {0.259668617, 0.261955643}, // 17354K {0.25966718, 0.261953726}, // 17355K {0.259665743, 0.261951809}, // 17356K {0.259664306, 0.261949892}, // 17357K {0.25966287, 0.261947975}, // 17358K {0.259661433, 0.261946058}, // 17359K {0.259659997, 0.261944142}, // 17360K {0.259658561, 0.261942226}, // 17361K {0.259657125, 0.261940311}, // 17362K {0.25965569, 0.261938395}, // 17363K {0.259654254, 0.26193648}, // 17364K {0.259652819, 0.261934565}, // 17365K {0.259651384, 0.26193265}, // 17366K {0.259649949, 0.261930736}, // 17367K {0.259648514, 0.261928822}, // 17368K {0.25964708, 0.261926908}, // 17369K {0.259645646, 0.261924994}, // 17370K {0.259644212, 0.261923081}, // 17371K {0.259642778, 0.261921167}, // 17372K {0.259641344, 0.261919254}, // 17373K {0.259639911, 0.261917342}, // 17374K {0.259638478, 0.261915429}, // 17375K {0.259637045, 0.261913517}, // 17376K {0.259635612, 0.261911605}, // 17377K {0.259634179, 0.261909693}, // 17378K {0.259632747, 0.261907782}, // 17379K {0.259631315, 0.261905871}, // 17380K {0.259629883, 0.26190396}, // 17381K {0.259628451, 0.261902049}, // 17382K {0.259627019, 0.261900139}, // 17383K {0.259625588, 0.261898228}, // 17384K {0.259624156, 0.261896318}, // 17385K {0.259622725, 0.261894409}, // 17386K {0.259621294, 0.261892499}, // 17387K {0.259619864, 0.26189059}, // 17388K {0.259618433, 0.261888681}, // 17389K {0.259617003, 0.261886772}, // 17390K {0.259615573, 0.261884864}, // 17391K {0.259614143, 0.261882956}, // 17392K {0.259612714, 0.261881048}, // 17393K {0.259611284, 0.26187914}, // 17394K {0.259609855, 0.261877233}, // 17395K {0.259608426, 0.261875325}, // 17396K {0.259606997, 0.261873418}, // 17397K {0.259605568, 0.261871512}, // 17398K {0.25960414, 0.261869605}, // 17399K {0.259602711, 0.261867699}, // 17400K {0.259601283, 0.261865793}, // 17401K {0.259599856, 0.261863887}, // 17402K {0.259598428, 0.261861982}, // 17403K {0.259597, 0.261860076}, // 17404K {0.259595573, 0.261858171}, // 17405K {0.259594146, 0.261856267}, // 17406K {0.259592719, 0.261854362}, // 17407K {0.259591292, 0.261852458}, // 17408K {0.259589866, 0.261850554}, // 17409K {0.25958844, 0.26184865}, // 17410K {0.259587014, 0.261846747}, // 17411K {0.259585588, 0.261844843}, // 17412K {0.259584162, 0.26184294}, // 17413K {0.259582736, 0.261841038}, // 17414K {0.259581311, 0.261839135}, // 17415K {0.259579886, 0.261837233}, // 17416K {0.259578461, 0.261835331}, // 17417K {0.259577036, 0.261833429}, // 17418K {0.259575612, 0.261831527}, // 17419K {0.259574188, 0.261829626}, // 17420K {0.259572763, 0.261827725}, // 17421K {0.259571339, 0.261825824}, // 17422K {0.259569916, 0.261823924}, // 17423K {0.259568492, 0.261822024}, // 17424K {0.259567069, 0.261820124}, // 17425K {0.259565646, 0.261818224}, // 17426K {0.259564223, 0.261816324}, // 17427K {0.2595628, 0.261814425}, // 17428K {0.259561377, 0.261812526}, // 17429K {0.259559955, 0.261810627}, // 17430K {0.259558533, 0.261808728}, // 17431K {0.259557111, 0.26180683}, // 17432K {0.259555689, 0.261804932}, // 17433K {0.259554268, 0.261803034}, // 17434K {0.259552846, 0.261801137}, // 17435K {0.259551425, 0.261799239}, // 17436K {0.259550004, 0.261797342}, // 17437K {0.259548583, 0.261795445}, // 17438K {0.259547163, 0.261793549}, // 17439K {0.259545742, 0.261791652}, // 17440K {0.259544322, 0.261789756}, // 17441K {0.259542902, 0.26178786}, // 17442K {0.259541482, 0.261785965}, // 17443K {0.259540063, 0.261784069}, // 17444K {0.259538643, 0.261782174}, // 17445K {0.259537224, 0.261780279}, // 17446K {0.259535805, 0.261778385}, // 17447K {0.259534386, 0.26177649}, // 17448K {0.259532968, 0.261774596}, // 17449K {0.259531549, 0.261772702}, // 17450K {0.259530131, 0.261770809}, // 17451K {0.259528713, 0.261768915}, // 17452K {0.259527295, 0.261767022}, // 17453K {0.259525877, 0.261765129}, // 17454K {0.25952446, 0.261763237}, // 17455K {0.259523043, 0.261761344}, // 17456K {0.259521625, 0.261759452}, // 17457K {0.259520209, 0.26175756}, // 17458K {0.259518792, 0.261755669}, // 17459K {0.259517375, 0.261753777}, // 17460K {0.259515959, 0.261751886}, // 17461K {0.259514543, 0.261749995}, // 17462K {0.259513127, 0.261748104}, // 17463K {0.259511711, 0.261746214}, // 17464K {0.259510296, 0.261744324}, // 17465K {0.259508881, 0.261742434}, // 17466K {0.259507466, 0.261740544}, // 17467K {0.259506051, 0.261738654}, // 17468K {0.259504636, 0.261736765}, // 17469K {0.259503221, 0.261734876}, // 17470K {0.259501807, 0.261732988}, // 17471K {0.259500393, 0.261731099}, // 17472K {0.259498979, 0.261729211}, // 17473K {0.259497565, 0.261727323}, // 17474K {0.259496152, 0.261725435}, // 17475K {0.259494738, 0.261723547}, // 17476K {0.259493325, 0.26172166}, // 17477K {0.259491912, 0.261719773}, // 17478K {0.259490499, 0.261717886}, // 17479K {0.259489087, 0.261716}, // 17480K {0.259487674, 0.261714114}, // 17481K {0.259486262, 0.261712228}, // 17482K {0.25948485, 0.261710342}, // 17483K {0.259483438, 0.261708456}, // 17484K {0.259482027, 0.261706571}, // 17485K {0.259480615, 0.261704686}, // 17486K {0.259479204, 0.261702801}, // 17487K {0.259477793, 0.261700916}, // 17488K {0.259476382, 0.261699032}, // 17489K {0.259474972, 0.261697148}, // 17490K {0.259473561, 0.261695264}, // 17491K {0.259472151, 0.261693381}, // 17492K {0.259470741, 0.261691497}, // 17493K {0.259469331, 0.261689614}, // 17494K {0.259467921, 0.261687731}, // 17495K {0.259466512, 0.261685849}, // 17496K {0.259465103, 0.261683966}, // 17497K {0.259463693, 0.261682084}, // 17498K {0.259462285, 0.261680202}, // 17499K {0.259460876, 0.26167832}, // 17500K {0.259459467, 0.261676439}, // 17501K {0.259458059, 0.261674558}, // 17502K {0.259456651, 0.261672677}, // 17503K {0.259455243, 0.261670796}, // 17504K {0.259453835, 0.261668916}, // 17505K {0.259452428, 0.261667036}, // 17506K {0.25945102, 0.261665156}, // 17507K {0.259449613, 0.261663276}, // 17508K {0.259448206, 0.261661396}, // 17509K {0.259446799, 0.261659517}, // 17510K {0.259445393, 0.261657638}, // 17511K {0.259443987, 0.26165576}, // 17512K {0.25944258, 0.261653881}, // 17513K {0.259441174, 0.261652003}, // 17514K {0.259439769, 0.261650125}, // 17515K {0.259438363, 0.261648247}, // 17516K {0.259436958, 0.261646369}, // 17517K {0.259435552, 0.261644492}, // 17518K {0.259434147, 0.261642615}, // 17519K {0.259432742, 0.261640738}, // 17520K {0.259431338, 0.261638862}, // 17521K {0.259429933, 0.261636986}, // 17522K {0.259428529, 0.261635109}, // 17523K {0.259427125, 0.261633234}, // 17524K {0.259425721, 0.261631358}, // 17525K {0.259424317, 0.261629483}, // 17526K {0.259422914, 0.261627608}, // 17527K {0.259421511, 0.261625733}, // 17528K {0.259420108, 0.261623858}, // 17529K {0.259418705, 0.261621984}, // 17530K {0.259417302, 0.26162011}, // 17531K {0.259415899, 0.261618236}, // 17532K {0.259414497, 0.261616362}, // 17533K {0.259413095, 0.261614489}, // 17534K {0.259411693, 0.261612616}, // 17535K {0.259410291, 0.261610743}, // 17536K {0.25940889, 0.26160887}, // 17537K {0.259407488, 0.261606998}, // 17538K {0.259406087, 0.261605125}, // 17539K {0.259404686, 0.261603253}, // 17540K {0.259403285, 0.261601382}, // 17541K {0.259401885, 0.26159951}, // 17542K {0.259400484, 0.261597639}, // 17543K {0.259399084, 0.261595768}, // 17544K {0.259397684, 0.261593897}, // 17545K {0.259396284, 0.261592027}, // 17546K {0.259394885, 0.261590156}, // 17547K {0.259393485, 0.261588286}, // 17548K {0.259392086, 0.261586417}, // 17549K {0.259390687, 0.261584547}, // 17550K {0.259389288, 0.261582678}, // 17551K {0.259387889, 0.261580809}, // 17552K {0.259386491, 0.26157894}, // 17553K {0.259385093, 0.261577071}, // 17554K {0.259383695, 0.261575203}, // 17555K {0.259382297, 0.261573335}, // 17556K {0.259380899, 0.261571467}, // 17557K {0.259379501, 0.261569599}, // 17558K {0.259378104, 0.261567732}, // 17559K {0.259376707, 0.261565865}, // 17560K {0.25937531, 0.261563998}, // 17561K {0.259373913, 0.261562131}, // 17562K {0.259372517, 0.261560265}, // 17563K {0.25937112, 0.261558399}, // 17564K {0.259369724, 0.261556533}, // 17565K {0.259368328, 0.261554667}, // 17566K {0.259366932, 0.261552802}, // 17567K {0.259365537, 0.261550937}, // 17568K {0.259364141, 0.261549072}, // 17569K {0.259362746, 0.261547207}, // 17570K {0.259361351, 0.261545342}, // 17571K {0.259359956, 0.261543478}, // 17572K {0.259358561, 0.261541614}, // 17573K {0.259357167, 0.26153975}, // 17574K {0.259355773, 0.261537887}, // 17575K {0.259354379, 0.261536024}, // 17576K {0.259352985, 0.261534161}, // 17577K {0.259351591, 0.261532298}, // 17578K {0.259350197, 0.261530435}, // 17579K {0.259348804, 0.261528573}, // 17580K {0.259347411, 0.261526711}, // 17581K {0.259346018, 0.261524849}, // 17582K {0.259344625, 0.261522987}, // 17583K {0.259343233, 0.261521126}, // 17584K {0.25934184, 0.261519265}, // 17585K {0.259340448, 0.261517404}, // 17586K {0.259339056, 0.261515543}, // 17587K {0.259337664, 0.261513683}, // 17588K {0.259336273, 0.261511823}, // 17589K {0.259334881, 0.261509963}, // 17590K {0.25933349, 0.261508103}, // 17591K {0.259332099, 0.261506244}, // 17592K {0.259330708, 0.261504385}, // 17593K {0.259329318, 0.261502526}, // 17594K {0.259327927, 0.261500667}, // 17595K {0.259326537, 0.261498808}, // 17596K {0.259325147, 0.26149695}, // 17597K {0.259323757, 0.261495092}, // 17598K {0.259322367, 0.261493234}, // 17599K {0.259320978, 0.261491377}, // 17600K {0.259319588, 0.26148952}, // 17601K {0.259318199, 0.261487663}, // 17602K {0.25931681, 0.261485806}, // 17603K {0.259315421, 0.261483949}, // 17604K {0.259314033, 0.261482093}, // 17605K {0.259312644, 0.261480237}, // 17606K {0.259311256, 0.261478381}, // 17607K {0.259309868, 0.261476525}, // 17608K {0.25930848, 0.26147467}, // 17609K {0.259307093, 0.261472815}, // 17610K {0.259305705, 0.26147096}, // 17611K {0.259304318, 0.261469105}, // 17612K {0.259302931, 0.261467251}, // 17613K {0.259301544, 0.261465396}, // 17614K {0.259300158, 0.261463543}, // 17615K {0.259298771, 0.261461689}, // 17616K {0.259297385, 0.261459835}, // 17617K {0.259295999, 0.261457982}, // 17618K {0.259294613, 0.261456129}, // 17619K {0.259293227, 0.261454276}, // 17620K {0.259291842, 0.261452424}, // 17621K {0.259290456, 0.261450572}, // 17622K {0.259289071, 0.26144872}, // 17623K {0.259287686, 0.261446868}, // 17624K {0.259286301, 0.261445016}, // 17625K {0.259284917, 0.261443165}, // 17626K {0.259283532, 0.261441314}, // 17627K {0.259282148, 0.261439463}, // 17628K {0.259280764, 0.261437612}, // 17629K {0.25927938, 0.261435762}, // 17630K {0.259277997, 0.261433912}, // 17631K {0.259276613, 0.261432062}, // 17632K {0.25927523, 0.261430212}, // 17633K {0.259273847, 0.261428363}, // 17634K {0.259272464, 0.261426514}, // 17635K {0.259271081, 0.261424665}, // 17636K {0.259269699, 0.261422816}, // 17637K {0.259268316, 0.261420967}, // 17638K {0.259266934, 0.261419119}, // 17639K {0.259265552, 0.261417271}, // 17640K {0.25926417, 0.261415423}, // 17641K {0.259262789, 0.261413576}, // 17642K {0.259261408, 0.261411729}, // 17643K {0.259260026, 0.261409881}, // 17644K {0.259258645, 0.261408035}, // 17645K {0.259257264, 0.261406188}, // 17646K {0.259255884, 0.261404342}, // 17647K {0.259254503, 0.261402496}, // 17648K {0.259253123, 0.26140065}, // 17649K {0.259251743, 0.261398804}, // 17650K {0.259250363, 0.261396959}, // 17651K {0.259248984, 0.261395114}, // 17652K {0.259247604, 0.261393269}, // 17653K {0.259246225, 0.261391424}, // 17654K {0.259244846, 0.261389579}, // 17655K {0.259243467, 0.261387735}, // 17656K {0.259242088, 0.261385891}, // 17657K {0.259240709, 0.261384048}, // 17658K {0.259239331, 0.261382204}, // 17659K {0.259237953, 0.261380361}, // 17660K {0.259236575, 0.261378518}, // 17661K {0.259235197, 0.261376675}, // 17662K {0.259233819, 0.261374832}, // 17663K {0.259232442, 0.26137299}, // 17664K {0.259231065, 0.261371148}, // 17665K {0.259229688, 0.261369306}, // 17666K {0.259228311, 0.261367465}, // 17667K {0.259226934, 0.261365623}, // 17668K {0.259225557, 0.261363782}, // 17669K {0.259224181, 0.261361941}, // 17670K {0.259222805, 0.2613601}, // 17671K {0.259221429, 0.26135826}, // 17672K {0.259220053, 0.26135642}, // 17673K {0.259218678, 0.26135458}, // 17674K {0.259217302, 0.26135274}, // 17675K {0.259215927, 0.261350901}, // 17676K {0.259214552, 0.261349061}, // 17677K {0.259213177, 0.261347222}, // 17678K {0.259211803, 0.261345384}, // 17679K {0.259210428, 0.261343545}, // 17680K {0.259209054, 0.261341707}, // 17681K {0.25920768, 0.261339869}, // 17682K {0.259206306, 0.261338031}, // 17683K {0.259204932, 0.261336193}, // 17684K {0.259203559, 0.261334356}, // 17685K {0.259202186, 0.261332519}, // 17686K {0.259200812, 0.261330682}, // 17687K {0.25919944, 0.261328845}, // 17688K {0.259198067, 0.261327009}, // 17689K {0.259196694, 0.261325172}, // 17690K {0.259195322, 0.261323336}, // 17691K {0.25919395, 0.261321501}, // 17692K {0.259192578, 0.261319665}, // 17693K {0.259191206, 0.26131783}, // 17694K {0.259189834, 0.261315995}, // 17695K {0.259188463, 0.26131416}, // 17696K {0.259187091, 0.261312326}, // 17697K {0.25918572, 0.261310491}, // 17698K {0.259184349, 0.261308657}, // 17699K {0.259182979, 0.261306823}, // 17700K {0.259181608, 0.26130499}, // 17701K {0.259180238, 0.261303156}, // 17702K {0.259178868, 0.261301323}, // 17703K {0.259177498, 0.26129949}, // 17704K {0.259176128, 0.261297658}, // 17705K {0.259174758, 0.261295825}, // 17706K {0.259173389, 0.261293993}, // 17707K {0.25917202, 0.261292161}, // 17708K {0.259170651, 0.261290329}, // 17709K {0.259169282, 0.261288498}, // 17710K {0.259167913, 0.261286667}, // 17711K {0.259166545, 0.261284835}, // 17712K {0.259165176, 0.261283005}, // 17713K {0.259163808, 0.261281174}, // 17714K {0.25916244, 0.261279344}, // 17715K {0.259161073, 0.261277514}, // 17716K {0.259159705, 0.261275684}, // 17717K {0.259158338, 0.261273854}, // 17718K {0.259156971, 0.261272025}, // 17719K {0.259155604, 0.261270196}, // 17720K {0.259154237, 0.261268367}, // 17721K {0.25915287, 0.261266538}, // 17722K {0.259151504, 0.26126471}, // 17723K {0.259150137, 0.261262881}, // 17724K {0.259148771, 0.261261053}, // 17725K {0.259147406, 0.261259226}, // 17726K {0.25914604, 0.261257398}, // 17727K {0.259144674, 0.261255571}, // 17728K {0.259143309, 0.261253744}, // 17729K {0.259141944, 0.261251917}, // 17730K {0.259140579, 0.26125009}, // 17731K {0.259139214, 0.261248264}, // 17732K {0.25913785, 0.261246438}, // 17733K {0.259136485, 0.261244612}, // 17734K {0.259135121, 0.261242786}, // 17735K {0.259133757, 0.261240961}, // 17736K {0.259132393, 0.261239136}, // 17737K {0.259131029, 0.261237311}, // 17738K {0.259129666, 0.261235486}, // 17739K {0.259128303, 0.261233661}, // 17740K {0.25912694, 0.261231837}, // 17741K {0.259125577, 0.261230013}, // 17742K {0.259124214, 0.261228189}, // 17743K {0.259122851, 0.261226366}, // 17744K {0.259121489, 0.261224542}, // 17745K {0.259120127, 0.261222719}, // 17746K {0.259118765, 0.261220896}, // 17747K {0.259117403, 0.261219074}, // 17748K {0.259116041, 0.261217251}, // 17749K {0.25911468, 0.261215429}, // 17750K {0.259113319, 0.261213607}, // 17751K {0.259111958, 0.261211786}, // 17752K {0.259110597, 0.261209964}, // 17753K {0.259109236, 0.261208143}, // 17754K {0.259107875, 0.261206322}, // 17755K {0.259106515, 0.261204501}, // 17756K {0.259105155, 0.261202681}, // 17757K {0.259103795, 0.26120086}, // 17758K {0.259102435, 0.26119904}, // 17759K {0.259101076, 0.26119722}, // 17760K {0.259099716, 0.261195401}, // 17761K {0.259098357, 0.261193581}, // 17762K {0.259096998, 0.261191762}, // 17763K {0.259095639, 0.261189943}, // 17764K {0.25909428, 0.261188125}, // 17765K {0.259092922, 0.261186306}, // 17766K {0.259091564, 0.261184488}, // 17767K {0.259090205, 0.26118267}, // 17768K {0.259088847, 0.261180852}, // 17769K {0.25908749, 0.261179035}, // 17770K {0.259086132, 0.261177217}, // 17771K {0.259084775, 0.2611754}, // 17772K {0.259083417, 0.261173583}, // 17773K {0.25908206, 0.261171767}, // 17774K {0.259080704, 0.26116995}, // 17775K {0.259079347, 0.261168134}, // 17776K {0.25907799, 0.261166318}, // 17777K {0.259076634, 0.261164503}, // 17778K {0.259075278, 0.261162687}, // 17779K {0.259073922, 0.261160872}, // 17780K {0.259072566, 0.261159057}, // 17781K {0.259071211, 0.261157242}, // 17782K {0.259069855, 0.261155428}, // 17783K {0.2590685, 0.261153613}, // 17784K {0.259067145, 0.261151799}, // 17785K {0.25906579, 0.261149986}, // 17786K {0.259064436, 0.261148172}, // 17787K {0.259063081, 0.261146359}, // 17788K {0.259061727, 0.261144545}, // 17789K {0.259060373, 0.261142733}, // 17790K {0.259059019, 0.26114092}, // 17791K {0.259057665, 0.261139107}, // 17792K {0.259056312, 0.261137295}, // 17793K {0.259054958, 0.261135483}, // 17794K {0.259053605, 0.261133672}, // 17795K {0.259052252, 0.26113186}, // 17796K {0.259050899, 0.261130049}, // 17797K {0.259049547, 0.261128238}, // 17798K {0.259048194, 0.261126427}, // 17799K {0.259046842, 0.261124616}, // 17800K {0.25904549, 0.261122806}, // 17801K {0.259044138, 0.261120996}, // 17802K {0.259042786, 0.261119186}, // 17803K {0.259041435, 0.261117376}, // 17804K {0.259040083, 0.261115567}, // 17805K {0.259038732, 0.261113757}, // 17806K {0.259037381, 0.261111948}, // 17807K {0.25903603, 0.26111014}, // 17808K {0.25903468, 0.261108331}, // 17809K {0.259033329, 0.261106523}, // 17810K {0.259031979, 0.261104715}, // 17811K {0.259030629, 0.261102907}, // 17812K {0.259029279, 0.261101099}, // 17813K {0.259027929, 0.261099292}, // 17814K {0.25902658, 0.261097485}, // 17815K {0.259025231, 0.261095678}, // 17816K {0.259023881, 0.261093871}, // 17817K {0.259022532, 0.261092065}, // 17818K {0.259021184, 0.261090259}, // 17819K {0.259019835, 0.261088453}, // 17820K {0.259018487, 0.261086647}, // 17821K {0.259017138, 0.261084841}, // 17822K {0.25901579, 0.261083036}, // 17823K {0.259014442, 0.261081231}, // 17824K {0.259013095, 0.261079426}, // 17825K {0.259011747, 0.261077621}, // 17826K {0.2590104, 0.261075817}, // 17827K {0.259009053, 0.261074013}, // 17828K {0.259007706, 0.261072209}, // 17829K {0.259006359, 0.261070405}, // 17830K {0.259005012, 0.261068602}, // 17831K {0.259003666, 0.261066798}, // 17832K {0.259002319, 0.261064995}, // 17833K {0.259000973, 0.261063193}, // 17834K {0.258999627, 0.26106139}, // 17835K {0.258998282, 0.261059588}, // 17836K {0.258996936, 0.261057786}, // 17837K {0.258995591, 0.261055984}, // 17838K {0.258994246, 0.261054182}, // 17839K {0.258992901, 0.261052381}, // 17840K {0.258991556, 0.26105058}, // 17841K {0.258990211, 0.261048779}, // 17842K {0.258988867, 0.261046978}, // 17843K {0.258987522, 0.261045177}, // 17844K {0.258986178, 0.261043377}, // 17845K {0.258984834, 0.261041577}, // 17846K {0.258983491, 0.261039777}, // 17847K {0.258982147, 0.261037978}, // 17848K {0.258980804, 0.261036178}, // 17849K {0.258979461, 0.261034379}, // 17850K {0.258978118, 0.26103258}, // 17851K {0.258976775, 0.261030782}, // 17852K {0.258975432, 0.261028983}, // 17853K {0.25897409, 0.261027185}, // 17854K {0.258972747, 0.261025387}, // 17855K {0.258971405, 0.261023589}, // 17856K {0.258970063, 0.261021792}, // 17857K {0.258968722, 0.261019994}, // 17858K {0.25896738, 0.261018197}, // 17859K {0.258966039, 0.2610164}, // 17860K {0.258964698, 0.261014604}, // 17861K {0.258963357, 0.261012807}, // 17862K {0.258962016, 0.261011011}, // 17863K {0.258960675, 0.261009215}, // 17864K {0.258959335, 0.26100742}, // 17865K {0.258957994, 0.261005624}, // 17866K {0.258956654, 0.261003829}, // 17867K {0.258955314, 0.261002034}, // 17868K {0.258953975, 0.261000239}, // 17869K {0.258952635, 0.260998444}, // 17870K {0.258951296, 0.26099665}, // 17871K {0.258949956, 0.260994856}, // 17872K {0.258948617, 0.260993062}, // 17873K {0.258947278, 0.260991268}, // 17874K {0.25894594, 0.260989475}, // 17875K {0.258944601, 0.260987682}, // 17876K {0.258943263, 0.260985889}, // 17877K {0.258941925, 0.260984096}, // 17878K {0.258940587, 0.260982303}, // 17879K {0.258939249, 0.260980511}, // 17880K {0.258937912, 0.260978719}, // 17881K {0.258936574, 0.260976927}, // 17882K {0.258935237, 0.260975136}, // 17883K {0.2589339, 0.260973344}, // 17884K {0.258932563, 0.260971553}, // 17885K {0.258931226, 0.260969762}, // 17886K {0.25892989, 0.260967971}, // 17887K {0.258928553, 0.260966181}, // 17888K {0.258927217, 0.260964391}, // 17889K {0.258925881, 0.260962601}, // 17890K {0.258924545, 0.260960811}, // 17891K {0.25892321, 0.260959021}, // 17892K {0.258921874, 0.260957232}, // 17893K {0.258920539, 0.260955443}, // 17894K {0.258919204, 0.260953654}, // 17895K {0.258917869, 0.260951865}, // 17896K {0.258916534, 0.260950077}, // 17897K {0.2589152, 0.260948289}, // 17898K {0.258913866, 0.260946501}, // 17899K {0.258912531, 0.260944713}, // 17900K {0.258911197, 0.260942925}, // 17901K {0.258909864, 0.260941138}, // 17902K {0.25890853, 0.260939351}, // 17903K {0.258907196, 0.260937564}, // 17904K {0.258905863, 0.260935777}, // 17905K {0.25890453, 0.260933991}, // 17906K {0.258903197, 0.260932205}, // 17907K {0.258901864, 0.260930419}, // 17908K {0.258900532, 0.260928633}, // 17909K {0.258899199, 0.260926848}, // 17910K {0.258897867, 0.260925062}, // 17911K {0.258896535, 0.260923277}, // 17912K {0.258895203, 0.260921492}, // 17913K {0.258893872, 0.260919708}, // 17914K {0.25889254, 0.260917923}, // 17915K {0.258891209, 0.260916139}, // 17916K {0.258889878, 0.260914355}, // 17917K {0.258888547, 0.260912572}, // 17918K {0.258887216, 0.260910788}, // 17919K {0.258885885, 0.260909005}, // 17920K {0.258884555, 0.260907222}, // 17921K {0.258883225, 0.260905439}, // 17922K {0.258881894, 0.260903656}, // 17923K {0.258880565, 0.260901874}, // 17924K {0.258879235, 0.260900092}, // 17925K {0.258877905, 0.26089831}, // 17926K {0.258876576, 0.260896528}, // 17927K {0.258875247, 0.260894747}, // 17928K {0.258873918, 0.260892966}, // 17929K {0.258872589, 0.260891185}, // 17930K {0.25887126, 0.260889404}, // 17931K {0.258869932, 0.260887623}, // 17932K {0.258868604, 0.260885843}, // 17933K {0.258867275, 0.260884063}, // 17934K {0.258865947, 0.260882283}, // 17935K {0.25886462, 0.260880503}, // 17936K {0.258863292, 0.260878724}, // 17937K {0.258861965, 0.260876945}, // 17938K {0.258860637, 0.260875166}, // 17939K {0.25885931, 0.260873387}, // 17940K {0.258857984, 0.260871608}, // 17941K {0.258856657, 0.26086983}, // 17942K {0.25885533, 0.260868052}, // 17943K {0.258854004, 0.260866274}, // 17944K {0.258852678, 0.260864497}, // 17945K {0.258851352, 0.260862719}, // 17946K {0.258850026, 0.260860942}, // 17947K {0.2588487, 0.260859165}, // 17948K {0.258847375, 0.260857388}, // 17949K {0.25884605, 0.260855612}, // 17950K {0.258844725, 0.260853836}, // 17951K {0.2588434, 0.260852059}, // 17952K {0.258842075, 0.260850284}, // 17953K {0.25884075, 0.260848508}, // 17954K {0.258839426, 0.260846733}, // 17955K {0.258838102, 0.260844957}, // 17956K {0.258836778, 0.260843183}, // 17957K {0.258835454, 0.260841408}, // 17958K {0.25883413, 0.260839633}, // 17959K {0.258832807, 0.260837859}, // 17960K {0.258831483, 0.260836085}, // 17961K {0.25883016, 0.260834311}, // 17962K {0.258828837, 0.260832538}, // 17963K {0.258827514, 0.260830764}, // 17964K {0.258826192, 0.260828991}, // 17965K {0.258824869, 0.260827218}, // 17966K {0.258823547, 0.260825445}, // 17967K {0.258822225, 0.260823673}, // 17968K {0.258820903, 0.260821901}, // 17969K {0.258819581, 0.260820129}, // 17970K {0.25881826, 0.260818357}, // 17971K {0.258816938, 0.260816585}, // 17972K {0.258815617, 0.260814814}, // 17973K {0.258814296, 0.260813043}, // 17974K {0.258812975, 0.260811272}, // 17975K {0.258811655, 0.260809501}, // 17976K {0.258810334, 0.260807731}, // 17977K {0.258809014, 0.26080596}, // 17978K {0.258807694, 0.26080419}, // 17979K {0.258806374, 0.260802421}, // 17980K {0.258805054, 0.260800651}, // 17981K {0.258803734, 0.260798882}, // 17982K {0.258802415, 0.260797112}, // 17983K {0.258801096, 0.260795344}, // 17984K {0.258799777, 0.260793575}, // 17985K {0.258798458, 0.260791806}, // 17986K {0.258797139, 0.260790038}, // 17987K {0.25879582, 0.26078827}, // 17988K {0.258794502, 0.260786502}, // 17989K {0.258793184, 0.260784735}, // 17990K {0.258791866, 0.260782967}, // 17991K {0.258790548, 0.2607812}, // 17992K {0.25878923, 0.260779433}, // 17993K {0.258787913, 0.260777667}, // 17994K {0.258786595, 0.2607759}, // 17995K {0.258785278, 0.260774134}, // 17996K {0.258783961, 0.260772368}, // 17997K {0.258782644, 0.260770602}, // 17998K {0.258781328, 0.260768837}, // 17999K {0.258780011, 0.260767071}, // 18000K {0.258778695, 0.260765306}, // 18001K {0.258777379, 0.260763541}, // 18002K {0.258776063, 0.260761777}, // 18003K {0.258774747, 0.260760012}, // 18004K {0.258773432, 0.260758248}, // 18005K {0.258772116, 0.260756484}, // 18006K {0.258770801, 0.26075472}, // 18007K {0.258769486, 0.260752956}, // 18008K {0.258768171, 0.260751193}, // 18009K {0.258766857, 0.26074943}, // 18010K {0.258765542, 0.260747667}, // 18011K {0.258764228, 0.260745904}, // 18012K {0.258762914, 0.260744142}, // 18013K {0.2587616, 0.26074238}, // 18014K {0.258760286, 0.260740618}, // 18015K {0.258758972, 0.260738856}, // 18016K {0.258757659, 0.260737094}, // 18017K {0.258756345, 0.260735333}, // 18018K {0.258755032, 0.260733572}, // 18019K {0.258753719, 0.260731811}, // 18020K {0.258752406, 0.26073005}, // 18021K {0.258751094, 0.26072829}, // 18022K {0.258749781, 0.260726529}, // 18023K {0.258748469, 0.260724769}, // 18024K {0.258747157, 0.26072301}, // 18025K {0.258745845, 0.26072125}, // 18026K {0.258744534, 0.260719491}, // 18027K {0.258743222, 0.260717731}, // 18028K {0.258741911, 0.260715972}, // 18029K {0.258740599, 0.260714214}, // 18030K {0.258739288, 0.260712455}, // 18031K {0.258737978, 0.260710697}, // 18032K {0.258736667, 0.260708939}, // 18033K {0.258735356, 0.260707181}, // 18034K {0.258734046, 0.260705424}, // 18035K {0.258732736, 0.260703666}, // 18036K {0.258731426, 0.260701909}, // 18037K {0.258730116, 0.260700152}, // 18038K {0.258728807, 0.260698395}, // 18039K {0.258727497, 0.260696639}, // 18040K {0.258726188, 0.260694883}, // 18041K {0.258724879, 0.260693126}, // 18042K {0.25872357, 0.260691371}, // 18043K {0.258722261, 0.260689615}, // 18044K {0.258720952, 0.26068786}, // 18045K {0.258719644, 0.260686104}, // 18046K {0.258718336, 0.26068435}, // 18047K {0.258717028, 0.260682595}, // 18048K {0.25871572, 0.26068084}, // 18049K {0.258714412, 0.260679086}, // 18050K {0.258713105, 0.260677332}, // 18051K {0.258711797, 0.260675578}, // 18052K {0.25871049, 0.260673824}, // 18053K {0.258709183, 0.260672071}, // 18054K {0.258707876, 0.260670318}, // 18055K {0.25870657, 0.260668565}, // 18056K {0.258705263, 0.260666812}, // 18057K {0.258703957, 0.26066506}, // 18058K {0.258702651, 0.260663307}, // 18059K {0.258701345, 0.260661555}, // 18060K {0.258700039, 0.260659803}, // 18061K {0.258698733, 0.260658052}, // 18062K {0.258697428, 0.2606563}, // 18063K {0.258696122, 0.260654549}, // 18064K {0.258694817, 0.260652798}, // 18065K {0.258693512, 0.260651047}, // 18066K {0.258692208, 0.260649297}, // 18067K {0.258690903, 0.260647546}, // 18068K {0.258689599, 0.260645796}, // 18069K {0.258688294, 0.260644046}, // 18070K {0.25868699, 0.260642297}, // 18071K {0.258685686, 0.260640547}, // 18072K {0.258684383, 0.260638798}, // 18073K {0.258683079, 0.260637049}, // 18074K {0.258681776, 0.2606353}, // 18075K {0.258680473, 0.260633551}, // 18076K {0.25867917, 0.260631803}, // 18077K {0.258677867, 0.260630055}, // 18078K {0.258676564, 0.260628307}, // 18079K {0.258675262, 0.260626559}, // 18080K {0.258673959, 0.260624812}, // 18081K {0.258672657, 0.260623064}, // 18082K {0.258671355, 0.260621317}, // 18083K {0.258670053, 0.260619571}, // 18084K {0.258668752, 0.260617824}, // 18085K {0.25866745, 0.260616078}, // 18086K {0.258666149, 0.260614331}, // 18087K {0.258664848, 0.260612585}, // 18088K {0.258663547, 0.26061084}, // 18089K {0.258662246, 0.260609094}, // 18090K {0.258660945, 0.260607349}, // 18091K {0.258659645, 0.260605604}, // 18092K {0.258658345, 0.260603859}, // 18093K {0.258657045, 0.260602114}, // 18094K {0.258655745, 0.26060037}, // 18095K {0.258654445, 0.260598626}, // 18096K {0.258653145, 0.260596882}, // 18097K {0.258651846, 0.260595138}, // 18098K {0.258650547, 0.260593394}, // 18099K {0.258649248, 0.260591651}, // 18100K {0.258647949, 0.260589908}, // 18101K {0.25864665, 0.260588165}, // 18102K {0.258645352, 0.260586422}, // 18103K {0.258644053, 0.26058468}, // 18104K {0.258642755, 0.260582938}, // 18105K {0.258641457, 0.260581195}, // 18106K {0.258640159, 0.260579454}, // 18107K {0.258638861, 0.260577712}, // 18108K {0.258637564, 0.260575971}, // 18109K {0.258636267, 0.26057423}, // 18110K {0.258634969, 0.260572489}, // 18111K {0.258633673, 0.260570748}, // 18112K {0.258632376, 0.260569007}, // 18113K {0.258631079, 0.260567267}, // 18114K {0.258629783, 0.260565527}, // 18115K {0.258628486, 0.260563787}, // 18116K {0.25862719, 0.260562048}, // 18117K {0.258625894, 0.260560308}, // 18118K {0.258624598, 0.260558569}, // 18119K {0.258623303, 0.26055683}, // 18120K {0.258622007, 0.260555091}, // 18121K {0.258620712, 0.260553353}, // 18122K {0.258619417, 0.260551614}, // 18123K {0.258618122, 0.260549876}, // 18124K {0.258616827, 0.260548138}, // 18125K {0.258615533, 0.260546401}, // 18126K {0.258614238, 0.260544663}, // 18127K {0.258612944, 0.260542926}, // 18128K {0.25861165, 0.260541189}, // 18129K {0.258610356, 0.260539452}, // 18130K {0.258609062, 0.260537715}, // 18131K {0.258607769, 0.260535979}, // 18132K {0.258606475, 0.260534243}, // 18133K {0.258605182, 0.260532507}, // 18134K {0.258603889, 0.260530771}, // 18135K {0.258602596, 0.260529036}, // 18136K {0.258601304, 0.2605273}, // 18137K {0.258600011, 0.260525565}, // 18138K {0.258598719, 0.26052383}, // 18139K {0.258597426, 0.260522096}, // 18140K {0.258596134, 0.260520361}, // 18141K {0.258594843, 0.260518627}, // 18142K {0.258593551, 0.260516893}, // 18143K {0.258592259, 0.260515159}, // 18144K {0.258590968, 0.260513426}, // 18145K {0.258589677, 0.260511693}, // 18146K {0.258588386, 0.260509959}, // 18147K {0.258587095, 0.260508226}, // 18148K {0.258585804, 0.260506494}, // 18149K {0.258584514, 0.260504761}, // 18150K {0.258583224, 0.260503029}, // 18151K {0.258581934, 0.260501297}, // 18152K {0.258580644, 0.260499565}, // 18153K {0.258579354, 0.260497834}, // 18154K {0.258578064, 0.260496102}, // 18155K {0.258576775, 0.260494371}, // 18156K {0.258575485, 0.26049264}, // 18157K {0.258574196, 0.260490909}, // 18158K {0.258572907, 0.260489179}, // 18159K {0.258571619, 0.260487448}, // 18160K {0.25857033, 0.260485718}, // 18161K {0.258569042, 0.260483988}, // 18162K {0.258567753, 0.260482259}, // 18163K {0.258566465, 0.260480529}, // 18164K {0.258565177, 0.2604788}, // 18165K {0.258563889, 0.260477071}, // 18166K {0.258562602, 0.260475342}, // 18167K {0.258561314, 0.260473614}, // 18168K {0.258560027, 0.260471885}, // 18169K {0.25855874, 0.260470157}, // 18170K {0.258557453, 0.260468429}, // 18171K {0.258556167, 0.260466701}, // 18172K {0.25855488, 0.260464974}, // 18173K {0.258553594, 0.260463247}, // 18174K {0.258552307, 0.260461519}, // 18175K {0.258551021, 0.260459793}, // 18176K {0.258549735, 0.260458066}, // 18177K {0.25854845, 0.260456339}, // 18178K {0.258547164, 0.260454613}, // 18179K {0.258545879, 0.260452887}, // 18180K {0.258544594, 0.260451161}, // 18181K {0.258543309, 0.260449436}, // 18182K {0.258542024, 0.26044771}, // 18183K {0.258540739, 0.260445985}, // 18184K {0.258539454, 0.26044426}, // 18185K {0.25853817, 0.260442536}, // 18186K {0.258536886, 0.260440811}, // 18187K {0.258535602, 0.260439087}, // 18188K {0.258534318, 0.260437363}, // 18189K {0.258533034, 0.260435639}, // 18190K {0.258531751, 0.260433915}, // 18191K {0.258530467, 0.260432192}, // 18192K {0.258529184, 0.260430469}, // 18193K {0.258527901, 0.260428746}, // 18194K {0.258526618, 0.260427023}, // 18195K {0.258525336, 0.2604253}, // 18196K {0.258524053, 0.260423578}, // 18197K {0.258522771, 0.260421856}, // 18198K {0.258521489, 0.260420134}, // 18199K {0.258520207, 0.260418412}, // 18200K {0.258518925, 0.260416691}, // 18201K {0.258517643, 0.260414969}, // 18202K {0.258516362, 0.260413248}, // 18203K {0.258515081, 0.260411527}, // 18204K {0.258513799, 0.260409807}, // 18205K {0.258512518, 0.260408086}, // 18206K {0.258511238, 0.260406366}, // 18207K {0.258509957, 0.260404646}, // 18208K {0.258508677, 0.260402926}, // 18209K {0.258507396, 0.260401207}, // 18210K {0.258506116, 0.260399487}, // 18211K {0.258504836, 0.260397768}, // 18212K {0.258503556, 0.260396049}, // 18213K {0.258502277, 0.26039433}, // 18214K {0.258500997, 0.260392612}, // 18215K {0.258499718, 0.260390894}, // 18216K {0.258498439, 0.260389176}, // 18217K {0.25849716, 0.260387458}, // 18218K {0.258495881, 0.26038574}, // 18219K {0.258494602, 0.260384023}, // 18220K {0.258493324, 0.260382305}, // 18221K {0.258492046, 0.260380588}, // 18222K {0.258490768, 0.260378872}, // 18223K {0.25848949, 0.260377155}, // 18224K {0.258488212, 0.260375439}, // 18225K {0.258486934, 0.260373722}, // 18226K {0.258485657, 0.260372007}, // 18227K {0.25848438, 0.260370291}, // 18228K {0.258483102, 0.260368575}, // 18229K {0.258481826, 0.26036686}, // 18230K {0.258480549, 0.260365145}, // 18231K {0.258479272, 0.26036343}, // 18232K {0.258477996, 0.260361715}, // 18233K {0.25847672, 0.260360001}, // 18234K {0.258475443, 0.260358287}, // 18235K {0.258474167, 0.260356573}, // 18236K {0.258472892, 0.260354859}, // 18237K {0.258471616, 0.260353145}, // 18238K {0.258470341, 0.260351432}, // 18239K {0.258469065, 0.260349719}, // 18240K {0.25846779, 0.260348006}, // 18241K {0.258466515, 0.260346293}, // 18242K {0.258465241, 0.26034458}, // 18243K {0.258463966, 0.260342868}, // 18244K {0.258462692, 0.260341156}, // 18245K {0.258461417, 0.260339444}, // 18246K {0.258460143, 0.260337732}, // 18247K {0.258458869, 0.260336021}, // 18248K {0.258457596, 0.26033431}, // 18249K {0.258456322, 0.260332598}, // 18250K {0.258455049, 0.260330888}, // 18251K {0.258453775, 0.260329177}, // 18252K {0.258452502, 0.260327467}, // 18253K {0.258451229, 0.260325756}, // 18254K {0.258449957, 0.260324046}, // 18255K {0.258448684, 0.260322337}, // 18256K {0.258447412, 0.260320627}, // 18257K {0.25844614, 0.260318918}, // 18258K {0.258444867, 0.260317209}, // 18259K {0.258443596, 0.2603155}, // 18260K {0.258442324, 0.260313791}, // 18261K {0.258441052, 0.260312082}, // 18262K {0.258439781, 0.260310374}, // 18263K {0.25843851, 0.260308666}, // 18264K {0.258437239, 0.260306958}, // 18265K {0.258435968, 0.26030525}, // 18266K {0.258434697, 0.260303543}, // 18267K {0.258433426, 0.260301836}, // 18268K {0.258432156, 0.260300129}, // 18269K {0.258430886, 0.260298422}, // 18270K {0.258429616, 0.260296715}, // 18271K {0.258428346, 0.260295009}, // 18272K {0.258427076, 0.260293303}, // 18273K {0.258425806, 0.260291597}, // 18274K {0.258424537, 0.260289891}, // 18275K {0.258423268, 0.260288186}, // 18276K {0.258421999, 0.26028648}, // 18277K {0.25842073, 0.260284775}, // 18278K {0.258419461, 0.26028307}, // 18279K {0.258418192, 0.260281365}, // 18280K {0.258416924, 0.260279661}, // 18281K {0.258415656, 0.260277957}, // 18282K {0.258414388, 0.260276253}, // 18283K {0.25841312, 0.260274549}, // 18284K {0.258411852, 0.260272845}, // 18285K {0.258410584, 0.260271142}, // 18286K {0.258409317, 0.260269438}, // 18287K {0.25840805, 0.260267735}, // 18288K {0.258406783, 0.260266033}, // 18289K {0.258405516, 0.26026433}, // 18290K {0.258404249, 0.260262628}, // 18291K {0.258402983, 0.260260925}, // 18292K {0.258401716, 0.260259224}, // 18293K {0.25840045, 0.260257522}, // 18294K {0.258399184, 0.26025582}, // 18295K {0.258397918, 0.260254119}, // 18296K {0.258396652, 0.260252418}, // 18297K {0.258395387, 0.260250717}, // 18298K {0.258394121, 0.260249016}, // 18299K {0.258392856, 0.260247316}, // 18300K {0.258391591, 0.260245615}, // 18301K {0.258390326, 0.260243915}, // 18302K {0.258389061, 0.260242216}, // 18303K {0.258387797, 0.260240516}, // 18304K {0.258386532, 0.260238816}, // 18305K {0.258385268, 0.260237117}, // 18306K {0.258384004, 0.260235418}, // 18307K {0.25838274, 0.260233719}, // 18308K {0.258381476, 0.260232021}, // 18309K {0.258380213, 0.260230322}, // 18310K {0.258378949, 0.260228624}, // 18311K {0.258377686, 0.260226926}, // 18312K {0.258376423, 0.260225229}, // 18313K {0.25837516, 0.260223531}, // 18314K {0.258373897, 0.260221834}, // 18315K {0.258372634, 0.260220137}, // 18316K {0.258371372, 0.26021844}, // 18317K {0.25837011, 0.260216743}, // 18318K {0.258368848, 0.260215046}, // 18319K {0.258367586, 0.26021335}, // 18320K {0.258366324, 0.260211654}, // 18321K {0.258365062, 0.260209958}, // 18322K {0.258363801, 0.260208263}, // 18323K {0.25836254, 0.260206567}, // 18324K {0.258361278, 0.260204872}, // 18325K {0.258360018, 0.260203177}, // 18326K {0.258358757, 0.260201482}, // 18327K {0.258357496, 0.260199788}, // 18328K {0.258356236, 0.260198093}, // 18329K {0.258354975, 0.260196399}, // 18330K {0.258353715, 0.260194705}, // 18331K {0.258352455, 0.260193011}, // 18332K {0.258351196, 0.260191318}, // 18333K {0.258349936, 0.260189624}, // 18334K {0.258348676, 0.260187931}, // 18335K {0.258347417, 0.260186238}, // 18336K {0.258346158, 0.260184545}, // 18337K {0.258344899, 0.260182853}, // 18338K {0.25834364, 0.260181161}, // 18339K {0.258342382, 0.260179469}, // 18340K {0.258341123, 0.260177777}, // 18341K {0.258339865, 0.260176085}, // 18342K {0.258338607, 0.260174394}, // 18343K {0.258337349, 0.260172702}, // 18344K {0.258336091, 0.260171011}, // 18345K {0.258334833, 0.26016932}, // 18346K {0.258333576, 0.26016763}, // 18347K {0.258332318, 0.260165939}, // 18348K {0.258331061, 0.260164249}, // 18349K {0.258329804, 0.260162559}, // 18350K {0.258328547, 0.260160869}, // 18351K {0.258327291, 0.26015918}, // 18352K {0.258326034, 0.26015749}, // 18353K {0.258324778, 0.260155801}, // 18354K {0.258323522, 0.260154112}, // 18355K {0.258322266, 0.260152423}, // 18356K {0.25832101, 0.260150735}, // 18357K {0.258319754, 0.260149047}, // 18358K {0.258318499, 0.260147358}, // 18359K {0.258317243, 0.26014567}, // 18360K {0.258315988, 0.260143983}, // 18361K {0.258314733, 0.260142295}, // 18362K {0.258313478, 0.260140608}, // 18363K {0.258312223, 0.260138921}, // 18364K {0.258310969, 0.260137234}, // 18365K {0.258309715, 0.260135547}, // 18366K {0.25830846, 0.260133861}, // 18367K {0.258307206, 0.260132175}, // 18368K {0.258305952, 0.260130489}, // 18369K {0.258304699, 0.260128803}, // 18370K {0.258303445, 0.260127117}, // 18371K {0.258302192, 0.260125432}, // 18372K {0.258300939, 0.260123746}, // 18373K {0.258299685, 0.260122061}, // 18374K {0.258298433, 0.260120377}, // 18375K {0.25829718, 0.260118692}, // 18376K {0.258295927, 0.260117008}, // 18377K {0.258294675, 0.260115323}, // 18378K {0.258293423, 0.260113639}, // 18379K {0.258292171, 0.260111956}, // 18380K {0.258290919, 0.260110272}, // 18381K {0.258289667, 0.260108589}, // 18382K {0.258288415, 0.260106906}, // 18383K {0.258287164, 0.260105223}, // 18384K {0.258285913, 0.26010354}, // 18385K {0.258284661, 0.260101857}, // 18386K {0.258283411, 0.260100175}, // 18387K {0.25828216, 0.260098493}, // 18388K {0.258280909, 0.260096811}, // 18389K {0.258279659, 0.260095129}, // 18390K {0.258278408, 0.260093448}, // 18391K {0.258277158, 0.260091767}, // 18392K {0.258275908, 0.260090086}, // 18393K {0.258274658, 0.260088405}, // 18394K {0.258273409, 0.260086724}, // 18395K {0.258272159, 0.260085044}, // 18396K {0.25827091, 0.260083363}, // 18397K {0.258269661, 0.260081683}, // 18398K {0.258268412, 0.260080004}, // 18399K {0.258267163, 0.260078324}, // 18400K {0.258265914, 0.260076645}, // 18401K {0.258264666, 0.260074965}, // 18402K {0.258263418, 0.260073286}, // 18403K {0.258262169, 0.260071607}, // 18404K {0.258260921, 0.260069929}, // 18405K {0.258259674, 0.260068251}, // 18406K {0.258258426, 0.260066572}, // 18407K {0.258257178, 0.260064894}, // 18408K {0.258255931, 0.260063217}, // 18409K {0.258254684, 0.260061539}, // 18410K {0.258253437, 0.260059862}, // 18411K {0.25825219, 0.260058185}, // 18412K {0.258250943, 0.260056508}, // 18413K {0.258249697, 0.260054831}, // 18414K {0.25824845, 0.260053154}, // 18415K {0.258247204, 0.260051478}, // 18416K {0.258245958, 0.260049802}, // 18417K {0.258244712, 0.260048126}, // 18418K {0.258243466, 0.26004645}, // 18419K {0.258242221, 0.260044775}, // 18420K {0.258240975, 0.2600431}, // 18421K {0.25823973, 0.260041424}, // 18422K {0.258238485, 0.26003975}, // 18423K {0.25823724, 0.260038075}, // 18424K {0.258235995, 0.2600364}, // 18425K {0.258234751, 0.260034726}, // 18426K {0.258233506, 0.260033052}, // 18427K {0.258232262, 0.260031378}, // 18428K {0.258231018, 0.260029705}, // 18429K {0.258229774, 0.260028031}, // 18430K {0.25822853, 0.260026358}, // 18431K {0.258227286, 0.260024685}, // 18432K {0.258226043, 0.260023012}, // 18433K {0.2582248, 0.260021339}, // 18434K {0.258223557, 0.260019667}, // 18435K {0.258222314, 0.260017995}, // 18436K {0.258221071, 0.260016323}, // 18437K {0.258219828, 0.260014651}, // 18438K {0.258218586, 0.260012979}, // 18439K {0.258217343, 0.260011308}, // 18440K {0.258216101, 0.260009637}, // 18441K {0.258214859, 0.260007966}, // 18442K {0.258213617, 0.260006295}, // 18443K {0.258212375, 0.260004625}, // 18444K {0.258211134, 0.260002954}, // 18445K {0.258209893, 0.260001284}, // 18446K {0.258208651, 0.259999614}, // 18447K {0.25820741, 0.259997944}, // 18448K {0.258206169, 0.259996275}, // 18449K {0.258204929, 0.259994606}, // 18450K {0.258203688, 0.259992936}, // 18451K {0.258202448, 0.259991268}, // 18452K {0.258201207, 0.259989599}, // 18453K {0.258199967, 0.25998793}, // 18454K {0.258198727, 0.259986262}, // 18455K {0.258197488, 0.259984594}, // 18456K {0.258196248, 0.259982926}, // 18457K {0.258195009, 0.259981258}, // 18458K {0.258193769, 0.259979591}, // 18459K {0.25819253, 0.259977924}, // 18460K {0.258191291, 0.259976256}, // 18461K {0.258190053, 0.25997459}, // 18462K {0.258188814, 0.259972923}, // 18463K {0.258187575, 0.259971256}, // 18464K {0.258186337, 0.25996959}, // 18465K {0.258185099, 0.259967924}, // 18466K {0.258183861, 0.259966258}, // 18467K {0.258182623, 0.259964593}, // 18468K {0.258181385, 0.259962927}, // 18469K {0.258180148, 0.259961262}, // 18470K {0.258178911, 0.259959597}, // 18471K {0.258177673, 0.259957932}, // 18472K {0.258176436, 0.259956267}, // 18473K {0.2581752, 0.259954603}, // 18474K {0.258173963, 0.259952939}, // 18475K {0.258172726, 0.259951275}, // 18476K {0.25817149, 0.259949611}, // 18477K {0.258170254, 0.259947947}, // 18478K {0.258169018, 0.259946284}, // 18479K {0.258167782, 0.259944621}, // 18480K {0.258166546, 0.259942958}, // 18481K {0.25816531, 0.259941295}, // 18482K {0.258164075, 0.259939632}, // 18483K {0.25816284, 0.25993797}, // 18484K {0.258161605, 0.259936308}, // 18485K {0.25816037, 0.259934646}, // 18486K {0.258159135, 0.259932984}, // 18487K {0.2581579, 0.259931322}, // 18488K {0.258156666, 0.259929661}, // 18489K {0.258155431, 0.259928}, // 18490K {0.258154197, 0.259926339}, // 18491K {0.258152963, 0.259924678}, // 18492K {0.25815173, 0.259923018}, // 18493K {0.258150496, 0.259921357}, // 18494K {0.258149262, 0.259919697}, // 18495K {0.258148029, 0.259918037}, // 18496K {0.258146796, 0.259916378}, // 18497K {0.258145563, 0.259914718}, // 18498K {0.25814433, 0.259913059}, // 18499K {0.258143097, 0.259911399}, // 18500K {0.258141865, 0.259909741}, // 18501K {0.258140632, 0.259908082}, // 18502K {0.2581394, 0.259906423}, // 18503K {0.258138168, 0.259904765}, // 18504K {0.258136936, 0.259903107}, // 18505K {0.258135704, 0.259901449}, // 18506K {0.258134473, 0.259899791}, // 18507K {0.258133241, 0.259898134}, // 18508K {0.25813201, 0.259896476}, // 18509K {0.258130779, 0.259894819}, // 18510K {0.258129548, 0.259893162}, // 18511K {0.258128317, 0.259891506}, // 18512K {0.258127087, 0.259889849}, // 18513K {0.258125856, 0.259888193}, // 18514K {0.258124626, 0.259886537}, // 18515K {0.258123396, 0.259884881}, // 18516K {0.258122166, 0.259883225}, // 18517K {0.258120936, 0.25988157}, // 18518K {0.258119706, 0.259879915}, // 18519K {0.258118477, 0.259878259}, // 18520K {0.258117247, 0.259876605}, // 18521K {0.258116018, 0.25987495}, // 18522K {0.258114789, 0.259873295}, // 18523K {0.25811356, 0.259871641}, // 18524K {0.258112331, 0.259869987}, // 18525K {0.258111103, 0.259868333}, // 18526K {0.258109874, 0.25986668}, // 18527K {0.258108646, 0.259865026}, // 18528K {0.258107418, 0.259863373}, // 18529K {0.25810619, 0.25986172}, // 18530K {0.258104962, 0.259860067}, // 18531K {0.258103735, 0.259858414}, // 18532K {0.258102507, 0.259856762}, // 18533K {0.25810128, 0.25985511}, // 18534K {0.258100053, 0.259853458}, // 18535K {0.258098826, 0.259851806}, // 18536K {0.258097599, 0.259850154}, // 18537K {0.258096372, 0.259848503}, // 18538K {0.258095146, 0.259846851}, // 18539K {0.25809392, 0.2598452}, // 18540K {0.258092693, 0.25984355}, // 18541K {0.258091467, 0.259841899}, // 18542K {0.258090241, 0.259840249}, // 18543K {0.258089016, 0.259838598}, // 18544K {0.25808779, 0.259836948}, // 18545K {0.258086565, 0.259835298}, // 18546K {0.25808534, 0.259833649}, // 18547K {0.258084115, 0.259831999}, // 18548K {0.25808289, 0.25983035}, // 18549K {0.258081665, 0.259828701}, // 18550K {0.25808044, 0.259827052}, // 18551K {0.258079216, 0.259825404}, // 18552K {0.258077992, 0.259823755}, // 18553K {0.258076767, 0.259822107}, // 18554K {0.258075543, 0.259820459}, // 18555K {0.25807432, 0.259818811}, // 18556K {0.258073096, 0.259817164}, // 18557K {0.258071872, 0.259815516}, // 18558K {0.258070649, 0.259813869}, // 18559K {0.258069426, 0.259812222}, // 18560K {0.258068203, 0.259810575}, // 18561K {0.25806698, 0.259808929}, // 18562K {0.258065757, 0.259807282}, // 18563K {0.258064535, 0.259805636}, // 18564K {0.258063312, 0.25980399}, // 18565K {0.25806209, 0.259802344}, // 18566K {0.258060868, 0.259800699}, // 18567K {0.258059646, 0.259799053}, // 18568K {0.258058424, 0.259797408}, // 18569K {0.258057203, 0.259795763}, // 18570K {0.258055981, 0.259794118}, // 18571K {0.25805476, 0.259792474}, // 18572K {0.258053539, 0.259790829}, // 18573K {0.258052318, 0.259789185}, // 18574K {0.258051097, 0.259787541}, // 18575K {0.258049877, 0.259785897}, // 18576K {0.258048656, 0.259784254}, // 18577K {0.258047436, 0.25978261}, // 18578K {0.258046215, 0.259780967}, // 18579K {0.258044995, 0.259779324}, // 18580K {0.258043776, 0.259777681}, // 18581K {0.258042556, 0.259776039}, // 18582K {0.258041336, 0.259774396}, // 18583K {0.258040117, 0.259772754}, // 18584K {0.258038898, 0.259771112}, // 18585K {0.258037679, 0.25976947}, // 18586K {0.25803646, 0.259767829}, // 18587K {0.258035241, 0.259766187}, // 18588K {0.258034022, 0.259764546}, // 18589K {0.258032804, 0.259762905}, // 18590K {0.258031586, 0.259761264}, // 18591K {0.258030367, 0.259759624}, // 18592K {0.258029149, 0.259757983}, // 18593K {0.258027932, 0.259756343}, // 18594K {0.258026714, 0.259754703}, // 18595K {0.258025496, 0.259753063}, // 18596K {0.258024279, 0.259751424}, // 18597K {0.258023062, 0.259749784}, // 18598K {0.258021845, 0.259748145}, // 18599K {0.258020628, 0.259746506}, // 18600K {0.258019411, 0.259744867}, // 18601K {0.258018195, 0.259743229}, // 18602K {0.258016978, 0.25974159}, // 18603K {0.258015762, 0.259739952}, // 18604K {0.258014546, 0.259738314}, // 18605K {0.25801333, 0.259736676}, // 18606K {0.258012114, 0.259735039}, // 18607K {0.258010898, 0.259733401}, // 18608K {0.258009683, 0.259731764}, // 18609K {0.258008468, 0.259730127}, // 18610K {0.258007252, 0.25972849}, // 18611K {0.258006037, 0.259726854}, // 18612K {0.258004823, 0.259725217}, // 18613K {0.258003608, 0.259723581}, // 18614K {0.258002393, 0.259721945}, // 18615K {0.258001179, 0.259720309}, // 18616K {0.257999965, 0.259718674}, // 18617K {0.257998751, 0.259717038}, // 18618K {0.257997537, 0.259715403}, // 18619K {0.257996323, 0.259713768}, // 18620K {0.257995109, 0.259712133}, // 18621K {0.257993896, 0.259710499}, // 18622K {0.257992683, 0.259708864}, // 18623K {0.257991469, 0.25970723}, // 18624K {0.257990256, 0.259705596}, // 18625K {0.257989044, 0.259703962}, // 18626K {0.257987831, 0.259702329}, // 18627K {0.257986618, 0.259700695}, // 18628K {0.257985406, 0.259699062}, // 18629K {0.257984194, 0.259697429}, // 18630K {0.257982982, 0.259695796}, // 18631K {0.25798177, 0.259694163}, // 18632K {0.257980558, 0.259692531}, // 18633K {0.257979347, 0.259690899}, // 18634K {0.257978135, 0.259689267}, // 18635K {0.257976924, 0.259687635}, // 18636K {0.257975713, 0.259686003}, // 18637K {0.257974502, 0.259684372}, // 18638K {0.257973291, 0.259682741}, // 18639K {0.25797208, 0.25968111}, // 18640K {0.25797087, 0.259679479}, // 18641K {0.25796966, 0.259677848}, // 18642K {0.257968449, 0.259676218}, // 18643K {0.257967239, 0.259674587}, // 18644K {0.25796603, 0.259672957}, // 18645K {0.25796482, 0.259671327}, // 18646K {0.25796361, 0.259669698}, // 18647K {0.257962401, 0.259668068}, // 18648K {0.257961192, 0.259666439}, // 18649K {0.257959983, 0.25966481}, // 18650K {0.257958774, 0.259663181}, // 18651K {0.257957565, 0.259661553}, // 18652K {0.257956356, 0.259659924}, // 18653K {0.257955148, 0.259658296}, // 18654K {0.257953939, 0.259656668}, // 18655K {0.257952731, 0.25965504}, // 18656K {0.257951523, 0.259653412}, // 18657K {0.257950315, 0.259651785}, // 18658K {0.257949108, 0.259650157}, // 18659K {0.2579479, 0.25964853}, // 18660K {0.257946693, 0.259646903}, // 18661K {0.257945486, 0.259645277}, // 18662K {0.257944279, 0.25964365}, // 18663K {0.257943072, 0.259642024}, // 18664K {0.257941865, 0.259640398}, // 18665K {0.257940658, 0.259638772}, // 18666K {0.257939452, 0.259637146}, // 18667K {0.257938245, 0.259635521}, // 18668K {0.257937039, 0.259633895}, // 18669K {0.257935833, 0.25963227}, // 18670K {0.257934628, 0.259630645}, // 18671K {0.257933422, 0.259629021}, // 18672K {0.257932216, 0.259627396}, // 18673K {0.257931011, 0.259625772}, // 18674K {0.257929806, 0.259624148}, // 18675K {0.257928601, 0.259622524}, // 18676K {0.257927396, 0.2596209}, // 18677K {0.257926191, 0.259619277}, // 18678K {0.257924986, 0.259617653}, // 18679K {0.257923782, 0.25961603}, // 18680K {0.257922578, 0.259614407}, // 18681K {0.257921374, 0.259612784}, // 18682K {0.25792017, 0.259611162}, // 18683K {0.257918966, 0.259609539}, // 18684K {0.257917762, 0.259607917}, // 18685K {0.257916558, 0.259606295}, // 18686K {0.257915355, 0.259604674}, // 18687K {0.257914152, 0.259603052}, // 18688K {0.257912949, 0.259601431}, // 18689K {0.257911746, 0.259599809}, // 18690K {0.257910543, 0.259598188}, // 18691K {0.257909341, 0.259596568}, // 18692K {0.257908138, 0.259594947}, // 18693K {0.257906936, 0.259593327}, // 18694K {0.257905734, 0.259591707}, // 18695K {0.257904532, 0.259590087}, // 18696K {0.25790333, 0.259588467}, // 18697K {0.257902128, 0.259586847}, // 18698K {0.257900927, 0.259585228}, // 18699K {0.257899725, 0.259583608}, // 18700K {0.257898524, 0.259581989}, // 18701K {0.257897323, 0.259580371}, // 18702K {0.257896122, 0.259578752}, // 18703K {0.257894921, 0.259577134}, // 18704K {0.257893721, 0.259575515}, // 18705K {0.25789252, 0.259573897}, // 18706K {0.25789132, 0.259572279}, // 18707K {0.25789012, 0.259570662}, // 18708K {0.25788892, 0.259569044}, // 18709K {0.25788772, 0.259567427}, // 18710K {0.257886521, 0.25956581}, // 18711K {0.257885321, 0.259564193}, // 18712K {0.257884122, 0.259562577}, // 18713K {0.257882922, 0.25956096}, // 18714K {0.257881723, 0.259559344}, // 18715K {0.257880524, 0.259557728}, // 18716K {0.257879326, 0.259556112}, // 18717K {0.257878127, 0.259554496}, // 18718K {0.257876929, 0.259552881}, // 18719K {0.25787573, 0.259551265}, // 18720K {0.257874532, 0.25954965}, // 18721K {0.257873334, 0.259548035}, // 18722K {0.257872136, 0.259546421}, // 18723K {0.257870939, 0.259544806}, // 18724K {0.257869741, 0.259543192}, // 18725K {0.257868544, 0.259541578}, // 18726K {0.257867347, 0.259539964}, // 18727K {0.25786615, 0.25953835}, // 18728K {0.257864953, 0.259536736}, // 18729K {0.257863756, 0.259535123}, // 18730K {0.257862559, 0.25953351}, // 18731K {0.257861363, 0.259531897}, // 18732K {0.257860166, 0.259530284}, // 18733K {0.25785897, 0.259528672}, // 18734K {0.257857774, 0.259527059}, // 18735K {0.257856578, 0.259525447}, // 18736K {0.257855383, 0.259523835}, // 18737K {0.257854187, 0.259522223}, // 18738K {0.257852992, 0.259520612}, // 18739K {0.257851797, 0.259519}, // 18740K {0.257850602, 0.259517389}, // 18741K {0.257849407, 0.259515778}, // 18742K {0.257848212, 0.259514167}, // 18743K {0.257847017, 0.259512557}, // 18744K {0.257845823, 0.259510946}, // 18745K {0.257844628, 0.259509336}, // 18746K {0.257843434, 0.259507726}, // 18747K {0.25784224, 0.259506116}, // 18748K {0.257841046, 0.259504507}, // 18749K {0.257839853, 0.259502897}, // 18750K {0.257838659, 0.259501288}, // 18751K {0.257837466, 0.259499679}, // 18752K {0.257836272, 0.25949807}, // 18753K {0.257835079, 0.259496461}, // 18754K {0.257833886, 0.259494853}, // 18755K {0.257832694, 0.259493245}, // 18756K {0.257831501, 0.259491636}, // 18757K {0.257830308, 0.259490029}, // 18758K {0.257829116, 0.259488421}, // 18759K {0.257827924, 0.259486813}, // 18760K {0.257826732, 0.259485206}, // 18761K {0.25782554, 0.259483599}, // 18762K {0.257824348, 0.259481992}, // 18763K {0.257823157, 0.259480385}, // 18764K {0.257821965, 0.259478779}, // 18765K {0.257820774, 0.259477172}, // 18766K {0.257819583, 0.259475566}, // 18767K {0.257818392, 0.25947396}, // 18768K {0.257817201, 0.259472354}, // 18769K {0.25781601, 0.259470749}, // 18770K {0.25781482, 0.259469144}, // 18771K {0.25781363, 0.259467538}, // 18772K {0.257812439, 0.259465933}, // 18773K {0.257811249, 0.259464329}, // 18774K {0.257810059, 0.259462724}, // 18775K {0.25780887, 0.25946112}, // 18776K {0.25780768, 0.259459515}, // 18777K {0.257806491, 0.259457911}, // 18778K {0.257805301, 0.259456307}, // 18779K {0.257804112, 0.259454704}, // 18780K {0.257802923, 0.2594531}, // 18781K {0.257801734, 0.259451497}, // 18782K {0.257800546, 0.259449894}, // 18783K {0.257799357, 0.259448291}, // 18784K {0.257798169, 0.259446689}, // 18785K {0.25779698, 0.259445086}, // 18786K {0.257795792, 0.259443484}, // 18787K {0.257794604, 0.259441882}, // 18788K {0.257793417, 0.25944028}, // 18789K {0.257792229, 0.259438678}, // 18790K {0.257791041, 0.259437077}, // 18791K {0.257789854, 0.259435475}, // 18792K {0.257788667, 0.259433874}, // 18793K {0.25778748, 0.259432273}, // 18794K {0.257786293, 0.259430673}, // 18795K {0.257785106, 0.259429072}, // 18796K {0.25778392, 0.259427472}, // 18797K {0.257782733, 0.259425871}, // 18798K {0.257781547, 0.259424271}, // 18799K {0.257780361, 0.259422672}, // 18800K {0.257779175, 0.259421072}, // 18801K {0.257777989, 0.259419473}, // 18802K {0.257776803, 0.259417874}, // 18803K {0.257775618, 0.259416275}, // 18804K {0.257774432, 0.259414676}, // 18805K {0.257773247, 0.259413077}, // 18806K {0.257772062, 0.259411479}, // 18807K {0.257770877, 0.25940988}, // 18808K {0.257769692, 0.259408282}, // 18809K {0.257768508, 0.259406685}, // 18810K {0.257767323, 0.259405087}, // 18811K {0.257766139, 0.259403489}, // 18812K {0.257764955, 0.259401892}, // 18813K {0.257763771, 0.259400295}, // 18814K {0.257762587, 0.259398698}, // 18815K {0.257761403, 0.259397102}, // 18816K {0.25776022, 0.259395505}, // 18817K {0.257759036, 0.259393909}, // 18818K {0.257757853, 0.259392313}, // 18819K {0.25775667, 0.259390717}, // 18820K {0.257755487, 0.259389121}, // 18821K {0.257754304, 0.259387525}, // 18822K {0.257753122, 0.25938593}, // 18823K {0.257751939, 0.259384335}, // 18824K {0.257750757, 0.25938274}, // 18825K {0.257749574, 0.259381145}, // 18826K {0.257748392, 0.259379551}, // 18827K {0.25774721, 0.259377956}, // 18828K {0.257746029, 0.259376362}, // 18829K {0.257744847, 0.259374768}, // 18830K {0.257743666, 0.259373174}, // 18831K {0.257742484, 0.259371581}, // 18832K {0.257741303, 0.259369987}, // 18833K {0.257740122, 0.259368394}, // 18834K {0.257738941, 0.259366801}, // 18835K {0.257737761, 0.259365208}, // 18836K {0.25773658, 0.259363615}, // 18837K {0.2577354, 0.259362023}, // 18838K {0.257734219, 0.259360431}, // 18839K {0.257733039, 0.259358838}, // 18840K {0.257731859, 0.259357247}, // 18841K {0.25773068, 0.259355655}, // 18842K {0.2577295, 0.259354063}, // 18843K {0.25772832, 0.259352472}, // 18844K {0.257727141, 0.259350881}, // 18845K {0.257725962, 0.25934929}, // 18846K {0.257724783, 0.259347699}, // 18847K {0.257723604, 0.259346109}, // 18848K {0.257722425, 0.259344518}, // 18849K {0.257721246, 0.259342928}, // 18850K {0.257720068, 0.259341338}, // 18851K {0.25771889, 0.259339748}, // 18852K {0.257717711, 0.259338159}, // 18853K {0.257716533, 0.259336569}, // 18854K {0.257715356, 0.25933498}, // 18855K {0.257714178, 0.259333391}, // 18856K {0.257713, 0.259331802}, // 18857K {0.257711823, 0.259330214}, // 18858K {0.257710646, 0.259328625}, // 18859K {0.257709469, 0.259327037}, // 18860K {0.257708292, 0.259325449}, // 18861K {0.257707115, 0.259323861}, // 18862K {0.257705938, 0.259322273}, // 18863K {0.257704762, 0.259320686}, // 18864K {0.257703585, 0.259319098}, // 18865K {0.257702409, 0.259317511}, // 18866K {0.257701233, 0.259315924}, // 18867K {0.257700057, 0.259314337}, // 18868K {0.257698881, 0.259312751}, // 18869K {0.257697706, 0.259311165}, // 18870K {0.25769653, 0.259309578}, // 18871K {0.257695355, 0.259307992}, // 18872K {0.25769418, 0.259306407}, // 18873K {0.257693005, 0.259304821}, // 18874K {0.25769183, 0.259303236}, // 18875K {0.257690655, 0.25930165}, // 18876K {0.25768948, 0.259300065}, // 18877K {0.257688306, 0.25929848}, // 18878K {0.257687132, 0.259296896}, // 18879K {0.257685957, 0.259295311}, // 18880K {0.257684783, 0.259293727}, // 18881K {0.25768361, 0.259292143}, // 18882K {0.257682436, 0.259290559}, // 18883K {0.257681262, 0.259288975}, // 18884K {0.257680089, 0.259287392}, // 18885K {0.257678916, 0.259285809}, // 18886K {0.257677743, 0.259284225}, // 18887K {0.25767657, 0.259282643}, // 18888K {0.257675397, 0.25928106}, // 18889K {0.257674224, 0.259279477}, // 18890K {0.257673052, 0.259277895}, // 18891K {0.257671879, 0.259276313}, // 18892K {0.257670707, 0.259274731}, // 18893K {0.257669535, 0.259273149}, // 18894K {0.257668363, 0.259271567}, // 18895K {0.257667191, 0.259269986}, // 18896K {0.25766602, 0.259268405}, // 18897K {0.257664848, 0.259266824}, // 18898K {0.257663677, 0.259265243}, // 18899K {0.257662506, 0.259263662}, // 18900K {0.257661335, 0.259262082}, // 18901K {0.257660164, 0.259260501}, // 18902K {0.257658993, 0.259258921}, // 18903K {0.257657823, 0.259257341}, // 18904K {0.257656652, 0.259255761}, // 18905K {0.257655482, 0.259254182}, // 18906K {0.257654312, 0.259252603}, // 18907K {0.257653142, 0.259251023}, // 18908K {0.257651972, 0.259249444}, // 18909K {0.257650802, 0.259247866}, // 18910K {0.257649633, 0.259246287}, // 18911K {0.257648463, 0.259244709}, // 18912K {0.257647294, 0.259243131}, // 18913K {0.257646125, 0.259241553}, // 18914K {0.257644956, 0.259239975}, // 18915K {0.257643787, 0.259238397}, // 18916K {0.257642619, 0.25923682}, // 18917K {0.25764145, 0.259235242}, // 18918K {0.257640282, 0.259233665}, // 18919K {0.257639114, 0.259232088}, // 18920K {0.257637946, 0.259230512}, // 18921K {0.257636778, 0.259228935}, // 18922K {0.25763561, 0.259227359}, // 18923K {0.257634442, 0.259225783}, // 18924K {0.257633275, 0.259224207}, // 18925K {0.257632108, 0.259222631}, // 18926K {0.25763094, 0.259221055}, // 18927K {0.257629773, 0.25921948}, // 18928K {0.257628606, 0.259217905}, // 18929K {0.25762744, 0.25921633}, // 18930K {0.257626273, 0.259214755}, // 18931K {0.257625107, 0.25921318}, // 18932K {0.25762394, 0.259211606}, // 18933K {0.257622774, 0.259210032}, // 18934K {0.257621608, 0.259208458}, // 18935K {0.257620442, 0.259206884}, // 18936K {0.257619277, 0.25920531}, // 18937K {0.257618111, 0.259203737}, // 18938K {0.257616946, 0.259202163}, // 18939K {0.25761578, 0.25920059}, // 18940K {0.257614615, 0.259199017}, // 18941K {0.25761345, 0.259197445}, // 18942K {0.257612286, 0.259195872}, // 18943K {0.257611121, 0.2591943}, // 18944K {0.257609956, 0.259192727}, // 18945K {0.257608792, 0.259191155}, // 18946K {0.257607628, 0.259189584}, // 18947K {0.257606464, 0.259188012}, // 18948K {0.2576053, 0.259186441}, // 18949K {0.257604136, 0.259184869}, // 18950K {0.257602972, 0.259183298}, // 18951K {0.257601809, 0.259181727}, // 18952K {0.257600645, 0.259180157}, // 18953K {0.257599482, 0.259178586}, // 18954K {0.257598319, 0.259177016}, // 18955K {0.257597156, 0.259175446}, // 18956K {0.257595994, 0.259173876}, // 18957K {0.257594831, 0.259172306}, // 18958K {0.257593668, 0.259170737}, // 18959K {0.257592506, 0.259169167}, // 18960K {0.257591344, 0.259167598}, // 18961K {0.257590182, 0.259166029}, // 18962K {0.25758902, 0.25916446}, // 18963K {0.257587858, 0.259162892}, // 18964K {0.257586697, 0.259161323}, // 18965K {0.257585535, 0.259159755}, // 18966K {0.257584374, 0.259158187}, // 18967K {0.257583213, 0.259156619}, // 18968K {0.257582052, 0.259155051}, // 18969K {0.257580891, 0.259153484}, // 18970K {0.25757973, 0.259151917}, // 18971K {0.25757857, 0.25915035}, // 18972K {0.257577409, 0.259148783}, // 18973K {0.257576249, 0.259147216}, // 18974K {0.257575089, 0.259145649}, // 18975K {0.257573929, 0.259144083}, // 18976K {0.257572769, 0.259142517}, // 18977K {0.257571609, 0.259140951}, // 18978K {0.25757045, 0.259139385}, // 18979K {0.25756929, 0.259137819}, // 18980K {0.257568131, 0.259136254}, // 18981K {0.257566972, 0.259134689}, // 18982K {0.257565813, 0.259133124}, // 18983K {0.257564654, 0.259131559}, // 18984K {0.257563496, 0.259129994}, // 18985K {0.257562337, 0.25912843}, // 18986K {0.257561179, 0.259126865}, // 18987K {0.25756002, 0.259125301}, // 18988K {0.257558862, 0.259123737}, // 18989K {0.257557704, 0.259122173}, // 18990K {0.257556547, 0.25912061}, // 18991K {0.257555389, 0.259119046}, // 18992K {0.257554232, 0.259117483}, // 18993K {0.257553074, 0.25911592}, // 18994K {0.257551917, 0.259114357}, // 18995K {0.25755076, 0.259112795}, // 18996K {0.257549603, 0.259111232}, // 18997K {0.257548446, 0.25910967}, // 18998K {0.25754729, 0.259108108}, // 18999K {0.257546133, 0.259106546}, // 19000K {0.257544977, 0.259104984}, // 19001K {0.257543821, 0.259103423}, // 19002K {0.257542665, 0.259101862}, // 19003K {0.257541509, 0.2591003}, // 19004K {0.257540353, 0.259098739}, // 19005K {0.257539197, 0.259097179}, // 19006K {0.257538042, 0.259095618}, // 19007K {0.257536886, 0.259094058}, // 19008K {0.257535731, 0.259092497}, // 19009K {0.257534576, 0.259090937}, // 19010K {0.257533421, 0.259089378}, // 19011K {0.257532267, 0.259087818}, // 19012K {0.257531112, 0.259086258}, // 19013K {0.257529958, 0.259084699}, // 19014K {0.257528803, 0.25908314}, // 19015K {0.257527649, 0.259081581}, // 19016K {0.257526495, 0.259080022}, // 19017K {0.257525341, 0.259078464}, // 19018K {0.257524188, 0.259076906}, // 19019K {0.257523034, 0.259075347}, // 19020K {0.257521881, 0.259073789}, // 19021K {0.257520727, 0.259072232}, // 19022K {0.257519574, 0.259070674}, // 19023K {0.257518421, 0.259069116}, // 19024K {0.257517268, 0.259067559}, // 19025K {0.257516116, 0.259066002}, // 19026K {0.257514963, 0.259064445}, // 19027K {0.257513811, 0.259062889}, // 19028K {0.257512658, 0.259061332}, // 19029K {0.257511506, 0.259059776}, // 19030K {0.257510354, 0.25905822}, // 19031K {0.257509202, 0.259056664}, // 19032K {0.257508051, 0.259055108}, // 19033K {0.257506899, 0.259053552}, // 19034K {0.257505748, 0.259051997}, // 19035K {0.257504596, 0.259050442}, // 19036K {0.257503445, 0.259048887}, // 19037K {0.257502294, 0.259047332}, // 19038K {0.257501144, 0.259045777}, // 19039K {0.257499993, 0.259044223}, // 19040K {0.257498842, 0.259042668}, // 19041K {0.257497692, 0.259041114}, // 19042K {0.257496542, 0.25903956}, // 19043K {0.257495392, 0.259038007}, // 19044K {0.257494242, 0.259036453}, // 19045K {0.257493092, 0.2590349}, // 19046K {0.257491942, 0.259033347}, // 19047K {0.257490793, 0.259031794}, // 19048K {0.257489643, 0.259030241}, // 19049K {0.257488494, 0.259028688}, // 19050K {0.257487345, 0.259027136}, // 19051K {0.257486196, 0.259025584}, // 19052K {0.257485047, 0.259024031}, // 19053K {0.257483899, 0.25902248}, // 19054K {0.25748275, 0.259020928}, // 19055K {0.257481602, 0.259019376}, // 19056K {0.257480453, 0.259017825}, // 19057K {0.257479305, 0.259016274}, // 19058K {0.257478157, 0.259014723}, // 19059K {0.25747701, 0.259013172}, // 19060K {0.257475862, 0.259011622}, // 19061K {0.257474714, 0.259010071}, // 19062K {0.257473567, 0.259008521}, // 19063K {0.25747242, 0.259006971}, // 19064K {0.257471273, 0.259005421}, // 19065K {0.257470126, 0.259003871}, // 19066K {0.257468979, 0.259002322}, // 19067K {0.257467832, 0.259000773}, // 19068K {0.257466686, 0.258999223}, // 19069K {0.25746554, 0.258997674}, // 19070K {0.257464393, 0.258996126}, // 19071K {0.257463247, 0.258994577}, // 19072K {0.257462101, 0.258993029}, // 19073K {0.257460956, 0.258991481}, // 19074K {0.25745981, 0.258989933}, // 19075K {0.257458664, 0.258988385}, // 19076K {0.257457519, 0.258986837}, // 19077K {0.257456374, 0.25898529}, // 19078K {0.257455229, 0.258983742}, // 19079K {0.257454084, 0.258982195}, // 19080K {0.257452939, 0.258980648}, // 19081K {0.257451794, 0.258979102}, // 19082K {0.25745065, 0.258977555}, // 19083K {0.257449506, 0.258976009}, // 19084K {0.257448361, 0.258974462}, // 19085K {0.257447217, 0.258972916}, // 19086K {0.257446073, 0.258971371}, // 19087K {0.25744493, 0.258969825}, // 19088K {0.257443786, 0.25896828}, // 19089K {0.257442642, 0.258966734}, // 19090K {0.257441499, 0.258965189}, // 19091K {0.257440356, 0.258963644}, // 19092K {0.257439213, 0.2589621}, // 19093K {0.25743807, 0.258960555}, // 19094K {0.257436927, 0.258959011}, // 19095K {0.257435785, 0.258957467}, // 19096K {0.257434642, 0.258955923}, // 19097K {0.2574335, 0.258954379}, // 19098K {0.257432357, 0.258952835}, // 19099K {0.257431215, 0.258951292}, // 19100K {0.257430073, 0.258949748}, // 19101K {0.257428932, 0.258948205}, // 19102K {0.25742779, 0.258946662}, // 19103K {0.257426649, 0.25894512}, // 19104K {0.257425507, 0.258943577}, // 19105K {0.257424366, 0.258942035}, // 19106K {0.257423225, 0.258940493}, // 19107K {0.257422084, 0.258938951}, // 19108K {0.257420943, 0.258937409}, // 19109K {0.257419803, 0.258935867}, // 19110K {0.257418662, 0.258934326}, // 19111K {0.257417522, 0.258932785}, // 19112K {0.257416382, 0.258931244}, // 19113K {0.257415242, 0.258929703}, // 19114K {0.257414102, 0.258928162}, // 19115K {0.257412962, 0.258926622}, // 19116K {0.257411822, 0.258925081}, // 19117K {0.257410683, 0.258923541}, // 19118K {0.257409543, 0.258922001}, // 19119K {0.257408404, 0.258920461}, // 19120K {0.257407265, 0.258918922}, // 19121K {0.257406126, 0.258917382}, // 19122K {0.257404987, 0.258915843}, // 19123K {0.257403849, 0.258914304}, // 19124K {0.25740271, 0.258912765}, // 19125K {0.257401572, 0.258911227}, // 19126K {0.257400434, 0.258909688}, // 19127K {0.257399296, 0.25890815}, // 19128K {0.257398158, 0.258906612}, // 19129K {0.25739702, 0.258905074}, // 19130K {0.257395882, 0.258903536}, // 19131K {0.257394745, 0.258901998}, // 19132K {0.257393607, 0.258900461}, // 19133K {0.25739247, 0.258898924}, // 19134K {0.257391333, 0.258897387}, // 19135K {0.257390196, 0.25889585}, // 19136K {0.257389059, 0.258894313}, // 19137K {0.257387923, 0.258892776}, // 19138K {0.257386786, 0.25889124}, // 19139K {0.25738565, 0.258889704}, // 19140K {0.257384514, 0.258888168}, // 19141K {0.257383378, 0.258886632}, // 19142K {0.257382242, 0.258885097}, // 19143K {0.257381106, 0.258883561}, // 19144K {0.25737997, 0.258882026}, // 19145K {0.257378835, 0.258880491}, // 19146K {0.257377699, 0.258878956}, // 19147K {0.257376564, 0.258877421}, // 19148K {0.257375429, 0.258875887}, // 19149K {0.257374294, 0.258874353}, // 19150K {0.257373159, 0.258872818}, // 19151K {0.257372025, 0.258871284}, // 19152K {0.25737089, 0.258869751}, // 19153K {0.257369756, 0.258868217}, // 19154K {0.257368621, 0.258866684}, // 19155K {0.257367487, 0.25886515}, // 19156K {0.257366353, 0.258863617}, // 19157K {0.25736522, 0.258862085}, // 19158K {0.257364086, 0.258860552}, // 19159K {0.257362952, 0.258859019}, // 19160K {0.257361819, 0.258857487}, // 19161K {0.257360686, 0.258855955}, // 19162K {0.257359553, 0.258854423}, // 19163K {0.25735842, 0.258852891}, // 19164K {0.257357287, 0.258851359}, // 19165K {0.257356154, 0.258849828}, // 19166K {0.257355022, 0.258848297}, // 19167K {0.257353889, 0.258846766}, // 19168K {0.257352757, 0.258845235}, // 19169K {0.257351625, 0.258843704}, // 19170K {0.257350493, 0.258842174}, // 19171K {0.257349361, 0.258840643}, // 19172K {0.257348229, 0.258839113}, // 19173K {0.257347098, 0.258837583}, // 19174K {0.257345966, 0.258836053}, // 19175K {0.257344835, 0.258834524}, // 19176K {0.257343704, 0.258832994}, // 19177K {0.257342573, 0.258831465}, // 19178K {0.257341442, 0.258829936}, // 19179K {0.257340311, 0.258828407}, // 19180K {0.257339181, 0.258826878}, // 19181K {0.25733805, 0.25882535}, // 19182K {0.25733692, 0.258823821}, // 19183K {0.25733579, 0.258822293}, // 19184K {0.25733466, 0.258820765}, // 19185K {0.25733353, 0.258819237}, // 19186K {0.2573324, 0.25881771}, // 19187K {0.257331271, 0.258816182}, // 19188K {0.257330141, 0.258814655}, // 19189K {0.257329012, 0.258813128}, // 19190K {0.257327883, 0.258811601}, // 19191K {0.257326754, 0.258810074}, // 19192K {0.257325625, 0.258808548}, // 19193K {0.257324496, 0.258807021}, // 19194K {0.257323367, 0.258805495}, // 19195K {0.257322239, 0.258803969}, // 19196K {0.257321111, 0.258802443}, // 19197K {0.257319982, 0.258800918}, // 19198K {0.257318854, 0.258799392}, // 19199K {0.257317727, 0.258797867}, // 19200K {0.257316599, 0.258796342}, // 19201K {0.257315471, 0.258794817}, // 19202K {0.257314344, 0.258793292}, // 19203K {0.257313216, 0.258791768}, // 19204K {0.257312089, 0.258790243}, // 19205K {0.257310962, 0.258788719}, // 19206K {0.257309835, 0.258787195}, // 19207K {0.257308708, 0.258785671}, // 19208K {0.257307582, 0.258784147}, // 19209K {0.257306455, 0.258782624}, // 19210K {0.257305329, 0.258781101}, // 19211K {0.257304203, 0.258779577}, // 19212K {0.257303077, 0.258778055}, // 19213K {0.257301951, 0.258776532}, // 19214K {0.257300825, 0.258775009}, // 19215K {0.257299699, 0.258773487}, // 19216K {0.257298574, 0.258771965}, // 19217K {0.257297448, 0.258770442}, // 19218K {0.257296323, 0.258768921}, // 19219K {0.257295198, 0.258767399}, // 19220K {0.257294073, 0.258765877}, // 19221K {0.257292948, 0.258764356}, // 19222K {0.257291824, 0.258762835}, // 19223K {0.257290699, 0.258761314}, // 19224K {0.257289575, 0.258759793}, // 19225K {0.25728845, 0.258758272}, // 19226K {0.257287326, 0.258756752}, // 19227K {0.257286202, 0.258755232}, // 19228K {0.257285078, 0.258753712}, // 19229K {0.257283955, 0.258752192}, // 19230K {0.257282831, 0.258750672}, // 19231K {0.257281708, 0.258749152}, // 19232K {0.257280584, 0.258747633}, // 19233K {0.257279461, 0.258746114}, // 19234K {0.257278338, 0.258744595}, // 19235K {0.257277215, 0.258743076}, // 19236K {0.257276093, 0.258741557}, // 19237K {0.25727497, 0.258740039}, // 19238K {0.257273848, 0.258738521}, // 19239K {0.257272725, 0.258737002}, // 19240K {0.257271603, 0.258735485}, // 19241K {0.257270481, 0.258733967}, // 19242K {0.257269359, 0.258732449}, // 19243K {0.257268237, 0.258730932}, // 19244K {0.257267116, 0.258729415}, // 19245K {0.257265994, 0.258727897}, // 19246K {0.257264873, 0.258726381}, // 19247K {0.257263752, 0.258724864}, // 19248K {0.257262631, 0.258723347}, // 19249K {0.25726151, 0.258721831}, // 19250K {0.257260389, 0.258720315}, // 19251K {0.257259268, 0.258718799}, // 19252K {0.257258148, 0.258717283}, // 19253K {0.257257028, 0.258715767}, // 19254K {0.257255907, 0.258714252}, // 19255K {0.257254787, 0.258712737}, // 19256K {0.257253667, 0.258711222}, // 19257K {0.257252548, 0.258709707}, // 19258K {0.257251428, 0.258708192}, // 19259K {0.257250308, 0.258706677}, // 19260K {0.257249189, 0.258705163}, // 19261K {0.25724807, 0.258703649}, // 19262K {0.257246951, 0.258702135}, // 19263K {0.257245832, 0.258700621}, // 19264K {0.257244713, 0.258699107}, // 19265K {0.257243594, 0.258697594}, // 19266K {0.257242476, 0.258696081}, // 19267K {0.257241357, 0.258694567}, // 19268K {0.257240239, 0.258693055}, // 19269K {0.257239121, 0.258691542}, // 19270K {0.257238003, 0.258690029}, // 19271K {0.257236885, 0.258688517}, // 19272K {0.257235767, 0.258687004}, // 19273K {0.25723465, 0.258685492}, // 19274K {0.257233532, 0.258683981}, // 19275K {0.257232415, 0.258682469}, // 19276K {0.257231298, 0.258680957}, // 19277K {0.257230181, 0.258679446}, // 19278K {0.257229064, 0.258677935}, // 19279K {0.257227947, 0.258676424}, // 19280K {0.25722683, 0.258674913}, // 19281K {0.257225714, 0.258673402}, // 19282K {0.257224597, 0.258671892}, // 19283K {0.257223481, 0.258670382}, // 19284K {0.257222365, 0.258668871}, // 19285K {0.257221249, 0.258667361}, // 19286K {0.257220134, 0.258665852}, // 19287K {0.257219018, 0.258664342}, // 19288K {0.257217902, 0.258662833}, // 19289K {0.257216787, 0.258661324}, // 19290K {0.257215672, 0.258659814}, // 19291K {0.257214557, 0.258658306}, // 19292K {0.257213442, 0.258656797}, // 19293K {0.257212327, 0.258655288}, // 19294K {0.257211212, 0.25865378}, // 19295K {0.257210098, 0.258652272}, // 19296K {0.257208983, 0.258650764}, // 19297K {0.257207869, 0.258649256}, // 19298K {0.257206755, 0.258647748}, // 19299K {0.257205641, 0.258646241}, // 19300K {0.257204527, 0.258644734}, // 19301K {0.257203413, 0.258643227}, // 19302K {0.2572023, 0.25864172}, // 19303K {0.257201186, 0.258640213}, // 19304K {0.257200073, 0.258638706}, // 19305K {0.25719896, 0.2586372}, // 19306K {0.257197847, 0.258635694}, // 19307K {0.257196734, 0.258634188}, // 19308K {0.257195621, 0.258632682}, // 19309K {0.257194508, 0.258631176}, // 19310K {0.257193396, 0.258629671}, // 19311K {0.257192284, 0.258628165}, // 19312K {0.257191171, 0.25862666}, // 19313K {0.257190059, 0.258625155}, // 19314K {0.257188947, 0.25862365}, // 19315K {0.257187836, 0.258622146}, // 19316K {0.257186724, 0.258620641}, // 19317K {0.257185612, 0.258619137}, // 19318K {0.257184501, 0.258617633}, // 19319K {0.25718339, 0.258616129}, // 19320K {0.257182279, 0.258614625}, // 19321K {0.257181168, 0.258613122}, // 19322K {0.257180057, 0.258611618}, // 19323K {0.257178946, 0.258610115}, // 19324K {0.257177836, 0.258608612}, // 19325K {0.257176725, 0.258607109}, // 19326K {0.257175615, 0.258605606}, // 19327K {0.257174505, 0.258604104}, // 19328K {0.257173395, 0.258602602}, // 19329K {0.257172285, 0.258601099}, // 19330K {0.257171175, 0.258599597}, // 19331K {0.257170066, 0.258598096}, // 19332K {0.257168956, 0.258596594}, // 19333K {0.257167847, 0.258595092}, // 19334K {0.257166738, 0.258593591}, // 19335K {0.257165629, 0.25859209}, // 19336K {0.25716452, 0.258590589}, // 19337K {0.257163411, 0.258589088}, // 19338K {0.257162302, 0.258587588}, // 19339K {0.257161194, 0.258586087}, // 19340K {0.257160085, 0.258584587}, // 19341K {0.257158977, 0.258583087}, // 19342K {0.257157869, 0.258581587}, // 19343K {0.257156761, 0.258580088}, // 19344K {0.257155653, 0.258578588}, // 19345K {0.257154546, 0.258577089}, // 19346K {0.257153438, 0.258575589}, // 19347K {0.257152331, 0.25857409}, // 19348K {0.257151223, 0.258572592}, // 19349K {0.257150116, 0.258571093}, // 19350K {0.257149009, 0.258569595}, // 19351K {0.257147902, 0.258568096}, // 19352K {0.257146796, 0.258566598}, // 19353K {0.257145689, 0.2585651}, // 19354K {0.257144583, 0.258563602}, // 19355K {0.257143476, 0.258562105}, // 19356K {0.25714237, 0.258560607}, // 19357K {0.257141264, 0.25855911}, // 19358K {0.257140158, 0.258557613}, // 19359K {0.257139052, 0.258556116}, // 19360K {0.257137947, 0.258554619}, // 19361K {0.257136841, 0.258553123}, // 19362K {0.257135736, 0.258551626}, // 19363K {0.257134631, 0.25855013}, // 19364K {0.257133526, 0.258548634}, // 19365K {0.257132421, 0.258547138}, // 19366K {0.257131316, 0.258545643}, // 19367K {0.257130211, 0.258544147}, // 19368K {0.257129107, 0.258542652}, // 19369K {0.257128002, 0.258541157}, // 19370K {0.257126898, 0.258539662}, // 19371K {0.257125794, 0.258538167}, // 19372K {0.25712469, 0.258536672}, // 19373K {0.257123586, 0.258535178}, // 19374K {0.257122482, 0.258533684}, // 19375K {0.257121379, 0.25853219}, // 19376K {0.257120275, 0.258530696}, // 19377K {0.257119172, 0.258529202}, // 19378K {0.257118069, 0.258527708}, // 19379K {0.257116966, 0.258526215}, // 19380K {0.257115863, 0.258524722}, // 19381K {0.25711476, 0.258523229}, // 19382K {0.257113657, 0.258521736}, // 19383K {0.257112555, 0.258520243}, // 19384K {0.257111452, 0.25851875}, // 19385K {0.25711035, 0.258517258}, // 19386K {0.257109248, 0.258515766}, // 19387K {0.257108146, 0.258514274}, // 19388K {0.257107044, 0.258512782}, // 19389K {0.257105943, 0.25851129}, // 19390K {0.257104841, 0.258509799}, // 19391K {0.25710374, 0.258508308}, // 19392K {0.257102638, 0.258506816}, // 19393K {0.257101537, 0.258505325}, // 19394K {0.257100436, 0.258503835}, // 19395K {0.257099335, 0.258502344}, // 19396K {0.257098235, 0.258500854}, // 19397K {0.257097134, 0.258499363}, // 19398K {0.257096033, 0.258497873}, // 19399K {0.257094933, 0.258496383}, // 19400K {0.257093833, 0.258494894}, // 19401K {0.257092733, 0.258493404}, // 19402K {0.257091633, 0.258491915}, // 19403K {0.257090533, 0.258490425}, // 19404K {0.257089433, 0.258488936}, // 19405K {0.257088334, 0.258487447}, // 19406K {0.257087235, 0.258485959}, // 19407K {0.257086135, 0.25848447}, // 19408K {0.257085036, 0.258482982}, // 19409K {0.257083937, 0.258481494}, // 19410K {0.257082838, 0.258480006}, // 19411K {0.25708174, 0.258478518}, // 19412K {0.257080641, 0.25847703}, // 19413K {0.257079543, 0.258475543}, // 19414K {0.257078444, 0.258474055}, // 19415K {0.257077346, 0.258472568}, // 19416K {0.257076248, 0.258471081}, // 19417K {0.25707515, 0.258469594}, // 19418K {0.257074052, 0.258468108}, // 19419K {0.257072955, 0.258466621}, // 19420K {0.257071857, 0.258465135}, // 19421K {0.25707076, 0.258463649}, // 19422K {0.257069663, 0.258462163}, // 19423K {0.257068566, 0.258460677}, // 19424K {0.257067469, 0.258459192}, // 19425K {0.257066372, 0.258457706}, // 19426K {0.257065275, 0.258456221}, // 19427K {0.257064179, 0.258454736}, // 19428K {0.257063082, 0.258453251}, // 19429K {0.257061986, 0.258451766}, // 19430K {0.25706089, 0.258450282}, // 19431K {0.257059794, 0.258448798}, // 19432K {0.257058698, 0.258447313}, // 19433K {0.257057602, 0.258445829}, // 19434K {0.257056506, 0.258444345}, // 19435K {0.257055411, 0.258442862}, // 19436K {0.257054316, 0.258441378}, // 19437K {0.25705322, 0.258439895}, // 19438K {0.257052125, 0.258438412}, // 19439K {0.25705103, 0.258436929}, // 19440K {0.257049936, 0.258435446}, // 19441K {0.257048841, 0.258433963}, // 19442K {0.257047746, 0.258432481}, // 19443K {0.257046652, 0.258430999}, // 19444K {0.257045558, 0.258429516}, // 19445K {0.257044464, 0.258428034}, // 19446K {0.25704337, 0.258426553}, // 19447K {0.257042276, 0.258425071}, // 19448K {0.257041182, 0.25842359}, // 19449K {0.257040088, 0.258422108}, // 19450K {0.257038995, 0.258420627}, // 19451K {0.257037902, 0.258419146}, // 19452K {0.257036808, 0.258417666}, // 19453K {0.257035715, 0.258416185}, // 19454K {0.257034622, 0.258414705}, // 19455K {0.25703353, 0.258413224}, // 19456K {0.257032437, 0.258411744}, // 19457K {0.257031344, 0.258410264}, // 19458K {0.257030252, 0.258408785}, // 19459K {0.25702916, 0.258407305}, // 19460K {0.257028068, 0.258405826}, // 19461K {0.257026976, 0.258404347}, // 19462K {0.257025884, 0.258402868}, // 19463K {0.257024792, 0.258401389}, // 19464K {0.2570237, 0.25839991}, // 19465K {0.257022609, 0.258398432}, // 19466K {0.257021518, 0.258396953}, // 19467K {0.257020426, 0.258395475}, // 19468K {0.257019335, 0.258393997}, // 19469K {0.257018245, 0.258392519}, // 19470K {0.257017154, 0.258391042}, // 19471K {0.257016063, 0.258389564}, // 19472K {0.257014973, 0.258388087}, // 19473K {0.257013882, 0.25838661}, // 19474K {0.257012792, 0.258385133}, // 19475K {0.257011702, 0.258383656}, // 19476K {0.257010612, 0.258382179}, // 19477K {0.257009522, 0.258380703}, // 19478K {0.257008432, 0.258379227}, // 19479K {0.257007343, 0.25837775}, // 19480K {0.257006253, 0.258376275}, // 19481K {0.257005164, 0.258374799}, // 19482K {0.257004075, 0.258373323}, // 19483K {0.257002986, 0.258371848}, // 19484K {0.257001897, 0.258370373}, // 19485K {0.257000808, 0.258368897}, // 19486K {0.256999719, 0.258367423}, // 19487K {0.256998631, 0.258365948}, // 19488K {0.256997542, 0.258364473}, // 19489K {0.256996454, 0.258362999}, // 19490K {0.256995366, 0.258361525}, // 19491K {0.256994278, 0.258360051}, // 19492K {0.25699319, 0.258358577}, // 19493K {0.256992102, 0.258357103}, // 19494K {0.256991015, 0.25835563}, // 19495K {0.256989927, 0.258354156}, // 19496K {0.25698884, 0.258352683}, // 19497K {0.256987753, 0.25835121}, // 19498K {0.256986666, 0.258349737}, // 19499K {0.256985579, 0.258348264}, // 19500K {0.256984492, 0.258346792}, // 19501K {0.256983406, 0.25834532}, // 19502K {0.256982319, 0.258343847}, // 19503K {0.256981233, 0.258342375}, // 19504K {0.256980146, 0.258340904}, // 19505K {0.25697906, 0.258339432}, // 19506K {0.256977974, 0.25833796}, // 19507K {0.256976888, 0.258336489}, // 19508K {0.256975803, 0.258335018}, // 19509K {0.256974717, 0.258333547}, // 19510K {0.256973632, 0.258332076}, // 19511K {0.256972546, 0.258330606}, // 19512K {0.256971461, 0.258329135}, // 19513K {0.256970376, 0.258327665}, // 19514K {0.256969291, 0.258326195}, // 19515K {0.256968206, 0.258324725}, // 19516K {0.256967122, 0.258323255}, // 19517K {0.256966037, 0.258321785}, // 19518K {0.256964953, 0.258320316}, // 19519K {0.256963868, 0.258318847}, // 19520K {0.256962784, 0.258317378}, // 19521K {0.2569617, 0.258315909}, // 19522K {0.256960616, 0.25831444}, // 19523K {0.256959533, 0.258312971}, // 19524K {0.256958449, 0.258311503}, // 19525K {0.256957366, 0.258310035}, // 19526K {0.256956282, 0.258308567}, // 19527K {0.256955199, 0.258307099}, // 19528K {0.256954116, 0.258305631}, // 19529K {0.256953033, 0.258304163}, // 19530K {0.25695195, 0.258302696}, // 19531K {0.256950868, 0.258301229}, // 19532K {0.256949785, 0.258299762}, // 19533K {0.256948703, 0.258298295}, // 19534K {0.25694762, 0.258296828}, // 19535K {0.256946538, 0.258295362}, // 19536K {0.256945456, 0.258293895}, // 19537K {0.256944374, 0.258292429}, // 19538K {0.256943293, 0.258290963}, // 19539K {0.256942211, 0.258289497}, // 19540K {0.256941129, 0.258288031}, // 19541K {0.256940048, 0.258286566}, // 19542K {0.256938967, 0.258285101}, // 19543K {0.256937886, 0.258283635}, // 19544K {0.256936805, 0.25828217}, // 19545K {0.256935724, 0.258280706}, // 19546K {0.256934643, 0.258279241}, // 19547K {0.256933563, 0.258277776}, // 19548K {0.256932482, 0.258276312}, // 19549K {0.256931402, 0.258274848}, // 19550K {0.256930322, 0.258273384}, // 19551K {0.256929242, 0.25827192}, // 19552K {0.256928162, 0.258270456}, // 19553K {0.256927082, 0.258268993}, // 19554K {0.256926002, 0.25826753}, // 19555K {0.256924923, 0.258266066}, // 19556K {0.256923844, 0.258264603}, // 19557K {0.256922764, 0.258263141}, // 19558K {0.256921685, 0.258261678}, // 19559K {0.256920606, 0.258260215}, // 19560K {0.256919527, 0.258258753}, // 19561K {0.256918449, 0.258257291}, // 19562K {0.25691737, 0.258255829}, // 19563K {0.256916292, 0.258254367}, // 19564K {0.256915213, 0.258252906}, // 19565K {0.256914135, 0.258251444}, // 19566K {0.256913057, 0.258249983}, // 19567K {0.256911979, 0.258248522}, // 19568K {0.256910901, 0.258247061}, // 19569K {0.256909824, 0.2582456}, // 19570K {0.256908746, 0.258244139}, // 19571K {0.256907669, 0.258242679}, // 19572K {0.256906591, 0.258241219}, // 19573K {0.256905514, 0.258239759}, // 19574K {0.256904437, 0.258238299}, // 19575K {0.25690336, 0.258236839}, // 19576K {0.256902284, 0.258235379}, // 19577K {0.256901207, 0.25823392}, // 19578K {0.25690013, 0.258232461}, // 19579K {0.256899054, 0.258231002}, // 19580K {0.256897978, 0.258229543}, // 19581K {0.256896902, 0.258228084}, // 19582K {0.256895826, 0.258226625}, // 19583K {0.25689475, 0.258225167}, // 19584K {0.256893674, 0.258223709}, // 19585K {0.256892599, 0.258222251}, // 19586K {0.256891523, 0.258220793}, // 19587K {0.256890448, 0.258219335}, // 19588K {0.256889373, 0.258217877}, // 19589K {0.256888298, 0.25821642}, // 19590K {0.256887223, 0.258214963}, // 19591K {0.256886148, 0.258213506}, // 19592K {0.256885073, 0.258212049}, // 19593K {0.256883999, 0.258210592}, // 19594K {0.256882924, 0.258209135}, // 19595K {0.25688185, 0.258207679}, // 19596K {0.256880776, 0.258206223}, // 19597K {0.256879702, 0.258204767}, // 19598K {0.256878628, 0.258203311}, // 19599K {0.256877554, 0.258201855}, // 19600K {0.256876481, 0.2582004}, // 19601K {0.256875407, 0.258198944}, // 19602K {0.256874334, 0.258197489}, // 19603K {0.256873261, 0.258196034}, // 19604K {0.256872188, 0.258194579}, // 19605K {0.256871115, 0.258193124}, // 19606K {0.256870042, 0.25819167}, // 19607K {0.256868969, 0.258190215}, // 19608K {0.256867897, 0.258188761}, // 19609K {0.256866824, 0.258187307}, // 19610K {0.256865752, 0.258185853}, // 19611K {0.25686468, 0.258184399}, // 19612K {0.256863608, 0.258182946}, // 19613K {0.256862536, 0.258181493}, // 19614K {0.256861464, 0.258180039}, // 19615K {0.256860392, 0.258178586}, // 19616K {0.256859321, 0.258177133}, // 19617K {0.256858249, 0.258175681}, // 19618K {0.256857178, 0.258174228}, // 19619K {0.256856107, 0.258172776}, // 19620K {0.256855036, 0.258171324}, // 19621K {0.256853965, 0.258169872}, // 19622K {0.256852894, 0.25816842}, // 19623K {0.256851824, 0.258166968}, // 19624K {0.256850753, 0.258165517}, // 19625K {0.256849683, 0.258164065}, // 19626K {0.256848613, 0.258162614}, // 19627K {0.256847543, 0.258161163}, // 19628K {0.256846473, 0.258159712}, // 19629K {0.256845403, 0.258158261}, // 19630K {0.256844333, 0.258156811}, // 19631K {0.256843263, 0.258155361}, // 19632K {0.256842194, 0.25815391}, // 19633K {0.256841125, 0.25815246}, // 19634K {0.256840056, 0.25815101}, // 19635K {0.256838986, 0.258149561}, // 19636K {0.256837918, 0.258148111}, // 19637K {0.256836849, 0.258146662}, // 19638K {0.25683578, 0.258145213}, // 19639K {0.256834712, 0.258143764}, // 19640K {0.256833643, 0.258142315}, // 19641K {0.256832575, 0.258140866}, // 19642K {0.256831507, 0.258139418}, // 19643K {0.256830439, 0.258137969}, // 19644K {0.256829371, 0.258136521}, // 19645K {0.256828303, 0.258135073}, // 19646K {0.256827235, 0.258133625}, // 19647K {0.256826168, 0.258132177}, // 19648K {0.256825101, 0.25813073}, // 19649K {0.256824033, 0.258129283}, // 19650K {0.256822966, 0.258127835}, // 19651K {0.256821899, 0.258126388}, // 19652K {0.256820832, 0.258124942}, // 19653K {0.256819766, 0.258123495}, // 19654K {0.256818699, 0.258122048}, // 19655K {0.256817633, 0.258120602}, // 19656K {0.256816566, 0.258119156}, // 19657K {0.2568155, 0.25811771}, // 19658K {0.256814434, 0.258116264}, // 19659K {0.256813368, 0.258114818}, // 19660K {0.256812302, 0.258113373}, // 19661K {0.256811237, 0.258111927}, // 19662K {0.256810171, 0.258110482}, // 19663K {0.256809106, 0.258109037}, // 19664K {0.25680804, 0.258107592}, // 19665K {0.256806975, 0.258106148}, // 19666K {0.25680591, 0.258104703}, // 19667K {0.256804845, 0.258103259}, // 19668K {0.25680378, 0.258101815}, // 19669K {0.256802716, 0.258100371}, // 19670K {0.256801651, 0.258098927}, // 19671K {0.256800587, 0.258097483}, // 19672K {0.256799523, 0.258096039}, // 19673K {0.256798458, 0.258094596}, // 19674K {0.256797394, 0.258093153}, // 19675K {0.25679633, 0.25809171}, // 19676K {0.256795267, 0.258090267}, // 19677K {0.256794203, 0.258088824}, // 19678K {0.25679314, 0.258087382}, // 19679K {0.256792076, 0.258085939}, // 19680K {0.256791013, 0.258084497}, // 19681K {0.25678995, 0.258083055}, // 19682K {0.256788887, 0.258081613}, // 19683K {0.256787824, 0.258080172}, // 19684K {0.256786761, 0.25807873}, // 19685K {0.256785699, 0.258077289}, // 19686K {0.256784636, 0.258075848}, // 19687K {0.256783574, 0.258074406}, // 19688K {0.256782512, 0.258072966}, // 19689K {0.25678145, 0.258071525}, // 19690K {0.256780388, 0.258070084}, // 19691K {0.256779326, 0.258068644}, // 19692K {0.256778264, 0.258067204}, // 19693K {0.256777203, 0.258065764}, // 19694K {0.256776141, 0.258064324}, // 19695K {0.25677508, 0.258062884}, // 19696K {0.256774019, 0.258061445}, // 19697K {0.256772958, 0.258060005}, // 19698K {0.256771897, 0.258058566}, // 19699K {0.256770836, 0.258057127}, // 19700K {0.256769775, 0.258055688}, // 19701K {0.256768715, 0.258054249}, // 19702K {0.256767654, 0.258052811}, // 19703K {0.256766594, 0.258051372}, // 19704K {0.256765534, 0.258049934}, // 19705K {0.256764474, 0.258048496}, // 19706K {0.256763414, 0.258047058}, // 19707K {0.256762354, 0.258045621}, // 19708K {0.256761295, 0.258044183}, // 19709K {0.256760235, 0.258042746}, // 19710K {0.256759176, 0.258041308}, // 19711K {0.256758116, 0.258039871}, // 19712K {0.256757057, 0.258038434}, // 19713K {0.256755998, 0.258036998}, // 19714K {0.256754939, 0.258035561}, // 19715K {0.256753881, 0.258034125}, // 19716K {0.256752822, 0.258032688}, // 19717K {0.256751764, 0.258031252}, // 19718K {0.256750705, 0.258029816}, // 19719K {0.256749647, 0.258028381}, // 19720K {0.256748589, 0.258026945}, // 19721K {0.256747531, 0.25802551}, // 19722K {0.256746473, 0.258024074}, // 19723K {0.256745415, 0.258022639}, // 19724K {0.256744358, 0.258021204}, // 19725K {0.2567433, 0.25801977}, // 19726K {0.256742243, 0.258018335}, // 19727K {0.256741186, 0.258016901}, // 19728K {0.256740129, 0.258015466}, // 19729K {0.256739072, 0.258014032}, // 19730K {0.256738015, 0.258012598}, // 19731K {0.256736958, 0.258011164}, // 19732K {0.256735902, 0.258009731}, // 19733K {0.256734845, 0.258008297}, // 19734K {0.256733789, 0.258006864}, // 19735K {0.256732733, 0.258005431}, // 19736K {0.256731677, 0.258003998}, // 19737K {0.256730621, 0.258002565}, // 19738K {0.256729565, 0.258001133}, // 19739K {0.256728509, 0.2579997}, // 19740K {0.256727454, 0.257998268}, // 19741K {0.256726398, 0.257996836}, // 19742K {0.256725343, 0.257995404}, // 19743K {0.256724288, 0.257993972}, // 19744K {0.256723233, 0.25799254}, // 19745K {0.256722178, 0.257991109}, // 19746K {0.256721123, 0.257989678}, // 19747K {0.256720068, 0.257988246}, // 19748K {0.256719014, 0.257986815}, // 19749K {0.256717959, 0.257985385}, // 19750K {0.256716905, 0.257983954}, // 19751K {0.256715851, 0.257982523}, // 19752K {0.256714797, 0.257981093}, // 19753K {0.256713743, 0.257979663}, // 19754K {0.256712689, 0.257978233}, // 19755K {0.256711636, 0.257976803}, // 19756K {0.256710582, 0.257975374}, // 19757K {0.256709529, 0.257973944}, // 19758K {0.256708475, 0.257972515}, // 19759K {0.256707422, 0.257971085}, // 19760K {0.256706369, 0.257969656}, // 19761K {0.256705316, 0.257968228}, // 19762K {0.256704264, 0.257966799}, // 19763K {0.256703211, 0.25796537}, // 19764K {0.256702159, 0.257963942}, // 19765K {0.256701106, 0.257962514}, // 19766K {0.256700054, 0.257961086}, // 19767K {0.256699002, 0.257959658}, // 19768K {0.25669795, 0.25795823}, // 19769K {0.256696898, 0.257956803}, // 19770K {0.256695846, 0.257955375}, // 19771K {0.256694795, 0.257953948}, // 19772K {0.256693743, 0.257952521}, // 19773K {0.256692692, 0.257951094}, // 19774K {0.256691641, 0.257949667}, // 19775K {0.256690589, 0.257948241}, // 19776K {0.256689538, 0.257946814}, // 19777K {0.256688488, 0.257945388}, // 19778K {0.256687437, 0.257943962}, // 19779K {0.256686386, 0.257942536}, // 19780K {0.256685336, 0.25794111}, // 19781K {0.256684285, 0.257939685}, // 19782K {0.256683235, 0.257938259}, // 19783K {0.256682185, 0.257936834}, // 19784K {0.256681135, 0.257935409}, // 19785K {0.256680085, 0.257933984}, // 19786K {0.256679036, 0.257932559}, // 19787K {0.256677986, 0.257931135}, // 19788K {0.256676937, 0.25792971}, // 19789K {0.256675887, 0.257928286}, // 19790K {0.256674838, 0.257926862}, // 19791K {0.256673789, 0.257925438}, // 19792K {0.25667274, 0.257924014}, // 19793K {0.256671691, 0.257922591}, // 19794K {0.256670642, 0.257921167}, // 19795K {0.256669594, 0.257919744}, // 19796K {0.256668545, 0.257918321}, // 19797K {0.256667497, 0.257916898}, // 19798K {0.256666449, 0.257915475}, // 19799K {0.256665401, 0.257914052}, // 19800K {0.256664353, 0.25791263}, // 19801K {0.256663305, 0.257911207}, // 19802K {0.256662257, 0.257909785}, // 19803K {0.25666121, 0.257908363}, // 19804K {0.256660162, 0.257906941}, // 19805K {0.256659115, 0.25790552}, // 19806K {0.256658068, 0.257904098}, // 19807K {0.256657021, 0.257902677}, // 19808K {0.256655974, 0.257901256}, // 19809K {0.256654927, 0.257899835}, // 19810K {0.25665388, 0.257898414}, // 19811K {0.256652834, 0.257896993}, // 19812K {0.256651787, 0.257895573}, // 19813K {0.256650741, 0.257894152}, // 19814K {0.256649695, 0.257892732}, // 19815K {0.256648649, 0.257891312}, // 19816K {0.256647603, 0.257889892}, // 19817K {0.256646557, 0.257888472}, // 19818K {0.256645511, 0.257887053}, // 19819K {0.256644466, 0.257885633}, // 19820K {0.25664342, 0.257884214}, // 19821K {0.256642375, 0.257882795}, // 19822K {0.25664133, 0.257881376}, // 19823K {0.256640285, 0.257879957}, // 19824K {0.25663924, 0.257878539}, // 19825K {0.256638195, 0.25787712}, // 19826K {0.25663715, 0.257875702}, // 19827K {0.256636106, 0.257874284}, // 19828K {0.256635061, 0.257872866}, // 19829K {0.256634017, 0.257871448}, // 19830K {0.256632973, 0.257870031}, // 19831K {0.256631929, 0.257868613}, // 19832K {0.256630885, 0.257867196}, // 19833K {0.256629841, 0.257865779}, // 19834K {0.256628798, 0.257864362}, // 19835K {0.256627754, 0.257862945}, // 19836K {0.256626711, 0.257861528}, // 19837K {0.256625667, 0.257860112}, // 19838K {0.256624624, 0.257858695}, // 19839K {0.256623581, 0.257857279}, // 19840K {0.256622538, 0.257855863}, // 19841K {0.256621495, 0.257854447}, // 19842K {0.256620453, 0.257853032}, // 19843K {0.25661941, 0.257851616}, // 19844K {0.256618368, 0.257850201}, // 19845K {0.256617325, 0.257848786}, // 19846K {0.256616283, 0.257847371}, // 19847K {0.256615241, 0.257845956}, // 19848K {0.256614199, 0.257844541}, // 19849K {0.256613158, 0.257843126}, // 19850K {0.256612116, 0.257841712}, // 19851K {0.256611074, 0.257840298}, // 19852K {0.256610033, 0.257838884}, // 19853K {0.256608992, 0.25783747}, // 19854K {0.25660795, 0.257836056}, // 19855K {0.256606909, 0.257834642}, // 19856K {0.256605868, 0.257833229}, // 19857K {0.256604828, 0.257831816}, // 19858K {0.256603787, 0.257830403}, // 19859K {0.256602746, 0.25782899}, // 19860K {0.256601706, 0.257827577}, // 19861K {0.256600666, 0.257826164}, // 19862K {0.256599626, 0.257824752}, // 19863K {0.256598586, 0.25782334}, // 19864K {0.256597546, 0.257821927}, // 19865K {0.256596506, 0.257820515}, // 19866K {0.256595466, 0.257819104}, // 19867K {0.256594427, 0.257817692}, // 19868K {0.256593387, 0.25781628}, // 19869K {0.256592348, 0.257814869}, // 19870K {0.256591309, 0.257813458}, // 19871K {0.25659027, 0.257812047}, // 19872K {0.256589231, 0.257810636}, // 19873K {0.256588192, 0.257809225}, // 19874K {0.256587153, 0.257807815}, // 19875K {0.256586115, 0.257806404}, // 19876K {0.256585076, 0.257804994}, // 19877K {0.256584038, 0.257803584}, // 19878K {0.256583, 0.257802174}, // 19879K {0.256581962, 0.257800765}, // 19880K {0.256580924, 0.257799355}, // 19881K {0.256579886, 0.257797946}, // 19882K {0.256578848, 0.257796536}, // 19883K {0.256577811, 0.257795127}, // 19884K {0.256576773, 0.257793718}, // 19885K {0.256575736, 0.25779231}, // 19886K {0.256574699, 0.257790901}, // 19887K {0.256573662, 0.257789493}, // 19888K {0.256572625, 0.257788084}, // 19889K {0.256571588, 0.257786676}, // 19890K {0.256570551, 0.257785268}, // 19891K {0.256569515, 0.25778386}, // 19892K {0.256568478, 0.257782453}, // 19893K {0.256567442, 0.257781045}, // 19894K {0.256566406, 0.257779638}, // 19895K {0.25656537, 0.257778231}, // 19896K {0.256564334, 0.257776824}, // 19897K {0.256563298, 0.257775417}, // 19898K {0.256562262, 0.25777401}, // 19899K {0.256561227, 0.257772604}, // 19900K {0.256560191, 0.257771197}, // 19901K {0.256559156, 0.257769791}, // 19902K {0.256558121, 0.257768385}, // 19903K {0.256557086, 0.257766979}, // 19904K {0.256556051, 0.257765573}, // 19905K {0.256555016, 0.257764168}, // 19906K {0.256553981, 0.257762763}, // 19907K {0.256552947, 0.257761357}, // 19908K {0.256551912, 0.257759952}, // 19909K {0.256550878, 0.257758547}, // 19910K {0.256549844, 0.257757142}, // 19911K {0.256548809, 0.257755738}, // 19912K {0.256547776, 0.257754333}, // 19913K {0.256546742, 0.257752929}, // 19914K {0.256545708, 0.257751525}, // 19915K {0.256544674, 0.257750121}, // 19916K {0.256543641, 0.257748717}, // 19917K {0.256542608, 0.257747314}, // 19918K {0.256541574, 0.25774591}, // 19919K {0.256540541, 0.257744507}, // 19920K {0.256539508, 0.257743104}, // 19921K {0.256538475, 0.257741701}, // 19922K {0.256537443, 0.257740298}, // 19923K {0.25653641, 0.257738895}, // 19924K {0.256535378, 0.257737493}, // 19925K {0.256534345, 0.25773609}, // 19926K {0.256533313, 0.257734688}, // 19927K {0.256532281, 0.257733286}, // 19928K {0.256531249, 0.257731884}, // 19929K {0.256530217, 0.257730482}, // 19930K {0.256529185, 0.257729081}, // 19931K {0.256528154, 0.257727679}, // 19932K {0.256527122, 0.257726278}, // 19933K {0.256526091, 0.257724877}, // 19934K {0.25652506, 0.257723476}, // 19935K {0.256524028, 0.257722075}, // 19936K {0.256522997, 0.257720675}, // 19937K {0.256521967, 0.257719274}, // 19938K {0.256520936, 0.257717874}, // 19939K {0.256519905, 0.257716474}, // 19940K {0.256518875, 0.257715074}, // 19941K {0.256517844, 0.257713674}, // 19942K {0.256516814, 0.257712274}, // 19943K {0.256515784, 0.257710875}, // 19944K {0.256514754, 0.257709475}, // 19945K {0.256513724, 0.257708076}, // 19946K {0.256512694, 0.257706677}, // 19947K {0.256511665, 0.257705278}, // 19948K {0.256510635, 0.257703879}, // 19949K {0.256509606, 0.257702481}, // 19950K {0.256508576, 0.257701082}, // 19951K {0.256507547, 0.257699684}, // 19952K {0.256506518, 0.257698286}, // 19953K {0.256505489, 0.257696888}, // 19954K {0.25650446, 0.25769549}, // 19955K {0.256503432, 0.257694093}, // 19956K {0.256502403, 0.257692695}, // 19957K {0.256501375, 0.257691298}, // 19958K {0.256500347, 0.257689901}, // 19959K {0.256499318, 0.257688504}, // 19960K {0.25649829, 0.257687107}, // 19961K {0.256497262, 0.257685711}, // 19962K {0.256496235, 0.257684314}, // 19963K {0.256495207, 0.257682918}, // 19964K {0.256494179, 0.257681522}, // 19965K {0.256493152, 0.257680126}, // 19966K {0.256492125, 0.25767873}, // 19967K {0.256491097, 0.257677334}, // 19968K {0.25649007, 0.257675938}, // 19969K {0.256489043, 0.257674543}, // 19970K {0.256488016, 0.257673148}, // 19971K {0.25648699, 0.257671753}, // 19972K {0.256485963, 0.257670358}, // 19973K {0.256484937, 0.257668963}, // 19974K {0.25648391, 0.257667568}, // 19975K {0.256482884, 0.257666174}, // 19976K {0.256481858, 0.25766478}, // 19977K {0.256480832, 0.257663386}, // 19978K {0.256479806, 0.257661992}, // 19979K {0.256478781, 0.257660598}, // 19980K {0.256477755, 0.257659204}, // 19981K {0.256476729, 0.257657811}, // 19982K {0.256475704, 0.257656417}, // 19983K {0.256474679, 0.257655024}, // 19984K {0.256473654, 0.257653631}, // 19985K {0.256472629, 0.257652238}, // 19986K {0.256471604, 0.257650846}, // 19987K {0.256470579, 0.257649453}, // 19988K {0.256469554, 0.257648061}, // 19989K {0.25646853, 0.257646668}, // 19990K {0.256467506, 0.257645276}, // 19991K {0.256466481, 0.257643884}, // 19992K {0.256465457, 0.257642493}, // 19993K {0.256464433, 0.257641101}, // 19994K {0.256463409, 0.25763971}, // 19995K {0.256462386, 0.257638318}, // 19996K {0.256461362, 0.257636927}, // 19997K {0.256460338, 0.257635536}, // 19998K {0.256459315, 0.257634145}, // 19999K {0.256458292, 0.257632755}, // 20000K {0.256457268, 0.257631364}, // 20001K {0.256456245, 0.257629974}, // 20002K {0.256455223, 0.257628584}, // 20003K {0.2564542, 0.257627194}, // 20004K {0.256453177, 0.257625804}, // 20005K {0.256452154, 0.257624414}, // 20006K {0.256451132, 0.257623024}, // 20007K {0.25645011, 0.257621635}, // 20008K {0.256449088, 0.257620246}, // 20009K {0.256448065, 0.257618857}, // 20010K {0.256447044, 0.257617468}, // 20011K {0.256446022, 0.257616079}, // 20012K {0.256445, 0.25761469}, // 20013K {0.256443978, 0.257613302}, // 20014K {0.256442957, 0.257611914}, // 20015K {0.256441936, 0.257610526}, // 20016K {0.256440914, 0.257609138}, // 20017K {0.256439893, 0.25760775}, // 20018K {0.256438872, 0.257606362}, // 20019K {0.256437851, 0.257604975}, // 20020K {0.256436831, 0.257603587}, // 20021K {0.25643581, 0.2576022}, // 20022K {0.25643479, 0.257600813}, // 20023K {0.256433769, 0.257599426}, // 20024K {0.256432749, 0.257598039}, // 20025K {0.256431729, 0.257596653}, // 20026K {0.256430709, 0.257595266}, // 20027K {0.256429689, 0.25759388}, // 20028K {0.256428669, 0.257592494}, // 20029K {0.25642765, 0.257591108}, // 20030K {0.25642663, 0.257589722}, // 20031K {0.256425611, 0.257588337}, // 20032K {0.256424591, 0.257586951}, // 20033K {0.256423572, 0.257585566}, // 20034K {0.256422553, 0.257584181}, // 20035K {0.256421534, 0.257582796}, // 20036K {0.256420515, 0.257581411}, // 20037K {0.256419497, 0.257580026}, // 20038K {0.256418478, 0.257578641}, // 20039K {0.25641746, 0.257577257}, // 20040K {0.256416441, 0.257575873}, // 20041K {0.256415423, 0.257574489}, // 20042K {0.256414405, 0.257573105}, // 20043K {0.256413387, 0.257571721}, // 20044K {0.256412369, 0.257570338}, // 20045K {0.256411352, 0.257568954}, // 20046K {0.256410334, 0.257567571}, // 20047K {0.256409317, 0.257566188}, // 20048K {0.256408299, 0.257564805}, // 20049K {0.256407282, 0.257563422}, // 20050K {0.256406265, 0.257562039}, // 20051K {0.256405248, 0.257560657}, // 20052K {0.256404231, 0.257559274}, // 20053K {0.256403214, 0.257557892}, // 20054K {0.256402198, 0.25755651}, // 20055K {0.256401181, 0.257555128}, // 20056K {0.256400165, 0.257553746}, // 20057K {0.256399149, 0.257552365}, // 20058K {0.256398132, 0.257550983}, // 20059K {0.256397116, 0.257549602}, // 20060K {0.256396101, 0.257548221}, // 20061K {0.256395085, 0.25754684}, // 20062K {0.256394069, 0.257545459}, // 20063K {0.256393054, 0.257544079}, // 20064K {0.256392038, 0.257542698}, // 20065K {0.256391023, 0.257541318}, // 20066K {0.256390008, 0.257539938}, // 20067K {0.256388993, 0.257538558}, // 20068K {0.256387978, 0.257537178}, // 20069K {0.256386963, 0.257535798}, // 20070K {0.256385948, 0.257534419}, // 20071K {0.256384934, 0.257533039}, // 20072K {0.256383919, 0.25753166}, // 20073K {0.256382905, 0.257530281}, // 20074K {0.256381891, 0.257528902}, // 20075K {0.256380877, 0.257527523}, // 20076K {0.256379863, 0.257526145}, // 20077K {0.256378849, 0.257524766}, // 20078K {0.256377835, 0.257523388}, // 20079K {0.256376821, 0.25752201}, // 20080K {0.256375808, 0.257520632}, // 20081K {0.256374795, 0.257519254}, // 20082K {0.256373781, 0.257517876}, // 20083K {0.256372768, 0.257516499}, // 20084K {0.256371755, 0.257515121}, // 20085K {0.256370742, 0.257513744}, // 20086K {0.256369729, 0.257512367}, // 20087K {0.256368717, 0.25751099}, // 20088K {0.256367704, 0.257509613}, // 20089K {0.256366692, 0.257508237}, // 20090K {0.25636568, 0.25750686}, // 20091K {0.256364667, 0.257505484}, // 20092K {0.256363655, 0.257504108}, // 20093K {0.256362643, 0.257502732}, // 20094K {0.256361632, 0.257501356}, // 20095K {0.25636062, 0.25749998}, // 20096K {0.256359608, 0.257498605}, // 20097K {0.256358597, 0.257497229}, // 20098K {0.256357586, 0.257495854}, // 20099K {0.256356574, 0.257494479}, // 20100K {0.256355563, 0.257493104}, // 20101K {0.256354552, 0.257491729}, // 20102K {0.256353541, 0.257490355}, // 20103K {0.256352531, 0.25748898}, // 20104K {0.25635152, 0.257487606}, // 20105K {0.25635051, 0.257486232}, // 20106K {0.256349499, 0.257484858}, // 20107K {0.256348489, 0.257483484}, // 20108K {0.256347479, 0.257482111}, // 20109K {0.256346469, 0.257480737}, // 20110K {0.256345459, 0.257479364}, // 20111K {0.256344449, 0.257477991}, // 20112K {0.256343439, 0.257476618}, // 20113K {0.25634243, 0.257475245}, // 20114K {0.25634142, 0.257473872}, // 20115K {0.256340411, 0.257472499}, // 20116K {0.256339402, 0.257471127}, // 20117K {0.256338393, 0.257469755}, // 20118K {0.256337384, 0.257468383}, // 20119K {0.256336375, 0.257467011}, // 20120K {0.256335366, 0.257465639}, // 20121K {0.256334358, 0.257464267}, // 20122K {0.256333349, 0.257462896}, // 20123K {0.256332341, 0.257461524}, // 20124K {0.256331333, 0.257460153}, // 20125K {0.256330325, 0.257458782}, // 20126K {0.256329317, 0.257457411}, // 20127K {0.256328309, 0.25745604}, // 20128K {0.256327301, 0.25745467}, // 20129K {0.256326293, 0.257453299}, // 20130K {0.256325286, 0.257451929}, // 20131K {0.256324279, 0.257450559}, // 20132K {0.256323271, 0.257449189}, // 20133K {0.256322264, 0.257447819}, // 20134K {0.256321257, 0.25744645}, // 20135K {0.25632025, 0.25744508}, // 20136K {0.256319243, 0.257443711}, // 20137K {0.256318237, 0.257442342}, // 20138K {0.25631723, 0.257440973}, // 20139K {0.256316224, 0.257439604}, // 20140K {0.256315217, 0.257438235}, // 20141K {0.256314211, 0.257436866}, // 20142K {0.256313205, 0.257435498}, // 20143K {0.256312199, 0.25743413}, // 20144K {0.256311193, 0.257432762}, // 20145K {0.256310188, 0.257431394}, // 20146K {0.256309182, 0.257430026}, // 20147K {0.256308176, 0.257428658}, // 20148K {0.256307171, 0.257427291}, // 20149K {0.256306166, 0.257425923}, // 20150K {0.256305161, 0.257424556}, // 20151K {0.256304156, 0.257423189}, // 20152K {0.256303151, 0.257421822}, // 20153K {0.256302146, 0.257420456}, // 20154K {0.256301141, 0.257419089}, // 20155K {0.256300137, 0.257417723}, // 20156K {0.256299132, 0.257416356}, // 20157K {0.256298128, 0.25741499}, // 20158K {0.256297124, 0.257413624}, // 20159K {0.25629612, 0.257412258}, // 20160K {0.256295116, 0.257410893}, // 20161K {0.256294112, 0.257409527}, // 20162K {0.256293108, 0.257408162}, // 20163K {0.256292105, 0.257406797}, // 20164K {0.256291101, 0.257405432}, // 20165K {0.256290098, 0.257404067}, // 20166K {0.256289095, 0.257402702}, // 20167K {0.256288091, 0.257401337}, // 20168K {0.256287088, 0.257399973}, // 20169K {0.256286086, 0.257398609}, // 20170K {0.256285083, 0.257397245}, // 20171K {0.25628408, 0.257395881}, // 20172K {0.256283078, 0.257394517}, // 20173K {0.256282075, 0.257393153}, // 20174K {0.256281073, 0.25739179}, // 20175K {0.256280071, 0.257390426}, // 20176K {0.256279069, 0.257389063}, // 20177K {0.256278067, 0.2573877}, // 20178K {0.256277065, 0.257386337}, // 20179K {0.256276063, 0.257384974}, // 20180K {0.256275062, 0.257383612}, // 20181K {0.25627406, 0.257382249}, // 20182K {0.256273059, 0.257380887}, // 20183K {0.256272058, 0.257379525}, // 20184K {0.256271056, 0.257378163}, // 20185K {0.256270055, 0.257376801}, // 20186K {0.256269055, 0.257375439}, // 20187K {0.256268054, 0.257374078}, // 20188K {0.256267053, 0.257372717}, // 20189K {0.256266053, 0.257371355}, // 20190K {0.256265052, 0.257369994}, // 20191K {0.256264052, 0.257368633}, // 20192K {0.256263052, 0.257367273}, // 20193K {0.256262052, 0.257365912}, // 20194K {0.256261052, 0.257364551}, // 20195K {0.256260052, 0.257363191}, // 20196K {0.256259052, 0.257361831}, // 20197K {0.256258053, 0.257360471}, // 20198K {0.256257053, 0.257359111}, // 20199K {0.256256054, 0.257357751}, // 20200K {0.256255055, 0.257356392}, // 20201K {0.256254056, 0.257355033}, // 20202K {0.256253057, 0.257353673}, // 20203K {0.256252058, 0.257352314}, // 20204K {0.256251059, 0.257350955}, // 20205K {0.25625006, 0.257349596}, // 20206K {0.256249062, 0.257348238}, // 20207K {0.256248063, 0.257346879}, // 20208K {0.256247065, 0.257345521}, // 20209K {0.256246067, 0.257344163}, // 20210K {0.256245069, 0.257342805}, // 20211K {0.256244071, 0.257341447}, // 20212K {0.256243073, 0.257340089}, // 20213K {0.256242075, 0.257338732}, // 20214K {0.256241078, 0.257337374}, // 20215K {0.25624008, 0.257336017}, // 20216K {0.256239083, 0.25733466}, // 20217K {0.256238086, 0.257333303}, // 20218K {0.256237089, 0.257331946}, // 20219K {0.256236092, 0.257330589}, // 20220K {0.256235095, 0.257329233}, // 20221K {0.256234098, 0.257327877}, // 20222K {0.256233101, 0.25732652}, // 20223K {0.256232105, 0.257325164}, // 20224K {0.256231108, 0.257323808}, // 20225K {0.256230112, 0.257322453}, // 20226K {0.256229116, 0.257321097}, // 20227K {0.25622812, 0.257319742}, // 20228K {0.256227124, 0.257318386}, // 20229K {0.256226128, 0.257317031}, // 20230K {0.256225132, 0.257315676}, // 20231K {0.256224137, 0.257314321}, // 20232K {0.256223141, 0.257312967}, // 20233K {0.256222146, 0.257311612}, // 20234K {0.256221151, 0.257310258}, // 20235K {0.256220156, 0.257308904}, // 20236K {0.256219161, 0.25730755}, // 20237K {0.256218166, 0.257306196}, // 20238K {0.256217171, 0.257304842}, // 20239K {0.256216176, 0.257303488}, // 20240K {0.256215182, 0.257302135}, // 20241K {0.256214187, 0.257300781}, // 20242K {0.256213193, 0.257299428}, // 20243K {0.256212199, 0.257298075}, // 20244K {0.256211205, 0.257296722}, // 20245K {0.256210211, 0.25729537}, // 20246K {0.256209217, 0.257294017}, // 20247K {0.256208223, 0.257292665}, // 20248K {0.25620723, 0.257291312}, // 20249K {0.256206236, 0.25728996}, // 20250K {0.256205243, 0.257288608}, // 20251K {0.25620425, 0.257287256}, // 20252K {0.256203256, 0.257285905}, // 20253K {0.256202263, 0.257284553}, // 20254K {0.25620127, 0.257283202}, // 20255K {0.256200278, 0.257281851}, // 20256K {0.256199285, 0.2572805}, // 20257K {0.256198292, 0.257279149}, // 20258K {0.2561973, 0.257277798}, // 20259K {0.256196308, 0.257276447}, // 20260K {0.256195315, 0.257275097}, // 20261K {0.256194323, 0.257273747}, // 20262K {0.256193331, 0.257272397}, // 20263K {0.25619234, 0.257271047}, // 20264K {0.256191348, 0.257269697}, // 20265K {0.256190356, 0.257268347}, // 20266K {0.256189365, 0.257266997}, // 20267K {0.256188373, 0.257265648}, // 20268K {0.256187382, 0.257264299}, // 20269K {0.256186391, 0.25726295}, // 20270K {0.2561854, 0.257261601}, // 20271K {0.256184409, 0.257260252}, // 20272K {0.256183418, 0.257258903}, // 20273K {0.256182427, 0.257257555}, // 20274K {0.256181437, 0.257256206}, // 20275K {0.256180446, 0.257254858}, // 20276K {0.256179456, 0.25725351}, // 20277K {0.256178466, 0.257252162}, // 20278K {0.256177476, 0.257250815}, // 20279K {0.256176486, 0.257249467}, // 20280K {0.256175496, 0.25724812}, // 20281K {0.256174506, 0.257246772}, // 20282K {0.256173516, 0.257245425}, // 20283K {0.256172527, 0.257244078}, // 20284K {0.256171537, 0.257242731}, // 20285K {0.256170548, 0.257241385}, // 20286K {0.256169559, 0.257240038}, // 20287K {0.25616857, 0.257238692}, // 20288K {0.256167581, 0.257237345}, // 20289K {0.256166592, 0.257235999}, // 20290K {0.256165603, 0.257234653}, // 20291K {0.256164615, 0.257233308}, // 20292K {0.256163626, 0.257231962}, // 20293K {0.256162638, 0.257230617}, // 20294K {0.25616165, 0.257229271}, // 20295K {0.256160661, 0.257227926}, // 20296K {0.256159673, 0.257226581}, // 20297K {0.256158685, 0.257225236}, // 20298K {0.256157698, 0.257223891}, // 20299K {0.25615671, 0.257222547}, // 20300K {0.256155722, 0.257221202}, // 20301K {0.256154735, 0.257219858}, // 20302K {0.256153748, 0.257218514}, // 20303K {0.25615276, 0.25721717}, // 20304K {0.256151773, 0.257215826}, // 20305K {0.256150786, 0.257214482}, // 20306K {0.256149799, 0.257213139}, // 20307K {0.256148813, 0.257211795}, // 20308K {0.256147826, 0.257210452}, // 20309K {0.256146839, 0.257209109}, // 20310K {0.256145853, 0.257207766}, // 20311K {0.256144867, 0.257206423}, // 20312K {0.256143881, 0.257205081}, // 20313K {0.256142895, 0.257203738}, // 20314K {0.256141909, 0.257202396}, // 20315K {0.256140923, 0.257201054}, // 20316K {0.256139937, 0.257199712}, // 20317K {0.256138951, 0.25719837}, // 20318K {0.256137966, 0.257197028}, // 20319K {0.256136981, 0.257195686}, // 20320K {0.256135995, 0.257194345}, // 20321K {0.25613501, 0.257193004}, // 20322K {0.256134025, 0.257191662}, // 20323K {0.25613304, 0.257190321}, // 20324K {0.256132055, 0.257188981}, // 20325K {0.256131071, 0.25718764}, // 20326K {0.256130086, 0.257186299}, // 20327K {0.256129102, 0.257184959}, // 20328K {0.256128117, 0.257183619}, // 20329K {0.256127133, 0.257182279}, // 20330K {0.256126149, 0.257180939}, // 20331K {0.256125165, 0.257179599}, // 20332K {0.256124181, 0.257178259}, // 20333K {0.256123197, 0.25717692}, // 20334K {0.256122214, 0.25717558}, // 20335K {0.25612123, 0.257174241}, // 20336K {0.256120247, 0.257172902}, // 20337K {0.256119264, 0.257171563}, // 20338K {0.25611828, 0.257170224}, // 20339K {0.256117297, 0.257168886}, // 20340K {0.256116314, 0.257167547}, // 20341K {0.256115331, 0.257166209}, // 20342K {0.256114349, 0.257164871}, // 20343K {0.256113366, 0.257163533}, // 20344K {0.256112384, 0.257162195}, // 20345K {0.256111401, 0.257160857}, // 20346K {0.256110419, 0.25715952}, // 20347K {0.256109437, 0.257158182}, // 20348K {0.256108455, 0.257156845}, // 20349K {0.256107473, 0.257155508}, // 20350K {0.256106491, 0.257154171}, // 20351K {0.256105509, 0.257152834}, // 20352K {0.256104528, 0.257151497}, // 20353K {0.256103546, 0.257150161}, // 20354K {0.256102565, 0.257148824}, // 20355K {0.256101584, 0.257147488}, // 20356K {0.256100603, 0.257146152}, // 20357K {0.256099622, 0.257144816}, // 20358K {0.256098641, 0.25714348}, // 20359K {0.25609766, 0.257142145}, // 20360K {0.256096679, 0.257140809}, // 20361K {0.256095699, 0.257139474}, // 20362K {0.256094718, 0.257138139}, // 20363K {0.256093738, 0.257136804}, // 20364K {0.256092758, 0.257135469}, // 20365K {0.256091778, 0.257134134}, // 20366K {0.256090798, 0.257132799}, // 20367K {0.256089818, 0.257131465}, // 20368K {0.256088838, 0.257130131}, // 20369K {0.256087858, 0.257128796}, // 20370K {0.256086879, 0.257127462}, // 20371K {0.2560859, 0.257126129}, // 20372K {0.25608492, 0.257124795}, // 20373K {0.256083941, 0.257123461}, // 20374K {0.256082962, 0.257122128}, // 20375K {0.256081983, 0.257120795}, // 20376K {0.256081004, 0.257119461}, // 20377K {0.256080025, 0.257118128}, // 20378K {0.256079047, 0.257116796}, // 20379K {0.256078068, 0.257115463}, // 20380K {0.25607709, 0.25711413}, // 20381K {0.256076112, 0.257112798}, // 20382K {0.256075134, 0.257111466}, // 20383K {0.256074156, 0.257110134}, // 20384K {0.256073178, 0.257108802}, // 20385K {0.2560722, 0.25710747}, // 20386K {0.256071222, 0.257106138}, // 20387K {0.256070245, 0.257104807}, // 20388K {0.256069267, 0.257103475}, // 20389K {0.25606829, 0.257102144}, // 20390K {0.256067312, 0.257100813}, // 20391K {0.256066335, 0.257099482}, // 20392K {0.256065358, 0.257098152}, // 20393K {0.256064381, 0.257096821}, // 20394K {0.256063405, 0.25709549}, // 20395K {0.256062428, 0.25709416}, // 20396K {0.256061451, 0.25709283}, // 20397K {0.256060475, 0.2570915}, // 20398K {0.256059499, 0.25709017}, // 20399K {0.256058522, 0.25708884}, // 20400K {0.256057546, 0.257087511}, // 20401K {0.25605657, 0.257086181}, // 20402K {0.256055595, 0.257084852}, // 20403K {0.256054619, 0.257083523}, // 20404K {0.256053643, 0.257082194}, // 20405K {0.256052668, 0.257080865}, // 20406K {0.256051692, 0.257079536}, // 20407K {0.256050717, 0.257078208}, // 20408K {0.256049742, 0.257076879}, // 20409K {0.256048767, 0.257075551}, // 20410K {0.256047792, 0.257074223}, // 20411K {0.256046817, 0.257072895}, // 20412K {0.256045842, 0.257071567}, // 20413K {0.256044867, 0.25707024}, // 20414K {0.256043893, 0.257068912}, // 20415K {0.256042918, 0.257067585}, // 20416K {0.256041944, 0.257066258}, // 20417K {0.25604097, 0.257064931}, // 20418K {0.256039996, 0.257063604}, // 20419K {0.256039022, 0.257062277}, // 20420K {0.256038048, 0.25706095}, // 20421K {0.256037074, 0.257059624}, // 20422K {0.256036101, 0.257058297}, // 20423K {0.256035127, 0.257056971}, // 20424K {0.256034154, 0.257055645}, // 20425K {0.256033181, 0.257054319}, // 20426K {0.256032208, 0.257052993}, // 20427K {0.256031235, 0.257051668}, // 20428K {0.256030262, 0.257050342}, // 20429K {0.256029289, 0.257049017}, // 20430K {0.256028316, 0.257047692}, // 20431K {0.256027344, 0.257046367}, // 20432K {0.256026371, 0.257045042}, // 20433K {0.256025399, 0.257043717}, // 20434K {0.256024426, 0.257042393}, // 20435K {0.256023454, 0.257041068}, // 20436K {0.256022482, 0.257039744}, // 20437K {0.25602151, 0.25703842}, // 20438K {0.256020539, 0.257037096}, // 20439K {0.256019567, 0.257035772}, // 20440K {0.256018595, 0.257034448}, // 20441K {0.256017624, 0.257033125}, // 20442K {0.256016653, 0.257031801}, // 20443K {0.256015681, 0.257030478}, // 20444K {0.25601471, 0.257029155}, // 20445K {0.256013739, 0.257027832}, // 20446K {0.256012768, 0.257026509}, // 20447K {0.256011798, 0.257025187}, // 20448K {0.256010827, 0.257023864}, // 20449K {0.256009856, 0.257022542}, // 20450K {0.256008886, 0.257021219}, // 20451K {0.256007916, 0.257019897}, // 20452K {0.256006945, 0.257018575}, // 20453K {0.256005975, 0.257017254}, // 20454K {0.256005005, 0.257015932}, // 20455K {0.256004035, 0.25701461}, // 20456K {0.256003066, 0.257013289}, // 20457K {0.256002096, 0.257011968}, // 20458K {0.256001126, 0.257010647}, // 20459K {0.256000157, 0.257009326}, // 20460K {0.255999188, 0.257008005}, // 20461K {0.255998218, 0.257006684}, // 20462K {0.255997249, 0.257005364}, // 20463K {0.25599628, 0.257004044}, // 20464K {0.255995312, 0.257002723}, // 20465K {0.255994343, 0.257001403}, // 20466K {0.255993374, 0.257000083}, // 20467K {0.255992406, 0.256998764}, // 20468K {0.255991437, 0.256997444}, // 20469K {0.255990469, 0.256996125}, // 20470K {0.255989501, 0.256994805}, // 20471K {0.255988533, 0.256993486}, // 20472K {0.255987565, 0.256992167}, // 20473K {0.255986597, 0.256990848}, // 20474K {0.255985629, 0.25698953}, // 20475K {0.255984661, 0.256988211}, // 20476K {0.255983694, 0.256986893}, // 20477K {0.255982726, 0.256985574}, // 20478K {0.255981759, 0.256984256}, // 20479K {0.255980792, 0.256982938}, // 20480K {0.255979825, 0.25698162}, // 20481K {0.255978858, 0.256980303}, // 20482K {0.255977891, 0.256978985}, // 20483K {0.255976924, 0.256977668}, // 20484K {0.255975958, 0.25697635}, // 20485K {0.255974991, 0.256975033}, // 20486K {0.255974025, 0.256973716}, // 20487K {0.255973059, 0.256972399}, // 20488K {0.255972092, 0.256971083}, // 20489K {0.255971126, 0.256969766}, // 20490K {0.25597016, 0.25696845}, // 20491K {0.255969195, 0.256967133}, // 20492K {0.255968229, 0.256965817}, // 20493K {0.255967263, 0.256964501}, // 20494K {0.255966298, 0.256963185}, // 20495K {0.255965332, 0.25696187}, // 20496K {0.255964367, 0.256960554}, // 20497K {0.255963402, 0.256959239}, // 20498K {0.255962437, 0.256957924}, // 20499K {0.255961472, 0.256956609}, // 20500K {0.255960507, 0.256955294}, // 20501K {0.255959542, 0.256953979}, // 20502K {0.255958578, 0.256952664}, // 20503K {0.255957613, 0.25695135}, // 20504K {0.255956649, 0.256950035}, // 20505K {0.255955685, 0.256948721}, // 20506K {0.25595472, 0.256947407}, // 20507K {0.255953756, 0.256946093}, // 20508K {0.255952793, 0.256944779}, // 20509K {0.255951829, 0.256943466}, // 20510K {0.255950865, 0.256942152}, // 20511K {0.255949901, 0.256940839}, // 20512K {0.255948938, 0.256939525}, // 20513K {0.255947975, 0.256938212}, // 20514K {0.255947011, 0.256936899}, // 20515K {0.255946048, 0.256935587}, // 20516K {0.255945085, 0.256934274}, // 20517K {0.255944122, 0.256932962}, // 20518K {0.255943159, 0.256931649}, // 20519K {0.255942197, 0.256930337}, // 20520K {0.255941234, 0.256929025}, // 20521K {0.255940272, 0.256927713}, // 20522K {0.255939309, 0.256926401}, // 20523K {0.255938347, 0.25692509}, // 20524K {0.255937385, 0.256923778}, // 20525K {0.255936423, 0.256922467}, // 20526K {0.255935461, 0.256921156}, // 20527K {0.255934499, 0.256919845}, // 20528K {0.255933537, 0.256918534}, // 20529K {0.255932576, 0.256917223}, // 20530K {0.255931614, 0.256915912}, // 20531K {0.255930653, 0.256914602}, // 20532K {0.255929692, 0.256913292}, // 20533K {0.25592873, 0.256911981}, // 20534K {0.255927769, 0.256910671}, // 20535K {0.255926808, 0.256909361}, // 20536K {0.255925848, 0.256908052}, // 20537K {0.255924887, 0.256906742}, // 20538K {0.255923926, 0.256905433}, // 20539K {0.255922966, 0.256904123}, // 20540K {0.255922005, 0.256902814}, // 20541K {0.255921045, 0.256901505}, // 20542K {0.255920085, 0.256900196}, // 20543K {0.255919125, 0.256898888}, // 20544K {0.255918165, 0.256897579}, // 20545K {0.255917205, 0.25689627}, // 20546K {0.255916246, 0.256894962}, // 20547K {0.255915286, 0.256893654}, // 20548K {0.255914326, 0.256892346}, // 20549K {0.255913367, 0.256891038}, // 20550K {0.255912408, 0.25688973}, // 20551K {0.255911449, 0.256888423}, // 20552K {0.25591049, 0.256887115}, // 20553K {0.255909531, 0.256885808}, // 20554K {0.255908572, 0.256884501}, // 20555K {0.255907613, 0.256883194}, // 20556K {0.255906655, 0.256881887}, // 20557K {0.255905696, 0.25688058}, // 20558K {0.255904738, 0.256879274}, // 20559K {0.255903779, 0.256877967}, // 20560K {0.255902821, 0.256876661}, // 20561K {0.255901863, 0.256875355}, // 20562K {0.255900905, 0.256874049}, // 20563K {0.255899947, 0.256872743}, // 20564K {0.25589899, 0.256871437}, // 20565K {0.255898032, 0.256870132}, // 20566K {0.255897075, 0.256868826}, // 20567K {0.255896117, 0.256867521}, // 20568K {0.25589516, 0.256866216}, // 20569K {0.255894203, 0.256864911}, // 20570K {0.255893246, 0.256863606}, // 20571K {0.255892289, 0.256862301}, // 20572K {0.255891332, 0.256860997}, // 20573K {0.255890375, 0.256859692}, // 20574K {0.255889419, 0.256858388}, // 20575K {0.255888462, 0.256857084}, // 20576K {0.255887506, 0.25685578}, // 20577K {0.25588655, 0.256854476}, // 20578K {0.255885593, 0.256853172}, // 20579K {0.255884637, 0.256851869}, // 20580K {0.255883681, 0.256850565}, // 20581K {0.255882726, 0.256849262}, // 20582K {0.25588177, 0.256847959}, // 20583K {0.255880814, 0.256846656}, // 20584K {0.255879859, 0.256845353}, // 20585K {0.255878903, 0.25684405}, // 20586K {0.255877948, 0.256842748}, // 20587K {0.255876993, 0.256841445}, // 20588K {0.255876038, 0.256840143}, // 20589K {0.255875083, 0.256838841}, // 20590K {0.255874128, 0.256837539}, // 20591K {0.255873173, 0.256836237}, // 20592K {0.255872219, 0.256834936}, // 20593K {0.255871264, 0.256833634}, // 20594K {0.25587031, 0.256832333}, // 20595K {0.255869355, 0.256831031}, // 20596K {0.255868401, 0.25682973}, // 20597K {0.255867447, 0.256828429}, // 20598K {0.255866493, 0.256827128}, // 20599K {0.255865539, 0.256825828}, // 20600K {0.255864586, 0.256824527}, // 20601K {0.255863632, 0.256823227}, // 20602K {0.255862678, 0.256821926}, // 20603K {0.255861725, 0.256820626}, // 20604K {0.255860772, 0.256819326}, // 20605K {0.255859818, 0.256818026}, // 20606K {0.255858865, 0.256816727}, // 20607K {0.255857912, 0.256815427}, // 20608K {0.25585696, 0.256814128}, // 20609K {0.255856007, 0.256812828}, // 20610K {0.255855054, 0.256811529}, // 20611K {0.255854102, 0.25681023}, // 20612K {0.255853149, 0.256808931}, // 20613K {0.255852197, 0.256807633}, // 20614K {0.255851245, 0.256806334}, // 20615K {0.255850293, 0.256805036}, // 20616K {0.255849341, 0.256803738}, // 20617K {0.255848389, 0.256802439}, // 20618K {0.255847437, 0.256801141}, // 20619K {0.255846485, 0.256799844}, // 20620K {0.255845534, 0.256798546}, // 20621K {0.255844582, 0.256797248}, // 20622K {0.255843631, 0.256795951}, // 20623K {0.25584268, 0.256794654}, // 20624K {0.255841729, 0.256793356}, // 20625K {0.255840778, 0.256792059}, // 20626K {0.255839827, 0.256790763}, // 20627K {0.255838876, 0.256789466}, // 20628K {0.255837925, 0.256788169}, // 20629K {0.255836975, 0.256786873}, // 20630K {0.255836024, 0.256785577}, // 20631K {0.255835074, 0.25678428}, // 20632K {0.255834124, 0.256782984}, // 20633K {0.255833174, 0.256781689}, // 20634K {0.255832223, 0.256780393}, // 20635K {0.255831274, 0.256779097}, // 20636K {0.255830324, 0.256777802}, // 20637K {0.255829374, 0.256776507}, // 20638K {0.255828425, 0.256775211}, // 20639K {0.255827475, 0.256773916}, // 20640K {0.255826526, 0.256772622}, // 20641K {0.255825576, 0.256771327}, // 20642K {0.255824627, 0.256770032}, // 20643K {0.255823678, 0.256768738}, // 20644K {0.255822729, 0.256767443}, // 20645K {0.25582178, 0.256766149}, // 20646K {0.255820832, 0.256764855}, // 20647K {0.255819883, 0.256763561}, // 20648K {0.255818935, 0.256762268}, // 20649K {0.255817986, 0.256760974}, // 20650K {0.255817038, 0.256759681}, // 20651K {0.25581609, 0.256758387}, // 20652K {0.255815142, 0.256757094}, // 20653K {0.255814194, 0.256755801}, // 20654K {0.255813246, 0.256754508}, // 20655K {0.255812298, 0.256753216}, // 20656K {0.255811351, 0.256751923}, // 20657K {0.255810403, 0.25675063}, // 20658K {0.255809456, 0.256749338}, // 20659K {0.255808508, 0.256748046}, // 20660K {0.255807561, 0.256746754}, // 20661K {0.255806614, 0.256745462}, // 20662K {0.255805667, 0.25674417}, // 20663K {0.25580472, 0.256742879}, // 20664K {0.255803774, 0.256741587}, // 20665K {0.255802827, 0.256740296}, // 20666K {0.25580188, 0.256739005}, // 20667K {0.255800934, 0.256737714}, // 20668K {0.255799988, 0.256736423}, // 20669K {0.255799042, 0.256735132}, // 20670K {0.255798095, 0.256733841}, // 20671K {0.255797149, 0.256732551}, // 20672K {0.255796204, 0.256731261}, // 20673K {0.255795258, 0.25672997}, // 20674K {0.255794312, 0.25672868}, // 20675K {0.255793367, 0.25672739}, // 20676K {0.255792421, 0.256726101}, // 20677K {0.255791476, 0.256724811}, // 20678K {0.255790531, 0.256723521}, // 20679K {0.255789585, 0.256722232}, // 20680K {0.25578864, 0.256720943}, // 20681K {0.255787696, 0.256719654}, // 20682K {0.255786751, 0.256718365}, // 20683K {0.255785806, 0.256717076}, // 20684K {0.255784861, 0.256715787}, // 20685K {0.255783917, 0.256714499}, // 20686K {0.255782973, 0.256713211}, // 20687K {0.255782028, 0.256711922}, // 20688K {0.255781084, 0.256710634}, // 20689K {0.25578014, 0.256709346}, // 20690K {0.255779196, 0.256708059}, // 20691K {0.255778252, 0.256706771}, // 20692K {0.255777309, 0.256705483}, // 20693K {0.255776365, 0.256704196}, // 20694K {0.255775422, 0.256702909}, // 20695K {0.255774478, 0.256701622}, // 20696K {0.255773535, 0.256700335}, // 20697K {0.255772592, 0.256699048}, // 20698K {0.255771649, 0.256697761}, // 20699K {0.255770706, 0.256696475}, // 20700K {0.255769763, 0.256695188}, // 20701K {0.25576882, 0.256693902}, // 20702K {0.255767878, 0.256692616}, // 20703K {0.255766935, 0.25669133}, // 20704K {0.255765993, 0.256690044}, // 20705K {0.25576505, 0.256688758}, // 20706K {0.255764108, 0.256687473}, // 20707K {0.255763166, 0.256686187}, // 20708K {0.255762224, 0.256684902}, // 20709K {0.255761282, 0.256683617}, // 20710K {0.25576034, 0.256682332}, // 20711K {0.255759399, 0.256681047}, // 20712K {0.255758457, 0.256679763}, // 20713K {0.255757516, 0.256678478}, // 20714K {0.255756574, 0.256677194}, // 20715K {0.255755633, 0.256675909}, // 20716K {0.255754692, 0.256674625}, // 20717K {0.255753751, 0.256673341}, // 20718K {0.25575281, 0.256672057}, // 20719K {0.255751869, 0.256670773}, // 20720K {0.255750929, 0.25666949}, // 20721K {0.255749988, 0.256668206}, // 20722K {0.255749048, 0.256666923}, // 20723K {0.255748107, 0.25666564}, // 20724K {0.255747167, 0.256664357}, // 20725K {0.255746227, 0.256663074}, // 20726K {0.255745287, 0.256661791}, // 20727K {0.255744347, 0.256660509}, // 20728K {0.255743407, 0.256659226}, // 20729K {0.255742467, 0.256657944}, // 20730K {0.255741528, 0.256656662}, // 20731K {0.255740588, 0.25665538}, // 20732K {0.255739649, 0.256654098}, // 20733K {0.25573871, 0.256652816}, // 20734K {0.25573777, 0.256651534}, // 20735K {0.255736831, 0.256650253}, // 20736K {0.255735892, 0.256648972}, // 20737K {0.255734953, 0.25664769}, // 20738K {0.255734015, 0.256646409}, // 20739K {0.255733076, 0.256645128}, // 20740K {0.255732138, 0.256643848}, // 20741K {0.255731199, 0.256642567}, // 20742K {0.255730261, 0.256641286}, // 20743K {0.255729323, 0.256640006}, // 20744K {0.255728384, 0.256638726}, // 20745K {0.255727446, 0.256637446}, // 20746K {0.255726509, 0.256636166}, // 20747K {0.255725571, 0.256634886}, // 20748K {0.255724633, 0.256633606}, // 20749K {0.255723696, 0.256632327}, // 20750K {0.255722758, 0.256631047}, // 20751K {0.255721821, 0.256629768}, // 20752K {0.255720883, 0.256628489}, // 20753K {0.255719946, 0.25662721}, // 20754K {0.255719009, 0.256625931}, // 20755K {0.255718072, 0.256624652}, // 20756K {0.255717136, 0.256623374}, // 20757K {0.255716199, 0.256622095}, // 20758K {0.255715262, 0.256620817}, // 20759K {0.255714326, 0.256619539}, // 20760K {0.255713389, 0.256618261}, // 20761K {0.255712453, 0.256616983}, // 20762K {0.255711517, 0.256615705}, // 20763K {0.255710581, 0.256614428}, // 20764K {0.255709645, 0.25661315}, // 20765K {0.255708709, 0.256611873}, // 20766K {0.255707773, 0.256610596}, // 20767K {0.255706838, 0.256609319}, // 20768K {0.255705902, 0.256608042}, // 20769K {0.255704967, 0.256606765}, // 20770K {0.255704031, 0.256605489}, // 20771K {0.255703096, 0.256604212}, // 20772K {0.255702161, 0.256602936}, // 20773K {0.255701226, 0.25660166}, // 20774K {0.255700291, 0.256600384}, // 20775K {0.255699356, 0.256599108}, // 20776K {0.255698422, 0.256597832}, // 20777K {0.255697487, 0.256596556}, // 20778K {0.255696553, 0.256595281}, // 20779K {0.255695618, 0.256594005}, // 20780K {0.255694684, 0.25659273}, // 20781K {0.25569375, 0.256591455}, // 20782K {0.255692816, 0.25659018}, // 20783K {0.255691882, 0.256588905}, // 20784K {0.255690948, 0.256587631}, // 20785K {0.255690014, 0.256586356}, // 20786K {0.255689081, 0.256585082}, // 20787K {0.255688147, 0.256583807}, // 20788K {0.255687214, 0.256582533}, // 20789K {0.25568628, 0.256581259}, // 20790K {0.255685347, 0.256579986}, // 20791K {0.255684414, 0.256578712}, // 20792K {0.255683481, 0.256577438}, // 20793K {0.255682548, 0.256576165}, // 20794K {0.255681615, 0.256574892}, // 20795K {0.255680683, 0.256573618}, // 20796K {0.25567975, 0.256572345}, // 20797K {0.255678818, 0.256571073}, // 20798K {0.255677885, 0.2565698}, // 20799K {0.255676953, 0.256568527}, // 20800K {0.255676021, 0.256567255}, // 20801K {0.255675089, 0.256565982}, // 20802K {0.255674157, 0.25656471}, // 20803K {0.255673225, 0.256563438}, // 20804K {0.255672294, 0.256562166}, // 20805K {0.255671362, 0.256560895}, // 20806K {0.255670431, 0.256559623}, // 20807K {0.255669499, 0.256558351}, // 20808K {0.255668568, 0.25655708}, // 20809K {0.255667637, 0.256555809}, // 20810K {0.255666706, 0.256554538}, // 20811K {0.255665775, 0.256553267}, // 20812K {0.255664844, 0.256551996}, // 20813K {0.255663913, 0.256550725}, // 20814K {0.255662982, 0.256549455}, // 20815K {0.255662052, 0.256548185}, // 20816K {0.255661122, 0.256546914}, // 20817K {0.255660191, 0.256545644}, // 20818K {0.255659261, 0.256544374}, // 20819K {0.255658331, 0.256543104}, // 20820K {0.255657401, 0.256541835}, // 20821K {0.255656471, 0.256540565}, // 20822K {0.255655541, 0.256539296}, // 20823K {0.255654611, 0.256538026}, // 20824K {0.255653682, 0.256536757}, // 20825K {0.255652752, 0.256535488}, // 20826K {0.255651823, 0.256534219}, // 20827K {0.255650894, 0.256532951}, // 20828K {0.255649965, 0.256531682}, // 20829K {0.255649036, 0.256530414}, // 20830K {0.255648107, 0.256529145}, // 20831K {0.255647178, 0.256527877}, // 20832K {0.255646249, 0.256526609}, // 20833K {0.25564532, 0.256525341}, // 20834K {0.255644392, 0.256524074}, // 20835K {0.255643463, 0.256522806}, // 20836K {0.255642535, 0.256521538}, // 20837K {0.255641607, 0.256520271}, // 20838K {0.255640679, 0.256519004}, // 20839K {0.255639751, 0.256517737}, // 20840K {0.255638823, 0.25651647}, // 20841K {0.255637895, 0.256515203}, // 20842K {0.255636967, 0.256513936}, // 20843K {0.25563604, 0.25651267}, // 20844K {0.255635112, 0.256511403}, // 20845K {0.255634185, 0.256510137}, // 20846K {0.255633258, 0.256508871}, // 20847K {0.255632331, 0.256507605}, // 20848K {0.255631404, 0.256506339}, // 20849K {0.255630477, 0.256505074}, // 20850K {0.25562955, 0.256503808}, // 20851K {0.255628623, 0.256502543}, // 20852K {0.255627696, 0.256501277}, // 20853K {0.25562677, 0.256500012}, // 20854K {0.255625844, 0.256498747}, // 20855K {0.255624917, 0.256497482}, // 20856K {0.255623991, 0.256496218}, // 20857K {0.255623065, 0.256494953}, // 20858K {0.255622139, 0.256493688}, // 20859K {0.255621213, 0.256492424}, // 20860K {0.255620287, 0.25649116}, // 20861K {0.255619362, 0.256489896}, // 20862K {0.255618436, 0.256488632}, // 20863K {0.255617511, 0.256487368}, // 20864K {0.255616585, 0.256486105}, // 20865K {0.25561566, 0.256484841}, // 20866K {0.255614735, 0.256483578}, // 20867K {0.25561381, 0.256482314}, // 20868K {0.255612885, 0.256481051}, // 20869K {0.25561196, 0.256479788}, // 20870K {0.255611035, 0.256478526}, // 20871K {0.255610111, 0.256477263}, // 20872K {0.255609186, 0.256476}, // 20873K {0.255608262, 0.256474738}, // 20874K {0.255607337, 0.256473476}, // 20875K {0.255606413, 0.256472214}, // 20876K {0.255605489, 0.256470952}, // 20877K {0.255604565, 0.25646969}, // 20878K {0.255603641, 0.256468428}, // 20879K {0.255602717, 0.256467166}, // 20880K {0.255601794, 0.256465905}, // 20881K {0.25560087, 0.256464644}, // 20882K {0.255599947, 0.256463382}, // 20883K {0.255599023, 0.256462121}, // 20884K {0.2555981, 0.25646086}, // 20885K {0.255597177, 0.2564596}, // 20886K {0.255596254, 0.256458339}, // 20887K {0.255595331, 0.256457078}, // 20888K {0.255594408, 0.256455818}, // 20889K {0.255593485, 0.256454558}, // 20890K {0.255592563, 0.256453298}, // 20891K {0.25559164, 0.256452038}, // 20892K {0.255590718, 0.256450778}, // 20893K {0.255589795, 0.256449518}, // 20894K {0.255588873, 0.256448259}, // 20895K {0.255587951, 0.256446999}, // 20896K {0.255587029, 0.25644574}, // 20897K {0.255586107, 0.256444481}, // 20898K {0.255585185, 0.256443222}, // 20899K {0.255584264, 0.256441963}, // 20900K {0.255583342, 0.256440704}, // 20901K {0.255582421, 0.256439446}, // 20902K {0.255581499, 0.256438187}, // 20903K {0.255580578, 0.256436929}, // 20904K {0.255579657, 0.256435671}, // 20905K {0.255578736, 0.256434413}, // 20906K {0.255577815, 0.256433155}, // 20907K {0.255576894, 0.256431897}, // 20908K {0.255575973, 0.256430639}, // 20909K {0.255575053, 0.256429382}, // 20910K {0.255574132, 0.256428125}, // 20911K {0.255573212, 0.256426867}, // 20912K {0.255572291, 0.25642561}, // 20913K {0.255571371, 0.256424353}, // 20914K {0.255570451, 0.256423096}, // 20915K {0.255569531, 0.25642184}, // 20916K {0.255568611, 0.256420583}, // 20917K {0.255567691, 0.256419327}, // 20918K {0.255566771, 0.256418071}, // 20919K {0.255565852, 0.256416814}, // 20920K {0.255564932, 0.256415558}, // 20921K {0.255564013, 0.256414303}, // 20922K {0.255563094, 0.256413047}, // 20923K {0.255562174, 0.256411791}, // 20924K {0.255561255, 0.256410536}, // 20925K {0.255560336, 0.25640928}, // 20926K {0.255559417, 0.256408025}, // 20927K {0.255558499, 0.25640677}, // 20928K {0.25555758, 0.256405515}, // 20929K {0.255556661, 0.25640426}, // 20930K {0.255555743, 0.256403006}, // 20931K {0.255554825, 0.256401751}, // 20932K {0.255553906, 0.256400497}, // 20933K {0.255552988, 0.256399243}, // 20934K {0.25555207, 0.256397988}, // 20935K {0.255551152, 0.256396735}, // 20936K {0.255550234, 0.256395481}, // 20937K {0.255549317, 0.256394227}, // 20938K {0.255548399, 0.256392973}, // 20939K {0.255547482, 0.25639172}, // 20940K {0.255546564, 0.256390467}, // 20941K {0.255545647, 0.256389214}, // 20942K {0.25554473, 0.25638796}, // 20943K {0.255543813, 0.256386708}, // 20944K {0.255542896, 0.256385455}, // 20945K {0.255541979, 0.256384202}, // 20946K {0.255541062, 0.25638295}, // 20947K {0.255540145, 0.256381697}, // 20948K {0.255539229, 0.256380445}, // 20949K {0.255538312, 0.256379193}, // 20950K {0.255537396, 0.256377941}, // 20951K {0.255536479, 0.256376689}, // 20952K {0.255535563, 0.256375438}, // 20953K {0.255534647, 0.256374186}, // 20954K {0.255533731, 0.256372935}, // 20955K {0.255532815, 0.256371683}, // 20956K {0.2555319, 0.256370432}, // 20957K {0.255530984, 0.256369181}, // 20958K {0.255530068, 0.25636793}, // 20959K {0.255529153, 0.25636668}, // 20960K {0.255528238, 0.256365429}, // 20961K {0.255527322, 0.256364179}, // 20962K {0.255526407, 0.256362928}, // 20963K {0.255525492, 0.256361678}, // 20964K {0.255524577, 0.256360428}, // 20965K {0.255523662, 0.256359178}, // 20966K {0.255522748, 0.256357928}, // 20967K {0.255521833, 0.256356679}, // 20968K {0.255520919, 0.256355429}, // 20969K {0.255520004, 0.25635418}, // 20970K {0.25551909, 0.256352931}, // 20971K {0.255518176, 0.256351681}, // 20972K {0.255517261, 0.256350432}, // 20973K {0.255516347, 0.256349184}, // 20974K {0.255515434, 0.256347935}, // 20975K {0.25551452, 0.256346686}, // 20976K {0.255513606, 0.256345438}, // 20977K {0.255512693, 0.25634419}, // 20978K {0.255511779, 0.256342941}, // 20979K {0.255510866, 0.256341693}, // 20980K {0.255509952, 0.256340445}, // 20981K {0.255509039, 0.256339198}, // 20982K {0.255508126, 0.25633795}, // 20983K {0.255507213, 0.256336703}, // 20984K {0.2555063, 0.256335455}, // 20985K {0.255505388, 0.256334208}, // 20986K {0.255504475, 0.256332961}, // 20987K {0.255503562, 0.256331714}, // 20988K {0.25550265, 0.256330467}, // 20989K {0.255501737, 0.25632922}, // 20990K {0.255500825, 0.256327974}, // 20991K {0.255499913, 0.256326727}, // 20992K {0.255499001, 0.256325481}, // 20993K {0.255498089, 0.256324235}, // 20994K {0.255497177, 0.256322989}, // 20995K {0.255496266, 0.256321743}, // 20996K {0.255495354, 0.256320497}, // 20997K {0.255494442, 0.256319252}, // 20998K {0.255493531, 0.256318006}, // 20999K {0.25549262, 0.256316761}, // 21000K {0.255491708, 0.256315516}, // 21001K {0.255490797, 0.25631427}, // 21002K {0.255489886, 0.256313026}, // 21003K {0.255488975, 0.256311781}, // 21004K {0.255488065, 0.256310536}, // 21005K {0.255487154, 0.256309291}, // 21006K {0.255486243, 0.256308047}, // 21007K {0.255485333, 0.256306803}, // 21008K {0.255484422, 0.256305559}, // 21009K {0.255483512, 0.256304315}, // 21010K {0.255482602, 0.256303071}, // 21011K {0.255481692, 0.256301827}, // 21012K {0.255480782, 0.256300583}, // 21013K {0.255479872, 0.25629934}, // 21014K {0.255478962, 0.256298097}, // 21015K {0.255478052, 0.256296853}, // 21016K {0.255477143, 0.25629561}, // 21017K {0.255476233, 0.256294367}, // 21018K {0.255475324, 0.256293125}, // 21019K {0.255474415, 0.256291882}, // 21020K {0.255473506, 0.256290639}, // 21021K {0.255472597, 0.256289397}, // 21022K {0.255471688, 0.256288155}, // 21023K {0.255470779, 0.256286912}, // 21024K {0.25546987, 0.25628567}, // 21025K {0.255468961, 0.256284429}, // 21026K {0.255468053, 0.256283187}, // 21027K {0.255467144, 0.256281945}, // 21028K {0.255466236, 0.256280704}, // 21029K {0.255465328, 0.256279462}, // 21030K {0.25546442, 0.256278221}, // 21031K {0.255463512, 0.25627698}, // 21032K {0.255462604, 0.256275739}, // 21033K {0.255461696, 0.256274498}, // 21034K {0.255460788, 0.256273258}, // 21035K {0.25545988, 0.256272017}, // 21036K {0.255458973, 0.256270777}, // 21037K {0.255458065, 0.256269537}, // 21038K {0.255457158, 0.256268296}, // 21039K {0.255456251, 0.256267056}, // 21040K {0.255455344, 0.256265816}, // 21041K {0.255454437, 0.256264577}, // 21042K {0.25545353, 0.256263337}, // 21043K {0.255452623, 0.256262098}, // 21044K {0.255451716, 0.256260858}, // 21045K {0.25545081, 0.256259619}, // 21046K {0.255449903, 0.25625838}, // 21047K {0.255448997, 0.256257141}, // 21048K {0.255448091, 0.256255902}, // 21049K {0.255447184, 0.256254664}, // 21050K {0.255446278, 0.256253425}, // 21051K {0.255445372, 0.256252187}, // 21052K {0.255444466, 0.256250948}, // 21053K {0.255443561, 0.25624971}, // 21054K {0.255442655, 0.256248472}, // 21055K {0.255441749, 0.256247234}, // 21056K {0.255440844, 0.256245997}, // 21057K {0.255439938, 0.256244759}, // 21058K {0.255439033, 0.256243522}, // 21059K {0.255438128, 0.256242284}, // 21060K {0.255437223, 0.256241047}, // 21061K {0.255436318, 0.25623981}, // 21062K {0.255435413, 0.256238573}, // 21063K {0.255434508, 0.256237336}, // 21064K {0.255433604, 0.256236099}, // 21065K {0.255432699, 0.256234863}, // 21066K {0.255431794, 0.256233626}, // 21067K {0.25543089, 0.25623239}, // 21068K {0.255429986, 0.256231154}, // 21069K {0.255429082, 0.256229918}, // 21070K {0.255428178, 0.256228682}, // 21071K {0.255427274, 0.256227446}, // 21072K {0.25542637, 0.256226211}, // 21073K {0.255425466, 0.256224975}, // 21074K {0.255424562, 0.25622374}, // 21075K {0.255423659, 0.256222505}, // 21076K {0.255422755, 0.25622127}, // 21077K {0.255421852, 0.256220035}, // 21078K {0.255420949, 0.2562188}, // 21079K {0.255420046, 0.256217565}, // 21080K {0.255419143, 0.256216331}, // 21081K {0.25541824, 0.256215096}, // 21082K {0.255417337, 0.256213862}, // 21083K {0.255416434, 0.256212628}, // 21084K {0.255415531, 0.256211394}, // 21085K {0.255414629, 0.25621016}, // 21086K {0.255413726, 0.256208926}, // 21087K {0.255412824, 0.256207692}, // 21088K {0.255411922, 0.256206459}, // 21089K {0.25541102, 0.256205225}, // 21090K {0.255410118, 0.256203992}, // 21091K {0.255409216, 0.256202759}, // 21092K {0.255408314, 0.256201526}, // 21093K {0.255407412, 0.256200293}, // 21094K {0.255406511, 0.256199061}, // 21095K {0.255405609, 0.256197828}, // 21096K {0.255404708, 0.256196596}, // 21097K {0.255403806, 0.256195363}, // 21098K {0.255402905, 0.256194131}, // 21099K {0.255402004, 0.256192899}, // 21100K {0.255401103, 0.256191667}, // 21101K {0.255400202, 0.256190435}, // 21102K {0.255399301, 0.256189204}, // 21103K {0.255398401, 0.256187972}, // 21104K {0.2553975, 0.256186741}, // 21105K {0.255396599, 0.256185509}, // 21106K {0.255395699, 0.256184278}, // 21107K {0.255394799, 0.256183047}, // 21108K {0.255393898, 0.256181816}, // 21109K {0.255392998, 0.256180586}, // 21110K {0.255392098, 0.256179355}, // 21111K {0.255391198, 0.256178125}, // 21112K {0.255390299, 0.256176894}, // 21113K {0.255389399, 0.256175664}, // 21114K {0.255388499, 0.256174434}, // 21115K {0.2553876, 0.256173204}, // 21116K {0.2553867, 0.256171974}, // 21117K {0.255385801, 0.256170745}, // 21118K {0.255384902, 0.256169515}, // 21119K {0.255384003, 0.256168286}, // 21120K {0.255383104, 0.256167056}, // 21121K {0.255382205, 0.256165827}, // 21122K {0.255381306, 0.256164598}, // 21123K {0.255380407, 0.256163369}, // 21124K {0.255379509, 0.256162141}, // 21125K {0.25537861, 0.256160912}, // 21126K {0.255377712, 0.256159683}, // 21127K {0.255376814, 0.256158455}, // 21128K {0.255375915, 0.256157227}, // 21129K {0.255375017, 0.256155999}, // 21130K {0.255374119, 0.256154771}, // 21131K {0.255373221, 0.256153543}, // 21132K {0.255372324, 0.256152315}, // 21133K {0.255371426, 0.256151088}, // 21134K {0.255370528, 0.25614986}, // 21135K {0.255369631, 0.256148633}, // 21136K {0.255368733, 0.256147406}, // 21137K {0.255367836, 0.256146179}, // 21138K {0.255366939, 0.256144952}, // 21139K {0.255366042, 0.256143725}, // 21140K {0.255365145, 0.256142498}, // 21141K {0.255364248, 0.256141272}, // 21142K {0.255363351, 0.256140045}, // 21143K {0.255362455, 0.256138819}, // 21144K {0.255361558, 0.256137593}, // 21145K {0.255360661, 0.256136367}, // 21146K {0.255359765, 0.256135141}, // 21147K {0.255358869, 0.256133915}, // 21148K {0.255357973, 0.25613269}, // 21149K {0.255357077, 0.256131464}, // 21150K {0.255356181, 0.256130239}, // 21151K {0.255355285, 0.256129014}, // 21152K {0.255354389, 0.256127789}, // 21153K {0.255353493, 0.256126564}, // 21154K {0.255352598, 0.256125339}, // 21155K {0.255351702, 0.256124114}, // 21156K {0.255350807, 0.25612289}, // 21157K {0.255349911, 0.256121665}, // 21158K {0.255349016, 0.256120441}, // 21159K {0.255348121, 0.256119217}, // 21160K {0.255347226, 0.256117993}, // 21161K {0.255346331, 0.256116769}, // 21162K {0.255345437, 0.256115545}, // 21163K {0.255344542, 0.256114321}, // 21164K {0.255343647, 0.256113098}, // 21165K {0.255342753, 0.256111874}, // 21166K {0.255341858, 0.256110651}, // 21167K {0.255340964, 0.256109428}, // 21168K {0.25534007, 0.256108205}, // 21169K {0.255339176, 0.256106982}, // 21170K {0.255338282, 0.25610576}, // 21171K {0.255337388, 0.256104537}, // 21172K {0.255336494, 0.256103314}, // 21173K {0.255335601, 0.256102092}, // 21174K {0.255334707, 0.25610087}, // 21175K {0.255333814, 0.256099648}, // 21176K {0.25533292, 0.256098426}, // 21177K {0.255332027, 0.256097204}, // 21178K {0.255331134, 0.256095982}, // 21179K {0.255330241, 0.256094761}, // 21180K {0.255329348, 0.256093539}, // 21181K {0.255328455, 0.256092318}, // 21182K {0.255327562, 0.256091097}, // 21183K {0.255326669, 0.256089876}, // 21184K {0.255325777, 0.256088655}, // 21185K {0.255324884, 0.256087434}, // 21186K {0.255323992, 0.256086214}, // 21187K {0.2553231, 0.256084993}, // 21188K {0.255322207, 0.256083773}, // 21189K {0.255321315, 0.256082552}, // 21190K {0.255320423, 0.256081332}, // 21191K {0.255319531, 0.256080112}, // 21192K {0.25531864, 0.256078892}, // 21193K {0.255317748, 0.256077673}, // 21194K {0.255316856, 0.256076453}, // 21195K {0.255315965, 0.256075234}, // 21196K {0.255315074, 0.256074014}, // 21197K {0.255314182, 0.256072795}, // 21198K {0.255313291, 0.256071576}, // 21199K {0.2553124, 0.256070357}, // 21200K {0.255311509, 0.256069138}, // 21201K {0.255310618, 0.256067919}, // 21202K {0.255309727, 0.256066701}, // 21203K {0.255308837, 0.256065483}, // 21204K {0.255307946, 0.256064264}, // 21205K {0.255307056, 0.256063046}, // 21206K {0.255306165, 0.256061828}, // 21207K {0.255305275, 0.25606061}, // 21208K {0.255304385, 0.256059392}, // 21209K {0.255303495, 0.256058175}, // 21210K {0.255302605, 0.256056957}, // 21211K {0.255301715, 0.25605574}, // 21212K {0.255300825, 0.256054522}, // 21213K {0.255299935, 0.256053305}, // 21214K {0.255299046, 0.256052088}, // 21215K {0.255298156, 0.256050871}, // 21216K {0.255297267, 0.256049655}, // 21217K {0.255296377, 0.256048438}, // 21218K {0.255295488, 0.256047222}, // 21219K {0.255294599, 0.256046005}, // 21220K {0.25529371, 0.256044789}, // 21221K {0.255292821, 0.256043573}, // 21222K {0.255291932, 0.256042357}, // 21223K {0.255291044, 0.256041141}, // 21224K {0.255290155, 0.256039925}, // 21225K {0.255289267, 0.25603871}, // 21226K {0.255288378, 0.256037494}, // 21227K {0.25528749, 0.256036279}, // 21228K {0.255286602, 0.256035064}, // 21229K {0.255285714, 0.256033849}, // 21230K {0.255284826, 0.256032634}, // 21231K {0.255283938, 0.256031419}, // 21232K {0.25528305, 0.256030204}, // 21233K {0.255282162, 0.25602899}, // 21234K {0.255281274, 0.256027775}, // 21235K {0.255280387, 0.256026561}, // 21236K {0.2552795, 0.256025347}, // 21237K {0.255278612, 0.256024133}, // 21238K {0.255277725, 0.256022919}, // 21239K {0.255276838, 0.256021705}, // 21240K {0.255275951, 0.256020492}, // 21241K {0.255275064, 0.256019278}, // 21242K {0.255274177, 0.256018065}, // 21243K {0.25527329, 0.256016851}, // 21244K {0.255272404, 0.256015638}, // 21245K {0.255271517, 0.256014425}, // 21246K {0.255270631, 0.256013212}, // 21247K {0.255269745, 0.256012}, // 21248K {0.255268858, 0.256010787}, // 21249K {0.255267972, 0.256009575}, // 21250K {0.255267086, 0.256008362}, // 21251K {0.2552662, 0.25600715}, // 21252K {0.255265314, 0.256005938}, // 21253K {0.255264429, 0.256004726}, // 21254K {0.255263543, 0.256003514}, // 21255K {0.255262657, 0.256002302}, // 21256K {0.255261772, 0.256001091}, // 21257K {0.255260887, 0.255999879}, // 21258K {0.255260001, 0.255998668}, // 21259K {0.255259116, 0.255997457}, // 21260K {0.255258231, 0.255996246}, // 21261K {0.255257346, 0.255995035}, // 21262K {0.255256461, 0.255993824}, // 21263K {0.255255577, 0.255992613}, // 21264K {0.255254692, 0.255991403}, // 21265K {0.255253807, 0.255990192}, // 21266K {0.255252923, 0.255988982}, // 21267K {0.255252039, 0.255987772}, // 21268K {0.255251154, 0.255986562}, // 21269K {0.25525027, 0.255985352}, // 21270K {0.255249386, 0.255984142}, // 21271K {0.255248502, 0.255982933}, // 21272K {0.255247618, 0.255981723}, // 21273K {0.255246735, 0.255980514}, // 21274K {0.255245851, 0.255979304}, // 21275K {0.255244967, 0.255978095}, // 21276K {0.255244084, 0.255976886}, // 21277K {0.255243201, 0.255975677}, // 21278K {0.255242317, 0.255974469}, // 21279K {0.255241434, 0.25597326}, // 21280K {0.255240551, 0.255972052}, // 21281K {0.255239668, 0.255970843}, // 21282K {0.255238785, 0.255969635}, // 21283K {0.255237902, 0.255968427}, // 21284K {0.25523702, 0.255967219}, // 21285K {0.255236137, 0.255966011}, // 21286K {0.255235255, 0.255964803}, // 21287K {0.255234372, 0.255963596}, // 21288K {0.25523349, 0.255962388}, // 21289K {0.255232608, 0.255961181}, // 21290K {0.255231726, 0.255959974}, // 21291K {0.255230844, 0.255958767}, // 21292K {0.255229962, 0.25595756}, // 21293K {0.25522908, 0.255956353}, // 21294K {0.255228198, 0.255955146}, // 21295K {0.255227317, 0.25595394}, // 21296K {0.255226435, 0.255952733}, // 21297K {0.255225554, 0.255951527}, // 21298K {0.255224672, 0.255950321}, // 21299K {0.255223791, 0.255949115}, // 21300K {0.25522291, 0.255947909}, // 21301K {0.255222029, 0.255946703}, // 21302K {0.255221148, 0.255945497}, // 21303K {0.255220267, 0.255944292}, // 21304K {0.255219387, 0.255943086}, // 21305K {0.255218506, 0.255941881}, // 21306K {0.255217625, 0.255940676}, // 21307K {0.255216745, 0.255939471}, // 21308K {0.255215865, 0.255938266}, // 21309K {0.255214984, 0.255937061}, // 21310K {0.255214104, 0.255935856}, // 21311K {0.255213224, 0.255934652}, // 21312K {0.255212344, 0.255933447}, // 21313K {0.255211464, 0.255932243}, // 21314K {0.255210585, 0.255931039}, // 21315K {0.255209705, 0.255929835}, // 21316K {0.255208825, 0.255928631}, // 21317K {0.255207946, 0.255927427}, // 21318K {0.255207067, 0.255926224}, // 21319K {0.255206187, 0.25592502}, // 21320K {0.255205308, 0.255923817}, // 21321K {0.255204429, 0.255922614}, // 21322K {0.25520355, 0.25592141}, // 21323K {0.255202671, 0.255920207}, // 21324K {0.255201793, 0.255919005}, // 21325K {0.255200914, 0.255917802}, // 21326K {0.255200035, 0.255916599}, // 21327K {0.255199157, 0.255915397}, // 21328K {0.255198278, 0.255914194}, // 21329K {0.2551974, 0.255912992}, // 21330K {0.255196522, 0.25591179}, // 21331K {0.255195644, 0.255910588}, // 21332K {0.255194766, 0.255909386}, // 21333K {0.255193888, 0.255908185}, // 21334K {0.25519301, 0.255906983}, // 21335K {0.255192132, 0.255905781}, // 21336K {0.255191255, 0.25590458}, // 21337K {0.255190377, 0.255903379}, // 21338K {0.2551895, 0.255902178}, // 21339K {0.255188623, 0.255900977}, // 21340K {0.255187745, 0.255899776}, // 21341K {0.255186868, 0.255898575}, // 21342K {0.255185991, 0.255897375}, // 21343K {0.255185114, 0.255896174}, // 21344K {0.255184238, 0.255894974}, // 21345K {0.255183361, 0.255893774}, // 21346K {0.255182484, 0.255892574}, // 21347K {0.255181608, 0.255891374}, // 21348K {0.255180731, 0.255890174}, // 21349K {0.255179855, 0.255888974}, // 21350K {0.255178979, 0.255887775}, // 21351K {0.255178103, 0.255886575}, // 21352K {0.255177226, 0.255885376}, // 21353K {0.255176351, 0.255884177}, // 21354K {0.255175475, 0.255882978}, // 21355K {0.255174599, 0.255881779}, // 21356K {0.255173723, 0.25588058}, // 21357K {0.255172848, 0.255879381}, // 21358K {0.255171972, 0.255878183}, // 21359K {0.255171097, 0.255876984}, // 21360K {0.255170222, 0.255875786}, // 21361K {0.255169346, 0.255874588}, // 21362K {0.255168471, 0.25587339}, // 21363K {0.255167596, 0.255872192}, // 21364K {0.255166721, 0.255870994}, // 21365K {0.255165847, 0.255869797}, // 21366K {0.255164972, 0.255868599}, // 21367K {0.255164097, 0.255867402}, // 21368K {0.255163223, 0.255866204}, // 21369K {0.255162348, 0.255865007}, // 21370K {0.255161474, 0.25586381}, // 21371K {0.2551606, 0.255862613}, // 21372K {0.255159726, 0.255861417}, // 21373K {0.255158852, 0.25586022}, // 21374K {0.255157978, 0.255859023}, // 21375K {0.255157104, 0.255857827}, // 21376K {0.25515623, 0.255856631}, // 21377K {0.255155357, 0.255855435}, // 21378K {0.255154483, 0.255854239}, // 21379K {0.25515361, 0.255853043}, // 21380K {0.255152736, 0.255851847}, // 21381K {0.255151863, 0.255850651}, // 21382K {0.25515099, 0.255849456}, // 21383K {0.255150117, 0.25584826}, // 21384K {0.255149244, 0.255847065}, // 21385K {0.255148371, 0.25584587}, // 21386K {0.255147499, 0.255844675}, // 21387K {0.255146626, 0.25584348}, // 21388K {0.255145753, 0.255842285}, // 21389K {0.255144881, 0.255841091}, // 21390K {0.255144008, 0.255839896}, // 21391K {0.255143136, 0.255838702}, // 21392K {0.255142264, 0.255837508}, // 21393K {0.255141392, 0.255836314}, // 21394K {0.25514052, 0.25583512}, // 21395K {0.255139648, 0.255833926}, // 21396K {0.255138776, 0.255832732}, // 21397K {0.255137905, 0.255831538}, // 21398K {0.255137033, 0.255830345}, // 21399K {0.255136161, 0.255829152}, // 21400K {0.25513529, 0.255827958}, // 21401K {0.255134419, 0.255826765}, // 21402K {0.255133548, 0.255825572}, // 21403K {0.255132676, 0.255824379}, // 21404K {0.255131805, 0.255823187}, // 21405K {0.255130934, 0.255821994}, // 21406K {0.255130064, 0.255820802}, // 21407K {0.255129193, 0.255819609}, // 21408K {0.255128322, 0.255818417}, // 21409K {0.255127452, 0.255817225}, // 21410K {0.255126581, 0.255816033}, // 21411K {0.255125711, 0.255814841}, // 21412K {0.255124841, 0.255813649}, // 21413K {0.255123971, 0.255812458}, // 21414K {0.2551231, 0.255811266}, // 21415K {0.255122231, 0.255810075}, // 21416K {0.255121361, 0.255808884}, // 21417K {0.255120491, 0.255807693}, // 21418K {0.255119621, 0.255806502}, // 21419K {0.255118752, 0.255805311}, // 21420K {0.255117882, 0.25580412}, // 21421K {0.255117013, 0.255802929}, // 21422K {0.255116143, 0.255801739}, // 21423K {0.255115274, 0.255800549}, // 21424K {0.255114405, 0.255799358}, // 21425K {0.255113536, 0.255798168}, // 21426K {0.255112667, 0.255796978}, // 21427K {0.255111798, 0.255795788}, // 21428K {0.25511093, 0.255794599}, // 21429K {0.255110061, 0.255793409}, // 21430K {0.255109193, 0.25579222}, // 21431K {0.255108324, 0.25579103}, // 21432K {0.255107456, 0.255789841}, // 21433K {0.255106588, 0.255788652}, // 21434K {0.255105719, 0.255787463}, // 21435K {0.255104851, 0.255786274}, // 21436K {0.255103983, 0.255785086}, // 21437K {0.255103116, 0.255783897}, // 21438K {0.255102248, 0.255782709}, // 21439K {0.25510138, 0.25578152}, // 21440K {0.255100513, 0.255780332}, // 21441K {0.255099645, 0.255779144}, // 21442K {0.255098778, 0.255777956}, // 21443K {0.255097911, 0.255776768}, // 21444K {0.255097043, 0.25577558}, // 21445K {0.255096176, 0.255774393}, // 21446K {0.255095309, 0.255773205}, // 21447K {0.255094442, 0.255772018}, // 21448K {0.255093576, 0.255770831}, // 21449K {0.255092709, 0.255769644}, // 21450K {0.255091842, 0.255768457}, // 21451K {0.255090976, 0.25576727}, // 21452K {0.255090109, 0.255766083}, // 21453K {0.255089243, 0.255764897}, // 21454K {0.255088377, 0.25576371}, // 21455K {0.255087511, 0.255762524}, // 21456K {0.255086645, 0.255761338}, // 21457K {0.255085779, 0.255760152}, // 21458K {0.255084913, 0.255758966}, // 21459K {0.255084047, 0.25575778}, // 21460K {0.255083181, 0.255756594}, // 21461K {0.255082316, 0.255755408}, // 21462K {0.25508145, 0.255754223}, // 21463K {0.255080585, 0.255753038}, // 21464K {0.25507972, 0.255751852}, // 21465K {0.255078855, 0.255750667}, // 21466K {0.25507799, 0.255749482}, // 21467K {0.255077125, 0.255748298}, // 21468K {0.25507626, 0.255747113}, // 21469K {0.255075395, 0.255745928}, // 21470K {0.25507453, 0.255744744}, // 21471K {0.255073666, 0.255743559}, // 21472K {0.255072801, 0.255742375}, // 21473K {0.255071937, 0.255741191}, // 21474K {0.255071072, 0.255740007}, // 21475K {0.255070208, 0.255738823}, // 21476K {0.255069344, 0.25573764}, // 21477K {0.25506848, 0.255736456}, // 21478K {0.255067616, 0.255735273}, // 21479K {0.255066752, 0.255734089}, // 21480K {0.255065888, 0.255732906}, // 21481K {0.255065025, 0.255731723}, // 21482K {0.255064161, 0.25573054}, // 21483K {0.255063298, 0.255729357}, // 21484K {0.255062434, 0.255728174}, // 21485K {0.255061571, 0.255726992}, // 21486K {0.255060708, 0.255725809}, // 21487K {0.255059845, 0.255724627}, // 21488K {0.255058982, 0.255723445}, // 21489K {0.255058119, 0.255722263}, // 21490K {0.255057256, 0.255721081}, // 21491K {0.255056393, 0.255719899}, // 21492K {0.255055531, 0.255718717}, // 21493K {0.255054668, 0.255717535}, // 21494K {0.255053806, 0.255716354}, // 21495K {0.255052944, 0.255715173}, // 21496K {0.255052081, 0.255713991}, // 21497K {0.255051219, 0.25571281}, // 21498K {0.255050357, 0.255711629}, // 21499K {0.255049495, 0.255710448}, // 21500K {0.255048633, 0.255709268}, // 21501K {0.255047772, 0.255708087}, // 21502K {0.25504691, 0.255706907}, // 21503K {0.255046048, 0.255705726}, // 21504K {0.255045187, 0.255704546}, // 21505K {0.255044326, 0.255703366}, // 21506K {0.255043464, 0.255702186}, // 21507K {0.255042603, 0.255701006}, // 21508K {0.255041742, 0.255699826}, // 21509K {0.255040881, 0.255698647}, // 21510K {0.25504002, 0.255697467}, // 21511K {0.255039159, 0.255696288}, // 21512K {0.255038299, 0.255695109}, // 21513K {0.255037438, 0.25569393}, // 21514K {0.255036577, 0.255692751}, // 21515K {0.255035717, 0.255691572}, // 21516K {0.255034857, 0.255690393}, // 21517K {0.255033996, 0.255689214}, // 21518K {0.255033136, 0.255688036}, // 21519K {0.255032276, 0.255686857}, // 21520K {0.255031416, 0.255685679}, // 21521K {0.255030556, 0.255684501}, // 21522K {0.255029697, 0.255683323}, // 21523K {0.255028837, 0.255682145}, // 21524K {0.255027977, 0.255680967}, // 21525K {0.255027118, 0.25567979}, // 21526K {0.255026259, 0.255678612}, // 21527K {0.255025399, 0.255677435}, // 21528K {0.25502454, 0.255676258}, // 21529K {0.255023681, 0.25567508}, // 21530K {0.255022822, 0.255673903}, // 21531K {0.255021963, 0.255672726}, // 21532K {0.255021104, 0.25567155}, // 21533K {0.255020245, 0.255670373}, // 21534K {0.255019387, 0.255669197}, // 21535K {0.255018528, 0.25566802}, // 21536K {0.25501767, 0.255666844}, // 21537K {0.255016811, 0.255665668}, // 21538K {0.255015953, 0.255664492}, // 21539K {0.255015095, 0.255663316}, // 21540K {0.255014237, 0.25566214}, // 21541K {0.255013379, 0.255660964}, // 21542K {0.255012521, 0.255659789}, // 21543K {0.255011663, 0.255658613}, // 21544K {0.255010806, 0.255657438}, // 21545K {0.255009948, 0.255656263}, // 21546K {0.255009091, 0.255655088}, // 21547K {0.255008233, 0.255653913}, // 21548K {0.255007376, 0.255652738}, // 21549K {0.255006519, 0.255651563}, // 21550K {0.255005661, 0.255650389}, // 21551K {0.255004804, 0.255649214}, // 21552K {0.255003947, 0.25564804}, // 21553K {0.255003091, 0.255646866}, // 21554K {0.255002234, 0.255645692}, // 21555K {0.255001377, 0.255644518}, // 21556K {0.255000521, 0.255643344}, // 21557K {0.254999664, 0.25564217}, // 21558K {0.254998808, 0.255640997}, // 21559K {0.254997952, 0.255639823}, // 21560K {0.254997095, 0.25563865}, // 21561K {0.254996239, 0.255637477}, // 21562K {0.254995383, 0.255636304}, // 21563K {0.254994527, 0.255635131}, // 21564K {0.254993671, 0.255633958}, // 21565K {0.254992816, 0.255632785}, // 21566K {0.25499196, 0.255631613}, // 21567K {0.254991105, 0.25563044}, // 21568K {0.254990249, 0.255629268}, // 21569K {0.254989394, 0.255628096}, // 21570K {0.254988539, 0.255626924}, // 21571K {0.254987683, 0.255625752}, // 21572K {0.254986828, 0.25562458}, // 21573K {0.254985973, 0.255623408}, // 21574K {0.254985119, 0.255622237}, // 21575K {0.254984264, 0.255621065}, // 21576K {0.254983409, 0.255619894}, // 21577K {0.254982554, 0.255618722}, // 21578K {0.2549817, 0.255617551}, // 21579K {0.254980846, 0.25561638}, // 21580K {0.254979991, 0.255615209}, // 21581K {0.254979137, 0.255614039}, // 21582K {0.254978283, 0.255612868}, // 21583K {0.254977429, 0.255611698}, // 21584K {0.254976575, 0.255610527}, // 21585K {0.254975721, 0.255609357}, // 21586K {0.254974867, 0.255608187}, // 21587K {0.254974014, 0.255607017}, // 21588K {0.25497316, 0.255605847}, // 21589K {0.254972307, 0.255604677}, // 21590K {0.254971453, 0.255603508}, // 21591K {0.2549706, 0.255602338}, // 21592K {0.254969747, 0.255601169}, // 21593K {0.254968894, 0.255599999}, // 21594K {0.254968041, 0.25559883}, // 21595K {0.254967188, 0.255597661}, // 21596K {0.254966335, 0.255596492}, // 21597K {0.254965482, 0.255595323}, // 21598K {0.25496463, 0.255594155}, // 21599K {0.254963777, 0.255592986}, // 21600K {0.254962925, 0.255591818}, // 21601K {0.254962072, 0.25559065}, // 21602K {0.25496122, 0.255589481}, // 21603K {0.254960368, 0.255588313}, // 21604K {0.254959516, 0.255587145}, // 21605K {0.254958664, 0.255585978}, // 21606K {0.254957812, 0.25558481}, // 21607K {0.25495696, 0.255583642}, // 21608K {0.254956108, 0.255582475}, // 21609K {0.254955257, 0.255581308}, // 21610K {0.254954405, 0.25558014}, // 21611K {0.254953554, 0.255578973}, // 21612K {0.254952702, 0.255577806}, // 21613K {0.254951851, 0.25557664}, // 21614K {0.254951, 0.255575473}, // 21615K {0.254950149, 0.255574306}, // 21616K {0.254949298, 0.25557314}, // 21617K {0.254948447, 0.255571973}, // 21618K {0.254947596, 0.255570807}, // 21619K {0.254946746, 0.255569641}, // 21620K {0.254945895, 0.255568475}, // 21621K {0.254945045, 0.255567309}, // 21622K {0.254944194, 0.255566143}, // 21623K {0.254943344, 0.255564978}, // 21624K {0.254942494, 0.255563812}, // 21625K {0.254941644, 0.255562647}, // 21626K {0.254940794, 0.255561482}, // 21627K {0.254939944, 0.255560317}, // 21628K {0.254939094, 0.255559152}, // 21629K {0.254938244, 0.255557987}, // 21630K {0.254937394, 0.255556822}, // 21631K {0.254936545, 0.255555657}, // 21632K {0.254935695, 0.255554493}, // 21633K {0.254934846, 0.255553328}, // 21634K {0.254933997, 0.255552164}, // 21635K {0.254933148, 0.255551}, // 21636K {0.254932299, 0.255549836}, // 21637K {0.25493145, 0.255548672}, // 21638K {0.254930601, 0.255547508}, // 21639K {0.254929752, 0.255546345}, // 21640K {0.254928903, 0.255545181}, // 21641K {0.254928054, 0.255544018}, // 21642K {0.254927206, 0.255542854}, // 21643K {0.254926357, 0.255541691}, // 21644K {0.254925509, 0.255540528}, // 21645K {0.254924661, 0.255539365}, // 21646K {0.254923813, 0.255538202}, // 21647K {0.254922965, 0.25553704}, // 21648K {0.254922117, 0.255535877}, // 21649K {0.254921269, 0.255534715}, // 21650K {0.254920421, 0.255533552}, // 21651K {0.254919573, 0.25553239}, // 21652K {0.254918726, 0.255531228}, // 21653K {0.254917878, 0.255530066}, // 21654K {0.254917031, 0.255528904}, // 21655K {0.254916183, 0.255527742}, // 21656K {0.254915336, 0.255526581}, // 21657K {0.254914489, 0.255525419}, // 21658K {0.254913642, 0.255524258}, // 21659K {0.254912795, 0.255523097}, // 21660K {0.254911948, 0.255521936}, // 21661K {0.254911101, 0.255520775}, // 21662K {0.254910254, 0.255519614}, // 21663K {0.254909408, 0.255518453}, // 21664K {0.254908561, 0.255517292}, // 21665K {0.254907715, 0.255516132}, // 21666K {0.254906869, 0.255514971}, // 21667K {0.254906022, 0.255513811}, // 21668K {0.254905176, 0.255512651}, // 21669K {0.25490433, 0.255511491}, // 21670K {0.254903484, 0.255510331}, // 21671K {0.254902638, 0.255509171}, // 21672K {0.254901793, 0.255508012}, // 21673K {0.254900947, 0.255506852}, // 21674K {0.254900101, 0.255505693}, // 21675K {0.254899256, 0.255504533}, // 21676K {0.254898411, 0.255503374}, // 21677K {0.254897565, 0.255502215}, // 21678K {0.25489672, 0.255501056}, // 21679K {0.254895875, 0.255499897}, // 21680K {0.25489503, 0.255498739}, // 21681K {0.254894185, 0.25549758}, // 21682K {0.25489334, 0.255496422}, // 21683K {0.254892495, 0.255495263}, // 21684K {0.254891651, 0.255494105}, // 21685K {0.254890806, 0.255492947}, // 21686K {0.254889962, 0.255491789}, // 21687K {0.254889117, 0.255490631}, // 21688K {0.254888273, 0.255489473}, // 21689K {0.254887429, 0.255488316}, // 21690K {0.254886585, 0.255487158}, // 21691K {0.254885741, 0.255486001}, // 21692K {0.254884897, 0.255484844}, // 21693K {0.254884053, 0.255483686}, // 21694K {0.254883209, 0.255482529}, // 21695K {0.254882365, 0.255481372}, // 21696K {0.254881522, 0.255480216}, // 21697K {0.254880678, 0.255479059}, // 21698K {0.254879835, 0.255477903}, // 21699K {0.254878992, 0.255476746}, // 21700K {0.254878149, 0.25547559}, // 21701K {0.254877305, 0.255474434}, // 21702K {0.254876462, 0.255473278}, // 21703K {0.25487562, 0.255472122}, // 21704K {0.254874777, 0.255470966}, // 21705K {0.254873934, 0.25546981}, // 21706K {0.254873091, 0.255468655}, // 21707K {0.254872249, 0.255467499}, // 21708K {0.254871406, 0.255466344}, // 21709K {0.254870564, 0.255465189}, // 21710K {0.254869722, 0.255464033}, // 21711K {0.254868879, 0.255462879}, // 21712K {0.254868037, 0.255461724}, // 21713K {0.254867195, 0.255460569}, // 21714K {0.254866353, 0.255459414}, // 21715K {0.254865512, 0.25545826}, // 21716K {0.25486467, 0.255457105}, // 21717K {0.254863828, 0.255455951}, // 21718K {0.254862987, 0.255454797}, // 21719K {0.254862145, 0.255453643}, // 21720K {0.254861304, 0.255452489}, // 21721K {0.254860463, 0.255451335}, // 21722K {0.254859622, 0.255450182}, // 21723K {0.25485878, 0.255449028}, // 21724K {0.254857939, 0.255447875}, // 21725K {0.254857099, 0.255446722}, // 21726K {0.254856258, 0.255445568}, // 21727K {0.254855417, 0.255444415}, // 21728K {0.254854576, 0.255443262}, // 21729K {0.254853736, 0.25544211}, // 21730K {0.254852895, 0.255440957}, // 21731K {0.254852055, 0.255439804}, // 21732K {0.254851215, 0.255438652}, // 21733K {0.254850375, 0.2554375}, // 21734K {0.254849535, 0.255436347}, // 21735K {0.254848695, 0.255435195}, // 21736K {0.254847855, 0.255434043}, // 21737K {0.254847015, 0.255432891}, // 21738K {0.254846175, 0.25543174}, // 21739K {0.254845336, 0.255430588}, // 21740K {0.254844496, 0.255429437}, // 21741K {0.254843657, 0.255428285}, // 21742K {0.254842817, 0.255427134}, // 21743K {0.254841978, 0.255425983}, // 21744K {0.254841139, 0.255424832}, // 21745K {0.2548403, 0.255423681}, // 21746K {0.254839461, 0.25542253}, // 21747K {0.254838622, 0.255421379}, // 21748K {0.254837783, 0.255420229}, // 21749K {0.254836944, 0.255419078}, // 21750K {0.254836106, 0.255417928}, // 21751K {0.254835267, 0.255416778}, // 21752K {0.254834429, 0.255415628}, // 21753K {0.25483359, 0.255414478}, // 21754K {0.254832752, 0.255413328}, // 21755K {0.254831914, 0.255412178}, // 21756K {0.254831076, 0.255411029}, // 21757K {0.254830238, 0.255409879}, // 21758K {0.2548294, 0.25540873}, // 21759K {0.254828562, 0.255407581}, // 21760K {0.254827725, 0.255406432}, // 21761K {0.254826887, 0.255405283}, // 21762K {0.254826049, 0.255404134}, // 21763K {0.254825212, 0.255402985}, // 21764K {0.254824375, 0.255401837}, // 21765K {0.254823537, 0.255400688}, // 21766K {0.2548227, 0.25539954}, // 21767K {0.254821863, 0.255398391}, // 21768K {0.254821026, 0.255397243}, // 21769K {0.254820189, 0.255396095}, // 21770K {0.254819352, 0.255394947}, // 21771K {0.254818516, 0.255393799}, // 21772K {0.254817679, 0.255392652}, // 21773K {0.254816843, 0.255391504}, // 21774K {0.254816006, 0.255390357}, // 21775K {0.25481517, 0.25538921}, // 21776K {0.254814334, 0.255388062}, // 21777K {0.254813497, 0.255386915}, // 21778K {0.254812661, 0.255385768}, // 21779K {0.254811825, 0.255384621}, // 21780K {0.254810989, 0.255383475}, // 21781K {0.254810154, 0.255382328}, // 21782K {0.254809318, 0.255381182}, // 21783K {0.254808482, 0.255380035}, // 21784K {0.254807647, 0.255378889}, // 21785K {0.254806811, 0.255377743}, // 21786K {0.254805976, 0.255376597}, // 21787K {0.254805141, 0.255375451}, // 21788K {0.254804306, 0.255374305}, // 21789K {0.25480347, 0.25537316}, // 21790K {0.254802635, 0.255372014}, // 21791K {0.254801801, 0.255370869}, // 21792K {0.254800966, 0.255369723}, // 21793K {0.254800131, 0.255368578}, // 21794K {0.254799296, 0.255367433}, // 21795K {0.254798462, 0.255366288}, // 21796K {0.254797627, 0.255365143}, // 21797K {0.254796793, 0.255363999}, // 21798K {0.254795959, 0.255362854}, // 21799K {0.254795125, 0.25536171}, // 21800K {0.254794291, 0.255360565}, // 21801K {0.254793457, 0.255359421}, // 21802K {0.254792623, 0.255358277}, // 21803K {0.254791789, 0.255357133}, // 21804K {0.254790955, 0.255355989}, // 21805K {0.254790122, 0.255354845}, // 21806K {0.254789288, 0.255353702}, // 21807K {0.254788455, 0.255352558}, // 21808K {0.254787621, 0.255351415}, // 21809K {0.254786788, 0.255350271}, // 21810K {0.254785955, 0.255349128}, // 21811K {0.254785122, 0.255347985}, // 21812K {0.254784289, 0.255346842}, // 21813K {0.254783456, 0.255345699}, // 21814K {0.254782623, 0.255344557}, // 21815K {0.25478179, 0.255343414}, // 21816K {0.254780958, 0.255342272}, // 21817K {0.254780125, 0.255341129}, // 21818K {0.254779292, 0.255339987}, // 21819K {0.25477846, 0.255338845}, // 21820K {0.254777628, 0.255337703}, // 21821K {0.254776796, 0.255336561}, // 21822K {0.254775964, 0.255335419}, // 21823K {0.254775132, 0.255334278}, // 21824K {0.2547743, 0.255333136}, // 21825K {0.254773468, 0.255331995}, // 21826K {0.254772636, 0.255330854}, // 21827K {0.254771804, 0.255329713}, // 21828K {0.254770973, 0.255328571}, // 21829K {0.254770141, 0.255327431}, // 21830K {0.25476931, 0.25532629}, // 21831K {0.254768479, 0.255325149}, // 21832K {0.254767648, 0.255324009}, // 21833K {0.254766816, 0.255322868}, // 21834K {0.254765985, 0.255321728}, // 21835K {0.254765154, 0.255320588}, // 21836K {0.254764324, 0.255319447}, // 21837K {0.254763493, 0.255318307}, // 21838K {0.254762662, 0.255317168}, // 21839K {0.254761832, 0.255316028}, // 21840K {0.254761001, 0.255314888}, // 21841K {0.254760171, 0.255313749}, // 21842K {0.25475934, 0.255312609}, // 21843K {0.25475851, 0.25531147}, // 21844K {0.25475768, 0.255310331}, // 21845K {0.25475685, 0.255309192}, // 21846K {0.25475602, 0.255308053}, // 21847K {0.25475519, 0.255306914}, // 21848K {0.254754361, 0.255305776}, // 21849K {0.254753531, 0.255304637}, // 21850K {0.254752701, 0.255303499}, // 21851K {0.254751872, 0.25530236}, // 21852K {0.254751042, 0.255301222}, // 21853K {0.254750213, 0.255300084}, // 21854K {0.254749384, 0.255298946}, // 21855K {0.254748555, 0.255297808}, // 21856K {0.254747726, 0.25529667}, // 21857K {0.254746897, 0.255295533}, // 21858K {0.254746068, 0.255294395}, // 21859K {0.254745239, 0.255293258}, // 21860K {0.25474441, 0.255292121}, // 21861K {0.254743582, 0.255290983}, // 21862K {0.254742753, 0.255289846}, // 21863K {0.254741925, 0.255288709}, // 21864K {0.254741097, 0.255287573}, // 21865K {0.254740268, 0.255286436}, // 21866K {0.25473944, 0.255285299}, // 21867K {0.254738612, 0.255284163}, // 21868K {0.254737784, 0.255283027}, // 21869K {0.254736956, 0.25528189}, // 21870K {0.254736128, 0.255280754}, // 21871K {0.254735301, 0.255279618}, // 21872K {0.254734473, 0.255278482}, // 21873K {0.254733646, 0.255277347}, // 21874K {0.254732818, 0.255276211}, // 21875K {0.254731991, 0.255275076}, // 21876K {0.254731164, 0.25527394}, // 21877K {0.254730336, 0.255272805}, // 21878K {0.254729509, 0.25527167}, // 21879K {0.254728682, 0.255270535}, // 21880K {0.254727855, 0.2552694}, // 21881K {0.254727029, 0.255268265}, // 21882K {0.254726202, 0.25526713}, // 21883K {0.254725375, 0.255265996}, // 21884K {0.254724549, 0.255264861}, // 21885K {0.254723722, 0.255263727}, // 21886K {0.254722896, 0.255262593}, // 21887K {0.25472207, 0.255261459}, // 21888K {0.254721243, 0.255260325}, // 21889K {0.254720417, 0.255259191}, // 21890K {0.254719591, 0.255258057}, // 21891K {0.254718765, 0.255256923}, // 21892K {0.25471794, 0.25525579}, // 21893K {0.254717114, 0.255254656}, // 21894K {0.254716288, 0.255253523}, // 21895K {0.254715463, 0.25525239}, // 21896K {0.254714637, 0.255251257}, // 21897K {0.254713812, 0.255250124}, // 21898K {0.254712986, 0.255248991}, // 21899K {0.254712161, 0.255247859}, // 21900K {0.254711336, 0.255246726}, // 21901K {0.254710511, 0.255245593}, // 21902K {0.254709686, 0.255244461}, // 21903K {0.254708861, 0.255243329}, // 21904K {0.254708037, 0.255242197}, // 21905K {0.254707212, 0.255241065}, // 21906K {0.254706387, 0.255239933}, // 21907K {0.254705563, 0.255238801}, // 21908K {0.254704738, 0.255237669}, // 21909K {0.254703914, 0.255236538}, // 21910K {0.25470309, 0.255235407}, // 21911K {0.254702266, 0.255234275}, // 21912K {0.254701442, 0.255233144}, // 21913K {0.254700618, 0.255232013}, // 21914K {0.254699794, 0.255230882}, // 21915K {0.25469897, 0.255229751}, // 21916K {0.254698146, 0.25522862}, // 21917K {0.254697323, 0.25522749}, // 21918K {0.254696499, 0.255226359}, // 21919K {0.254695676, 0.255225229}, // 21920K {0.254694852, 0.255224099}, // 21921K {0.254694029, 0.255222969}, // 21922K {0.254693206, 0.255221839}, // 21923K {0.254692383, 0.255220709}, // 21924K {0.25469156, 0.255219579}, // 21925K {0.254690737, 0.255218449}, // 21926K {0.254689914, 0.25521732}, // 21927K {0.254689092, 0.25521619}, // 21928K {0.254688269, 0.255215061}, // 21929K {0.254687446, 0.255213932}, // 21930K {0.254686624, 0.255212803}, // 21931K {0.254685802, 0.255211674}, // 21932K {0.254684979, 0.255210545}, // 21933K {0.254684157, 0.255209416}, // 21934K {0.254683335, 0.255208287}, // 21935K {0.254682513, 0.255207159}, // 21936K {0.254681691, 0.255206031}, // 21937K {0.254680869, 0.255204902}, // 21938K {0.254680047, 0.255203774}, // 21939K {0.254679226, 0.255202646}, // 21940K {0.254678404, 0.255201518}, // 21941K {0.254677583, 0.25520039}, // 21942K {0.254676761, 0.255199263}, // 21943K {0.25467594, 0.255198135}, // 21944K {0.254675119, 0.255197008}, // 21945K {0.254674298, 0.25519588}, // 21946K {0.254673477, 0.255194753}, // 21947K {0.254672656, 0.255193626}, // 21948K {0.254671835, 0.255192499}, // 21949K {0.254671014, 0.255191372}, // 21950K {0.254670193, 0.255190245}, // 21951K {0.254669373, 0.255189119}, // 21952K {0.254668552, 0.255187992}, // 21953K {0.254667732, 0.255186866}, // 21954K {0.254666911, 0.255185739}, // 21955K {0.254666091, 0.255184613}, // 21956K {0.254665271, 0.255183487}, // 21957K {0.254664451, 0.255182361}, // 21958K {0.254663631, 0.255181235}, // 21959K {0.254662811, 0.25518011}, // 21960K {0.254661991, 0.255178984}, // 21961K {0.254661172, 0.255177859}, // 21962K {0.254660352, 0.255176733}, // 21963K {0.254659532, 0.255175608}, // 21964K {0.254658713, 0.255174483}, // 21965K {0.254657894, 0.255173358}, // 21966K {0.254657074, 0.255172233}, // 21967K {0.254656255, 0.255171108}, // 21968K {0.254655436, 0.255169983}, // 21969K {0.254654617, 0.255168859}, // 21970K {0.254653798, 0.255167734}, // 21971K {0.254652979, 0.25516661}, // 21972K {0.25465216, 0.255165486}, // 21973K {0.254651342, 0.255164362}, // 21974K {0.254650523, 0.255163238}, // 21975K {0.254649705, 0.255162114}, // 21976K {0.254648886, 0.25516099}, // 21977K {0.254648068, 0.255159866}, // 21978K {0.25464725, 0.255158743}, // 21979K {0.254646432, 0.255157619}, // 21980K {0.254645614, 0.255156496}, // 21981K {0.254644796, 0.255155373}, // 21982K {0.254643978, 0.25515425}, // 21983K {0.25464316, 0.255153127}, // 21984K {0.254642342, 0.255152004}, // 21985K {0.254641525, 0.255150881}, // 21986K {0.254640707, 0.255149759}, // 21987K {0.25463989, 0.255148636}, // 21988K {0.254639072, 0.255147514}, // 21989K {0.254638255, 0.255146392}, // 21990K {0.254637438, 0.255145269}, // 21991K {0.254636621, 0.255144147}, // 21992K {0.254635804, 0.255143026}, // 21993K {0.254634987, 0.255141904}, // 21994K {0.25463417, 0.255140782}, // 21995K {0.254633353, 0.25513966}, // 21996K {0.254632537, 0.255138539}, // 21997K {0.25463172, 0.255137418}, // 21998K {0.254630904, 0.255136296}, // 21999K {0.254630087, 0.255135175}, // 22000K {0.254629271, 0.255134054}, // 22001K {0.254628455, 0.255132933}, // 22002K {0.254627639, 0.255131813}, // 22003K {0.254626823, 0.255130692}, // 22004K {0.254626007, 0.255129572}, // 22005K {0.254625191, 0.255128451}, // 22006K {0.254624375, 0.255127331}, // 22007K {0.25462356, 0.255126211}, // 22008K {0.254622744, 0.255125091}, // 22009K {0.254621928, 0.255123971}, // 22010K {0.254621113, 0.255122851}, // 22011K {0.254620298, 0.255121731}, // 22012K {0.254619482, 0.255120611}, // 22013K {0.254618667, 0.255119492}, // 22014K {0.254617852, 0.255118373}, // 22015K {0.254617037, 0.255117253}, // 22016K {0.254616222, 0.255116134}, // 22017K {0.254615408, 0.255115015}, // 22018K {0.254614593, 0.255113896}, // 22019K {0.254613778, 0.255112777}, // 22020K {0.254612964, 0.255111659}, // 22021K {0.254612149, 0.25511054}, // 22022K {0.254611335, 0.255109422}, // 22023K {0.254610521, 0.255108303}, // 22024K {0.254609706, 0.255107185}, // 22025K {0.254608892, 0.255106067}, // 22026K {0.254608078, 0.255104949}, // 22027K {0.254607264, 0.255103831}, // 22028K {0.25460645, 0.255102713}, // 22029K {0.254605637, 0.255101596}, // 22030K {0.254604823, 0.255100478}, // 22031K {0.254604009, 0.255099361}, // 22032K {0.254603196, 0.255098243}, // 22033K {0.254602382, 0.255097126}, // 22034K {0.254601569, 0.255096009}, // 22035K {0.254600756, 0.255094892}, // 22036K {0.254599943, 0.255093775}, // 22037K {0.25459913, 0.255092658}, // 22038K {0.254598317, 0.255091542}, // 22039K {0.254597504, 0.255090425}, // 22040K {0.254596691, 0.255089309}, // 22041K {0.254595878, 0.255088192}, // 22042K {0.254595066, 0.255087076}, // 22043K {0.254594253, 0.25508596}, // 22044K {0.254593441, 0.255084844}, // 22045K {0.254592628, 0.255083728}, // 22046K {0.254591816, 0.255082613}, // 22047K {0.254591004, 0.255081497}, // 22048K {0.254590192, 0.255080382}, // 22049K {0.25458938, 0.255079266}, // 22050K {0.254588568, 0.255078151}, // 22051K {0.254587756, 0.255077036}, // 22052K {0.254586944, 0.255075921}, // 22053K {0.254586133, 0.255074806}, // 22054K {0.254585321, 0.255073691}, // 22055K {0.254584509, 0.255072576}, // 22056K {0.254583698, 0.255071462}, // 22057K {0.254582887, 0.255070347}, // 22058K {0.254582075, 0.255069233}, // 22059K {0.254581264, 0.255068119}, // 22060K {0.254580453, 0.255067005}, // 22061K {0.254579642, 0.255065891}, // 22062K {0.254578831, 0.255064777}, // 22063K {0.254578021, 0.255063663}, // 22064K {0.25457721, 0.255062549}, // 22065K {0.254576399, 0.255061436}, // 22066K {0.254575589, 0.255060322}, // 22067K {0.254574778, 0.255059209}, // 22068K {0.254573968, 0.255058096}, // 22069K {0.254573158, 0.255056983}, // 22070K {0.254572347, 0.25505587}, // 22071K {0.254571537, 0.255054757}, // 22072K {0.254570727, 0.255053644}, // 22073K {0.254569917, 0.255052531}, // 22074K {0.254569107, 0.255051419}, // 22075K {0.254568298, 0.255050307}, // 22076K {0.254567488, 0.255049194}, // 22077K {0.254566678, 0.255048082}, // 22078K {0.254565869, 0.25504697}, // 22079K {0.254565059, 0.255045858}, // 22080K {0.25456425, 0.255044746}, // 22081K {0.254563441, 0.255043634}, // 22082K {0.254562632, 0.255042523}, // 22083K {0.254561823, 0.255041411}, // 22084K {0.254561014, 0.2550403}, // 22085K {0.254560205, 0.255039189}, // 22086K {0.254559396, 0.255038077}, // 22087K {0.254558587, 0.255036966}, // 22088K {0.254557779, 0.255035855}, // 22089K {0.25455697, 0.255034745}, // 22090K {0.254556162, 0.255033634}, // 22091K {0.254555353, 0.255032523}, // 22092K {0.254554545, 0.255031413}, // 22093K {0.254553737, 0.255030303}, // 22094K {0.254552929, 0.255029192}, // 22095K {0.254552121, 0.255028082}, // 22096K {0.254551313, 0.255026972}, // 22097K {0.254550505, 0.255025862}, // 22098K {0.254549697, 0.255024752}, // 22099K {0.254548889, 0.255023643}, // 22100K {0.254548082, 0.255022533}, // 22101K {0.254547274, 0.255021424}, // 22102K {0.254546467, 0.255020314}, // 22103K {0.254545659, 0.255019205}, // 22104K {0.254544852, 0.255018096}, // 22105K {0.254544045, 0.255016987}, // 22106K {0.254543238, 0.255015878}, // 22107K {0.254542431, 0.255014769}, // 22108K {0.254541624, 0.255013661}, // 22109K {0.254540817, 0.255012552}, // 22110K {0.25454001, 0.255011444}, // 22111K {0.254539204, 0.255010335}, // 22112K {0.254538397, 0.255009227}, // 22113K {0.254537591, 0.255008119}, // 22114K {0.254536784, 0.255007011}, // 22115K {0.254535978, 0.255005903}, // 22116K {0.254535172, 0.255004795}, // 22117K {0.254534366, 0.255003688}, // 22118K {0.254533559, 0.25500258}, // 22119K {0.254532754, 0.255001473}, // 22120K {0.254531948, 0.255000365}, // 22121K {0.254531142, 0.254999258}, // 22122K {0.254530336, 0.254998151}, // 22123K {0.25452953, 0.254997044}, // 22124K {0.254528725, 0.254995937}, // 22125K {0.254527919, 0.254994831}, // 22126K {0.254527114, 0.254993724}, // 22127K {0.254526309, 0.254992617}, // 22128K {0.254525504, 0.254991511}, // 22129K {0.254524699, 0.254990405}, // 22130K {0.254523893, 0.254989298}, // 22131K {0.254523089, 0.254988192}, // 22132K {0.254522284, 0.254987086}, // 22133K {0.254521479, 0.254985981}, // 22134K {0.254520674, 0.254984875}, // 22135K {0.25451987, 0.254983769}, // 22136K {0.254519065, 0.254982664}, // 22137K {0.254518261, 0.254981558}, // 22138K {0.254517456, 0.254980453}, // 22139K {0.254516652, 0.254979348}, // 22140K {0.254515848, 0.254978243}, // 22141K {0.254515044, 0.254977138}, // 22142K {0.25451424, 0.254976033}, // 22143K {0.254513436, 0.254974928}, // 22144K {0.254512632, 0.254973824}, // 22145K {0.254511828, 0.254972719}, // 22146K {0.254511025, 0.254971615}, // 22147K {0.254510221, 0.254970511}, // 22148K {0.254509418, 0.254969406}, // 22149K {0.254508614, 0.254968302}, // 22150K {0.254507811, 0.254967199}, // 22151K {0.254507008, 0.254966095}, // 22152K {0.254506205, 0.254964991}, // 22153K {0.254505402, 0.254963887}, // 22154K {0.254504599, 0.254962784}, // 22155K {0.254503796, 0.254961681}, // 22156K {0.254502993, 0.254960577}, // 22157K {0.25450219, 0.254959474}, // 22158K {0.254501388, 0.254958371}, // 22159K {0.254500585, 0.254957268}, // 22160K {0.254499783, 0.254956165}, // 22161K {0.25449898, 0.254955063}, // 22162K {0.254498178, 0.25495396}, // 22163K {0.254497376, 0.254952858}, // 22164K {0.254496574, 0.254951755}, // 22165K {0.254495772, 0.254950653}, // 22166K {0.25449497, 0.254949551}, // 22167K {0.254494168, 0.254948449}, // 22168K {0.254493366, 0.254947347}, // 22169K {0.254492564, 0.254946245}, // 22170K {0.254491763, 0.254945144}, // 22171K {0.254490961, 0.254944042}, // 22172K {0.25449016, 0.254942941}, // 22173K {0.254489358, 0.254941839}, // 22174K {0.254488557, 0.254940738}, // 22175K {0.254487756, 0.254939637}, // 22176K {0.254486955, 0.254938536}, // 22177K {0.254486154, 0.254937435}, // 22178K {0.254485353, 0.254936334}, // 22179K {0.254484552, 0.254935233}, // 22180K {0.254483751, 0.254934133}, // 22181K {0.254482951, 0.254933032}, // 22182K {0.25448215, 0.254931932}, // 22183K {0.25448135, 0.254930832}, // 22184K {0.254480549, 0.254929732}, // 22185K {0.254479749, 0.254928632}, // 22186K {0.254478949, 0.254927532}, // 22187K {0.254478148, 0.254926432}, // 22188K {0.254477348, 0.254925332}, // 22189K {0.254476548, 0.254924233}, // 22190K {0.254475748, 0.254923133}, // 22191K {0.254474949, 0.254922034}, // 22192K {0.254474149, 0.254920935}, // 22193K {0.254473349, 0.254919836}, // 22194K {0.25447255, 0.254918737}, // 22195K {0.25447175, 0.254917638}, // 22196K {0.254470951, 0.254916539}, // 22197K {0.254470152, 0.25491544}, // 22198K {0.254469352, 0.254914342}, // 22199K {0.254468553, 0.254913243}, // 22200K {0.254467754, 0.254912145}, // 22201K {0.254466955, 0.254911047}, // 22202K {0.254466156, 0.254909949}, // 22203K {0.254465357, 0.254908851}, // 22204K {0.254464559, 0.254907753}, // 22205K {0.25446376, 0.254906655}, // 22206K {0.254462962, 0.254905558}, // 22207K {0.254462163, 0.25490446}, // 22208K {0.254461365, 0.254903363}, // 22209K {0.254460566, 0.254902265}, // 22210K {0.254459768, 0.254901168}, // 22211K {0.25445897, 0.254900071}, // 22212K {0.254458172, 0.254898974}, // 22213K {0.254457374, 0.254897877}, // 22214K {0.254456576, 0.25489678}, // 22215K {0.254455778, 0.254895684}, // 22216K {0.254454981, 0.254894587}, // 22217K {0.254454183, 0.254893491}, // 22218K {0.254453386, 0.254892394}, // 22219K {0.254452588, 0.254891298}, // 22220K {0.254451791, 0.254890202}, // 22221K {0.254450994, 0.254889106}, // 22222K {0.254450196, 0.25488801}, // 22223K {0.254449399, 0.254886914}, // 22224K {0.254448602, 0.254885819}, // 22225K {0.254447805, 0.254884723}, // 22226K {0.254447008, 0.254883628}, // 22227K {0.254446212, 0.254882533}, // 22228K {0.254445415, 0.254881437}, // 22229K {0.254444618, 0.254880342}, // 22230K {0.254443822, 0.254879247}, // 22231K {0.254443025, 0.254878152}, // 22232K {0.254442229, 0.254877058}, // 22233K {0.254441433, 0.254875963}, // 22234K {0.254440637, 0.254874868}, // 22235K {0.254439841, 0.254873774}, // 22236K {0.254439045, 0.25487268}, // 22237K {0.254438249, 0.254871585}, // 22238K {0.254437453, 0.254870491}, // 22239K {0.254436657, 0.254869397}, // 22240K {0.254435861, 0.254868304}, // 22241K {0.254435066, 0.25486721}, // 22242K {0.25443427, 0.254866116}, // 22243K {0.254433475, 0.254865023}, // 22244K {0.25443268, 0.254863929}, // 22245K {0.254431884, 0.254862836}, // 22246K {0.254431089, 0.254861743}, // 22247K {0.254430294, 0.25486065}, // 22248K {0.254429499, 0.254859557}, // 22249K {0.254428704, 0.254858464}, // 22250K {0.254427909, 0.254857371}, // 22251K {0.254427115, 0.254856278}, // 22252K {0.25442632, 0.254855186}, // 22253K {0.254425525, 0.254854093}, // 22254K {0.254424731, 0.254853001}, // 22255K {0.254423937, 0.254851909}, // 22256K {0.254423142, 0.254850817}, // 22257K {0.254422348, 0.254849725}, // 22258K {0.254421554, 0.254848633}, // 22259K {0.25442076, 0.254847541}, // 22260K {0.254419966, 0.254846449}, // 22261K {0.254419172, 0.254845358}, // 22262K {0.254418378, 0.254844266}, // 22263K {0.254417584, 0.254843175}, // 22264K {0.254416791, 0.254842084}, // 22265K {0.254415997, 0.254840993}, // 22266K {0.254415204, 0.254839902}, // 22267K {0.25441441, 0.254838811}, // 22268K {0.254413617, 0.25483772}, // 22269K {0.254412824, 0.254836629}, // 22270K {0.254412031, 0.254835539}, // 22271K {0.254411237, 0.254834448}, // 22272K {0.254410444, 0.254833358}, // 22273K {0.254409652, 0.254832268}, // 22274K {0.254408859, 0.254831178}, // 22275K {0.254408066, 0.254830088}, // 22276K {0.254407273, 0.254828998}, // 22277K {0.254406481, 0.254827908}, // 22278K {0.254405688, 0.254826818}, // 22279K {0.254404896, 0.254825729}, // 22280K {0.254404104, 0.254824639}, // 22281K {0.254403311, 0.25482355}, // 22282K {0.254402519, 0.254822461}, // 22283K {0.254401727, 0.254821372}, // 22284K {0.254400935, 0.254820283}, // 22285K {0.254400143, 0.254819194}, // 22286K {0.254399352, 0.254818105}, // 22287K {0.25439856, 0.254817016}, // 22288K {0.254397768, 0.254815928}, // 22289K {0.254396977, 0.254814839}, // 22290K {0.254396185, 0.254813751}, // 22291K {0.254395394, 0.254812663}, // 22292K {0.254394603, 0.254811575}, // 22293K {0.254393811, 0.254810487}, // 22294K {0.25439302, 0.254809399}, // 22295K {0.254392229, 0.254808311}, // 22296K {0.254391438, 0.254807223}, // 22297K {0.254390647, 0.254806136}, // 22298K {0.254389856, 0.254805048}, // 22299K {0.254389066, 0.254803961}, // 22300K {0.254388275, 0.254802874}, // 22301K {0.254387485, 0.254801787}, // 22302K {0.254386694, 0.2548007}, // 22303K {0.254385904, 0.254799613}, // 22304K {0.254385113, 0.254798526}, // 22305K {0.254384323, 0.254797439}, // 22306K {0.254383533, 0.254796353}, // 22307K {0.254382743, 0.254795266}, // 22308K {0.254381953, 0.25479418}, // 22309K {0.254381163, 0.254793094}, // 22310K {0.254380373, 0.254792007}, // 22311K {0.254379584, 0.254790921}, // 22312K {0.254378794, 0.254789835}, // 22313K {0.254378005, 0.25478875}, // 22314K {0.254377215, 0.254787664}, // 22315K {0.254376426, 0.254786578}, // 22316K {0.254375636, 0.254785493}, // 22317K {0.254374847, 0.254784407}, // 22318K {0.254374058, 0.254783322}, // 22319K {0.254373269, 0.254782237}, // 22320K {0.25437248, 0.254781152}, // 22321K {0.254371691, 0.254780067}, // 22322K {0.254370902, 0.254778982}, // 22323K {0.254370114, 0.254777898}, // 22324K {0.254369325, 0.254776813}, // 22325K {0.254368536, 0.254775728}, // 22326K {0.254367748, 0.254774644}, // 22327K {0.25436696, 0.25477356}, // 22328K {0.254366171, 0.254772476}, // 22329K {0.254365383, 0.254771392}, // 22330K {0.254364595, 0.254770308}, // 22331K {0.254363807, 0.254769224}, // 22332K {0.254363019, 0.25476814}, // 22333K {0.254362231, 0.254767056}, // 22334K {0.254361443, 0.254765973}, // 22335K {0.254360656, 0.25476489}, // 22336K {0.254359868, 0.254763806}, // 22337K {0.25435908, 0.254762723}, // 22338K {0.254358293, 0.25476164}, // 22339K {0.254357506, 0.254760557}, // 22340K {0.254356718, 0.254759474}, // 22341K {0.254355931, 0.254758391}, // 22342K {0.254355144, 0.254757309}, // 22343K {0.254354357, 0.254756226}, // 22344K {0.25435357, 0.254755144}, // 22345K {0.254352783, 0.254754062}, // 22346K {0.254351996, 0.254752979}, // 22347K {0.254351209, 0.254751897}, // 22348K {0.254350423, 0.254750815}, // 22349K {0.254349636, 0.254749733}, // 22350K {0.25434885, 0.254748652}, // 22351K {0.254348063, 0.25474757}, // 22352K {0.254347277, 0.254746488}, // 22353K {0.254346491, 0.254745407}, // 22354K {0.254345705, 0.254744326}, // 22355K {0.254344919, 0.254743244}, // 22356K {0.254344133, 0.254742163}, // 22357K {0.254343347, 0.254741082}, // 22358K {0.254342561, 0.254740001}, // 22359K {0.254341775, 0.254738921}, // 22360K {0.25434099, 0.25473784}, // 22361K {0.254340204, 0.254736759}, // 22362K {0.254339419, 0.254735679}, // 22363K {0.254338633, 0.254734599}, // 22364K {0.254337848, 0.254733518}, // 22365K {0.254337063, 0.254732438}, // 22366K {0.254336278, 0.254731358}, // 22367K {0.254335493, 0.254730278}, // 22368K {0.254334708, 0.254729199}, // 22369K {0.254333923, 0.254728119}, // 22370K {0.254333138, 0.254727039}, // 22371K {0.254332353, 0.25472596}, // 22372K {0.254331568, 0.254724881}, // 22373K {0.254330784, 0.254723801}, // 22374K {0.254329999, 0.254722722}, // 22375K {0.254329215, 0.254721643}, // 22376K {0.254328431, 0.254720564}, // 22377K {0.254327646, 0.254719485}, // 22378K {0.254326862, 0.254718407}, // 22379K {0.254326078, 0.254717328}, // 22380K {0.254325294, 0.25471625}, // 22381K {0.25432451, 0.254715171}, // 22382K {0.254323726, 0.254714093}, // 22383K {0.254322943, 0.254713015}, // 22384K {0.254322159, 0.254711937}, // 22385K {0.254321376, 0.254710859}, // 22386K {0.254320592, 0.254709781}, // 22387K {0.254319809, 0.254708703}, // 22388K {0.254319025, 0.254707626}, // 22389K {0.254318242, 0.254706548}, // 22390K {0.254317459, 0.254705471}, // 22391K {0.254316676, 0.254704393}, // 22392K {0.254315893, 0.254703316}, // 22393K {0.25431511, 0.254702239}, // 22394K {0.254314327, 0.254701162}, // 22395K {0.254313544, 0.254700085}, // 22396K {0.254312762, 0.254699008}, // 22397K {0.254311979, 0.254697932}, // 22398K {0.254311197, 0.254696855}, // 22399K {0.254310414, 0.254695779}, // 22400K {0.254309632, 0.254694703}, // 22401K {0.25430885, 0.254693626}, // 22402K {0.254308067, 0.25469255}, // 22403K {0.254307285, 0.254691474}, // 22404K {0.254306503, 0.254690398}, // 22405K {0.254305721, 0.254689323}, // 22406K {0.254304939, 0.254688247}, // 22407K {0.254304158, 0.254687171}, // 22408K {0.254303376, 0.254686096}, // 22409K {0.254302594, 0.254685021}, // 22410K {0.254301813, 0.254683945}, // 22411K {0.254301031, 0.25468287}, // 22412K {0.25430025, 0.254681795}, // 22413K {0.254299469, 0.25468072}, // 22414K {0.254298688, 0.254679645}, // 22415K {0.254297907, 0.254678571}, // 22416K {0.254297125, 0.254677496}, // 22417K {0.254296345, 0.254676422}, // 22418K {0.254295564, 0.254675347}, // 22419K {0.254294783, 0.254674273}, // 22420K {0.254294002, 0.254673199}, // 22421K {0.254293222, 0.254672125}, // 22422K {0.254292441, 0.254671051}, // 22423K {0.254291661, 0.254669977}, // 22424K {0.25429088, 0.254668903}, // 22425K {0.2542901, 0.25466783}, // 22426K {0.25428932, 0.254666756}, // 22427K {0.25428854, 0.254665683}, // 22428K {0.25428776, 0.25466461}, // 22429K {0.25428698, 0.254663536}, // 22430K {0.2542862, 0.254662463}, // 22431K {0.25428542, 0.25466139}, // 22432K {0.25428464, 0.254660318}, // 22433K {0.254283861, 0.254659245}, // 22434K {0.254283081, 0.254658172}, // 22435K {0.254282302, 0.2546571}, // 22436K {0.254281522, 0.254656027}, // 22437K {0.254280743, 0.254654955}, // 22438K {0.254279964, 0.254653883}, // 22439K {0.254279185, 0.254652811}, // 22440K {0.254278405, 0.254651739}, // 22441K {0.254277627, 0.254650667}, // 22442K {0.254276848, 0.254649595}, // 22443K {0.254276069, 0.254648523}, // 22444K {0.25427529, 0.254647452}, // 22445K {0.254274511, 0.25464638}, // 22446K {0.254273733, 0.254645309}, // 22447K {0.254272954, 0.254644238}, // 22448K {0.254272176, 0.254643166}, // 22449K {0.254271398, 0.254642095}, // 22450K {0.254270619, 0.254641024}, // 22451K {0.254269841, 0.254639954}, // 22452K {0.254269063, 0.254638883}, // 22453K {0.254268285, 0.254637812}, // 22454K {0.254267507, 0.254636742}, // 22455K {0.254266729, 0.254635672}, // 22456K {0.254265952, 0.254634601}, // 22457K {0.254265174, 0.254633531}, // 22458K {0.254264396, 0.254632461}, // 22459K {0.254263619, 0.254631391}, // 22460K {0.254262841, 0.254630321}, // 22461K {0.254262064, 0.254629252}, // 22462K {0.254261287, 0.254628182}, // 22463K {0.25426051, 0.254627112}, // 22464K {0.254259733, 0.254626043}, // 22465K {0.254258956, 0.254624974}, // 22466K {0.254258179, 0.254623904}, // 22467K {0.254257402, 0.254622835}, // 22468K {0.254256625, 0.254621766}, // 22469K {0.254255848, 0.254620697}, // 22470K {0.254255072, 0.254619629}, // 22471K {0.254254295, 0.25461856}, // 22472K {0.254253519, 0.254617492}, // 22473K {0.254252742, 0.254616423}, // 22474K {0.254251966, 0.254615355}, // 22475K {0.25425119, 0.254614286}, // 22476K {0.254250414, 0.254613218}, // 22477K {0.254249638, 0.25461215}, // 22478K {0.254248862, 0.254611082}, // 22479K {0.254248086, 0.254610015}, // 22480K {0.25424731, 0.254608947}, // 22481K {0.254246534, 0.254607879}, // 22482K {0.254245759, 0.254606812}, // 22483K {0.254244983, 0.254605744}, // 22484K {0.254244208, 0.254604677}, // 22485K {0.254243432, 0.25460361}, // 22486K {0.254242657, 0.254602543}, // 22487K {0.254241882, 0.254601476}, // 22488K {0.254241107, 0.254600409}, // 22489K {0.254240332, 0.254599342}, // 22490K {0.254239557, 0.254598276}, // 22491K {0.254238782, 0.254597209}, // 22492K {0.254238007, 0.254596143}, // 22493K {0.254237232, 0.254595077}, // 22494K {0.254236457, 0.25459401}, // 22495K {0.254235683, 0.254592944}, // 22496K {0.254234908, 0.254591878}, // 22497K {0.254234134, 0.254590812}, // 22498K {0.25423336, 0.254589747}, // 22499K {0.254232585, 0.254588681}, // 22500K {0.254231811, 0.254587615}, // 22501K {0.254231037, 0.25458655}, // 22502K {0.254230263, 0.254585485}, // 22503K {0.254229489, 0.254584419}, // 22504K {0.254228715, 0.254583354}, // 22505K {0.254227941, 0.254582289}, // 22506K {0.254227168, 0.254581224}, // 22507K {0.254226394, 0.25458016}, // 22508K {0.254225621, 0.254579095}, // 22509K {0.254224847, 0.25457803}, // 22510K {0.254224074, 0.254576966}, // 22511K {0.254223301, 0.254575901}, // 22512K {0.254222527, 0.254574837}, // 22513K {0.254221754, 0.254573773}, // 22514K {0.254220981, 0.254572709}, // 22515K {0.254220208, 0.254571645}, // 22516K {0.254219435, 0.254570581}, // 22517K {0.254218663, 0.254569517}, // 22518K {0.25421789, 0.254568454}, // 22519K {0.254217117, 0.25456739}, // 22520K {0.254216345, 0.254566327}, // 22521K {0.254215572, 0.254565263}, // 22522K {0.2542148, 0.2545642}, // 22523K {0.254214027, 0.254563137}, // 22524K {0.254213255, 0.254562074}, // 22525K {0.254212483, 0.254561011}, // 22526K {0.254211711, 0.254559948}, // 22527K {0.254210939, 0.254558886}, // 22528K {0.254210167, 0.254557823}, // 22529K {0.254209395, 0.254556761}, // 22530K {0.254208624, 0.254555698}, // 22531K {0.254207852, 0.254554636}, // 22532K {0.25420708, 0.254553574}, // 22533K {0.254206309, 0.254552512}, // 22534K {0.254205537, 0.25455145}, // 22535K {0.254204766, 0.254550388}, // 22536K {0.254203995, 0.254549326}, // 22537K {0.254203224, 0.254548265}, // 22538K {0.254202452, 0.254547203}, // 22539K {0.254201681, 0.254546142}, // 22540K {0.25420091, 0.254545081}, // 22541K {0.25420014, 0.254544019}, // 22542K {0.254199369, 0.254542958}, // 22543K {0.254198598, 0.254541897}, // 22544K {0.254197827, 0.254540837}, // 22545K {0.254197057, 0.254539776}, // 22546K {0.254196286, 0.254538715}, // 22547K {0.254195516, 0.254537655}, // 22548K {0.254194746, 0.254536594}, // 22549K {0.254193976, 0.254535534}, // 22550K {0.254193205, 0.254534474}, // 22551K {0.254192435, 0.254533413}, // 22552K {0.254191665, 0.254532353}, // 22553K {0.254190895, 0.254531294}, // 22554K {0.254190126, 0.254530234}, // 22555K {0.254189356, 0.254529174}, // 22556K {0.254188586, 0.254528114}, // 22557K {0.254187817, 0.254527055}, // 22558K {0.254187047, 0.254525996}, // 22559K {0.254186278, 0.254524936}, // 22560K {0.254185508, 0.254523877}, // 22561K {0.254184739, 0.254522818}, // 22562K {0.25418397, 0.254521759}, // 22563K {0.254183201, 0.2545207}, // 22564K {0.254182432, 0.254519641}, // 22565K {0.254181663, 0.254518583}, // 22566K {0.254180894, 0.254517524}, // 22567K {0.254180125, 0.254516466}, // 22568K {0.254179357, 0.254515407}, // 22569K {0.254178588, 0.254514349}, // 22570K {0.25417782, 0.254513291}, // 22571K {0.254177051, 0.254512233}, // 22572K {0.254176283, 0.254511175}, // 22573K {0.254175514, 0.254510117}, // 22574K {0.254174746, 0.25450906}, // 22575K {0.254173978, 0.254508002}, // 22576K {0.25417321, 0.254506945}, // 22577K {0.254172442, 0.254505887}, // 22578K {0.254171674, 0.25450483}, // 22579K {0.254170906, 0.254503773}, // 22580K {0.254170139, 0.254502716}, // 22581K {0.254169371, 0.254501659}, // 22582K {0.254168603, 0.254500602}, // 22583K {0.254167836, 0.254499545}, // 22584K {0.254167068, 0.254498489}, // 22585K {0.254166301, 0.254497432}, // 22586K {0.254165534, 0.254496376}, // 22587K {0.254164767, 0.254495319}, // 22588K {0.254164, 0.254494263}, // 22589K {0.254163233, 0.254493207}, // 22590K {0.254162466, 0.254492151}, // 22591K {0.254161699, 0.254491095}, // 22592K {0.254160932, 0.254490039}, // 22593K {0.254160165, 0.254488984}, // 22594K {0.254159399, 0.254487928}, // 22595K {0.254158632, 0.254486873}, // 22596K {0.254157866, 0.254485817}, // 22597K {0.254157099, 0.254484762}, // 22598K {0.254156333, 0.254483707}, // 22599K {0.254155567, 0.254482652}, // 22600K {0.254154801, 0.254481597}, // 22601K {0.254154035, 0.254480542}, // 22602K {0.254153269, 0.254479487}, // 22603K {0.254152503, 0.254478433}, // 22604K {0.254151737, 0.254477378}, // 22605K {0.254150971, 0.254476324}, // 22606K {0.254150206, 0.254475269}, // 22607K {0.25414944, 0.254474215}, // 22608K {0.254148675, 0.254473161}, // 22609K {0.254147909, 0.254472107}, // 22610K {0.254147144, 0.254471053}, // 22611K {0.254146379, 0.254469999}, // 22612K {0.254145613, 0.254468946}, // 22613K {0.254144848, 0.254467892}, // 22614K {0.254144083, 0.254466839}, // 22615K {0.254143318, 0.254465785}, // 22616K {0.254142553, 0.254464732}, // 22617K {0.254141789, 0.254463679}, // 22618K {0.254141024, 0.254462626}, // 22619K {0.254140259, 0.254461573}, // 22620K {0.254139495, 0.25446052}, // 22621K {0.25413873, 0.254459467}, // 22622K {0.254137966, 0.254458415}, // 22623K {0.254137202, 0.254457362}, // 22624K {0.254136437, 0.25445631}, // 22625K {0.254135673, 0.254455257}, // 22626K {0.254134909, 0.254454205}, // 22627K {0.254134145, 0.254453153}, // 22628K {0.254133381, 0.254452101}, // 22629K {0.254132618, 0.254451049}, // 22630K {0.254131854, 0.254449997}, // 22631K {0.25413109, 0.254448945}, // 22632K {0.254130327, 0.254447894}, // 22633K {0.254129563, 0.254446842}, // 22634K {0.2541288, 0.254445791}, // 22635K {0.254128036, 0.25444474}, // 22636K {0.254127273, 0.254443689}, // 22637K {0.25412651, 0.254442638}, // 22638K {0.254125747, 0.254441587}, // 22639K {0.254124984, 0.254440536}, // 22640K {0.254124221, 0.254439485}, // 22641K {0.254123458, 0.254438434}, // 22642K {0.254122695, 0.254437384}, // 22643K {0.254121932, 0.254436333}, // 22644K {0.25412117, 0.254435283}, // 22645K {0.254120407, 0.254434233}, // 22646K {0.254119645, 0.254433183}, // 22647K {0.254118882, 0.254432133}, // 22648K {0.25411812, 0.254431083}, // 22649K {0.254117358, 0.254430033}, // 22650K {0.254116596, 0.254428983}, // 22651K {0.254115833, 0.254427934}, // 22652K {0.254115071, 0.254426884}, // 22653K {0.25411431, 0.254425835}, // 22654K {0.254113548, 0.254424785}, // 22655K {0.254112786, 0.254423736}, // 22656K {0.254112024, 0.254422687}, // 22657K {0.254111263, 0.254421638}, // 22658K {0.254110501, 0.254420589}, // 22659K {0.25410974, 0.254419541}, // 22660K {0.254108978, 0.254418492}, // 22661K {0.254108217, 0.254417443}, // 22662K {0.254107456, 0.254416395}, // 22663K {0.254106695, 0.254415347}, // 22664K {0.254105934, 0.254414298}, // 22665K {0.254105173, 0.25441325}, // 22666K {0.254104412, 0.254412202}, // 22667K {0.254103651, 0.254411154}, // 22668K {0.25410289, 0.254410106}, // 22669K {0.25410213, 0.254409059}, // 22670K {0.254101369, 0.254408011}, // 22671K {0.254100608, 0.254406964}, // 22672K {0.254099848, 0.254405916}, // 22673K {0.254099088, 0.254404869}, // 22674K {0.254098327, 0.254403822}, // 22675K {0.254097567, 0.254402775}, // 22676K {0.254096807, 0.254401728}, // 22677K {0.254096047, 0.254400681}, // 22678K {0.254095287, 0.254399634}, // 22679K {0.254094527, 0.254398587}, // 22680K {0.254093767, 0.254397541}, // 22681K {0.254093008, 0.254396494}, // 22682K {0.254092248, 0.254395448}, // 22683K {0.254091489, 0.254394402}, // 22684K {0.254090729, 0.254393355}, // 22685K {0.25408997, 0.254392309}, // 22686K {0.25408921, 0.254391263}, // 22687K {0.254088451, 0.254390218}, // 22688K {0.254087692, 0.254389172}, // 22689K {0.254086933, 0.254388126}, // 22690K {0.254086174, 0.254387081}, // 22691K {0.254085415, 0.254386035}, // 22692K {0.254084656, 0.25438499}, // 22693K {0.254083897, 0.254383945}, // 22694K {0.254083139, 0.2543829}, // 22695K {0.25408238, 0.254381854}, // 22696K {0.254081622, 0.25438081}, // 22697K {0.254080863, 0.254379765}, // 22698K {0.254080105, 0.25437872}, // 22699K {0.254079346, 0.254377675}, // 22700K {0.254078588, 0.254376631}, // 22701K {0.25407783, 0.254375587}, // 22702K {0.254077072, 0.254374542}, // 22703K {0.254076314, 0.254373498}, // 22704K {0.254075556, 0.254372454}, // 22705K {0.254074798, 0.25437141}, // 22706K {0.254074041, 0.254370366}, // 22707K {0.254073283, 0.254369322}, // 22708K {0.254072525, 0.254368279}, // 22709K {0.254071768, 0.254367235}, // 22710K {0.25407101, 0.254366192}, // 22711K {0.254070253, 0.254365148}, // 22712K {0.254069496, 0.254364105}, // 22713K {0.254068739, 0.254363062}, // 22714K {0.254067981, 0.254362019}, // 22715K {0.254067224, 0.254360976}, // 22716K {0.254066467, 0.254359933}, // 22717K {0.254065711, 0.25435889}, // 22718K {0.254064954, 0.254357848}, // 22719K {0.254064197, 0.254356805}, // 22720K {0.25406344, 0.254355763}, // 22721K {0.254062684, 0.25435472}, // 22722K {0.254061927, 0.254353678}, // 22723K {0.254061171, 0.254352636}, // 22724K {0.254060415, 0.254351594}, // 22725K {0.254059658, 0.254350552}, // 22726K {0.254058902, 0.25434951}, // 22727K {0.254058146, 0.254348469}, // 22728K {0.25405739, 0.254347427}, // 22729K {0.254056634, 0.254346386}, // 22730K {0.254055878, 0.254345344}, // 22731K {0.254055123, 0.254344303}, // 22732K {0.254054367, 0.254343262}, // 22733K {0.254053611, 0.254342221}, // 22734K {0.254052856, 0.25434118}, // 22735K {0.2540521, 0.254340139}, // 22736K {0.254051345, 0.254339098}, // 22737K {0.254050589, 0.254338057}, // 22738K {0.254049834, 0.254337017}, // 22739K {0.254049079, 0.254335976}, // 22740K {0.254048324, 0.254334936}, // 22741K {0.254047569, 0.254333896}, // 22742K {0.254046814, 0.254332856}, // 22743K {0.254046059, 0.254331816}, // 22744K {0.254045304, 0.254330776}, // 22745K {0.25404455, 0.254329736}, // 22746K {0.254043795, 0.254328696}, // 22747K {0.254043041, 0.254327656}, // 22748K {0.254042286, 0.254326617}, // 22749K {0.254041532, 0.254325577}, // 22750K {0.254040777, 0.254324538}, // 22751K {0.254040023, 0.254323499}, // 22752K {0.254039269, 0.25432246}, // 22753K {0.254038515, 0.254321421}, // 22754K {0.254037761, 0.254320382}, // 22755K {0.254037007, 0.254319343}, // 22756K {0.254036253, 0.254318304}, // 22757K {0.2540355, 0.254317266}, // 22758K {0.254034746, 0.254316227}, // 22759K {0.254033992, 0.254315189}, // 22760K {0.254033239, 0.254314151}, // 22761K {0.254032485, 0.254313112}, // 22762K {0.254031732, 0.254312074}, // 22763K {0.254030979, 0.254311036}, // 22764K {0.254030225, 0.254309998}, // 22765K {0.254029472, 0.254308961}, // 22766K {0.254028719, 0.254307923}, // 22767K {0.254027966, 0.254306885}, // 22768K {0.254027213, 0.254305848}, // 22769K {0.254026461, 0.25430481}, // 22770K {0.254025708, 0.254303773}, // 22771K {0.254024955, 0.254302736}, // 22772K {0.254024203, 0.254301699}, // 22773K {0.25402345, 0.254300662}, // 22774K {0.254022698, 0.254299625}, // 22775K {0.254021945, 0.254298588}, // 22776K {0.254021193, 0.254297552}, // 22777K {0.254020441, 0.254296515}, // 22778K {0.254019689, 0.254295479}, // 22779K {0.254018937, 0.254294442}, // 22780K {0.254018185, 0.254293406}, // 22781K {0.254017433, 0.25429237}, // 22782K {0.254016681, 0.254291334}, // 22783K {0.254015929, 0.254290298}, // 22784K {0.254015178, 0.254289262}, // 22785K {0.254014426, 0.254288227}, // 22786K {0.254013675, 0.254287191}, // 22787K {0.254012923, 0.254286155}, // 22788K {0.254012172, 0.25428512}, // 22789K {0.25401142, 0.254284085}, // 22790K {0.254010669, 0.254283049}, // 22791K {0.254009918, 0.254282014}, // 22792K {0.254009167, 0.254280979}, // 22793K {0.254008416, 0.254279944}, // 22794K {0.254007665, 0.25427891}, // 22795K {0.254006915, 0.254277875}, // 22796K {0.254006164, 0.25427684}, // 22797K {0.254005413, 0.254275806}, // 22798K {0.254004663, 0.254274771}, // 22799K {0.254003912, 0.254273737}, // 22800K {0.254003162, 0.254272703}, // 22801K {0.254002411, 0.254271669}, // 22802K {0.254001661, 0.254270635}, // 22803K {0.254000911, 0.254269601}, // 22804K {0.254000161, 0.254268567}, // 22805K {0.253999411, 0.254267533}, // 22806K {0.253998661, 0.2542665}, // 22807K {0.253997911, 0.254265466}, // 22808K {0.253997161, 0.254264433}, // 22809K {0.253996411, 0.2542634}, // 22810K {0.253995662, 0.254262367}, // 22811K {0.253994912, 0.254261333}, // 22812K {0.253994163, 0.254260301}, // 22813K {0.253993413, 0.254259268}, // 22814K {0.253992664, 0.254258235}, // 22815K {0.253991915, 0.254257202}, // 22816K {0.253991166, 0.25425617}, // 22817K {0.253990416, 0.254255137}, // 22818K {0.253989667, 0.254254105}, // 22819K {0.253988918, 0.254253073}, // 22820K {0.25398817, 0.25425204}, // 22821K {0.253987421, 0.254251008}, // 22822K {0.253986672, 0.254249976}, // 22823K {0.253985923, 0.254248945}, // 22824K {0.253985175, 0.254247913}, // 22825K {0.253984426, 0.254246881}, // 22826K {0.253983678, 0.25424585}, // 22827K {0.25398293, 0.254244818}, // 22828K {0.253982181, 0.254243787}, // 22829K {0.253981433, 0.254242756}, // 22830K {0.253980685, 0.254241725}, // 22831K {0.253979937, 0.254240694}, // 22832K {0.253979189, 0.254239663}, // 22833K {0.253978441, 0.254238632}, // 22834K {0.253977694, 0.254237601}, // 22835K {0.253976946, 0.25423657}, // 22836K {0.253976198, 0.25423554}, // 22837K {0.253975451, 0.254234509}, // 22838K {0.253974703, 0.254233479}, // 22839K {0.253973956, 0.254232449}, // 22840K {0.253973208, 0.254231419}, // 22841K {0.253972461, 0.254230389}, // 22842K {0.253971714, 0.254229359}, // 22843K {0.253970967, 0.254228329}, // 22844K {0.25397022, 0.254227299}, // 22845K {0.253969473, 0.25422627}, // 22846K {0.253968726, 0.25422524}, // 22847K {0.253967979, 0.254224211}, // 22848K {0.253967233, 0.254223182}, // 22849K {0.253966486, 0.254222152}, // 22850K {0.253965739, 0.254221123}, // 22851K {0.253964993, 0.254220094}, // 22852K {0.253964246, 0.254219065}, // 22853K {0.2539635, 0.254218037}, // 22854K {0.253962754, 0.254217008}, // 22855K {0.253962008, 0.254215979}, // 22856K {0.253961262, 0.254214951}, // 22857K {0.253960516, 0.254213922}, // 22858K {0.25395977, 0.254212894}, // 22859K {0.253959024, 0.254211866}, // 22860K {0.253958278, 0.254210838}, // 22861K {0.253957532, 0.25420981}, // 22862K {0.253956787, 0.254208782}, // 22863K {0.253956041, 0.254207754}, // 22864K {0.253955296, 0.254206727}, // 22865K {0.25395455, 0.254205699}, // 22866K {0.253953805, 0.254204672}, // 22867K {0.25395306, 0.254203644}, // 22868K {0.253952314, 0.254202617}, // 22869K {0.253951569, 0.25420159}, // 22870K {0.253950824, 0.254200563}, // 22871K {0.253950079, 0.254199536}, // 22872K {0.253949335, 0.254198509}, // 22873K {0.25394859, 0.254197482}, // 22874K {0.253947845, 0.254196455}, // 22875K {0.2539471, 0.254195429}, // 22876K {0.253946356, 0.254194402}, // 22877K {0.253945611, 0.254193376}, // 22878K {0.253944867, 0.25419235}, // 22879K {0.253944123, 0.254191324}, // 22880K {0.253943378, 0.254190298}, // 22881K {0.253942634, 0.254189272}, // 22882K {0.25394189, 0.254188246}, // 22883K {0.253941146, 0.25418722}, // 22884K {0.253940402, 0.254186194}, // 22885K {0.253939658, 0.254185169}, // 22886K {0.253938914, 0.254184143}, // 22887K {0.253938171, 0.254183118}, // 22888K {0.253937427, 0.254182093}, // 22889K {0.253936683, 0.254181068}, // 22890K {0.25393594, 0.254180042}, // 22891K {0.253935196, 0.254179018}, // 22892K {0.253934453, 0.254177993}, // 22893K {0.25393371, 0.254176968}, // 22894K {0.253932967, 0.254175943}, // 22895K {0.253932224, 0.254174919}, // 22896K {0.253931481, 0.254173894}, // 22897K {0.253930738, 0.25417287}, // 22898K {0.253929995, 0.254171846}, // 22899K {0.253929252, 0.254170822}, // 22900K {0.253928509, 0.254169798}, // 22901K {0.253927767, 0.254168774}, // 22902K {0.253927024, 0.25416775}, // 22903K {0.253926281, 0.254166726}, // 22904K {0.253925539, 0.254165702}, // 22905K {0.253924797, 0.254164679}, // 22906K {0.253924054, 0.254163655}, // 22907K {0.253923312, 0.254162632}, // 22908K {0.25392257, 0.254161609}, // 22909K {0.253921828, 0.254160586}, // 22910K {0.253921086, 0.254159563}, // 22911K {0.253920344, 0.25415854}, // 22912K {0.253919602, 0.254157517}, // 22913K {0.253918861, 0.254156494}, // 22914K {0.253918119, 0.254155472}, // 22915K {0.253917377, 0.254154449}, // 22916K {0.253916636, 0.254153427}, // 22917K {0.253915894, 0.254152404}, // 22918K {0.253915153, 0.254151382}, // 22919K {0.253914412, 0.25415036}, // 22920K {0.253913671, 0.254149338}, // 22921K {0.253912929, 0.254148316}, // 22922K {0.253912188, 0.254147294}, // 22923K {0.253911447, 0.254146272}, // 22924K {0.253910706, 0.254145251}, // 22925K {0.253909966, 0.254144229}, // 22926K {0.253909225, 0.254143208}, // 22927K {0.253908484, 0.254142187}, // 22928K {0.253907744, 0.254141165}, // 22929K {0.253907003, 0.254140144}, // 22930K {0.253906263, 0.254139123}, // 22931K {0.253905522, 0.254138102}, // 22932K {0.253904782, 0.254137081}, // 22933K {0.253904042, 0.254136061}, // 22934K {0.253903302, 0.25413504}, // 22935K {0.253902562, 0.25413402}, // 22936K {0.253901822, 0.254132999}, // 22937K {0.253901082, 0.254131979}, // 22938K {0.253900342, 0.254130959}, // 22939K {0.253899602, 0.254129939}, // 22940K {0.253898862, 0.254128919}, // 22941K {0.253898123, 0.254127899}, // 22942K {0.253897383, 0.254126879}, // 22943K {0.253896644, 0.254125859}, // 22944K {0.253895904, 0.254124839}, // 22945K {0.253895165, 0.25412382}, // 22946K {0.253894426, 0.254122801}, // 22947K {0.253893687, 0.254121781}, // 22948K {0.253892947, 0.254120762}, // 22949K {0.253892208, 0.254119743}, // 22950K {0.25389147, 0.254118724}, // 22951K {0.253890731, 0.254117705}, // 22952K {0.253889992, 0.254116686}, // 22953K {0.253889253, 0.254115667}, // 22954K {0.253888515, 0.254114649}, // 22955K {0.253887776, 0.25411363}, // 22956K {0.253887038, 0.254112612}, // 22957K {0.253886299, 0.254111594}, // 22958K {0.253885561, 0.254110575}, // 22959K {0.253884823, 0.254109557}, // 22960K {0.253884084, 0.254108539}, // 22961K {0.253883346, 0.254107521}, // 22962K {0.253882608, 0.254106504}, // 22963K {0.25388187, 0.254105486}, // 22964K {0.253881132, 0.254104468}, // 22965K {0.253880395, 0.254103451}, // 22966K {0.253879657, 0.254102433}, // 22967K {0.253878919, 0.254101416}, // 22968K {0.253878182, 0.254100399}, // 22969K {0.253877444, 0.254099382}, // 22970K {0.253876707, 0.254098365}, // 22971K {0.253875969, 0.254097348}, // 22972K {0.253875232, 0.254096331}, // 22973K {0.253874495, 0.254095314}, // 22974K {0.253873758, 0.254094298}, // 22975K {0.253873021, 0.254093281}, // 22976K {0.253872284, 0.254092265}, // 22977K {0.253871547, 0.254091248}, // 22978K {0.25387081, 0.254090232}, // 22979K {0.253870073, 0.254089216}, // 22980K {0.253869337, 0.2540882}, // 22981K {0.2538686, 0.254087184}, // 22982K {0.253867864, 0.254086168}, // 22983K {0.253867127, 0.254085152}, // 22984K {0.253866391, 0.254084137}, // 22985K {0.253865654, 0.254083121}, // 22986K {0.253864918, 0.254082106}, // 22987K {0.253864182, 0.254081091}, // 22988K {0.253863446, 0.254080075}, // 22989K {0.25386271, 0.25407906}, // 22990K {0.253861974, 0.254078045}, // 22991K {0.253861238, 0.25407703}, // 22992K {0.253860503, 0.254076015}, // 22993K {0.253859767, 0.254075001}, // 22994K {0.253859031, 0.254073986}, // 22995K {0.253858296, 0.254072972}, // 22996K {0.25385756, 0.254071957}, // 22997K {0.253856825, 0.254070943}, // 22998K {0.25385609, 0.254069929}, // 22999K {0.253855354, 0.254068914}, // 23000K {0.253854619, 0.2540679}, // 23001K {0.253853884, 0.254066887}, // 23002K {0.253853149, 0.254065873}, // 23003K {0.253852414, 0.254064859}, // 23004K {0.253851679, 0.254063845}, // 23005K {0.253850944, 0.254062832}, // 23006K {0.25385021, 0.254061818}, // 23007K {0.253849475, 0.254060805}, // 23008K {0.253848741, 0.254059792}, // 23009K {0.253848006, 0.254058779}, // 23010K {0.253847272, 0.254057766}, // 23011K {0.253846537, 0.254056753}, // 23012K {0.253845803, 0.25405574}, // 23013K {0.253845069, 0.254054727}, // 23014K {0.253844335, 0.254053714}, // 23015K {0.253843601, 0.254052702}, // 23016K {0.253842867, 0.25405169}, // 23017K {0.253842133, 0.254050677}, // 23018K {0.253841399, 0.254049665}, // 23019K {0.253840665, 0.254048653}, // 23020K {0.253839932, 0.254047641}, // 23021K {0.253839198, 0.254046629}, // 23022K {0.253838465, 0.254045617}, // 23023K {0.253837731, 0.254044605}, // 23024K {0.253836998, 0.254043594}, // 23025K {0.253836264, 0.254042582}, // 23026K {0.253835531, 0.254041571}, // 23027K {0.253834798, 0.254040559}, // 23028K {0.253834065, 0.254039548}, // 23029K {0.253833332, 0.254038537}, // 23030K {0.253832599, 0.254037526}, // 23031K {0.253831866, 0.254036515}, // 23032K {0.253831134, 0.254035504}, // 23033K {0.253830401, 0.254034493}, // 23034K {0.253829668, 0.254033483}, // 23035K {0.253828936, 0.254032472}, // 23036K {0.253828203, 0.254031462}, // 23037K {0.253827471, 0.254030451}, // 23038K {0.253826738, 0.254029441}, // 23039K {0.253826006, 0.254028431}, // 23040K {0.253825274, 0.254027421}, // 23041K {0.253824542, 0.254026411}, // 23042K {0.25382381, 0.254025401}, // 23043K {0.253823078, 0.254024391}, // 23044K {0.253822346, 0.254023381}, // 23045K {0.253821614, 0.254022372}, // 23046K {0.253820883, 0.254021362}, // 23047K {0.253820151, 0.254020353}, // 23048K {0.253819419, 0.254019344}, // 23049K {0.253818688, 0.254018335}, // 23050K {0.253817957, 0.254017325}, // 23051K {0.253817225, 0.254016316}, // 23052K {0.253816494, 0.254015308}, // 23053K {0.253815763, 0.254014299}, // 23054K {0.253815032, 0.25401329}, // 23055K {0.253814301, 0.254012282}, // 23056K {0.25381357, 0.254011273}, // 23057K {0.253812839, 0.254010265}, // 23058K {0.253812108, 0.254009256}, // 23059K {0.253811377, 0.254008248}, // 23060K {0.253810646, 0.25400724}, // 23061K {0.253809916, 0.254006232}, // 23062K {0.253809185, 0.254005224}, // 23063K {0.253808455, 0.254004216}, // 23064K {0.253807724, 0.254003209}, // 23065K {0.253806994, 0.254002201}, // 23066K {0.253806264, 0.254001194}, // 23067K {0.253805534, 0.254000186}, // 23068K {0.253804804, 0.253999179}, // 23069K {0.253804074, 0.253998172}, // 23070K {0.253803344, 0.253997165}, // 23071K {0.253802614, 0.253996158}, // 23072K {0.253801884, 0.253995151}, // 23073K {0.253801154, 0.253994144}, // 23074K {0.253800425, 0.253993137}, // 23075K {0.253799695, 0.253992131}, // 23076K {0.253798966, 0.253991124}, // 23077K {0.253798236, 0.253990118}, // 23078K {0.253797507, 0.253989111}, // 23079K {0.253796778, 0.253988105}, // 23080K {0.253796048, 0.253987099}, // 23081K {0.253795319, 0.253986093}, // 23082K {0.25379459, 0.253985087}, // 23083K {0.253793861, 0.253984081}, // 23084K {0.253793132, 0.253983075}, // 23085K {0.253792404, 0.25398207}, // 23086K {0.253791675, 0.253981064}, // 23087K {0.253790946, 0.253980059}, // 23088K {0.253790218, 0.253979054}, // 23089K {0.253789489, 0.253978048}, // 23090K {0.253788761, 0.253977043}, // 23091K {0.253788032, 0.253976038}, // 23092K {0.253787304, 0.253975033}, // 23093K {0.253786576, 0.253974028}, // 23094K {0.253785848, 0.253973024}, // 23095K {0.25378512, 0.253972019}, // 23096K {0.253784392, 0.253971014}, // 23097K {0.253783664, 0.25397001}, // 23098K {0.253782936, 0.253969006}, // 23099K {0.253782208, 0.253968001}, // 23100K {0.25378148, 0.253966997}, // 23101K {0.253780753, 0.253965993}, // 23102K {0.253780025, 0.253964989}, // 23103K {0.253779298, 0.253963985}, // 23104K {0.25377857, 0.253962982}, // 23105K {0.253777843, 0.253961978}, // 23106K {0.253777116, 0.253960974}, // 23107K {0.253776388, 0.253959971}, // 23108K {0.253775661, 0.253958967}, // 23109K {0.253774934, 0.253957964}, // 23110K {0.253774207, 0.253956961}, // 23111K {0.25377348, 0.253955958}, // 23112K {0.253772754, 0.253954955}, // 23113K {0.253772027, 0.253953952}, // 23114K {0.2537713, 0.253952949}, // 23115K {0.253770574, 0.253951947}, // 23116K {0.253769847, 0.253950944}, // 23117K {0.253769121, 0.253949941}, // 23118K {0.253768394, 0.253948939}, // 23119K {0.253767668, 0.253947937}, // 23120K {0.253766942, 0.253946935}, // 23121K {0.253766215, 0.253945932}, // 23122K {0.253765489, 0.25394493}, // 23123K {0.253764763, 0.253943929}, // 23124K {0.253764037, 0.253942927}, // 23125K {0.253763312, 0.253941925}, // 23126K {0.253762586, 0.253940923}, // 23127K {0.25376186, 0.253939922}, // 23128K {0.253761134, 0.25393892}, // 23129K {0.253760409, 0.253937919}, // 23130K {0.253759683, 0.253936918}, // 23131K {0.253758958, 0.253935917}, // 23132K {0.253758233, 0.253934916}, // 23133K {0.253757507, 0.253933915}, // 23134K {0.253756782, 0.253932914}, // 23135K {0.253756057, 0.253931913}, // 23136K {0.253755332, 0.253930913}, // 23137K {0.253754607, 0.253929912}, // 23138K {0.253753882, 0.253928912}, // 23139K {0.253753157, 0.253927911}, // 23140K {0.253752433, 0.253926911}, // 23141K {0.253751708, 0.253925911}, // 23142K {0.253750983, 0.253924911}, // 23143K {0.253750259, 0.253923911}, // 23144K {0.253749534, 0.253922911}, // 23145K {0.25374881, 0.253921911}, // 23146K {0.253748086, 0.253920912}, // 23147K {0.253747361, 0.253919912}, // 23148K {0.253746637, 0.253918912}, // 23149K {0.253745913, 0.253917913}, // 23150K {0.253745189, 0.253916914}, // 23151K {0.253744465, 0.253915915}, // 23152K {0.253743741, 0.253914916}, // 23153K {0.253743017, 0.253913917}, // 23154K {0.253742294, 0.253912918}, // 23155K {0.25374157, 0.253911919}, // 23156K {0.253740846, 0.25391092}, // 23157K {0.253740123, 0.253909922}, // 23158K {0.253739399, 0.253908923}, // 23159K {0.253738676, 0.253907925}, // 23160K {0.253737953, 0.253906926}, // 23161K {0.25373723, 0.253905928}, // 23162K {0.253736506, 0.25390493}, // 23163K {0.253735783, 0.253903932}, // 23164K {0.25373506, 0.253902934}, // 23165K {0.253734338, 0.253901936}, // 23166K {0.253733615, 0.253900939}, // 23167K {0.253732892, 0.253899941}, // 23168K {0.253732169, 0.253898943}, // 23169K {0.253731447, 0.253897946}, // 23170K {0.253730724, 0.253896949}, // 23171K {0.253730002, 0.253895951}, // 23172K {0.253729279, 0.253894954}, // 23173K {0.253728557, 0.253893957}, // 23174K {0.253727835, 0.25389296}, // 23175K {0.253727112, 0.253891963}, // 23176K {0.25372639, 0.253890967}, // 23177K {0.253725668, 0.25388997}, // 23178K {0.253724946, 0.253888973}, // 23179K {0.253724224, 0.253887977}, // 23180K {0.253723502, 0.253886981}, // 23181K {0.253722781, 0.253885984}, // 23182K {0.253722059, 0.253884988}, // 23183K {0.253721337, 0.253883992}, // 23184K {0.253720616, 0.253882996}, // 23185K {0.253719894, 0.253882}, // 23186K {0.253719173, 0.253881004}, // 23187K {0.253718452, 0.253880009}, // 23188K {0.253717731, 0.253879013}, // 23189K {0.253717009, 0.253878018}, // 23190K {0.253716288, 0.253877022}, // 23191K {0.253715567, 0.253876027}, // 23192K {0.253714846, 0.253875032}, // 23193K {0.253714125, 0.253874037}, // 23194K {0.253713405, 0.253873042}, // 23195K {0.253712684, 0.253872047}, // 23196K {0.253711963, 0.253871052}, // 23197K {0.253711243, 0.253870057}, // 23198K {0.253710522, 0.253869063}, // 23199K {0.253709802, 0.253868068}, // 23200K {0.253709081, 0.253867074}, // 23201K {0.253708361, 0.253866079}, // 23202K {0.253707641, 0.253865085}, // 23203K {0.253706921, 0.253864091}, // 23204K {0.253706201, 0.253863097}, // 23205K {0.253705481, 0.253862103}, // 23206K {0.253704761, 0.253861109}, // 23207K {0.253704041, 0.253860115}, // 23208K {0.253703321, 0.253859122}, // 23209K {0.253702601, 0.253858128}, // 23210K {0.253701882, 0.253857135}, // 23211K {0.253701162, 0.253856141}, // 23212K {0.253700443, 0.253855148}, // 23213K {0.253699723, 0.253854155}, // 23214K {0.253699004, 0.253853162}, // 23215K {0.253698285, 0.253852169}, // 23216K {0.253697566, 0.253851176}, // 23217K {0.253696846, 0.253850183}, // 23218K {0.253696127, 0.25384919}, // 23219K {0.253695408, 0.253848198}, // 23220K {0.253694689, 0.253847205}, // 23221K {0.253693971, 0.253846213}, // 23222K {0.253693252, 0.253845221}, // 23223K {0.253692533, 0.253844228}, // 23224K {0.253691815, 0.253843236}, // 23225K {0.253691096, 0.253842244}, // 23226K {0.253690378, 0.253841252}, // 23227K {0.253689659, 0.25384026}, // 23228K {0.253688941, 0.253839269}, // 23229K {0.253688223, 0.253838277}, // 23230K {0.253687504, 0.253837286}, // 23231K {0.253686786, 0.253836294}, // 23232K {0.253686068, 0.253835303}, // 23233K {0.25368535, 0.253834312}, // 23234K {0.253684632, 0.25383332}, // 23235K {0.253683915, 0.253832329}, // 23236K {0.253683197, 0.253831338}, // 23237K {0.253682479, 0.253830347}, // 23238K {0.253681762, 0.253829357}, // 23239K {0.253681044, 0.253828366}, // 23240K {0.253680327, 0.253827375}, // 23241K {0.253679609, 0.253826385}, // 23242K {0.253678892, 0.253825395}, // 23243K {0.253678175, 0.253824404}, // 23244K {0.253677458, 0.253823414}, // 23245K {0.25367674, 0.253822424}, // 23246K {0.253676023, 0.253821434}, // 23247K {0.253675306, 0.253820444}, // 23248K {0.25367459, 0.253819454}, // 23249K {0.253673873, 0.253818465}, // 23250K {0.253673156, 0.253817475}, // 23251K {0.253672439, 0.253816485}, // 23252K {0.253671723, 0.253815496}, // 23253K {0.253671006, 0.253814507}, // 23254K {0.25367029, 0.253813517}, // 23255K {0.253669573, 0.253812528}, // 23256K {0.253668857, 0.253811539}, // 23257K {0.253668141, 0.25381055}, // 23258K {0.253667425, 0.253809561}, // 23259K {0.253666709, 0.253808573}, // 23260K {0.253665993, 0.253807584}, // 23261K {0.253665277, 0.253806596}, // 23262K {0.253664561, 0.253805607}, // 23263K {0.253663845, 0.253804619}, // 23264K {0.253663129, 0.25380363}, // 23265K {0.253662414, 0.253802642}, // 23266K {0.253661698, 0.253801654}, // 23267K {0.253660983, 0.253800666}, // 23268K {0.253660267, 0.253799678}, // 23269K {0.253659552, 0.25379869}, // 23270K {0.253658837, 0.253797703}, // 23271K {0.253658121, 0.253796715}, // 23272K {0.253657406, 0.253795728}, // 23273K {0.253656691, 0.25379474}, // 23274K {0.253655976, 0.253793753}, // 23275K {0.253655261, 0.253792766}, // 23276K {0.253654546, 0.253791779}, // 23277K {0.253653832, 0.253790791}, // 23278K {0.253653117, 0.253789805}, // 23279K {0.253652402, 0.253788818}, // 23280K {0.253651688, 0.253787831}, // 23281K {0.253650973, 0.253786844}, // 23282K {0.253650259, 0.253785858}, // 23283K {0.253649545, 0.253784871}, // 23284K {0.25364883, 0.253783885}, // 23285K {0.253648116, 0.253782899}, // 23286K {0.253647402, 0.253781912}, // 23287K {0.253646688, 0.253780926}, // 23288K {0.253645974, 0.25377994}, // 23289K {0.25364526, 0.253778955}, // 23290K {0.253644546, 0.253777969}, // 23291K {0.253643832, 0.253776983}, // 23292K {0.253643119, 0.253775997}, // 23293K {0.253642405, 0.253775012}, // 23294K {0.253641691, 0.253774027}, // 23295K {0.253640978, 0.253773041}, // 23296K {0.253640265, 0.253772056}, // 23297K {0.253639551, 0.253771071}, // 23298K {0.253638838, 0.253770086}, // 23299K {0.253638125, 0.253769101}, // 23300K {0.253637412, 0.253768116}, // 23301K {0.253636699, 0.253767131}, // 23302K {0.253635986, 0.253766147}, // 23303K {0.253635273, 0.253765162}, // 23304K {0.25363456, 0.253764178}, // 23305K {0.253633847, 0.253763193}, // 23306K {0.253633134, 0.253762209}, // 23307K {0.253632422, 0.253761225}, // 23308K {0.253631709, 0.253760241}, // 23309K {0.253630997, 0.253759257}, // 23310K {0.253630284, 0.253758273}, // 23311K {0.253629572, 0.253757289}, // 23312K {0.25362886, 0.253756305}, // 23313K {0.253628148, 0.253755322}, // 23314K {0.253627435, 0.253754338}, // 23315K {0.253626723, 0.253753355}, // 23316K {0.253626011, 0.253752372}, // 23317K {0.253625299, 0.253751388}, // 23318K {0.253624588, 0.253750405}, // 23319K {0.253623876, 0.253749422}, // 23320K {0.253623164, 0.253748439}, // 23321K {0.253622453, 0.253747456}, // 23322K {0.253621741, 0.253746474}, // 23323K {0.25362103, 0.253745491}, // 23324K {0.253620318, 0.253744508}, // 23325K {0.253619607, 0.253743526}, // 23326K {0.253618896, 0.253742544}, // 23327K {0.253618184, 0.253741561}, // 23328K {0.253617473, 0.253740579}, // 23329K {0.253616762, 0.253739597}, // 23330K {0.253616051, 0.253738615}, // 23331K {0.25361534, 0.253737633}, // 23332K {0.25361463, 0.253736651}, // 23333K {0.253613919, 0.25373567}, // 23334K {0.253613208, 0.253734688}, // 23335K {0.253612497, 0.253733707}, // 23336K {0.253611787, 0.253732725}, // 23337K {0.253611076, 0.253731744}, // 23338K {0.253610366, 0.253730763}, // 23339K {0.253609656, 0.253729781}, // 23340K {0.253608945, 0.2537288}, // 23341K {0.253608235, 0.253727819}, // 23342K {0.253607525, 0.253726839}, // 23343K {0.253606815, 0.253725858}, // 23344K {0.253606105, 0.253724877}, // 23345K {0.253605395, 0.253723897}, // 23346K {0.253604685, 0.253722916}, // 23347K {0.253603976, 0.253721936}, // 23348K {0.253603266, 0.253720956}, // 23349K {0.253602556, 0.253719975}, // 23350K {0.253601847, 0.253718995}, // 23351K {0.253601137, 0.253718015}, // 23352K {0.253600428, 0.253717035}, // 23353K {0.253599719, 0.253716056}, // 23354K {0.253599009, 0.253715076}, // 23355K {0.2535983, 0.253714096}, // 23356K {0.253597591, 0.253713117}, // 23357K {0.253596882, 0.253712137}, // 23358K {0.253596173, 0.253711158}, // 23359K {0.253595464, 0.253710179}, // 23360K {0.253594755, 0.2537092}, // 23361K {0.253594046, 0.25370822}, // 23362K {0.253593338, 0.253707241}, // 23363K {0.253592629, 0.253706263}, // 23364K {0.253591921, 0.253705284}, // 23365K {0.253591212, 0.253704305}, // 23366K {0.253590504, 0.253703327}, // 23367K {0.253589795, 0.253702348}, // 23368K {0.253589087, 0.25370137}, // 23369K {0.253588379, 0.253700391}, // 23370K {0.253587671, 0.253699413}, // 23371K {0.253586963, 0.253698435}, // 23372K {0.253586255, 0.253697457}, // 23373K {0.253585547, 0.253696479}, // 23374K {0.253584839, 0.253695501}, // 23375K {0.253584131, 0.253694524}, // 23376K {0.253583424, 0.253693546}, // 23377K {0.253582716, 0.253692568}, // 23378K {0.253582008, 0.253691591}, // 23379K {0.253581301, 0.253690614}, // 23380K {0.253580594, 0.253689636}, // 23381K {0.253579886, 0.253688659}, // 23382K {0.253579179, 0.253687682}, // 23383K {0.253578472, 0.253686705}, // 23384K {0.253577765, 0.253685728}, // 23385K {0.253577058, 0.253684751}, // 23386K {0.253576351, 0.253683775}, // 23387K {0.253575644, 0.253682798}, // 23388K {0.253574937, 0.253681822}, // 23389K {0.25357423, 0.253680845}, // 23390K {0.253573523, 0.253679869}, // 23391K {0.253572817, 0.253678893}, // 23392K {0.25357211, 0.253677917}, // 23393K {0.253571404, 0.25367694}, // 23394K {0.253570697, 0.253675965}, // 23395K {0.253569991, 0.253674989}, // 23396K {0.253569285, 0.253674013}, // 23397K {0.253568578, 0.253673037}, // 23398K {0.253567872, 0.253672062}, // 23399K {0.253567166, 0.253671086}, // 23400K {0.25356646, 0.253670111}, // 23401K {0.253565754, 0.253669136}, // 23402K {0.253565048, 0.25366816}, // 23403K {0.253564343, 0.253667185}, // 23404K {0.253563637, 0.25366621}, // 23405K {0.253562931, 0.253665235}, // 23406K {0.253562226, 0.253664261}, // 23407K {0.25356152, 0.253663286}, // 23408K {0.253560815, 0.253662311}, // 23409K {0.253560109, 0.253661337}, // 23410K {0.253559404, 0.253660362}, // 23411K {0.253558699, 0.253659388}, // 23412K {0.253557994, 0.253658414}, // 23413K {0.253557289, 0.253657439}, // 23414K {0.253556584, 0.253656465}, // 23415K {0.253555879, 0.253655491}, // 23416K {0.253555174, 0.253654517}, // 23417K {0.253554469, 0.253653544}, // 23418K {0.253553764, 0.25365257}, // 23419K {0.25355306, 0.253651596}, // 23420K {0.253552355, 0.253650623}, // 23421K {0.253551651, 0.253649649}, // 23422K {0.253550946, 0.253648676}, // 23423K {0.253550242, 0.253647703}, // 23424K {0.253549538, 0.25364673}, // 23425K {0.253548833, 0.253645757}, // 23426K {0.253548129, 0.253644784}, // 23427K {0.253547425, 0.253643811}, // 23428K {0.253546721, 0.253642838}, // 23429K {0.253546017, 0.253641866}, // 23430K {0.253545313, 0.253640893}, // 23431K {0.253544609, 0.25363992}, // 23432K {0.253543906, 0.253638948}, // 23433K {0.253543202, 0.253637976}, // 23434K {0.253542498, 0.253637004}, // 23435K {0.253541795, 0.253636032}, // 23436K {0.253541092, 0.25363506}, // 23437K {0.253540388, 0.253634088}, // 23438K {0.253539685, 0.253633116}, // 23439K {0.253538982, 0.253632144}, // 23440K {0.253538278, 0.253631172}, // 23441K {0.253537575, 0.253630201}, // 23442K {0.253536872, 0.253629229}, // 23443K {0.253536169, 0.253628258}, // 23444K {0.253535466, 0.253627287}, // 23445K {0.253534764, 0.253626316}, // 23446K {0.253534061, 0.253625345}, // 23447K {0.253533358, 0.253624374}, // 23448K {0.253532656, 0.253623403}, // 23449K {0.253531953, 0.253622432}, // 23450K {0.253531251, 0.253621461}, // 23451K {0.253530548, 0.253620491}, // 23452K {0.253529846, 0.25361952}, // 23453K {0.253529144, 0.25361855}, // 23454K {0.253528441, 0.253617579}, // 23455K {0.253527739, 0.253616609}, // 23456K {0.253527037, 0.253615639}, // 23457K {0.253526335, 0.253614669}, // 23458K {0.253525633, 0.253613699}, // 23459K {0.253524932, 0.253612729}, // 23460K {0.25352423, 0.253611759}, // 23461K {0.253523528, 0.25361079}, // 23462K {0.253522826, 0.25360982}, // 23463K {0.253522125, 0.253608851}, // 23464K {0.253521423, 0.253607881}, // 23465K {0.253520722, 0.253606912}, // 23466K {0.253520021, 0.253605943}, // 23467K {0.253519319, 0.253604973}, // 23468K {0.253518618, 0.253604004}, // 23469K {0.253517917, 0.253603036}, // 23470K {0.253517216, 0.253602067}, // 23471K {0.253516515, 0.253601098}, // 23472K {0.253515814, 0.253600129}, // 23473K {0.253515113, 0.253599161}, // 23474K {0.253514412, 0.253598192}, // 23475K {0.253513712, 0.253597224}, // 23476K {0.253513011, 0.253596256}, // 23477K {0.253512311, 0.253595287}, // 23478K {0.25351161, 0.253594319}, // 23479K {0.25351091, 0.253593351}, // 23480K {0.253510209, 0.253592383}, // 23481K {0.253509509, 0.253591416}, // 23482K {0.253508809, 0.253590448}, // 23483K {0.253508109, 0.25358948}, // 23484K {0.253507408, 0.253588513}, // 23485K {0.253506708, 0.253587545}, // 23486K {0.253506009, 0.253586578}, // 23487K {0.253505309, 0.253585611}, // 23488K {0.253504609, 0.253584643}, // 23489K {0.253503909, 0.253583676}, // 23490K {0.253503209, 0.253582709}, // 23491K {0.25350251, 0.253581742}, // 23492K {0.25350181, 0.253580776}, // 23493K {0.253501111, 0.253579809}, // 23494K {0.253500412, 0.253578842}, // 23495K {0.253499712, 0.253577876}, // 23496K {0.253499013, 0.253576909}, // 23497K {0.253498314, 0.253575943}, // 23498K {0.253497615, 0.253574977}, // 23499K {0.253496916, 0.253574011}, // 23500K {0.253496217, 0.253573045}, // 23501K {0.253495518, 0.253572079}, // 23502K {0.253494819, 0.253571113}, // 23503K {0.25349412, 0.253570147}, // 23504K {0.253493421, 0.253569181}, // 23505K {0.253492723, 0.253568216}, // 23506K {0.253492024, 0.25356725}, // 23507K {0.253491326, 0.253566285}, // 23508K {0.253490627, 0.25356532}, // 23509K {0.253489929, 0.253564354}, // 23510K {0.253489231, 0.253563389}, // 23511K {0.253488533, 0.253562424}, // 23512K {0.253487835, 0.253561459}, // 23513K {0.253487136, 0.253560494}, // 23514K {0.253486438, 0.25355953}, // 23515K {0.253485741, 0.253558565}, // 23516K {0.253485043, 0.2535576}, // 23517K {0.253484345, 0.253556636}, // 23518K {0.253483647, 0.253555671}, // 23519K {0.25348295, 0.253554707}, // 23520K {0.253482252, 0.253553743}, // 23521K {0.253481554, 0.253552779}, // 23522K {0.253480857, 0.253551815}, // 23523K {0.25348016, 0.253550851}, // 23524K {0.253479462, 0.253549887}, // 23525K {0.253478765, 0.253548923}, // 23526K {0.253478068, 0.25354796}, // 23527K {0.253477371, 0.253546996}, // 23528K {0.253476674, 0.253546033}, // 23529K {0.253475977, 0.253545069}, // 23530K {0.25347528, 0.253544106}, // 23531K {0.253474583, 0.253543143}, // 23532K {0.253473887, 0.25354218}, // 23533K {0.25347319, 0.253541217}, // 23534K {0.253472493, 0.253540254}, // 23535K {0.253471797, 0.253539291}, // 23536K {0.2534711, 0.253538328}, // 23537K {0.253470404, 0.253537366}, // 23538K {0.253469708, 0.253536403}, // 23539K {0.253469011, 0.25353544}, // 23540K {0.253468315, 0.253534478}, // 23541K {0.253467619, 0.253533516}, // 23542K {0.253466923, 0.253532554}, // 23543K {0.253466227, 0.253531592}, // 23544K {0.253465531, 0.25353063}, // 23545K {0.253464835, 0.253529668}, // 23546K {0.253464139, 0.253528706}, // 23547K {0.253463444, 0.253527744}, // 23548K {0.253462748, 0.253526783}, // 23549K {0.253462053, 0.253525821}, // 23550K {0.253461357, 0.25352486}, // 23551K {0.253460662, 0.253523898}, // 23552K {0.253459966, 0.253522937}, // 23553K {0.253459271, 0.253521976}, // 23554K {0.253458576, 0.253521015}, // 23555K {0.253457881, 0.253520054}, // 23556K {0.253457186, 0.253519093}, // 23557K {0.253456491, 0.253518132}, // 23558K {0.253455796, 0.253517171}, // 23559K {0.253455101, 0.253516211}, // 23560K {0.253454406, 0.25351525}, // 23561K {0.253453711, 0.25351429}, // 23562K {0.253453017, 0.253513329}, // 23563K {0.253452322, 0.253512369}, // 23564K {0.253451628, 0.253511409}, // 23565K {0.253450933, 0.253510449}, // 23566K {0.253450239, 0.253509489}, // 23567K {0.253449544, 0.253508529}, // 23568K {0.25344885, 0.253507569}, // 23569K {0.253448156, 0.25350661}, // 23570K {0.253447462, 0.25350565}, // 23571K {0.253446768, 0.25350469}, // 23572K {0.253446074, 0.253503731}, // 23573K {0.25344538, 0.253502772}, // 23574K {0.253444686, 0.253501812}, // 23575K {0.253443992, 0.253500853}, // 23576K {0.253443299, 0.253499894}, // 23577K {0.253442605, 0.253498935}, // 23578K {0.253441911, 0.253497976}, // 23579K {0.253441218, 0.253497018}, // 23580K {0.253440525, 0.253496059}, // 23581K {0.253439831, 0.2534951}, // 23582K {0.253439138, 0.253494142}, // 23583K {0.253438445, 0.253493183}, // 23584K {0.253437752, 0.253492225}, // 23585K {0.253437059, 0.253491267}, // 23586K {0.253436366, 0.253490309}, // 23587K {0.253435673, 0.253489351}, // 23588K {0.25343498, 0.253488393}, // 23589K {0.253434287, 0.253487435}, // 23590K {0.253433594, 0.253486477}, // 23591K {0.253432902, 0.253485519}, // 23592K {0.253432209, 0.253484562}, // 23593K {0.253431516, 0.253483604}, // 23594K {0.253430824, 0.253482647}, // 23595K {0.253430132, 0.25348169}, // 23596K {0.253429439, 0.253480732}, // 23597K {0.253428747, 0.253479775}, // 23598K {0.253428055, 0.253478818}, // 23599K {0.253427363, 0.253477861}, // 23600K {0.253426671, 0.253476904}, // 23601K {0.253425979, 0.253475948}, // 23602K {0.253425287, 0.253474991}, // 23603K {0.253424595, 0.253474034}, // 23604K {0.253423903, 0.253473078}, // 23605K {0.253423212, 0.253472121}, // 23606K {0.25342252, 0.253471165}, // 23607K {0.253421828, 0.253470209}, // 23608K {0.253421137, 0.253469253}, // 23609K {0.253420445, 0.253468297}, // 23610K {0.253419754, 0.253467341}, // 23611K {0.253419063, 0.253466385}, // 23612K {0.253418372, 0.253465429}, // 23613K {0.25341768, 0.253464473}, // 23614K {0.253416989, 0.253463518}, // 23615K {0.253416298, 0.253462562}, // 23616K {0.253415607, 0.253461607}, // 23617K {0.253414917, 0.253460652}, // 23618K {0.253414226, 0.253459696}, // 23619K {0.253413535, 0.253458741}, // 23620K {0.253412844, 0.253457786}, // 23621K {0.253412154, 0.253456831}, // 23622K {0.253411463, 0.253455876}, // 23623K {0.253410773, 0.253454922}, // 23624K {0.253410082, 0.253453967}, // 23625K {0.253409392, 0.253453012}, // 23626K {0.253408702, 0.253452058}, // 23627K {0.253408012, 0.253451104}, // 23628K {0.253407321, 0.253450149}, // 23629K {0.253406631, 0.253449195}, // 23630K {0.253405941, 0.253448241}, // 23631K {0.253405251, 0.253447287}, // 23632K {0.253404562, 0.253446333}, // 23633K {0.253403872, 0.253445379}, // 23634K {0.253403182, 0.253444425}, // 23635K {0.253402493, 0.253443472}, // 23636K {0.253401803, 0.253442518}, // 23637K {0.253401113, 0.253441565}, // 23638K {0.253400424, 0.253440611}, // 23639K {0.253399735, 0.253439658}, // 23640K {0.253399045, 0.253438705}, // 23641K {0.253398356, 0.253437752}, // 23642K {0.253397667, 0.253436798}, // 23643K {0.253396978, 0.253435846}, // 23644K {0.253396289, 0.253434893}, // 23645K {0.2533956, 0.25343394}, // 23646K {0.253394911, 0.253432987}, // 23647K {0.253394222, 0.253432035}, // 23648K {0.253393533, 0.253431082}, // 23649K {0.253392845, 0.25343013}, // 23650K {0.253392156, 0.253429177}, // 23651K {0.253391468, 0.253428225}, // 23652K {0.253390779, 0.253427273}, // 23653K {0.253390091, 0.253426321}, // 23654K {0.253389402, 0.253425369}, // 23655K {0.253388714, 0.253424417}, // 23656K {0.253388026, 0.253423465}, // 23657K {0.253387338, 0.253422514}, // 23658K {0.25338665, 0.253421562}, // 23659K {0.253385962, 0.253420611}, // 23660K {0.253385274, 0.253419659}, // 23661K {0.253384586, 0.253418708}, // 23662K {0.253383898, 0.253417757}, // 23663K {0.25338321, 0.253416806}, // 23664K {0.253382523, 0.253415855}, // 23665K {0.253381835, 0.253414904}, // 23666K {0.253381148, 0.253413953}, // 23667K {0.25338046, 0.253413002}, // 23668K {0.253379773, 0.253412051}, // 23669K {0.253379085, 0.253411101}, // 23670K {0.253378398, 0.25341015}, // 23671K {0.253377711, 0.2534092}, // 23672K {0.253377024, 0.25340825}, // 23673K {0.253376337, 0.253407299}, // 23674K {0.25337565, 0.253406349}, // 23675K {0.253374963, 0.253405399}, // 23676K {0.253374276, 0.253404449}, // 23677K {0.253373589, 0.253403499}, // 23678K {0.253372903, 0.253402549}, // 23679K {0.253372216, 0.2534016}, // 23680K {0.253371529, 0.25340065}, // 23681K {0.253370843, 0.253399701}, // 23682K {0.253370156, 0.253398751}, // 23683K {0.25336947, 0.253397802}, // 23684K {0.253368784, 0.253396853}, // 23685K {0.253368098, 0.253395904}, // 23686K {0.253367411, 0.253394955}, // 23687K {0.253366725, 0.253394006}, // 23688K {0.253366039, 0.253393057}, // 23689K {0.253365353, 0.253392108}, // 23690K {0.253364667, 0.253391159}, // 23691K {0.253363982, 0.253390211}, // 23692K {0.253363296, 0.253389262}, // 23693K {0.25336261, 0.253388314}, // 23694K {0.253361924, 0.253387365}, // 23695K {0.253361239, 0.253386417}, // 23696K {0.253360553, 0.253385469}, // 23697K {0.253359868, 0.253384521}, // 23698K {0.253359183, 0.253383573}, // 23699K {0.253358497, 0.253382625}, // 23700K {0.253357812, 0.253381677}, // 23701K {0.253357127, 0.253380729}, // 23702K {0.253356442, 0.253379782}, // 23703K {0.253355757, 0.253378834}, // 23704K {0.253355072, 0.253377887}, // 23705K {0.253354387, 0.25337694}, // 23706K {0.253353702, 0.253375992}, // 23707K {0.253353018, 0.253375045}, // 23708K {0.253352333, 0.253374098}, // 23709K {0.253351648, 0.253373151}, // 23710K {0.253350964, 0.253372204}, // 23711K {0.253350279, 0.253371257}, // 23712K {0.253349595, 0.253370311}, // 23713K {0.253348911, 0.253369364}, // 23714K {0.253348226, 0.253368418}, // 23715K {0.253347542, 0.253367471}, // 23716K {0.253346858, 0.253366525}, // 23717K {0.253346174, 0.253365578}, // 23718K {0.25334549, 0.253364632}, // 23719K {0.253344806, 0.253363686}, // 23720K {0.253344122, 0.25336274}, // 23721K {0.253343438, 0.253361794}, // 23722K {0.253342755, 0.253360849}, // 23723K {0.253342071, 0.253359903}, // 23724K {0.253341387, 0.253358957}, // 23725K {0.253340704, 0.253358012}, // 23726K {0.25334002, 0.253357066}, // 23727K {0.253339337, 0.253356121}, // 23728K {0.253338654, 0.253355175}, // 23729K {0.25333797, 0.25335423}, // 23730K {0.253337287, 0.253353285}, // 23731K {0.253336604, 0.25335234}, // 23732K {0.253335921, 0.253351395}, // 23733K {0.253335238, 0.25335045}, // 23734K {0.253334555, 0.253349506}, // 23735K {0.253333872, 0.253348561}, // 23736K {0.253333189, 0.253347617}, // 23737K {0.253332507, 0.253346672}, // 23738K {0.253331824, 0.253345728}, // 23739K {0.253331142, 0.253344783}, // 23740K {0.253330459, 0.253343839}, // 23741K {0.253329777, 0.253342895}, // 23742K {0.253329094, 0.253341951}, // 23743K {0.253328412, 0.253341007}, // 23744K {0.25332773, 0.253340063}, // 23745K {0.253327047, 0.25333912}, // 23746K {0.253326365, 0.253338176}, // 23747K {0.253325683, 0.253337232}, // 23748K {0.253325001, 0.253336289}, // 23749K {0.253324319, 0.253335345}, // 23750K {0.253323638, 0.253334402}, // 23751K {0.253322956, 0.253333459}, // 23752K {0.253322274, 0.253332516}, // 23753K {0.253321592, 0.253331573}, // 23754K {0.253320911, 0.25333063}, // 23755K {0.253320229, 0.253329687}, // 23756K {0.253319548, 0.253328744}, // 23757K {0.253318867, 0.253327801}, // 23758K {0.253318185, 0.253326859}, // 23759K {0.253317504, 0.253325916}, // 23760K {0.253316823, 0.253324974}, // 23761K {0.253316142, 0.253324032}, // 23762K {0.253315461, 0.253323089}, // 23763K {0.25331478, 0.253322147}, // 23764K {0.253314099, 0.253321205}, // 23765K {0.253313418, 0.253320263}, // 23766K {0.253312737, 0.253319321}, // 23767K {0.253312057, 0.25331838}, // 23768K {0.253311376, 0.253317438}, // 23769K {0.253310695, 0.253316496}, // 23770K {0.253310015, 0.253315555}, // 23771K {0.253309334, 0.253314613}, // 23772K {0.253308654, 0.253313672}, // 23773K {0.253307974, 0.253312731}, // 23774K {0.253307294, 0.25331179}, // 23775K {0.253306613, 0.253310848}, // 23776K {0.253305933, 0.253309907}, // 23777K {0.253305253, 0.253308967}, // 23778K {0.253304573, 0.253308026}, // 23779K {0.253303893, 0.253307085}, // 23780K {0.253303214, 0.253306144}, // 23781K {0.253302534, 0.253305204}, // 23782K {0.253301854, 0.253304263}, // 23783K {0.253301175, 0.253303323}, // 23784K {0.253300495, 0.253302383}, // 23785K {0.253299816, 0.253301443}, // 23786K {0.253299136, 0.253300503}, // 23787K {0.253298457, 0.253299563}, // 23788K {0.253297777, 0.253298623}, // 23789K {0.253297098, 0.253297683}, // 23790K {0.253296419, 0.253296743}, // 23791K {0.25329574, 0.253295803}, // 23792K {0.253295061, 0.253294864}, // 23793K {0.253294382, 0.253293924}, // 23794K {0.253293703, 0.253292985}, // 23795K {0.253293024, 0.253292046}, // 23796K {0.253292346, 0.253291106}, // 23797K {0.253291667, 0.253290167}, // 23798K {0.253290988, 0.253289228}, // 23799K {0.25329031, 0.253288289}, // 23800K {0.253289631, 0.253287351}, // 23801K {0.253288953, 0.253286412}, // 23802K {0.253288274, 0.253285473}, // 23803K {0.253287596, 0.253284534}, // 23804K {0.253286918, 0.253283596}, // 23805K {0.25328624, 0.253282658}, // 23806K {0.253285562, 0.253281719}, // 23807K {0.253284884, 0.253280781}, // 23808K {0.253284206, 0.253279843}, // 23809K {0.253283528, 0.253278905}, // 23810K {0.25328285, 0.253277967}, // 23811K {0.253282172, 0.253277029}, // 23812K {0.253281495, 0.253276091}, // 23813K {0.253280817, 0.253275154}, // 23814K {0.253280139, 0.253274216}, // 23815K {0.253279462, 0.253273278}, // 23816K {0.253278784, 0.253272341}, // 23817K {0.253278107, 0.253271404}, // 23818K {0.25327743, 0.253270466}, // 23819K {0.253276753, 0.253269529}, // 23820K {0.253276075, 0.253268592}, // 23821K {0.253275398, 0.253267655}, // 23822K {0.253274721, 0.253266718}, // 23823K {0.253274044, 0.253265781}, // 23824K {0.253273367, 0.253264845}, // 23825K {0.253272691, 0.253263908}, // 23826K {0.253272014, 0.253262972}, // 23827K {0.253271337, 0.253262035}, // 23828K {0.253270661, 0.253261099}, // 23829K {0.253269984, 0.253260162}, // 23830K {0.253269308, 0.253259226}, // 23831K {0.253268631, 0.25325829}, // 23832K {0.253267955, 0.253257354}, // 23833K {0.253267278, 0.253256418}, // 23834K {0.253266602, 0.253255482}, // 23835K {0.253265926, 0.253254547}, // 23836K {0.25326525, 0.253253611}, // 23837K {0.253264574, 0.253252675}, // 23838K {0.253263898, 0.25325174}, // 23839K {0.253263222, 0.253250805}, // 23840K {0.253262546, 0.253249869}, // 23841K {0.253261871, 0.253248934}, // 23842K {0.253261195, 0.253247999}, // 23843K {0.253260519, 0.253247064}, // 23844K {0.253259844, 0.253246129}, // 23845K {0.253259168, 0.253245194}, // 23846K {0.253258493, 0.253244259}, // 23847K {0.253257817, 0.253243325}, // 23848K {0.253257142, 0.25324239}, // 23849K {0.253256467, 0.253241455}, // 23850K {0.253255792, 0.253240521}, // 23851K {0.253255117, 0.253239587}, // 23852K {0.253254442, 0.253238652}, // 23853K {0.253253767, 0.253237718}, // 23854K {0.253253092, 0.253236784}, // 23855K {0.253252417, 0.25323585}, // 23856K {0.253251742, 0.253234916}, // 23857K {0.253251067, 0.253233982}, // 23858K {0.253250393, 0.253233049}, // 23859K {0.253249718, 0.253232115}, // 23860K {0.253249044, 0.253231182}, // 23861K {0.253248369, 0.253230248}, // 23862K {0.253247695, 0.253229315}, // 23863K {0.253247021, 0.253228381}, // 23864K {0.253246346, 0.253227448}, // 23865K {0.253245672, 0.253226515}, // 23866K {0.253244998, 0.253225582}, // 23867K {0.253244324, 0.253224649}, // 23868K {0.25324365, 0.253223716}, // 23869K {0.253242976, 0.253222784}, // 23870K {0.253242302, 0.253221851}, // 23871K {0.253241629, 0.253220918}, // 23872K {0.253240955, 0.253219986}, // 23873K {0.253240281, 0.253219054}, // 23874K {0.253239608, 0.253218121}, // 23875K {0.253238934, 0.253217189}, // 23876K {0.253238261, 0.253216257}, // 23877K {0.253237587, 0.253215325}, // 23878K {0.253236914, 0.253214393}, // 23879K {0.253236241, 0.253213461}, // 23880K {0.253235568, 0.253212529}, // 23881K {0.253234895, 0.253211597}, // 23882K {0.253234222, 0.253210666}, // 23883K {0.253233549, 0.253209734}, // 23884K {0.253232876, 0.253208803}, // 23885K {0.253232203, 0.253207872}, // 23886K {0.25323153, 0.25320694}, // 23887K {0.253230857, 0.253206009}, // 23888K {0.253230185, 0.253205078}, // 23889K {0.253229512, 0.253204147}, // 23890K {0.25322884, 0.253203216}, // 23891K {0.253228167, 0.253202285}, // 23892K {0.253227495, 0.253201355}, // 23893K {0.253226822, 0.253200424}, // 23894K {0.25322615, 0.253199493}, // 23895K {0.253225478, 0.253198563}, // 23896K {0.253224806, 0.253197633}, // 23897K {0.253224134, 0.253196702}, // 23898K {0.253223462, 0.253195772}, // 23899K {0.25322279, 0.253194842}, // 23900K {0.253222118, 0.253193912}, // 23901K {0.253221446, 0.253192982}, // 23902K {0.253220774, 0.253192052}, // 23903K {0.253220103, 0.253191122}, // 23904K {0.253219431, 0.253190193}, // 23905K {0.25321876, 0.253189263}, // 23906K {0.253218088, 0.253188334}, // 23907K {0.253217417, 0.253187404}, // 23908K {0.253216746, 0.253186475}, // 23909K {0.253216074, 0.253185546}, // 23910K {0.253215403, 0.253184616}, // 23911K {0.253214732, 0.253183687}, // 23912K {0.253214061, 0.253182758}, // 23913K {0.25321339, 0.253181829}, // 23914K {0.253212719, 0.253180901}, // 23915K {0.253212048, 0.253179972}, // 23916K {0.253211377, 0.253179043}, // 23917K {0.253210706, 0.253178115}, // 23918K {0.253210036, 0.253177186}, // 23919K {0.253209365, 0.253176258}, // 23920K {0.253208695, 0.25317533}, // 23921K {0.253208024, 0.253174402}, // 23922K {0.253207354, 0.253173473}, // 23923K {0.253206683, 0.253172545}, // 23924K {0.253206013, 0.253171617}, // 23925K {0.253205343, 0.25317069}, // 23926K {0.253204673, 0.253169762}, // 23927K {0.253204003, 0.253168834}, // 23928K {0.253203333, 0.253167907}, // 23929K {0.253202663, 0.253166979}, // 23930K {0.253201993, 0.253166052}, // 23931K {0.253201323, 0.253165124}, // 23932K {0.253200653, 0.253164197}, // 23933K {0.253199984, 0.25316327}, // 23934K {0.253199314, 0.253162343}, // 23935K {0.253198644, 0.253161416}, // 23936K {0.253197975, 0.253160489}, // 23937K {0.253197305, 0.253159562}, // 23938K {0.253196636, 0.253158636}, // 23939K {0.253195967, 0.253157709}, // 23940K {0.253195298, 0.253156782}, // 23941K {0.253194628, 0.253155856}, // 23942K {0.253193959, 0.25315493}, // 23943K {0.25319329, 0.253154003}, // 23944K {0.253192621, 0.253153077}, // 23945K {0.253191952, 0.253152151}, // 23946K {0.253191284, 0.253151225}, // 23947K {0.253190615, 0.253150299}, // 23948K {0.253189946, 0.253149373}, // 23949K {0.253189277, 0.253148448}, // 23950K {0.253188609, 0.253147522}, // 23951K {0.25318794, 0.253146596}, // 23952K {0.253187272, 0.253145671}, // 23953K {0.253186604, 0.253144745}, // 23954K {0.253185935, 0.25314382}, // 23955K {0.253185267, 0.253142895}, // 23956K {0.253184599, 0.25314197}, // 23957K {0.253183931, 0.253141045}, // 23958K {0.253183263, 0.25314012}, // 23959K {0.253182595, 0.253139195}, // 23960K {0.253181927, 0.25313827}, // 23961K {0.253181259, 0.253137345}, // 23962K {0.253180591, 0.253136421}, // 23963K {0.253179923, 0.253135496}, // 23964K {0.253179256, 0.253134572}, // 23965K {0.253178588, 0.253133647}, // 23966K {0.25317792, 0.253132723}, // 23967K {0.253177253, 0.253131799}, // 23968K {0.253176586, 0.253130875}, // 23969K {0.253175918, 0.253129951}, // 23970K {0.253175251, 0.253129027}, // 23971K {0.253174584, 0.253128103}, // 23972K {0.253173917, 0.253127179}, // 23973K {0.25317325, 0.253126256}, // 23974K {0.253172583, 0.253125332}, // 23975K {0.253171916, 0.253124408}, // 23976K {0.253171249, 0.253123485}, // 23977K {0.253170582, 0.253122562}, // 23978K {0.253169915, 0.253121638}, // 23979K {0.253169248, 0.253120715}, // 23980K {0.253168582, 0.253119792}, // 23981K {0.253167915, 0.253118869}, // 23982K {0.253167249, 0.253117946}, // 23983K {0.253166582, 0.253117024}, // 23984K {0.253165916, 0.253116101}, // 23985K {0.25316525, 0.253115178}, // 23986K {0.253164583, 0.253114256}, // 23987K {0.253163917, 0.253113333}, // 23988K {0.253163251, 0.253112411}, // 23989K {0.253162585, 0.253111489}, // 23990K {0.253161919, 0.253110566}, // 23991K {0.253161253, 0.253109644}, // 23992K {0.253160587, 0.253108722}, // 23993K {0.253159922, 0.2531078}, // 23994K {0.253159256, 0.253106879}, // 23995K {0.25315859, 0.253105957}, // 23996K {0.253157925, 0.253105035}, // 23997K {0.253157259, 0.253104114}, // 23998K {0.253156594, 0.253103192}, // 23999K {0.253155928, 0.253102271}, // 24000K {0.253155263, 0.253101349}, // 24001K {0.253154598, 0.253100428}, // 24002K {0.253153933, 0.253099507}, // 24003K {0.253153267, 0.253098586}, // 24004K {0.253152602, 0.253097665}, // 24005K {0.253151937, 0.253096744}, // 24006K {0.253151273, 0.253095823}, // 24007K {0.253150608, 0.253094902}, // 24008K {0.253149943, 0.253093982}, // 24009K {0.253149278, 0.253093061}, // 24010K {0.253148613, 0.253092141}, // 24011K {0.253147949, 0.25309122}, // 24012K {0.253147284, 0.2530903}, // 24013K {0.25314662, 0.25308938}, // 24014K {0.253145955, 0.25308846}, // 24015K {0.253145291, 0.25308754}, // 24016K {0.253144627, 0.25308662}, // 24017K {0.253143963, 0.2530857}, // 24018K {0.253143298, 0.25308478}, // 24019K {0.253142634, 0.25308386}, // 24020K {0.25314197, 0.253082941}, // 24021K {0.253141306, 0.253082021}, // 24022K {0.253140642, 0.253081102}, // 24023K {0.253139979, 0.253080182}, // 24024K {0.253139315, 0.253079263}, // 24025K {0.253138651, 0.253078344}, // 24026K {0.253137987, 0.253077425}, // 24027K {0.253137324, 0.253076506}, // 24028K {0.25313666, 0.253075587}, // 24029K {0.253135997, 0.253074668}, // 24030K {0.253135334, 0.253073749}, // 24031K {0.25313467, 0.253072831}, // 24032K {0.253134007, 0.253071912}, // 24033K {0.253133344, 0.253070994}, // 24034K {0.253132681, 0.253070075}, // 24035K {0.253132018, 0.253069157}, // 24036K {0.253131355, 0.253068239}, // 24037K {0.253130692, 0.253067321}, // 24038K {0.253130029, 0.253066403}, // 24039K {0.253129366, 0.253065485}, // 24040K {0.253128703, 0.253064567}, // 24041K {0.253128041, 0.253063649}, // 24042K {0.253127378, 0.253062731}, // 24043K {0.253126715, 0.253061814}, // 24044K {0.253126053, 0.253060896}, // 24045K {0.253125391, 0.253059979}, // 24046K {0.253124728, 0.253059061}, // 24047K {0.253124066, 0.253058144}, // 24048K {0.253123404, 0.253057227}, // 24049K {0.253122742, 0.25305631}, // 24050K {0.25312208, 0.253055393}, // 24051K {0.253121417, 0.253054476}, // 24052K {0.253120756, 0.253053559}, // 24053K {0.253120094, 0.253052642}, // 24054K {0.253119432, 0.253051725}, // 24055K {0.25311877, 0.253050809}, // 24056K {0.253118108, 0.253049892}, // 24057K {0.253117447, 0.253048976}, // 24058K {0.253116785, 0.25304806}, // 24059K {0.253116124, 0.253047143}, // 24060K {0.253115462, 0.253046227}, // 24061K {0.253114801, 0.253045311}, // 24062K {0.253114139, 0.253044395}, // 24063K {0.253113478, 0.253043479}, // 24064K {0.253112817, 0.253042563}, // 24065K {0.253112156, 0.253041648}, // 24066K {0.253111495, 0.253040732}, // 24067K {0.253110834, 0.253039816}, // 24068K {0.253110173, 0.253038901}, // 24069K {0.253109512, 0.253037985}, // 24070K {0.253108851, 0.25303707}, // 24071K {0.253108191, 0.253036155}, // 24072K {0.25310753, 0.25303524}, // 24073K {0.253106869, 0.253034325}, // 24074K {0.253106209, 0.25303341}, // 24075K {0.253105548, 0.253032495}, // 24076K {0.253104888, 0.25303158}, // 24077K {0.253104227, 0.253030665}, // 24078K {0.253103567, 0.253029751}, // 24079K {0.253102907, 0.253028836}, // 24080K {0.253102247, 0.253027922}, // 24081K {0.253101587, 0.253027007}, // 24082K {0.253100927, 0.253026093}, // 24083K {0.253100267, 0.253025179}, // 24084K {0.253099607, 0.253024265}, // 24085K {0.253098947, 0.253023351}, // 24086K {0.253098287, 0.253022437}, // 24087K {0.253097627, 0.253021523}, // 24088K {0.253096968, 0.253020609}, // 24089K {0.253096308, 0.253019695}, // 24090K {0.253095649, 0.253018782}, // 24091K {0.253094989, 0.253017868}, // 24092K {0.25309433, 0.253016955}, // 24093K {0.253093671, 0.253016042}, // 24094K {0.253093011, 0.253015128}, // 24095K {0.253092352, 0.253014215}, // 24096K {0.253091693, 0.253013302}, // 24097K {0.253091034, 0.253012389}, // 24098K {0.253090375, 0.253011476}, // 24099K {0.253089716, 0.253010563}, // 24100K {0.253089057, 0.253009651}, // 24101K {0.253088398, 0.253008738}, // 24102K {0.253087739, 0.253007825}, // 24103K {0.253087081, 0.253006913}, // 24104K {0.253086422, 0.253006}, // 24105K {0.253085764, 0.253005088}, // 24106K {0.253085105, 0.253004176}, // 24107K {0.253084447, 0.253003264}, // 24108K {0.253083788, 0.253002352}, // 24109K {0.25308313, 0.25300144}, // 24110K {0.253082472, 0.253000528}, // 24111K {0.253081814, 0.252999616}, // 24112K {0.253081155, 0.252998704}, // 24113K {0.253080497, 0.252997793}, // 24114K {0.253079839, 0.252996881}, // 24115K {0.253079182, 0.25299597}, // 24116K {0.253078524, 0.252995058}, // 24117K {0.253077866, 0.252994147}, // 24118K {0.253077208, 0.252993236}, // 24119K {0.25307655, 0.252992324}, // 24120K {0.253075893, 0.252991413}, // 24121K {0.253075235, 0.252990502}, // 24122K {0.253074578, 0.252989592}, // 24123K {0.25307392, 0.252988681}, // 24124K {0.253073263, 0.25298777}, // 24125K {0.253072606, 0.252986859}, // 24126K {0.253071949, 0.252985949}, // 24127K {0.253071291, 0.252985038}, // 24128K {0.253070634, 0.252984128}, // 24129K {0.253069977, 0.252983218}, // 24130K {0.25306932, 0.252982308}, // 24131K {0.253068663, 0.252981398}, // 24132K {0.253068007, 0.252980488}, // 24133K {0.25306735, 0.252979578}, // 24134K {0.253066693, 0.252978668}, // 24135K {0.253066036, 0.252977758}, // 24136K {0.25306538, 0.252976848}, // 24137K {0.253064723, 0.252975939}, // 24138K {0.253064067, 0.252975029}, // 24139K {0.253063411, 0.25297412}, // 24140K {0.253062754, 0.25297321}, // 24141K {0.253062098, 0.252972301}, // 24142K {0.253061442, 0.252971392}, // 24143K {0.253060786, 0.252970483}, // 24144K {0.25306013, 0.252969574}, // 24145K {0.253059474, 0.252968665}, // 24146K {0.253058818, 0.252967756}, // 24147K {0.253058162, 0.252966847}, // 24148K {0.253057506, 0.252965939}, // 24149K {0.25305685, 0.25296503}, // 24150K {0.253056194, 0.252964122}, // 24151K {0.253055539, 0.252963213}, // 24152K {0.253054883, 0.252962305}, // 24153K {0.253054228, 0.252961397}, // 24154K {0.253053572, 0.252960488}, // 24155K {0.253052917, 0.25295958}, // 24156K {0.253052262, 0.252958672}, // 24157K {0.253051606, 0.252957764}, // 24158K {0.253050951, 0.252956857}, // 24159K {0.253050296, 0.252955949}, // 24160K {0.253049641, 0.252955041}, // 24161K {0.253048986, 0.252954134}, // 24162K {0.253048331, 0.252953226}, // 24163K {0.253047676, 0.252952319}, // 24164K {0.253047021, 0.252951411}, // 24165K {0.253046367, 0.252950504}, // 24166K {0.253045712, 0.252949597}, // 24167K {0.253045057, 0.25294869}, // 24168K {0.253044403, 0.252947783}, // 24169K {0.253043748, 0.252946876}, // 24170K {0.253043094, 0.252945969}, // 24171K {0.25304244, 0.252945062}, // 24172K {0.253041785, 0.252944156}, // 24173K {0.253041131, 0.252943249}, // 24174K {0.253040477, 0.252942343}, // 24175K {0.253039823, 0.252941436}, // 24176K {0.253039169, 0.25294053}, // 24177K {0.253038515, 0.252939624}, // 24178K {0.253037861, 0.252938718}, // 24179K {0.253037207, 0.252937812}, // 24180K {0.253036553, 0.252936906}, // 24181K {0.253035899, 0.252936}, // 24182K {0.253035246, 0.252935094}, // 24183K {0.253034592, 0.252934188}, // 24184K {0.253033939, 0.252933283}, // 24185K {0.253033285, 0.252932377}, // 24186K {0.253032632, 0.252931472}, // 24187K {0.253031978, 0.252930566}, // 24188K {0.253031325, 0.252929661}, // 24189K {0.253030672, 0.252928756}, // 24190K {0.253030019, 0.252927851}, // 24191K {0.253029366, 0.252926946}, // 24192K {0.253028713, 0.252926041}, // 24193K {0.25302806, 0.252925136}, // 24194K {0.253027407, 0.252924231}, // 24195K {0.253026754, 0.252923326}, // 24196K {0.253026101, 0.252922422}, // 24197K {0.253025448, 0.252921517}, // 24198K {0.253024796, 0.252920613}, // 24199K {0.253024143, 0.252919708}, // 24200K {0.253023491, 0.252918804}, // 24201K {0.253022838, 0.2529179}, // 24202K {0.253022186, 0.252916996}, // 24203K {0.253021533, 0.252916092}, // 24204K {0.253020881, 0.252915188}, // 24205K {0.253020229, 0.252914284}, // 24206K {0.253019577, 0.25291338}, // 24207K {0.253018925, 0.252912476}, // 24208K {0.253018273, 0.252911573}, // 24209K {0.253017621, 0.252910669}, // 24210K {0.253016969, 0.252909766}, // 24211K {0.253016317, 0.252908862}, // 24212K {0.253015665, 0.252907959}, // 24213K {0.253015014, 0.252907056}, // 24214K {0.253014362, 0.252906153}, // 24215K {0.25301371, 0.25290525}, // 24216K {0.253013059, 0.252904347}, // 24217K {0.253012407, 0.252903444}, // 24218K {0.253011756, 0.252902541}, // 24219K {0.253011105, 0.252901639}, // 24220K {0.253010453, 0.252900736}, // 24221K {0.253009802, 0.252899834}, // 24222K {0.253009151, 0.252898931}, // 24223K {0.2530085, 0.252898029}, // 24224K {0.253007849, 0.252897126}, // 24225K {0.253007198, 0.252896224}, // 24226K {0.253006547, 0.252895322}, // 24227K {0.253005896, 0.25289442}, // 24228K {0.253005245, 0.252893518}, // 24229K {0.253004595, 0.252892616}, // 24230K {0.253003944, 0.252891715}, // 24231K {0.253003294, 0.252890813}, // 24232K {0.253002643, 0.252889911}, // 24233K {0.253001993, 0.25288901}, // 24234K {0.253001342, 0.252888108}, // 24235K {0.253000692, 0.252887207}, // 24236K {0.253000042, 0.252886306}, // 24237K {0.252999391, 0.252885405}, // 24238K {0.252998741, 0.252884503}, // 24239K {0.252998091, 0.252883602}, // 24240K {0.252997441, 0.252882702}, // 24241K {0.252996791, 0.252881801}, // 24242K {0.252996141, 0.2528809}, // 24243K {0.252995492, 0.252879999}, // 24244K {0.252994842, 0.252879099}, // 24245K {0.252994192, 0.252878198}, // 24246K {0.252993542, 0.252877298}, // 24247K {0.252992893, 0.252876397}, // 24248K {0.252992243, 0.252875497}, // 24249K {0.252991594, 0.252874597}, // 24250K {0.252990945, 0.252873697}, // 24251K {0.252990295, 0.252872797}, // 24252K {0.252989646, 0.252871897}, // 24253K {0.252988997, 0.252870997}, // 24254K {0.252988348, 0.252870097}, // 24255K {0.252987699, 0.252869198}, // 24256K {0.25298705, 0.252868298}, // 24257K {0.252986401, 0.252867398}, // 24258K {0.252985752, 0.252866499}, // 24259K {0.252985103, 0.2528656}, // 24260K {0.252984454, 0.2528647}, // 24261K {0.252983805, 0.252863801}, // 24262K {0.252983157, 0.252862902}, // 24263K {0.252982508, 0.252862003}, // 24264K {0.25298186, 0.252861104}, // 24265K {0.252981211, 0.252860205}, // 24266K {0.252980563, 0.252859307}, // 24267K {0.252979915, 0.252858408}, // 24268K {0.252979266, 0.252857509}, // 24269K {0.252978618, 0.252856611}, // 24270K {0.25297797, 0.252855712}, // 24271K {0.252977322, 0.252854814}, // 24272K {0.252976674, 0.252853916}, // 24273K {0.252976026, 0.252853018}, // 24274K {0.252975378, 0.25285212}, // 24275K {0.25297473, 0.252851222}, // 24276K {0.252974082, 0.252850324}, // 24277K {0.252973435, 0.252849426}, // 24278K {0.252972787, 0.252848528}, // 24279K {0.25297214, 0.25284763}, // 24280K {0.252971492, 0.252846733}, // 24281K {0.252970845, 0.252845835}, // 24282K {0.252970197, 0.252844938}, // 24283K {0.25296955, 0.25284404}, // 24284K {0.252968903, 0.252843143}, // 24285K {0.252968255, 0.252842246}, // 24286K {0.252967608, 0.252841349}, // 24287K {0.252966961, 0.252840452}, // 24288K {0.252966314, 0.252839555}, // 24289K {0.252965667, 0.252838658}, // 24290K {0.25296502, 0.252837761}, // 24291K {0.252964374, 0.252836865}, // 24292K {0.252963727, 0.252835968}, // 24293K {0.25296308, 0.252835072}, // 24294K {0.252962433, 0.252834175}, // 24295K {0.252961787, 0.252833279}, // 24296K {0.25296114, 0.252832383}, // 24297K {0.252960494, 0.252831486}, // 24298K {0.252959848, 0.25283059}, // 24299K {0.252959201, 0.252829694}, // 24300K {0.252958555, 0.252828798}, // 24301K {0.252957909, 0.252827902}, // 24302K {0.252957263, 0.252827007}, // 24303K {0.252956617, 0.252826111}, // 24304K {0.25295597, 0.252825215}, // 24305K {0.252955325, 0.25282432}, // 24306K {0.252954679, 0.252823424}, // 24307K {0.252954033, 0.252822529}, // 24308K {0.252953387, 0.252821634}, // 24309K {0.252952741, 0.252820739}, // 24310K {0.252952096, 0.252819844}, // 24311K {0.25295145, 0.252818948}, // 24312K {0.252950805, 0.252818054}, // 24313K {0.252950159, 0.252817159}, // 24314K {0.252949514, 0.252816264}, // 24315K {0.252948868, 0.252815369}, // 24316K {0.252948223, 0.252814475}, // 24317K {0.252947578, 0.25281358}, // 24318K {0.252946933, 0.252812686}, // 24319K {0.252946288, 0.252811791}, // 24320K {0.252945643, 0.252810897}, // 24321K {0.252944998, 0.252810003}, // 24322K {0.252944353, 0.252809109}, // 24323K {0.252943708, 0.252808215}, // 24324K {0.252943063, 0.252807321}, // 24325K {0.252942418, 0.252806427}, // 24326K {0.252941774, 0.252805533}, // 24327K {0.252941129, 0.252804639}, // 24328K {0.252940485, 0.252803746}, // 24329K {0.25293984, 0.252802852}, // 24330K {0.252939196, 0.252801959}, // 24331K {0.252938552, 0.252801065}, // 24332K {0.252937907, 0.252800172}, // 24333K {0.252937263, 0.252799279}, // 24334K {0.252936619, 0.252798386}, // 24335K {0.252935975, 0.252797493}, // 24336K {0.252935331, 0.2527966}, // 24337K {0.252934687, 0.252795707}, // 24338K {0.252934043, 0.252794814}, // 24339K {0.252933399, 0.252793921}, // 24340K {0.252932755, 0.252793029}, // 24341K {0.252932112, 0.252792136}, // 24342K {0.252931468, 0.252791244}, // 24343K {0.252930824, 0.252790351}, // 24344K {0.252930181, 0.252789459}, // 24345K {0.252929537, 0.252788567}, // 24346K {0.252928894, 0.252787675}, // 24347K {0.25292825, 0.252786783}, // 24348K {0.252927607, 0.252785891}, // 24349K {0.252926964, 0.252784999}, // 24350K {0.252926321, 0.252784107}, // 24351K {0.252925678, 0.252783215}, // 24352K {0.252925035, 0.252782324}, // 24353K {0.252924392, 0.252781432}, // 24354K {0.252923749, 0.252780541}, // 24355K {0.252923106, 0.252779649}, // 24356K {0.252922463, 0.252778758}, // 24357K {0.25292182, 0.252777867}, // 24358K {0.252921178, 0.252776976}, // 24359K {0.252920535, 0.252776085}, // 24360K {0.252919893, 0.252775194}, // 24361K {0.25291925, 0.252774303}, // 24362K {0.252918608, 0.252773412}, // 24363K {0.252917965, 0.252772521}, // 24364K {0.252917323, 0.252771631}, // 24365K {0.252916681, 0.25277074}, // 24366K {0.252916039, 0.252769849}, // 24367K {0.252915396, 0.252768959}, // 24368K {0.252914754, 0.252768069}, // 24369K {0.252914112, 0.252767179}, // 24370K {0.25291347, 0.252766288}, // 24371K {0.252912829, 0.252765398}, // 24372K {0.252912187, 0.252764508}, // 24373K {0.252911545, 0.252763618}, // 24374K {0.252910903, 0.252762729}, // 24375K {0.252910262, 0.252761839}, // 24376K {0.25290962, 0.252760949}, // 24377K {0.252908979, 0.25276006}, // 24378K {0.252908337, 0.25275917}, // 24379K {0.252907696, 0.252758281}, // 24380K {0.252907054, 0.252757391}, // 24381K {0.252906413, 0.252756502}, // 24382K {0.252905772, 0.252755613}, // 24383K {0.252905131, 0.252754724}, // 24384K {0.25290449, 0.252753835}, // 24385K {0.252903849, 0.252752946}, // 24386K {0.252903208, 0.252752057}, // 24387K {0.252902567, 0.252751168}, // 24388K {0.252901926, 0.25275028}, // 24389K {0.252901285, 0.252749391}, // 24390K {0.252900645, 0.252748503}, // 24391K {0.252900004, 0.252747614}, // 24392K {0.252899363, 0.252746726}, // 24393K {0.252898723, 0.252745837}, // 24394K {0.252898082, 0.252744949}, // 24395K {0.252897442, 0.252744061}, // 24396K {0.252896802, 0.252743173}, // 24397K {0.252896161, 0.252742285}, // 24398K {0.252895521, 0.252741397}, // 24399K {0.252894881, 0.25274051}, // 24400K {0.252894241, 0.252739622}, // 24401K {0.252893601, 0.252738734}, // 24402K {0.252892961, 0.252737847}, // 24403K {0.252892321, 0.252736959}, // 24404K {0.252891681, 0.252736072}, // 24405K {0.252891041, 0.252735185}, // 24406K {0.252890402, 0.252734297}, // 24407K {0.252889762, 0.25273341}, // 24408K {0.252889122, 0.252732523}, // 24409K {0.252888483, 0.252731636}, // 24410K {0.252887843, 0.252730749}, // 24411K {0.252887204, 0.252729863}, // 24412K {0.252886565, 0.252728976}, // 24413K {0.252885925, 0.252728089}, // 24414K {0.252885286, 0.252727203}, // 24415K {0.252884647, 0.252726316}, // 24416K {0.252884008, 0.25272543}, // 24417K {0.252883369, 0.252724544}, // 24418K {0.25288273, 0.252723657}, // 24419K {0.252882091, 0.252722771}, // 24420K {0.252881452, 0.252721885}, // 24421K {0.252880813, 0.252720999}, // 24422K {0.252880175, 0.252720113}, // 24423K {0.252879536, 0.252719227}, // 24424K {0.252878897, 0.252718342}, // 24425K {0.252878259, 0.252717456}, // 24426K {0.25287762, 0.25271657}, // 24427K {0.252876982, 0.252715685}, // 24428K {0.252876343, 0.2527148}, // 24429K {0.252875705, 0.252713914}, // 24430K {0.252875067, 0.252713029}, // 24431K {0.252874429, 0.252712144}, // 24432K {0.25287379, 0.252711259}, // 24433K {0.252873152, 0.252710374}, // 24434K {0.252872514, 0.252709489}, // 24435K {0.252871876, 0.252708604}, // 24436K {0.252871239, 0.252707719}, // 24437K {0.252870601, 0.252706835}, // 24438K {0.252869963, 0.25270595}, // 24439K {0.252869325, 0.252705065}, // 24440K {0.252868688, 0.252704181}, // 24441K {0.25286805, 0.252703297}, // 24442K {0.252867412, 0.252702412}, // 24443K {0.252866775, 0.252701528}, // 24444K {0.252866138, 0.252700644}, // 24445K {0.2528655, 0.25269976}, // 24446K {0.252864863, 0.252698876}, // 24447K {0.252864226, 0.252697992}, // 24448K {0.252863589, 0.252697109}, // 24449K {0.252862952, 0.252696225}, // 24450K {0.252862314, 0.252695341}, // 24451K {0.252861678, 0.252694458}, // 24452K {0.252861041, 0.252693574}, // 24453K {0.252860404, 0.252692691}, // 24454K {0.252859767, 0.252691808}, // 24455K {0.25285913, 0.252690924}, // 24456K {0.252858494, 0.252690041}, // 24457K {0.252857857, 0.252689158}, // 24458K {0.25285722, 0.252688275}, // 24459K {0.252856584, 0.252687392}, // 24460K {0.252855947, 0.252686509}, // 24461K {0.252855311, 0.252685627}, // 24462K {0.252854675, 0.252684744}, // 24463K {0.252854039, 0.252683862}, // 24464K {0.252853402, 0.252682979}, // 24465K {0.252852766, 0.252682097}, // 24466K {0.25285213, 0.252681214}, // 24467K {0.252851494, 0.252680332}, // 24468K {0.252850858, 0.25267945}, // 24469K {0.252850222, 0.252678568}, // 24470K {0.252849587, 0.252677686}, // 24471K {0.252848951, 0.252676804}, // 24472K {0.252848315, 0.252675922}, // 24473K {0.252847679, 0.25267504}, // 24474K {0.252847044, 0.252674159}, // 24475K {0.252846408, 0.252673277}, // 24476K {0.252845773, 0.252672396}, // 24477K {0.252845138, 0.252671514}, // 24478K {0.252844502, 0.252670633}, // 24479K {0.252843867, 0.252669752}, // 24480K {0.252843232, 0.25266887}, // 24481K {0.252842597, 0.252667989}, // 24482K {0.252841961, 0.252667108}, // 24483K {0.252841326, 0.252666227}, // 24484K {0.252840691, 0.252665346}, // 24485K {0.252840057, 0.252664466}, // 24486K {0.252839422, 0.252663585}, // 24487K {0.252838787, 0.252662704}, // 24488K {0.252838152, 0.252661824}, // 24489K {0.252837518, 0.252660943}, // 24490K {0.252836883, 0.252660063}, // 24491K {0.252836248, 0.252659183}, // 24492K {0.252835614, 0.252658302}, // 24493K {0.252834979, 0.252657422}, // 24494K {0.252834345, 0.252656542}, // 24495K {0.252833711, 0.252655662}, // 24496K {0.252833077, 0.252654782}, // 24497K {0.252832442, 0.252653903}, // 24498K {0.252831808, 0.252653023}, // 24499K {0.252831174, 0.252652143}, // 24500K {0.25283054, 0.252651264}, // 24501K {0.252829906, 0.252650384}, // 24502K {0.252829272, 0.252649505}, // 24503K {0.252828639, 0.252648625}, // 24504K {0.252828005, 0.252647746}, // 24505K {0.252827371, 0.252646867}, // 24506K {0.252826737, 0.252645988}, // 24507K {0.252826104, 0.252645109}, // 24508K {0.25282547, 0.25264423}, // 24509K {0.252824837, 0.252643351}, // 24510K {0.252824203, 0.252642472}, // 24511K {0.25282357, 0.252641594}, // 24512K {0.252822937, 0.252640715}, // 24513K {0.252822304, 0.252639837}, // 24514K {0.25282167, 0.252638958}, // 24515K {0.252821037, 0.25263808}, // 24516K {0.252820404, 0.252637202}, // 24517K {0.252819771, 0.252636323}, // 24518K {0.252819138, 0.252635445}, // 24519K {0.252818506, 0.252634567}, // 24520K {0.252817873, 0.252633689}, // 24521K {0.25281724, 0.252632811}, // 24522K {0.252816607, 0.252631934}, // 24523K {0.252815975, 0.252631056}, // 24524K {0.252815342, 0.252630178}, // 24525K {0.25281471, 0.252629301}, // 24526K {0.252814077, 0.252628423}, // 24527K {0.252813445, 0.252627546}, // 24528K {0.252812813, 0.252626669}, // 24529K {0.25281218, 0.252625791}, // 24530K {0.252811548, 0.252624914}, // 24531K {0.252810916, 0.252624037}, // 24532K {0.252810284, 0.25262316}, // 24533K {0.252809652, 0.252622283}, // 24534K {0.25280902, 0.252621406}, // 24535K {0.252808388, 0.25262053}, // 24536K {0.252807756, 0.252619653}, // 24537K {0.252807125, 0.252618776}, // 24538K {0.252806493, 0.2526179}, // 24539K {0.252805861, 0.252617023}, // 24540K {0.25280523, 0.252616147}, // 24541K {0.252804598, 0.252615271}, // 24542K {0.252803967, 0.252614395}, // 24543K {0.252803335, 0.252613518}, // 24544K {0.252802704, 0.252612642}, // 24545K {0.252802073, 0.252611767}, // 24546K {0.252801441, 0.252610891}, // 24547K {0.25280081, 0.252610015}, // 24548K {0.252800179, 0.252609139}, // 24549K {0.252799548, 0.252608264}, // 24550K {0.252798917, 0.252607388}, // 24551K {0.252798286, 0.252606513}, // 24552K {0.252797655, 0.252605637}, // 24553K {0.252797024, 0.252604762}, // 24554K {0.252796394, 0.252603887}, // 24555K {0.252795763, 0.252603011}, // 24556K {0.252795132, 0.252602136}, // 24557K {0.252794502, 0.252601261}, // 24558K {0.252793871, 0.252600387}, // 24559K {0.252793241, 0.252599512}, // 24560K {0.25279261, 0.252598637}, // 24561K {0.25279198, 0.252597762}, // 24562K {0.25279135, 0.252596888}, // 24563K {0.25279072, 0.252596013}, // 24564K {0.252790089, 0.252595139}, // 24565K {0.252789459, 0.252594264}, // 24566K {0.252788829, 0.25259339}, // 24567K {0.252788199, 0.252592516}, // 24568K {0.252787569, 0.252591642}, // 24569K {0.25278694, 0.252590768}, // 24570K {0.25278631, 0.252589894}, // 24571K {0.25278568, 0.25258902}, // 24572K {0.25278505, 0.252588146}, // 24573K {0.252784421, 0.252587273}, // 24574K {0.252783791, 0.252586399}, // 24575K {0.252783162, 0.252585525}, // 24576K {0.252782532, 0.252584652}, // 24577K {0.252781903, 0.252583779}, // 24578K {0.252781274, 0.252582905}, // 24579K {0.252780644, 0.252582032}, // 24580K {0.252780015, 0.252581159}, // 24581K {0.252779386, 0.252580286}, // 24582K {0.252778757, 0.252579413}, // 24583K {0.252778128, 0.25257854}, // 24584K {0.252777499, 0.252577667}, // 24585K {0.25277687, 0.252576794}, // 24586K {0.252776241, 0.252575922}, // 24587K {0.252775612, 0.252575049}, // 24588K {0.252774984, 0.252574177}, // 24589K {0.252774355, 0.252573304}, // 24590K {0.252773727, 0.252572432}, // 24591K {0.252773098, 0.25257156}, // 24592K {0.25277247, 0.252570687}, // 24593K {0.252771841, 0.252569815}, // 24594K {0.252771213, 0.252568943}, // 24595K {0.252770584, 0.252568071}, // 24596K {0.252769956, 0.252567199}, // 24597K {0.252769328, 0.252566328}, // 24598K {0.2527687, 0.252565456}, // 24599K {0.252768072, 0.252564584}, // 24600K {0.252767444, 0.252563713}, // 24601K {0.252766816, 0.252562841}, // 24602K {0.252766188, 0.25256197}, // 24603K {0.25276556, 0.252561099}, // 24604K {0.252764932, 0.252560227}, // 24605K {0.252764305, 0.252559356}, // 24606K {0.252763677, 0.252558485}, // 24607K {0.25276305, 0.252557614}, // 24608K {0.252762422, 0.252556743}, // 24609K {0.252761795, 0.252555872}, // 24610K {0.252761167, 0.252555002}, // 24611K {0.25276054, 0.252554131}, // 24612K {0.252759913, 0.25255326}, // 24613K {0.252759285, 0.25255239}, // 24614K {0.252758658, 0.252551519}, // 24615K {0.252758031, 0.252550649}, // 24616K {0.252757404, 0.252549779}, // 24617K {0.252756777, 0.252548909}, // 24618K {0.25275615, 0.252548039}, // 24619K {0.252755523, 0.252547168}, // 24620K {0.252754896, 0.252546299}, // 24621K {0.25275427, 0.252545429}, // 24622K {0.252753643, 0.252544559}, // 24623K {0.252753016, 0.252543689}, // 24624K {0.25275239, 0.252542819}, // 24625K {0.252751763, 0.25254195}, // 24626K {0.252751137, 0.25254108}, // 24627K {0.25275051, 0.252540211}, // 24628K {0.252749884, 0.252539342}, // 24629K {0.252749258, 0.252538472}, // 24630K {0.252748632, 0.252537603}, // 24631K {0.252748005, 0.252536734}, // 24632K {0.252747379, 0.252535865}, // 24633K {0.252746753, 0.252534996}, // 24634K {0.252746127, 0.252534127}, // 24635K {0.252745501, 0.252533259}, // 24636K {0.252744876, 0.25253239}, // 24637K {0.25274425, 0.252531521}, // 24638K {0.252743624, 0.252530653}, // 24639K {0.252742998, 0.252529784}, // 24640K {0.252742373, 0.252528916}, // 24641K {0.252741747, 0.252528048}, // 24642K {0.252741122, 0.25252718}, // 24643K {0.252740496, 0.252526311}, // 24644K {0.252739871, 0.252525443}, // 24645K {0.252739246, 0.252524575}, // 24646K {0.25273862, 0.252523707}, // 24647K {0.252737995, 0.25252284}, // 24648K {0.25273737, 0.252521972}, // 24649K {0.252736745, 0.252521104}, // 24650K {0.25273612, 0.252520237}, // 24651K {0.252735495, 0.252519369}, // 24652K {0.25273487, 0.252518502}, // 24653K {0.252734245, 0.252517634}, // 24654K {0.25273362, 0.252516767}, // 24655K {0.252732996, 0.2525159}, // 24656K {0.252732371, 0.252515033}, // 24657K {0.252731746, 0.252514166}, // 24658K {0.252731122, 0.252513299}, // 24659K {0.252730497, 0.252512432}, // 24660K {0.252729873, 0.252511565}, // 24661K {0.252729248, 0.252510699}, // 24662K {0.252728624, 0.252509832}, // 24663K {0.252728, 0.252508965}, // 24664K {0.252727376, 0.252508099}, // 24665K {0.252726751, 0.252507233}, // 24666K {0.252726127, 0.252506366}, // 24667K {0.252725503, 0.2525055}, // 24668K {0.252724879, 0.252504634}, // 24669K {0.252724256, 0.252503768}, // 24670K {0.252723632, 0.252502902}, // 24671K {0.252723008, 0.252502036}, // 24672K {0.252722384, 0.25250117}, // 24673K {0.25272176, 0.252500304}, // 24674K {0.252721137, 0.252499439}, // 24675K {0.252720513, 0.252498573}, // 24676K {0.25271989, 0.252497707}, // 24677K {0.252719266, 0.252496842}, // 24678K {0.252718643, 0.252495977}, // 24679K {0.25271802, 0.252495111}, // 24680K {0.252717396, 0.252494246}, // 24681K {0.252716773, 0.252493381}, // 24682K {0.25271615, 0.252492516}, // 24683K {0.252715527, 0.252491651}, // 24684K {0.252714904, 0.252490786}, // 24685K {0.252714281, 0.252489921}, // 24686K {0.252713658, 0.252489056}, // 24687K {0.252713035, 0.252488192}, // 24688K {0.252712413, 0.252487327}, // 24689K {0.25271179, 0.252486463}, // 24690K {0.252711167, 0.252485598}, // 24691K {0.252710545, 0.252484734}, // 24692K {0.252709922, 0.25248387}, // 24693K {0.2527093, 0.252483006}, // 24694K {0.252708677, 0.252482141}, // 24695K {0.252708055, 0.252481277}, // 24696K {0.252707432, 0.252480413}, // 24697K {0.25270681, 0.25247955}, // 24698K {0.252706188, 0.252478686}, // 24699K {0.252705566, 0.252477822}, // 24700K {0.252704944, 0.252476958}, // 24701K {0.252704322, 0.252476095}, // 24702K {0.2527037, 0.252475231}, // 24703K {0.252703078, 0.252474368}, // 24704K {0.252702456, 0.252473505}, // 24705K {0.252701834, 0.252472641}, // 24706K {0.252701212, 0.252471778}, // 24707K {0.252700591, 0.252470915}, // 24708K {0.252699969, 0.252470052}, // 24709K {0.252699348, 0.252469189}, // 24710K {0.252698726, 0.252468326}, // 24711K {0.252698105, 0.252467464}, // 24712K {0.252697483, 0.252466601}, // 24713K {0.252696862, 0.252465738}, // 24714K {0.252696241, 0.252464876}, // 24715K {0.25269562, 0.252464013}, // 24716K {0.252694998, 0.252463151}, // 24717K {0.252694377, 0.252462289}, // 24718K {0.252693756, 0.252461426}, // 24719K {0.252693135, 0.252460564}, // 24720K {0.252692515, 0.252459702}, // 24721K {0.252691894, 0.25245884}, // 24722K {0.252691273, 0.252457978}, // 24723K {0.252690652, 0.252457116}, // 24724K {0.252690031, 0.252456255}, // 24725K {0.252689411, 0.252455393}, // 24726K {0.25268879, 0.252454531}, // 24727K {0.25268817, 0.25245367}, // 24728K {0.252687549, 0.252452809}, // 24729K {0.252686929, 0.252451947}, // 24730K {0.252686309, 0.252451086}, // 24731K {0.252685688, 0.252450225}, // 24732K {0.252685068, 0.252449364}, // 24733K {0.252684448, 0.252448502}, // 24734K {0.252683828, 0.252447642}, // 24735K {0.252683208, 0.252446781}, // 24736K {0.252682588, 0.25244592}, // 24737K {0.252681968, 0.252445059}, // 24738K {0.252681348, 0.252444198}, // 24739K {0.252680728, 0.252443338}, // 24740K {0.252680109, 0.252442477}, // 24741K {0.252679489, 0.252441617}, // 24742K {0.252678869, 0.252440757}, // 24743K {0.25267825, 0.252439896}, // 24744K {0.25267763, 0.252439036}, // 24745K {0.252677011, 0.252438176}, // 24746K {0.252676392, 0.252437316}, // 24747K {0.252675772, 0.252436456}, // 24748K {0.252675153, 0.252435596}, // 24749K {0.252674534, 0.252434736}, // 24750K {0.252673915, 0.252433877}, // 24751K {0.252673296, 0.252433017}, // 24752K {0.252672677, 0.252432157}, // 24753K {0.252672058, 0.252431298}, // 24754K {0.252671439, 0.252430439}, // 24755K {0.25267082, 0.252429579}, // 24756K {0.252670201, 0.25242872}, // 24757K {0.252669582, 0.252427861}, // 24758K {0.252668964, 0.252427002}, // 24759K {0.252668345, 0.252426143}, // 24760K {0.252667726, 0.252425284}, // 24761K {0.252667108, 0.252424425}, // 24762K {0.252666489, 0.252423566}, // 24763K {0.252665871, 0.252422707}, // 24764K {0.252665253, 0.252421849}, // 24765K {0.252664634, 0.25242099}, // 24766K {0.252664016, 0.252420132}, // 24767K {0.252663398, 0.252419273}, // 24768K {0.25266278, 0.252418415}, // 24769K {0.252662162, 0.252417557}, // 24770K {0.252661544, 0.252416699}, // 24771K {0.252660926, 0.252415841}, // 24772K {0.252660308, 0.252414983}, // 24773K {0.25265969, 0.252414125}, // 24774K {0.252659073, 0.252413267}, // 24775K {0.252658455, 0.252412409}, // 24776K {0.252657837, 0.252411551}, // 24777K {0.25265722, 0.252410694}, // 24778K {0.252656602, 0.252409836}, // 24779K {0.252655985, 0.252408979}, // 24780K {0.252655367, 0.252408121}, // 24781K {0.25265475, 0.252407264}, // 24782K {0.252654133, 0.252406407}, // 24783K {0.252653515, 0.25240555}, // 24784K {0.252652898, 0.252404693}, // 24785K {0.252652281, 0.252403836}, // 24786K {0.252651664, 0.252402979}, // 24787K {0.252651047, 0.252402122}, // 24788K {0.25265043, 0.252401265}, // 24789K {0.252649813, 0.252400408}, // 24790K {0.252649197, 0.252399552}, // 24791K {0.25264858, 0.252398695}, // 24792K {0.252647963, 0.252397839}, // 24793K {0.252647346, 0.252396982}, // 24794K {0.25264673, 0.252396126}, // 24795K {0.252646113, 0.25239527}, // 24796K {0.252645497, 0.252394414}, // 24797K {0.25264488, 0.252393558}, // 24798K {0.252644264, 0.252392702}, // 24799K {0.252643648, 0.252391846}, // 24800K {0.252643032, 0.25239099}, // 24801K {0.252642415, 0.252390134}, // 24802K {0.252641799, 0.252389279}, // 24803K {0.252641183, 0.252388423}, // 24804K {0.252640567, 0.252387568}, // 24805K {0.252639951, 0.252386712}, // 24806K {0.252639335, 0.252385857}, // 24807K {0.252638719, 0.252385001}, // 24808K {0.252638104, 0.252384146}, // 24809K {0.252637488, 0.252383291}, // 24810K {0.252636872, 0.252382436}, // 24811K {0.252636257, 0.252381581}, // 24812K {0.252635641, 0.252380726}, // 24813K {0.252635026, 0.252379871}, // 24814K {0.25263441, 0.252379017}, // 24815K {0.252633795, 0.252378162}, // 24816K {0.25263318, 0.252377307}, // 24817K {0.252632564, 0.252376453}, // 24818K {0.252631949, 0.252375598}, // 24819K {0.252631334, 0.252374744}, // 24820K {0.252630719, 0.25237389}, // 24821K {0.252630104, 0.252373036}, // 24822K {0.252629489, 0.252372181}, // 24823K {0.252628874, 0.252371327}, // 24824K {0.252628259, 0.252370473}, // 24825K {0.252627644, 0.25236962}, // 24826K {0.25262703, 0.252368766}, // 24827K {0.252626415, 0.252367912}, // 24828K {0.2526258, 0.252367058}, // 24829K {0.252625186, 0.252366205}, // 24830K {0.252624571, 0.252365351}, // 24831K {0.252623957, 0.252364498}, // 24832K {0.252623342, 0.252363644}, // 24833K {0.252622728, 0.252362791}, // 24834K {0.252622114, 0.252361938}, // 24835K {0.2526215, 0.252361085}, // 24836K {0.252620885, 0.252360232}, // 24837K {0.252620271, 0.252359379}, // 24838K {0.252619657, 0.252358526}, // 24839K {0.252619043, 0.252357673}, // 24840K {0.252618429, 0.25235682}, // 24841K {0.252617816, 0.252355968}, // 24842K {0.252617202, 0.252355115}, // 24843K {0.252616588, 0.252354263}, // 24844K {0.252615974, 0.25235341}, // 24845K {0.252615361, 0.252352558}, // 24846K {0.252614747, 0.252351706}, // 24847K {0.252614134, 0.252350853}, // 24848K {0.25261352, 0.252350001}, // 24849K {0.252612907, 0.252349149}, // 24850K {0.252612293, 0.252348297}, // 24851K {0.25261168, 0.252347445}, // 24852K {0.252611067, 0.252346594}, // 24853K {0.252610454, 0.252345742}, // 24854K {0.252609841, 0.25234489}, // 24855K {0.252609227, 0.252344039}, // 24856K {0.252608614, 0.252343187}, // 24857K {0.252608002, 0.252342336}, // 24858K {0.252607389, 0.252341484}, // 24859K {0.252606776, 0.252340633}, // 24860K {0.252606163, 0.252339782}, // 24861K {0.25260555, 0.252338931}, // 24862K {0.252604938, 0.25233808}, // 24863K {0.252604325, 0.252337229}, // 24864K {0.252603712, 0.252336378}, // 24865K {0.2526031, 0.252335527}, // 24866K {0.252602488, 0.252334676}, // 24867K {0.252601875, 0.252333826}, // 24868K {0.252601263, 0.252332975}, // 24869K {0.252600651, 0.252332125}, // 24870K {0.252600038, 0.252331274}, // 24871K {0.252599426, 0.252330424}, // 24872K {0.252598814, 0.252329574}, // 24873K {0.252598202, 0.252328723}, // 24874K {0.25259759, 0.252327873}, // 24875K {0.252596978, 0.252327023}, // 24876K {0.252596366, 0.252326173}, // 24877K {0.252595755, 0.252325323}, // 24878K {0.252595143, 0.252324474}, // 24879K {0.252594531, 0.252323624}, // 24880K {0.25259392, 0.252322774}, // 24881K {0.252593308, 0.252321925}, // 24882K {0.252592697, 0.252321075}, // 24883K {0.252592085, 0.252320226}, // 24884K {0.252591474, 0.252319376}, // 24885K {0.252590862, 0.252318527}, // 24886K {0.252590251, 0.252317678}, // 24887K {0.25258964, 0.252316829}, // 24888K {0.252589029, 0.25231598}, // 24889K {0.252588418, 0.252315131}, // 24890K {0.252587807, 0.252314282}, // 24891K {0.252587196, 0.252313433}, // 24892K {0.252586585, 0.252312584}, // 24893K {0.252585974, 0.252311736}, // 24894K {0.252585363, 0.252310887}, // 24895K {0.252584752, 0.252310039}, // 24896K {0.252584141, 0.25230919}, // 24897K {0.252583531, 0.252308342}, // 24898K {0.25258292, 0.252307494}, // 24899K {0.25258231, 0.252306645}, // 24900K {0.252581699, 0.252305797}, // 24901K {0.252581089, 0.252304949}, // 24902K {0.252580478, 0.252304101}, // 24903K {0.252579868, 0.252303253}, // 24904K {0.252579258, 0.252302406}, // 24905K {0.252578648, 0.252301558}, // 24906K {0.252578037, 0.25230071}, // 24907K {0.252577427, 0.252299863}, // 24908K {0.252576817, 0.252299015}, // 24909K {0.252576207, 0.252298168}, // 24910K {0.252575597, 0.25229732}, // 24911K {0.252574988, 0.252296473}, // 24912K {0.252574378, 0.252295626}, // 24913K {0.252573768, 0.252294779}, // 24914K {0.252573158, 0.252293932}, // 24915K {0.252572549, 0.252293085}, // 24916K {0.252571939, 0.252292238}, // 24917K {0.25257133, 0.252291391}, // 24918K {0.25257072, 0.252290544}, // 24919K {0.252570111, 0.252289698}, // 24920K {0.252569502, 0.252288851}, // 24921K {0.252568892, 0.252288004}, // 24922K {0.252568283, 0.252287158}, // 24923K {0.252567674, 0.252286312}, // 24924K {0.252567065, 0.252285465}, // 24925K {0.252566456, 0.252284619}, // 24926K {0.252565847, 0.252283773}, // 24927K {0.252565238, 0.252282927}, // 24928K {0.252564629, 0.252282081}, // 24929K {0.25256402, 0.252281235}, // 24930K {0.252563411, 0.252280389}, // 24931K {0.252562803, 0.252279543}, // 24932K {0.252562194, 0.252278698}, // 24933K {0.252561585, 0.252277852}, // 24934K {0.252560977, 0.252277007}, // 24935K {0.252560368, 0.252276161}, // 24936K {0.25255976, 0.252275316}, // 24937K {0.252559152, 0.25227447}, // 24938K {0.252558543, 0.252273625}, // 24939K {0.252557935, 0.25227278}, // 24940K {0.252557327, 0.252271935}, // 24941K {0.252556719, 0.25227109}, // 24942K {0.252556111, 0.252270245}, // 24943K {0.252555503, 0.2522694}, // 24944K {0.252554895, 0.252268556}, // 24945K {0.252554287, 0.252267711}, // 24946K {0.252553679, 0.252266866}, // 24947K {0.252553071, 0.252266022}, // 24948K {0.252552463, 0.252265177}, // 24949K {0.252551856, 0.252264333}, // 24950K {0.252551248, 0.252263489}, // 24951K {0.25255064, 0.252262644}, // 24952K {0.252550033, 0.2522618}, // 24953K {0.252549425, 0.252260956}, // 24954K {0.252548818, 0.252260112}, // 24955K {0.252548211, 0.252259268}, // 24956K {0.252547603, 0.252258424}, // 24957K {0.252546996, 0.252257581}, // 24958K {0.252546389, 0.252256737}, // 24959K {0.252545782, 0.252255893}, // 24960K {0.252545175, 0.25225505}, // 24961K {0.252544568, 0.252254206}, // 24962K {0.252543961, 0.252253363}, // 24963K {0.252543354, 0.252252519}, // 24964K {0.252542747, 0.252251676}, // 24965K {0.25254214, 0.252250833}, // 24966K {0.252541534, 0.25224999}, // 24967K {0.252540927, 0.252249147}, // 24968K {0.25254032, 0.252248304}, // 24969K {0.252539714, 0.252247461}, // 24970K {0.252539107, 0.252246618}, // 24971K {0.252538501, 0.252245776}, // 24972K {0.252537894, 0.252244933}, // 24973K {0.252537288, 0.25224409}, // 24974K {0.252536682, 0.252243248}, // 24975K {0.252536076, 0.252242406}, // 24976K {0.252535469, 0.252241563}, // 24977K {0.252534863, 0.252240721}, // 24978K {0.252534257, 0.252239879}, // 24979K {0.252533651, 0.252239037}, // 24980K {0.252533045, 0.252238195}, // 24981K {0.25253244, 0.252237353}, // 24982K {0.252531834, 0.252236511}, // 24983K {0.252531228, 0.252235669}, // 24984K {0.252530622, 0.252234827}, // 24985K {0.252530017, 0.252233986}, // 24986K {0.252529411, 0.252233144}, // 24987K {0.252528805, 0.252232303}, // 24988K {0.2525282, 0.252231461}, // 24989K {0.252527595, 0.25223062}, // 24990K {0.252526989, 0.252229779}, // 24991K {0.252526384, 0.252228937}, // 24992K {0.252525779, 0.252228096}, // 24993K {0.252525173, 0.252227255}, // 24994K {0.252524568, 0.252226414}, // 24995K {0.252523963, 0.252225573}, // 24996K {0.252523358, 0.252224732}, // 24997K {0.252522753, 0.252223892}, // 24998K {0.252522148, 0.252223051}, // 24999K {0.252521543, 0.25222221}, // 25000K }; } } f-spot-0.8.2/src/Core/FSpot.Cms/FSpot.Cms.dll.config0000644000175000017500000000025311503407351022210 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Core/FSpot.Cms/Makefile.in0000644000175000017500000006744111503407250020552 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/FSpot.Cms.dll.config.in $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Core/FSpot.Cms ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = FSpot.Cms.dll.config CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Cms ASSEMBLY_BUILD_FLAGS = -unsafe TARGET = library LINK = $(REF_FSPOT_CMS) $(am__append_1) SOURCES = \ Cms/CctTable.cs \ Cms/CmsException.cs \ Cms/ColorCIELab.cs \ Cms/ColorCIELCh.cs \ Cms/ColorCIExyY.cs \ Cms/ColorCIEXYZ.cs \ Cms/Format.cs \ Cms/GammaTable.cs \ Cms/IccColorSpace.cs \ Cms/IccProfileClass.cs \ Cms/Intent.cs \ Cms/NativeMethods.cs \ Cms/Profile.cs \ Cms/SaveException.cs \ Cms/Transform.cs RESOURCES = # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) FSpot.Cms.dll.config EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) \ $(THEME_ICONS_SOURCE) FSpot.Cms.dll.config CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Core/FSpot.Cms/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Core/FSpot.Cms/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): FSpot.Cms.dll.config: $(top_builddir)/config.status $(srcdir)/FSpot.Cms.dll.config.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Core/FSpot.Cms/Makefile.am0000644000175000017500000000105011430555234020526 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Cms ASSEMBLY_BUILD_FLAGS = -unsafe TARGET = library LINK = $(REF_FSPOT_CMS) SOURCES = \ Cms/CctTable.cs \ Cms/CmsException.cs \ Cms/ColorCIELab.cs \ Cms/ColorCIELCh.cs \ Cms/ColorCIExyY.cs \ Cms/ColorCIEXYZ.cs \ Cms/Format.cs \ Cms/GammaTable.cs \ Cms/IccColorSpace.cs \ Cms/IccProfileClass.cs \ Cms/Intent.cs \ Cms/NativeMethods.cs \ Cms/Profile.cs \ Cms/SaveException.cs \ Cms/Transform.cs RESOURCES = include $(top_srcdir)/build/build.mk EXTRA_DIST += FSpot.Cms.dll.config module_SCRIPTS += FSpot.Cms.dll.config f-spot-0.8.2/src/Core/FSpot.Bling/0000777000175000017500000000000011503407440017007 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Bling/FSpot.Bling/0000777000175000017500000000000011503407440021074 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Bling/FSpot.Bling/EasingFunction.cs0000644000175000017500000000203511503404761024336 0ustar00rubenruben00000000000000// // FSpot.Bling.EasingFunction.cs // // Author(s): // Stephane Delcroix // // This is free software. See COPYING for details // using System; namespace FSpot.Bling { public abstract class EasingFunction { EasingMode easingMode; public EasingFunction () : this (EasingMode.EaseIn) { } public EasingFunction (EasingMode easingMode) { this.easingMode = easingMode; } public double Ease (double normalizedTime) { switch (easingMode) { case EasingMode.EaseIn: return EaseInCore (normalizedTime); case EasingMode.EaseOut: return 1.0 - EaseInCore (1 - normalizedTime); case EasingMode.EaseInOut: return (normalizedTime <= 0.5 ? EaseInCore (normalizedTime * 2) * 0.5 : 1.0 - EaseInCore ((1 - normalizedTime) * 2) * 0.5); } throw new InvalidOperationException ("Unknown value for EasingMode"); } public EasingMode EasingMode { get { return easingMode; } set { easingMode = value; } } protected abstract double EaseInCore (double normalizedTime); } } f-spot-0.8.2/src/Core/FSpot.Bling/FSpot.Bling/EasingMode.cs0000644000175000017500000000036611503404761023442 0ustar00rubenruben00000000000000// // FSpot.Bling.EasingMode.cs // // Author(s): // Stephane Delcroix // // This is free software. See COPYING for details // namespace FSpot.Bling { public enum EasingMode { EaseIn = 0, EaseOut, EaseInOut, } } f-spot-0.8.2/src/Core/FSpot.Bling/FSpot.Bling/BackEase.cs0000644000175000017500000000214411503404761023061 0ustar00rubenruben00000000000000// // FSpot.Bling.BackEase.cs // // Author(s): // Stephane Delcroix // // This is free software. See COPYING for details // using System; namespace FSpot.Bling { public abstract class BackEase : EasingFunction { double amplitude; public BackEase () : this (1.0) { } public BackEase (double amplitude) : base () { if (amplitude < 0) throw new ArgumentOutOfRangeException ("amplitude"); this.amplitude = amplitude; } public BackEase (EasingMode easingMode) : this (easingMode, 1.0) { } public BackEase (EasingMode easingMode, double amplitude) : base (easingMode) { if (amplitude < 0) throw new ArgumentOutOfRangeException ("amplitude"); this.amplitude = amplitude; } public double Amplitude { get { return amplitude; } set { if (value < 0) throw new ArgumentOutOfRangeException ("amplitude"); amplitude = value; } } protected override double EaseInCore (double normalizedTime) { return normalizedTime * normalizedTime * normalizedTime - normalizedTime * amplitude * Math.Sin (normalizedTime * Math.PI); } } } f-spot-0.8.2/src/Core/FSpot.Bling/FSpot.Bling/QuinticEase.cs0000644000175000017500000000102711503404761023634 0ustar00rubenruben00000000000000// // FSpot.Bling.QuinticEase.cs // // Author(s): // Stephane Delcroix // // This is free software. See COPYING for details // using System; namespace FSpot.Bling { public abstract class QuinticEase : EasingFunction { public QuinticEase () : base () { } public QuinticEase (EasingMode easingMode) : base (easingMode) { } protected override double EaseInCore (double normalizedTime) { return normalizedTime * normalizedTime * normalizedTime * normalizedTime * normalizedTime; } } } f-spot-0.8.2/src/Core/FSpot.Bling/FSpot.Bling/Animation.cs0000644000175000017500000000752111503404761023346 0ustar00rubenruben00000000000000// // FSpot.Bling.Animation,cs // // Author(s): // Stephane Delcroix // // This is free software. See COPYING for details // //TODO: send the progresschanged event using System; using System.ComponentModel; using GLibBeans; namespace FSpot.Bling { public abstract class Animation { enum AnimationState { NotRunning = 0, Running, Paused, } TimeSpan duration; TimeSpan pausedafter; DateTimeOffset starttime; T from; T to; Action action; AnimationState state; GLib.Priority priority = GLib.Priority.DefaultIdle; public Animation () { from = default (T); to = default (T); duration = TimeSpan.Zero; action = null; state = AnimationState.NotRunning; } public Animation (T from, T to, TimeSpan duration, Action action) : this (from, to, duration, action, GLib.Priority.DefaultIdle) { } public Animation (T from, T to, TimeSpan duration, Action action, GLib.Priority priority) { this.from = from; this.to = to; this.duration = duration; this.action = action; this.priority = priority; state = AnimationState.NotRunning; } public void Pause () { if (state == AnimationState.Paused) return; if (state != AnimationState.NotRunning) throw new InvalidOperationException ("Can't Pause () a non running animation."); GLib.Idle.Remove (Handler); pausedafter = DateTimeOffset.Now - starttime; state = AnimationState.Paused; } public void Resume () { if (state == AnimationState.Running) return; if (state != AnimationState.Paused) throw new InvalidOperationException ("Can't Resume () a non running animation."); starttime = DateTimeOffset.Now - pausedafter; state = AnimationState.Running; Sources.SetPriority (GLib.Timeout.Add (40, Handler), priority); } public void Start () { if (state != AnimationState.NotRunning) throw new InvalidOperationException ("Can't Start () a running or paused animation."); starttime = DateTimeOffset.Now; state = AnimationState.Running; Sources.SetPriority (GLib.Timeout.Add (40, Handler), priority); } public void Stop () { if (state == AnimationState.NotRunning) return; else GLib.Idle.Remove (Handler); action (to); EventHandler h = Completed; if (h != null) Completed (this, EventArgs.Empty); state = AnimationState.NotRunning; } public void Restart () { if (state == AnimationState.NotRunning) { Start (); return; } if (state == AnimationState.Paused) { Resume (); return; } starttime = DateTimeOffset.Now; } protected virtual double Ease (double normalizedTime) { return normalizedTime; } bool Handler () { double percentage = (double)(DateTimeOffset.Now - starttime).Ticks / (double)duration.Ticks; EventHandler p = ProgressChanged; if (p != null) p (this, new ProgressChangedEventArgs ((int)(100 * percentage), null)); action (Interpolate (from, to, Ease (Math.Min (percentage, 1.0)))); if (percentage >= 1.0) { EventHandler h = Completed; if (h != null) h (this, EventArgs.Empty); state = AnimationState.NotRunning; return false; } return true; } protected abstract T Interpolate (T from, T to, double progress); // Do not error out on this not being used #pragma warning disable 67 public event EventHandler Completed; #pragma warning restore 67 public event EventHandler ProgressChanged; public bool IsRunning { get { return state == AnimationState.Running; } } public bool IsPaused { get { return state == AnimationState.Paused; } } public TimeSpan Duration { get { return duration; } set { duration = value; } } public T From { get { return from; } set { from = value; } } public T To { get { return to; } set { to = value; } } } } f-spot-0.8.2/src/Core/FSpot.Bling/FSpot.Bling/CubicEase.cs0000644000175000017500000000074211503404761023250 0ustar00rubenruben00000000000000// // FSpot.Bling.CubicEase.cs // // Author(s): // Stephane Delcroix // // This is free software. See COPYING for details // using System; namespace FSpot.Bling { public class CubicEase : EasingFunction { public CubicEase () : base () { } public CubicEase (EasingMode easingMode) : base (easingMode) { } protected override double EaseInCore (double normalizedTime) { return normalizedTime * normalizedTime * normalizedTime; } } } f-spot-0.8.2/src/Core/FSpot.Bling/FSpot.Bling/EasedAnimation.cs0000644000175000017500000000267111503404761024311 0ustar00rubenruben00000000000000// // FSpot.Bling.EasedAnimation,cs // // Author(s): // Stephane Delcroix // // This is free software. See COPYING for details // using System; namespace FSpot.Bling { public abstract class EasedAnimation: Animation { EasingFunction easingFunction; public EasedAnimation () : this (null) { } public EasedAnimation (EasingFunction easingFunction) : base () { this.easingFunction = easingFunction; } public EasedAnimation (T from, T to, TimeSpan duration, Action action) : this (from, to, duration, action, null) { } public EasedAnimation (T from, T to, TimeSpan duration, Action action, GLib.Priority priority) : this (from, to, duration, action, null, priority) { } public EasedAnimation (T from, T to, TimeSpan duration, Action action, EasingFunction easingFunction) : base (from, to, duration, action) { this.easingFunction = easingFunction; } public EasedAnimation (T from, T to, TimeSpan duration, Action action, EasingFunction easingFunction, GLib.Priority priority) : base (from, to, duration, action, priority) { this.easingFunction = easingFunction; } public EasingFunction EasingFunction { get { return easingFunction; } set { easingFunction = value; } } protected override double Ease (double normalizedTime) { if (easingFunction == null) return base.Ease (normalizedTime); return easingFunction.Ease (normalizedTime); } } } f-spot-0.8.2/src/Core/FSpot.Bling/FSpot.Bling/DoubleAnimation.cs0000644000175000017500000000211411503404761024472 0ustar00rubenruben00000000000000// // FSpot.Bling.DoubleAnimation,cs // // Author(s): // Stephane Delcroix // // This is free software. See COPYING for details // using System; namespace FSpot.Bling { public class DoubleAnimation : EasedAnimation { public DoubleAnimation (double from, double to, TimeSpan duration, Action action) : base (from, to, duration, action) { } public DoubleAnimation (double from, double to, TimeSpan duration, Action action, GLib.Priority priority) : base (from, to, duration, action, priority) { } public DoubleAnimation (double from, double to, TimeSpan duration, Action action, EasingFunction easingFunction) : base (from, to, duration, action, easingFunction) { } public DoubleAnimation (double from, double to, TimeSpan duration, Action action, EasingFunction easingFunction, GLib.Priority priority) : base (from, to, duration, action, easingFunction, priority) { } protected override double Interpolate (double from, double to, double progress) { return from + progress * (to - from); } } } f-spot-0.8.2/src/Core/FSpot.Bling/Makefile.in0000644000175000017500000006670611503407250021066 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Core/FSpot.Bling ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Bling TARGET = library LINK = $(REF_FSPOT_BLING) $(am__append_1) SOURCES = \ FSpot.Bling/Animation.cs \ FSpot.Bling/BackEase.cs \ FSpot.Bling/CubicEase.cs \ FSpot.Bling/DoubleAnimation.cs \ FSpot.Bling/EasedAnimation.cs \ FSpot.Bling/EasingFunction.cs \ FSpot.Bling/EasingMode.cs \ FSpot.Bling/QuinticEase.cs RESOURCES = # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Core/FSpot.Bling/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Core/FSpot.Bling/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Core/FSpot.Bling/Makefile.am0000644000175000017500000000056311430555234021047 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Bling TARGET = library LINK = $(REF_FSPOT_BLING) SOURCES = \ FSpot.Bling/Animation.cs \ FSpot.Bling/BackEase.cs \ FSpot.Bling/CubicEase.cs \ FSpot.Bling/DoubleAnimation.cs \ FSpot.Bling/EasedAnimation.cs \ FSpot.Bling/EasingFunction.cs \ FSpot.Bling/EasingMode.cs \ FSpot.Bling/QuinticEase.cs RESOURCES = include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Core/FSpot.Query/0000777000175000017500000000000011503407443017064 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Query/FSpot.Query/0000777000175000017500000000000011503407443021223 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Query/FSpot.Query/LogicalTerm.cs0000644000175000017500000001022411503404762023750 0ustar00rubenruben00000000000000/* * FSpot.Query.LogicalTerm * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using System.Collections.Generic; using Hyena; using FSpot.Core; namespace FSpot.Query { public abstract class LogicalTerm : IQueryCondition { public abstract string SqlClause (); } public class TagTerm : LogicalTerm, IDisposable { Tag tag; public Tag Tag { get { return tag; } } public TagTerm (Tag tag) { this.tag = tag; } public override string SqlClause () { return SqlClause (this); } internal static string SqlClause (params TagTerm [] tags) { List list = new List (tags.Length); foreach (TagTerm tag in tags) list.Add (tag.Tag.Id.ToString ()); return SqlClause (list.ToArray ()); } private static string SqlClause (string [] tagids) { if (tagids.Length == 0) return null; if (tagids.Length == 1) return String.Format (" (photos.id IN (SELECT photo_id FROM photo_tags WHERE tag_id = {0})) ", tagids[0]); else return String.Format (" (photos.id IN (SELECT photo_id FROM photo_tags WHERE tag_id IN ({0}))) ", String.Join (", ", tagids)); } public void Dispose () { if (tag != null) tag.Dispose (); System.GC.SuppressFinalize (this); } ~TagTerm () { Log.DebugFormat ("Finalizer called on {0}. Should be Disposed", GetType ()); if (tag != null) tag.Dispose (); } } public class TextTerm : LogicalTerm { string text; public string Text { get { return text; } } string field; public string Field { get { return field; } } public TextTerm (string text, string field) { this.text = text; this.field = field; } public static OrTerm SearchMultiple (string text, params string[] fields) { List terms = new List (fields.Length); foreach (string field in fields) terms.Add (new TextTerm (text, field)); return new OrTerm (terms.ToArray ()); } public override string SqlClause () { return String.Format (" {0} LIKE %{1}% ", field, text); } } public class NotTerm : LogicalTerm { LogicalTerm term; public LogicalTerm Term { get { return term; } } public NotTerm (LogicalTerm term) { this.term = term; } public override string SqlClause () { return String.Format (" NOT ({0}) ", term.SqlClause ()); } } public abstract class NAryOperator : LogicalTerm { protected List terms; public LogicalTerm[] Terms { get { return terms.ToArray (); } } protected string [] ToStringArray () { List ls = new List (terms.Count); foreach (LogicalTerm term in terms) ls.Add (term.SqlClause ()); return ls.ToArray (); } public static string SqlClause (string op, string[] items) { if (items.Length == 1) return items [0]; else return " (" + String.Join (String.Format (" {0} ", op), items) + ") "; } } public class OrTerm : NAryOperator { public OrTerm (params LogicalTerm[] terms) { this.terms = new List (terms.Length); foreach (LogicalTerm term in terms) Add (term); } private void Add (LogicalTerm term) { if (term is OrTerm) foreach (LogicalTerm t in (term as OrTerm).terms) Add (t); else terms.Add (term); } public override string SqlClause () { List tagterms = new List (); List otherterms = new List (); foreach (LogicalTerm term in terms) if (term is TagTerm) tagterms.Add (term as TagTerm); else otherterms.Add (term.SqlClause ()); otherterms.Insert (0, TagTerm.SqlClause (tagterms.ToArray ())); return SqlClause ("OR", otherterms.ToArray ()); } } public class AndTerm : NAryOperator { public AndTerm (params LogicalTerm[] terms) { this.terms = new List (terms.Length); foreach (LogicalTerm term in terms) Add (term); } private void Add (LogicalTerm term) { if (term is AndTerm) foreach (LogicalTerm t in (term as AndTerm).terms) Add (t); else terms.Add (term); } public override string SqlClause () { return SqlClause ("AND", ToStringArray ()); } } } f-spot-0.8.2/src/Core/FSpot.Query/FSpot.Query/FolderSet.cs0000644000175000017500000000205111503404762023434 0ustar00rubenruben00000000000000/* * FSpot.Query.FolderSet * * Author(s): * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using System.Collections.Generic; using Hyena; namespace FSpot.Query { public class FolderSet : IQueryCondition { HashSet uri_list; public FolderSet () { uri_list = new HashSet (); } public IEnumerable Folders { get { return uri_list; } set { uri_list = (value == null) ? new HashSet () : new HashSet (value); } } protected static string EscapeQuotes (string v) { return v == null ? String.Empty : v.Replace("'", "''"); } public string SqlClause () { string[] items = new string [uri_list.Count]; if (items.Length == 0) return null; int i = 0; foreach (var uri in uri_list) { items[i] = String.Format ("id IN (SELECT id FROM photos WHERE base_uri LIKE '{0}%')", EscapeQuotes (uri.ToString ())); i++; } return String.Join (" OR ", items); } } } f-spot-0.8.2/src/Core/FSpot.Query/FSpot.Query/UntaggedCondition.cs0000644000175000017500000000052711503404762025160 0ustar00rubenruben00000000000000/* * UntaggedCondition.cs * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. */ namespace FSpot.Query { public class UntaggedCondition : IQueryCondition { public string SqlClause () { return " photos.id NOT IN (SELECT DISTINCT photo_id FROM photo_tags) "; } } } f-spot-0.8.2/src/Core/FSpot.Query/FSpot.Query/IQueryCondition.cs0000644000175000017500000000035411503404762024636 0ustar00rubenruben00000000000000/* * IQueryCondition.cs * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. */ namespace FSpot.Query { public interface IQueryCondition { string SqlClause (); } } f-spot-0.8.2/src/Core/FSpot.Query/FSpot.Query/RatingRange.cs0000644000175000017500000000155311503404762023754 0ustar00rubenruben00000000000000/* * RatingRange.cs * * Author(s): * Bengt Thuree * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; namespace FSpot.Query { public class RatingRange : IQueryCondition { private uint minRating; public uint MinRating { get { return minRating; } set { minRating = value; } } private uint maxRating; public uint MaxRating { get { return maxRating; } set { maxRating = value; } } public RatingRange (uint min_rating) { this.minRating = min_rating; this.maxRating = System.UInt32.MaxValue; } public RatingRange (uint min_rating, uint max_rating) { this.minRating = min_rating; this.maxRating = max_rating; } public string SqlClause () { return String.Format (" photos.rating >= {0} AND photos.rating <= {1} ", minRating, maxRating); } } } f-spot-0.8.2/src/Core/FSpot.Query/FSpot.Query/OrderByTime.cs0000644000175000017500000000131611503404762023735 0ustar00rubenruben00000000000000/* * FSpot.Query.OrderByTime.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details. * */ using System; namespace FSpot.Query { public class OrderByTime : IQueryCondition, IOrderCondition { public static OrderByTime OrderByTimeAsc = new OrderByTime (true); public static OrderByTime OrderByTimeDesc = new OrderByTime (false); bool asc; public bool Asc { get { return asc; } } public OrderByTime (bool asc) { this.asc = asc; } public string SqlClause () { // filenames must always appear in alphabetical order if times are the same return String.Format (" time {0}, filename ASC ", asc ? "ASC" : "DESC"); } } } f-spot-0.8.2/src/Core/FSpot.Query/FSpot.Query/IOrderCondition.cs0000644000175000017500000000035411503404762024604 0ustar00rubenruben00000000000000/* * IOrderCondition.cs * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. */ namespace FSpot.Query { public interface IOrderCondition { string SqlClause (); } } f-spot-0.8.2/src/Core/FSpot.Query/FSpot.Query/Tests/0000777000175000017500000000000011503407443022325 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Query/FSpot.Query/Tests/LogicalTermTests.cs0000644000175000017500000000217411503404762026102 0ustar00rubenruben00000000000000#if ENABLE_TESTS using NUnit.Framework; using FSpot.Core; namespace FSpot.Query.Tests { [TestFixture] public class LogicalTermTests { [Test] public void SomeTests () { Tag t1 = new Tag (null, 1, "tag1"); Tag t2 = new Tag (null, 2, "tag2"); Tag t3 = new Tag (null, 3, "tag3"); Tag t4 = new Tag (null, 4, "tag4"); Tag t5 = new Tag (null, 5, "tag5"); TagTerm tt1 = new TagTerm (t1); TagTerm tt2 = new TagTerm (t2); TagTerm tt3 = new TagTerm (t3); TagTerm tt4 = new TagTerm (t4); TagTerm tt5 = new TagTerm (t5); object [] tests = { " (photos.id IN (SELECT photo_id FROM photo_tags WHERE tag_id = 1)) ", tt1, " (photos.id IN (SELECT photo_id FROM photo_tags WHERE tag_id IN (2, 3))) ", new OrTerm (tt2, tt3), " (photos.id IN (SELECT photo_id FROM photo_tags WHERE tag_id IN (3, 4, 5))) ", new OrTerm (tt3, tt4, tt5), }; for (int i=0; i < tests.Length; i+=2) { //System.Console.WriteLine ((tests[i+1] as LogicalTerm).SqlClause ()); //System.Console.WriteLine (tests[i]); Assert.AreEqual (tests[i] as string, (tests[i+1] as LogicalTerm).SqlClause ()); } } } } #endif f-spot-0.8.2/src/Core/FSpot.Query/FSpot.Query/DateRange.cs0000644000175000017500000000155111503404762023403 0ustar00rubenruben00000000000000/* * DateRange.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details. * */ using System; using Hyena; namespace FSpot.Query { public class DateRange : IQueryCondition { private DateTime start; public DateTime Start { get { return start; } } private DateTime end; public DateTime End { get { return end; } } public DateRange (DateTime start, DateTime end) { this.start = start; this.end = end; } public DateRange (int year, int month) { start = new DateTime (year, month, 1); end = new DateTime (month < 12 ? year : year + 1, month < 12 ? month + 1 : 1, 1); } public string SqlClause () { return String.Format (" photos.time >= {0} AND photos.time <= {1} ", DateTimeUtil.FromDateTime (start), DateTimeUtil.FromDateTime (end)); } } } f-spot-0.8.2/src/Core/FSpot.Query/FSpot.Query/RollSet.cs0000644000175000017500000000140711503404762023135 0ustar00rubenruben00000000000000/* * RollSet.cs * * Author(s): * Bengt Thuree * Stephane Delcroix * * This is frees software. See COPYING for details. */ using FSpot.Core; namespace FSpot.Query { public class RollSet : IQueryCondition { private Roll [] rolls; public RollSet (Roll [] rolls) { this.rolls = rolls; } public RollSet (Roll roll) : this (new Roll[] {roll}) { } public string SqlClause () { //Building something like " photos.roll_id IN (3, 4, 7) " System.Text.StringBuilder sb = new System.Text.StringBuilder (" photos.roll_id IN ("); for (int i = 0; i < rolls.Length; i++) { sb.Append (rolls [i].Id); if (i != rolls.Length - 1) sb.Append (", "); } sb.Append (") "); return sb.ToString (); } } } f-spot-0.8.2/src/Core/FSpot.Query/FSpot.Query/ConditionWrapper.cs0000644000175000017500000000061011503404762025033 0ustar00rubenruben00000000000000/* * ConditionWrapper.cs * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. */ namespace FSpot.Query { public class ConditionWrapper : IQueryCondition { string condition; public ConditionWrapper (string condition) { this.condition = condition; } public string SqlClause () { return condition; } } } f-spot-0.8.2/src/Core/FSpot.Query/Makefile.in0000644000175000017500000006706411503407254021142 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Core/FSpot.Query ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Query TARGET = library LINK = $(REF_FSPOT_QUERY) $(am__append_1) SOURCES = \ FSpot.Query/ConditionWrapper.cs \ FSpot.Query/DateRange.cs \ FSpot.Query/FolderSet.cs \ FSpot.Query/IOrderCondition.cs \ FSpot.Query/IQueryCondition.cs \ FSpot.Query/LogicalTerm.cs \ FSpot.Query/OrderByTime.cs \ FSpot.Query/RatingRange.cs \ FSpot.Query/RollSet.cs \ FSpot.Query/Tests/LogicalTermTests.cs \ FSpot.Query/UntaggedCondition.cs RESOURCES = # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Core/FSpot.Query/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Core/FSpot.Query/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Core/FSpot.Query/Makefile.am0000644000175000017500000000074111430555234021117 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Query TARGET = library LINK = $(REF_FSPOT_QUERY) SOURCES = \ FSpot.Query/ConditionWrapper.cs \ FSpot.Query/DateRange.cs \ FSpot.Query/FolderSet.cs \ FSpot.Query/IOrderCondition.cs \ FSpot.Query/IQueryCondition.cs \ FSpot.Query/LogicalTerm.cs \ FSpot.Query/OrderByTime.cs \ FSpot.Query/RatingRange.cs \ FSpot.Query/RollSet.cs \ FSpot.Query/Tests/LogicalTermTests.cs \ FSpot.Query/UntaggedCondition.cs RESOURCES = include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Core/Makefile.in0000644000175000017500000005212211503407255016771 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/Core DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = \ FSpot.Bling \ FSpot.Cms \ FSpot.Utils \ FSpot.Core \ FSpot.JobScheduler \ FSpot.Query \ FSpot.Gui \ FSpot.Platform all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Core/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Core/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Core/Makefile.am0000644000175000017500000000021711430555235016757 0ustar00rubenruben00000000000000SUBDIRS = \ FSpot.Bling \ FSpot.Cms \ FSpot.Utils \ FSpot.Core \ FSpot.JobScheduler \ FSpot.Query \ FSpot.Gui \ FSpot.Platform f-spot-0.8.2/src/Core/FSpot.Core/0000777000175000017500000000000011503407442016646 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core.addins0000644000175000017500000000007111430555234021750 0ustar00rubenruben00000000000000 ./Extensions f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core.dll.config.in0000644000175000017500000000027111430555234023134 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core.dll.config0000644000175000017500000000027111503407351022524 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Core/FSpot.Core/Makefile.in0000644000175000017500000007217611503407251020722 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/FSpot.Core.dll.config.in $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Core/FSpot.Core ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = FSpot.Core.dll.config CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DATA = $(module_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Core TARGET = library LINK = $(REF_FSPOT_CORE) $(am__append_1) SOURCES = \ FSpot.Core/BrowsableCollectionProxy.cs \ FSpot.Core/BrowsableEventArgs.cs \ FSpot.Core/BrowsablePointer.cs \ FSpot.Core/BrowsablePointerChangedEventArgs.cs \ FSpot.Core/Category.cs \ FSpot.Core/DbItem.cs \ FSpot.Core/Defines.cs \ FSpot.Core/FilePhoto.cs \ FSpot.Core/Global.cs \ FSpot.Core/IBrowsableCollection.cs \ FSpot.Core/IBrowsableItemChanges.cs \ FSpot.Core/IInvalidPhotoCheck.cs \ FSpot.Core/ILoadable.cs \ FSpot.Core/IPhoto.cs \ FSpot.Core/IPhotoComparer.cs \ FSpot.Core/IPhotoExtensions.cs \ FSpot.Core/IPhotoVersion.cs \ FSpot.Core/IPhotoVersionable.cs \ FSpot.Core/PhotoChanges.cs \ FSpot.Core/PhotoList.cs \ FSpot.Core/PhotosChanges.cs \ FSpot.Core/Roll.cs \ FSpot.Core/Tag.cs RESOURCES = FSpot.Core.addins module_DATA = FSpot.Core.addins # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) FSpot.Core.dll.config EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) \ $(THEME_ICONS_SOURCE) FSpot.Core.dll.config CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Core/FSpot.Core/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Core/FSpot.Core/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): FSpot.Core.dll.config: $(top_builddir)/config.status $(srcdir)/FSpot.Core.dll.config.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-moduleDATA: $(module_DATA) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_DATA)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(moduledir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(moduledir)" || exit $$?; \ done uninstall-moduleDATA: @$(NORMAL_UNINSTALL) @list='$(module_DATA)'; test -n "$(moduledir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) $(DATA) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleDATA \ install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleDATA \ uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleDATA install-moduleSCRIPTS \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am uninstall-local uninstall-moduleDATA \ uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Core/FSpot.Core/Makefile.am0000644000175000017500000000171211462351716020705 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Core TARGET = library LINK = $(REF_FSPOT_CORE) SOURCES = \ FSpot.Core/BrowsableCollectionProxy.cs \ FSpot.Core/BrowsableEventArgs.cs \ FSpot.Core/BrowsablePointer.cs \ FSpot.Core/BrowsablePointerChangedEventArgs.cs \ FSpot.Core/Category.cs \ FSpot.Core/DbItem.cs \ FSpot.Core/Defines.cs \ FSpot.Core/FilePhoto.cs \ FSpot.Core/Global.cs \ FSpot.Core/IBrowsableCollection.cs \ FSpot.Core/IBrowsableItemChanges.cs \ FSpot.Core/IInvalidPhotoCheck.cs \ FSpot.Core/ILoadable.cs \ FSpot.Core/IPhoto.cs \ FSpot.Core/IPhotoComparer.cs \ FSpot.Core/IPhotoExtensions.cs \ FSpot.Core/IPhotoVersion.cs \ FSpot.Core/IPhotoVersionable.cs \ FSpot.Core/PhotoChanges.cs \ FSpot.Core/PhotoList.cs \ FSpot.Core/PhotosChanges.cs \ FSpot.Core/Roll.cs \ FSpot.Core/Tag.cs RESOURCES = FSpot.Core.addins module_DATA = FSpot.Core.addins include $(top_srcdir)/build/build.mk EXTRA_DIST += FSpot.Core.dll.config module_SCRIPTS += FSpot.Core.dll.config f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/0000777000175000017500000000000011503407442020570 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/IPhotoVersion.cs0000644000175000017500000000265411503404761023673 0ustar00rubenruben00000000000000/* * IBrowsableItemVersion.cs * * Author(s): * Ruben Vermeersch * Mike Gemuende * * This is free software. See COPYING for details. */ using Hyena; namespace FSpot.Core { public interface IPhotoVersion : ILoadable { #region Metadata /// /// The name of the version. e.g. "Convert to Black and White" /// /// /// This is not the name of the file. /// string Name { get; } // TODO: add Comment bool IsProtected { get; } // TODO: add more metadata #endregion #region File Information // TODO: BaseUri and Filename are just in the database scheme. Does it make sense to provide them // to the outside? /// /// The base uri of the directory of this version. That is the whole uri without the /// filename. /// SafeUri BaseUri { get; } /// /// The filename of this version. /// string Filename { get; } // TODO: add Comment // TODO: not every item is also imported. So does it make sense to have that checksum here? // (If a comment is added, include the easons for having this here!) string ImportMD5 { get; } #endregion } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/IInvalidPhotoCheck.cs0000644000175000017500000000250511462351716024572 0ustar00rubenruben00000000000000// // IInvalidPhotoCheck.cs // // Author: // Ruben Vermeersch // // Copyright (C) 2010 Novell, Inc. // Copyright (C) 2010 Ruben Vermeersch // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // namespace FSpot.Core { public interface IInvalidPhotoCheck { bool IsInvalid { get; } } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/Defines.cs.in0000644000175000017500000000075111430555234023102 0ustar00rubenruben00000000000000// // Defines.cs // Get the locale directory // // Authors: // Martin Willemoes Hansen // // (C) 2004 Martin Willemoes Hansen // namespace FSpot.Core { public struct Defines { public const string LOCALE_DIR = "@prefix@/share/locale"; public const string VERSION = "@VERSION@"; public const string PACKAGE = "@PACKAGE@"; public const string PREFIX = "@prefix@"; public const string APP_DATA_DIR = "@prefix@/share/@PACKAGE@"; public const string BINDIR = PREFIX + "/bin"; } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/IBrowsableItemChanges.cs0000644000175000017500000000157011503404761025260 0ustar00rubenruben00000000000000/* * IBrowsableItemChanges.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details */ namespace FSpot.Core { public interface IBrowsableItemChanges { bool DataChanged {get;} bool MetadataChanged {get;} } public class FullInvalidate : IBrowsableItemChanges { static FullInvalidate instance = new FullInvalidate (); public static FullInvalidate Instance { get { return instance; } } public bool DataChanged { get { return true; } } public bool MetadataChanged { get { return true; } } } public class InvalidateData : IBrowsableItemChanges { static InvalidateData instance = new InvalidateData (); public static InvalidateData Instance { get { return instance; } } public bool DataChanged { get { return true; } } public bool MetadataChanged { get { return false; } } } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/PhotosChanges.cs0000644000175000017500000000614011503404761023662 0ustar00rubenruben00000000000000/* * FSpot.PhotosChanges.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using System.Collections.Generic; namespace FSpot.Core { //used to aggregate PhotoChanges and notifying the various ui pieces public class PhotosChanges : IBrowsableItemChanges { [Flags ()] enum Changes { DefaultVersionId = 0x1, Time = 0x2, Uri = 0x4, Rating = 0x8, Description = 0x10, RollId = 0x20, Data = 0x40, MD5Sum = 0x80 } Changes changes = 0; public bool MetadataChanged { get { return (changes & ~Changes.Data) != 0 || TagsChanged || VersionsChanged; } } public bool DataChanged { get { return (changes & Changes.Data) == Changes.Data; } set { if (value) changes |= Changes.Data; else changes &= ~Changes.Data; } } public bool DefaultVersionIdChanged { get { return (changes & Changes.DefaultVersionId) == Changes.DefaultVersionId; } set { if (value) { changes |= Changes.DefaultVersionId; DataChanged = true; } else changes &= ~Changes.DefaultVersionId; } } public bool TimeChanged { get { return (changes & Changes.Time) == Changes.Time; } set { if (value) changes |= Changes.Time; else changes &= ~Changes.Time; } } public bool UriChanged { get { return (changes & Changes.Uri) == Changes.Uri; } set { if (value) changes |= Changes.Uri; else changes &= ~Changes.Uri; } } public bool RatingChanged { get { return (changes & Changes.Rating) == Changes.Rating; } set { if (value) changes |= Changes.Rating; else changes &= ~Changes.Rating; } } public bool DescriptionChanged { get { return (changes & Changes.Description) == Changes.Description; } set { if (value) changes |= Changes.Description; else changes &= ~ Changes.Description; } } bool tags_changed = false; public virtual bool TagsChanged { get { return tags_changed; } private set { tags_changed = value; } } bool versions_changed = false; public virtual bool VersionsChanged { get { return versions_changed; } private set { versions_changed = value; } } public bool RollIdChanged { get { return (changes & Changes.RollId) == Changes.RollId; } set { if (value) changes |= Changes.RollId; else changes &= ~Changes.RollId; } } public bool MD5SumChanged { get { return (changes & Changes.MD5Sum) == Changes.MD5Sum ; } set { if (value) changes |= Changes.MD5Sum; else changes &= ~Changes.MD5Sum; } } public static PhotosChanges operator | (PhotosChanges c1, PhotosChanges c2) { if (c1 == null) throw new ArgumentNullException ("c1"); if (c2 == null) throw new ArgumentNullException ("c2"); PhotosChanges changes = new PhotosChanges (); changes.changes = c1.changes | c2.changes; changes.VersionsChanged = c1.VersionsChanged || c2.VersionsChanged; changes.TagsChanged = c1.TagsChanged || c2.TagsChanged; return changes; } public PhotosChanges () { } } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/IPhotoExtensions.cs0000644000175000017500000000225611503404761024403 0ustar00rubenruben00000000000000using System; using System.IO; namespace FSpot.Core { public static class IPhotoExtensions { public static int CompareDate (this IPhoto photo1, IPhoto photo2) { return DateTime.Compare (photo1.Time, photo2.Time); } public static int CompareName (this IPhoto photo1, IPhoto photo2) { return string.Compare (photo1.Name, photo2.Name); } public static int Compare (this IPhoto photo1, IPhoto photo2) { int result = photo1.CompareDate (photo2); if (result == 0) result = CompareDefaultVersionUri (photo1, photo2); if (result == 0) result = photo1.CompareName (photo2); return result; } public static int CompareDefaultVersionUri (this IPhoto photo1, IPhoto photo2) { var photo1_uri = Path.Combine (photo1.DefaultVersion.BaseUri, photo1.DefaultVersion.Filename); var photo2_uri = Path.Combine (photo2.DefaultVersion.BaseUri, photo2.DefaultVersion.Filename); return string.Compare (photo1_uri, photo2_uri); } } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/BrowsableCollectionProxy.cs0000644000175000017500000000466211503404761026122 0ustar00rubenruben00000000000000/* * FSpot.BrowsableCollectionProxy.cs * * Author(s): * Paul Wellner Bou * * This is free software, See COPYING for details */ using System.Collections.Generic; namespace FSpot.Core { public class BrowsableCollectionProxy : IBrowsableCollection { private IBrowsableCollection collection; public IBrowsableCollection Collection { get { return collection; } set { if (collection == value) return; if (collection != null) { collection.Changed -= ChangedHandler; collection.ItemsChanged -= ItemsChangedHandler; } collection = value; if (collection != null) { collection.Changed += ChangedHandler; collection.ItemsChanged += ItemsChangedHandler; } ChangedHandler (this); } } public int Count { get { return collection != null ? collection.Count : 0; } } public int IndexOf (IPhoto item) { if (collection == null) return -1; return collection.IndexOf (item); } public bool Contains (IPhoto item) { if (collection == null) return false; return collection.Contains (item); } public IPhoto this [int index] { get { if (collection == null) throw new System.IndexOutOfRangeException (); return collection [index]; } } public void MarkChanged (int num, IBrowsableItemChanges changes) { if (collection != null) collection.MarkChanged (num, changes); } public IPhoto [] Items { get { return collection.Items; } } protected virtual void ChangedHandler (IBrowsableCollection collection) { if (Changed != null) Changed (this); } protected virtual void ItemsChangedHandler (IBrowsableCollection collection, BrowsableEventArgs args) { if (ItemsChanged != null) ItemsChanged (this, args); } public event IBrowsableCollectionChangedHandler Changed; public event IBrowsableCollectionItemsChangedHandler ItemsChanged; } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/PhotoList.cs0000644000175000017500000000470211503404761023044 0ustar00rubenruben00000000000000/* * FSpot.PhotoList.cs * * Author(s): * Larry Ewing * * This is free software, See COPYING for details */ using System.Collections.Generic; namespace FSpot.Core { public class PhotoList : IBrowsableCollection { protected List list; private IPhoto[] cache; public PhotoList (IEnumerable photos) { list = new List (photos); } public PhotoList (params IPhoto[] photos) : this(photos as IEnumerable) { } public int Count { get { return list.Count; } } public void Clear () { list.Clear (); Reload (); } public int Capacity { set { list.Capacity = value; } } public void Add (IPhoto photo) { list.Add (photo); Reload (); } public void Add (IEnumerable items) { list.AddRange (items); Reload (); } public int IndexOf (IPhoto item) { return list.IndexOf (item); } public bool Contains (IPhoto item) { return list.Contains (item); } public IPhoto this[int index] { get { return list[index]; } set { list[index] = value; MarkChanged (index, FullInvalidate.Instance); } } public void Sort (IComparer compare) { list.Sort (compare); Reload (); } public void Reload () { cache = null; if (Changed != null) Changed (this); } public void MarkChanged (int num, IBrowsableItemChanges changes) { MarkChanged (new BrowsableEventArgs (num, changes)); } public void MarkChanged (BrowsableEventArgs args) { if (ItemsChanged != null) ItemsChanged (this, args); } public IPhoto[] Items { get { if (cache == null) cache = list.ToArray (); return cache; } set { list.Clear (); Add (value); } } public event IBrowsableCollectionChangedHandler Changed; public event IBrowsableCollectionItemsChangedHandler ItemsChanged; } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/Roll.cs0000644000175000017500000000071411503404761022026 0ustar00rubenruben00000000000000/* * RollStore.cs * * Author(s) * Bengt Thuree * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using Hyena; namespace FSpot.Core { public class Roll : DbItem { // The time is always in UTC. private DateTime time; public DateTime Time { get { return time; } } public Roll (uint id, long unix_time) : base (id) { time = DateTimeUtil.ToDateTime (unix_time); } } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/IPhoto.cs0000644000175000017500000000302611503404761022317 0ustar00rubenruben00000000000000/* * IBrowsableItem.cs * * Author(s): * Larry Ewing * Mike Gemuende * * This is free software. See COPYING for details. */ using System.Collections.Generic; using Hyena; namespace FSpot.Core { public interface IPhoto { #region Metadata /// /// The time the item was created. /// System.DateTime Time { get; } /// /// The tags which are dedicated to this item. /// Tag[] Tags { get; } /// /// The description of the item. /// string Description { get; } /// /// The name of the item. /// string Name { get; } /// /// The rating which is dedicted to this item. It should only range from 0 to 5. /// uint Rating { get; } #endregion #region Versioning /// /// The default version of this item. Every item must have at least one version and this must not be /// /// IPhotoVersion DefaultVersion { get; } /// /// All versions of this item. Since every item must have at least the default version, this enumeration /// must not be empty. /// IEnumerable Versions { get; } #endregion } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/Defines.cs0000644000175000017500000000077211503407351022475 0ustar00rubenruben00000000000000// // Defines.cs // Get the locale directory // // Authors: // Martin Willemoes Hansen // // (C) 2004 Martin Willemoes Hansen // namespace FSpot.Core { public struct Defines { public const string LOCALE_DIR = "/home/ruben/Build/share/locale"; public const string VERSION = "0.8.2"; public const string PACKAGE = "f-spot"; public const string PREFIX = "/home/ruben/Build"; public const string APP_DATA_DIR = "/home/ruben/Build/share/f-spot"; public const string BINDIR = PREFIX + "/bin"; } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/IPhotoComparer.cs0000644000175000017500000000213711503404761024012 0ustar00rubenruben00000000000000using System; using System.Collections; using System.Collections.Generic; namespace FSpot.Core { public static class IPhotoComparer { public class CompareDateName : IComparer { public int Compare (IPhoto p1, IPhoto p2) { int result = p1.CompareDate (p2); if (result == 0) result = p1.CompareName (p2); return result; } } public class RandomSort : IComparer { Random random = new Random (); public int Compare (object obj1, object obj2) { return random.Next (-5, 5); } } public class CompareDirectory : IComparer { public int Compare (IPhoto p1, IPhoto p2) { int result = p1.CompareDefaultVersionUri (p2); if (result == 0) result = p1.CompareName (p2); return result; } } } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/PhotoChanges.cs0000644000175000017500000000613011503404761023476 0ustar00rubenruben00000000000000/* * FSpot.PhotoChanges.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using System.Collections.Generic; namespace FSpot.Core { //Track the changes done to a Photo between Commit's public class PhotoChanges : PhotosChanges { public override bool VersionsChanged { get { return VersionsAdded == null && VersionsRemoved == null && VersionsModified == null; } } public override bool TagsChanged { get { return TagsAdded == null && TagsRemoved == null; } } List tags_added = null; public Tag [] TagsAdded { get { if (tags_added == null) return null; if (tags_added.Count == 0) return null; return tags_added.ToArray (); } set { foreach (Tag t in value) AddTag (t); } } public void AddTag (Tag t) { if (tags_added == null) tags_added = new List (); if (tags_removed != null) tags_removed.Remove (t); tags_added.Add (t); } List tags_removed = null; public Tag [] TagsRemoved { get { if (tags_removed == null) return null; if (tags_removed.Count == 0) return null; return tags_removed.ToArray (); } set { foreach (Tag t in value) RemoveTag (t); } } public void RemoveTag (Tag t) { if (tags_removed == null) tags_removed = new List (); if (tags_added != null) tags_added.Remove (t); tags_removed.Add (t); } List versions_added = null; public uint [] VersionsAdded { get { if (versions_added == null) return null; if (versions_added.Count == 0) return null; return versions_added.ToArray (); } set { foreach (uint u in value) AddVersion (u); } } public void AddVersion (uint v) { if (versions_added == null) versions_added = new List (); versions_added.Add (v); } List versions_removed = null; public uint [] VersionsRemoved { get { if (versions_removed == null) return null; if (versions_removed.Count == 0) return null; return versions_removed.ToArray (); } set { foreach (uint u in value) RemoveVersion (u); } } public void RemoveVersion (uint v) { if (versions_removed == null) versions_removed= new List (); if (versions_added != null) versions_added.Remove (v); if (versions_modified != null) versions_modified.Remove (v); versions_removed.Add (v); } List versions_modified = null; public uint [] VersionsModified { get { if (versions_modified == null) return null; if (versions_modified.Count == 0) return null; return versions_modified.ToArray (); } set { foreach (uint u in value) ChangeVersion (u); } } public void ChangeVersion (uint v) { if (versions_modified == null) versions_modified = new List (); if (versions_added != null && versions_added.Contains (v)) return; if (versions_removed != null && versions_removed.Contains (v)) return; versions_modified.Add (v); } public PhotoChanges () { } } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/IBrowsableCollection.cs0000644000175000017500000000206011503404761025157 0ustar00rubenruben00000000000000/* * IBrowsableCollection.cs * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ namespace FSpot.Core { public delegate void IBrowsableCollectionChangedHandler (IBrowsableCollection collection); public delegate void IBrowsableCollectionItemsChangedHandler (IBrowsableCollection collection, BrowsableEventArgs args); public interface IBrowsableCollection { // FIXME this should really be ToArray () IPhoto [] Items { get; } int IndexOf (IPhoto item); IPhoto this [int index] { get; } int Count { get; } bool Contains (IPhoto item); // FIXME the Changed event needs to pass along information // about the items that actually changed if possible. For things like // TrayView everything has to be redrawn when a single // item has been added or removed which adds too much // overhead. event IBrowsableCollectionChangedHandler Changed; event IBrowsableCollectionItemsChangedHandler ItemsChanged; void MarkChanged (int index, IBrowsableItemChanges changes); } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/Tag.cs0000644000175000017500000001033311503404761021627 0ustar00rubenruben00000000000000/* * FSpot.Tag * * Author(s): * Larry Ewing * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using Gdk; using FSpot.Utils; using Hyena; namespace FSpot.Core { public class Tag : DbItem, IComparable, IDisposable { string name; public string Name { get { return name; } set { name = value;} } Category category; public Category Category { get { return category; } set { if (Category != null) Category.RemoveChild (this); category = value; if (category != null) category.AddChild (this); } } int sort_priority; public int SortPriority { get { return sort_priority; } set { sort_priority = value; } } int popularity = 0; public int Popularity { get { return popularity; } set { popularity = value; } } // Icon. If theme_icon_name is not null, then we save the name of the icon instead // of the actual icon data. string theme_icon_name; public string ThemeIconName { get { return theme_icon_name; } set { theme_icon_name = value; } } Pixbuf icon; public Pixbuf Icon { get { if (icon == null && theme_icon_name != null) { cached_icon_size = IconSize.Hidden; icon = GtkUtil.TryLoadIcon (Global.IconTheme, theme_icon_name, 48, (Gtk.IconLookupFlags)0); } return icon; } set { theme_icon_name = null; if (icon != null) icon.Dispose (); icon = value; cached_icon_size = IconSize.Hidden; IconWasCleared = value == null; } } bool icon_was_cleared = false; public bool IconWasCleared { get { return icon_was_cleared; } set { icon_was_cleared = value; } } public enum IconSize { Hidden = 0, Small = 16, Medium = 24, Large = 48 }; static IconSize tag_icon_size = IconSize.Large; public static IconSize TagIconSize { get { return tag_icon_size; } set { tag_icon_size = value; } } Pixbuf cached_icon; private IconSize cached_icon_size = IconSize.Hidden; // We can use a SizedIcon everywhere we were using an Icon public Pixbuf SizedIcon { get { if (tag_icon_size == IconSize.Hidden) //Hidden return null; if (tag_icon_size == cached_icon_size) return cached_icon; if (theme_icon_name != null) { //Theme icon if (cached_icon != null) cached_icon.Dispose (); cached_icon = GtkUtil.TryLoadIcon (Global.IconTheme, theme_icon_name, (int) tag_icon_size, (Gtk.IconLookupFlags)0); if (Math.Max (cached_icon.Width, cached_icon.Height) <= (int) tag_icon_size) return cached_icon; } if (Icon == null) return null; if (Math.Max (Icon.Width, Icon.Height) >= (int) tag_icon_size) { //Don't upscale if (cached_icon != null) cached_icon.Dispose (); cached_icon = Icon.ScaleSimple ((int) tag_icon_size, (int) tag_icon_size, InterpType.Bilinear); cached_icon_size = tag_icon_size; return cached_icon; } else return Icon; } } // You are not supposed to invoke these constructors outside of the TagStore class. public Tag (Category category, uint id, string name) : base (id) { Category = category; Name = name; } // IComparer. public int CompareTo (Tag tag) { if (tag == null) throw new ArgumentNullException ("tag"); if (Category == tag.Category) { if (SortPriority == tag.SortPriority) return Name.CompareTo (tag.Name); else return SortPriority - tag.SortPriority; } else { return Category.CompareTo (tag.Category); } } public bool IsAncestorOf (Tag tag) { if (tag == null) throw new ArgumentNullException ("tag"); for (Category parent = tag.Category; parent != null; parent = parent.Category) { if (parent == this) return true; } return false; } public void Dispose () { if (icon != null) icon.Dispose (); if (cached_icon != null) cached_icon.Dispose (); if (category != null) category.Dispose (); System.GC.SuppressFinalize (this); } ~Tag () { Log.DebugFormat ("Finalizer called on {0}. Should be Disposed", GetType ()); if (icon != null) icon.Dispose (); if (cached_icon != null) cached_icon.Dispose (); if (category != null) category.Dispose (); } } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/BrowsablePointerChangedEventArgs.cs0000644000175000017500000000141411503404761027466 0ustar00rubenruben00000000000000/* * BrowsablePointerChangedEventArgs.cs * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ namespace FSpot.Core { public class BrowsablePointerChangedEventArgs : System.EventArgs { IPhoto previous_item; public IPhoto PreviousItem { get { return previous_item; } } int previous_index; public int PreviousIndex { get { return previous_index; } } IBrowsableItemChanges changes; public IBrowsableItemChanges Changes { get { return changes; } } public BrowsablePointerChangedEventArgs (IPhoto previous_item, int previous_index, IBrowsableItemChanges changes) : base () { this.previous_item = previous_item; this.previous_index = previous_index; this.changes = changes; } } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/IPhotoVersionable.cs0000644000175000017500000000141511503404761024511 0ustar00rubenruben00000000000000/* * IBrowsableItemVersion.cs * * Author(s): * Ruben Vermeersch * Mike Gemuende * * This is free software. See COPYING for details. */ using System.Collections.Generic; namespace FSpot.Core { /// /// The interface adds functionality which is related to items where /// versions can be added or removed. /// public interface IPhotoVersionable : IPhoto { /// /// Sets the default version of a the item. /// /// /// A which will be the new /// default version. /// void SetDefaultVersion (IPhotoVersion version); } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/BrowsableEventArgs.cs0000644000175000017500000000125011503404761024651 0ustar00rubenruben00000000000000/* * FSpot.BrowsableEventArgs.cs * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ using System; namespace FSpot.Core { public class BrowsableEventArgs : System.EventArgs { private readonly int [] items; public int [] Items { get { return items; } } IBrowsableItemChanges changes; public IBrowsableItemChanges Changes { get { return changes; } } public BrowsableEventArgs (int item, IBrowsableItemChanges changes) : this (new int[] {item}, changes) { } public BrowsableEventArgs (int[] items, IBrowsableItemChanges changes) { this.items = items; this.changes = changes; } } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/ILoadable.cs0000644000175000017500000000037111503404761022731 0ustar00rubenruben00000000000000using Hyena; namespace FSpot.Core { /// /// This is the contract that needs to be implemented before the image /// data of the object can be loaded. /// public interface ILoadable { SafeUri Uri { get; set; } } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/Global.cs0000644000175000017500000000365011503404761022320 0ustar00rubenruben00000000000000/* * Global.cs * * This is free software. See COPYING for details * */ using System; using Hyena; namespace FSpot.Core { public static class Global { public static string HomeDirectory { get { return System.IO.Path.Combine (System.Environment.GetEnvironmentVariable ("HOME"), System.String.Empty); } } //$XDG_CONFIG_HOME/f-spot or $HOME/.config/f-spot private static string xdg_config_home = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData); private static string base_dir = System.IO.Path.Combine (xdg_config_home, "f-spot"); public static string BaseDirectory { get { return base_dir; } set { base_dir = value; } } private static SafeUri photo_uri; public static SafeUri PhotoUri { get { return photo_uri; } set { photo_uri = value; } } public static string HelpDirectory { get { // path is relative return "f-spot"; } } private static Cms.Profile display_profile; public static Cms.Profile DisplayProfile { set { display_profile = value; } get { return display_profile; } } private static Cms.Profile destination_profile; public static Cms.Profile DestinationProfile { set { destination_profile = value; } get { return destination_profile; } } private static Gtk.IconTheme icon_theme; public static Gtk.IconTheme IconTheme { get { if (icon_theme == null) { icon_theme = Gtk.IconTheme.Default; icon_theme.AppendSearchPath (System.IO.Path.Combine (Defines.APP_DATA_DIR, "icons")); } return icon_theme; } } private static string [] default_rc_files; public static string [] DefaultRcFiles { get { if (default_rc_files == null) default_rc_files = Gtk.Rc.DefaultFiles; return default_rc_files; } set { default_rc_files = value; } } private static Gtk.PageSetup page_setup; public static Gtk.PageSetup PageSetup { get { return page_setup; } set { page_setup = value; } } } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/DbItem.cs0000644000175000017500000000115311503404761022260 0ustar00rubenruben00000000000000/* * FSpot.DbItem.cs * * Author(s): * Larry Ewing * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; namespace FSpot.Core { public class DbItem { uint id; public uint Id { get { return id; } } protected DbItem (uint id) { this.id = id; } } public class DbItemEventArgs : EventArgs where T : DbItem { private T [] items; public T [] Items { get { return items; } } public DbItemEventArgs (T [] items) : base () { this.items = items; } public DbItemEventArgs (T item) : base () { this.items = new T [] { item }; } } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/FilePhoto.cs0000644000175000017500000000666111503404761023016 0ustar00rubenruben00000000000000/* * FilePhoto.cs * * Author(s): * Larry Ewing (lewing@novell.com) * Stephane Delcroix (stephane@delcroix.org) * * This is free software. See COPYING for details */ using System; using System.IO; using System.Collections.Generic; using System.Xml; using Hyena; using FSpot.Utils; using Mono.Unix.Native; namespace FSpot.Core { public class FilePhoto : IPhoto, IInvalidPhotoCheck { bool metadata_parsed = false; public FilePhoto (SafeUri uri) { DefaultVersion = new FilePhotoVersion { Uri = uri }; } public bool IsInvalid { get { if (metadata_parsed) return false; try { EnsureMetadataParsed (); return false; } catch (Exception) { return true; } } } private void EnsureMetadataParsed () { if (metadata_parsed) return; using (var metadata = Metadata.Parse (DefaultVersion.Uri)) { if (metadata != null) { var date = metadata.ImageTag.DateTime; time = date.HasValue ? date.Value : CreateDate; description = metadata.ImageTag.Comment; } else { throw new Exception ("Corrupt File!"); } } metadata_parsed = true; } private DateTime CreateDate { get { var info = GLib.FileFactory.NewForUri (DefaultVersion.Uri).QueryInfo ("time::changed", GLib.FileQueryInfoFlags.None, null); return NativeConvert.ToDateTime ((long)info.GetAttributeULong ("time::changed")); } } public Tag[] Tags { get { return null; } } private DateTime time; public DateTime Time { get { EnsureMetadataParsed (); return time; } } public IPhotoVersion DefaultVersion { get; private set; } public IEnumerable Versions { get { yield return DefaultVersion; } } private string description; public string Description { get { EnsureMetadataParsed (); return description; } } public string Name { get { return DefaultVersion.Uri.GetFilename (); } } public uint Rating { //FIXME ndMaxxer: correct? get { return 0; } } private class FilePhotoVersion : IPhotoVersion { public string Name { get { return String.Empty; } } public bool IsProtected { get { return true; } } public SafeUri BaseUri { get { return Uri.GetBaseUri (); } } public string Filename { get { return Uri.GetFilename (); } } public SafeUri Uri { get; set; } private string import_md5 = String.Empty; public string ImportMD5 { get { if (import_md5 == String.Empty) import_md5 = HashUtils.GenerateMD5 (Uri); return import_md5; } } } } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/BrowsablePointer.cs0000644000175000017500000000536711503404761024410 0ustar00rubenruben00000000000000/* * BrowsablePointer.cs * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ using System; namespace FSpot.Core { public class BrowsablePointer { IBrowsableCollection collection; IPhoto item; int index; public event EventHandler Changed; public BrowsablePointer (IBrowsableCollection collection, int index) { if (collection == null) throw new ArgumentNullException ("collection"); this.collection = collection; this.Index = index; item = Current; collection.Changed += HandleCollectionChanged; collection.ItemsChanged += HandleCollectionItemsChanged; } public IBrowsableCollection Collection { get { return collection; } } public IPhoto Current { get { if (!this.IsValid) return null; else return collection [index]; } } private bool Valid (int val) { return val >= 0 && val < collection.Count; } public bool IsValid { get { return Valid (this.Index); } } public void MoveFirst () { Index = 0; } public void MoveLast () { Index = collection.Count - 1; } public void MoveNext () { MoveNext (false); } public void MoveNext (bool wrap) { int val = Index; val++; if (!Valid (val)) val = wrap ? 0 : Index; Index = val; } public void MovePrevious () { MovePrevious (false); } public void MovePrevious (bool wrap) { int val = Index; val--; if (!Valid (val)) val = wrap ? collection.Count - 1 : Index; Index = val; } public int Index { get { return index; } set { if (index != value) { SetIndex (value); } } } private void SetIndex (int value) { SetIndex (value, null); } private void SetIndex (int value, IBrowsableItemChanges changes) { BrowsablePointerChangedEventArgs args = new BrowsablePointerChangedEventArgs (Current, index, changes); index = value; item = Current; if (Changed != null) Changed (this, args); } protected void HandleCollectionItemsChanged (IBrowsableCollection collection, BrowsableEventArgs event_args) { foreach (int item in event_args.Items) if (item == Index) SetIndex (Index, event_args.Changes); } protected void HandleCollectionChanged (IBrowsableCollection collection) { if (collection == null) throw new ArgumentNullException ("collection"); int old_location = Index; int next_location = collection.IndexOf (item); if (old_location == next_location) { if (! Valid (next_location)) SetIndex (0, null); return; } if (Valid (next_location)) SetIndex (next_location); else if (Valid (old_location)) SetIndex (old_location); else SetIndex (0); } } } f-spot-0.8.2/src/Core/FSpot.Core/FSpot.Core/Category.cs0000644000175000017500000000237311503404761022676 0ustar00rubenruben00000000000000/* * FSpot.Category.cs * * Author(s): * Larry Ewing * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using System.Collections.Generic; namespace FSpot.Core { public class Category : Tag { List children; bool children_need_sort; public IList Children { get { if (children_need_sort) children.Sort (); return children.ToArray (); } set { children = new List (value); children_need_sort = true; } } // Appends all of this categories descendents to the list public void AddDescendentsTo (IList list) { if (list == null) throw new ArgumentNullException ("list"); foreach (Tag tag in children) { if (! list.Contains (tag)) list.Add (tag); Category cat = tag as Category; if (cat == null) continue; cat.AddDescendentsTo (list); } } public void AddChild (Tag child) { children.Add (child); children_need_sort = true; } public void RemoveChild (Tag child) { children.Remove (child); children_need_sort = true; } public Category (Category category, uint id, string name) : base (category, id, name) { children = new List (); } } } f-spot-0.8.2/src/Core/FSpot.Gui/0000777000175000017500000000000011503407444016504 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/0000777000175000017500000000000011503407444021144 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/DateEditFlags.cs0000644000175000017500000000054611503404761024133 0ustar00rubenruben00000000000000// // FSpot.Widgets.DateEditFlags // // Author(s) // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This is free software. See COPYING for details. // namespace FSpot.Widgets { [System.Flags] public enum DateEditFlags { None = 0, ShowTime = 1 << 0, ShowSeconds = 1 << 1, ShowOffset = 1 << 2, } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/OpenWithMenu.cs0000644000175000017500000000575111503404761024060 0ustar00rubenruben00000000000000/* * FSpot.Widgets.OpenWithMenu.cs * * Author(s) * Stephane Delcroix * Loz * Gabriel Burt * Larry Ewing * * Copyright (c) 2007 Stephane Delcroix * Copyright (c) 2007-2009 Novell, Inc. * * This is free software. See COPYING for details. */ using System; using System.Collections.Generic; using Gtk; using Gdk; using GLib; using GtkBeans; using Mono.Unix; namespace FSpot.Widgets { public class OpenWithMenu: Gtk.Menu { public event EventHandler ApplicationActivated; public delegate IEnumerable TypeFetcher (); TypeFetcher type_fetcher; List ignore_apps; public string [] IgnoreApp { get { if (ignore_apps == null) return null; return ignore_apps.ToArray (); } } bool show_icons = true; public bool ShowIcons { get { return show_icons; } set { show_icons = value; } } public OpenWithMenu (TypeFetcher type_fetcher) : this (type_fetcher, null) { } public OpenWithMenu (TypeFetcher type_fetcher, params string [] ignore_apps) { this.type_fetcher = type_fetcher; this.ignore_apps = new List (ignore_apps); } //FIXME: this should be private and done on Draw() public void Populate (object sender, EventArgs args) { Widget [] dead_pool = Children; for (int i = 0; i < dead_pool.Length; i++) dead_pool [i].Destroy (); foreach (AppInfo app in ApplicationsFor (type_fetcher ())) { AppMenuItem i = new AppMenuItem (app, show_icons); i.Activated += HandleItemActivated; Append (i); } if (Children.Length == 0) { MenuItem none = new Gtk.MenuItem (Catalog.GetString ("No applications available")); none.Sensitive = false; Append (none); } ShowAll (); } AppInfo[] ApplicationsFor (IEnumerable types) { List app_infos = new List (); List existing_ids = new List (); foreach (string type in types) foreach (AppInfo appinfo in AppInfoAdapter.GetAllForType (type)) { if (existing_ids.Contains (appinfo.Id)) continue; if (!appinfo.SupportsUris) continue; if (ignore_apps != null && ignore_apps.Contains (appinfo.Executable)) continue; app_infos.Add (appinfo); existing_ids.Add (appinfo.Id); } return app_infos.ToArray (); } private void HandleItemActivated (object sender, EventArgs args) { AppMenuItem app = (sender as AppMenuItem); if (ApplicationActivated != null) ApplicationActivated (this, new ApplicationActivatedEventArgs (app.App)); } private class AppMenuItem : ImageMenuItem { AppInfo app; public AppInfo App { get { return app; } } public AppMenuItem (AppInfo app, bool show_icon) : base (app.Name) { this.app = app; if (!show_icon) return; Image = GtkBeans.Image.NewFromIcon (app.Icon, IconSize.Menu); #if GTK_2_16 this.SetAlwaysShowImage (true); #endif } } } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/HighlightedBox.cs0000644000175000017500000000160311503404761024357 0ustar00rubenruben00000000000000/* * FSpot.Widgets.HighlightedBox.cs * * Author(s) * Gabriel Burt * * This is free software. See COPYING for details. */ using System; using Gtk; namespace FSpot.Widgets { public class HighlightedBox : EventBox { private bool changing_style = false; protected HighlightedBox (IntPtr raw) : base (raw) {} public HighlightedBox (Widget child) : base () { Child = child; AppPaintable = true; } protected override void OnStyleSet(Style style) { if (!changing_style) { changing_style = true; ModifyBg(StateType.Normal, Style.Background(StateType.Selected)); changing_style = false; } } protected override bool OnExposeEvent(Gdk.EventExpose evnt) { GdkWindow.DrawRectangle(Style.ForegroundGC(StateType.Normal), false, 0, 0, Allocation.Width - 1, Allocation.Height - 1); return base.OnExposeEvent(evnt); } } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/ToolTipWindow.cs0000644000175000017500000000122511503404761024250 0ustar00rubenruben00000000000000using Gtk; using Gdk; namespace FSpot.Widgets { public class ToolTipWindow : Gtk.Window { public ToolTipWindow () : base(Gtk.WindowType.Popup) { Name = "gtk-tooltips"; AppPaintable = true; BorderWidth = 4; } protected override bool OnExposeEvent (Gdk.EventExpose args) { Gtk.Style.PaintFlatBox (Style, GdkWindow, State, ShadowType.Out, args.Area, this, "tooltip", Allocation.X, Allocation.Y, Allocation.Width, Allocation.Height); return base.OnExposeEvent (args); } } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/ImageView_Container.cs0000644000175000017500000000623111503404761025347 0ustar00rubenruben00000000000000using Gtk; using System.Collections.Generic; namespace FSpot.Widgets { public partial class ImageView : Container { List children = new List (); #region container protected override void OnAdded (Gtk.Widget widget) { Put (widget, 0, 0); } protected override void OnRemoved (Gtk.Widget widget) { LayoutChild child = null; foreach (var c in children) { if (child.Widget == widget) { child = c; break; } } if (child != null) { widget.Unparent (); children.Remove (child); } } protected override void ForAll (bool include_internals, Gtk.Callback callback) { foreach (var child in children) { callback (child.Widget); } } #endregion #region children class LayoutChild { Gtk.Widget widget; public Gtk.Widget Widget { get { return widget; } } public int X { get; set; } public int Y { get; set; } public LayoutChild (Gtk.Widget widget, int x, int y) { this.widget = widget; X = x; Y = y; } } LayoutChild GetChild (Gtk.Widget widget) { foreach (var child in children) { if (child.Widget == widget) return child; } return null; } #endregion #region Public API public void Put (Gtk.Widget widget, int x, int y) { children.Add (new LayoutChild (widget, x, y)); if (IsRealized) widget.ParentWindow = GdkWindow; widget.Parent = this; } public void Move (Gtk.Widget widget, int x, int y) { LayoutChild child = GetChild (widget); if (child == null) return; child.X = x; child.Y = y; if (Visible && widget.Visible) QueueResize (); } private void OnRealizedChildren () { foreach (var child in children) { child.Widget.ParentWindow = GdkWindow; } } private void OnMappedChildren () { foreach (var child in children) { if (child.Widget.Visible && !child.Widget.IsMapped) child.Widget.Map (); } } private void OnSizeRequestedChildren () { foreach (var child in children) { child.Widget.SizeRequest (); } } private void OnSizeAllocatedChildren () { foreach (var child in children) { Gtk.Requisition req = child.Widget.ChildRequisition; child.Widget.SizeAllocate (new Gdk.Rectangle (child.X, child.Y, req.Width, req.Height)); } } #endregion } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/Layout.cs0000644000175000017500000001664111503404761022753 0ustar00rubenruben00000000000000// // FSpot.Widgets.Layout.cs // // Author(s): // Stephane Delcroix // // Port GtkLayout to managed, to have a finer control over the drawing process // // This is free software. See COPYING for details. // using System; using System.Collections.Generic; using Hyena; namespace FSpot.Widgets { public class Layout : Gtk.Container { public Layout () : this (null, null) { } public Layout (Gtk.Adjustment hadjustment, Gtk.Adjustment vadjustment) : base () { OnSetScrollAdjustments (hadjustment, vadjustment); children = new List (); } Gdk.Window bin_window = null; public Gdk.Window BinWindow { get { return bin_window; } } Gtk.Adjustment hadjustment; public Gtk.Adjustment Hadjustment { get { return hadjustment; } set { OnSetScrollAdjustments (hadjustment, Vadjustment); } } Gtk.Adjustment vadjustment; public Gtk.Adjustment Vadjustment { get { return vadjustment; } set { OnSetScrollAdjustments (Hadjustment, vadjustment); } } uint width = 100; public uint Width { get { return width; } } uint height = 100; public uint Height { get { return height; } } class LayoutChild { Gtk.Widget widget; public Gtk.Widget Widget { get { return widget; } } int x; public int X { get { return x; } set { x = value; } } int y; public int Y { get { return y; } set { y = value; } } public LayoutChild (Gtk.Widget widget, int x, int y) { this.widget = widget; this.x = x; this.y = y; } } List children; public void Put (Gtk.Widget widget, int x, int y) { children.Add (new LayoutChild (widget, x, y)); if (IsRealized) widget.ParentWindow = bin_window; widget.Parent = this; } public void Move (Gtk.Widget widget, int x, int y) { LayoutChild child = GetChild (widget); if (child == null) return; child.X = x; child.Y = y; if (Visible && widget.Visible) QueueResize (); } public void SetSize (uint width, uint height) { Hadjustment.Upper = this.width = width; Vadjustment.Upper = this.height = height; if (IsRealized) { bin_window.Resize ((int)Math.Max (width, Allocation.Width), (int)Math.Max (height, Allocation.Height)); } } LayoutChild GetChild (Gtk.Widget widget) { foreach (var child in children) if (child.Widget == widget) return child; return null; } #region widgetry protected override void OnRealized () { SetFlag (Gtk.WidgetFlags.Realized); Gdk.WindowAttr attributes = new Gdk.WindowAttr { WindowType = Gdk.WindowType.Child, X = Allocation.X, Y = Allocation.Y, Width = Allocation.Width, Height = Allocation.Height, Wclass = Gdk.WindowClass.InputOutput, Visual = this.Visual, Colormap = this.Colormap, Mask = Gdk.EventMask.VisibilityNotifyMask }; GdkWindow = new Gdk.Window (ParentWindow, attributes, Gdk.WindowAttributesType.X | Gdk.WindowAttributesType.Y | Gdk.WindowAttributesType.Visual | Gdk.WindowAttributesType.Colormap); GdkWindow.SetBackPixmap (null, false); GdkWindow.UserData = Handle; attributes = new Gdk.WindowAttr { WindowType = Gdk.WindowType.Child, X = (int)-Hadjustment.Value, Y = (int)-Vadjustment.Value, Width = (int)Math.Max (width, Allocation.Width), Height = (int)Math.Max (height, Allocation.Height), Wclass = Gdk.WindowClass.InputOutput, Visual = this.Visual, Colormap = this.Colormap, Mask = Gdk.EventMask.ExposureMask | Gdk.EventMask.ScrollMask | this.Events }; bin_window = new Gdk.Window (GdkWindow, attributes, Gdk.WindowAttributesType.X | Gdk.WindowAttributesType.Y | Gdk.WindowAttributesType.Visual | Gdk.WindowAttributesType.Colormap); bin_window.UserData = Handle; Style.Attach (GdkWindow); Style.SetBackground (bin_window, Gtk.StateType.Normal); foreach (var child in children) { child.Widget.ParentWindow = bin_window; } } protected override void OnUnrealized () { bin_window.Destroy (); bin_window = null; base.OnUnrealized (); } protected override void OnStyleSet (Gtk.Style old_style) { base.OnStyleSet (old_style); if (IsRealized) Style.SetBackground (bin_window, Gtk.StateType.Normal); } protected override void OnMapped () { SetFlag (Gtk.WidgetFlags.Mapped); foreach (var child in children) { if (child.Widget.Visible && !child.Widget.IsMapped) child.Widget.Map (); } bin_window.Show (); GdkWindow.Show (); } protected override void OnSizeRequested (ref Gtk.Requisition requisition) { requisition.Width = requisition.Height = 0; foreach (var child in children) { child.Widget.SizeRequest (); } } protected override void OnSizeAllocated (Gdk.Rectangle allocation) { foreach (var child in children) { Gtk.Requisition req = child.Widget.ChildRequisition; child.Widget.SizeAllocate (new Gdk.Rectangle (child.X, child.Y, req.Width, req.Height)); } if (IsRealized) { GdkWindow.MoveResize (allocation.X, allocation.Y, allocation.Width, allocation.Height); bin_window.Resize ((int)Math.Max (width, allocation.Width), (int)Math.Max (height, allocation.Height)); } Hadjustment.PageSize = allocation.Width; Hadjustment.PageIncrement = Width * .9; Hadjustment.Lower = 0; Hadjustment.Upper = Math.Max (width, allocation.Width); Vadjustment.PageSize = allocation.Height; Vadjustment.PageIncrement = Height * .9; Vadjustment.Lower = 0; Vadjustment.Upper = Math.Max (height, allocation.Height); base.OnSizeAllocated (allocation); } protected override bool OnExposeEvent (Gdk.EventExpose evnt) { if (evnt.Window != bin_window) return false; return base.OnExposeEvent (evnt); } protected override void OnSetScrollAdjustments (Gtk.Adjustment hadjustment, Gtk.Adjustment vadjustment) { Log.Debug ("\n\nLayout.OnSetScrollAdjustments"); if (hadjustment == null) hadjustment = new Gtk.Adjustment (0, 0, 0, 0, 0, 0); if (vadjustment == null) vadjustment = new Gtk.Adjustment (0, 0, 0, 0, 0, 0); bool need_change = false; if (Hadjustment != hadjustment) { this.hadjustment = hadjustment; this.hadjustment.Upper = Width; this.hadjustment.ValueChanged += HandleAdjustmentsValueChanged; need_change = true; } if (Vadjustment != vadjustment) { this.vadjustment = vadjustment; this.vadjustment.Upper = Width; this.vadjustment.ValueChanged += HandleAdjustmentsValueChanged; need_change = true; } if (need_change) HandleAdjustmentsValueChanged (this, EventArgs.Empty); } void HandleAdjustmentsValueChanged (object sender, EventArgs e) { if (IsRealized) bin_window.Move (-(int)Hadjustment.Value, -(int)Vadjustment.Value); } #endregion widgetry #region container stuffs protected override void OnAdded (Gtk.Widget widget) { Put (widget, 0, 0); } protected override void OnRemoved (Gtk.Widget widget) { LayoutChild child = null; foreach (var c in children) { if (child.Widget == widget) { child = c; break; } } if (child != null) { widget.Unparent (); children.Remove (child); } } protected override void ForAll (bool include_internals, Gtk.Callback callback) { foreach (var child in children) { callback (child.Widget); } } #endregion } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/ImageView.cs0000644000175000017500000010013311503404761023341 0ustar00rubenruben00000000000000// // FSpot.Widgets.ImageView.cs // // Author(s): // Stephane Delcroix // // This is free software. See COPYING for details. // using System; using System.Collections.Generic; using System.Runtime.InteropServices; using Gtk; using Gdk; using FSpot.Utils; using TagLib.Image; using Hyena; namespace FSpot.Widgets { public partial class ImageView : Container { #region public API protected ImageView (IntPtr raw) : base (raw) { } public ImageView (Adjustment hadjustment, Adjustment vadjustment, bool can_select) : base () { OnSetScrollAdjustments (hadjustment, vadjustment); AdjustmentsChanged += ScrollToAdjustments; WidgetFlags &= ~WidgetFlags.NoWindow; SetFlag (WidgetFlags.CanFocus); this.can_select = can_select; } public ImageView (bool can_select) : this (null, null, can_select) { } public ImageView () : this (true) { } Pixbuf pixbuf; public Pixbuf Pixbuf { get { return pixbuf; } set { if (pixbuf == value) return; pixbuf = value; min_zoom = ComputeMinZoom (upscale); ComputeScaledSize (); AdjustmentsChanged -= ScrollToAdjustments; Hadjustment.Value = Vadjustment.Value = 0; XOffset = YOffset = 0; AdjustmentsChanged += ScrollToAdjustments; QueueDraw (); } } ImageOrientation pixbuf_orientation; public ImageOrientation PixbufOrientation { get { return pixbuf_orientation; } set { if (value == pixbuf_orientation) return; pixbuf_orientation = value; min_zoom = ComputeMinZoom (upscale); ComputeScaledSize (); QueueDraw (); } } CheckPattern check_pattern = CheckPattern.Dark; public CheckPattern CheckPattern { get { return check_pattern; } set { if (check_pattern == value) return; check_pattern = value; if (Pixbuf != null && Pixbuf.HasAlpha) QueueDraw (); } } PointerMode pointer_mode = PointerMode.Select; public PointerMode PointerMode { get { return pointer_mode; } set { pointer_mode = value; } } public Adjustment Hadjustment { get; private set; } public Adjustment Vadjustment { get; private set; } bool can_select = false; public bool CanSelect { get { return can_select; } set { if (can_select == value) return; can_select = value; if (!can_select) selection = Rectangle.Zero; } } Gdk.Rectangle selection = Rectangle.Zero; public Gdk.Rectangle Selection { get { if (!can_select) return Rectangle.Zero; return selection; } set { if (!can_select) return; if (value == selection) return; selection = value; EventHandler eh = SelectionChanged; if (eh != null) eh (this, EventArgs.Empty); QueueDraw (); } } double selection_xy_ratio = 0; public double SelectionXyRatio { get { return selection_xy_ratio; } set { if (selection_xy_ratio == value) return; selection_xy_ratio = value; if (selection_xy_ratio == 0) return; if (Selection == Rectangle.Zero) return; Selection = ConstrainSelection (Selection, false, false); } } InterpType interpolation = InterpType.Bilinear; public Gdk.InterpType Interpolation { get { return interpolation; } set { if (interpolation == value) return; interpolation = value; QueueDraw (); } } double zoom = 1.0; public double Zoom { get { return zoom; } set { // Zoom around the center of the image. DoZoom (value, Allocation.Width / 2, Allocation.Height / 2); } } public void ZoomIn () { Zoom *= ZOOM_FACTOR; } public void ZoomOut () { Zoom *= 1.0 / ZOOM_FACTOR; } public void ZoomAboutPoint (double zoom_increment, int x, int y) { DoZoom (zoom * zoom_increment, x, y); } public bool Fit { get; private set; } public void ZoomFit (bool upscale) { Gtk.ScrolledWindow scrolled = Parent as Gtk.ScrolledWindow; if (scrolled != null) scrolled.SetPolicy (Gtk.PolicyType.Never, Gtk.PolicyType.Never); min_zoom = ComputeMinZoom (upscale); this.upscale = upscale; Fit = true; DoZoom (MIN_ZOOM, Allocation.Width / 2, Allocation.Height / 2); if (scrolled != null) { ThreadAssist.ProxyToMain (() => { scrolled.SetPolicy (Gtk.PolicyType.Automatic, Gtk.PolicyType.Automatic); }); } } public Point WindowCoordsToImage (Point win) { if (Pixbuf == null) return Point.Zero; int x_offset = scaled_width < Allocation.Width ? (int)(Allocation.Width - scaled_width) / 2 : -XOffset; int y_offset = scaled_height < Allocation.Height ? (int)(Allocation.Height - scaled_height) / 2 : -YOffset; win.X = Clamp (win.X - x_offset, 0, (int)scaled_width - 1); win.Y = Clamp (win.Y - y_offset, 0, (int)scaled_height - 1); win = PixbufUtils.TransformOrientation ((int)scaled_width, (int)scaled_height, win, PixbufUtils.ReverseTransformation (pixbuf_orientation)); return new Point ((int) Math.Floor (win.X * (double)(((int)PixbufOrientation <= 4 ? Pixbuf.Width : Pixbuf.Height) - 1) / (double)(scaled_width - 1) + .5), (int) Math.Floor (win.Y * (double)(((int)PixbufOrientation <= 4 ? Pixbuf.Height : Pixbuf.Width) - 1) / (double)(scaled_height - 1) + .5)); } public event EventHandler ZoomChanged; public event EventHandler SelectionChanged; #endregion #region protected API protected static double ZOOM_FACTOR = 1.1; protected double max_zoom = 10.0; protected double MAX_ZOOM { get { return max_zoom; } } protected double min_zoom = 0.1; protected double MIN_ZOOM { get { return min_zoom; } } bool upscale; protected void ZoomFit () { ZoomFit (upscale); } protected virtual void ApplyColorTransform (Pixbuf pixbuf) { } protected Point ImageCoordsToWindow (Point image) { if (this.Pixbuf == null) return Point.Zero; image = PixbufUtils.TransformOrientation (Pixbuf.Width, Pixbuf.Height, image, pixbuf_orientation); int x_offset = scaled_width < Allocation.Width ? (int)(Allocation.Width - scaled_width) / 2 : -XOffset; int y_offset = scaled_height < Allocation.Height ? (int)(Allocation.Height - scaled_height) / 2 : -YOffset; return new Point ((int) Math.Floor (image.X * (double) (scaled_width - 1) / (((int)pixbuf_orientation <= 4 ? Pixbuf.Width : Pixbuf.Height) - 1) + 0.5) + x_offset, (int) Math.Floor (image.Y * (double) (scaled_height - 1) / (((int)pixbuf_orientation <= 4 ? Pixbuf.Height : Pixbuf.Width) - 1) + 0.5) + y_offset); } protected Rectangle ImageCoordsToWindow (Rectangle image) { if (this.Pixbuf == null) return Gdk.Rectangle.Zero; image = PixbufUtils.TransformOrientation (Pixbuf.Width, Pixbuf.Height, image, pixbuf_orientation); int x_offset = scaled_width < Allocation.Width ? (int)(Allocation.Width - scaled_width) / 2 : -XOffset; int y_offset = scaled_height < Allocation.Height ? (int)(Allocation.Height - scaled_height) / 2 : -YOffset; Gdk.Rectangle win = Gdk.Rectangle.Zero; win.X = (int) Math.Floor (image.X * (double) (scaled_width - 1) / (((int)pixbuf_orientation <= 4 ? Pixbuf.Width : Pixbuf.Height) - 1) + 0.5) + x_offset; win.Y = (int) Math.Floor (image.Y * (double) (scaled_height - 1) / (((int)pixbuf_orientation <= 4 ? Pixbuf.Height : Pixbuf.Width) - 1) + 0.5) + y_offset; win.Width = (int) Math.Floor ((image.X + image.Width) * (double) (scaled_width - 1) / (((int)pixbuf_orientation <= 4 ? Pixbuf.Width : Pixbuf.Height) - 1) + 0.5) - win.X + x_offset; win.Height = (int) Math.Floor ((image.Y + image.Height) * (double) (scaled_height - 1) / (((int)pixbuf_orientation <= 4 ? Pixbuf.Height : Pixbuf.Width) - 1) + 0.5) - win.Y + y_offset; return win; } #endregion #region GtkWidgetry protected override void OnRealized () { SetFlag (Gtk.WidgetFlags.Realized); GdkWindow = new Gdk.Window (ParentWindow, new Gdk.WindowAttr { WindowType = Gdk.WindowType.Child, X = Allocation.X, Y = Allocation.Y, Width = Allocation.Width, Height = Allocation.Height, Wclass = Gdk.WindowClass.InputOutput, Visual = ParentWindow.Visual, Colormap = ParentWindow.Colormap, Mask = this.Events | EventMask.ExposureMask | EventMask.ButtonPressMask | EventMask.ButtonReleaseMask | EventMask.PointerMotionMask | EventMask.PointerMotionHintMask | EventMask.ScrollMask | EventMask.KeyPressMask }, Gdk.WindowAttributesType.X | Gdk.WindowAttributesType.Y | Gdk.WindowAttributesType.Visual | Gdk.WindowAttributesType.Colormap); GdkWindow.SetBackPixmap (null, false); GdkWindow.UserData = Handle; Style.Attach (GdkWindow); Style.SetBackground (GdkWindow, Gtk.StateType.Normal); OnRealizedChildren (); } protected override void OnMapped () { SetFlag (Gtk.WidgetFlags.Mapped); OnMappedChildren (); GdkWindow.Show (); } protected override void OnSizeRequested (ref Gtk.Requisition requisition) { requisition.Width = requisition.Height = 0; OnSizeRequestedChildren (); } protected override void OnSizeAllocated (Gdk.Rectangle allocation) { min_zoom = ComputeMinZoom (upscale); if (Fit || zoom < MIN_ZOOM) zoom = MIN_ZOOM; // Since this affects the zoom_scale we should alert it EventHandler eh = ZoomChanged; if (eh != null) eh (this, System.EventArgs.Empty); ComputeScaledSize (); OnSizeAllocatedChildren (); if (IsRealized) { GdkWindow.MoveResize (allocation.X, allocation.Y, allocation.Width, allocation.Height); } if (XOffset > Hadjustment.Upper - Hadjustment.PageSize) ScrollTo ((int)(Hadjustment.Upper - Hadjustment.PageSize), YOffset, false); if (YOffset > Vadjustment.Upper - Vadjustment.PageSize) ScrollTo (XOffset, (int)(Vadjustment.Upper - Vadjustment.PageSize), false); base.OnSizeAllocated (allocation); if (Fit) ZoomFit (upscale); } protected override bool OnExposeEvent (Gdk.EventExpose evnt) { if (evnt.Window != GdkWindow) return false; foreach (Rectangle area in evnt.Region.GetRectangles ()) { var p_area = new Rectangle (Math.Max (0, area.X), Math.Max (0, area.Y), Math.Min (Allocation.Width, area.Width), Math.Min (Allocation.Height, area.Height)); if (p_area == Rectangle.Zero) continue; //draw synchronously if InterpType.Nearest or zoom 1:1 if (Interpolation == InterpType.Nearest || zoom == 1.0) { PaintRectangle (p_area, InterpType.Nearest); continue; } //Do this on idle ??? PaintRectangle (p_area, Interpolation); } if (can_select) OnSelectionExposeEvent (evnt); return true; } protected override void OnSetScrollAdjustments (Gtk.Adjustment hadjustment, Gtk.Adjustment vadjustment) { if (hadjustment == null) hadjustment = new Gtk.Adjustment (0, 0, 0, 0, 0, 0); if (vadjustment == null) vadjustment = new Gtk.Adjustment (0, 0, 0, 0, 0, 0); bool need_change = false; if (Hadjustment != hadjustment) { Hadjustment = hadjustment; Hadjustment.Upper = scaled_width; Hadjustment.ValueChanged += HandleAdjustmentsValueChanged; need_change = true; } if (Vadjustment != vadjustment) { Vadjustment = vadjustment; Vadjustment.Upper = scaled_height; Vadjustment.ValueChanged += HandleAdjustmentsValueChanged; need_change = true; } if (need_change) HandleAdjustmentsValueChanged (this, EventArgs.Empty); } protected override bool OnButtonPressEvent (EventButton evnt) { bool handled = false; if (!HasFocus) GrabFocus (); if (PointerMode == PointerMode.None) return false; handled = handled || OnPanButtonPressEvent (evnt); if (can_select) handled = handled || OnSelectionButtonPressEvent (evnt); return handled || base.OnButtonPressEvent (evnt); } protected override bool OnButtonReleaseEvent (EventButton evnt) { bool handled = false; handled = handled || OnPanButtonReleaseEvent (evnt); if (can_select) handled = handled || OnSelectionButtonReleaseEvent (evnt); return handled || base.OnButtonReleaseEvent (evnt); } protected override bool OnMotionNotifyEvent (EventMotion evnt) { bool handled = false; handled = handled || OnPanMotionNotifyEvent (evnt); if (can_select) handled = handled || OnSelectionMotionNotifyEvent (evnt); return handled || base.OnMotionNotifyEvent (evnt); } protected override bool OnScrollEvent (EventScroll evnt) { if ((evnt.State & ModifierType.ShiftMask) == 0) {//no shift, let's zoom ZoomAboutPoint ((evnt.Direction == ScrollDirection.Up || evnt.Direction == ScrollDirection.Right) ? ZOOM_FACTOR : 1.0 / ZOOM_FACTOR, (int)evnt.X, (int)evnt.Y); return true; } int x_incr = (int)Hadjustment.PageIncrement / 4; int y_incr = (int)Vadjustment.PageIncrement / 4; if ((evnt.State & ModifierType.ControlMask) == 0) {//no control scroll ScrollBy ((evnt.Direction == ScrollDirection.Left) ? -x_incr : (evnt.Direction == ScrollDirection.Right) ? x_incr : 0, (evnt.Direction == ScrollDirection.Up) ? -y_incr : (evnt.Direction == ScrollDirection.Down) ? y_incr : 0); return true; } else { //invert x and y for scrolling ScrollBy ((evnt.Direction == ScrollDirection.Up) ? -y_incr : (evnt.Direction == ScrollDirection.Down) ? y_incr : 0, (evnt.Direction == ScrollDirection.Left) ? -x_incr : (evnt.Direction == ScrollDirection.Right) ? x_incr : 0); return true; } } protected override bool OnKeyPressEvent (EventKey evnt) { if ((evnt.State & (ModifierType.Mod1Mask | ModifierType.ControlMask)) != 0) return base.OnKeyPressEvent (evnt); bool handled = true; int x, y; Gdk.ModifierType type; switch(evnt.Key) { case Gdk.Key.Up: case Gdk.Key.KP_Up: case Gdk.Key.k: case Gdk.Key.K: ScrollBy (0, -Vadjustment.StepIncrement); break; case Gdk.Key.Down: case Gdk.Key.KP_Down: case Gdk.Key.j: case Gdk.Key.J: ScrollBy (0, Vadjustment.StepIncrement); break; case Gdk.Key.Left: case Gdk.Key.KP_Left: case Gdk.Key.h: case Gdk.Key.H: ScrollBy (-Hadjustment.StepIncrement, 0); break; case Gdk.Key.Right: case Gdk.Key.KP_Right: case Gdk.Key.l: case Gdk.Key.L: ScrollBy (Hadjustment.StepIncrement, 0); break; case Gdk.Key.equal: case Gdk.Key.plus: case Gdk.Key.KP_Add: ZoomIn (); break; case Gdk.Key.minus: case Gdk.Key.KP_Subtract: ZoomOut (); break; case Gdk.Key.Key_0: case Gdk.Key.KP_0: ZoomFit (); break; case Gdk.Key.KP_1: case Gdk.Key.Key_1: GdkWindow.GetPointer (out x, out y, out type); DoZoom (1.0, x, y); break; case Gdk.Key.Key_2: case Gdk.Key.KP_2: GdkWindow.GetPointer (out x, out y, out type); DoZoom (2.0, x, y); break; default: handled = false; break; } return handled || base.OnKeyPressEvent (evnt); } #endregion #region private painting, zooming and misc int XOffset { get; set;} int YOffset { get; set;} /// /// Zoom to the given factor. /// /// /// A zoom factor, expressed as a double. /// /// /// The point of the viewport around which to zoom. /// /// /// The point of the viewport around which to zoom. /// void DoZoom (double zoom, int x, int y) { Fit = zoom == MIN_ZOOM; if (zoom == this.zoom || System.Math.Abs (this.zoom - zoom) < System.Double.Epsilon) { // Don't recalculate if the zoom factor stays the same. return; } // Clamp the zoom factor within the [ MIN_ZOOM , MAX_ZOOM ] interval. zoom = Math.Max (Math.Min (zoom, MAX_ZOOM), MIN_ZOOM); this.zoom = zoom; int x_offset = scaled_width < Allocation.Width ? (int)(Allocation.Width - scaled_width) / 2 : -XOffset; int y_offset = scaled_height < Allocation.Height ? (int)(Allocation.Height - scaled_height) / 2 : -YOffset; double x_anchor = (double)(x - x_offset) / (double)scaled_width; double y_anchor = (double)(y - y_offset) / (double)scaled_height; ComputeScaledSize (); AdjustmentsChanged -= ScrollToAdjustments; if (scaled_width < Allocation.Width) Hadjustment.Value = XOffset = 0; else Hadjustment.Value = XOffset = Clamp ((int)(x_anchor * scaled_width - x), 0, (int)(Hadjustment.Upper - Hadjustment.PageSize)); if (scaled_height < Allocation.Height) Vadjustment.Value = YOffset = 0; else Vadjustment.Value = YOffset = Clamp ((int)(y_anchor * scaled_height - y), 0, (int)(Vadjustment.Upper - Vadjustment.PageSize)); AdjustmentsChanged += ScrollToAdjustments; EventHandler eh = ZoomChanged; if (eh != null) eh (this, EventArgs.Empty); QueueDraw (); } void PaintBackground (Rectangle backgound, Rectangle area) { GdkWindow.DrawRectangle (Style.BackgroundGCs [(int)StateType.Normal], true, area); } void PaintRectangle (Rectangle area, InterpType interpolation) { int x_offset = scaled_width < Allocation.Width ? (int)(Allocation.Width - scaled_width) / 2 : -XOffset; int y_offset = scaled_height < Allocation.Height ? (int)(Allocation.Height - scaled_height) / 2 : -YOffset; //Draw background if (y_offset > 0) //Top PaintBackground (new Rectangle (0, 0, Allocation.Width, y_offset), area); if (x_offset > 0) //Left PaintBackground (new Rectangle (0, y_offset, x_offset, (int)scaled_height), area); if (x_offset >= 0) //Right PaintBackground (new Rectangle (x_offset + (int)scaled_width, y_offset, Allocation.Width - x_offset - (int)scaled_width, (int)scaled_height), area); if (y_offset >= 0) //Bottom PaintBackground (new Rectangle (0, y_offset + (int)scaled_height, Allocation.Width, Allocation.Height - y_offset - (int)scaled_height), area); if (Pixbuf == null) return; area.Intersect (new Rectangle (x_offset, y_offset, (int)scaled_width, (int)scaled_height)); if (area.Width <= 0 || area.Height <= 0) return; //Short circuit for 1:1 zoom if (zoom == 1.0 && !Pixbuf.HasAlpha && Pixbuf.BitsPerSample == 8 && pixbuf_orientation == ImageOrientation.TopLeft) { GdkWindow.DrawPixbuf (Style.BlackGC, Pixbuf, area.X - x_offset, area.Y - y_offset, area.X, area.Y, area.Width, area.Height, RgbDither.Max, area.X - x_offset, area.Y - y_offset); return; } Rectangle pixbuf_area = PixbufUtils.TransformOrientation ((int)scaled_width, (int)scaled_height, new Rectangle ((area.X - x_offset), (area.Y - y_offset), area.Width, area.Height), PixbufUtils.ReverseTransformation (pixbuf_orientation)); using (Pixbuf temp_pixbuf = new Pixbuf (Colorspace.Rgb, false, 8, pixbuf_area.Width, pixbuf_area.Height)) { if (Pixbuf.HasAlpha) temp_pixbuf.Fill (0x00000000); Pixbuf.CompositeColor (temp_pixbuf, 0, 0, pixbuf_area.Width, pixbuf_area.Height, -pixbuf_area.X, -pixbuf_area.Y, zoom, zoom, zoom == 1.0 ? InterpType.Nearest : interpolation, 255, pixbuf_area.X, pixbuf_area.Y, CheckPattern.CheckSize, CheckPattern.Color1, CheckPattern.Color2); ApplyColorTransform (temp_pixbuf); using (var dest_pixbuf = PixbufUtils.TransformOrientation (temp_pixbuf, pixbuf_orientation)) { GdkWindow.DrawPixbuf (Style.BlackGC, dest_pixbuf, 0, 0, area.X, area.Y, area.Width, area.Height, RgbDither.Max, area.X - x_offset, area.Y - y_offset); } } } uint scaled_width, scaled_height; void ComputeScaledSize () { if (Pixbuf == null) scaled_width = scaled_height = 0; else { double width; double height; if ((int)pixbuf_orientation <= 4 ) { //TopLeft, TopRight, BottomRight, BottomLeft width = Pixbuf.Width; height = Pixbuf.Height; } else { //LeftTop, RightTop, RightBottom, LeftBottom width = Pixbuf.Height; height = Pixbuf.Width; } scaled_width = (uint)Math.Floor (width * Zoom + .5); scaled_height = (uint)Math.Floor (height * Zoom + .5); } Hadjustment.PageSize = Math.Min (scaled_width, Allocation.Width); Hadjustment.PageIncrement = scaled_width * .9; Hadjustment.StepIncrement = 32; Hadjustment.Upper = scaled_width; Hadjustment.Lower = 0; Vadjustment.PageSize = Math.Min (scaled_height, Allocation.Height); Vadjustment.PageIncrement = scaled_height * .9; Vadjustment.StepIncrement = 32; Vadjustment.Upper = scaled_height; Vadjustment.Lower = 0; } event EventHandler AdjustmentsChanged; void HandleAdjustmentsValueChanged (object sender, EventArgs e) { EventHandler eh = AdjustmentsChanged; if (eh != null) eh (this, EventArgs.Empty); } void ScrollToAdjustments (object sender, EventArgs e) { ScrollTo ((int)Hadjustment.Value, (int)Vadjustment.Value, false); } void ScrollTo (int x, int y, bool change_adjustments) { x = Clamp (x, 0, (int)(Hadjustment.Upper - Hadjustment.PageSize)); y = Clamp (y, 0, (int)(Vadjustment.Upper - Vadjustment.PageSize)); int xof = x - XOffset; int yof = y - YOffset; XOffset = x; YOffset = y; if (IsRealized) { GdkWindow.Scroll (-xof, -yof); GdkWindow.ProcessUpdates (true); } if (change_adjustments) { AdjustmentsChanged -= ScrollToAdjustments; Hadjustment.Value = XOffset; Vadjustment.Value = YOffset; AdjustmentsChanged += ScrollToAdjustments; } } void ScrollBy (double x, double y) { ScrollTo ((int)(XOffset + x), (int)(YOffset + y), true); } static int Clamp (int value, int min, int max) { return Math.Min (Math.Max (value, min), max); } double ComputeMinZoom (bool upscale) { if (Pixbuf == null) return 0.1; double width; double height; if ((int)pixbuf_orientation <= 4 ) { //TopLeft, TopRight, BottomRight, BottomLeft width = Pixbuf.Width; height = Pixbuf.Height; } else { //LeftTop, RightTop, RightBottom, LeftBottom width = Pixbuf.Height; height = Pixbuf.Width; } if (upscale) return Math.Min ((double)Allocation.Width / width, (double)Allocation.Height / height); return Math.Min (1.0, Math.Min ((double)Allocation.Width / width, (double)Allocation.Height / height)); } #endregion #region selection bool OnSelectionExposeEvent (EventExpose evnt) { if (selection == Rectangle.Zero) return false; Rectangle win_selection = ImageCoordsToWindow (selection); using (var evnt_region = evnt.Region.Copy ()) { using (Region r = new Region ()) { r.UnionWithRect (win_selection); evnt_region.Subtract (r); } using (Cairo.Context ctx = CairoHelper.Create (GdkWindow)) { ctx.SetSourceRGBA (.5, .5, .5, .7); CairoHelper.Region (ctx, evnt_region); ctx.Fill (); } } return true; } enum DragMode { None, Move, Extend, } const int SELECTION_SNAP_DISTANCE = 8; DragMode GetDragMode (int x, int y) { Rectangle win_selection = ImageCoordsToWindow (selection); if (Rectangle.Inflate (win_selection, -SELECTION_SNAP_DISTANCE, -SELECTION_SNAP_DISTANCE).Contains (x, y)) return DragMode.Move; if (Rectangle.Inflate (win_selection, SELECTION_SNAP_DISTANCE, SELECTION_SNAP_DISTANCE).Contains (x, y)) return DragMode.Extend; return DragMode.None; } bool is_dragging_selection = false; bool fixed_height = false; bool fixed_width = false; bool is_moving_selection = false; Point selection_anchor = Point.Zero; bool OnSelectionButtonPressEvent (EventButton evnt) { if (evnt.Button != 1) return false; if (evnt.Type == EventType.TwoButtonPress) { is_dragging_selection = false; is_moving_selection = false; return false; } Point img = WindowCoordsToImage (new Point ((int)evnt.X, (int)evnt.Y)); switch (GetDragMode ((int)evnt.X, (int)evnt.Y)) { case DragMode.None: is_dragging_selection = true; PointerMode = PointerMode.Select; Selection = Rectangle.Zero; selection_anchor = img; break; case DragMode.Extend: Rectangle win_sel = ImageCoordsToWindow (Selection); is_dragging_selection = true; if (Math.Abs (win_sel.X - evnt.X) < SELECTION_SNAP_DISTANCE && Math.Abs (win_sel.Y - evnt.Y) < SELECTION_SNAP_DISTANCE) { //TopLeft selection_anchor = new Point (Selection.X + Selection.Width, Selection.Y + Selection.Height); } else if (Math.Abs (win_sel.X + win_sel.Width - evnt.X) < SELECTION_SNAP_DISTANCE && Math.Abs (win_sel.Y - evnt.Y) < SELECTION_SNAP_DISTANCE) { //TopRight selection_anchor = new Point (Selection.X, Selection.Y + Selection.Height); } else if (Math.Abs (win_sel.X - evnt.X) < SELECTION_SNAP_DISTANCE && Math.Abs (win_sel.Y + win_sel.Height - evnt.Y) < SELECTION_SNAP_DISTANCE) { //BottomLeft selection_anchor = new Point (Selection.X + Selection.Width, Selection.Y); } else if (Math.Abs (win_sel.X + win_sel.Width - evnt.X) < SELECTION_SNAP_DISTANCE && Math.Abs (win_sel.Y + win_sel.Height - evnt.Y) < SELECTION_SNAP_DISTANCE) { //BottomRight selection_anchor = new Point (Selection.X, Selection.Y); } else if (Math.Abs (win_sel.X - evnt.X) < SELECTION_SNAP_DISTANCE) { //Left selection_anchor = new Point (Selection.X + Selection.Width, Selection.Y); fixed_height = true; } else if (Math.Abs (win_sel.X + win_sel.Width - evnt.X) < SELECTION_SNAP_DISTANCE) { //Right selection_anchor = new Point (Selection.X, Selection.Y); fixed_height = true; } else if (Math.Abs (win_sel.Y - evnt.Y) < SELECTION_SNAP_DISTANCE) { //Top selection_anchor = new Point (Selection.X, Selection.Y + Selection.Height); fixed_width = true; } else if (Math.Abs (win_sel.Y + win_sel.Height - evnt.Y) < SELECTION_SNAP_DISTANCE) { //Bottom selection_anchor = new Point (Selection.X, Selection.Y); fixed_width = true; } else { fixed_width = fixed_height = false; is_dragging_selection = false; } break; case DragMode.Move: is_moving_selection = true; selection_anchor = img; SelectionSetPointer ((int)evnt.X, (int)evnt.Y); break; } return true; } bool OnSelectionButtonReleaseEvent (EventButton evnt) { if (evnt.Button != 1) return false; is_dragging_selection = false; is_moving_selection = false; fixed_width = fixed_height = false; SelectionSetPointer ((int)evnt.X, (int)evnt.Y); return true; } void SelectionSetPointer (int x, int y) { if (is_moving_selection) GdkWindow.Cursor = new Cursor (CursorType.Crosshair); else { switch (GetDragMode (x, y)) { case DragMode.Move: GdkWindow.Cursor = new Cursor (CursorType.Hand1); break; default: GdkWindow.Cursor = null; break; case DragMode.Extend: Rectangle win_sel = ImageCoordsToWindow (Selection); if (Math.Abs (win_sel.X - x) < SELECTION_SNAP_DISTANCE && Math.Abs (win_sel.Y - y) < SELECTION_SNAP_DISTANCE) { //TopLeft GdkWindow.Cursor = new Cursor (CursorType.TopLeftCorner); } else if (Math.Abs (win_sel.X + win_sel.Width - x) < SELECTION_SNAP_DISTANCE && Math.Abs (win_sel.Y - y) < SELECTION_SNAP_DISTANCE) { //TopRight GdkWindow.Cursor = new Cursor (CursorType.TopRightCorner); } else if (Math.Abs (win_sel.X - x) < SELECTION_SNAP_DISTANCE && Math.Abs (win_sel.Y + win_sel.Height - y) < SELECTION_SNAP_DISTANCE) { //BottomLeft GdkWindow.Cursor = new Cursor (CursorType.BottomLeftCorner); } else if (Math.Abs (win_sel.X + win_sel.Width - x) < SELECTION_SNAP_DISTANCE && Math.Abs (win_sel.Y + win_sel.Height - y) < SELECTION_SNAP_DISTANCE) { //BottomRight GdkWindow.Cursor = new Cursor (CursorType.BottomRightCorner); } else if (Math.Abs (win_sel.X - x) < SELECTION_SNAP_DISTANCE) { //Left GdkWindow.Cursor = new Cursor (CursorType.LeftSide); } else if (Math.Abs (win_sel.X + win_sel.Width - x) < SELECTION_SNAP_DISTANCE) { //Right GdkWindow.Cursor = new Cursor (CursorType.RightSide); } else if (Math.Abs (win_sel.Y - y) < SELECTION_SNAP_DISTANCE) { //Top GdkWindow.Cursor = new Cursor (CursorType.TopSide); } else if (Math.Abs (win_sel.Y + win_sel.Height - y) < SELECTION_SNAP_DISTANCE) { //Bottom GdkWindow.Cursor = new Cursor (CursorType.BottomSide); } break; } } } const int SELECTION_THRESHOLD = 5; bool OnSelectionMotionNotifyEvent (EventMotion evnt) { int x, y; ModifierType mod; if (evnt.IsHint) GdkWindow.GetPointer (out x, out y, out mod); else { x = (int)evnt.X; y = (int)evnt.Y; } Point img = WindowCoordsToImage (new Point (x, y)); if (is_dragging_selection) { Point win_anchor = ImageCoordsToWindow (selection_anchor); if (Selection == Rectangle.Zero && Math.Abs (evnt.X - win_anchor.X) < SELECTION_THRESHOLD && Math.Abs (evnt.Y - win_anchor.Y) < SELECTION_THRESHOLD) { SelectionSetPointer (x, y); return true; } if (selection_xy_ratio == 0) Selection = new Rectangle (fixed_width ? Selection.X : Math.Min (selection_anchor.X, img.X), fixed_height ? Selection.Y : Math.Min (selection_anchor.Y, img.Y), fixed_width ? Selection.Width : Math.Abs (selection_anchor.X - img.X), fixed_height ? Selection.Height : Math.Abs (selection_anchor.Y - img.Y)); else Selection = ConstrainSelection (new Rectangle (Math.Min (selection_anchor.X, img.X), Math.Min (selection_anchor.Y, img.Y), Math.Abs (selection_anchor.X - img.X), Math.Abs (selection_anchor.Y - img.Y)), fixed_width, fixed_height); SelectionSetPointer (x, y); return true; } if (is_moving_selection) { Selection = new Rectangle (Clamp (Selection.X + img.X - selection_anchor.X, 0, Pixbuf.Width - Selection.Width), Clamp (Selection.Y + img.Y - selection_anchor.Y, 0, Pixbuf.Height - Selection.Height), Selection.Width, Selection.Height); selection_anchor = img; SelectionSetPointer (x, y); return true; } SelectionSetPointer (x, y); return true; } Rectangle ConstrainSelection (Rectangle sel, bool fixed_width, bool fixed_height) { double constrain = selection_xy_ratio; if ((double)sel.Width > (double)sel.Height && selection_xy_ratio < 1 || (double)sel.Width < (double)sel.Height && selection_xy_ratio > 1) constrain = 1.0 / constrain; double ratio = (double)sel.Width / (double)sel.Height; int height = sel.Height; int width = sel.Width; if (ratio > constrain) { height = (int)((double)sel.Width / constrain); if (height > Pixbuf.Height) { height = sel.Height; width = (int)(height * constrain); } } else { width = (int)(height * constrain); if (width > Pixbuf.Width) { width = sel.Width; height = (int)((double)width / constrain); } } return new Rectangle (sel.X + width < Pixbuf.Width ? sel.X : Pixbuf.Width - width, sel.Y + height < Pixbuf.Height ? sel.Y : Pixbuf.Height - height, width, height); } #endregion } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/CheckPattern.cs0000644000175000017500000000542611503404761024050 0ustar00rubenruben00000000000000// // FSpot.Widgets.CheckPattern.cs // // Author(s): // Stephane Delcroix // // This is free software. See COPYING for details. // using System; using Gdk; namespace FSpot.Widgets { public struct CheckPattern { uint color1, color2; int check_size; public CheckPattern (uint color1, uint color2, int check_size) { this.color1 = color1; this.color2 = color2; this.check_size = check_size; } public CheckPattern (string color1, string color2, int check_size) : this (s_to_h (color1), s_to_h (color2), check_size) { } public CheckPattern (uint transparent_color) { color1 = color2 = transparent_color; check_size = 32; } //format "#000000" public CheckPattern (string transparent_color) : this (s_to_h (transparent_color)) { } public CheckPattern (Color transparent_color) : this (c_to_h (transparent_color)) { } public uint Color1 { get { return color1; } } public uint Color2 { get { return color2; } } public int CheckSize { get { return check_size; } } public static CheckPattern Dark = new CheckPattern (0x00000000, 0x00555555, 8); public static CheckPattern Midtone = new CheckPattern (0x00555555, 0x00aaaaaa, 8); public static CheckPattern Light = new CheckPattern (0x00aaaaaa, 0x00ffffff, 8); public static CheckPattern Black = new CheckPattern (0x00000000, 0x00000000, 8); public static CheckPattern Gray = new CheckPattern (0x00808080, 0x00808080, 8); public static CheckPattern White = new CheckPattern (0x00ffffff, 0x00ffffff, 8); public static bool operator== (CheckPattern left, CheckPattern right) { return (left.color1 == right.color1) && (left.color2 == right.color2) && (left.color1 == left.color2 || left.check_size == right.check_size); } public static bool operator!= (CheckPattern left, CheckPattern right) { return (left.color1 != right.color1) || (left.color2 != right.color2) || (left.color1 != left.color2 && left.check_size != right.check_size); } public override int GetHashCode () { return (int)color1 ^ (int)color2 ^ check_size; } public override bool Equals (object other) { if (!(other is CheckPattern)) return false; return this == (CheckPattern)other; } static uint s_to_h (string color) { return (uint)(Byte.Parse (color.Substring (1,2), System.Globalization.NumberStyles.AllowHexSpecifier) << 16) + (uint)(Byte.Parse (color.Substring (3,2), System.Globalization.NumberStyles.AllowHexSpecifier) << 8) + (uint)(Byte.Parse (color.Substring (5,2), System.Globalization.NumberStyles.AllowHexSpecifier)); } static uint c_to_h (Color color) { return (((uint)color.Red) << 16) + (((uint)color.Green) << 8) + (((uint)color.Blue)); } } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/DateEdit.cs0000644000175000017500000002061211503404761023152 0ustar00rubenruben00000000000000// // FSpot.Widgets.DateEdit.cs: A Date/Time widget with zone support. // // Author(s) // Stephane Delcroix // // the widgetry to show the calendar popup is ported from the libgnomeui GnomeDateEdit // widget from Miguel de Icaza, (c) the Free Software Foundation // // Copyright (c) 2009 Novell, Inc. // // This is free software. See COPYING for details. // using System; using Mono.Unix; using Gtk; namespace FSpot.Widgets { public class DateEdit : HBox { DateEditFlags dateEditFlags; DateTimeOffset dateTimeOffset; #region public API public DateEdit () : this (DateTimeOffset.Now) { } public DateEdit (DateTimeOffset dateTimeOffset) : this (dateTimeOffset, DateEditFlags.None) { } public DateEdit (DateTimeOffset dateTimeOffset, DateEditFlags dateEditFlags) : base () { this.dateEditFlags = dateEditFlags; this.dateTimeOffset = dateTimeOffset; CreateWidget (); } public DateTimeOffset DateTimeOffset { get { return dateTimeOffset; } set { DateTimeOffset old_dto = dateTimeOffset; dateTimeOffset = value; if (dateTimeOffset.Date != old_dto.Date) OnDateChanged (); if (dateTimeOffset.Offset != old_dto.Offset) OnOffsetChanged (); if (dateTimeOffset - dateTimeOffset.Date != old_dto - old_dto.Date) OnTimeChanged (); UpdateWidget (); } } public DateEditFlags DateEditFlags { get { return dateEditFlags; } set { dateEditFlags = value; UpdateWidget (); } } public event EventHandler DateChanged; public event EventHandler TimeChanged; public event EventHandler OffsetChanged; protected void OnDateChanged () { EventHandler h = DateChanged; if (h != null) h (this, EventArgs.Empty); } protected void OnTimeChanged () { EventHandler h = TimeChanged; if (h != null) h (this, EventArgs.Empty); } protected void OnOffsetChanged () { EventHandler h = OffsetChanged; if (h != null) h (this, EventArgs.Empty); } bool ShowSeconds { get { return (dateEditFlags & DateEditFlags.ShowSeconds) == DateEditFlags.ShowSeconds; } } #endregion public API #region Gtk Widgetry Entry date_entry; Button date_button; Entry time_entry; Entry offset_entry; Calendar calendar; Label calendar_label; Window calendar_popup; Gdk.Color red = new Gdk.Color (255, 0, 0); void CreateWidget () { Homogeneous = false; Spacing = 1; Add (date_entry = new Entry () {WidthChars = 10, IsEditable = true}); date_entry.Changed += HandleDateEntryChanged; date_entry.Show (); var bbox = new HBox (); Widget w; bbox.Add (w = calendar_label = new Label (Catalog.GetString ("Calendar"))); w.Show (); bbox.Add (w = new Arrow (ArrowType.Down, ShadowType.Out)); w.Show (); bbox.Show (); Add (date_button = new Button (bbox)); date_button.Clicked += HandleCalendarButtonClicked; date_button.Show (); Add (time_entry = new Entry () {WidthChars = 12, IsEditable = true}); time_entry.Changed += HandleTimeEntryChanged; time_entry.Show (); Add (offset_entry = new Entry () {WidthChars = 6, IsEditable = true}); offset_entry.Changed += HandleOffsetEntryChanged; offset_entry.Show (); calendar = new Calendar (); calendar.DaySelected += HandleCalendarDaySelected; calendar.DaySelectedDoubleClick += HandleCalendarDaySelectedDoubleClick; var frame = new Frame (); frame.Add (calendar); calendar.Show (); calendar_popup = new Window (WindowType.Popup) {DestroyWithParent = true, Resizable = false}; calendar_popup.Add (frame); calendar_popup.DeleteEvent += HandlePopupDeleted; calendar_popup.KeyPressEvent += HandlePopupKeyPressed; calendar_popup.ButtonPressEvent += HandlePopupButtonPressed; frame.Show (); UpdateWidget (); } void UpdateWidget () { date_entry.Text = dateTimeOffset.ToString ("d"); date_entry.ModifyBase (StateType.Normal); if (ShowSeconds) time_entry.Text = dateTimeOffset.ToString ("T"); else time_entry.Text = dateTimeOffset.ToString ("t"); time_entry.ModifyBase (StateType.Normal); time_entry.Visible = (dateEditFlags & DateEditFlags.ShowTime) == DateEditFlags.ShowTime; offset_entry.Text = dateTimeOffset.ToString ("zzz"); offset_entry.ModifyBase (StateType.Normal); offset_entry.Visible = (dateEditFlags & DateEditFlags.ShowOffset) == DateEditFlags.ShowOffset; calendar_label.Visible = time_entry.Visible || offset_entry.Visible; } bool GrabPointerAndKeyboard (Gdk.Window window, uint activate_time) { if (Gdk.Pointer.Grab (window, true, Gdk.EventMask.ButtonPressMask | Gdk.EventMask.ButtonReleaseMask | Gdk.EventMask.PointerMotionMask, null, null, activate_time) == Gdk.GrabStatus.Success) { if (Gdk.Keyboard.Grab (window, true, activate_time) == Gdk.GrabStatus.Success) return true; else { Gdk.Pointer.Ungrab (activate_time); return false; } } return false; } void PositionPopup () { var requisition = calendar_popup.SizeRequest (); int x, y; date_button.GdkWindow.GetOrigin (out x, out y); x += date_button.Allocation.X; y += date_button.Allocation.Y; x += date_button.Allocation.Width - requisition.Width; y += date_button.Allocation.Height; if (x < 0) x = 0; if (y < 0) y = 0; calendar_popup.Move (x, y); } void HandleCalendarButtonClicked (object sender, EventArgs e) { //Temporarily grab pointer and keyboard if (!GrabPointerAndKeyboard (GdkWindow, Gtk.Global.CurrentEventTime)) return; //select the day on the calendar PositionPopup (); Grab.Add (calendar_popup); calendar_popup.Show (); calendar.GrabFocus (); //transfer the grabs to the popup GrabPointerAndKeyboard (calendar_popup.GdkWindow, Gtk.Global.CurrentEventTime); } void HandleDateEntryChanged (object sender, EventArgs e) { DateTimeOffset new_date; if (DateTimeOffset.TryParseExact (date_entry.Text, "d", null, System.Globalization.DateTimeStyles.AssumeLocal | System.Globalization.DateTimeStyles.AllowWhiteSpaces, out new_date)) DateTimeOffset = new DateTimeOffset (new_date.Date + DateTimeOffset.TimeOfDay, DateTimeOffset.Offset); else date_entry.ModifyBase (StateType.Normal, red); } void HandleTimeEntryChanged (object sender, EventArgs e) { DateTimeOffset new_date; if (DateTimeOffset.TryParseExact (String.Format ("{0} {1}", DateTimeOffset.ToString ("d"), time_entry.Text), ShowSeconds ? "G" : "g", null, System.Globalization.DateTimeStyles.AssumeLocal | System.Globalization.DateTimeStyles.AllowWhiteSpaces, out new_date)) { DateTimeOffset = DateTimeOffset.AddHours (new_date.Hour - DateTimeOffset.Hour).AddMinutes (new_date.Minute - DateTimeOffset.Minute).AddSeconds (new_date.Second - DateTimeOffset.Second); } else time_entry.ModifyBase (StateType.Normal, red); } void HandleOffsetEntryChanged (object sender, EventArgs e) { TimeSpan new_offset; if (TimeSpan.TryParse (offset_entry.Text.Trim ('+'), out new_offset)) DateTimeOffset = new DateTimeOffset (dateTimeOffset.DateTime, new_offset); else offset_entry.ModifyBase (StateType.Normal, red); } void HidePopup () { calendar_popup.Hide (); Grab.Remove (calendar_popup); } void HandleCalendarDaySelected (object sender, EventArgs e) { DateTimeOffset = new DateTimeOffset (calendar.Date + DateTimeOffset.TimeOfDay, DateTimeOffset.Offset); } void HandleCalendarDaySelectedDoubleClick (object sender, EventArgs e) { HidePopup (); } void HandlePopupButtonPressed (object sender, ButtonPressEventArgs e) { var child = Gtk.Global.GetEventWidget (e.Event); if (child != calendar_popup) { while (child != null) { if (child == calendar_popup) { e.RetVal = false; return; } child = child.Parent; } } HidePopup (); e.RetVal = true; } void HandlePopupDeleted (object sender, DeleteEventArgs e) { HidePopup (); e.RetVal = false; } void HandlePopupKeyPressed (object sender, KeyPressEventArgs e) { if (e.Event.Key != Gdk.Key.Escape) { e.RetVal = false; return; } HidePopup (); e.RetVal = true; } #endregion #region Test App #if DEBUGDATEEDIT static void Main () { Gtk.Application.Init (); Window w = new Window ("test"); DateEdit de; w.Add (de = new DateEdit ()); de.DateEditFlags |= DateEditFlags.ShowOffset | DateEditFlags.ShowTime | DateEditFlags.ShowSeconds; de.Show (); w.Show (); Gtk.Application.Run (); } #endif #endregion } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/CustomPrintWidget.cs0000644000175000017500000001462511503404761025131 0ustar00rubenruben00000000000000/* * FSpot.Widgets.CustomPrintWidget.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using Mono.Unix; using Gtk; using FSpot.Utils; namespace FSpot.Widgets { public class CustomPrintWidget : Table { public delegate void ChangedHandler (Gtk.Widget widget); public enum FitMode { Zoom, Scaled, Fill, } Gtk.Image preview_image; CheckButton fullpage; RadioButton ppp1, ppp2, ppp4, ppp9, ppp20, ppp30; RadioButton zoom, fill, scaled; CheckButton repeat, white_border, crop_marks, print_tags, print_filename, print_date, print_time, print_comments; Entry custom_text; PrintOperation print_operation; public event ChangedHandler Changed; private void TriggerChanged (object sender, EventArgs e) { if (Changed != null) Changed (this); } public bool CropMarks { get { return crop_marks.Active; } } public string PrintLabelFormat { get { string label_format = "{0}"; if (print_tags.Active) label_format += "\t{4}"; if (print_filename.Active) label_format += "\t{1}"; if (print_date.Active) label_format += "\t{2}"; if (print_time.Active) label_format += " {3}"; if (print_comments.Active) label_format += "\t{5}"; return label_format; } } public string CustomText { get { return custom_text.Text; } } public FitMode Fitmode { get { if (zoom.Active) return FitMode.Zoom; else if (fill.Active) return FitMode.Fill; else if (scaled.Active) return FitMode.Scaled; else throw new Exception ("Something is wrong on this GUI"); } } public int PhotosPerPage { get { if (ppp1.Active) return 1; else if (ppp2.Active) return 2; else if (ppp4.Active) return 4; else if (ppp9.Active) return 9; else if (ppp20.Active) return 20; else if (ppp30.Active) return 30; else throw new Exception ("Something is wrong on this GUI"); } } public Gtk.Image PreviewImage { get { return preview_image; } } public bool Repeat { get { return repeat.Active; } } public bool UseFullPage { get { return fullpage.Active; } } public bool WhiteBorders { get { return white_border.Active; } } public CustomPrintWidget (PrintOperation print_operation) : base (2, 4, false) { this.print_operation = print_operation; preview_image = new Gtk.Image (); Attach (preview_image, 0, 2, 0, 1); Frame page_frame = new Frame (Catalog.GetString ("Page Setup")); VBox page_box = new VBox (); Label current_settings = new Label (); if (FSpot.Core.Global.PageSetup != null) current_settings.Text = String.Format (Catalog.GetString ("Paper Size: {0} x {1} mm"), Math.Round (print_operation.DefaultPageSetup.GetPaperWidth (Unit.Mm), 1), Math.Round (print_operation.DefaultPageSetup.GetPaperHeight (Unit.Mm), 1)); else current_settings.Text = String.Format (Catalog.GetString ("Paper Size: {0} x {1} mm"), "...", "..."); page_box.PackStart (current_settings, false, false, 0); Button page_setup_btn = new Button (Catalog.GetString ("Set Page Size and Orientation")); page_setup_btn.Clicked += delegate { this.print_operation.DefaultPageSetup = Print.RunPageSetupDialog (null, print_operation.DefaultPageSetup, this.print_operation.PrintSettings); current_settings.Text = String.Format (Catalog.GetString ("Paper Size: {0} x {1} mm"), Math.Round (print_operation.DefaultPageSetup.GetPaperWidth (Unit.Mm), 1), Math.Round (print_operation.DefaultPageSetup.GetPaperHeight (Unit.Mm), 1)); }; page_box.PackStart (page_setup_btn, false, false, 0); page_frame.Add (page_box); Attach (page_frame, 1, 2, 3, 4); Frame ppp_frame = new Frame (Catalog.GetString ("Photos per page")); Table ppp_tbl = new Table(2, 7, false); ppp_tbl.Attach (ppp1 = new RadioButton ("1"), 0, 1, 1, 2); ppp_tbl.Attach (ppp2 = new RadioButton (ppp1, "2"), 0, 1, 2, 3); ppp_tbl.Attach (ppp4 = new RadioButton (ppp1, "2 x 2"), 0, 1, 3, 4); ppp_tbl.Attach (ppp9 = new RadioButton (ppp1, "3 x 3"), 0, 1, 4, 5); ppp_tbl.Attach (ppp20 = new RadioButton (ppp1, "4 x 5"), 0, 1, 5, 6); ppp_tbl.Attach (ppp30 = new RadioButton (ppp1, "5 x 6"), 0, 1, 6, 7); ppp_tbl.Attach (repeat = new CheckButton (Catalog.GetString ("Repeat")), 1, 2, 2, 3); ppp_tbl.Attach (crop_marks = new CheckButton (Catalog.GetString ("Print cut marks")), 1, 2, 3, 4); // crop_marks.Toggled += TriggerChanged; ppp_frame.Child = ppp_tbl; Attach (ppp_frame, 0, 1, 1, 2); Frame layout_frame = new Frame (Catalog.GetString ("Photos layout")); VBox layout_vbox = new VBox(); layout_vbox.PackStart (fullpage = new CheckButton (Catalog.GetString ("Full Page (no margin)")), false, false, 0); HBox hb = new HBox (); // Note for translators: "Zoom" is a Fit Mode hb.PackStart (zoom = new RadioButton (Catalog.GetString ("Zoom")), false, false, 0); hb.PackStart (fill = new RadioButton (zoom, Catalog.GetString ("Fill")), false, false, 0); hb.PackStart (scaled = new RadioButton (zoom, Catalog.GetString ("Scaled")), false, false, 0); zoom.Toggled += TriggerChanged; fill.Toggled += TriggerChanged; scaled.Toggled += TriggerChanged; layout_vbox.PackStart (hb, false, false, 0); layout_vbox.PackStart (white_border = new CheckButton (Catalog.GetString ("White borders")), false, false, 0); white_border.Toggled += TriggerChanged; layout_frame.Child = layout_vbox; Attach (layout_frame, 1, 2, 1, 2); Frame cmt_frame = new Frame (Catalog.GetString ("Custom Text")); cmt_frame.Child = custom_text = new Entry (); Attach (cmt_frame, 1, 2, 2, 3); Frame detail_frame = new Frame (Catalog.GetString ("Photos infos")); VBox detail_vbox = new VBox(); detail_vbox.PackStart (print_filename = new CheckButton (Catalog.GetString ("Print file name")), false, false, 0); detail_vbox.PackStart (print_date = new CheckButton (Catalog.GetString ("Print photo date")), false, false, 0); detail_vbox.PackStart (print_time = new CheckButton (Catalog.GetString ("Print photo time")), false, false, 0); detail_vbox.PackStart (print_tags = new CheckButton (Catalog.GetString ("Print photo tags")), false, false, 0); detail_vbox.PackStart (print_comments = new CheckButton (Catalog.GetString ("Print photo comment")), false, false, 0); detail_frame.Child = detail_vbox; Attach (detail_frame, 0, 1, 2, 4); TriggerChanged (this, null); } } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/ApplicationActivatedEventArgs.cs0000644000175000017500000000075111503404761027400 0ustar00rubenruben00000000000000// // FSpot.Widgets.ApplicationActivatedEventArgs.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This is free software. See COPYING for details. // using System; using GLib; namespace FSpot.Widgets { public class ApplicationActivatedEventArgs : EventArgs { AppInfo app; public AppInfo AppInfo { get { return app; } } public ApplicationActivatedEventArgs (AppInfo app) : base () { this.app = app; } } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/RatingRenderer.cs0000644000175000017500000001614211503404761024405 0ustar00rubenruben00000000000000/* * RatingRenderer.cs * * Author(s) * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using Gdk; using Cairo; using Hyena.Gui; using FSpot.Utils; namespace FSpot.Widgets { public class RatingRenderer : Hyena.Gui.RatingRenderer { private static int REQUESTED_ICON_SIZE = 16; #region Shared Pixbufs // cache the unscaled pixbufs for all instances private static Pixbuf icon_rated; private static Pixbuf icon_blank; private static Pixbuf icon_hover; #endregion #region Access Rating Pixbufs protected static Pixbuf IconRated { get { if (icon_rated == null) icon_rated = GtkUtil.TryLoadIcon (FSpot.Core.Global.IconTheme, "rating-rated", REQUESTED_ICON_SIZE, (Gtk.IconLookupFlags)0); return icon_rated; } } protected static Pixbuf IconBlank { get { if (icon_blank == null) icon_blank = GtkUtil.TryLoadIcon (FSpot.Core.Global.IconTheme, "rating-blank", REQUESTED_ICON_SIZE, (Gtk.IconLookupFlags)0); return icon_blank; } } protected static Pixbuf IconHover { get { if (icon_hover == null) icon_hover = GtkUtil.TryLoadIcon (FSpot.Core.Global.IconTheme, "rating-rated-gray", REQUESTED_ICON_SIZE, (Gtk.IconLookupFlags)0); return icon_hover; } } #endregion #region Cache and Access Scaled Rating Pixbufs // cache the scaled pixbufs for every instance private int scaled_icon_size; private Pixbuf scaled_icon_rated; private Pixbuf scaled_icon_blank; private Pixbuf scaled_icon_hover; protected Pixbuf ScaledIconRated { get { if (scaled_icon_size == Size && scaled_icon_rated != null) return scaled_icon_rated; if (scaled_icon_size != Size) ResetCachedPixbufs (); scaled_icon_rated = ScaleIcon (IconRated); scaled_icon_size = Size; return scaled_icon_rated; } } protected Pixbuf ScaledIconBlank { get { if (scaled_icon_size == Size && scaled_icon_blank != null) return scaled_icon_blank; if (scaled_icon_size != Size) ResetCachedPixbufs (); scaled_icon_blank = ScaleIcon (IconBlank); scaled_icon_size = Size; return scaled_icon_blank; } } protected Pixbuf ScaledIconHover { get { if (scaled_icon_size == Size && scaled_icon_hover != null) return scaled_icon_hover; if (scaled_icon_size != Size) ResetCachedPixbufs (); scaled_icon_hover = ScaleIcon (IconHover); scaled_icon_size = Size; return scaled_icon_hover; } } private void ResetCachedPixbufs () { if (scaled_icon_rated != null) { scaled_icon_rated.Dispose (); scaled_icon_rated = null; } if (scaled_icon_blank != null) { scaled_icon_blank.Dispose (); scaled_icon_blank = null; } if (scaled_icon_hover != null) { scaled_icon_hover.Dispose (); scaled_icon_hover = null; } } private Pixbuf ScaleIcon (Pixbuf icon) { if (icon.Width > Size) { return icon.ScaleSimple (Size, Size, InterpType.Bilinear); } var scaled_icon = new Pixbuf (Colorspace.Rgb, true, 8, Size, Size); scaled_icon.Fill (0xffffff00); int x_offset = (Size - icon.Width) / 2; int y_offset = (Size - icon.Height) / 2; icon.CopyArea (0, 0, icon.Width, icon.Height, scaled_icon, x_offset, y_offset); return scaled_icon; } #endregion #region Constructors / Destructor public RatingRenderer () { } ~RatingRenderer () { ResetCachedPixbufs (); } #endregion #region Drawing Code public Pixbuf RenderPixbuf () { return RenderPixbuf (false); } public Pixbuf RenderPixbuf (bool showEmptyStars) { return RenderPixbuf (showEmptyStars, false, MinRating - 1, 0.0, 0.0, 1.0); } public Pixbuf RenderPixbuf (bool showEmptyStars, bool isHovering, int hoverValue, double fillOpacity, double hoverFillOpacity, double strokeOpacity) { var pixbuf = new Pixbuf (Colorspace.Rgb, true, 8, MaxRating * Size, Size); pixbuf.Fill (0xffffff00); int x = 0; for (int i = MinRating + 1, s = isHovering || showEmptyStars ? MaxRating : Value; i <= s; i++, x += Size) { Pixbuf icon = null; bool rated = (i <= Value && Value > MinRating); bool hover = isHovering && rated ? (i > hoverValue && hoverValue < Value) : (i <= hoverValue && hoverValue > MinRating); // hover if (hover) { icon = ScaledIconHover; // rated } else if (rated) { icon = ScaledIconRated; // empty 'star' } else { icon = ScaledIconBlank; } icon.CopyArea (0, 0, icon.Width, icon.Height, pixbuf, x, 0); } return pixbuf; } #endregion #region Override Render Code public override void Render (Cairo.Context cr, Gdk.Rectangle area, Cairo.Color color, bool showEmptyStars, bool isHovering, int hoverValue, double fillOpacity, double hoverFillOpacity, double strokeOpacity) { if (Value == MinRating && !isHovering && !showEmptyStars) { return; } double x, y; ComputePosition (area, out x, out y); cr.Translate (0.5, 0.5); using (var pixbuf = RenderPixbuf (showEmptyStars, isHovering, hoverValue, fillOpacity, hoverFillOpacity, strokeOpacity)) { using (var surface = CairoExtensions.CreateSurfaceForPixbuf (cr, pixbuf)) { cr.Rectangle (x, y, pixbuf.Width, pixbuf.Height); cr.SetSource (surface, x, y); cr.Fill (); } } } #endregion } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/CurveType.cs0000644000175000017500000000055211503404761023416 0ustar00rubenruben00000000000000// // FSpot.Widgets.CurveType.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This is open source software. See COPYING for details. // // Ported from Gtk+, where this widget and is no longer really supported. // namespace FSpot.Widgets { public enum CurveType { Linear, Spline, Free, } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/ScrolledView.cs0000644000175000017500000000301011503404761024062 0ustar00rubenruben00000000000000using System; using Gtk; using FSpot.Utils; namespace FSpot.Widgets { public class ScrolledView : Fixed { private EventBox ebox; private ScrolledWindow scroll; private DelayedOperation hide; public ScrolledView (IntPtr raw) : base (raw) {} public ScrolledView () : base () { scroll = new ScrolledWindow (null, null); this.Put (scroll, 0, 0); scroll.Show (); //ebox = new BlendBox (); ebox = new EventBox (); this.Put (ebox, 0, 0); ebox.ShowAll (); hide = new DelayedOperation (2000, new GLib.IdleHandler (HideControls)); this.Destroyed += HandleDestroyed; } public bool HideControls () { return HideControls (false); } public bool HideControls (bool force) { int x, y; Gdk.ModifierType type; if (!force && IsRealized) { ebox.GdkWindow.GetPointer (out x, out y, out type); if (x < ebox.Allocation.Width && y < ebox.Allocation.Height) { hide.Start (); return true; } } hide.Stop (); ebox.Hide (); return false; } public void ShowControls () { hide.Stop (); hide.Start (); ebox.Show (); } private void HandleDestroyed (object sender, System.EventArgs args) { hide.Stop (); } public EventBox ControlBox { get { return ebox; } } public ScrolledWindow ScrolledWindow { get { return scroll; } } protected override void OnSizeAllocated (Gdk.Rectangle allocation) { scroll.SetSizeRequest (allocation.Width, allocation.Height); base.OnSizeAllocated (allocation); } } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/MenuButton.cs0000644000175000017500000000344011503404761023567 0ustar00rubenruben00000000000000/* * MenuButton.cs: a widget to mimic to e-combo-button from evolution * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details * */ using Gtk; namespace FSpot.Widgets { public class MenuButton : Button { Label label; Image image; Arrow arrow; Menu popup_menu; public new string Label { get { return label.Text; } set { label.Text = value; } } public new Image Image { get { return image; } } public ArrowType ArrowType { get { return arrow.ArrowType; } set { arrow.ArrowType = value; } } public Menu Menu { get { return popup_menu; } set { popup_menu = value; } } public MenuButton () : this (null) { } public MenuButton (string label) : this (label, null) { } public MenuButton (string label, Menu menu) : this (label, menu, ArrowType.Down) { } public MenuButton (string label, Menu menu, ArrowType arrow_type) : base () { HBox hbox = new HBox (); this.image = new Image (); hbox.PackStart (this.image, false, false, 1); image.Show (); this.label = new Label (label); this.label.Xalign = 0; hbox.PackStart (this.label, true, true, 1); this.label.Show (); this.arrow = new Arrow (arrow_type, ShadowType.None); hbox.PackStart (arrow, false, false, 1); arrow.Show (); Menu = menu; this.Add (hbox); hbox.Show (); } protected override void OnPressed () { if (popup_menu == null) return; popup_menu.Popup (null, null, Position, 0, Gtk.Global.CurrentEventTime); } void Position (Menu menu, out int x, out int y, out bool push_in) { this.GdkWindow.GetOrigin (out x, out y); x += Allocation.X; y += Allocation.Y + Allocation.Height; push_in = false; menu.WidthRequest = Allocation.Width; } } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/SelectionCollection.cs0000644000175000017500000002026611503404761025435 0ustar00rubenruben00000000000000using System; using System.Linq; using System.Collections; using System.Collections.Generic; using FSpot.Core; namespace FSpot.Widgets { public class SelectionCollection : IBrowsableCollection { IBrowsableCollection parent; Dictionary selected_cells; BitArray bit_array; IPhoto [] items; IPhoto [] old; public SelectionCollection (IBrowsableCollection collection) { this.selected_cells = new Dictionary (); this.parent = collection; this.bit_array = new BitArray (this.parent.Count); this.parent.Changed += HandleParentChanged; this.parent.ItemsChanged += HandleParentItemsChanged; } private void HandleParentChanged (IBrowsableCollection collection) { IPhoto [] local = old; selected_cells.Clear (); bit_array = new BitArray (parent.Count); ClearCached (); if (old != null) { int i = 0; for (i = 0; i < local.Length; i++) { int parent_index = parent.IndexOf (local [i]); if (parent_index >= 0) this.Add (parent_index, false); } } // Call the directly so that we don't reset old immediately this way the old selection // set isn't actually lost until we change it. if (this.Changed != null) Changed (this); if (this.DetailedChanged != null) DetailedChanged (this, null); } public void MarkChanged (int item, IBrowsableItemChanges changes) { throw new NotImplementedException (); } private void HandleParentItemsChanged (IBrowsableCollection collection, BrowsableEventArgs args) { if (this.ItemsChanged == null) return; ArrayList local_ids = new ArrayList (); foreach (int parent_index in args.Items) { // If the item isn't part of the selection ignore it if (!this.Contains (collection [parent_index])) return; int local_index = this.IndexOf (parent_index); if (local_index >= 0) local_ids.Add (local_index); } if (local_ids.Count == 0) return; int [] items = (int [])local_ids.ToArray (typeof (int)); ItemsChanged (this, new BrowsableEventArgs (items, args.Changes)); } public BitArray ToBitArray () { return new BitArray (bit_array); } public int [] Ids { get { // TODO: use IEnumerable<> return (from i in selected_cells.Values orderby i select i).ToArray (); } } public IPhoto this [int index] { get { int [] ids = this.Ids; return parent [ids[index]]; } } public IPhoto [] Items { get { if (items != null) return items; int [] ids = this.Ids; items = new IPhoto [ids.Length]; for (int i = 0; i < items.Length; i++) { items [i] = parent [ids[i]]; } return items; } } public void Clear () { Clear (true); } public void Clear (bool update) { int [] ids = Ids; selected_cells.Clear (); bit_array.SetAll (false); if (update) SignalChange (ids); } public void Add (IPhoto item) { if (this.Contains (item)) return; int index = parent.IndexOf (item); this.Add (index); } public int Count { get { return selected_cells.Count; } } public bool Contains (IPhoto item) { return selected_cells.ContainsKey (item); } public bool Contains (int num) { if (num < 0 || num >= parent.Count) return false; return this.Contains (parent [num]); } public void Add (int num) { this.Add (num, true); } public void Add (int num, bool notify) { if (num == -1) return; if (this.Contains (num)) return; IPhoto item = parent [num]; selected_cells [item] = num; bit_array.Set (num, true); if (notify) SignalChange (new int [] {num}); } public void Add (int start, int end) { if (start == -1 || end == -1) return; int current = Math.Min (start, end); int final = Math.Max (start, end); int count = final - current + 1; int [] ids = new int [count]; for (int i = 0; i < count; i++) { this.Add (current, false); ids [i] = current; current++; } SignalChange (ids); } public void Remove (int cell, bool notify) { IPhoto item = parent [cell]; if (item != null) this.Remove (item, notify); } public void Remove (IPhoto item) { Remove (item, true); } public void Remove (int cell) { Remove (cell, true); } private void Remove (IPhoto item, bool notify) { if (item == null) return; int parent_index = (int) selected_cells [item]; selected_cells.Remove (item); bit_array.Set (parent_index, false); if (notify) SignalChange (new int [] {parent_index}); } // Remove a range, except the start entry public void Remove (int start, int end) { if (start == -1 || end == -1) return; int current = Math.Min (start + 1, end); int final = Math.Max (start - 1, end); int count = final - current + 1; int [] ids = new int [count]; for (int i = 0; i < count; i++) { this.Remove (current, false); ids [i] = current; current++; } SignalChange (ids); } public int IndexOf (int parent_index) { return System.Array.IndexOf (this.Ids, parent_index); } public int IndexOf (IPhoto item) { if (!this.Contains (item)) return -1; int parent_index = (int) selected_cells [item]; return System.Array.IndexOf (Ids, parent_index); } public void ToggleCell (int cell_num, bool notify) { if (Contains (cell_num)) Remove (cell_num, notify); else Add (cell_num, notify); } public void ToggleCell (int cell_num) { ToggleCell (cell_num, true); } public void SelectionInvert () { int [] changed_cell = new int[parent.Count]; for (int i = 0; i < parent.Count; i++) { ToggleCell (i, false); changed_cell[i] = i; } SignalChange (changed_cell); } public event IBrowsableCollectionChangedHandler Changed; public event IBrowsableCollectionItemsChangedHandler ItemsChanged; public delegate void DetailedCollectionChanged (IBrowsableCollection collection, int [] ids); public event DetailedCollectionChanged DetailedChanged; private void ClearCached () { items = null; } public void SignalChange (int [] ids) { ClearCached (); old = this.Items; if (Changed != null) Changed (this); if (DetailedChanged!= null) DetailedChanged (this, ids); } } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/BuilderWindow.cs0000644000175000017500000000135411503404761024247 0ustar00rubenruben00000000000000// // FSpot.Widgets.BuilderWindow.cs // // Author(s): // Stephane Delcroix // // Copyright (c)2009 Novell, Inc. // // This is free software. See COPYING fro details. // using System; using GtkBeans; namespace FSpot.Widgets { public abstract class BuilderWindow : Gtk.Window { protected BuilderWindow (string resourceName, string widgetName) : this (null, resourceName, widgetName) { } protected BuilderWindow (System.Reflection.Assembly assembly, string resourceName, string widgetName) : this (new Builder (assembly, resourceName, null), widgetName) { } protected BuilderWindow (Builder builder, string widgetName) : base (builder.GetRawObject (widgetName)) { builder.Autoconnect (this); } } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/CellGridView.cs0000644000175000017500000004327211503404761024016 0ustar00rubenruben00000000000000/* * CellGridView.cs * * Author(s) * Etore Perazzoli * Larry Ewing * Stephane Delcroix * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using System.Collections.Generic; using Gtk; using Gdk; using Hyena; namespace FSpot.Widgets { /// /// This class provides the base functionality for displaying cells in a grid. The /// paramters to set up the grid are gathered by abstract properties which must be /// implemented by a subclass. /// public abstract class CellGridView : Gtk.Layout { #region Constructors public CellGridView (IntPtr raw) : base (raw) { } public CellGridView () : base (null, null) { } #endregion #region Abstract Layout Description /// /// Must return the width which each cell should have. /// protected abstract int MinCellWidth { get; } /// /// Must return the height which each cell should have. /// protected abstract int MinCellHeight { get; } /// /// Must return the number of cells which should be displayed. /// protected abstract int CellCount { get; } #endregion #region Abstract Drawing Functions /// /// The function is called to draw a Cell. /// protected abstract void DrawCell (int cell_num, Rectangle cell_area, Rectangle expose_area); /// /// The function is called to preload a cell. /// protected abstract void PreloadCell (int cell_num); #endregion #region Private Layout Values /// /// The number of cells per row (columns). /// protected int cells_per_row; /// /// The width of each cell. It is set, when the layout is updated. The /// property is only used when the layout is updated. /// protected int cell_width; /// /// The height of each cell. It is set, when the layout is updated. The /// property is only used when the layout is updated. /// protected int cell_height; /// /// The total number of cells the layout is computed with. It is set, when the /// layout is updated. The property is only used when /// the layout is updated. /// private int cell_count; /// /// Holds the number of rows which are displayed at once regarded to the current /// size of the widget. /// private int displayed_rows; /// /// The number of rows which are needed to display all cells. /// private int total_rows; /// /// The border size the current layout is computed with. /// private int border_size = 6; /// /// The maximal number of columns. /// private int max_columns = -1; // preserve the scroll postion when possible private bool scroll; private double scroll_value; // suppress scroll is currently not used. where do we need it? private bool suppress_scroll = false; #endregion #region Public Layout Properties public int MaxColumns { get { return max_columns; } set { max_columns = value; QueueResize (); } } public int BorderSize { get { return border_size; } set { if (value < 0) throw new ArgumentException ("value"); border_size = value; QueueResize (); } } public int VisibleRows { get { return displayed_rows; } } public int VisibleColums { get { return cells_per_row; } } #endregion #region Public Methods public int CellAtPosition (Point p) { return CellAtPosition (p.X, p.Y); } public int CellAtPosition (int x, int y) { return CellAtPosition (x, y, true); } public int CellAtPosition (int x, int y, bool crop_visible) { if (crop_visible && ((y < (int)Vadjustment.Value || y > (int)Vadjustment.Value + Allocation.Height) || (x < (int)Hadjustment.Value || x > (int)Hadjustment.Value + Allocation.Width))) return -1; if (x < border_size || x >= border_size + cells_per_row * cell_width) return -1; if (y < border_size || y >= border_size + (cell_count / cells_per_row + 1) * cell_height) return -1; int column = (int) ((x - border_size) / cell_width); int row = (int) ((y - border_size) / cell_height); int cell_num = column + row * cells_per_row; if (cell_num >= cell_count) return -1; return cell_num; } public int TopLeftVisibleCell () { // TODO: Where does the 8 come from? return CellAtPosition (border_size, (int) (Vadjustment.Value + Allocation.Height * (Vadjustment.Value / Vadjustment.Upper)) + border_size + 8); } public void CellPosition (int cell_num, out int x, out int y) { // TODO: compare the values with the ones in GetCellCenter. if (cells_per_row == 0) { x = 0; y = 0; return; } int col = cell_num % cells_per_row; int row = cell_num / cells_per_row; x = col * cell_width + border_size; y = row * cell_height + border_size; } public void CellCenter (int cell_num, out int x, out int y) { // TODO: compare the values with the ones in GetCellPosition. if (cell_num == -1) { x = -1; y = -1; } CellPosition (cell_num, out x, out y); x += cell_width / 2; y += cell_height / 2; } public Gdk.Rectangle CellBounds (int cell_num) { Rectangle bounds; CellPosition (cell_num, out bounds.X, out bounds.Y); bounds.Width = cell_width; bounds.Height = cell_height; return bounds; } public IEnumerable CellsInRect (Rectangle area) { if (cell_width <= 0 || cell_height <= 0) { yield break; } int start_cell_column = Math.Max (0, (area.X - border_size) / cell_width); int start_cell_row = Math.Max (0, (area.Y - border_size) / cell_height); int end_cell_column = Math.Max (0, (area.X + area.Width - border_size) / cell_width); int end_cell_row = Math.Max (0, (area.Y + area.Height - border_size) / cell_height); for (int cell_row = start_cell_row; cell_row <= end_cell_row; cell_row ++) { for (int cell_column = start_cell_column; cell_column <= end_cell_column; cell_column ++) { int cell_num = cell_column + cell_row * cells_per_row; if (cell_num < cell_count) yield return cell_num; } } } public void ScrollTo (int cell_num) { ScrollTo (cell_num, true); } public void ScrollTo (int cell_num, bool center) { if (!IsRealized) return; Adjustment adjustment = Vadjustment; int x; int y; CellPosition (cell_num, out x, out y); if (center) y += cell_height / 2 - Allocation.Height / 2; // the maximal possible adjustment value // (otherwise, we are scrolling to far ...) int max = (int) (Height - Allocation.Height); adjustment.Value = Math.Min (y, max); adjustment.ChangeValue (); } public void InvalidateCell (int cell_num) { Rectangle cell_area = CellBounds (cell_num); // FIXME where are we computing the bounds incorrectly cell_area.Width -= 1; cell_area.Height -= 1; Gdk.Rectangle visible = new Gdk.Rectangle ((int) Hadjustment.Value, (int) Vadjustment.Value, Allocation.Width, Allocation.Height); if (BinWindow != null && cell_area.Intersect (visible, out cell_area)) BinWindow.InvalidateRect (cell_area, false); } #endregion #region Event Handlers [GLib.ConnectBefore] private void HandleAdjustmentValueChanged (object sender, EventArgs args) { Scroll (); } #endregion #region Determine Layout protected override void OnSizeAllocated (Gdk.Rectangle allocation) { scroll_value = (Vadjustment.Value)/ (Vadjustment.Upper); scroll = ! suppress_scroll; suppress_scroll = false; UpdateLayout (allocation); base.OnSizeAllocated (allocation); } protected override void OnScrollAdjustmentsSet (Adjustment hadjustment, Adjustment vadjustment) { base.OnScrollAdjustmentsSet (hadjustment, vadjustment); if (vadjustment != null) vadjustment.ValueChanged += new EventHandler (HandleAdjustmentValueChanged); } protected override bool OnExposeEvent (Gdk.EventExpose args) { foreach (Rectangle area in args.Region.GetRectangles ()) { DrawAllCells (area); } return base.OnExposeEvent (args); } private void UpdateLayout () { UpdateLayout (Allocation); } private void UpdateLayout (Gdk.Rectangle allocation) { // get the basic values for the layout ... cell_width = MinCellWidth; cell_height = MinCellHeight; cell_count = CellCount; // ... and compute the remaining ones. int available_width = allocation.Width - 2 * border_size; int available_height = allocation.Height - 2 * border_size; cells_per_row = Math.Max ((int) (available_width / cell_width), 1); if (MaxColumns > 0) cells_per_row = Math.Min (MaxColumns, cells_per_row); cell_width += (available_width - cells_per_row * cell_width) / cells_per_row; displayed_rows = (int) Math.Max (available_height / cell_height, 1); total_rows = cell_count / cells_per_row; if (cell_count % cells_per_row != 0) total_rows ++; int height = total_rows * cell_height + 2 * border_size; Vadjustment.StepIncrement = cell_height; int x = (int)(Hadjustment.Value); int y = (int)(height * scroll_value); SetSize (x, y, (int) allocation.Width, (int) height); } private void SetSize (int x, int y, int width, int height) { Hadjustment.Upper = System.Math.Max (Allocation.Width, width); Vadjustment.Upper = System.Math.Max (Allocation.Height, height); bool xchange = scroll && (int)(Hadjustment.Value) != x; bool ychange = scroll && (int)(Vadjustment.Value) != y; // reset scroll scroll = false; if (IsRealized) BinWindow.FreezeUpdates (); if (xchange || ychange) { if (IsRealized) BinWindow.MoveResize (-x, -y, (int)(Hadjustment.Upper), (int)(Vadjustment.Upper)); Vadjustment.Value = y; Hadjustment.Value = x; } if (this.Width != Allocation.Width || this.Height != Allocation.Height) SetSize ((uint)Allocation.Width, (uint)height); if (xchange || ychange) { Vadjustment.ChangeValue (); Hadjustment.ChangeValue (); } if (IsRealized) { BinWindow.ThawUpdates (); BinWindow.ProcessUpdates (true); } } private void DrawAllCells (Gdk.Rectangle area) { foreach (var cell_num in CellsInRect (area)) { DrawCell (cell_num, CellBounds (cell_num), area); } } // The first pixel line that is currently on the screen (i.e. in the current // scroll region). Used to compute the area that went offscreen in the "changed" // signal handler for the vertical GtkAdjustment. private int y_offset; private int x_offset; private void Scroll () { int ystep = (int)(Vadjustment.Value - y_offset); int xstep = (int)(Hadjustment.Value - x_offset); if (xstep > 0) xstep = Math.Max (xstep, Allocation.Width); else xstep = Math.Min (xstep, -Allocation.Width); if (ystep > 0) ystep = Math.Max (ystep, Allocation.Height); else ystep = Math.Min (ystep, -Allocation.Height); Gdk.Rectangle area; Gdk.Region offscreen = new Gdk.Region (); /* Log.Debug ("step ({0}, {1}) allocation ({2},{3},{4},{5})", xstep, ystep, Hadjustment.Value, Vadjustment.Value, Allocation.Width, Allocation.Height); */ /* area = new Gdk.Rectangle (Math.Max ((int) (Hadjustment.Value + 4 * xstep), 0), Math.Max ((int) (Vadjustment.Value + 4 * ystep), 0), Allocation.Width, Allocation.Height); offscreen.UnionWithRect (area); area = new Gdk.Rectangle (Math.Max ((int) (Hadjustment.Value + 3 * xstep), 0), Math.Max ((int) (Vadjustment.Value + 3 * ystep), 0), Allocation.Width, Allocation.Height); offscreen.UnionWithRect (area); */ area = new Gdk.Rectangle (Math.Max ((int) (Hadjustment.Value + 2 * xstep), 0), Math.Max ((int) (Vadjustment.Value + 2 * ystep), 0), Allocation.Width, Allocation.Height); offscreen.UnionWithRect (area); area = new Gdk.Rectangle (Math.Max ((int) (Hadjustment.Value + xstep), 0), Math.Max ((int) (Vadjustment.Value + ystep), 0), Allocation.Width, Allocation.Height); offscreen.UnionWithRect (area); area = new Gdk.Rectangle ((int) Hadjustment.Value, (int) Vadjustment.Value, Allocation.Width, Allocation.Height); // always load the onscreen area last to make sure it // is first in the loading Gdk.Region onscreen = Gdk.Region.Rectangle (area); offscreen.Subtract (onscreen); PreloadRegion (offscreen, ystep); Preload (area, false); y_offset = (int) Vadjustment.Value; x_offset = (int) Hadjustment.Value; } private void PreloadRegion (Gdk.Region region, int step) { Gdk.Rectangle [] rects = region.GetRectangles (); if (step < 0) System.Array.Reverse (rects); foreach (Gdk.Rectangle preload in rects) { Preload (preload, false); } } private void Preload (Gdk.Rectangle area, bool back) { if (cells_per_row ==0) return; int start_cell_column = Math.Max ((area.X - border_size) / cell_width, 0); int start_cell_row = Math.Max ((area.Y - border_size) / cell_height, 0); int start_cell_num = start_cell_column + start_cell_row * cells_per_row; int end_cell_column = Math.Max ((area.X + area.Width - border_size) / cell_width, 0); int end_cell_row = Math.Max ((area.Y + area.Height - border_size) / cell_height, 0); int i; int cols = end_cell_column - start_cell_column + 1; int rows = end_cell_row - start_cell_row + 1; int len = rows * cols; int scell = start_cell_num; int ecell = scell + len; if (scell > cell_count - len) { ecell = cell_count; scell = System.Math.Max (0, scell - len); } else ecell = scell + len; int mid = (ecell - scell) / 2; for (i = 0; i < mid; i++) { // The order of Preloading is kept from the previous version, because it provides // smooth appearance (alternating for begin and end of the viewport) of the cells. // Maybe, this can be done better in a subclass ? (e.g. by calling a PreloadCells // with an Array/Enumeration of all cells to be preloaded, or with lower and upper // bound of cells to be preloaded) int cell = back ? ecell - i - 1 : scell + mid + i; PreloadCell (cell); cell = back ? scell + i : scell + mid - i - 1; PreloadCell (cell); } } #endregion } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/PointerMode.cs0000644000175000017500000000036011503404761023712 0ustar00rubenruben00000000000000// // FSpot.Widgets.PointerMode.cs // // Author(s) // Stephane Delcroix // // This is free software. See COPYING for details. // namespace FSpot.Widgets { public enum PointerMode { None, Select, Scroll } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/SaneTreeView.cs0000644000175000017500000000726311503404761024037 0ustar00rubenruben00000000000000/* * Widgets/SaneTreeView.cs: A Gtk# TreeView that modifies the selection appropriately * when you right click or drag. Code ported from nautilus, src/file-manager/fm-list-view.c, r13045. * * If you have multiple rows selected and right click or drag on one of them, in a normal TreeView * your selection would change to just the row you clicked/dragged on. * * Author(s): * Gabriel Burt * * This is free software. See COPYING for details. */ using System; using Gdk; using Gtk; namespace FSpot.Widgets { public class SaneTreeView : TreeView { protected bool row_selected_on_button_down, ignore_button_release, drag_started; protected SaneTreeView (IntPtr raw) : base (raw) { } public SaneTreeView (TreeStore store) : base (store) { Selection.Mode = SelectionMode.Multiple; } public TreePath PathAtPoint (double x, double y) { TreePath path_at_pointer = null; GetPathAtPos ((int) x, (int) y, out path_at_pointer); return path_at_pointer; } protected override bool OnButtonPressEvent (Gdk.EventButton button) { bool call_parent = true; bool on_expander; drag_started = ignore_button_release = false; TreePath path; TreeViewColumn column; GetPathAtPos ((int)button.X, (int)button.Y, out path, out column); if (button.Window != BinWindow) return false; if (path != null) { if (button.Type == EventType.TwoButtonPress) { ActivateRow(path, Columns[0]); base.OnButtonPressEvent (button); } else { if (button.Button == 3 && Selection.PathIsSelected (path)) call_parent = false; else if ((button.Button == 1 || button.Button == 2) && ((button.State & ModifierType.ControlMask) != 0 || (button.State & ModifierType.ShiftMask) == 0)) { int expander_size = (int) StyleGetProperty("expander-size"); int horizontal_separator = (int) StyleGetProperty("horizontal-separator"); // EXPANDER_EXTRA_PADDING from GtkTreeView expander_size += 4; on_expander = (button.X <= horizontal_separator / 2 + path.Depth * expander_size); row_selected_on_button_down = Selection.PathIsSelected (path); if (row_selected_on_button_down) { call_parent = on_expander; ignore_button_release = call_parent; } else if ((button.State & ModifierType.ControlMask) != 0) { call_parent = false; Selection.SelectPath (path); } else { ignore_button_release = on_expander; } } if (call_parent) base.OnButtonPressEvent (button); else if (Selection.PathIsSelected (path)) GrabFocus (); } } else { Selection.UnselectAll (); base.OnButtonPressEvent (button); } return false; } protected override bool OnButtonReleaseEvent (Gdk.EventButton button) { if (!drag_started && !ignore_button_release) DidNotDrag (button); base.OnButtonReleaseEvent (button); return false; } protected override void OnDragBegin (Gdk.DragContext context) { drag_started = true; base.OnDragBegin (context); } protected void DidNotDrag (Gdk.EventButton button) { TreePath path = PathAtPoint (button.X, button.Y); if (path != null) { if ((button.Button == 1 || button.Button == 2) && ((button.State & ModifierType.ControlMask) != 0 || (button.State & ModifierType.ShiftMask) == 0) && row_selected_on_button_down) { if (!ButtonEventModifiesSelection (button)) { Selection.UnselectAll (); Selection.SelectPath (path); } else Selection.UnselectPath (path); } } } protected static bool ButtonEventModifiesSelection (Gdk.EventButton button) { return (button.State & (ModifierType.ControlMask | ModifierType.ShiftMask)) != 0; } } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/RatingEntry.cs0000644000175000017500000000071511503404761023737 0ustar00rubenruben00000000000000/* * RatingEntry.cs * * Author(s) * Mike Gemuende * * This is free software. See COPYING for details. */ using System; namespace FSpot.Widgets { public class RatingEntry : Hyena.Widgets.RatingEntry { public RatingEntry (int rating) : base (rating, new RatingRenderer ()) { MaxRating = 5; MinRating = 0; } public RatingEntry () : this (0) { } } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/ImageView_Panning.cs0000644000175000017500000000367411503404761025027 0ustar00rubenruben00000000000000using Gdk; using Gtk; namespace FSpot.Widgets { public partial class ImageView { #region Panning /// /// Whether or not the user is currently performing a pan motion (dragging with the middle mouse button). /// public bool InPanMotion { get; private set; } Point pan_anchor = new Point (0, 0); bool OnPanButtonPressEvent (EventButton evnt) { if (evnt.Button != 2) { // Restrict to middle mouse button. return false; } System.Diagnostics.Debug.Assert (!InPanMotion); InPanMotion = true; // Track starting point of panning movement. pan_anchor.X = (int)evnt.X; pan_anchor.Y = (int)evnt.Y; // Set to crosshair pointer GdkWindow.Cursor = new Cursor (CursorType.Fleur); return true; } bool OnPanMotionNotifyEvent (EventMotion evnt) { if (!InPanMotion) { return false; } // Calculate the direction of the panning, scroll accordingly. int pan_x = pan_anchor.X - (int)evnt.X; int pan_y = pan_anchor.Y - (int)evnt.Y; ScrollBy (pan_x, pan_y); // Reset starting point. pan_anchor.X = (int)evnt.X; pan_anchor.Y = (int)evnt.Y; return true; } bool OnPanButtonReleaseEvent (EventButton evnt) { if (evnt.Button != 2) { // Restrict to middle mouse button. return false; } System.Diagnostics.Debug.Assert (InPanMotion); InPanMotion = false; // Reset cursor GdkWindow.Cursor = null; return true; } #endregion } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Widgets/Curve.cs0000644000175000017500000002511311503404761022554 0ustar00rubenruben00000000000000// // FSpot.Widgets.Curve.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This is open source software. See COPYING for details. // // Ported from Gtk+, where this widget and is no longer really supported. // using System; using System.Collections.Generic; using Gtk; using Gdk; namespace FSpot.Widgets { public class Curve : DrawingArea { #region public API public Curve () : base () { Events |= EventMask.ExposureMask | EventMask.PointerMotionMask | EventMask.PointerMotionHintMask | EventMask.EnterNotifyMask | EventMask.ButtonPressMask | EventMask.ButtonReleaseMask | EventMask.Button1MotionMask; ResetVector (); } public void Reset () { CurveType old_type = CurveType; CurveType = CurveType.Spline; ResetVector (); EventHandler eh; if (old_type != CurveType.Spline && (eh = CurveTypeChanged) != null) eh (this, EventArgs.Empty); } float min_x = 0f; public float MinX { get { return min_x; } set { SetRange (value, max_x, min_y, max_y); } } float max_x = 1.0f; public float MaxX { get { return max_x; } set { SetRange (min_x, value, min_y, max_y); } } float min_y = 0f; public float MinY { get { return min_y; } set { SetRange (min_x, max_x, value, max_y); } } float max_y = 1.0f; public float MaxY { get { return max_y; } set { SetRange (min_x, max_x, min_y, value); } } public void SetRange (float min_x, float max_x, float min_y, float max_y) { this.min_x = min_x; this.max_x = max_x; this.min_y = min_y; this.max_y = max_y; ResetVector (); QueueDraw (); } CurveType curve_type = CurveType.Spline; public CurveType CurveType { get { return curve_type; } set { curve_type = value; QueueDraw (); } } public float [] GetVector (int len) { if (len <= 0) return null; var vector = new float [len]; var xv = new float [points.Count]; var yv = new float [points.Count]; int i = 0; foreach (var keyval in points) { xv[i] = keyval.Key; yv[i] = keyval.Value; i++; } float rx = MinX; float dx = (MaxX - MinX) / (len - 1.0f); switch (CurveType) { case CurveType.Spline: var y2v = SplineSolve (xv, yv); for (int x = 0; x < len; x++, rx += dx) { float ry = SplineEval (xv, yv, y2v, rx); if (ry < MinY) ry = MinY; if (ry > MaxY) ry = MaxY; vector[x] = ry; } break;; case CurveType.Linear: for (int x = 0; x < len; x++, rx += dx) { float ry = LinearEval (xv, yv, rx); if (ry < MinY) ry = MinY; if (ry > MaxY) ry = MaxY; vector[x] = ry; } break; case CurveType.Free: throw new NotImplementedException (); } return vector; } public void SetVector (float[] vector) { } public void AddPoint (float x, float y) { points.Add (x, y); EventHandler eh = CurveChanged; if (eh != null) eh (this, EventArgs.Empty); } public event EventHandler CurveTypeChanged; public event EventHandler CurveChanged; #endregion #region vector handling SortedDictionary points; void ResetVector () { points = new SortedDictionary (); points.Add (min_x, min_y); points.Add (max_x, max_y); points.Add (.2f, .1f); points.Add (.5f, .5f); points.Add (.8f, .9f); } #endregion #region math helpers /* Solve the tridiagonal equation system that determines the second derivatives for the interpolation points. (Based on Numerical Recipies 2nd Edition) */ static float [] SplineSolve (float[] x, float[] y) { var y2 = new float [x.Length]; var u = new float [x.Length - 1]; y2[0] = u[0] = 0.0f; //Set lower boundary condition to "natural" for (int i = 1; i < x.Length - 1; ++i) { float sig = (x[i] - x[i - 1]) / (x[i + 1] - x[i - 1]); float p = sig * y2[i - 1] + 2.0f; y2[i] = (sig - 1.0f) / p; u[i] = ((y[i + 1] - y[i]) / (x[i + 1] - x[i]) - (y[i] - y[i - 1]) / (x[i] - x[i - 1])); u[i] = (6.0f * u[i] / (x[i + 1] - x[i - 1]) - sig * u[i - 1]) / p; } y2[x.Length - 1] = 0.0f; for (int k = x.Length - 2; k >= 0; --k) y2[k] = y2[k] * y2[k + 1] + u[k]; return y2; } /* Returns a y value for val, given x[], y[] and y2[] */ static float SplineEval (float[] x, float[] y, float[] y2, float val) { //binary search for the right interval int k_lo = 0; int k_hi = x.Length - 1; while (k_hi - k_lo > 1) { int k = (k_hi + k_lo) / 2; if (x[k] > val) k_hi = k; else k_lo = k; } float h = x[k_hi] - x[k_lo]; float a = (x[k_hi] - val) / h; float b = (val - x[k_lo]) / h; return a * y[k_lo] + b * y[k_hi] + ((a*a*a - a) * y2[k_lo] + (b*b*b - b) * y2[k_hi]) * (h*h)/6.0f; } static float LinearEval (float[] x, float[] y, float val) { //binary search for the right interval int k_lo = 0; int k_hi = x.Length - 1; while (k_hi - k_lo > 1) { int k = (k_hi + k_lo) / 2; if (x[k] > val) k_hi = k; else k_lo = k; } float dx = x[k_hi] - x[k_lo]; float dy = y[k_hi] - y[k_lo]; return val*dy/dx + y[k_lo] - dy/dx*x[k_lo]; } static int Project (float val, float min, float max, int norm) { return (int)((norm - 1) * ((val - min) / (max - min)) + .5f); } static float Unproject (int val, float min, float max, int norm) { return val / (float) (norm - 1) * (max - min) + min; } #endregion #region Gtk widgetry const int radius = 3; //radius of the control points const int min_distance = 8; //min distance between control points int x_offset = radius; int y_offset = radius; int width, height; //the real graph Pixmap pixmap = null; protected override bool OnConfigureEvent (EventConfigure evnt) { pixmap = null; return base.OnConfigureEvent (evnt); } protected override bool OnExposeEvent (EventExpose evnt) { pixmap = new Pixmap (GdkWindow, Allocation.Width, Allocation.Height); Draw (); return base.OnExposeEvent (evnt); } Gdk.Point [] Interpolate (int width, int height) { var vector = GetVector (width); var retval = new Gdk.Point [width]; for (int i = 0; i < width; i++) { retval[i].X = x_offset + i; retval[i].Y = y_offset + height - Project (vector[i], MinY, MaxY, height); } return retval; } void Draw () { if (pixmap == null) return; Style style = Style; StateType state = Sensitive ? StateType.Normal : StateType.Insensitive; if (width <= 0 || height <= 0) return; //clear the pixmap GtkBeans.Style.PaintFlatBox (style, pixmap, StateType.Normal, ShadowType.None, null, this, "curve_bg", 0, 0, Allocation.Width, Allocation.Height); //draw the grid lines for (int i = 0; i < 5; i++) { pixmap.DrawLine (style.DarkGC (state), x_offset, i * (int)(height / 4.0) + y_offset, width + x_offset, i * (int)(height / 4.0) + y_offset); pixmap.DrawLine (style.DarkGC (state), i * (int)(width / 4.0) + x_offset, y_offset, i * (int)(width / 4.0) + x_offset, height + y_offset); } //draw the curve pixmap.DrawPoints (style.ForegroundGC (state), Interpolate (width, height)); //draw the bullets if (CurveType != CurveType.Free) foreach (var keyval in points) { if (keyval.Key < MinX) continue; int x = Project (keyval.Key, MinX, MaxX, width); int y = height - Project (keyval.Value, MinY, MaxY, height); pixmap.DrawArc (style.ForegroundGC (state), true, x, y, radius * 2, radius * 2, 0, 360*64); } GdkWindow.DrawDrawable (style.ForegroundGC (state), pixmap, 0, 0, 0, 0, Allocation.Width, Allocation.Height); } protected override void OnSizeAllocated (Rectangle allocation) { width = allocation.Width - 2 * radius; height = allocation.Height - 2 * radius; base.OnSizeAllocated (allocation); } protected override void OnSizeRequested (ref Requisition requisition) { requisition.Width = 128 + 2 * x_offset; requisition.Height = 128 + 2 * y_offset; } float? grab_point = null; protected override bool OnButtonPressEvent (EventButton evnt) { int px = (int)evnt.X - x_offset; int py = (int)evnt.Y - y_offset; if (px < 0) px = 0; if (px > width - 1) px = width - 1; if (py < 0) py = 0; if (py > height - 1) py = height - 1; //find the closest point float closest_x = MinX - 1; var distance = Int32.MaxValue; foreach (var point in points) { int cx = Project (point.Key, MinX, MaxX, width); if (Math.Abs (px - cx) < distance) { distance = Math.Abs (px - cx); closest_x = point.Key; } } Grab.Add (this); CursorType = CursorType.Tcross; switch (CurveType) { case CurveType.Linear: case CurveType.Spline: if (distance > min_distance) { //insert a new control point AddPoint ((closest_x = Unproject (px, MinX, MaxX, width)), MaxY - Unproject (py, MinY, MaxY, height)); QueueDraw (); } grab_point = closest_x; break; case CurveType.Free: throw new NotImplementedException (); } return true; } protected override bool OnButtonReleaseEvent (EventButton evnt) { Grab.Remove (this); //FIXME: remove inactive points CursorType = CursorType.Fleur; grab_point = null; return true; } protected override bool OnMotionNotifyEvent (EventMotion evnt) { int px = (int)evnt.X - x_offset; int py = (int)evnt.Y - y_offset; if (px < 0) px = 0; if (px > width - 1) px = width - 1; if (py < 0) py = 0; if (py > height - 1) py = height - 1; //find the closest point float closest_x = MinX - 1; var distance = Int32.MaxValue; foreach (var point in points) { int cx = Project (point.Key, MinX, MaxX, width); if (Math.Abs (px - cx) < distance) { distance = Math.Abs (px - cx); closest_x = point.Key; } } switch (CurveType) { case CurveType.Spline: case CurveType.Linear: if (grab_point == null) { //No grabbed point if (distance <= min_distance) CursorType = CursorType.Fleur; else CursorType = CursorType.Tcross; return true; } CursorType = CursorType.Tcross; points.Remove (grab_point.Value); AddPoint ((closest_x = Unproject (px, MinX, MaxX, width)), MaxY - Unproject (py, MinY, MaxY, height)); QueueDraw (); grab_point = closest_x; break; case CurveType.Free: throw new NotImplementedException (); } return true; } Gdk.CursorType cursor_type = Gdk.CursorType.TopLeftArrow; CursorType CursorType { get { return cursor_type; } set { if (value == cursor_type) return; cursor_type = value; GdkWindow.Cursor = new Cursor (CursorType); } } #endregion } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Gui.dll.config0000644000175000017500000000072011503407352022214 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Core/FSpot.Gui/Makefile.in0000644000175000017500000007066511503407252020560 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/FSpot.Gui.dll.config.in $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Core/FSpot.Gui ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = FSpot.Gui.dll.config CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Gui TARGET = library LINK = $(REF_FSPOT_GUI) $(am__append_1) SOURCES = \ FSpot.Gui/CompositeUtils.cs \ FSpot.Gui/WindowOpacityFader.cs \ FSpot.Transitions/CairoTransition.cs \ FSpot.Transitions/DissolveTransition.cs \ FSpot.Transitions/PushTransition.cs \ FSpot.Transitions/SlideShowTransition.cs \ FSpot.Widgets/ApplicationActivatedEventArgs.cs \ FSpot.Widgets/BuilderWindow.cs \ FSpot.Widgets/CellGridView.cs \ FSpot.Widgets/CheckPattern.cs \ FSpot.Widgets/Curve.cs \ FSpot.Widgets/CurveType.cs \ FSpot.Widgets/CustomPrintWidget.cs \ FSpot.Widgets/DateEdit.cs \ FSpot.Widgets/DateEditFlags.cs \ FSpot.Widgets/HighlightedBox.cs \ FSpot.Widgets/ImageView.cs \ FSpot.Widgets/ImageView_Container.cs \ FSpot.Widgets/ImageView_Panning.cs \ FSpot.Widgets/Layout.cs \ FSpot.Widgets/MenuButton.cs \ FSpot.Widgets/OpenWithMenu.cs \ FSpot.Widgets/PointerMode.cs \ FSpot.Widgets/RatingEntry.cs \ FSpot.Widgets/RatingRenderer.cs \ FSpot.Widgets/SaneTreeView.cs \ FSpot.Widgets/ScrolledView.cs \ FSpot.Widgets/SelectionCollection.cs \ FSpot.Widgets/ToolTipWindow.cs RESOURCES = # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) FSpot.Gui.dll.config EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) \ $(THEME_ICONS_SOURCE) FSpot.Gui.dll.config CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Core/FSpot.Gui/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Core/FSpot.Gui/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): FSpot.Gui.dll.config: $(top_builddir)/config.status $(srcdir)/FSpot.Gui.dll.config.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Gui.dll.config.in0000644000175000017500000000071011431562107022620 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Core/FSpot.Gui/Makefile.am0000644000175000017500000000227411441732556020547 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Gui TARGET = library LINK = $(REF_FSPOT_GUI) SOURCES = \ FSpot.Gui/CompositeUtils.cs \ FSpot.Gui/WindowOpacityFader.cs \ FSpot.Transitions/CairoTransition.cs \ FSpot.Transitions/DissolveTransition.cs \ FSpot.Transitions/PushTransition.cs \ FSpot.Transitions/SlideShowTransition.cs \ FSpot.Widgets/ApplicationActivatedEventArgs.cs \ FSpot.Widgets/BuilderWindow.cs \ FSpot.Widgets/CellGridView.cs \ FSpot.Widgets/CheckPattern.cs \ FSpot.Widgets/Curve.cs \ FSpot.Widgets/CurveType.cs \ FSpot.Widgets/CustomPrintWidget.cs \ FSpot.Widgets/DateEdit.cs \ FSpot.Widgets/DateEditFlags.cs \ FSpot.Widgets/HighlightedBox.cs \ FSpot.Widgets/ImageView.cs \ FSpot.Widgets/ImageView_Container.cs \ FSpot.Widgets/ImageView_Panning.cs \ FSpot.Widgets/Layout.cs \ FSpot.Widgets/MenuButton.cs \ FSpot.Widgets/OpenWithMenu.cs \ FSpot.Widgets/PointerMode.cs \ FSpot.Widgets/RatingEntry.cs \ FSpot.Widgets/RatingRenderer.cs \ FSpot.Widgets/SaneTreeView.cs \ FSpot.Widgets/ScrolledView.cs \ FSpot.Widgets/SelectionCollection.cs \ FSpot.Widgets/ToolTipWindow.cs RESOURCES = include $(top_srcdir)/build/build.mk EXTRA_DIST += FSpot.Gui.dll.config module_SCRIPTS += FSpot.Gui.dll.config f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Transitions/0000777000175000017500000000000011503407443022052 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Transitions/DissolveTransition.cs0000644000175000017500000000263511503404761026246 0ustar00rubenruben00000000000000// // FSpot.Widgets.DissolveTransition.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This is open source software. See COPYING for details. // using System; using Cairo; using Gdk; using FSpot.Utils; using FSpot.Widgets; using Color = Cairo.Color; namespace FSpot.Transitions { public class DissolveTransition : CairoTransition { public DissolveTransition () : base ("Dissolve") { } protected override void Draw (Context cr, Pixbuf prev, Pixbuf next, int width, int height, double progress) { cr.Color = new Color (0, 0, 0, progress); if (next != null) { double scale = Math.Min ((double)width/(double)next.Width, (double)height/(double)next.Height); cr.Save (); cr.Rectangle (0, 0, width, .5 * (height - scale*next.Height)); cr.Fill (); cr.Rectangle (0, height - .5 * (height - scale*next.Height), width, .5 * (height - scale*next.Height)); cr.Fill (); cr.Rectangle (0, 0, .5 * (width - scale*next.Width), height); cr.Fill (); cr.Rectangle (width - .5 * (width - scale*next.Width), 0, .5 * (width - scale*next.Width), height); cr.Fill (); cr.Rectangle (0, 0, width, height); cr.Scale (scale, scale); CairoHelper.SetSourcePixbuf (cr, next, .5 * ((double)width/scale - next.Width), .5 * ((double)height/scale - next.Height)); cr.PaintWithAlpha (progress); cr.Restore (); } } } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Transitions/PushTransition.cs0000644000175000017500000000431311503404761025370 0ustar00rubenruben00000000000000// // FSpot.Widgets.PushTransition.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This is open source software. See COPYING for details. // using System; using Cairo; using Gdk; using FSpot.Utils; using Color = Cairo.Color; namespace FSpot.Transitions { public class PushTransition : CairoTransition { public PushTransition () : base ("Push") { } protected override void Draw (Context cr, Pixbuf prev, Pixbuf next, int width, int height, double progress) { cr.Color = new Color (0, 0, 0); if (prev != null) { double scale = Math.Min ((double)width/(double)prev.Width, (double)height/(double)prev.Height); cr.Save (); cr.Translate (-progress * width, 0); cr.Rectangle (0, 0, width, .5 * (height - scale*prev.Height)); cr.Fill (); cr.Rectangle (0, height - .5 * (height - scale*prev.Height), width, .5 * (height - scale*prev.Height)); cr.Fill (); cr.Rectangle (0, 0, .5 * (width - scale*prev.Width), height); cr.Fill (); cr.Rectangle (width - .5 * (width - scale*prev.Width), 0, .5 * (width - scale*prev.Width), height); cr.Fill (); cr.Rectangle (0, 0, width, height); cr.Scale (scale, scale); CairoHelper.SetSourcePixbuf (cr, prev, .5 * ((double)width/scale - prev.Width), .5 * ((double)height/scale - prev.Height)); cr.Fill (); cr.Restore (); } if (next != null) { double scale = Math.Min ((double)width/(double)next.Width, (double)height/(double)next.Height); cr.Save (); cr.Translate (width * (1.0 - progress), 0); cr.Rectangle (0, 0, width, .5 * (height - scale*next.Height)); cr.Fill (); cr.Rectangle (0, height - .5 * (height - scale*next.Height), width, .5 * (height - scale*next.Height)); cr.Fill (); cr.Rectangle (0, 0, .5 * (width - scale*next.Width), height); cr.Fill (); cr.Rectangle (width - .5 * (width - scale*next.Width), 0, .5 * (width - scale*next.Width), height); cr.Fill (); cr.Rectangle (0, 0, width, height); cr.Scale (scale, scale); CairoHelper.SetSourcePixbuf (cr, next, .5 * ((double)width/scale - next.Width), .5 * ((double)height/scale - next.Height)); cr.Fill (); cr.Restore (); } } } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Transitions/SlideShowTransition.cs0000644000175000017500000000116211503404761026351 0ustar00rubenruben00000000000000// // FSpot.Widgets.SlideShowTransition.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This is open source software. See COPYING for details. // using System; using Cairo; using Gdk; using FSpot.Utils; using Color = Cairo.Color; namespace FSpot.Transitions { public abstract class SlideShowTransition { public SlideShowTransition (string name) { this.name = name; } string name; public string Name { get { return name; } } public abstract void Draw (Drawable d, Pixbuf prev, Pixbuf next, int width, int height, double progress); } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Transitions/CairoTransition.cs0000644000175000017500000000143511503404761025510 0ustar00rubenruben00000000000000// // FSpot.Widgets.CairoTransition.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This is open source software. See COPYING for details. // using System; using Cairo; using Gdk; using FSpot.Utils; using Color = Cairo.Color; namespace FSpot.Transitions { public abstract class CairoTransition : SlideShowTransition { public CairoTransition (string name) : base (name) { } public override void Draw (Drawable d, Pixbuf prev, Pixbuf next, int width, int height, double progress) { using (Cairo.Context cr = Gdk.CairoHelper.Create (d)) { Draw (cr, prev, next, width, height, progress); } } protected abstract void Draw (Context cr, Pixbuf prev, Pixbuf next, int width, int height, double progress); } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Gui/0000777000175000017500000000000011503407443020261 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Gui/CompositeUtils.cs0000644000175000017500000001241511503404761023572 0ustar00rubenruben00000000000000using System; using System.Runtime.InteropServices; using Gdk; using Gtk; using FSpot.Utils; using Hyena; namespace FSpot.Gui { public class CompositeUtils { [DllImport("libgdk-2.0-0.dll")] static extern bool gdk_screen_is_composited (IntPtr screen); [DllImport("libgdk-2.0-0.dll")] static extern bool gdk_x11_screen_supports_net_wm_hint (IntPtr screen, IntPtr property); [DllImport("libgdk-2.0-0.dll")] static extern IntPtr gdk_screen_get_rgba_colormap (IntPtr screen); [DllImport("libgdk-2.0-0.dll")] static extern IntPtr gdk_screen_get_rgba_visual (IntPtr screen); [DllImport ("libgtk-win32-2.0-0.dll")] static extern void gtk_widget_input_shape_combine_mask (IntPtr raw, IntPtr shape_mask, int offset_x, int offset_y); [DllImport("libgdk-2.0-0.dll")] static extern void gdk_property_change(IntPtr window, IntPtr property, IntPtr type, int format, int mode, uint [] data, int nelements); [DllImport("libgdk-2.0-0.dll")] static extern void gdk_property_change(IntPtr window, IntPtr property, IntPtr type, int format, int mode, byte [] data, int nelements); public static Colormap GetRgbaColormap (Screen screen) { try { IntPtr raw_ret = gdk_screen_get_rgba_colormap (screen.Handle); Gdk.Colormap ret = GLib.Object.GetObject(raw_ret) as Gdk.Colormap; return ret; } catch { Gdk.Visual visual = Gdk.Visual.GetBestWithDepth (32); if (visual != null) { Gdk.Colormap cmap = new Gdk.Colormap (visual, false); Log.Debug ("fallback"); return cmap; } } return null; } public static void ChangeProperty (Gdk.Window win, Atom property, Atom type, PropMode mode, uint [] data) { gdk_property_change (win.Handle, property.Handle, type.Handle, 32, (int)mode, data, data.Length * 4); } public static void ChangeProperty (Gdk.Window win, Atom property, Atom type, PropMode mode, byte [] data) { gdk_property_change (win.Handle, property.Handle, type.Handle, 8, (int)mode, data, data.Length); } public static bool SupportsHint (Screen screen, string name) { try { Atom atom = Atom.Intern (name, false); return gdk_x11_screen_supports_net_wm_hint (screen.Handle, atom.Handle); } catch { return false; } } public static bool SetRgbaColormap (Widget w) { Gdk.Colormap cmap = GetRgbaColormap (w.Screen); if (cmap != null) { w.Colormap = cmap; return true; } return false; } public static Visual GetRgbaVisual (Screen screen) { try { IntPtr raw_ret = gdk_screen_get_rgba_visual (screen.Handle); Gdk.Visual ret = GLib.Object.GetObject(raw_ret) as Gdk.Visual; return ret; } catch { Gdk.Visual visual = Gdk.Visual.GetBestWithDepth (32); if (visual != null) { return visual; } } return null; } public static bool IsComposited (Screen screen) { bool composited; try { composited = gdk_screen_is_composited (screen.Handle); } catch (EntryPointNotFoundException) { Log.Debug ("query composite manager locally"); Atom atom = Atom.Intern (String.Format ("_NET_WM_CM_S{0}", screen.Number), false); composited = Gdk.Selection.OwnerGetForDisplay (screen.Display, atom) != null; } // FIXME check for WINDOW_OPACITY so that we support compositing on older composite manager // versions before they started supporting the real check given above if (!composited) composited = CompositeUtils.SupportsHint (screen, "_NET_WM_WINDOW_OPACITY"); return composited; } public static void InputShapeCombineMask (Widget w, Pixmap shape_mask, int offset_x, int offset_y) { gtk_widget_input_shape_combine_mask (w.Handle, shape_mask == null ? IntPtr.Zero : shape_mask.Handle, offset_x, offset_y); } [DllImport("libXcomposite.dll")] static extern void XCompositeRedirectWindow (IntPtr display, uint window, CompositeRedirect update); public enum CompositeRedirect { Automatic = 0, Manual = 1 }; public static void RedirectDrawable (Drawable d) { uint xid = GdkUtils.GetXid (d); Log.DebugFormat ("xid = {0} d.handle = {1}, d.Display.Handle = {2}", xid, d.Handle, d.Display.Handle); XCompositeRedirectWindow (GdkUtils.GetXDisplay (d.Display), GdkUtils.GetXid (d), CompositeRedirect.Manual); } public static void SetWinOpacity (Gtk.Window win, double opacity) { CompositeUtils.ChangeProperty (win.GdkWindow, Atom.Intern ("_NET_WM_WINDOW_OPACITY", false), Atom.Intern ("CARDINAL", false), PropMode.Replace, new uint [] { (uint) (0xffffffff * opacity) }); } public static Cms.Profile GetScreenProfile (Screen screen) { Atom atype; int aformat; int alength; byte [] data; if (Gdk.Property.Get (screen.RootWindow, Atom.Intern ("_ICC_PROFILE", false), Atom.Intern ("CARDINAL", false), 0, Int32.MaxValue, 0, // FIXME in gtk# should be a bool out atype, out aformat, out alength, out data)) { return new Cms.Profile (data); } return null; } public static void SetScreenProfile (Screen screen, Cms.Profile profile) { byte [] data = profile.Save (); ChangeProperty (screen.RootWindow, Atom.Intern ("_ICC_PROFILE", false), Atom.Intern ("CARDINAL", false), PropMode.Replace, data); } } } f-spot-0.8.2/src/Core/FSpot.Gui/FSpot.Gui/WindowOpacityFader.cs0000644000175000017500000000226211503404761024350 0ustar00rubenruben00000000000000/* * Fader.cs * * Copyright 2007 Novell Inc. * * Author * Larry Ewing * * See COPYING for license information. * */ using System; using Gtk; using FSpot.Bling; namespace FSpot.Gui { public class WindowOpacityFader { Gtk.Window win; DoubleAnimation fadin; public WindowOpacityFader (Gtk.Window win, double target, double msec) { this.win = win; win.Mapped += HandleMapped; win.Unmapped += HandleUnmapped; fadin = new DoubleAnimation (0.0, target, TimeSpan.FromMilliseconds (msec), opacity => { CompositeUtils.SetWinOpacity (win, opacity); }); } [GLib.ConnectBefore] public void HandleMapped (object sender, EventArgs args) { bool composited = CompositeUtils.SupportsHint (win.Screen, "_NET_WM_WINDOW_OPACITY"); if (!composited) { return; } CompositeUtils.SetWinOpacity (win, 0.0); fadin.Start (); } public void HandleUnmapped (object sender, EventArgs args) { fadin.Stop (); } } } f-spot-0.8.2/src/Core/FSpot.Utils/0000777000175000017500000000000011503407442017056 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils.dll.config0000644000175000017500000000067511503407351023154 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils.dll.config.in0000644000175000017500000000067111431562107023556 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Core/FSpot.Utils/Makefile.in0000644000175000017500000007052611503407255021133 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/FSpot.Utils.dll.config.in \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Core/FSpot.Utils ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = FSpot.Utils.dll.config CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Utils TARGET = library LINK = $(REF_FSPOT_UTILS) $(am__append_1) SOURCES = \ FSpot.Utils/Cache.cs \ FSpot.Utils/CairoUtils.cs \ FSpot.Utils/ConsoleCrayon.cs \ FSpot.Utils/DelayedOperation.cs \ FSpot.Utils/FileExtensions.cs \ FSpot.Utils/GdkUtils.cs \ FSpot.Utils/GIOTagLibFileAbstraction.cs \ FSpot.Utils/GtkUtil.cs \ FSpot.Utils/HashUtils.cs \ FSpot.Utils/MemorySurface.cs \ FSpot.Utils/Metadata.cs \ FSpot.Utils/PixbufUtils.cs \ FSpot.Utils/RecursiveFileEnumerator.cs \ FSpot.Utils/SafeUriExtensions.cs \ FSpot.Utils/SidecarXmpExtensions.cs \ FSpot.Utils/Tests/GIOTagLibFileAbstractionTests.cs \ FSpot.Utils/Tests/ImageTestHelper.cs \ FSpot.Utils/Tests/MetadataTest.cs \ FSpot.Utils/Tests/SafeUriTests.cs \ FSpot.Utils/Tests/SidecarXmpExtensionsTests.cs \ FSpot.Utils/Tests/XdgThumbnailSpecTests.cs \ FSpot.Utils/UriExtensions.cs \ FSpot.Utils/UriList.cs \ FSpot.Utils/UriUtils.cs \ FSpot.Utils/Vector.cs \ FSpot.Utils/XdgThumbnailSpec.cs RESOURCES = # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) FSpot.Utils.dll.config EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) \ $(THEME_ICONS_SOURCE) FSpot.Utils.dll.config CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Core/FSpot.Utils/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Core/FSpot.Utils/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): FSpot.Utils.dll.config: $(top_builddir)/config.status $(srcdir)/FSpot.Utils.dll.config.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Core/FSpot.Utils/Makefile.am0000644000175000017500000000211411503404762021106 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Utils TARGET = library LINK = $(REF_FSPOT_UTILS) SOURCES = \ FSpot.Utils/Cache.cs \ FSpot.Utils/CairoUtils.cs \ FSpot.Utils/ConsoleCrayon.cs \ FSpot.Utils/DelayedOperation.cs \ FSpot.Utils/FileExtensions.cs \ FSpot.Utils/GdkUtils.cs \ FSpot.Utils/GIOTagLibFileAbstraction.cs \ FSpot.Utils/GtkUtil.cs \ FSpot.Utils/HashUtils.cs \ FSpot.Utils/MemorySurface.cs \ FSpot.Utils/Metadata.cs \ FSpot.Utils/PixbufUtils.cs \ FSpot.Utils/RecursiveFileEnumerator.cs \ FSpot.Utils/SafeUriExtensions.cs \ FSpot.Utils/SidecarXmpExtensions.cs \ FSpot.Utils/Tests/GIOTagLibFileAbstractionTests.cs \ FSpot.Utils/Tests/ImageTestHelper.cs \ FSpot.Utils/Tests/MetadataTest.cs \ FSpot.Utils/Tests/SafeUriTests.cs \ FSpot.Utils/Tests/SidecarXmpExtensionsTests.cs \ FSpot.Utils/Tests/XdgThumbnailSpecTests.cs \ FSpot.Utils/UriExtensions.cs \ FSpot.Utils/UriList.cs \ FSpot.Utils/UriUtils.cs \ FSpot.Utils/Vector.cs \ FSpot.Utils/XdgThumbnailSpec.cs RESOURCES = include $(top_srcdir)/build/build.mk EXTRA_DIST += FSpot.Utils.dll.config module_SCRIPTS += FSpot.Utils.dll.config f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/0000777000175000017500000000000011503407442021210 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/ConsoleCrayon.cs0000644000175000017500000002046511503404762024322 0ustar00rubenruben00000000000000// // ConsoleCrayon.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace FSpot.Utils { public static class ConsoleCrayon { #region Public API private static ConsoleColor foreground_color; public static ConsoleColor ForegroundColor { get { return foreground_color; } set { foreground_color = value; SetColor (foreground_color, true); } } private static ConsoleColor background_color; public static ConsoleColor BackgroundColor { get { return background_color; } set { background_color = value; SetColor (background_color, false); } } public static void ResetColor () { if (XtermColors) { Console.Write (GetAnsiResetControlCode ()); } else if (Environment.OSVersion.Platform != PlatformID.Unix && !RuntimeIsMono) { Console.ResetColor (); } } private static void SetColor (ConsoleColor color, bool isForeground) { if (color < ConsoleColor.Black || color > ConsoleColor.White) { throw new ArgumentOutOfRangeException ("color", "Not a ConsoleColor value."); } if (XtermColors) { Console.Write (GetAnsiColorControlCode (color, isForeground)); } else if (Environment.OSVersion.Platform != PlatformID.Unix && !RuntimeIsMono) { if (isForeground) { Console.ForegroundColor = color; } else { Console.BackgroundColor = color; } } } #endregion #region Ansi/VT Code Calculation // Modified from Mono's System.TermInfoDriver // License: MIT/X11 // Authors: Gonzalo Paniagua Javier // (C) 2005-2006 Novell, Inc private static int TranslateColor (ConsoleColor desired, out bool light) { light = false; switch (desired) { // Dark colors case ConsoleColor.Black: return 0; case ConsoleColor.DarkRed: return 1; case ConsoleColor.DarkGreen: return 2; case ConsoleColor.DarkYellow: return 3; case ConsoleColor.DarkBlue: return 4; case ConsoleColor.DarkMagenta: return 5; case ConsoleColor.DarkCyan: return 6; case ConsoleColor.Gray: return 7; // Light colors case ConsoleColor.DarkGray: light = true; return 0; case ConsoleColor.Red: light = true; return 1; case ConsoleColor.Green: light = true; return 2; case ConsoleColor.Yellow: light = true; return 3; case ConsoleColor.Blue: light = true; return 4; case ConsoleColor.Magenta: light = true; return 5; case ConsoleColor.Cyan: light = true; return 6; case ConsoleColor.White: default: light = true; return 7; } } private static string GetAnsiColorControlCode (ConsoleColor color, bool isForeground) { // lighter fg colours are 90 -> 97 rather than 30 -> 37 // lighter bg colours are 100 -> 107 rather than 40 -> 47 bool light; int code = TranslateColor (color, out light) + (isForeground ? 30 : 40) + (light ? 60 : 0); return String.Format ("\x001b[{0}m", code); } private static string GetAnsiResetControlCode () { return "\x001b[0m"; } #endregion #region xterm Detection private static bool? xterm_colors = null; public static bool XtermColors { get { if (xterm_colors == null) { DetectXtermColors (); } return xterm_colors.Value; } } [System.Runtime.InteropServices.DllImport ("libc", EntryPoint="isatty")] private extern static int _isatty (int fd); private static bool isatty (int fd) { try { return _isatty (fd) == 1; } catch { return false; } } private static void DetectXtermColors () { bool _xterm_colors = false; switch (Environment.GetEnvironmentVariable ("TERM")) { case "xterm": case "rxvt": case "rxvt-unicode": if (Environment.GetEnvironmentVariable ("COLORTERM") != null) { _xterm_colors = true; } break; case "xterm-color": _xterm_colors = true; break; } xterm_colors = _xterm_colors && isatty (1) && isatty (2); } #endregion #region Runtime Detection private static bool? runtime_is_mono; public static bool RuntimeIsMono { get { if (runtime_is_mono == null) { runtime_is_mono = Type.GetType ("System.MonoType") != null; } return runtime_is_mono.Value; } } #endregion #region Tests #if FALSE public static void Test () { TestSelf (); Console.WriteLine (); TestAnsi (); Console.WriteLine (); TestRuntime (); } private static void TestSelf () { Console.WriteLine ("==SELF TEST=="); foreach (ConsoleColor color in Enum.GetValues (typeof (ConsoleColor))) { ForegroundColor = color; Console.Write (color); ResetColor (); Console.Write (" :: "); BackgroundColor = color; Console.Write (color); ResetColor (); Console.WriteLine (); } } private static void TestAnsi () { Console.WriteLine ("==ANSI TEST=="); foreach (ConsoleColor color in Enum.GetValues (typeof (ConsoleColor))) { string color_code_fg = GetAnsiColorControlCode (color, true); string color_code_bg = GetAnsiColorControlCode (color, false); Console.Write ("{0}{1}: {2}{3} :: {4}{1}: {5}{3}", color_code_fg, color, color_code_fg.Substring (2), GetAnsiResetControlCode (), color_code_bg, color_code_bg.Substring (2)); Console.WriteLine (); } } private static void TestRuntime () { Console.WriteLine ("==RUNTIME TEST=="); foreach (ConsoleColor color in Enum.GetValues (typeof (ConsoleColor))) { Console.ForegroundColor = color; Console.Write (color); Console.ResetColor (); Console.Write (" :: "); Console.BackgroundColor = color; Console.Write (color); Console.ResetColor (); Console.WriteLine (); } } #endif #endregion } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/PixbufUtils.cs0000644000175000017500000001274211503404762024021 0ustar00rubenruben00000000000000// // FSpot.PixbufUtils.cs // // Author(s): // Ettore Perazzoli // Larry Ewing // Stephane Delcroix // // This is free software. See COPYING for details // using Gdk; using System; using System.Runtime.InteropServices; using TagLib.Image; namespace FSpot.Utils { public static class PixbufUtils { static public ImageOrientation Rotate270 (ImageOrientation orientation) { if (orientation == ImageOrientation.None) { orientation = ImageOrientation.TopLeft; } ImageOrientation [] rot = new ImageOrientation [] { ImageOrientation.LeftBottom, ImageOrientation.LeftTop, ImageOrientation.RightTop, ImageOrientation.RightBottom, ImageOrientation.BottomLeft, ImageOrientation.TopLeft, ImageOrientation.TopRight, ImageOrientation.BottomRight }; orientation = rot [((int)orientation) -1]; return orientation; } static public ImageOrientation Rotate90 (ImageOrientation orientation) { orientation = Rotate270 (orientation); orientation = Rotate270 (orientation); orientation = Rotate270 (orientation); return orientation; } public static Rectangle TransformOrientation (Pixbuf src, Rectangle args, ImageOrientation orientation) { return TransformOrientation (src.Width, src.Height, args, orientation); } public static Rectangle TransformOrientation (int total_width, int total_height, Rectangle args, ImageOrientation orientation) { Rectangle area = args; switch (orientation) { case ImageOrientation.BottomRight: area.X = total_width - args.X - args.Width; area.Y = total_height - args.Y - args.Height; break; case ImageOrientation.TopRight: area.X = total_width - args.X - args.Width; break; case ImageOrientation.BottomLeft: area.Y = total_height - args.Y - args.Height; break; case ImageOrientation.LeftTop: area.X = args.Y; area.Y = args.X; area.Width = args.Height; area.Height = args.Width; break; case ImageOrientation.RightBottom: area.X = total_height - args.Y - args.Height; area.Y = total_width - args.X - args.Width; area.Width = args.Height; area.Height = args.Width; break; case ImageOrientation.RightTop: area.X = total_height - args.Y - args.Height; area.Y = args.X; area.Width = args.Height; area.Height = args.Width; break; case ImageOrientation.LeftBottom: area.X = args.Y; area.Y = total_width - args.X - args.Width; area.Width = args.Height; area.Height = args.Width; break; default: break; } return area; } public static Point TransformOrientation (int total_width, int total_height, Point args, ImageOrientation orientation) { Point p = args; switch (orientation) { default: case ImageOrientation.TopLeft: break; case ImageOrientation.TopRight: p.X = total_width - p.X; break; case ImageOrientation.BottomRight: p.X = total_width - p.X; p.Y = total_height - p.Y; break; case ImageOrientation.BottomLeft: p.Y = total_height - p.Y; break; case ImageOrientation.LeftTop: p.X = args.Y; p.Y = args.X; break; case ImageOrientation.RightTop: p.X = total_height - args.Y; p.Y = args.X; break; case ImageOrientation.RightBottom: p.X = total_height - args.Y; p.Y = total_width - args.X; break; case ImageOrientation.LeftBottom: p.X = args.Y; p.Y = total_width - args.X; break; } return p; } public static ImageOrientation ReverseTransformation (ImageOrientation orientation) { switch (orientation) { default: case ImageOrientation.TopLeft: case ImageOrientation.TopRight: case ImageOrientation.BottomRight: case ImageOrientation.BottomLeft: return orientation; case ImageOrientation.LeftTop: return ImageOrientation.RightBottom; case ImageOrientation.RightTop: return ImageOrientation.LeftBottom; case ImageOrientation.RightBottom: return ImageOrientation.LeftTop; case ImageOrientation.LeftBottom: return ImageOrientation.RightTop; } } public static Pixbuf TransformOrientation (Pixbuf src, ImageOrientation orientation) { Pixbuf dest; switch (orientation) { default: case ImageOrientation.TopLeft: dest = PixbufUtils.ShallowCopy (src); break; case ImageOrientation.TopRight: dest = src.Flip (false); break; case ImageOrientation.BottomRight: dest = src.RotateSimple (PixbufRotation.Upsidedown); break; case ImageOrientation.BottomLeft: dest = src.Flip (true); break; case ImageOrientation.LeftTop: using (var rotated = src.RotateSimple (PixbufRotation.Clockwise)) { dest = rotated.Flip (false); } break; case ImageOrientation.RightTop: dest = src.RotateSimple (PixbufRotation.Clockwise); break; case ImageOrientation.RightBottom: using (var rotated = src.RotateSimple (PixbufRotation.Counterclockwise)) { dest = rotated.Flip (false); } break; case ImageOrientation.LeftBottom: dest = src.RotateSimple (PixbufRotation.Counterclockwise); break; } return dest; } public static Pixbuf ShallowCopy (this Pixbuf pixbuf) { if (pixbuf == null) return null; Pixbuf result = new Pixbuf (pixbuf, 0, 0, pixbuf.Width, pixbuf.Height); return result; } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/FileExtensions.cs0000644000175000017500000000377111503404762024504 0ustar00rubenruben00000000000000/* * FSpot.Utils.FileExtensions.cs * * Author(s) * Paul Wellner Bou * * This is free software. See COPYING for details. */ using System; using System.IO; using Mono.Unix; using GLib; using Hyena; namespace FSpot.Utils { public static class FileExtensions { public static bool CopyRecursive (this GLib.File source, GLib.File target, GLib.FileCopyFlags flags, GLib.Cancellable cancellable, GLib.FileProgressCallback callback) { bool result = true; GLib.FileType ft = source.QueryFileType (GLib.FileQueryInfoFlags.None, cancellable); if (ft != GLib.FileType.Directory) { Hyena.Log.DebugFormat ("Copying \"{0}\" to \"{1}\"", source.Path, target.Path); return source.Copy (target, flags, cancellable, callback); } if (!target.Exists) { Hyena.Log.DebugFormat ("Creating directory: \"{0}\"", target.Path); result = result && target.MakeDirectoryWithParents (cancellable); } GLib.FileEnumerator fe = source.EnumerateChildren ("standard::name", GLib.FileQueryInfoFlags.None, cancellable); GLib.FileInfo fi = fe.NextFile (); while (fi != null) { GLib.File source_file = GLib.FileFactory.NewForPath (Path.Combine (source.Path, fi.Name)); GLib.File target_file = GLib.FileFactory.NewForPath (Path.Combine (target.Path, fi.Name)); result = result && source_file.CopyRecursive(target_file, flags, cancellable, callback); fi = fe.NextFile (); } fe.Close (cancellable); return result; } public static void DeleteRecursive (this GLib.File file) { // FIXME: no cancellation support var type = file.QueryFileType (FileQueryInfoFlags.None, null); if (type != FileType.Directory) { file.Delete (null); return; } var children = file.EnumerateChildren ("standard::name", GLib.FileQueryInfoFlags.None, null); foreach (GLib.FileInfo child in children) { var child_file = FileFactory.NewForPath (Path.Combine (file.Path, child.Name)); child_file.DeleteRecursive (); } file.Delete (null); } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/UriUtils.cs0000644000175000017500000000354111503404762023320 0ustar00rubenruben00000000000000/* * FSpot.Utils.UriUtils.cs * * Author(s): * Larry Ewing * * This is free software. See COPYING for details */ using System; using System.Text; using System.IO; namespace FSpot.Utils { public static class UriUtils { // NOTE: this was copied from mono's System.Uri where it is internal. public static string EscapeString (string str, bool escapeReserved, bool escapeHex, bool escapeBrackets) { if (str == null) return String.Empty; StringBuilder s = new StringBuilder (); int len = str.Length; for (int i = 0; i < len; i++) { // mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")" // control = // space = // delims = "<" | ">" | "#" | "%" | <"> // unwise = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`" // check for escape code already placed in str, // i.e. for encoding that follows the pattern // "%hexhex" in a string, where "hex" is a digit from 0-9 // or a letter from A-F (case-insensitive). if (Uri.IsHexEncoding (str,i)) { // if ,yes , copy it as is s.Append(str.Substring (i, 3)); i += 2; continue; } byte [] data = Encoding.UTF8.GetBytes (new char[] {str[i]}); int length = data.Length; for (int j = 0; j < length; j++) { char c = (char) data [j]; // reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," if ((c <= 0x20) || (c >= 0x7f) || ("<>%\"{}|\\^`".IndexOf (c) != -1) || (escapeHex && (c == '#')) || (escapeBrackets && (c == '[' || c == ']')) || (escapeReserved && (";/?:@&=+$,".IndexOf (c) != -1))) { s.Append (Uri.HexEscape (c)); continue; } s.Append (c); } } return s.ToString (); } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/GdkUtils.cs0000644000175000017500000000440311503404762023264 0ustar00rubenruben00000000000000using System; using Gdk; using System.Runtime.InteropServices; using Hyena; namespace FSpot.Utils { public class GdkUtils { public static Pixbuf Deserialize (byte [] data) { Pixdata pixdata = new Pixdata (); pixdata.Deserialize ((uint) data.Length, data); return Pixbuf.FromPixdata (pixdata, true); } public static byte [] Serialize (Pixbuf pixbuf) { Pixdata pixdata = new Pixdata (); #if true //We should use_rle, but bgo#553374 prevents this pixdata.FromPixbuf (pixbuf, false); return pixdata.Serialize (); #else IntPtr raw_pixdata = pixdata.FromPixbuf (pixbuf, true); byte [] data = pixdata.Serialize (); GLib.Marshaller.Free (raw_pixdata); return data; #endif } class NativeMethods { [DllImport("libgdk-2.0-0.dll")] public static extern uint gdk_x11_drawable_get_xid (IntPtr d); [DllImport("libgdk-2.0-0.dll")] public static extern IntPtr gdk_x11_display_get_xdisplay (IntPtr d); [DllImport("libgdk-2.0-0.dll")] public static extern IntPtr gdk_x11_visual_get_xvisual (IntPtr d); [DllImport("X11")] public static extern uint XVisualIDFromVisual(IntPtr visual); [DllImport("libgdk-2.0-0.dll")] public static extern IntPtr gdk_x11_screen_lookup_visual (IntPtr screen, uint xvisualid); } public static uint GetXid (Drawable d) { return NativeMethods.gdk_x11_drawable_get_xid (d.Handle); } public static uint GetXVisualId (Visual visual) { return NativeMethods.XVisualIDFromVisual (GetXVisual (visual)); } public static IntPtr GetXDisplay (Display display) { return NativeMethods.gdk_x11_display_get_xdisplay (display.Handle); } public static IntPtr GetXVisual (Visual v) { return NativeMethods.gdk_x11_visual_get_xvisual (v.Handle); } public static Visual LookupVisual (Screen screen, uint visualid) { return (Gdk.Visual) GLib.Object.GetObject (NativeMethods.gdk_x11_screen_lookup_visual (screen.Handle, visualid)); } public static Cursor CreateEmptyCursor (Display display) { try { Gdk.Pixbuf empty = new Gdk.Pixbuf (Gdk.Colorspace.Rgb, true, 8, 1, 1); empty.Fill (0x00000000); return new Gdk.Cursor (display, empty, 0, 0); } catch (System.Exception e){ Log.Exception (e); return null; } } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/UriExtensions.cs0000644000175000017500000000110311503404762024347 0ustar00rubenruben00000000000000/* * FSpot.Utils.UriExtensions.cs * * Author(s) * Mike Gemuende * * This is free software. See COPYING for details. */ using System; namespace FSpot.Utils { public static class UriExtensions { public static Uri GetDirectoryUri (this Uri uri) { UriBuilder builder = new UriBuilder (uri); builder.Path = String.Format ("{0}/", System.IO.Path.GetDirectoryName (uri.AbsolutePath)); return builder.Uri; } public static string GetFilename (this Uri uri) { return System.IO.Path.GetFileName (uri.AbsolutePath); } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/SafeUriExtensions.cs0000644000175000017500000000263311503404762025157 0ustar00rubenruben00000000000000using Hyena; using System; namespace FSpot { public static class SafeUriExtensions { public static SafeUri Append (this SafeUri base_uri, string filename) { return new SafeUri (base_uri.AbsoluteUri + (base_uri.AbsoluteUri.EndsWith ("/") ? "" : "/") + filename, true); } public static SafeUri GetBaseUri (this SafeUri uri) { var abs_uri = uri.AbsoluteUri; return new SafeUri (abs_uri.Substring (0, abs_uri.LastIndexOf ('/')), true); } public static string GetFilename (this SafeUri uri) { var abs_uri = uri.AbsoluteUri; return abs_uri.Substring (abs_uri.LastIndexOf ('/') + 1); } public static string GetExtension (this SafeUri uri) { var abs_uri = uri.AbsoluteUri; var index = abs_uri.LastIndexOf ('.'); return index == -1 ? String.Empty : abs_uri.Substring (index); } public static string GetFilenameWithoutExtension (this SafeUri uri) { var name = uri.GetFilename (); var index = name.LastIndexOf ('.'); return index > -1 ? name.Substring (0, index) : name; } public static SafeUri ReplaceExtension (this SafeUri uri, string extension) { return uri.GetBaseUri ().Append (uri.GetFilenameWithoutExtension () + extension); } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/GIOTagLibFileAbstraction.cs0000644000175000017500000000631211503404762026232 0ustar00rubenruben00000000000000using System; using System.IO; using GLib; using Hyena; namespace FSpot.Utils { /// /// Wraps GIO into a TagLib IFileAbstraction. /// /// /// Implements a safe writing pattern by first copying the file to a /// temporary location. This temporary file is used for writing. When the /// stream is closed, the temporary file is moved to the original /// location. /// public sealed class GIOTagLibFileAbstraction : TagLib.File.IFileAbstraction { private GioStream stream; private SafeUri tmp_write_uri; private const string TMP_INFIX = ".tmpwrite"; public string Name { get { return Uri.ToString (); } set { Uri = new SafeUri (value); } } public SafeUri Uri { get; set; } public Stream ReadStream { get { if (stream == null) { var file = FileFactory.NewForUri (Uri); stream = new GioStream (file.Read (null)); } if (!stream.CanRead) throw new Exception ("Can't read from this resource"); return stream; } } public Stream WriteStream { get { if (stream == null) { var file = FileFactory.NewForUri (Uri); if (!file.Exists) { stream = new GioStream (file.Create (GLib.FileCreateFlags.None, null)); } else { CopyToTmp (); file = FileFactory.NewForUri (tmp_write_uri); stream = new GioStream (file.OpenReadwrite (null)); } } if (!stream.CanWrite) { throw new Exception ("Stream still open in reading mode!"); } return stream; } } private void CopyToTmp () { var file = FileFactory.NewForUri (Uri); tmp_write_uri = CreateTmpFile (); var tmp_file = FileFactory.NewForUri (tmp_write_uri); file.Copy (tmp_file, GLib.FileCopyFlags.AllMetadata | GLib.FileCopyFlags.Overwrite, null, null); } private void CommitTmp () { if (tmp_write_uri == null) return; var file = FileFactory.NewForUri (Uri); var tmp_file = FileFactory.NewForUri (tmp_write_uri); tmp_file.Move (file, GLib.FileCopyFlags.AllMetadata | GLib.FileCopyFlags.Overwrite, null, null); } private SafeUri CreateTmpFile () { var uri = Uri.GetBaseUri ().Append ("." + Uri.GetFilenameWithoutExtension ()); var tmp_uri = uri.ToString () + TMP_INFIX + Uri.GetExtension (); return new SafeUri (tmp_uri, true); } public void CloseStream (Stream stream) { stream.Close (); if (stream == this.stream) { if (stream.CanWrite) { CommitTmp (); } this.stream = null; } } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/HashUtils.cs0000644000175000017500000000046611503404762023447 0ustar00rubenruben00000000000000using Hyena; namespace FSpot { public class HashUtils { public static string GenerateMD5 (SafeUri uri) { var file = GLib.FileFactory.NewForUri (uri); var stream = new GLib.GioStream (file.Read (null)); var hash = CryptoUtil.Md5EncodeStream (stream); stream.Close (); return hash; } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/SidecarXmpExtensions.cs0000644000175000017500000000440611503404762025660 0ustar00rubenruben00000000000000using System; using System.IO; using Hyena; using TagLib.Image; using TagLib.Xmp; namespace FSpot.Utils { public static class SidecarXmpExtensions { /// /// Parses the XMP file identified by resource and replaces the XMP /// tag of file by the parsed data. /// public static bool ParseXmpSidecar (this TagLib.Image.File file, TagLib.File.IFileAbstraction resource) { string xmp; try { using (var stream = resource.ReadStream) { using (var reader = new StreamReader (stream)) { xmp = reader.ReadToEnd (); } } } catch (Exception e) { Log.DebugFormat ("Sidecar cannot be read for file {0}", file.Name); Log.DebugException (e); return false; } XmpTag tag = null; try { tag = new XmpTag (xmp, file); } catch (Exception e) { Log.DebugFormat ("Metadata of Sidecar cannot be parsed for file {0}", file.Name); Log.DebugException (e); return false; } var xmp_tag = file.GetTag (TagLib.TagTypes.XMP, true) as XmpTag; xmp_tag.ReplaceFrom (tag); return true; } public static bool SaveXmpSidecar (this TagLib.Image.File file, TagLib.File.IFileAbstraction resource) { var xmp_tag = file.GetTag (TagLib.TagTypes.XMP, false) as XmpTag; if (xmp_tag == null) { // TODO: Delete File return true; } var xmp = xmp_tag.Render (); try { using (var stream = resource.WriteStream) { stream.SetLength (0); using (var writer = new StreamWriter (stream)) { writer.Write (xmp); } resource.CloseStream (stream); } } catch (Exception e) { Log.DebugFormat ("Sidecar cannot be saved: {0}", resource.Name); Log.DebugException (e); return false; } return true; } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/Metadata.cs0000644000175000017500000000671311503404762023264 0ustar00rubenruben00000000000000using Hyena; using TagLib; using System; using GLib; namespace FSpot.Utils { public static class Metadata { public static TagLib.Image.File Parse (SafeUri uri) { // Detect mime-type string mime; try { var gfile = FileFactory.NewForUri (uri); var info = gfile.QueryInfo ("standard::content-type", FileQueryInfoFlags.None, null); mime = info.ContentType; } catch (Exception e) { Hyena.Log.DebugException (e); return null; } if (mime.StartsWith ("application/x-extension-")) { // Works around broken metadata detection - https://bugzilla.gnome.org/show_bug.cgi?id=624781 mime = String.Format ("taglib/{0}", mime.Substring (24)); } // Parse file var res = new GIOTagLibFileAbstraction () { Uri = uri }; var sidecar_uri = GetSidecarUri (uri); var sidecar_res = new GIOTagLibFileAbstraction () { Uri = sidecar_uri }; TagLib.Image.File file = null; try { file = TagLib.File.Create (res, mime, ReadStyle.Average) as TagLib.Image.File; } catch (Exception) { Hyena.Log.DebugFormat ("Loading of metadata failed for file: {0}, trying extension fallback", uri); try { file = TagLib.File.Create (res, ReadStyle.Average) as TagLib.Image.File; } catch (Exception e) { Hyena.Log.DebugFormat ("Loading of metadata failed for file: {0}", uri); Hyena.Log.DebugException (e); return null; } } // Load XMP sidecar var sidecar_file = GLib.FileFactory.NewForUri (sidecar_uri); if (sidecar_file.Exists) { file.ParseXmpSidecar (sidecar_res); } return file; } public static void SaveSafely (this TagLib.Image.File metadata, SafeUri photo_uri, bool always_sidecar) { if (always_sidecar || !metadata.Writeable || metadata.PossiblyCorrupt) { if (!always_sidecar && metadata.PossiblyCorrupt) { Hyena.Log.WarningFormat ("Metadata of file {0} may be corrupt, refusing to write to it, falling back to XMP sidecar.", photo_uri); } var sidecar_res = new GIOTagLibFileAbstraction () { Uri = GetSidecarUri (photo_uri) }; metadata.SaveXmpSidecar (sidecar_res); } else { metadata.Save (); } } private delegate SafeUri GenerateSideCarName (SafeUri photo_uri); private static GenerateSideCarName[] SidecarNameGenerators = { (p) => new SafeUri (p.AbsoluteUri + ".xmp"), (p) => p.ReplaceExtension (".xmp"), }; public static SafeUri GetSidecarUri (SafeUri photo_uri) { // First probe for existing sidecar files, use the one that's found. foreach (var generator in SidecarNameGenerators) { var name = generator (photo_uri); var file = GLib.FileFactory.NewForUri (name); if (file.Exists) { return name; } } // Fall back to the default strategy. return SidecarNameGenerators[0] (photo_uri); } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/UriList.cs0000644000175000017500000000310311503404762023125 0ustar00rubenruben00000000000000using System.Collections.Generic; using System.Text; using System; using Hyena; namespace FSpot.Utils { public class UriList : List { public UriList () : base() { } public UriList (string data) { LoadFromStrings (data.Split ('\n')); } public UriList (IEnumerable uris) { foreach (SafeUri uri in uris) { Add (uri); } } private void LoadFromStrings (IEnumerable items) { foreach (string i in items) { if (!i.StartsWith ("#")) { SafeUri uri; String s = i; if (i.EndsWith ("\r")) { s = i.Substring (0, i.Length - 1); } try { uri = new SafeUri (s); } catch { continue; } Add (uri); } } } public void AddUnknown (string unknown) { Add (new SafeUri (unknown)); } public override string ToString () { StringBuilder list = new StringBuilder (); foreach (SafeUri uri in this) { if (uri == null) break; list.Append (uri.ToString () + Environment.NewLine); } return list.ToString (); } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/DelayedOperation.cs0000644000175000017500000000374611503404762024777 0ustar00rubenruben00000000000000/* * Delay.cs * * Copyright 2007 Novell Inc. * * Author * Larry Ewing * * See COPYING for license information. * */ using System; namespace FSpot.Utils { public class DelayedOperation { object syncHandle = new object (); public DelayedOperation (uint interval, GLib.IdleHandler op) { this.op = op; this.interval = interval; } public DelayedOperation (GLib.IdleHandler op) { this.op = op; } uint source; uint interval; private GLib.IdleHandler op; private bool HandleOperation () { lock (syncHandle) { bool runagain = op (); if (!runagain) source = 0; return runagain; } } public void Start () { lock (syncHandle) { if (this.IsPending) return; if (interval != 0) source = GLib.Timeout.Add (interval, new GLib.TimeoutHandler (HandleOperation)); else source = GLib.Idle.Add (new GLib.IdleHandler (HandleOperation)); } } public bool IsPending { get { return source != 0; } } public void Connect (Gtk.Object obj) { if (obj == null) throw new ArgumentNullException ("obj"); obj.Destroyed += HandleDestroy; } private void HandleDestroy (object sender, System.EventArgs args) { this.Stop (); } public void Stop () { lock (syncHandle) { if (this.IsPending) { GLib.Source.Remove (source); source = 0; } } } public void Restart () { Stop (); Start (); } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/Tests/0000777000175000017500000000000011503407441022311 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/Tests/SidecarXmpExtensionsTests.cs0000644000175000017500000001525711503404762030013 0ustar00rubenruben00000000000000#if ENABLE_TESTS using NUnit.Framework; using System; using Hyena; using TagLib; using TagLib.IFD; using TagLib.IFD.Entries; using TagLib.IFD.Tags; using TagLib.Xmp; namespace FSpot.Utils.Tests { [TestFixture] public class SidecarXmpExtensionsTests { [SetUp] public void Initialize () { GLib.GType.Init (); } [Test] public void ValidateWithoutSidecar () { // Tests the file in its original state var uri = ImageTestHelper.CreateTempFile ("taglib-sample.jpg"); var res = new GIOTagLibFileAbstraction () { Uri = uri }; var file = File.Create (res) as TagLib.Image.File; Assert.IsNotNull (file); XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag; // Xmp.MicrosoftPhoto_1_.DateAcquired (XmpText/20) "2009-08-04T20:42:36Z" { var node = xmp.NodeTree; node = node.GetChild (XmpTag.MS_PHOTO_NS, "DateAcquired"); Assert.IsNotNull (node); Assert.AreEqual ("2009-08-04T20:42:36Z", node.Value); Assert.AreEqual (XmpNodeType.Simple, node.Type); Assert.AreEqual (0, node.Children.Count); } Assert.AreEqual (new string [] { "Kirche Sulzbach" }, file.ImageTag.Keywords); ImageTestHelper.DeleteTempFile (uri); } [Test] public void ValidateWithSidecar () { // Tests the file with a sidecar var uri = ImageTestHelper.CreateTempFile ("taglib-sample.jpg"); var res = new GIOTagLibFileAbstraction () { Uri = uri }; var sidecar_uri = ImageTestHelper.CopySidecarToTest (uri, "taglib-sample.xmp"); var sidecar_res = new GIOTagLibFileAbstraction () { Uri = sidecar_uri }; var file = File.Create (res) as TagLib.Image.File; Assert.IsNotNull (file); // Override by sidecar file bool success = file.ParseXmpSidecar (sidecar_res); Assert.IsTrue (success); XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag; // Xmp.MicrosoftPhoto_1_.DateAcquired (XmpText/20) "2009-08-04T20:42:36Z" { var node = xmp.NodeTree; node = node.GetChild (XmpTag.MS_PHOTO_NS, "DateAcquired"); Assert.IsNull (node); } Assert.AreEqual (new string [] { "F-Spot", "metadata", "test" }, file.ImageTag.Keywords); ImageTestHelper.DeleteTempFile (uri); ImageTestHelper.DeleteTempFile (sidecar_uri); } [Test] public void ValidateWithBrokenSidecar () { // Tests the file with a sidecar var uri = ImageTestHelper.CreateTempFile ("taglib-sample.jpg"); var res = new GIOTagLibFileAbstraction () { Uri = uri }; var sidecar_uri = ImageTestHelper.CopySidecarToTest (uri, "taglib-sample-broken.xmp"); var sidecar_res = new GIOTagLibFileAbstraction () { Uri = sidecar_uri }; var file = File.Create (res) as TagLib.Image.File; Assert.IsNotNull (file); // Override by sidecar file should fail bool success = file.ParseXmpSidecar (sidecar_res); Assert.IsFalse (success); XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag; // Xmp.MicrosoftPhoto_1_.DateAcquired (XmpText/20) "2009-08-04T20:42:36Z" { var node = xmp.NodeTree; node = node.GetChild (XmpTag.MS_PHOTO_NS, "DateAcquired"); Assert.AreEqual ("2009-08-04T20:42:36Z", node.Value); Assert.AreEqual (XmpNodeType.Simple, node.Type); Assert.AreEqual (0, node.Children.Count); } Assert.AreEqual (new string [] { "Kirche Sulzbach" }, file.ImageTag.Keywords); ImageTestHelper.DeleteTempFile (uri); ImageTestHelper.DeleteTempFile (sidecar_uri); } [Test] public void TestSidecarWrite () { var uri = ImageTestHelper.CreateTempFile ("taglib-sample.jpg"); var sidecar_uri = uri.ReplaceExtension (".xmp"); var res = new GIOTagLibFileAbstraction () { Uri = uri }; var sidecar_res = new GIOTagLibFileAbstraction () { Uri = sidecar_uri }; Assert.IsTrue (sidecar_uri.ToString ().EndsWith (".xmp")); var sidecar_file = GLib.FileFactory.NewForUri (sidecar_uri); Assert.IsFalse (sidecar_file.Exists); var file = File.Create (res) as TagLib.Image.File; Assert.IsNotNull (file); file.ImageTag.Keywords = new string [] { "Kirche Aarschot" }; // Validate writing of the sidecar bool success = file.SaveXmpSidecar (sidecar_res); Assert.IsTrue (success); Assert.IsTrue (sidecar_file.Exists); var target = "" + "Kirche SulzbachKirche Aa" + "rschot" + ""; string written; var read_res = new GIOTagLibFileAbstraction () { Uri = sidecar_uri }; using (var stream = read_res.ReadStream) { using (var reader = new System.IO.StreamReader (stream)) { written = reader.ReadToEnd (); } } Assert.AreEqual (target, written); // Check that the file is unchanged file = File.Create (res) as TagLib.Image.File; var keywords = file.ImageTag.Keywords; Assert.AreEqual (new string [] { "Kirche Sulzbach" }, keywords); ImageTestHelper.DeleteTempFile (uri); ImageTestHelper.DeleteTempFile (sidecar_uri); } } } #endif f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/Tests/ImageTestHelper.cs0000644000175000017500000000243611503404762025666 0ustar00rubenruben00000000000000#if ENABLE_TESTS using NUnit.Framework; using System; using Hyena; using TagLib; namespace FSpot.Utils.Tests { public static class ImageTestHelper { public static SafeUri CreateTempFile (string name) { var uri = new SafeUri (Environment.CurrentDirectory + "/../tests/data/" + name); var file = GLib.FileFactory.NewForUri (uri); var tmp = System.IO.Path.GetTempFileName ()+".jpg"; // hack! var uri2 = new SafeUri (tmp); var file2 = GLib.FileFactory.NewForUri (uri2); file.Copy (file2, GLib.FileCopyFlags.Overwrite, null, null); return uri2; } public static SafeUri CopySidecarToTest (SafeUri uri, string filename) { var target = uri.ReplaceExtension (".xmp"); var orig_uri = new SafeUri (Environment.CurrentDirectory + "/../tests/data/" + filename); var file = GLib.FileFactory.NewForUri (orig_uri); var file2 = GLib.FileFactory.NewForUri (target); file.Copy (file2, GLib.FileCopyFlags.Overwrite, null, null); return target; } public static void DeleteTempFile (SafeUri uri) { var file = GLib.FileFactory.NewForUri (uri); file.Delete (); } } } #endif f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/Tests/MetadataTest.cs0000644000175000017500000000735511503404762025231 0ustar00rubenruben00000000000000#if ENABLE_TESTS using NUnit.Framework; using System; using Hyena; using TagLib; using TagLib.IFD; using TagLib.IFD.Entries; using TagLib.IFD.Tags; using TagLib.Xmp; namespace FSpot.Utils.Tests { [TestFixture] public class MetadataTest { [SetUp] public void Initialize () { GLib.GType.Init (); } [Test] public void ValidateWithoutSidecar () { // Tests the file in its original state var uri = ImageTestHelper.CreateTempFile ("taglib-sample.jpg"); var file = Metadata.Parse (uri); Assert.IsNotNull (file); XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag; // Xmp.MicrosoftPhoto_1_.DateAcquired (XmpText/20) "2009-08-04T20:42:36Z" { var node = xmp.NodeTree; node = node.GetChild (XmpTag.MS_PHOTO_NS, "DateAcquired"); Assert.IsNotNull (node); Assert.AreEqual ("2009-08-04T20:42:36Z", node.Value); Assert.AreEqual (XmpNodeType.Simple, node.Type); Assert.AreEqual (0, node.Children.Count); } Assert.AreEqual (new string [] { "Kirche Sulzbach" }, file.ImageTag.Keywords); ImageTestHelper.DeleteTempFile (uri); } [Test] public void ValidateWithSidecar () { // Tests the file with a sidecar var uri = ImageTestHelper.CreateTempFile ("taglib-sample.jpg"); var sidecar_uri = ImageTestHelper.CopySidecarToTest (uri, "taglib-sample.xmp"); var file = Metadata.Parse (uri); Assert.IsNotNull (file); XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag; // Xmp.MicrosoftPhoto_1_.DateAcquired (XmpText/20) "2009-08-04T20:42:36Z" { var node = xmp.NodeTree; node = node.GetChild (XmpTag.MS_PHOTO_NS, "DateAcquired"); Assert.IsNull (node); } Assert.AreEqual (new string [] { "F-Spot", "metadata", "test" }, file.ImageTag.Keywords); ImageTestHelper.DeleteTempFile (uri); ImageTestHelper.DeleteTempFile (sidecar_uri); } [Test] public void ValidateWithBrokenSidecar () { // Tests the file with a sidecar var uri = ImageTestHelper.CreateTempFile ("taglib-sample.jpg"); var sidecar_uri = ImageTestHelper.CopySidecarToTest (uri, "taglib-sample-broken.xmp"); var file = Metadata.Parse (uri); Assert.IsNotNull (file); XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag; // Xmp.MicrosoftPhoto_1_.DateAcquired (XmpText/20) "2009-08-04T20:42:36Z" { var node = xmp.NodeTree; node = node.GetChild (XmpTag.MS_PHOTO_NS, "DateAcquired"); Assert.AreEqual ("2009-08-04T20:42:36Z", node.Value); Assert.AreEqual (XmpNodeType.Simple, node.Type); Assert.AreEqual (0, node.Children.Count); } Assert.AreEqual (new string [] { "Kirche Sulzbach" }, file.ImageTag.Keywords); ImageTestHelper.DeleteTempFile (uri); ImageTestHelper.DeleteTempFile (sidecar_uri); } [Test] public void ValidateWithBrokenMetadata () { // Tests the file with a sidecar var uri = ImageTestHelper.CreateTempFile ("taglib-sample-broken.jpg"); var sidecar_uri = ImageTestHelper.CopySidecarToTest (uri, "taglib-sample-broken.xmp"); var file = Metadata.Parse (uri); Assert.IsNull (file); ImageTestHelper.DeleteTempFile (uri); ImageTestHelper.DeleteTempFile (sidecar_uri); } } } #endif f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/Tests/XdgThumbnailSpecTests.cs0000644000175000017500000000106211503404762027062 0ustar00rubenruben00000000000000#if ENABLE_TESTS using NUnit.Framework; using System; using Hyena; using FSpot; namespace FSpot.Utils.Tests { [TestFixture] public class XdgThumbnailSpecTests { [SetUp] public void Initialize () { GLib.GType.Init (); } [Test] public void TestMissingFile () { XdgThumbnailSpec.DefaultLoader = (u) => { throw new Exception ("not found!"); }; var uri = new SafeUri ("file:///invalid"); var pixbuf = XdgThumbnailSpec.LoadThumbnail (uri, ThumbnailSize.Large); Assert.IsNull (pixbuf); } } } #endif f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/Tests/GIOTagLibFileAbstractionTests.cs0000644000175000017500000000647111503404762030365 0ustar00rubenruben00000000000000#if ENABLE_TESTS using NUnit.Framework; using System; using Hyena; using TagLib; using TagLib.IFD; using TagLib.IFD.Entries; using TagLib.IFD.Tags; using TagLib.Xmp; namespace FSpot.Utils.Tests { // This is a trimmed down test case from Taglib# to test the file abstraction. [TestFixture] public class GIOTagLibFileAbstractionTests { [SetUp] public void Initialize () { GLib.GType.Init (); } [Test] public void StraightIOTest () { var uri = ImageTestHelper.CreateTempFile ("taglib-sample.jpg"); var file = File.Create (uri.AbsolutePath) as TagLib.Image.File; Assert.IsTrue (file != null); Validate (file); ChangeMetadata (file); file = File.Create (uri.AbsolutePath) as TagLib.Image.File; Assert.IsTrue (file != null); Validate (file); ValidateChangedMetadata (file); ImageTestHelper.DeleteTempFile (uri); } [Test] public void GIOTest () { var uri = ImageTestHelper.CreateTempFile ("taglib-sample.jpg"); var res = new GIOTagLibFileAbstraction () { Uri = uri }; var file = File.Create (res) as TagLib.Image.File; Assert.IsTrue (file != null); Validate (file); ChangeMetadata (file); file = File.Create (res) as TagLib.Image.File; Assert.IsTrue (file != null); Validate (file); ValidateChangedMetadata (file); ImageTestHelper.DeleteTempFile (uri); } private void Validate (TagLib.Image.File file) { // Note: these don't correspond to the image data, only to the metadata. We hacked the file for size. Assert.AreEqual (2000, file.Properties.PhotoWidth); Assert.AreEqual (3008, file.Properties.PhotoHeight); Assert.AreEqual (96, file.Properties.PhotoQuality); var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag; Assert.IsNotNull (tag, "IFD tag not found"); var structure = tag.Structure; // Image.0x010F (Make/Ascii/18) "NIKON CORPORATION" { var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make); Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0"); Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!"); Assert.AreEqual ("NIKON CORPORATION", (entry as StringIFDEntry).Value); } XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag; // Xmp.MicrosoftPhoto_1_.DateAcquired (XmpText/20) "2009-08-04T20:42:36Z" { var node = xmp.NodeTree; node = node.GetChild (XmpTag.MS_PHOTO_NS, "DateAcquired"); Assert.IsNotNull (node); Assert.AreEqual ("2009-08-04T20:42:36Z", node.Value); Assert.AreEqual (XmpNodeType.Simple, node.Type); Assert.AreEqual (0, node.Children.Count); } } private void ChangeMetadata (TagLib.Image.File file) { file.ImageTag.Comment = "Testing!"; file.ImageTag.Keywords = new string [] { "One", "Two", "Three" }; file.Save (); } private void ValidateChangedMetadata (TagLib.Image.File file) { Assert.AreEqual ("Testing!", file.ImageTag.Comment); Assert.AreEqual (new string [] { "One", "Two", "Three" }, file.ImageTag.Keywords); } } } #endif f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/Tests/SafeUriTests.cs0000644000175000017500000000710411503404762025222 0ustar00rubenruben00000000000000#if ENABLE_TESTS using NUnit.Framework; using System; using Hyena; using FSpot; namespace FSpot.Utils.Tests { [TestFixture] public class SafeUriTests { static SafeUriTest[] tests = new SafeUriTest[] { new SafeUriTest () { Uri = "https://bugzilla.gnome.org/process_bug.cgi", IsURI = true, AbsoluteUri = "https://bugzilla.gnome.org/process_bug.cgi", Extension = ".cgi", BaseUri = "https://bugzilla.gnome.org", Filename = "process_bug.cgi", FilenameWithoutExtension = "process_bug" }, new SafeUriTest () { Uri = "file:///home/ruben/Desktop/F-Spot Vision.pdf", IsURI = true, AbsoluteUri = "file:///home/ruben/Desktop/F-Spot Vision.pdf", Extension = ".pdf", BaseUri = "file:///home/ruben/Desktop", Filename = "F-Spot Vision.pdf", FilenameWithoutExtension = "F-Spot Vision" }, new SafeUriTest () { Uri = "/home/ruben/Projects/f-spot/", IsURI = false, AbsoluteUri = "file:///home/ruben/Projects/f-spot/", Extension = "", BaseUri = "file:///home/ruben/Projects/f-spot", Filename = "", FilenameWithoutExtension = "" }, new SafeUriTest () { Uri = "/home/ruben/Projects/f-spot/README", IsURI = false, AbsoluteUri = "file:///home/ruben/Projects/f-spot/README", Extension = "", BaseUri = "file:///home/ruben/Projects/f-spot", Filename = "README", FilenameWithoutExtension = "README" }, new SafeUriTest () { Uri = "gphoto2://[usb:002,014]/", AbsoluteUri = "gphoto2://[usb:002,014]/", Extension = "", BaseUri = "gphoto2://[usb:002,014]", Filename = "", FilenameWithoutExtension = "" } }; [Test] public void TestFileUris () { foreach (var test in tests) { var suri = new SafeUri (test.Uri); Assert.AreEqual (suri.AbsoluteUri, test.AbsoluteUri, String.Format("AbsoluteUri for {0}", test.Uri)); Assert.AreEqual (suri.GetExtension (), test.Extension, String.Format("Extension for {0}", test.Uri)); Assert.AreEqual (suri.GetBaseUri ().ToString (), test.BaseUri, String.Format("BaseUri for {0}", test.Uri)); Assert.AreEqual (suri.GetFilename (), test.Filename, String.Format("Filename for {0}", test.Uri)); Assert.AreEqual (suri.GetFilenameWithoutExtension (), test.FilenameWithoutExtension, String.Format("FilenameWithoutExtension for {0}", test.Uri)); } } [Test] public void TestReplaceExtension () { var uri = new SafeUri ("file:///test/image.jpg", true); var goal = new SafeUri ("file:///test/image.xmp", true); Assert.AreEqual (goal, uri.ReplaceExtension (".xmp")); } } internal class SafeUriTest { public string Uri { get; set; } public bool IsURI { get; set; } public string AbsoluteUri { get; set; } public string Extension { get; set; } public string BaseUri { get; set; } public string Filename { get; set; } public string FilenameWithoutExtension { get; set; } } } #endif f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/GtkUtil.cs0000644000175000017500000000674011503404762023127 0ustar00rubenruben00000000000000/* * FSpot.Util.GtkUtil.cs * * Author(s): * Miguel de Icaza * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; namespace FSpot.Utils { public static class GtkUtil { public static Gtk.MenuItem MakeMenuItem (Gtk.Menu menu, string l, EventHandler e) { return MakeMenuItem (menu, l, e, true); } public static Gtk.MenuItem MakeMenuItem (Gtk.Menu menu, string l, EventHandler e, bool enabled) { Gtk.MenuItem i; Gtk.StockItem item = Gtk.StockItem.Zero; if (Gtk.StockManager.Lookup (l, ref item)) { i = new Gtk.ImageMenuItem (l, new Gtk.AccelGroup ()); } else { i = new Gtk.MenuItem (l); } if (e != null) i.Activated += e; i.Sensitive = enabled; menu.Append (i); i.Show (); return i; } public static Gtk.MenuItem MakeMenuItem (Gtk.Menu menu, string label, string image_name, EventHandler e, bool enabled) { Gtk.ImageMenuItem i = new Gtk.ImageMenuItem (label); i.Activated += e; i.Sensitive = enabled; i.Image = Gtk.Image.NewFromIconName (image_name, Gtk.IconSize.Menu); menu.Append (i); i.Show (); return i; } public static Gtk.MenuItem MakeCheckMenuItem (Gtk.Menu menu, string label, EventHandler e, bool enabled, bool active, bool as_radio) { Gtk.CheckMenuItem i = new Gtk.CheckMenuItem (label); i.Activated += e; i.Sensitive = enabled; i.DrawAsRadio = as_radio; i.Active = active; menu.Append(i); i.Show (); return i; } public static void MakeMenuSeparator (Gtk.Menu menu) { Gtk.SeparatorMenuItem i = new Gtk.SeparatorMenuItem (); menu.Append (i); i.Show (); } public static Gtk.ToolButton ToolButtonFromTheme (string theme_id, string label, bool important) { Gtk.ToolButton button = new Gtk.ToolButton (null, null); button.Label = label; button.IconName = theme_id; button.IsImportant = important; button.UseUnderline = true; return button; } public static Gdk.Pixbuf TryLoadIcon (Gtk.IconTheme theme, string[] names, int size, Gtk.IconLookupFlags flags) { try { var info = theme.ChooseIcon (names, size, flags); return info.LoadIcon (); } catch { try { return theme.LoadIcon ("gtk-missing-image", size, flags); } catch { return null; } } } public static Gdk.Pixbuf TryLoadIcon (Gtk.IconTheme theme, string icon_name, int size, Gtk.IconLookupFlags flags) { try { return theme.LoadIcon (icon_name, size, flags); } catch { try { return theme.LoadIcon ("gtk-missing-image", size, flags); } catch { return null; } } } public static void ModifyColors (Gtk.Widget widget) { try { widget.ModifyFg (Gtk.StateType.Normal, widget.Style.TextColors [(int)Gtk.StateType.Normal]); widget.ModifyFg (Gtk.StateType.Active, widget.Style.TextColors [(int)Gtk.StateType.Active]); widget.ModifyFg (Gtk.StateType.Selected, widget.Style.TextColors [(int)Gtk.StateType.Selected]); widget.ModifyBg (Gtk.StateType.Normal, widget.Style.BaseColors [(int)Gtk.StateType.Normal]); widget.ModifyBg (Gtk.StateType.Active, widget.Style.BaseColors [(int)Gtk.StateType.Active]); widget.ModifyBg (Gtk.StateType.Selected, widget.Style.BaseColors [(int)Gtk.StateType.Selected]); } catch { widget.ModifyFg (Gtk.StateType.Normal, widget.Style.Black); widget.ModifyBg (Gtk.StateType.Normal, widget.Style.Black); } } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/Vector.cs0000644000175000017500000000171311503404762023001 0ustar00rubenruben00000000000000using System; namespace FSpot.Utils { public class Vector { double X; double Y; public Vector (Gdk.Point p) { X = p.X; Y = p.Y; } public Vector (double x, double y) { X = x; Y = y; } public void Normalize () { double len = Length; X = X / len; Y = Y / len; } public double AngleBetween (Vector v) { return AngleBetween (this, v); } public static double AngleBetween (Vector v1, Vector v2) { double val = Dot (v1, v2) / (v1.Length * v2.Length); val = Math.Acos (val); if (!Right (v1, v2)) return -val; return val; } static bool Right (Vector v1, Vector v2) { return (v1.X * v2.Y - v1.Y * v2.X) > 0; } public static double Dot (Vector v1, Vector v2) { return v1.X * v2.X + v1.Y * v2.Y; } double Length { get { return Math.Sqrt (X * X + Y * Y); } } public override string ToString () { return String.Format ("v({0},{1}).{2}", X, Y, Length); } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/RecursiveFileEnumerator.cs0000644000175000017500000000641211503404762026351 0ustar00rubenruben00000000000000using System; using System.Collections; using System.Collections.Generic; using GLib; namespace FSpot.Utils { public class RecursiveFileEnumerator : IEnumerable { string root; public bool Recurse { get; set; } public bool CatchErrors { get; set; } public bool IgnoreSymlinks { get; set; } public RecursiveFileEnumerator (string root) { this.root = root; this.Recurse = true; this.CatchErrors = false; this.IgnoreSymlinks = false; } IEnumerable ScanForFiles (File root) { FileInfo root_info = null; try { root_info = root.QueryInfo ("standard::name,standard::type,standard::is-symlink", FileQueryInfoFlags.None, null); } catch (GException e) { if (!CatchErrors) throw e; yield break; } using (root_info) { if (root_info.IsSymlink && IgnoreSymlinks) { yield break; } else if (root_info.FileType == FileType.Regular) { yield return root; } else if (root_info.FileType == FileType.Directory) { foreach (var child in ScanDirectoryForFiles (root)) { yield return child; } } } } IEnumerable ScanDirectoryForFiles (File root_dir) { FileEnumerator enumerator = null; try { enumerator = root_dir.EnumerateChildren ("standard::name,standard::type,standard::is-symlink", FileQueryInfoFlags.None, null); } catch (GException e) { if (!CatchErrors) throw e; yield break; } while (true) { FileInfo info = null; try { info = enumerator.NextFile (); } catch (GException e) { if (!CatchErrors) throw e; continue; } if (info == null) break; File file = root_dir.GetChild (info.Name); // The code below looks like a duplication of ScanForFiles // (which could be invoked here instead), but doing so would // lead to a double type query on files (using QueryInfo). if (info.IsSymlink && IgnoreSymlinks) { continue; } else if (info.FileType == FileType.Regular) { yield return file; } else if (info.FileType == FileType.Directory && Recurse) { foreach (var child in ScanDirectoryForFiles (file)) { yield return child; } } info.Dispose (); } enumerator.Close (null); } public IEnumerator GetEnumerator () { var file = FileFactory.NewForUri (root); return ScanForFiles (file).GetEnumerator (); } IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator (); } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/MemorySurface.cs0000644000175000017500000000503011503404762024314 0ustar00rubenruben00000000000000/* * MemorySurface.cs * * Copyright 2007 Novell Inc. * * Author * Larry Ewing * Stephane Delcroix * * See COPYING for license information. * */ using System; using System.Runtime.InteropServices; namespace FSpot { public sealed class MemorySurface : Cairo.Surface { static class NativeMethods { [DllImport("libfspot")] public static extern IntPtr f_image_surface_create (Cairo.Format format, int width, int height); [DllImport("libfspot")] public static extern IntPtr f_image_surface_get_data (IntPtr surface); [DllImport("libfspot")] public static extern Cairo.Format f_image_surface_get_format (IntPtr surface); [DllImport("libfspot")] public static extern int f_image_surface_get_width (IntPtr surface); [DllImport("libfspot")] public static extern int f_image_surface_get_height (IntPtr surface); [DllImport("libfspot")] public static extern IntPtr f_pixbuf_to_cairo_surface (IntPtr handle); [DllImport("libfspot")] public static extern IntPtr f_pixbuf_from_cairo_surface (IntPtr handle); } public MemorySurface (Cairo.Format format, int width, int height) : this (NativeMethods.f_image_surface_create (format, width, height)) { } public MemorySurface (IntPtr handle) : base(handle, true) { if (DataPtr == IntPtr.Zero) throw new ApplicationException ("Missing image data"); } public IntPtr DataPtr { get { return NativeMethods.f_image_surface_get_data (Handle); } } public Cairo.Format Format { get { return NativeMethods.f_image_surface_get_format (Handle); } } public int Width { get { return NativeMethods.f_image_surface_get_width (Handle); } } public int Height { get { return NativeMethods.f_image_surface_get_height (Handle); } } public static MemorySurface CreateSurface (Gdk.Pixbuf pixbuf) { IntPtr surface = NativeMethods.f_pixbuf_to_cairo_surface (pixbuf.Handle); return new MemorySurface (surface); } public static Gdk.Pixbuf CreatePixbuf (MemorySurface mem) { IntPtr result = NativeMethods.f_pixbuf_from_cairo_surface (mem.Handle); return (Gdk.Pixbuf)GLib.Object.GetObject (result, true); } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/XdgThumbnailSpec.cs0000644000175000017500000001145311503404762024742 0ustar00rubenruben00000000000000using Gdk; using System; using System.Runtime.InteropServices; using Hyena; namespace FSpot.Utils { public enum ThumbnailSize { Normal, Large } public static class XdgThumbnailSpec { #region Public API public delegate Pixbuf PixbufLoader (SafeUri uri); public static PixbufLoader DefaultLoader { get; set; } public static Pixbuf LoadThumbnail (SafeUri uri, ThumbnailSize size) { return LoadThumbnail (uri, size, DefaultLoader); } public static Pixbuf LoadThumbnail (SafeUri uri, ThumbnailSize size, PixbufLoader loader) { var thumb_uri = ThumbUri (uri, size); var pixbuf = LoadFromUri (thumb_uri); if (!IsValid (uri, pixbuf)) { Log.DebugFormat ("Invalid thumbnail, reloading: {0}", uri); if (pixbuf != null) pixbuf.Dispose (); if (loader == null) return null; pixbuf = CreateFrom (uri, thumb_uri, size, loader); } return pixbuf; } public static void RemoveThumbnail (SafeUri uri) { var normal_uri = ThumbUri (uri, ThumbnailSize.Normal); var large_uri = ThumbUri (uri, ThumbnailSize.Large); var file = GLib.FileFactory.NewForUri (normal_uri); if (file.Exists) file.Delete (null); file = GLib.FileFactory.NewForUri (large_uri); if (file.Exists) file.Delete (null); } #endregion #region Private helpers const string ThumbMTimeOpt = "tEXt::Thumb::MTime"; const string ThumbUriOpt = "tEXt::Thumb::URI"; static SafeUri home_dir = new SafeUri (Environment.GetFolderPath (Environment.SpecialFolder.Personal)); private static Pixbuf CreateFrom (SafeUri uri, SafeUri thumb_uri, ThumbnailSize size, PixbufLoader loader) { var pixels = size == ThumbnailSize.Normal ? 128 : 256; Pixbuf pixbuf; try { pixbuf = loader (uri); } catch (Exception e) { Log.DebugFormat ("Failed loading image for thumbnailing: {0}", uri); Log.DebugException (e); return null; } double scale_x = (double) pixbuf.Width / pixels; double scale_y = (double) pixbuf.Height / pixels; double scale = Math.Max (1.0, Math.Max (scale_x, scale_y)); int target_x = (int) (pixbuf.Width / scale); int target_y = (int) (pixbuf.Height / scale); var thumb_pixbuf = pixbuf.ScaleSimple (target_x, target_y, InterpType.Bilinear); pixbuf.Dispose (); var file = GLib.FileFactory.NewForUri (uri); var info = file.QueryInfo ("time::modified", GLib.FileQueryInfoFlags.None, null); var mtime = info.GetAttributeULong ("time::modified").ToString (); thumb_pixbuf.Savev (thumb_uri.LocalPath, "png", new string [] {ThumbUriOpt, ThumbMTimeOpt, null}, new string [] {uri, mtime}); return thumb_pixbuf; } private static SafeUri ThumbUri (SafeUri uri, ThumbnailSize size) { var hash = CryptoUtil.Md5Encode (uri); return home_dir.Append (".thumbnails") .Append (size == ThumbnailSize.Normal ? "normal" : "large") .Append (hash + ".png"); } private static Pixbuf LoadFromUri (SafeUri uri) { var file = GLib.FileFactory.NewForUri (uri); if (!file.Exists) return null; Pixbuf pixbuf; using (var stream = new GLib.GioStream (file.Read (null))) { try { pixbuf = new Pixbuf (stream); } catch (Exception e) { file.Delete (); Log.DebugFormat ("Failed thumbnail: {0}", uri); Log.DebugException (e); return null; } } return pixbuf; } private static bool IsValid (SafeUri uri, Pixbuf pixbuf) { if (pixbuf == null) { return false; } if (pixbuf.GetOption (ThumbUriOpt) != uri.ToString ()) { return false; } var file = GLib.FileFactory.NewForUri (uri); if (!file.Exists) return false; var info = file.QueryInfo ("time::modified", GLib.FileQueryInfoFlags.None, null); if (pixbuf.GetOption (ThumbMTimeOpt) != info.GetAttributeULong ("time::modified").ToString ()) { return false; } return true; } #endregion } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/CairoUtils.cs0000644000175000017500000000113611503404762023614 0ustar00rubenruben00000000000000/* * FSpot.Utils.CairoUtils.cs * * Author(s) * Larry Ewing * * This is free software. See COPYING for details * */ using System; using Cairo; using System.Runtime.InteropServices; namespace FSpot.Utils { public class CairoUtils { public static Surface CreateSurface (Gdk.Drawable d) { int width, height; d.GetSize (out width, out height); XlibSurface surface = new XlibSurface (GdkUtils.GetXDisplay (d.Display), (IntPtr)GdkUtils.GetXid (d), GdkUtils.GetXVisual (d.Visual), width, height); return surface; } } } f-spot-0.8.2/src/Core/FSpot.Utils/FSpot.Utils/Cache.cs0000644000175000017500000000542411503404762022545 0ustar00rubenruben00000000000000/* * FSpot.Utils.Cache.cs * * Author(s): * Stephane Delcroix * * This is free software.See COPYING for details. * */ using System; using System.Collections.Generic; using Hyena; namespace FSpot.Utils { public class Cache { private const int DEFAULT_CACHE_SIZE = 10; protected int max_count; protected Dictionary hash; protected List mru; protected object o = new object (); public Cache () : this (DEFAULT_CACHE_SIZE) { } public Cache (int max_count) { this.max_count = max_count; hash = new Dictionary (max_count + 1); mru = new List (max_count + 1); } public virtual void Add (TKey key, TValue value) { lock (o) { if (mru.Contains (key)) mru.Remove (key); mru.Insert (0, key); hash [key] = value; while (mru.Count >= max_count) { hash.Remove (mru [max_count - 1]); mru.RemoveAt (max_count - 1); } } } public TValue Get (TKey key) { lock (o) { if (!mru.Contains (key)) return default(TValue); mru.Remove (key); mru.Insert (0, key); return hash [key]; } } public virtual void Clear () { lock (o) { mru.Clear (); hash.Clear (); } } public virtual void Remove (TKey key) { lock (o) { mru.Remove (key); hash.Remove (key); } } public bool TryRemove (TKey key) { try { Remove (key); return true; } catch (KeyNotFoundException) { return false; } } public bool Contains (TKey key) { return mru.Contains (key); } } public class DisposableCache : Cache, IDisposable { public DisposableCache () : base () { } public DisposableCache (int max_count) : base (max_count) { } public override void Clear () { lock (o) { foreach (TValue value in hash.Values) if (value is IDisposable) (value as IDisposable).Dispose (); mru.Clear (); hash.Clear (); } } public override void Add (TKey key, TValue value) { lock (o) { if (mru.Contains (key)) mru.Remove (key); mru.Insert (0, key); hash [key] = value; while (mru.Count >= max_count) { if (hash [mru [max_count - 1]] is IDisposable) (hash [mru [max_count - 1]] as IDisposable).Dispose (); hash.Remove (mru [max_count - 1]); mru.RemoveAt (max_count - 1); } } } public override void Remove (TKey key) { lock (o) { if (hash [key] is IDisposable) (hash [key] as IDisposable).Dispose (); mru.Remove (key); hash.Remove (key); } } public void Dispose () { Clear (); GC.SuppressFinalize (this); } ~DisposableCache () { Log.DebugFormat ("Finalizer called on {0}. Should be Disposed", GetType ()); Clear (); } } } f-spot-0.8.2/src/Extensions/0000777000175000017500000000000011503407451016173 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/0000777000175000017500000000000011503407453020170 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Flickr/0000777000175000017500000000000011503407455024430 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Flickr/FSpot.Exporters.Flickr/0000777000175000017500000000000011503407455030666 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Flickr/FSpot.Exporters.Flickr/FlickrRemote.cs0000644000175000017500000001441611503404762033603 0ustar00rubenruben00000000000000/* * Simple upload based on the api at * http://www.flickr.com/services/api/upload.api.html * * Modified by acs in order to use Flickr.Net * * Modified in order to use the new Auth API * * We use now the search API also * */ using System; using System.IO; using System.Text; using System.Collections; using FlickrNet; using FSpot; using FSpot.Core; using FSpot.Utils; using FSpot.Filters; using Hyena; namespace FSpot.Exporters.Flickr { public class FlickrRemote { public static Licenses licenses; private string frob; private string token; private Auth auth; private FlickrNet.Flickr flickr; public bool ExportTags; public bool ExportTagHierarchy; public bool ExportIgnoreTopLevel; public FSpot.ProgressItem Progress; public const string TOKEN_FLICKR = Preferences.APP_FSPOT_EXPORT_TOKENS + "flickr"; public const string TOKEN_23HQ = Preferences.APP_FSPOT_EXPORT_TOKENS + "23hq"; public const string TOKEN_ZOOOMR = Preferences.APP_FSPOT_EXPORT_TOKENS + "zooomr"; public FlickrRemote (string token, Service service) { if (token == null || token.Length == 0) { this.flickr = new FlickrNet.Flickr (service.ApiKey, service.Secret); this.token = null; } else { this.flickr = new FlickrNet.Flickr (service.ApiKey, service.Secret, token); this.token = token; } this.flickr.CurrentService = service.Id; } public string Token { get { return token; } set { token = value; flickr.AuthToken = value; } } public FlickrNet.Flickr Connection { get { return flickr; } } public License[] GetLicenses () { // Licenses won't change normally in a user session if (licenses == null) { try { licenses = flickr.PhotosLicensesGetInfo(); } catch (FlickrNet.FlickrApiException e ) { Log.Error (e.Code + ": " + e.Verbose ); return null; } } return licenses.LicenseCollection; } public ArrayList Search (string[] tags, int licenseId) { ArrayList photos_url = new ArrayList (); // Photos photos = flickr.PhotosSearchText (tags, licenseId); Photos photos = flickr.PhotosSearch (tags); if (photos != null) { foreach (FlickrNet.Photo photo in photos.PhotoCollection) { photos_url.Add (photo.ThumbnailUrl); } } return photos_url; } public ArrayList Search (string tags, int licenseId) { ArrayList photos_url = new ArrayList (); Photos photos = flickr.PhotosSearchText (tags, licenseId); if (photos != null) { foreach (FlickrNet.Photo photo in photos.PhotoCollection) { photos_url.Add (photo.ThumbnailUrl); } } return photos_url; } public Auth CheckLogin () { try { if (frob == null) { frob = flickr.AuthGetFrob (); if (frob == null) { Log.Error ("ERROR: Problems login in Flickr. Don't have a frob"); return null; } } } catch (Exception e) { Log.Error ("Error logging in: {0}", e.Message); } if (token == null) { try { auth = flickr.AuthGetToken(frob); token = auth.Token; flickr.AuthToken = token; return auth; } catch (FlickrNet.FlickrApiException ex) { Log.Error ("Problems logging in to Flickr - " + ex.Verbose); return null; } } auth = flickr.AuthCheckToken ("token"); return auth; } public string Upload (IPhoto photo, IFilter filter, bool is_public, bool is_family, bool is_friend) { if (token == null) { throw new Exception ("Must Login First"); } // FIXME flickr needs rotation string error_verbose; using (FilterRequest request = new FilterRequest (photo.DefaultVersion.Uri)) { try { string tags = null; filter.Convert (request); string path = request.Current.LocalPath; if (ExportTags && photo.Tags != null) { StringBuilder taglist = new StringBuilder (); FSpot.Core.Tag [] t = photo.Tags; FSpot.Core.Tag tag_iter = null; for (int i = 0; i < t.Length; i++) { if (i > 0) taglist.Append (","); taglist.Append (String.Format ("\"{0}\"", t[i].Name)); // Go through the tag parents if (ExportTagHierarchy) { tag_iter = t[i].Category; while (tag_iter != App.Instance.Database.Tags.RootCategory && tag_iter != null) { // Skip top level tags because they have no meaning in a linear tag database if (ExportIgnoreTopLevel && tag_iter.Category == App.Instance.Database.Tags.RootCategory) { break; } // FIXME Look if the tag is already there! taglist.Append (","); taglist.Append (String.Format ("\"{0}\"", tag_iter.Name)); tag_iter = tag_iter.Category; } } } tags = taglist.ToString (); } try { string photoid = flickr.UploadPicture (path, photo.Name, photo.Description, tags, is_public, is_family, is_friend); return photoid; } catch (FlickrNet.FlickrException ex) { Log.Error ("Problems uploading picture: " + ex.ToString()); error_verbose = ex.ToString(); } } catch (Exception e) { // FIXME we need to distinguish between file IO errors and xml errors here throw new System.Exception ("Error while uploading", e); } } throw new System.Exception (error_verbose); } public void TryWebLogin () { frob = flickr.AuthGetFrob (); string login_url = flickr.AuthCalcUrl (frob, FlickrNet.AuthLevel.Write); GtkBeans.Global.ShowUri (null, login_url); } public class Service { public string ApiKey; public string Secret; public SupportedService Id; public string Name; public string PreferencePath; public static Service [] Supported = { new Service (SupportedService.Flickr, "Flickr.com", "c6b39ee183385d9ce4ea188f85945016", "0a951ac44a423a04", TOKEN_FLICKR), new Service (SupportedService.TwentyThreeHQ, "23hq.com", "c6b39ee183385d9ce4ea188f85945016", "0a951ac44a423a04", TOKEN_23HQ), new Service (SupportedService.Zooomr, "Zooomr.com", "a2075d8ff1b7b059df761649835562e4", "6c66738681", TOKEN_ZOOOMR) }; public Service (SupportedService id, string name, string api_key, string secret, string pref) { Id = id; ApiKey = api_key; Secret = secret; Name = name; PreferencePath = pref; } public static Service FromSupported (SupportedService id) { foreach (Service s in Supported) { if (s.Id == id) return s; } throw new System.ArgumentException ("Unknown service type"); } } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Flickr/FSpot.Exporters.Flickr/FlickrExport.cs0000644000175000017500000004262411503404762033633 0ustar00rubenruben00000000000000using FlickrNet; using System; using System.Collections; using System.IO; using System.Threading; using Mono.Unix; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using FSpot.Utils; using FSpot.UI.Dialog; using Hyena; using Hyena.Widgets; using GtkBeans; namespace FSpot.Exporters.Flickr { public class TwentyThreeHQExport : FlickrExport { public override void Run (IBrowsableCollection selection) { Run (SupportedService.TwentyThreeHQ, selection, false); } } public class ZooomrExport : FlickrExport { public override void Run (IBrowsableCollection selection) { Run (SupportedService.Zooomr, selection, false); } } public class FlickrExport : FSpot.Extensions.IExporter { IBrowsableCollection selection; [GtkBeans.Builder.Object] Gtk.Dialog dialog; [GtkBeans.Builder.Object] Gtk.CheckButton scale_check; [GtkBeans.Builder.Object] Gtk.CheckButton tag_check; [GtkBeans.Builder.Object] Gtk.CheckButton hierarchy_check; [GtkBeans.Builder.Object] Gtk.CheckButton ignore_top_level_check; [GtkBeans.Builder.Object] Gtk.CheckButton open_check; [GtkBeans.Builder.Object] Gtk.SpinButton size_spin; [GtkBeans.Builder.Object] Gtk.ScrolledWindow thumb_scrolledwindow; [GtkBeans.Builder.Object] Gtk.Button auth_flickr; [GtkBeans.Builder.Object] Gtk.ProgressBar used_bandwidth; [GtkBeans.Builder.Object] Gtk.Button do_export_flickr; [GtkBeans.Builder.Object] Gtk.Label auth_label; [GtkBeans.Builder.Object] Gtk.RadioButton public_radio; [GtkBeans.Builder.Object] Gtk.CheckButton family_check; [GtkBeans.Builder.Object] Gtk.CheckButton friend_check; private GtkBeans.Builder builder; private string dialog_name = "flickr_export_dialog"; System.Threading.Thread command_thread; ThreadProgressDialog progress_dialog; ProgressItem progress_item; public const string EXPORT_SERVICE = "flickr/"; public const string SCALE_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "scale"; public const string SIZE_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "size"; public const string BROWSER_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "browser"; public const string TAGS_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "tags"; public const string PUBLIC_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "public"; public const string FAMILY_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "family"; public const string FRIENDS_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "friends"; public const string TAG_HIERARCHY_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "tag_hierarchy"; public const string IGNORE_TOP_LEVEL_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "ignore_top_level"; bool open; bool scale; bool is_public; bool is_friend; bool is_family; string token; int photo_index; int size; Auth auth; FlickrRemote fr; private FlickrRemote.Service current_service; string auth_text; private State state; private enum State { Disconnected, Connected, InAuth, Authorized } private State CurrentState { get { return state; } set { switch (value) { case State.Disconnected: auth_label.Text = auth_text; auth_flickr.Sensitive = true; do_export_flickr.Sensitive = false; auth_flickr.Label = Catalog.GetString ("Authorize"); used_bandwidth.Visible = false; break; case State.Connected: auth_flickr.Sensitive = true; do_export_flickr.Sensitive = false; auth_label.Text = string.Format (Catalog.GetString ("Return to this window after you have finished the authorization process on {0} and click the \"Complete Authorization\" button below"), current_service.Name); auth_flickr.Label = Catalog.GetString ("Complete Authorization"); used_bandwidth.Visible = false; break; case State.InAuth: auth_flickr.Sensitive = false; auth_label.Text = string.Format (Catalog.GetString ("Logging into {0}"), current_service.Name); auth_flickr.Label = Catalog.GetString ("Checking credentials..."); do_export_flickr.Sensitive = false; used_bandwidth.Visible = false; break; case State.Authorized: do_export_flickr.Sensitive = true; auth_flickr.Sensitive = true; auth_label.Text = System.String.Format (Catalog.GetString ("Welcome {0} you are connected to {1}"), auth.User.Username, current_service.Name); auth_flickr.Label = String.Format (Catalog.GetString ("Sign in as a different user"), auth.User.Username); used_bandwidth.Visible = !fr.Connection.PeopleGetUploadStatus().IsPro && fr.Connection.PeopleGetUploadStatus().BandwidthMax > 0; if (used_bandwidth.Visible) { used_bandwidth.Fraction = fr.Connection.PeopleGetUploadStatus().PercentageUsed; used_bandwidth.Text = string.Format (Catalog.GetString("Used {0} of your allowed {1} monthly quota"), GLib.Format.SizeForDisplay (fr.Connection.PeopleGetUploadStatus().BandwidthUsed), GLib.Format.SizeForDisplay (fr.Connection.PeopleGetUploadStatus().BandwidthMax)); } break; } state = value; } } public FlickrExport (IBrowsableCollection selection, bool display_tags) : this (SupportedService.Flickr, selection, display_tags) { } public FlickrExport (SupportedService service, IBrowsableCollection selection, bool display_tags) : this () { Run (service, selection, display_tags); } public FlickrExport () { } public virtual void Run (IBrowsableCollection selection) { Run (SupportedService.Flickr, selection, false); } public void Run (SupportedService service, IBrowsableCollection selection, bool display_tags) { this.selection = selection; this.current_service = FlickrRemote.Service.FromSupported (service); var view = new TrayView (selection); view.DisplayTags = display_tags; view.DisplayDates = false; builder = new GtkBeans.Builder (null, "flickr_export.ui", null); builder.Autoconnect (this); Dialog.Modal = false; Dialog.TransientFor = null; thumb_scrolledwindow.Add (view); HandleSizeActive (null, null); public_radio.Toggled += HandlePublicChanged; tag_check.Toggled += HandleTagChanged; hierarchy_check.Toggled += HandleHierarchyChanged; HandleTagChanged (null, null); HandleHierarchyChanged (null, null); Dialog.ShowAll (); Dialog.Response += HandleResponse; auth_flickr.Clicked += HandleClicked; auth_text = string.Format (auth_label.Text, current_service.Name); auth_label.Text = auth_text; used_bandwidth.Visible = false; LoadPreference (SCALE_KEY); LoadPreference (SIZE_KEY); LoadPreference (BROWSER_KEY); LoadPreference (TAGS_KEY); LoadPreference (TAG_HIERARCHY_KEY); LoadPreference (IGNORE_TOP_LEVEL_KEY); LoadPreference (PUBLIC_KEY); LoadPreference (FAMILY_KEY); LoadPreference (FRIENDS_KEY); LoadPreference (current_service.PreferencePath); do_export_flickr.Sensitive = false; fr = new FlickrRemote (token, current_service); if (token != null && token.Length > 0) { StartAuth (); } } public bool StartAuth () { CurrentState = State.InAuth; if (command_thread == null || ! command_thread.IsAlive) { command_thread = new Thread (new ThreadStart (CheckAuthorization)); command_thread.Start (); } return true; } public void CheckAuthorization () { AuthorizationEventArgs args = new AuthorizationEventArgs (); try { args.Auth = fr.CheckLogin (); } catch (FlickrException e) { args.Exception = e; } catch (Exception e) { HigMessageDialog md = new HigMessageDialog (Dialog, Gtk.DialogFlags.Modal | Gtk.DialogFlags.DestroyWithParent, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, Catalog.GetString ("Unable to log on"), e.Message); md.Run (); md.Destroy (); return; } ThreadAssist.ProxyToMain (() => { do_export_flickr.Sensitive = args.Auth != null; if (args.Auth != null) { token = args.Auth.Token; auth = args.Auth; CurrentState = State.Authorized; Preferences.Set (current_service.PreferencePath, token); } else { CurrentState = State.Disconnected; } }); } private class AuthorizationEventArgs : System.EventArgs { Exception e; Auth auth; public Exception Exception { get { return e; } set { e = value; } } public Auth Auth { get { return auth; } set { auth = value; } } public AuthorizationEventArgs () { } } public void HandleSizeActive (object sender, System.EventArgs args) { size_spin.Sensitive = scale_check.Active; } private void Logout () { token = null; auth = null; fr = new FlickrRemote (token, current_service); Preferences.Set (current_service.PreferencePath, String.Empty); CurrentState = State.Disconnected; } private void Login () { try { fr = new FlickrRemote (token, current_service); fr.TryWebLogin(); CurrentState = State.Connected; } catch (Exception e) { if (e is FlickrApiException && (e as FlickrApiException).Code == 98) { Logout (); Login (); } else { HigMessageDialog md = new HigMessageDialog (Dialog, Gtk.DialogFlags.Modal | Gtk.DialogFlags.DestroyWithParent, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, Catalog.GetString ("Unable to log on"), e.Message); md.Run (); md.Destroy (); CurrentState = State.Disconnected; } } } private void HandleProgressChanged (ProgressItem item) { //System.Console.WriteLine ("Changed value = {0}", item.Value); progress_dialog.Fraction = (photo_index - 1.0 + item.Value) / (double) selection.Count; } FileInfo info; private void HandleFlickrProgress (object sender, UploadProgressEventArgs args) { if (args.UploadComplete) { progress_dialog.Fraction = photo_index / (double) selection.Count; progress_dialog.ProgressText = String.Format (Catalog.GetString ("Waiting for response {0} of {1}"), photo_index, selection.Count); } progress_dialog.Fraction = (photo_index - 1.0 + (args.Bytes / (double) info.Length)) / (double) selection.Count; } private class DateComparer : IComparer { public int Compare (object left, object right) { return DateTime.Compare ((left as IPhoto).Time, (right as IPhoto).Time); } } private void Upload () { progress_item = new ProgressItem (); progress_item.Changed += HandleProgressChanged; fr.Connection.OnUploadProgress += HandleFlickrProgress; System.Collections.ArrayList ids = new System.Collections.ArrayList (); IPhoto [] photos = selection.Items; Array.Sort (photos, new DateComparer ()); for (int index = 0; index < photos.Length; index++) { try { IPhoto photo = photos [index]; progress_dialog.Message = System.String.Format ( Catalog.GetString ("Uploading picture \"{0}\""), photo.Name); progress_dialog.Fraction = photo_index / (double)selection.Count; photo_index++; progress_dialog.ProgressText = System.String.Format ( Catalog.GetString ("{0} of {1}"), photo_index, selection.Count); info = new FileInfo (photo.DefaultVersion.Uri.LocalPath); FilterSet stack = new FilterSet (); if (scale) stack.Add (new ResizeFilter ((uint)size)); string id = fr.Upload (photo, stack, is_public, is_family, is_friend); ids.Add (id); if (App.Instance.Database != null && photo is FSpot.Photo) App.Instance.Database.Exports.Create ((photo as FSpot.Photo).Id, (photo as FSpot.Photo).DefaultVersionId, ExportStore.FlickrExportType, auth.User.UserId + ":" + auth.User.Username + ":" + current_service.Name + ":" + id); } catch (System.Exception e) { progress_dialog.Message = String.Format (Catalog.GetString ("Error Uploading To {0}: {1}"), current_service.Name, e.Message); progress_dialog.ProgressText = Catalog.GetString ("Error"); Log.Exception (e); if (progress_dialog.PerformRetrySkip ()) { index--; photo_index--; } } } progress_dialog.Message = Catalog.GetString ("Done Sending Photos"); progress_dialog.Fraction = 1.0; progress_dialog.ProgressText = Catalog.GetString ("Upload Complete"); progress_dialog.ButtonLabel = Gtk.Stock.Ok; if (open && ids.Count != 0) { string view_url; if (current_service.Name == "Zooomr.com") view_url = string.Format ("http://www.{0}/photos/{1}/", current_service.Name, auth.User.Username); else { view_url = string.Format ("http://www.{0}/tools/uploader_edit.gne?ids", current_service.Name); bool first = true; foreach (string id in ids) { view_url = view_url + (first ? "=" : ",") + id; first = false; } } GtkBeans.Global.ShowUri (Dialog.Screen, view_url); } } private void HandleClicked (object sender, System.EventArgs args) { switch (CurrentState) { case State.Disconnected: Login (); break; case State.Connected: StartAuth (); break; case State.InAuth: break; case State.Authorized: Logout (); Login (); break; } } private void HandlePublicChanged (object sender, EventArgs args) { bool sensitive = ! public_radio.Active; friend_check.Sensitive = sensitive; family_check.Sensitive = sensitive; } private void HandleTagChanged (object sender, EventArgs args) { hierarchy_check.Sensitive = tag_check.Active; } private void HandleHierarchyChanged (object sender, EventArgs args) { ignore_top_level_check.Sensitive = hierarchy_check.Active; } private void HandleResponse (object sender, Gtk.ResponseArgs args) { if (args.ResponseId != Gtk.ResponseType.Ok) { if (command_thread != null && command_thread.IsAlive) command_thread.Abort (); Dialog.Destroy (); return; } if (fr.CheckLogin() == null) { do_export_flickr.Sensitive = false; HigMessageDialog md = new HigMessageDialog (Dialog, Gtk.DialogFlags.Modal | Gtk.DialogFlags.DestroyWithParent, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, Catalog.GetString ("Unable to log on."), string.Format (Catalog.GetString ("F-Spot was unable to log on to {0}. Make sure you have given the authentication using {0} web browser interface."), current_service.Name)); md.Run (); md.Destroy (); return; } fr.ExportTags = tag_check.Active; fr.ExportTagHierarchy = hierarchy_check.Active; fr.ExportIgnoreTopLevel = ignore_top_level_check.Active; open = open_check.Active; scale = scale_check.Active; is_public = public_radio.Active; is_family = family_check.Active; is_friend = friend_check.Active; if (scale) size = size_spin.ValueAsInt; command_thread = new Thread (new ThreadStart (Upload)); command_thread.Name = Catalog.GetString ("Uploading Pictures"); Dialog.Destroy (); progress_dialog = new ThreadProgressDialog (command_thread, selection.Count); progress_dialog.Start (); // Save these settings for next time Preferences.Set (SCALE_KEY, scale); Preferences.Set (SIZE_KEY, size); Preferences.Set (BROWSER_KEY, open); Preferences.Set (TAGS_KEY, tag_check.Active); Preferences.Set (PUBLIC_KEY, public_radio.Active); Preferences.Set (FAMILY_KEY, family_check.Active); Preferences.Set (FRIENDS_KEY, friend_check.Active); Preferences.Set (TAG_HIERARCHY_KEY, hierarchy_check.Active); Preferences.Set (IGNORE_TOP_LEVEL_KEY, ignore_top_level_check.Active); Preferences.Set (current_service.PreferencePath, fr.Token); } void LoadPreference (string key) { switch (key) { case SCALE_KEY: if (scale_check.Active != Preferences.Get (key)) scale_check.Active = Preferences.Get (key); break; case SIZE_KEY: size_spin.Value = (double) Preferences.Get (key); break; case BROWSER_KEY: if (open_check.Active != Preferences.Get (key)) open_check.Active = Preferences.Get (key); break; case TAGS_KEY: if (tag_check.Active != Preferences.Get (key)) tag_check.Active = Preferences.Get (key); break; case TAG_HIERARCHY_KEY: if (hierarchy_check.Active != Preferences.Get (key)) hierarchy_check.Active = Preferences.Get (key); break; case IGNORE_TOP_LEVEL_KEY: if (ignore_top_level_check.Active != Preferences.Get (key)) ignore_top_level_check.Active = Preferences.Get (key); break; case FlickrRemote.TOKEN_FLICKR: case FlickrRemote.TOKEN_23HQ: case FlickrRemote.TOKEN_ZOOOMR: token = Preferences.Get (key); break; case PUBLIC_KEY: if (public_radio.Active != Preferences.Get (key)) public_radio.Active = Preferences.Get (key); break; case FAMILY_KEY: if (family_check.Active != Preferences.Get (key)) family_check.Active = Preferences.Get (key); break; case FRIENDS_KEY: if (friend_check.Active != Preferences.Get (key)) friend_check.Active = Preferences.Get (key); break; /* case Preferences.EXPORT_FLICKR_EMAIL: /* case Preferences.EXPORT_FLICKR_EMAIL: email_entry.Text = (string) val; break; */ } } private Gtk.Dialog Dialog { get { if (dialog == null) dialog = new Gtk.Dialog (builder.GetRawObject (dialog_name)); return dialog; } } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Flickr/Resources/0000777000175000017500000000000011503407455026402 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Flickr/Resources/FlickrExport.addin.xml0000644000175000017500000000127211430555235032613 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Flickr/Resources/flickr_export.ui0000644000175000017500000007227111431562107031615 0ustar00rubenruben00000000000000 Export dialog False True vertical True 6 True 0 none True 12 180 True True automatic automatic in True <b>Photos</b> True 0 True vertical 6 True 0 none True 12 True vertical 6 True F-Spot needs your authorization in order to upload photos to your {0} account. Press the "Authorize" button to open a web browser and give F-Spot the authorization. True False False 0 True True False True 0 0 True 2 True gtk-yes False False 0 True Authorize True False False 1 False False 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 _View photos in browser when done uploading True True False True True True False False 3 True False False 4 True <b>Account</b> True False False 0 True 0 none True 12 True vertical 6 Private True True False True True False False 0 True 24 True 6 Visible to Friends True True False True True False False 0 Visible to Family True True False True True False False 1 False False 1 Public True True False True True True private_radio False False 2 True <b>Viewing permissions</b> True False False 1 True 0 none True 12 True vertical 6 True _Resize to: True True False True True False False 0 True True adjustment1 1 False False 1 True pixels False False 2 0 True vertical 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical _Export tags True True False True True False False 0 Export tag _hierarchy True True False True True False False 1 Ignore _top level tags True True False True True False False 2 False 1 False False 1 True <b>Style</b> True False False 2 1 1 True end gtk-cancel True True True False True False False 0 _Export True True True False True False False 1 False end 0 button13 do_export_flickr 400 10000 1 10 10 f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Flickr/Makefile.in0000644000175000017500000006677711503407265026517 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Exporters/FSpot.Exporters.Flickr ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Exporters.Flickr TARGET = library LINK = $(REF_FSPOT_EXTENSION_FLICKREXPORT) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Exporters.Flickr/FlickrExport.cs \ FSpot.Exporters.Flickr/FlickrRemote.cs RESOURCES = \ Resources/flickr_export.ui \ Resources/FlickrExport.addin.xml # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.Flickr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.Flickr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Flickr/Makefile.am0000644000175000017500000000053411431562107026456 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Exporters.Flickr TARGET = library LINK = $(REF_FSPOT_EXTENSION_FLICKREXPORT) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Exporters.Flickr/FlickrExport.cs \ FSpot.Exporters.Flickr/FlickrRemote.cs RESOURCES = \ Resources/flickr_export.ui \ Resources/FlickrExport.addin.xml include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.CD/0000777000175000017500000000000011503407453023502 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.CD/FSpot.Exporters.CD/0000777000175000017500000000000011503407453027014 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.CD/FSpot.Exporters.CD/CDExportDialog.cs0000644000175000017500000000571011503404762032152 0ustar00rubenruben00000000000000using System; using System.IO; using System.Reflection; using System.Runtime.InteropServices; using Mono.Unix; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using Hyena; using FSpot.UI.Dialog; using GLib; using Gtk; using GtkBeans; namespace FSpot.Exporters.CD { class CDExportDialog : BuilderDialog { Gtk.Window listwindow; System.Uri dest; [GtkBeans.Builder.Object] Button browse_button; [GtkBeans.Builder.Object] ScrolledWindow thumb_scrolledwindow; [GtkBeans.Builder.Object] CheckButton remove_check; [GtkBeans.Builder.Object] Label size_label; [GtkBeans.Builder.Object] Frame previous_frame; public bool Clean { get { return remove_check.Active; } } public CDExportDialog (IBrowsableCollection collection, System.Uri dest) : base (Assembly.GetExecutingAssembly (), "CDExport.ui", "cd_export_dialog") { this.dest = dest; // Calculate the total size long total_size = 0; string path; System.IO.FileInfo file_info; foreach (IPhoto item in collection.Items) { path = item.DefaultVersion.Uri.LocalPath; if (System.IO.File.Exists (path)) { file_info = new System.IO.FileInfo (path); total_size += file_info.Length; } } var view = new TrayView (collection); view.DisplayDates = false; view.DisplayTags = false; view.DisplayRatings = false; this.Modal = false; this.TransientFor = null; size_label.Text = Format.SizeForDisplay (total_size); thumb_scrolledwindow.Add (view); this.ShowAll (); previous_frame.Visible = IsEmpty (dest); browse_button.Clicked += HandleBrowseExisting; } bool IsEmpty (System.Uri path) { foreach (GLib.FileEnumerator f in FileFactory.NewForUri (path).EnumerateChildren ("*", FileQueryInfoFlags.None, null)) return true; return false; } void HandleBrowseExisting (object sender, System.EventArgs args) { if (listwindow == null) { listwindow = new Gtk.Window ("Pending files to write"); listwindow.SetDefaultSize (400, 200); listwindow.DeleteEvent += delegate (object o, Gtk.DeleteEventArgs e) {(o as Gtk.Window).Destroy (); listwindow = null;}; Gtk.TextView view = new Gtk.TextView (); Gtk.ScrolledWindow sw = new Gtk.ScrolledWindow (); sw.Add (view); listwindow.Add (sw); } else { ((listwindow.Child as Gtk.ScrolledWindow).Child as Gtk.TextView).Buffer.Text = ""; } ListAll (((listwindow.Child as Gtk.ScrolledWindow).Child as Gtk.TextView).Buffer, dest); listwindow.ShowAll (); } void ListAll (Gtk.TextBuffer t, System.Uri path) { GLib.File f = FileFactory.NewForUri (path); foreach (GLib.FileInfo info in f.EnumerateChildren ("*", FileQueryInfoFlags.None, null)) { t.Text += new System.Uri (path, info.Name).ToString () + Environment.NewLine; if (info.FileType == FileType.Directory) ListAll (t, new System.Uri (path, info.Name + "/")); } } ~CDExportDialog () { if (listwindow != null) listwindow.Destroy (); } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.CD/FSpot.Exporters.CD/CDExport.cs0000644000175000017500000001124111503404762031026 0ustar00rubenruben00000000000000/* * CDExport.cs * * Authors: * Larry Ewing * Lorenzo Milesi * * Copyright (c) 2007-2009 Novell, Inc. * * This is free software. See COPYING for details. */ using System; using System.IO; using System.Reflection; using System.Runtime.InteropServices; using Mono.Unix; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using Hyena; using FSpot.UI.Dialog; using GLib; using Gtk; using GtkBeans; namespace FSpot.Exporters.CD { public class CDExport : FSpot.Extensions.IExporter { IBrowsableCollection selection; System.Uri dest = new System.Uri ("burn:///"); int photo_index; bool clean; CDExportDialog dialog; ThreadProgressDialog progress_dialog; System.Threading.Thread command_thread; public CDExport () { } public void Run (IBrowsableCollection selection) { this.selection = selection; dialog = new CDExportDialog (selection, dest); //LoadHistory (); if (dialog.Run () != (int)ResponseType.Ok) { dialog.Destroy (); return; } clean = dialog.Clean; command_thread = new System.Threading.Thread (new System.Threading.ThreadStart (Transfer)); command_thread.Name = Catalog.GetString ("Transferring Pictures"); progress_dialog = new ThreadProgressDialog (command_thread, selection.Count); progress_dialog.Start (); dialog.Destroy (); } [DllImport ("libc")] extern static int system (string program); // //FIXME: rewrite this as a Filter public static GLib.File UniqueName (System.Uri path, string shortname) { int i = 1; GLib.File dest = FileFactory.NewForUri (new System.Uri (path, shortname)); while (dest.Exists) { string numbered_name = System.String.Format ("{0}-{1}{2}", System.IO.Path.GetFileNameWithoutExtension (shortname), i++, System.IO.Path.GetExtension (shortname)); dest = FileFactory.NewForUri (new System.Uri (path, numbered_name)); } return dest; } void Clean (System.Uri path) { GLib.File source = FileFactory.NewForUri (path); foreach (GLib.FileInfo info in source.EnumerateChildren ("*", FileQueryInfoFlags.None, null)) { if (info.FileType == FileType.Directory) Clean (new System.Uri(path, info.Name + "/")); FileFactory.NewForUri (new System.Uri (path, info.Name)).Delete (); } } public void Transfer () { try { bool result = true; if (clean) Clean (dest); foreach (IPhoto photo in selection.Items) { //FIXME need to implement the uniquename as a filter using (FilterRequest request = new FilterRequest (photo.DefaultVersion.Uri)) { GLib.File source = FileFactory.NewForUri (request.Current.ToString ()); GLib.File target = UniqueName (dest, photo.Name); FileProgressCallback cb = Progress; progress_dialog.Message = System.String.Format (Catalog.GetString ("Transferring picture \"{0}\" To CD"), photo.Name); progress_dialog.Fraction = photo_index / (double) selection.Count; progress_dialog.ProgressText = System.String.Format (Catalog.GetString ("{0} of {1}"), photo_index, selection.Count); result &= source.Copy (target, FileCopyFlags.None, null, cb); } photo_index++; } // FIXME the error dialog here is ugly and needs improvement when strings are not frozen. if (result) { progress_dialog.Message = Catalog.GetString ("Done Sending Photos"); progress_dialog.Fraction = 1.0; progress_dialog.ProgressText = Catalog.GetString ("Transfer Complete"); progress_dialog.ButtonLabel = Gtk.Stock.Ok; progress_dialog.Hide (); system ("brasero -n"); } else { throw new System.Exception (System.String.Format ("{0}{3}{1}{3}{2}", progress_dialog.Message, Catalog.GetString ("Error While Transferring"), result.ToString (), System.Environment.NewLine)); } } catch (System.Exception e) { Hyena.Log.DebugException (e); progress_dialog.Message = e.ToString (); progress_dialog.ProgressText = Catalog.GetString ("Error Transferring"); return; } ThreadAssist.ProxyToMain (() => { progress_dialog.Destroy (); }); } private void Progress (long current_num_bytes, long total_num_bytes) { progress_dialog.ProgressText = Catalog.GetString ("copying..."); if (total_num_bytes > 0) progress_dialog.Fraction = current_num_bytes / (double)total_num_bytes; } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.CD/Resources/0000777000175000017500000000000011503407453025454 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.CD/Resources/CDExport.ui0000644000175000017500000002543311430555235027507 0ustar00rubenruben00000000000000 True Create CD dialog False True vertical True vertical True 0 none True 12 True vertical 6 512 350 True True automatic automatic 0 True 0 none True 12 True 12 _Write only these photos to CD True False True True False False 0 _Browse Previously Scheduled Files True True False True False False 1 True <b><i>There are some previously scheduled items to write</i></b> True 1 True True Size of the exported selection: False False 0 True Size False False 1 2 True <b>Photos to Burn</b> True 0 1 True end gtk-cancel True True True False True False False 0 _Export True True True False True False False 1 False end 0 cancelbutton6 export_button f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.CD/Resources/CDExport.addin.xml0000644000175000017500000000071211430555235030741 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.CD/Makefile.in0000644000175000017500000006673011503407263025556 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Exporters/FSpot.Exporters.CD ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Exporters.CD TARGET = library LINK = $(REF_FSPOT_EXTENSION_CDEXPORT) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Exporters.CD/CDExport.cs \ FSpot.Exporters.CD/CDExportDialog.cs RESOURCES = \ Resources/CDExport.addin.xml \ Resources/CDExport.ui # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.CD/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.CD/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.CD/Makefile.am0000644000175000017500000000050111430555235025527 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Exporters.CD TARGET = library LINK = $(REF_FSPOT_EXTENSION_CDEXPORT) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Exporters.CD/CDExport.cs \ FSpot.Exporters.CD/CDExportDialog.cs RESOURCES = \ Resources/CDExport.addin.xml \ Resources/CDExport.ui include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.SmugMug/0000777000175000017500000000000011503407460024576 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.SmugMug/FSpot.Exporters.SmugMug/0000777000175000017500000000000011503407460031206 5ustar00rubenruben00000000000000SmugMugAccount.cs0000644000175000017500000000273011503404762034357 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.SmugMug/FSpot.Exporters.SmugMugusing System; using System.Net; using System.IO; using System.Text; using System.Threading; using System.Collections; using System.Collections.Specialized; using System.Web; using Mono.Unix; using Gtk; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using Hyena; using FSpot.UI.Dialog; using Gnome.Keyring; using SmugMugNet; namespace FSpot.Exporters.SmugMug { public class SmugMugAccount { private string username; private string password; private SmugMugApi smugmug_proxy; public SmugMugAccount (string username, string password) { this.username = username; this.password = password; } public SmugMugApi Connect () { Log.Debug ("SmugMug.Connect() " + username); SmugMugApi proxy = new SmugMugApi (username, password); ServicePointManager.CertificatePolicy = new NoCheckCertificatePolicy (); proxy.Login (); this.smugmug_proxy = proxy; return proxy; } private void MarkChanged() { smugmug_proxy = null; } public bool Connected { get { return (smugmug_proxy != null && smugmug_proxy.Connected); } } public string Username { get { return username; } set { if (username != value) { username = value; MarkChanged (); } } } public string Password { get { return password; } set { if (password != value) { password = value; MarkChanged (); } } } public SmugMugApi SmugMug { get { return smugmug_proxy; } } } } SmugMugAccountDialog.cs0000644000175000017500000000575611503404762035512 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.SmugMug/FSpot.Exporters.SmugMugusing System; using System.Net; using System.IO; using System.Text; using System.Threading; using System.Collections; using System.Collections.Specialized; using System.Web; using Mono.Unix; using Gtk; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using Hyena; using FSpot.UI.Dialog; using Gnome.Keyring; using SmugMugNet; namespace FSpot.Exporters.SmugMug { public class SmugMugAccountDialog { public SmugMugAccountDialog (Gtk.Window parent) : this (parent, null) { Dialog.Response += HandleAddResponse; add_button.Sensitive = false; } public SmugMugAccountDialog (Gtk.Window parent, SmugMugAccount account) { builder = new GtkBeans.Builder (null, "smugmug_add_dialog.ui", null); builder.Autoconnect (this); Dialog.Modal = false; Dialog.TransientFor = parent; Dialog.DefaultResponse = Gtk.ResponseType.Ok; this.account = account; password_entry.ActivatesDefault = true; username_entry.ActivatesDefault = true; if (account != null) { password_entry.Text = account.Password; username_entry.Text = account.Username; add_button.Label = Gtk.Stock.Ok; Dialog.Response += HandleEditResponse; } if (remove_button != null) remove_button.Visible = account != null; this.Dialog.Show (); password_entry.Changed += HandleChanged; username_entry.Changed += HandleChanged; HandleChanged (null, null); } private void HandleChanged (object sender, System.EventArgs args) { password = password_entry.Text; username = username_entry.Text; add_button.Sensitive = !(password == String.Empty || username == String.Empty); } [GLib.ConnectBefore] protected void HandleAddResponse (object sender, Gtk.ResponseArgs args) { if (args.ResponseId == Gtk.ResponseType.Ok) { SmugMugAccount account = new SmugMugAccount (username, password); SmugMugAccountManager.GetInstance ().AddAccount (account); } Dialog.Destroy (); } protected void HandleEditResponse (object sender, Gtk.ResponseArgs args) { if (args.ResponseId == Gtk.ResponseType.Ok) { account.Username = username; account.Password = password; SmugMugAccountManager.GetInstance ().MarkChanged (true, account); } else if (args.ResponseId == Gtk.ResponseType.Reject) { // NOTE we are using Reject to signal the remove action. SmugMugAccountManager.GetInstance ().RemoveAccount (account); } Dialog.Destroy (); } private Gtk.Dialog Dialog { get { if (dialog == null) dialog = new Gtk.Dialog (builder.GetRawObject (dialog_name)); return dialog; } } private SmugMugAccount account; private string password; private string username; private string dialog_name = "smugmug_add_dialog"; private GtkBeans.Builder builder; // widgets [GtkBeans.Builder.Object] Gtk.Dialog dialog; [GtkBeans.Builder.Object] Gtk.Entry password_entry; [GtkBeans.Builder.Object] Gtk.Entry username_entry; [GtkBeans.Builder.Object] Gtk.Button add_button; [GtkBeans.Builder.Object] Gtk.Button remove_button; } } SmugMugAddAlbum.cs0000644000175000017500000000563511503404762034443 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.SmugMug/FSpot.Exporters.SmugMugusing System; using System.Net; using System.IO; using System.Text; using System.Threading; using System.Collections; using System.Collections.Specialized; using System.Web; using Mono.Unix; using Gtk; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using Hyena; using FSpot.UI.Dialog; using Gnome.Keyring; using SmugMugNet; namespace FSpot.Exporters.SmugMug { public class SmugMugAddAlbum { [GtkBeans.Builder.Object] Gtk.Dialog dialog; [GtkBeans.Builder.Object] Gtk.Entry title_entry; [GtkBeans.Builder.Object] Gtk.CheckButton public_check; [GtkBeans.Builder.Object] Gtk.ComboBox category_combo; [GtkBeans.Builder.Object] Gtk.Button add_button; private string dialog_name = "smugmug_add_album_dialog"; private GtkBeans.Builder builder; private SmugMugExport export; private SmugMugApi smugmug; private string title; private ListStore category_store; public SmugMugAddAlbum (SmugMugExport export, SmugMugApi smugmug) { builder = new GtkBeans.Builder (null, "smugmug_add_album_dialog.ui", null); builder.Autoconnect (this); this.export = export; this.smugmug = smugmug; this.category_store = new ListStore (typeof(int), typeof(string)); CellRendererText display_cell = new CellRendererText(); category_combo.PackStart (display_cell, true); category_combo.SetCellDataFunc (display_cell, new CellLayoutDataFunc (CategoryDataFunc)); this.category_combo.Model = category_store; PopulateCategoryCombo (); Dialog.Response += HandleAddResponse; title_entry.Changed += HandleChanged; HandleChanged (null, null); } private void HandleChanged (object sender, EventArgs args) { title = title_entry.Text; if (title == String.Empty) add_button.Sensitive = false; else add_button.Sensitive = true; } [GLib.ConnectBefore] protected void HandleAddResponse (object sender, Gtk.ResponseArgs args) { if (args.ResponseId == Gtk.ResponseType.Ok) { smugmug.CreateAlbum (title, CurrentCategoryId, public_check.Active); export.HandleAlbumAdded (title); } Dialog.Destroy (); } void CategoryDataFunc (CellLayout layout, CellRenderer renderer, TreeModel model, TreeIter iter) { string name = (string)model.GetValue (iter, 1); (renderer as CellRendererText).Text = name; } protected void PopulateCategoryCombo () { SmugMugNet.Category[] categories = smugmug.GetCategories (); foreach (SmugMugNet.Category category in categories) { category_store.AppendValues (category.CategoryID, category.Title); } category_combo.Active = 0; category_combo.ShowAll (); } protected int CurrentCategoryId { get { TreeIter current; category_combo.GetActiveIter (out current); return (int)category_combo.Model.GetValue (current, 0); } } private Gtk.Dialog Dialog { get { if (dialog == null) dialog = new Gtk.Dialog (builder.GetRawObject (dialog_name)); return dialog; } } } } SmugMugAccountManager.cs0000644000175000017500000000654211503404762035657 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.SmugMug/FSpot.Exporters.SmugMugusing System; using System.Net; using System.IO; using System.Text; using System.Threading; using System.Collections; using System.Collections.Specialized; using System.Web; using Mono.Unix; using Gtk; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using Hyena; using FSpot.UI.Dialog; using Gnome.Keyring; using SmugMugNet; namespace FSpot.Exporters.SmugMug { public class SmugMugAccountManager { private static SmugMugAccountManager instance; private const string keyring_item_name = "SmugMug Account"; ArrayList accounts; public delegate void AccountListChangedHandler (SmugMugAccountManager manager, SmugMugAccount changed_account); public event AccountListChangedHandler AccountListChanged; public static SmugMugAccountManager GetInstance () { if (instance == null) { instance = new SmugMugAccountManager (); } return instance; } private SmugMugAccountManager () { accounts = new ArrayList (); ReadAccounts (); } public void MarkChanged () { MarkChanged (true, null); } public void MarkChanged (bool write, SmugMugAccount changed_account) { if (write) WriteAccounts (); if (AccountListChanged != null) AccountListChanged (this, changed_account); } public ArrayList GetAccounts () { return accounts; } public void AddAccount (SmugMugAccount account) { AddAccount (account, true); } public void AddAccount (SmugMugAccount account, bool write) { accounts.Add (account); MarkChanged (write, account); } public void RemoveAccount (SmugMugAccount account) { string keyring = Ring.GetDefaultKeyring(); Hashtable request_attributes = new Hashtable(); request_attributes["name"] = keyring_item_name; request_attributes["username"] = account.Username; try { foreach(ItemData result in Ring.Find(ItemType.GenericSecret, request_attributes)) { Ring.DeleteItem(keyring, result.ItemID); } } catch (Exception e) { Log.Exception (e); } accounts.Remove (account); MarkChanged (); } public void WriteAccounts () { string keyring = Ring.GetDefaultKeyring(); foreach (SmugMugAccount account in accounts) { Hashtable update_request_attributes = new Hashtable(); update_request_attributes["name"] = keyring_item_name; update_request_attributes["username"] = account.Username; Ring.CreateItem(keyring, ItemType.GenericSecret, keyring_item_name, update_request_attributes, account.Password, true); } } private void ReadAccounts () { Hashtable request_attributes = new Hashtable(); request_attributes["name"] = keyring_item_name; try { foreach(ItemData result in Ring.Find(ItemType.GenericSecret, request_attributes)) { if(!result.Attributes.ContainsKey("name") || !result.Attributes.ContainsKey("username") || (result.Attributes["name"] as string) != keyring_item_name) continue; string username = (string)result.Attributes["username"]; string password = result.Secret; if (username == null || username == String.Empty || password == null || password == String.Empty) throw new ApplicationException ("Invalid username/password in keyring"); SmugMugAccount account = new SmugMugAccount(username, password); if (account != null) AddAccount (account, false); } } catch (Exception e) { Log.Exception (e); } MarkChanged (); } } } SmugMugExport.cs0000644000175000017500000002617511503404762034255 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.SmugMug/FSpot.Exporters.SmugMug/* * SmugMugExport.cs * * Authors: * Thomas Van Machelen * * Based on PicasaWebExport code from Stephane Delcroix. * * Copyright (C) 2006 Thomas Van Machelen */ using System; using System.Net; using System.IO; using System.Text; using System.Threading; using System.Collections; using System.Collections.Specialized; using System.Web; using Mono.Unix; using Gtk; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using Hyena; using FSpot.UI.Dialog; using Gnome.Keyring; using SmugMugNet; namespace FSpot.Exporters.SmugMug { public class SmugMugExport : FSpot.Extensions.IExporter { public SmugMugExport () {} public void Run (IBrowsableCollection selection) { builder = new GtkBeans.Builder (null, "smugmug_export_dialog.ui", null); builder.Autoconnect (this); gallery_optionmenu = Gtk.ComboBox.NewText(); album_optionmenu = Gtk.ComboBox.NewText(); (edit_button.Parent as Gtk.HBox).PackStart (gallery_optionmenu); (album_button.Parent as Gtk.HBox).PackStart (album_optionmenu); (edit_button.Parent as Gtk.HBox).ReorderChild (gallery_optionmenu, 1); (album_button.Parent as Gtk.HBox).ReorderChild (album_optionmenu, 1); gallery_optionmenu.Show (); album_optionmenu.Show (); this.items = selection.Items; album_button.Sensitive = false; var view = new TrayView (selection); view.DisplayDates = false; view.DisplayTags = false; Dialog.Modal = false; Dialog.TransientFor = null; Dialog.Close += HandleCloseEvent; thumb_scrolledwindow.Add (view); view.Show (); Dialog.Show (); SmugMugAccountManager manager = SmugMugAccountManager.GetInstance (); manager.AccountListChanged += PopulateSmugMugOptionMenu; PopulateSmugMugOptionMenu (manager, null); if (edit_button != null) edit_button.Clicked += HandleEditGallery; Dialog.Response += HandleResponse; connect = true; HandleSizeActive (null, null); Connect (); LoadPreference (SCALE_KEY); LoadPreference (SIZE_KEY); LoadPreference (BROWSER_KEY); } private bool scale; private int size; private bool browser; private bool connect = false; private long approx_size = 0; private long sent_bytes = 0; IPhoto [] items; int photo_index; ThreadProgressDialog progress_dialog; ArrayList accounts; private SmugMugAccount account; private Album album; private string dialog_name = "smugmug_export_dialog"; private GtkBeans.Builder builder; // Widgets [GtkBeans.Builder.Object] Gtk.Dialog dialog; Gtk.ComboBox gallery_optionmenu; Gtk.ComboBox album_optionmenu; [GtkBeans.Builder.Object] Gtk.CheckButton browser_check; [GtkBeans.Builder.Object] Gtk.CheckButton scale_check; [GtkBeans.Builder.Object] Gtk.SpinButton size_spin; [GtkBeans.Builder.Object] Gtk.Button album_button; [GtkBeans.Builder.Object] Gtk.Button edit_button; [GtkBeans.Builder.Object] Gtk.Button export_button; [GtkBeans.Builder.Object] Gtk.ScrolledWindow thumb_scrolledwindow; System.Threading.Thread command_thread; public const string EXPORT_SERVICE = "smugmug/"; public const string SCALE_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "scale"; public const string SIZE_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "size"; public const string BROWSER_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "browser"; private void HandleResponse (object sender, Gtk.ResponseArgs args) { if (args.ResponseId != Gtk.ResponseType.Ok) { Dialog.Destroy (); return; } if (scale_check != null) { scale = scale_check.Active; size = size_spin.ValueAsInt; } else scale = false; browser = browser_check.Active; if (account != null) { album = (Album) account.SmugMug.GetAlbums() [Math.Max (0, album_optionmenu.Active)]; photo_index = 0; Dialog.Destroy (); command_thread = new System.Threading.Thread (new System.Threading.ThreadStart (this.Upload)); command_thread.Name = Mono.Unix.Catalog.GetString ("Uploading Pictures"); progress_dialog = new ThreadProgressDialog (command_thread, items.Length); progress_dialog.Start (); // Save these settings for next time Preferences.Set (SCALE_KEY, scale); Preferences.Set (SIZE_KEY, size); Preferences.Set (BROWSER_KEY, browser); } } public void HandleSizeActive (object sender, EventArgs args) { size_spin.Sensitive = scale_check.Active; } private void Upload () { sent_bytes = 0; approx_size = 0; System.Uri album_uri = null; Log.Debug ("Starting Upload to Smugmug, album " + album.Title + " - " + album.AlbumID); FilterSet filters = new FilterSet (); filters.Add (new JpegFilter ()); if (scale) filters.Add (new ResizeFilter ((uint)size)); while (photo_index < items.Length) { try { IPhoto item = items[photo_index]; FileInfo file_info; Log.Debug ("uploading " + photo_index); progress_dialog.Message = String.Format (Catalog.GetString ("Uploading picture \"{0}\" ({1} of {2})"), item.Name, photo_index+1, items.Length); progress_dialog.ProgressText = string.Empty; progress_dialog.Fraction = ((photo_index) / (double) items.Length); photo_index++; FilterRequest request = new FilterRequest (item.DefaultVersion.Uri); filters.Convert (request); file_info = new FileInfo (request.Current.LocalPath); if (approx_size == 0) //first image approx_size = file_info.Length * items.Length; else approx_size = sent_bytes * items.Length / (photo_index - 1); int image_id = account.SmugMug.Upload (request.Current.LocalPath, album.AlbumID); if (App.Instance.Database != null && item is Photo && image_id >= 0) App.Instance.Database.Exports.Create ((item as Photo).Id, (item as Photo).DefaultVersionId, ExportStore.SmugMugExportType, account.SmugMug.GetAlbumUrl (image_id).ToString ()); sent_bytes += file_info.Length; if (album_uri == null) album_uri = account.SmugMug.GetAlbumUrl (image_id); } catch (System.Exception e) { progress_dialog.Message = String.Format (Mono.Unix.Catalog.GetString ("Error Uploading To Gallery: {0}"), e.Message); progress_dialog.ProgressText = Mono.Unix.Catalog.GetString ("Error"); Log.DebugException (e); if (progress_dialog.PerformRetrySkip ()) { photo_index--; if (photo_index == 0) approx_size = 0; } } } progress_dialog.Message = Catalog.GetString ("Done Sending Photos"); progress_dialog.Fraction = 1.0; progress_dialog.ProgressText = Mono.Unix.Catalog.GetString ("Upload Complete"); progress_dialog.ButtonLabel = Gtk.Stock.Ok; if (browser && album_uri != null) { GtkBeans.Global.ShowUri (Dialog.Screen, album_uri.ToString ()); } } private void PopulateSmugMugOptionMenu (SmugMugAccountManager manager, SmugMugAccount changed_account) { this.account = changed_account; int pos = 0; accounts = manager.GetAccounts (); if (accounts == null || accounts.Count == 0) { gallery_optionmenu.AppendText (Mono.Unix.Catalog.GetString ("(No Gallery)")); gallery_optionmenu.Sensitive = false; edit_button.Sensitive = false; } else { int i = 0; foreach (SmugMugAccount account in accounts) { if (account == changed_account) pos = i; gallery_optionmenu.AppendText(account.Username); i++; } gallery_optionmenu.Sensitive = true; edit_button.Sensitive = true; } gallery_optionmenu.Active = pos; } private void Connect () { Connect (null); } private void Connect (SmugMugAccount selected) { Connect (selected, null); } private void Connect (SmugMugAccount selected, string text) { try { if (accounts.Count != 0 && connect) { if (selected == null) account = (SmugMugAccount) accounts [gallery_optionmenu.Active]; else account = selected; if (!account.Connected) account.Connect (); PopulateAlbumOptionMenu (account.SmugMug); } } catch (System.Exception) { Log.Warning ("Can not connect to SmugMug. Bad username? Password? Network connection?"); if (selected != null) account = selected; PopulateAlbumOptionMenu (account.SmugMug); album_button.Sensitive = false; new SmugMugAccountDialog (this.Dialog, account); } } private void HandleAccountSelected (object sender, System.EventArgs args) { Connect (); } public void HandleAlbumAdded (string title) { SmugMugAccount account = (SmugMugAccount) accounts [gallery_optionmenu.Active]; PopulateAlbumOptionMenu (account.SmugMug); // make the newly created album selected Album[] albums = account.SmugMug.GetAlbums(); for (int i=0; i < albums.Length; i++) { if (((Album)albums[i]).Title == title) { album_optionmenu.Active = 1; } } } private void PopulateAlbumOptionMenu (SmugMugApi smugmug) { Album[] albums = null; if (smugmug != null) { try { albums = smugmug.GetAlbums(); } catch (Exception) { Log.Debug ("Can't get the albums"); smugmug = null; } } bool disconnected = smugmug == null || !account.Connected || albums == null; if (disconnected || albums.Length == 0) { string msg = disconnected ? Mono.Unix.Catalog.GetString ("(Not Connected)") : Mono.Unix.Catalog.GetString ("(No Albums)"); album_optionmenu.AppendText(msg); export_button.Sensitive = false; album_optionmenu.Sensitive = false; album_button.Sensitive = false; } else { foreach (Album album in albums) { System.Text.StringBuilder label_builder = new System.Text.StringBuilder (); label_builder.Append (album.Title); album_optionmenu.AppendText (label_builder.ToString()); } export_button.Sensitive = items.Length > 0; album_optionmenu.Sensitive = true; album_button.Sensitive = true; } album_optionmenu.Active = 0; } public void HandleAddGallery (object sender, System.EventArgs args) { new SmugMugAccountDialog (this.Dialog); } public void HandleEditGallery (object sender, System.EventArgs args) { new SmugMugAccountDialog (this.Dialog, account); } public void HandleAddAlbum (object sender, System.EventArgs args) { if (account == null) throw new Exception (Catalog.GetString ("No account selected")); new SmugMugAddAlbum (this, account.SmugMug); } void LoadPreference (string key) { switch (key) { case SCALE_KEY: if (scale_check.Active != Preferences.Get (key)) { scale_check.Active = Preferences.Get (key); } break; case SIZE_KEY: size_spin.Value = (double) Preferences.Get (key); break; case BROWSER_KEY: if (browser_check.Active != Preferences.Get (key)) browser_check.Active = Preferences.Get (key); break; } } protected void HandleCloseEvent (object sender, System.EventArgs args) { account.SmugMug.Logout (); } private Gtk.Dialog Dialog { get { if (dialog == null) dialog = new Gtk.Dialog (builder.GetRawObject (dialog_name)); return dialog; } } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.SmugMug/Resources/0000777000175000017500000000000011503407460026550 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.SmugMug/Resources/smugmug_add_album_dialog.ui0000644000175000017500000001471611441732537034116 0ustar00rubenruben00000000000000 True dialog False True vertical True 12 3 2 7 6 True 1 _Description: True 1 2 GTK_FILL True 1 _Album Title: True title_entry GTK_FILL True True 1 2 Public Album True True False True True 1 2 2 3 GTK_FILL True 1 2 1 2 GTK_FILL GTK_FILL False end 1 True end gtk-cancel True True True False True False False 0 gtk-add True True True True False True False False 1 False end 0 cancele_button add_button f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.SmugMug/Resources/smugmug_export_dialog.ui0000644000175000017500000005070411441732537033524 0ustar00rubenruben00000000000000 Export dialog False True vertical True 6 True 0 none True 12 180 True True automatic automatic in True <b>Photos</b> True 0 True vertical 6 True 0 none True 12 True vertical 6 True 6 True _Account: True False False 0 gtk-add True True False True False False 2 gtk-edit True True False True False False 3 0 True 0 True False False 1 True <b>SmugMug Export</b> True False False 0 True 0 none True 12 True vertical 6 True 6 True _Export to Album: True False False 0 gtk-add True True False True False False 2 0 Open _album in browser when done uploading True True False True True True False False 1 True <b>Album</b> True False False 1 True 0 none True 12 True vertical 6 True _Resize to: True True False True True False False 0 True True adjustment1 1 False False 1 True pixels False False 2 0 True <b>Style</b> True False False 2 1 1 True end gtk-cancel True True True False True False False 0 _Export True True True False True False False 1 False end 0 cancel_button export_button 400 10000 1 10 10 f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.SmugMug/Resources/smugmug_add_dialog.ui0000644000175000017500000001563111441732537032733 0ustar00rubenruben00000000000000 True dialog False True vertical True True 12 2 2 7 6 True 1 _Password: True password_entry 1 2 GTK_FILL True True False 1 2 1 2 True 1 _Username: True username_entry GTK_FILL True True 1 2 False 0 False end 1 True end gtk-cancel True True True False True False False 0 gtk-remove True True True False True False False 1 gtk-add True True True True False True False False 2 False end 0 cancel_button remove_button add_button f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.SmugMug/Resources/SmugMugExport.addin.xml0000644000175000017500000000075211430555235033141 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.SmugMug/Makefile.in0000644000175000017500000006736311503407270026655 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Exporters/FSpot.Exporters.SmugMug ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Exporters.SmugMug TARGET = library LINK = $(REF_FSPOT_EXTENSION_SMUGMUGEXPORT) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Exporters.SmugMug/SmugMugAccount.cs \ FSpot.Exporters.SmugMug/SmugMugAccountDialog.cs \ FSpot.Exporters.SmugMug/SmugMugAccountManager.cs \ FSpot.Exporters.SmugMug/SmugMugAddAlbum.cs \ FSpot.Exporters.SmugMug/SmugMugExport.cs RESOURCES = \ Resources/smugmug_add_album_dialog.ui \ Resources/smugmug_add_dialog.ui \ Resources/smugmug_export_dialog.ui \ Resources/SmugMugExport.addin.xml # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.SmugMug/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.SmugMug/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.SmugMug/Makefile.am0000644000175000017500000000111511441732537026633 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Exporters.SmugMug TARGET = library LINK = $(REF_FSPOT_EXTENSION_SMUGMUGEXPORT) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Exporters.SmugMug/SmugMugAccount.cs \ FSpot.Exporters.SmugMug/SmugMugAccountDialog.cs \ FSpot.Exporters.SmugMug/SmugMugAccountManager.cs \ FSpot.Exporters.SmugMug/SmugMugAddAlbum.cs \ FSpot.Exporters.SmugMug/SmugMugExport.cs RESOURCES = \ Resources/smugmug_add_album_dialog.ui \ Resources/smugmug_add_dialog.ui \ Resources/smugmug_export_dialog.ui \ Resources/SmugMugExport.addin.xml include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/0000777000175000017500000000000011503407456025055 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/FSpot.Exporters.PicasaWeb/0000777000175000017500000000000011503407456031737 5ustar00rubenruben00000000000000GoogleAddAlbum.cs0000644000175000017500000000527411503404762035016 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/FSpot.Exporters.PicasaWebusing System; using System.Net; using System.IO; using System.Text; using System.Collections; using System.Collections.Specialized; using System.Web; using Mono.Unix; using Hyena; using Hyena.Widgets; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using FSpot.Imaging; using FSpot.UI.Dialog; using Gnome.Keyring; using Mono.Google; using Mono.Google.Picasa; namespace FSpot.Exporters.PicasaWeb { public class GoogleAddAlbum { [GtkBeans.Builder.Object] Gtk.Dialog dialog; [GtkBeans.Builder.Object] Gtk.Entry title_entry; [GtkBeans.Builder.Object] Gtk.Entry description_entry; [GtkBeans.Builder.Object] Gtk.CheckButton public_check; [GtkBeans.Builder.Object] Gtk.Button add_button; private GtkBeans.Builder builder; private string dialog_name = "google_add_album_dialog"; private GoogleExport export; private Mono.Google.Picasa.PicasaWeb picasa; private string description; private string title; private bool public_album; public GoogleAddAlbum (GoogleExport export, Mono.Google.Picasa.PicasaWeb picasa) { builder = new GtkBeans.Builder (null, "google_add_album_dialog.ui", null); builder.Autoconnect (this); this.export = export; this.picasa = picasa; Dialog.Response += HandleAddResponse; description_entry.Changed += HandleChanged; title_entry.Changed += HandleChanged; HandleChanged (null, null); } private void HandleChanged (object sender, EventArgs args) { description = description_entry.Text; title = title_entry.Text; public_album = public_check.Active; if (title == String.Empty) add_button.Sensitive = false; else add_button.Sensitive = true; } [GLib.ConnectBefore] protected void HandleAddResponse (object sender, Gtk.ResponseArgs args) { if (args.ResponseId == Gtk.ResponseType.Ok) { public_album = public_check.Active; try { picasa.CreateAlbum (System.Web.HttpUtility.HtmlEncode (title), description, public_album ? AlbumAccess.Public : AlbumAccess.Private); } catch (System.Exception e) { HigMessageDialog md = new HigMessageDialog (Dialog, Gtk.DialogFlags.Modal | Gtk.DialogFlags.DestroyWithParent, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, Catalog.GetString ("Error while creating Album"), String.Format (Catalog.GetString ("The following error was encountered while attempting to create an album: {0}"), e.Message)); md.Run (); md.Destroy (); return; } export.HandleAlbumAdded (title); } Dialog.Destroy (); } private Gtk.Dialog Dialog { get { if (dialog == null) dialog = new Gtk.Dialog (builder.GetRawObject (dialog_name)); return dialog; } } } } PicasaWebExport.cs0000644000175000017500000003513011503404762035242 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/FSpot.Exporters.PicasaWeb/* * PicasaWebExport.cs * * Authors: * Stephane Delcroix * * Copyright (C) 2006 Stephane Delcroix */ using System; using System.Net; using System.IO; using System.Text; using System.Collections; using System.Collections.Specialized; using System.Web; using Mono.Unix; using Hyena; using Hyena.Widgets; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using FSpot.Imaging; using FSpot.UI.Dialog; using Gnome.Keyring; using Mono.Google; using Mono.Google.Picasa; namespace FSpot.Exporters.PicasaWeb { public class GoogleExport : FSpot.Extensions.IExporter { public GoogleExport () {} public void Run (IBrowsableCollection selection) { builder = new GtkBeans.Builder (null, "google_export_dialog.ui", null); builder.Autoconnect (this); gallery_optionmenu = Gtk.ComboBox.NewText(); album_optionmenu = Gtk.ComboBox.NewText(); (edit_button.Parent as Gtk.HBox).PackStart (gallery_optionmenu); (album_button.Parent as Gtk.HBox).PackStart (album_optionmenu); (edit_button.Parent as Gtk.HBox).ReorderChild (gallery_optionmenu, 1); (album_button.Parent as Gtk.HBox).ReorderChild (album_optionmenu, 1); gallery_optionmenu.Show (); album_optionmenu.Show (); this.items = selection.Items; album_button.Sensitive = false; var view = new TrayView (selection); view.DisplayDates = false; view.DisplayTags = false; Dialog.Modal = false; Dialog.TransientFor = null; thumb_scrolledwindow.Add (view); view.Show (); Dialog.Show (); GoogleAccountManager manager = GoogleAccountManager.GetInstance (); manager.AccountListChanged += PopulateGoogleOptionMenu; PopulateGoogleOptionMenu (manager, null); album_optionmenu.Changed += HandleAlbumOptionMenuChanged; if (edit_button != null) edit_button.Clicked += HandleEditGallery; Dialog.Response += HandleResponse; connect = true; HandleSizeActive (null, null); Connect (); LoadPreference (SCALE_KEY); LoadPreference (SIZE_KEY); LoadPreference (BROWSER_KEY); LoadPreference (TAG_KEY); } private bool scale; private int size; private bool browser; private bool export_tag; private bool connect = false; private long approx_size = 0; private long sent_bytes = 0; IPhoto [] items; int photo_index; ThreadProgressDialog progress_dialog; ArrayList accounts; private GoogleAccount account; private PicasaAlbum album; private PicasaAlbumCollection albums = null; private GtkBeans.Builder builder; private string dialog_name = "google_export_dialog"; public const string EXPORT_SERVICE = "picasaweb/"; public const string SCALE_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "scale"; public const string SIZE_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "size"; public const string BROWSER_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "browser"; public const string TAG_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "tag"; // widgets [GtkBeans.Builder.Object] Gtk.Dialog dialog; Gtk.ComboBox gallery_optionmenu; Gtk.ComboBox album_optionmenu; [GtkBeans.Builder.Object] Gtk.Label status_label; [GtkBeans.Builder.Object] Gtk.Label album_status_label; [GtkBeans.Builder.Object] Gtk.CheckButton browser_check; [GtkBeans.Builder.Object] Gtk.CheckButton scale_check; [GtkBeans.Builder.Object] Gtk.CheckButton tag_check; [GtkBeans.Builder.Object] Gtk.SpinButton size_spin; [GtkBeans.Builder.Object] Gtk.Button album_button; [GtkBeans.Builder.Object] Gtk.Button edit_button; [GtkBeans.Builder.Object] Gtk.Button export_button; [GtkBeans.Builder.Object] Gtk.ScrolledWindow thumb_scrolledwindow; System.Threading.Thread command_thread; private void HandleResponse (object sender, Gtk.ResponseArgs args) { if (args.ResponseId != Gtk.ResponseType.Ok) { Dialog.Destroy (); return; } if (scale_check != null) { scale = scale_check.Active; size = size_spin.ValueAsInt; } else scale = false; browser = browser_check.Active; export_tag = tag_check.Active; if (account != null) { album = (PicasaAlbum) account.Picasa.GetAlbums() [Math.Max (0, album_optionmenu.Active)]; photo_index = 0; Dialog.Destroy (); command_thread = new System.Threading.Thread (new System.Threading.ThreadStart (this.Upload)); command_thread.Name = Catalog.GetString ("Uploading Pictures"); progress_dialog = new ThreadProgressDialog (command_thread, items.Length); progress_dialog.Start (); // Save these settings for next time Preferences.Set (SCALE_KEY, scale); Preferences.Set (SIZE_KEY, size); Preferences.Set (BROWSER_KEY, browser); // Preferences.Set (Preferences.EXPORT_GALLERY_META, meta); Preferences.Set (TAG_KEY, export_tag); } } public void HandleSizeActive (object sender, EventArgs args) { size_spin.Sensitive = scale_check.Active; } private void HandleUploadProgress(object o, UploadProgressEventArgs args) { if (approx_size == 0) progress_dialog.ProgressText = System.String.Format (Catalog.GetString ("{0} Sent"), GLib.Format.SizeForDisplay (args.BytesSent)); else progress_dialog.ProgressText = System.String.Format (Catalog.GetString ("{0} of approx. {1}"), GLib.Format.SizeForDisplay (sent_bytes + args.BytesSent), GLib.Format.SizeForDisplay (approx_size)); progress_dialog.Fraction = ((photo_index - 1) / (double) items.Length) + (args.BytesSent / (args.BytesTotal * (double) items.Length)); } private class DateComparer : IComparer { public int Compare (object left, object right) { return DateTime.Compare ((left as IPhoto).Time, (right as IPhoto).Time); } } private void Upload () { album.UploadProgress += HandleUploadProgress; sent_bytes = 0; approx_size = 0; Log.Debug ("Starting Upload to Picasa"); FilterSet filters = new FilterSet (); filters.Add (new JpegFilter ()); if (scale) filters.Add (new ResizeFilter ((uint)size)); Array.Sort (items, new DateComparer ()); while (photo_index < items.Length) { try { IPhoto item = items[photo_index]; FileInfo file_info; Log.Debug ("Picasa uploading " + photo_index); progress_dialog.Message = String.Format (Catalog.GetString ("Uploading picture \"{0}\" ({1} of {2})"), item.Name, photo_index+1, items.Length); photo_index++; PicasaPicture picture; using (FilterRequest request = new FilterRequest (item.DefaultVersion.Uri)) { filters.Convert (request); file_info = new FileInfo (request.Current.LocalPath); if (approx_size == 0) //first image approx_size = file_info.Length * items.Length; else approx_size = sent_bytes * items.Length / (photo_index - 1); picture = album.UploadPicture (request.Current.LocalPath, Path.ChangeExtension (item.Name, "jpg"), item.Description); sent_bytes += file_info.Length; } if (App.Instance.Database != null && item is Photo) App.Instance.Database.Exports.Create ((item as Photo).Id, (item as Photo).DefaultVersionId, ExportStore.PicasaExportType, picture.Link); //tagging if (item.Tags != null && export_tag) foreach (Tag tag in item.Tags) picture.AddTag (tag.Name); } catch (System.Threading.ThreadAbortException te) { Log.Exception (te); System.Threading.Thread.ResetAbort (); } catch (System.Exception e) { progress_dialog.Message = String.Format (Catalog.GetString ("Error Uploading To Gallery: {0}"), e.Message); progress_dialog.ProgressText = Catalog.GetString ("Error"); Log.DebugException (e); if (progress_dialog.PerformRetrySkip ()) { photo_index--; if (photo_index == 0) approx_size = 0; } } } progress_dialog.Message = Catalog.GetString ("Done Sending Photos"); progress_dialog.Fraction = 1.0; progress_dialog.ProgressText = Catalog.GetString ("Upload Complete"); progress_dialog.ButtonLabel = Gtk.Stock.Ok; if (browser) { GtkBeans.Global.ShowUri (Dialog.Screen, album.Link); } } private void PopulateGoogleOptionMenu (GoogleAccountManager manager, GoogleAccount changed_account) { this.account = changed_account; int pos = -1; accounts = manager.GetAccounts (); if (accounts == null || accounts.Count == 0) { if (accounts==null) Log.Debug("accounts == null"); else Log.Debug("accounts != null"); Log.DebugFormat("accounts.Count = {0}", accounts.Count); gallery_optionmenu.AppendText (Catalog.GetString ("(No Gallery)")); gallery_optionmenu.Sensitive = false; edit_button.Sensitive = false; pos = 0; } else { int i = 0; pos = 0; foreach (GoogleAccount account in accounts) { if (account == changed_account) pos = i; gallery_optionmenu.AppendText (account.Username); i++; } gallery_optionmenu.Sensitive = true; edit_button.Sensitive = true; } Log.DebugFormat("Setting gallery_optionmenu.Active = {0}", pos); gallery_optionmenu.Active = pos; } private void Connect () { Connect (null); } private void Connect (GoogleAccount selected) { Connect (selected, null, null); } private void Connect (GoogleAccount selected, string token, string text) { try { if (accounts.Count != 0 && connect) { if (selected == null) account = (GoogleAccount) accounts [gallery_optionmenu.Active]; else account = selected; if (!account.Connected) account.Connect (); PopulateAlbumOptionMenu (account.Picasa); long qu = account.Picasa.QuotaUsed; long ql = account.Picasa.QuotaLimit; StringBuilder sb = new StringBuilder(""); sb.Append(String.Format (Catalog.GetString ("Available space: {0}, {1}% used out of {2}"), GLib.Format.SizeForDisplay(ql - qu), (100 * qu / ql), GLib.Format.SizeForDisplay (ql))); sb.Append(""); status_label.Text = sb.ToString(); status_label.UseMarkup = true; album_button.Sensitive = true; } } catch (CaptchaException exc){ Log.Debug ("Your Google account is locked"); if (selected != null) account = selected; PopulateAlbumOptionMenu (account.Picasa); album_button.Sensitive = false; new GoogleAccountDialog (this.Dialog, account, false, exc); Log.Warning ("Your Google account is locked, you can unlock it by visiting: {0}", CaptchaException.UnlockCaptchaURL); } catch (System.Exception) { Log.Warning ("Can not connect to Picasa. Bad username? password? network connection?"); if (selected != null) account = selected; PopulateAlbumOptionMenu (account.Picasa); status_label.Text = String.Empty; album_button.Sensitive = false; new GoogleAccountDialog (this.Dialog, account, true, null); } } private void HandleAccountSelected (object sender, System.EventArgs args) { Connect (); } public void HandleAlbumAdded (string title) { GoogleAccount account = (GoogleAccount) accounts [gallery_optionmenu.Active]; PopulateAlbumOptionMenu (account.Picasa); // make the newly created album selected // PicasaAlbumCollection albums = account.Picasa.GetAlbums(); for (int i=0; i < albums.Count; i++) { if (((PicasaAlbum)albums[i]).Title == title) { album_optionmenu.Active = i; } } } private void PopulateAlbumOptionMenu (Mono.Google.Picasa.PicasaWeb picasa) { if (picasa != null) { try { albums = picasa.GetAlbums(); } catch { Log.Warning ("Picasa: can't get the albums"); albums = null; picasa = null; } } bool disconnected = picasa == null || !account.Connected || albums == null; if (disconnected || albums.Count == 0) { string msg = disconnected ? Catalog.GetString ("(Not Connected)") : Catalog.GetString ("(No Albums)"); album_optionmenu.AppendText(msg); export_button.Sensitive = false; album_optionmenu.Sensitive = false; album_button.Sensitive = false; if (disconnected) album_button.Sensitive = false; } else { foreach (PicasaAlbum album in albums.AllValues) { System.Text.StringBuilder label_builder = new System.Text.StringBuilder (); label_builder.Append (album.Title); label_builder.Append (" (" + album.PicturesCount + ")"); album_optionmenu.AppendText(label_builder.ToString()); } export_button.Sensitive = items.Length > 0; album_optionmenu.Sensitive = true; album_button.Sensitive = true; } } public void HandleAlbumOptionMenuChanged (object sender, System.EventArgs args) { if (albums == null || albums.Count == 0) return; PicasaAlbum a = albums [album_optionmenu.Active]; export_button.Sensitive = a.PicturesRemaining >= items.Length; if (album_status_label.Visible = !export_button.Sensitive) { StringBuilder sb = new StringBuilder(""); sb.Append(String.Format (Catalog.GetString ("The selected album has a limit of {0} pictures,\n" + "which would be passed with the current selection of {1} images"), a.PicturesCount + a.PicturesRemaining, items.Length)); sb.Append(""); album_status_label.Text = String.Format (sb.ToString()); album_status_label.UseMarkup = true; } else { album_status_label.Text = String.Empty; } } public void HandleAddGallery (object sender, System.EventArgs args) { new GoogleAccountDialog (this.Dialog); } public void HandleEditGallery (object sender, System.EventArgs args) { new GoogleAccountDialog (this.Dialog, account, false, null); } public void HandleAddAlbum (object sender, System.EventArgs args) { if (account == null) throw new Exception (Catalog.GetString ("No account selected")); new GoogleAddAlbum (this, account.Picasa); } void LoadPreference (string key) { switch (key) { case SCALE_KEY: if (scale_check.Active != Preferences.Get (key)) { scale_check.Active = Preferences.Get (key); } break; case SIZE_KEY: size_spin.Value = (double) Preferences.Get (key); break; case BROWSER_KEY: if (browser_check.Active != Preferences.Get (key)) browser_check.Active = Preferences.Get (key); break; case TAG_KEY: if (tag_check.Active != Preferences.Get (key)) tag_check.Active = Preferences.Get (key); break; } } private Gtk.Dialog Dialog { get { if (dialog == null) dialog = new Gtk.Dialog (builder.GetRawObject (dialog_name)); return dialog; } } } } GoogleAccountManager.cs0000644000175000017500000000702711503404762036232 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/FSpot.Exporters.PicasaWebusing System; using System.Net; using System.IO; using System.Text; using System.Collections; using System.Collections.Specialized; using System.Web; using Mono.Unix; using Hyena; using Hyena.Widgets; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using FSpot.Imaging; using FSpot.UI.Dialog; using Gnome.Keyring; using Mono.Google; using Mono.Google.Picasa; namespace FSpot.Exporters.PicasaWeb { public class GoogleAccountManager { private static GoogleAccountManager instance; private const string keyring_item_name = "Google Account"; ArrayList accounts; public delegate void AccountListChangedHandler (GoogleAccountManager manager, GoogleAccount changed_account); public event AccountListChangedHandler AccountListChanged; public static GoogleAccountManager GetInstance () { if (instance == null) { instance = new GoogleAccountManager (); } return instance; } private GoogleAccountManager () { accounts = new ArrayList (); ReadAccounts (); } public void MarkChanged () { MarkChanged (true, null); } public void MarkChanged (bool write, GoogleAccount changed_account) { if (write) WriteAccounts (); if (AccountListChanged != null) AccountListChanged (this, changed_account); } public ArrayList GetAccounts () { return accounts; } public void AddAccount (GoogleAccount account) { AddAccount (account, true); } public void AddAccount (GoogleAccount account, bool write) { accounts.Add (account); MarkChanged (write, account); } public void RemoveAccount (GoogleAccount account) { string keyring; try { keyring = Ring.GetDefaultKeyring(); } catch { return; } Hashtable request_attributes = new Hashtable(); request_attributes["name"] = keyring_item_name; request_attributes["username"] = account.Username; try { foreach(ItemData result in Ring.Find(ItemType.GenericSecret, request_attributes)) { Ring.DeleteItem(keyring, result.ItemID); } } catch (Exception e) { Log.DebugException (e); } accounts.Remove (account); MarkChanged (); } public void WriteAccounts () { string keyring; try { keyring = Ring.GetDefaultKeyring(); } catch { return; } foreach (GoogleAccount account in accounts) { Hashtable update_request_attributes = new Hashtable(); update_request_attributes["name"] = keyring_item_name; update_request_attributes["username"] = account.Username; try { Ring.CreateItem(keyring, ItemType.GenericSecret, keyring_item_name, update_request_attributes, account.Password, true); } catch { continue; } } } private void ReadAccounts () { Hashtable request_attributes = new Hashtable(); request_attributes["name"] = keyring_item_name; try { foreach(ItemData result in Ring.Find(ItemType.GenericSecret, request_attributes)) { if(!result.Attributes.ContainsKey("name") || !result.Attributes.ContainsKey("username") || (result.Attributes["name"] as string) != keyring_item_name) continue; string username = (string)result.Attributes["username"]; string password = result.Secret; if (username == null || username == String.Empty || password == null || password == String.Empty) throw new ApplicationException ("Invalid username/password in keyring"); GoogleAccount account = new GoogleAccount(username, password); if (account != null) AddAccount (account, false); } } catch (Exception e) { Log.DebugException (e); } MarkChanged (); } } } GoogleAccount.cs0000644000175000017500000000445611503404762034742 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/FSpot.Exporters.PicasaWebusing System; using System.Net; using System.IO; using System.Text; using System.Collections; using System.Collections.Specialized; using System.Web; using Mono.Unix; using Hyena; using Hyena.Widgets; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using FSpot.Imaging; using FSpot.UI.Dialog; using Gnome.Keyring; using Mono.Google; using Mono.Google.Picasa; namespace FSpot.Exporters.PicasaWeb { public class GoogleAccount { private string username; private string password; private string token; private string unlock_captcha; private GoogleConnection connection; private Mono.Google.Picasa.PicasaWeb picasa; public GoogleAccount (string username, string password) { this.username = username; this.password = password; } public GoogleAccount (string username, string password, string token, string unlock_captcha) { this.username = username; this.password = password; this.token = token; this.unlock_captcha = unlock_captcha; } public Mono.Google.Picasa.PicasaWeb Connect () { Log.Debug ("GoogleAccount.Connect()"); GoogleConnection conn = new GoogleConnection (GoogleService.Picasa); ServicePointManager.CertificatePolicy = new NoCheckCertificatePolicy (); if (unlock_captcha == null || token == null) conn.Authenticate(username, password); else { conn.Authenticate(username, password, token, unlock_captcha); token = null; unlock_captcha = null; } connection = conn; var picasa = new Mono.Google.Picasa.PicasaWeb(conn); this.picasa = picasa; return picasa; } private void MarkChanged() { connection = null; } public bool Connected { get { return (connection != null); } } public string Username { get { return username; } set { if (username != value) { username = value; MarkChanged (); } } } public string Password { get { return password; } set { if (password != value) { password = value; MarkChanged (); } } } public string Token { get { return token; } set { token = value; } } public string UnlockCaptcha { get { return unlock_captcha; } set { unlock_captcha = value; } } public Mono.Google.Picasa.PicasaWeb Picasa { get { return picasa; } } } } GoogleAccountDialog.cs0000644000175000017500000000756411503404762036065 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/FSpot.Exporters.PicasaWebusing System; using System.Net; using System.IO; using System.Text; using System.Collections; using System.Collections.Specialized; using System.Web; using Mono.Unix; using Hyena; using Hyena.Widgets; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using FSpot.Imaging; using FSpot.UI.Dialog; using Gnome.Keyring; using Mono.Google; using Mono.Google.Picasa; namespace FSpot.Exporters.PicasaWeb { public class GoogleAccountDialog { public GoogleAccountDialog (Gtk.Window parent) : this (parent, null, false, null) { Dialog.Response += HandleAddResponse; add_button.Sensitive = false; } public GoogleAccountDialog (Gtk.Window parent, GoogleAccount account, bool show_error, CaptchaException captcha_exception) { builder = new GtkBeans.Builder (null, "google_add_dialog.ui", null); builder.Autoconnect (this); Dialog.Modal = false; Dialog.TransientFor = parent; Dialog.DefaultResponse = Gtk.ResponseType.Ok; this.account = account; bool show_captcha = (captcha_exception != null); status_area.Visible = show_error; locked_area.Visible = show_captcha; captcha_label.Visible = show_captcha; captcha_entry.Visible = show_captcha; captcha_image.Visible = show_captcha; password_entry.ActivatesDefault = true; username_entry.ActivatesDefault = true; if (show_captcha) { try { using (var img = ImageFile.Create(new SafeUri(captcha_exception.CaptchaUrl, true))) { captcha_image.Pixbuf = img.Load(); token = captcha_exception.Token; } } catch (Exception) {} } if (account != null) { password_entry.Text = account.Password; username_entry.Text = account.Username; add_button.Label = Gtk.Stock.Ok; Dialog.Response += HandleEditResponse; } if (remove_button != null) remove_button.Visible = account != null; this.Dialog.Show (); password_entry.Changed += HandleChanged; username_entry.Changed += HandleChanged; HandleChanged (null, null); } private void HandleChanged (object sender, System.EventArgs args) { password = password_entry.Text; username = username_entry.Text; add_button.Sensitive = !(password == String.Empty || username == String.Empty); } [GLib.ConnectBefore] protected void HandleAddResponse (object sender, Gtk.ResponseArgs args) { if (args.ResponseId == Gtk.ResponseType.Ok) { GoogleAccount account = new GoogleAccount (username, password); GoogleAccountManager.GetInstance ().AddAccount (account); } Dialog.Destroy (); } protected void HandleEditResponse (object sender, Gtk.ResponseArgs args) { if (args.ResponseId == Gtk.ResponseType.Ok) { account.Username = username; account.Password = password; account.Token = token; account.UnlockCaptcha = captcha_entry.Text; GoogleAccountManager.GetInstance ().MarkChanged (true, account); } else if (args.ResponseId == Gtk.ResponseType.Reject) { // NOTE we are using Reject to signal the remove action. GoogleAccountManager.GetInstance ().RemoveAccount (account); } Dialog.Destroy (); } private Gtk.Dialog Dialog { get { if (dialog == null) dialog = new Gtk.Dialog (builder.GetRawObject ("google_add_dialog")); return dialog; } } private GoogleAccount account; private string password; private string username; private string token; GtkBeans.Builder builder; // widgets [GtkBeans.Builder.Object] Gtk.Dialog dialog; [GtkBeans.Builder.Object] Gtk.Entry password_entry; [GtkBeans.Builder.Object] Gtk.Entry username_entry; [GtkBeans.Builder.Object] Gtk.Entry captcha_entry; [GtkBeans.Builder.Object] Gtk.Button add_button; [GtkBeans.Builder.Object] Gtk.Button remove_button; [GtkBeans.Builder.Object] Gtk.HBox status_area; [GtkBeans.Builder.Object] Gtk.HBox locked_area; [GtkBeans.Builder.Object] Gtk.Image captcha_image; [GtkBeans.Builder.Object] Gtk.Label captcha_label; } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/Resources/0000777000175000017500000000000011503407457027030 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/Resources/PicasaWebExport.addin.xml0000644000175000017500000000076311430555235033667 0ustar00rubenruben00000000000000 google_add_album_dialog.ui0000644000175000017500000001503711441732537034076 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/Resources True dialog False True vertical True 12 3 2 7 6 True 1 _Description: True description_entry 1 2 GTK_FILL True True 1 2 1 2 True 1 _Album Title: True title_entry GTK_FILL True True 1 2 Public Album True True False True True 1 2 2 3 GTK_FILL False end 1 True end gtk-cancel True True True False True False False 0 gtk-add True True True True False True False False 1 False end 0 cancel_button add_button f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/Resources/google_add_dialog.ui0000644000175000017500000003522311441732537032774 0ustar00rubenruben00000000000000 True dialog False True vertical True vertical 12 True 0 gtk-dialog-question 6 False False 2 0 True 6 True 0 <span weight='bold' size='larger'>Error Connecting to Gallery</span> True False False 0 True 0 Please verify that the settings for this gallery are correct. False False 1 1 False 0 12 True 0 gtk-missing-image 6 False False 2 0 True 6 True 0 <span weight='bold' size='larger'>Your Google Account is locked</span> True False False 0 True 0 Please verify that the settings for this gallery are correct. Enter the letters as they are shown in the image in the 'Captcha' field. <i>Letters are not case-sensitive</i> True False False 1 1 1 True 12 3 2 7 6 True 1 _Password: True password_entry 1 2 GTK_FILL True True False 1 2 1 2 True 1 _Username: True username_entry GTK_FILL True True 1 2 1 _Captcha: True 2 3 GTK_FILL True True 0 gtk-missing-image 1 1 2 2 3 GTK_FILL GTK_FILL False False 2 False end 1 True end gtk-cancel True True True False True False False 0 gtk-remove True True True False True False False 1 gtk-add True True True True False True False False 2 False end 0 cancel_button remove_button add_button f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/Resources/google_export_dialog.ui0000644000175000017500000005407211441732537033570 0ustar00rubenruben00000000000000 Export dialog False True vertical True 6 True 0 none True 12 180 True True automatic automatic in True <b>Photos</b> True 0 True vertical 6 True 0 none True 12 True vertical 6 True 6 True _Gallery: True False False 0 gtk-add True True False True False False 2 gtk-edit True True False True False False 3 0 True 0 True False False 1 True <b>PicasaWeb Export</b> True False False 0 True 0 none True 12 True vertical 6 True 6 True _Export to Album: True False False 0 gtk-add True True False True False False 2 0 True 0 True False False 1 Open _album in browser when done uploading True True False True True True False False 2 True <b>Album</b> True False False 1 True 0 none True 12 True vertical 6 True _Resize to: True True False True True False False 0 True True adjustment1 1 False False 1 True pixels False False 2 0 _Export tags True True False True True False False 1 True <b>Style</b> True False False 2 1 1 True end gtk-cancel True True True False True False False 0 _Export True True True False True False False 1 False end 0 cancel_button export_button 400 10000 1 10 f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/Makefile.in0000644000175000017500000006740411503407267027131 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Exporters/FSpot.Exporters.PicasaWeb ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Exporters.PicasaWeb TARGET = library LINK = $(REF_FSPOT_EXTENSION_PICASAWEBEXPORT) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Exporters.PicasaWeb/GoogleAccount.cs \ FSpot.Exporters.PicasaWeb/GoogleAccountDialog.cs \ FSpot.Exporters.PicasaWeb/GoogleAccountManager.cs \ FSpot.Exporters.PicasaWeb/GoogleAddAlbum.cs \ FSpot.Exporters.PicasaWeb/PicasaWebExport.cs RESOURCES = \ Resources/google_add_album_dialog.ui \ Resources/google_add_dialog.ui \ Resources/google_export_dialog.ui \ Resources/PicasaWebExport.addin.xml # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.PicasaWeb/Makefile.am0000644000175000017500000000113011441732537027102 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Exporters.PicasaWeb TARGET = library LINK = $(REF_FSPOT_EXTENSION_PICASAWEBEXPORT) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Exporters.PicasaWeb/GoogleAccount.cs \ FSpot.Exporters.PicasaWeb/GoogleAccountDialog.cs \ FSpot.Exporters.PicasaWeb/GoogleAccountManager.cs \ FSpot.Exporters.PicasaWeb/GoogleAddAlbum.cs \ FSpot.Exporters.PicasaWeb/PicasaWebExport.cs RESOURCES = \ Resources/google_add_album_dialog.ui \ Resources/google_add_dialog.ui \ Resources/google_export_dialog.ui \ Resources/PicasaWebExport.addin.xml include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Folder/0000777000175000017500000000000011503407455024431 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Folder/FSpot.Exporters.Folder/0000777000175000017500000000000011503407455030670 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Folder/FSpot.Exporters.Folder/FolderExport.cs0000644000175000017500000012357611503404762033644 0ustar00rubenruben00000000000000/* * Copyright (C) 2005 Alessandro Gervaso * * 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., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ //This should be used to export the selected pics to an original gallery //located on a GIO location. using System; using System.IO; using System.Runtime.InteropServices; using System.Collections; using Hyena; using Mono.Unix; using ICSharpCode.SharpZipLib.Checksums; using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.GZip; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using FSpot.Utils; using FSpot.UI.Dialog; namespace FSpot.Exporters.Folder { public class FolderExport : FSpot.Extensions.IExporter { IBrowsableCollection selection; [GtkBeans.Builder.Object] Gtk.Dialog dialog; [GtkBeans.Builder.Object] Gtk.ScrolledWindow thumb_scrolledwindow; [GtkBeans.Builder.Object] Gtk.Entry name_entry; [GtkBeans.Builder.Object] Gtk.Entry description_entry; [GtkBeans.Builder.Object] Gtk.CheckButton scale_check; [GtkBeans.Builder.Object] Gtk.CheckButton export_tags_check; [GtkBeans.Builder.Object] Gtk.CheckButton export_tag_icons_check; [GtkBeans.Builder.Object] Gtk.CheckButton open_check; [GtkBeans.Builder.Object] Gtk.RadioButton static_radio; [GtkBeans.Builder.Object] Gtk.RadioButton original_radio; [GtkBeans.Builder.Object] Gtk.RadioButton plain_radio; [GtkBeans.Builder.Object] Gtk.SpinButton size_spin; [GtkBeans.Builder.Object] Gtk.HBox chooser_hbox; public const string EXPORT_SERVICE = "folder/"; public const string SCALE_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "scale"; public const string SIZE_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "size"; public const string OPEN_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "browser"; public const string EXPORT_TAGS_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "export_tags"; public const string EXPORT_TAG_ICONS_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "export_tag_icons"; public const string METHOD_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "method"; public const string URI_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "uri"; public const string SHARPEN_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "sharpen"; public const string INCLUDE_TARBALLS_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "include_tarballs"; private GtkBeans.Builder builder; private string dialog_name = "folder_export_dialog"; GLib.File dest; Gtk.FileChooserButton uri_chooser; bool open; bool scale; bool exportTags; bool exportTagIcons; int size; string description; string gallery_name = "Gallery"; // FIXME this needs to be a real temp directory string gallery_path = Path.Combine (Path.GetTempPath (), "f-spot-original-" + System.DateTime.Now.Ticks.ToString ()); ThreadProgressDialog progress_dialog; System.Threading.Thread command_thread; public FolderExport () {} public void Run (IBrowsableCollection selection) { this.selection = selection; var view = new TrayView (selection); view.DisplayDates = false; view.DisplayTags = false; builder = new GtkBeans.Builder (null, "folder_export.ui", null); builder.Autoconnect (this); Dialog.Modal = false; Dialog.TransientFor = null; thumb_scrolledwindow.Add (view); HandleSizeActive (null, null); name_entry.Text = gallery_name; string uri_path = System.IO.Path.Combine (FSpot.Core.Global.HomeDirectory, "Desktop"); if (!System.IO.Directory.Exists (uri_path)) uri_path = FSpot.Core.Global.HomeDirectory; uri_chooser = new Gtk.FileChooserButton (Catalog.GetString ("Select Export Folder"), Gtk.FileChooserAction.SelectFolder); uri_chooser.LocalOnly = false; if (!String.IsNullOrEmpty (Preferences.Get (URI_KEY))) uri_chooser.SetCurrentFolderUri (Preferences.Get (URI_KEY)); else uri_chooser.SetFilename (uri_path); chooser_hbox.PackStart (uri_chooser); Dialog.ShowAll (); Dialog.Response += HandleResponse; LoadPreference (SCALE_KEY); LoadPreference (SIZE_KEY); LoadPreference (OPEN_KEY); LoadPreference (EXPORT_TAGS_KEY); LoadPreference (EXPORT_TAG_ICONS_KEY); LoadPreference (METHOD_KEY); } public void HandleSizeActive (object sender, System.EventArgs args) { size_spin.Sensitive = scale_check.Active; } public void HandleStandaloneActive (object sender, System.EventArgs args) { export_tags_check.Sensitive = static_radio.Active; HandleExportTagsActive (sender, args); } public void HandleExportTagsActive (object sender, System.EventArgs args) { export_tag_icons_check.Sensitive = export_tags_check.Active && static_radio.Active; } public void Upload () { // FIXME use mkstemp try { ThreadAssist.ProxyToMain (Dialog.Hide); GLib.File source = GLib.FileFactory.NewForPath (Path.Combine (gallery_path, gallery_name)); GLib.File target = GLib.FileFactory.NewForPath (Path.Combine (dest.Path, source.Basename)); if (dest.IsNative) gallery_path = dest.Path; progress_dialog.Message = Catalog.GetString ("Building Gallery"); progress_dialog.Fraction = 0.0; FolderGallery gallery; if (static_radio.Active) { gallery = new HtmlGallery (selection, gallery_path, gallery_name); } else if (original_radio.Active) { gallery = new OriginalGallery (selection, gallery_path, gallery_name); } else { gallery = new FolderGallery (selection, gallery_path, gallery_name); } if (scale) { Log.DebugFormat ("Resize Photos to {0}.", size); gallery.SetScale (size); } else { Log.Debug ("Exporting full size."); } if (exportTags) gallery.SetExportTags (); if (exportTagIcons) gallery.SetExportTagIcons (); gallery.Description = description; gallery.GenerateLayout (); FilterSet filter_set = new FilterSet (); if (scale) filter_set.Add (new ResizeFilter ((uint) size)); filter_set.Add (new ChmodFilter ()); filter_set.Add (new UniqueNameFilter (new SafeUri (gallery_path))); for (int photo_index = 0; photo_index < selection.Count; photo_index++) { try { progress_dialog.Message = System.String.Format (Catalog.GetString ("Exporting \"{0}\"..."), selection[photo_index].Name); progress_dialog.Fraction = photo_index / (double) selection.Count; gallery.ProcessImage (photo_index, filter_set); progress_dialog.ProgressText = System.String.Format (Catalog.GetString ("{0} of {1}"), (photo_index + 1), selection.Count); } catch (Exception e) { Log.Error (e.ToString ()); progress_dialog.Message = String.Format (Catalog.GetString ("Error Copying \"{0}\" to Gallery:{2}{1}"), selection[photo_index].Name, e.Message, Environment.NewLine); progress_dialog.ProgressText = Catalog.GetString ("Error"); if (progress_dialog.PerformRetrySkip ()) photo_index--; } } // create the zip tarballs for original if (gallery is OriginalGallery) { bool include_tarballs; try { include_tarballs = Preferences.Get (INCLUDE_TARBALLS_KEY); } catch (NullReferenceException){ include_tarballs = true; Preferences.Set (INCLUDE_TARBALLS_KEY, true); } if (include_tarballs) (gallery as OriginalGallery).CreateZip (); } // we've created the structure, now if the destination was local (native) we are done // otherwise we xfer if (!dest.IsNative) { Log.DebugFormat ("Transferring \"{0}\" to \"{1}\"", source.Path, target.Path); progress_dialog.Message = String.Format (Catalog.GetString ("Transferring to \"{0}\""), target.Path); progress_dialog.ProgressText = Catalog.GetString ("Transferring..."); source.CopyRecursive (target, GLib.FileCopyFlags.Overwrite, new GLib.Cancellable (), Progress); } // No need to check result here as if result is not true, an Exception will be thrown before progress_dialog.Message = Catalog.GetString ("Export Complete."); progress_dialog.Fraction = 1.0; progress_dialog.ProgressText = Catalog.GetString ("Exporting Photos Completed."); progress_dialog.ButtonLabel = Gtk.Stock.Ok; if (open) { Log.DebugFormat (String.Format ("Open URI \"{0}\"", target.Uri.ToString ())); ThreadAssist.ProxyToMain (() => { GtkBeans.Global.ShowUri (Dialog.Screen, target.Uri.ToString () ); }); } // Save these settings for next time Preferences.Set (SCALE_KEY, scale); Preferences.Set (SIZE_KEY, size); Preferences.Set (OPEN_KEY, open); Preferences.Set (EXPORT_TAGS_KEY, exportTags); Preferences.Set (EXPORT_TAG_ICONS_KEY, exportTagIcons); Preferences.Set (METHOD_KEY, static_radio.Active ? "static" : original_radio.Active ? "original" : "folder" ); Preferences.Set (URI_KEY, uri_chooser.Uri); } catch (System.Exception e) { Log.Error (e.ToString ()); progress_dialog.Message = e.ToString (); progress_dialog.ProgressText = Catalog.GetString ("Error Transferring"); } finally { // if the destination isn't local then we want to remove the temp directory we // created. if (!dest.IsNative) System.IO.Directory.Delete (gallery_path, true); ThreadAssist.ProxyToMain (() => { Dialog.Destroy(); }); } } private void Progress (long current_num_bytes, long total_num_bytes) { if (total_num_bytes > 0) { progress_dialog.Fraction = current_num_bytes / (double)total_num_bytes; } } private void HandleResponse (object sender, Gtk.ResponseArgs args) { if (args.ResponseId != Gtk.ResponseType.Ok) { // FIXME this is to work around a bug in gtk+ where // the filesystem events are still listened to when // a FileChooserButton is destroyed but not finalized // and an event comes in that wants to update the child widgets. Dialog.Destroy (); uri_chooser.Dispose (); uri_chooser = null; return; } dest = GLib.FileFactory.NewForUri (uri_chooser.Uri); open = open_check.Active; scale = scale_check.Active; exportTags = export_tags_check.Active; exportTagIcons = export_tag_icons_check.Active; gallery_name = name_entry.Text; if (description_entry != null) description = description_entry.Text; if (scale) size = size_spin.ValueAsInt; command_thread = new System.Threading.Thread (new System.Threading.ThreadStart (Upload)); command_thread.Name = Catalog.GetString ("Exporting Photos"); progress_dialog = new ThreadProgressDialog (command_thread, 1); progress_dialog.Start (); } void LoadPreference (string key) { switch (key) { case SCALE_KEY: if (scale_check.Active != Preferences.Get (key)) scale_check.Active = Preferences.Get (key); break; case SIZE_KEY: int size; if (Preferences.TryGet (key, out size)) size_spin.Value = (double) size; else size_spin.Value = 400; break; case OPEN_KEY: if (open_check.Active != Preferences.Get (key)) open_check.Active = Preferences.Get (key); break; case EXPORT_TAGS_KEY: if (export_tags_check.Active != Preferences.Get (key)) export_tags_check.Active = Preferences.Get (key); break; case EXPORT_TAG_ICONS_KEY: if (export_tag_icons_check.Active != Preferences.Get (key)) export_tag_icons_check.Active = Preferences.Get (key); break; case METHOD_KEY: static_radio.Active = (Preferences.Get (key) == "static"); original_radio.Active = (Preferences.Get (key) == "original"); plain_radio.Active = (Preferences.Get (key) == "folder"); break; } } private Gtk.Dialog Dialog { get { if (dialog == null) dialog = new Gtk.Dialog (builder.GetRawObject (dialog_name)); return dialog; } } } internal class FolderGallery { protected IBrowsableCollection collection; protected string gallery_name; protected string gallery_path; protected bool scale; protected int size; protected bool exportTags; protected bool exportTagIcons; protected string description; protected string language; protected System.Uri destination; protected ScaleRequest [] requests; protected string [] pixbuf_keys = { "quality", null }; protected string [] pixbuf_values = { "95", null }; protected struct ScaleRequest { public string Name; public int Width; public int Height; public bool Skip; public bool CopyExif; public ScaleRequest (string name, int width, int height, bool skip) : this (name, width, height, skip, false) {} public ScaleRequest (string name, int width, int height, bool skip, bool exif) { this.Name = name != null ? name : String.Empty; this.Width = width; this.Height = height; this.Skip = skip; this.CopyExif = exif; } public static ScaleRequest Default = new ScaleRequest (String.Empty, 0, 0, false); public bool AvoidScale (int size) { return (size < this.Width && size < this.Height && this.Skip); } } internal FolderGallery (IBrowsableCollection selection, string path, string gallery_name) { this.collection = selection; this.gallery_name = gallery_name; this.gallery_path = Path.Combine (path, gallery_name); this.requests = new ScaleRequest [] { ScaleRequest.Default }; } public virtual void GenerateLayout () { MakeDir (gallery_path); } protected virtual string ImageName (int image_num) { var uri = collection [image_num].DefaultVersion.Uri; var dest_uri = new SafeUri (gallery_path); // Find an unused name int i = 1; var dest = dest_uri.Append (uri.GetFilename ()); var file = GLib.FileFactory.NewForUri (dest); while (file.Exists) { var filename = uri.GetFilenameWithoutExtension (); var extension = uri.GetExtension (); dest = dest_uri.Append (String.Format ("{0}-{1}{2}", filename, i++, extension)); file = GLib.FileFactory.NewForUri (dest); } return dest.GetFilename (); } public void ProcessImage (int image_num, FilterSet filter_set) { IPhoto photo = collection [image_num]; string path; ScaleRequest req; req = requests [0]; MakeDir (SubdirPath (req.Name)); path = SubdirPath (req.Name, ImageName (image_num)); using (FilterRequest request = new FilterRequest (photo.DefaultVersion.Uri)) { filter_set.Convert (request); if (request.Current.LocalPath == path) request.Preserve(request.Current); else System.IO.File.Copy (request.Current.LocalPath, path, true); if (photo != null && photo is Photo && App.Instance.Database != null) { App.Instance.Database.Exports.Create ((photo as Photo).Id, (photo as Photo).DefaultVersionId, ExportStore.FolderExportType, // FIXME this is wrong, the final path is the one // after the Xfer. new SafeUri (path).ToString ()); } for (int i = 1; i < requests.Length; i++) { req = requests [i]; if (scale && req.AvoidScale (size)) continue; FilterSet req_set = new FilterSet (); req_set.Add (new ResizeFilter ((uint)Math.Max (req.Width, req.Height))); bool sharpen; try { sharpen = Preferences.Get (FolderExport.SHARPEN_KEY); } catch (NullReferenceException) { sharpen = true; Preferences.Set (FolderExport.SHARPEN_KEY, true); } if (sharpen) { if (req.Name == "lq") req_set.Add (new SharpFilter (0.1, 2, 4)); if (req.Name == "thumbs") req_set.Add (new SharpFilter (0.1, 2, 5)); } using (FilterRequest tmp_req = new FilterRequest (photo.DefaultVersion.Uri)) { req_set.Convert (tmp_req); MakeDir (SubdirPath (req.Name)); path = SubdirPath (req.Name, ImageName (image_num)); System.IO.File.Copy (tmp_req.Current.LocalPath, path, true); } } } } protected string MakeDir (string path) { try { Directory.CreateDirectory (path); } catch { Log.ErrorFormat ("Error in creating directory \"{0}\"", path); } return path; } protected string SubdirPath (string subdir) { return SubdirPath (subdir, null); } protected string SubdirPath (string subdir, string file) { string path = Path.Combine (gallery_path, subdir); if (file != null) path = Path.Combine (path, file); return path; } public string GalleryPath { get { return gallery_path; } } public string Description { get { return description; } set { description = value; } } public string Language { get { if (language == null) language=GetLanguage(); return language; } } public Uri Destination { get { return destination; } set { this.destination = value; } } public void SetScale (int size) { this.scale = true; this.size = size; requests [0].Width = size; requests [0].Height = size; } public void SetExportTags () { this.exportTags = true; } public void SetExportTagIcons () { this.exportTagIcons = true; } private string GetLanguage() { string language; if ((language = Environment.GetEnvironmentVariable ("LC_ALL")) == null) if ((language = Environment.GetEnvironmentVariable ("LC_MESSAGES")) == null) if ((language = Environment.GetEnvironmentVariable ("LANG")) == null) language = "en"; if (language.IndexOf('.') >= 0) language = language.Substring(0,language.IndexOf('.')); if (language.IndexOf('@') >= 0) language = language.Substring(0,language.IndexOf('@')); language = language.Replace('_','-'); return language; } } class OriginalGallery : FolderGallery { public OriginalGallery (IBrowsableCollection selection, string path, string name) : base (selection, path, name) { requests = new ScaleRequest [] { new ScaleRequest ("hq", 0, 0, false), new ScaleRequest ("mq", 800, 600, true), new ScaleRequest ("lq", 640, 480, false, true), new ScaleRequest ("thumbs", 120, 120, false) }; } public override void GenerateLayout () { base.GenerateLayout (); MakeDir (SubdirPath ("comments")); CreateHtaccess(); CreateInfo(); SetTime (); } protected override string ImageName (int photo_index) { return String.Format ("img-{0}.jpg", photo_index + 1); } private void SetTime () { try { for (int i = 0; i < collection.Count; i++) CreateComments (collection [i].DefaultVersion.Uri.LocalPath, i); Directory.SetLastWriteTimeUtc(gallery_path, collection [0].Time); } catch (System.Exception e) { Log.Error (e.ToString ()); } } internal void CreateZip () { MakeDir (SubdirPath ("zip")); try { if (System.IO.Directory.Exists (SubdirPath ("mq"))) CreateZipFile("mq"); if (System.IO.Directory.Exists (SubdirPath ("hq"))) CreateZipFile("hq"); } catch (System.Exception e) { Log.Error (e.ToString ()); } } private void CreateComments(string photo_path, int photo_index) { StreamWriter comment = File.CreateText(SubdirPath ("comments", photo_index + 1 + ".txt")); comment.Write("photo " + (photo_index + 1) + " "); comment.Write (collection [photo_index].Description + Environment.NewLine); comment.Close(); } private void CreateZipFile(string img_quality) { string[] filenames = Directory.GetFiles(SubdirPath (img_quality)); Crc32 crc = new Crc32(); ZipOutputStream s = new ZipOutputStream(File.Create(SubdirPath ("zip", img_quality + ".zip"))); s.SetLevel(0); foreach (string file in filenames) { FileStream fs = File.OpenRead(file); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); ZipEntry entry = new ZipEntry(Path.GetFileName(file)); entry.DateTime = DateTime.Now; // set Size and the crc, because the information // about the size and crc should be stored in the header // if it is not set it is automatically written in the footer. // (in this case size == crc == -1 in the header) // Some ZIP programs have problems with zip files that don't store // the size and crc in the header. entry.Size = fs.Length; fs.Close(); crc.Reset(); crc.Update(buffer); entry.Crc = crc.Value; s.PutNextEntry(entry); s.Write(buffer, 0, buffer.Length); } s.Finish(); s.Close(); } private void CreateHtaccess() { StreamWriter htaccess = File.CreateText(Path.Combine (gallery_path,".htaccess")); htaccess.Write("" + Environment.NewLine + "\tdeny from all" + Environment.NewLine+ "" + Environment.NewLine); htaccess.Close(); } private void CreateInfo() { StreamWriter info = File.CreateText(Path.Combine (gallery_path, "info.txt")); info.WriteLine("name|" + gallery_name); info.WriteLine("date|" + collection [0].Time.Date.ToString ("dd.MM.yyyy")); info.WriteLine("description|" + description); info.Close(); } } class HtmlGallery : FolderGallery { int perpage = 16; string stylesheet = "f-spot-simple.css"; string altstylesheet = "f-spot-simple-white.css"; string javascript = "f-spot.js"; //Note for translators: light as clear, opposite as dark static string light = Catalog.GetString("Light"); static string dark = Catalog.GetString("Dark"); ArrayList allTagNames = new ArrayList (); Hashtable allTags = new Hashtable (); Hashtable tagSets = new Hashtable (); public HtmlGallery (IBrowsableCollection selection, string path, string name) : base (selection, path, name) { requests = new ScaleRequest [] { new ScaleRequest ("hq", 0, 0, false), new ScaleRequest ("mq", 480, 320, false), new ScaleRequest ("thumbs", 120, 90, false) }; } protected override string ImageName (int photo_index) { return String.Format ("img-{0}.jpg", photo_index + 1); } public override void GenerateLayout () { if (collection.Count == 0) return; base.GenerateLayout (); IPhoto [] photos = collection.Items; int i; for (i = 0; i < photos.Length; i++) SavePhotoHtmlIndex (i); for (i = 0; i < PageCount; i++) SaveHtmlIndex (i); if (exportTags) { // identify tags present in these photos i = 0; foreach (IPhoto photo in photos) { foreach (var tag in photo.Tags) { if (!tagSets.ContainsKey (tag.Name)) { tagSets.Add (tag.Name, new ArrayList ()); allTags.Add (tag.Name, tag); } ((ArrayList) tagSets [tag.Name]).Add (i); } i++; } allTagNames = new ArrayList (tagSets.Keys); allTagNames.Sort (); // create tag pages SaveTagsPage (); foreach (string tag in allTagNames) { for (i = 0; i < TagPageCount (tag); i++) SaveTagIndex (tag, i); } } if (exportTags && exportTagIcons) { SaveTagIcons (); } MakeDir (SubdirPath ("style")); System.Reflection.Assembly assembly = System.Reflection.Assembly.GetCallingAssembly (); using (Stream s = assembly.GetManifestResourceStream (stylesheet)) { using (Stream fs = System.IO.File.Open (SubdirPath ("style", stylesheet), System.IO.FileMode.Create)) { byte [] buffer = new byte [8192]; int n; while ((n = s.Read (buffer, 0, buffer.Length)) != 0) fs.Write (buffer, 0, n); } } /* quick and stupid solution this should have been iterated over an array of stylesheets, really */ using (Stream s = assembly.GetManifestResourceStream (altstylesheet)) { using (Stream fs = System.IO.File.Open (SubdirPath ("style", altstylesheet), System.IO.FileMode.Create)) { byte [] buffer = new byte [8192]; int n = 0; while ((n = s.Read (buffer, 0, buffer.Length)) != 0) fs.Write (buffer, 0, n); } } /* Javascript for persistant style change */ MakeDir (SubdirPath ("script")); using (Stream s = assembly.GetManifestResourceStream (javascript)) { using (Stream fs = System.IO.File.Open (SubdirPath ("script", javascript), System.IO.FileMode.Create)) { byte [] buffer = new byte [8192]; int n = 0; while ((n = s.Read (buffer, 0, buffer.Length)) != 0) fs.Write (buffer, 0, n); } } } public int PageCount { get { return (int) System.Math.Ceiling (collection.Items.Length / (double)perpage); } } public int TagPageCount (string tag) { return (int) System.Math.Ceiling (((ArrayList) tagSets [tag]).Count / (double)perpage); } public string PhotoThumbPath (int item) { return System.IO.Path.Combine (requests [2].Name, ImageName (item)); } public string PhotoWebPath (int item) { return System.IO.Path.Combine (requests [1].Name, ImageName (item)); } public string PhotoOriginalPath (int item) { return System.IO.Path.Combine (requests [0].Name, ImageName (item)); } public string PhotoIndexPath (int item) { return (System.IO.Path.GetFileNameWithoutExtension (ImageName (item)) + ".html"); } public static void WritePageNav (System.Web.UI.HtmlTextWriter writer, string id, string url, string name) { writer.AddAttribute ("id", id); writer.RenderBeginTag ("div"); writer.AddAttribute ("href", url); writer.RenderBeginTag ("a"); writer.Write (name); writer.RenderEndTag (); writer.RenderEndTag (); } public void SavePhotoHtmlIndex (int i) { System.IO.StreamWriter stream = System.IO.File.CreateText (SubdirPath (PhotoIndexPath (i))); System.Web.UI.HtmlTextWriter writer = new System.Web.UI.HtmlTextWriter (stream); //writer.Indent = 4; //writer.Write (""); writer.WriteLine (""); writer.AddAttribute ("xmlns", "http://www.w3.org/1999/xhtml"); writer.AddAttribute ("xml:lang", this.Language); writer.RenderBeginTag ("html"); WriteHeader (writer); writer.AddAttribute ("onload", "checkForTheme()"); writer.RenderBeginTag ("body"); writer.AddAttribute ("class", "container1"); writer.RenderBeginTag ("div"); writer.AddAttribute ("class", "header"); writer.RenderBeginTag ("div"); writer.AddAttribute ("id", "title"); writer.RenderBeginTag ("div"); writer.Write (gallery_name); writer.RenderEndTag (); writer.AddAttribute ("class", "navi"); writer.RenderBeginTag ("div"); if (i > 0) // Abbreviation of previous WritePageNav (writer, "prev", PhotoIndexPath (i - 1), Catalog.GetString("Prev")); WritePageNav (writer, "index", IndexPath (i / perpage), Catalog.GetString("Index")); if (exportTags) WritePageNav (writer, "tagpage", TagsIndexPath (), Catalog.GetString ("Tags")); if (i < collection.Count -1) WritePageNav (writer, "next", PhotoIndexPath (i + 1), Catalog.GetString("Next")); writer.RenderEndTag (); //navi writer.RenderEndTag (); //header writer.AddAttribute ("class", "photo"); writer.RenderBeginTag ("div"); writer.AddAttribute ("href", PhotoOriginalPath (i)); writer.RenderBeginTag ("a"); writer.AddAttribute ("src", PhotoWebPath (i)); writer.AddAttribute ("alt", "#"); writer.AddAttribute ("class", "picture"); writer.RenderBeginTag ("img"); writer.RenderEndTag (); //img writer.RenderEndTag (); //a writer.AddAttribute ("id", "description"); writer.RenderBeginTag ("div"); writer.Write (collection [i].Description); writer.RenderEndTag (); //div#description writer.RenderEndTag (); //div.photo WriteTagsLinks (writer, collection [i].Tags); WriteStyleSelectionBox (writer); writer.RenderEndTag (); //container1 WriteFooter (writer); writer.RenderEndTag (); //body writer.RenderEndTag (); // html writer.Close (); stream.Close (); } public static string IndexPath (int page_num) { if (page_num == 0) return "index.html"; else return String.Format ("index{0}.html", page_num); } public static string TagsIndexPath () { return "tags.html"; } public static string TagIndexPath (string tag, int page_num) { string name = "tag_"+tag; name = name.Replace ("/", "_").Replace (" ","_"); if (page_num == 0) return name + ".html"; else return name + String.Format ("_{0}.html", page_num); } static string IndexTitle (int page) { return String.Format ("{0}", page + 1); } public void WriteHeader (System.Web.UI.HtmlTextWriter writer) { WriteHeader (writer, ""); } public void WriteHeader (System.Web.UI.HtmlTextWriter writer, string titleExtension) { writer.RenderBeginTag ("head"); /* It seems HtmlTextWriter always uses UTF-8, unless told otherwise */ writer.Write (""); writer.WriteLine (); writer.RenderBeginTag ("title"); writer.Write (gallery_name + titleExtension); writer.RenderEndTag (); writer.Write ("" + Environment.NewLine); writer.Write ("" + Environment.NewLine); writer.Write ("" + Environment.NewLine); writer.RenderEndTag (); } public static void WriteFooter (System.Web.UI.HtmlTextWriter writer) { writer.AddAttribute ("class", "footer"); writer.RenderBeginTag ("div"); writer.Write (Catalog.GetString ("Gallery generated by") + " "); writer.AddAttribute ("href", "http://f-spot.org"); writer.RenderBeginTag ("a"); writer.Write (String.Format ("{0} {1}", FSpot.Core.Defines.PACKAGE, FSpot.Core.Defines.VERSION)); writer.RenderEndTag (); writer.RenderEndTag (); } public static void WriteStyleSelectionBox (System.Web.UI.HtmlTextWriter writer) { //Style Selection Box writer.AddAttribute ("id", "styleboxcontainer"); writer.RenderBeginTag ("div"); writer.AddAttribute ("id", "stylebox"); writer.AddAttribute ("style", "display: none;"); writer.RenderBeginTag ("div"); writer.RenderBeginTag ("ul"); writer.RenderBeginTag ("li"); writer.AddAttribute ("href", "#"); writer.AddAttribute ("title", dark); writer.AddAttribute ("onclick", "setActiveStyleSheet('" + dark + "')"); writer.RenderBeginTag ("a"); writer.Write (dark); writer.RenderEndTag (); //a writer.RenderEndTag (); //li writer.RenderBeginTag ("li"); writer.AddAttribute ("href", "#"); writer.AddAttribute ("title", light); writer.AddAttribute ("onclick", "setActiveStyleSheet('" + light + "')"); writer.RenderBeginTag ("a"); writer.Write (light); writer.RenderEndTag (); //a writer.RenderEndTag (); //li writer.RenderEndTag (); //ul writer.RenderEndTag (); //div stylebox writer.RenderBeginTag ("div"); writer.Write (""); writer.Write (""); writer.Write ("" + Catalog.GetString("Show Styles") + "" + Catalog.GetString("Hide Styles") + "" + Environment.NewLine); writer.RenderEndTag (); //div toggle writer.RenderEndTag (); //div styleboxcontainer } public void WriteTagsLinks (System.Web.UI.HtmlTextWriter writer, Tag[] tags) { ArrayList tagsList = new ArrayList (tags.Length); foreach (var tag in tags) { tagsList.Add (tag); } WriteTagsLinks (writer, tagsList); } public void WriteTagsLinks (System.Web.UI.HtmlTextWriter writer, System.Collections.ICollection tags) { // check if we should write tags if (!exportTags && tags.Count>0) return; writer.AddAttribute ("id", "tagbox"); writer.RenderBeginTag ("div"); writer.RenderBeginTag ("h1"); writer.Write (Catalog.GetString ("Tags")); writer.RenderEndTag (); //h1 writer.AddAttribute ("id", "innertagbox"); writer.RenderBeginTag ("ul"); foreach (Tag tag in tags) { writer.AddAttribute ("class", "tag"); writer.RenderBeginTag ("li"); writer.AddAttribute ("href", TagIndexPath (tag.Name, 0)); writer.RenderBeginTag ("a"); if (exportTagIcons) { writer.AddAttribute ("alt", tag.Name); writer.AddAttribute ("longdesc", Catalog.GetString ("Tags: ")+tag.Name); writer.AddAttribute ("title", Catalog.GetString ("Tags: ")+tag.Name); writer.AddAttribute ("src", TagPath (tag)); writer.RenderBeginTag ("img"); writer.RenderEndTag (); } writer.Write(" "); if (exportTagIcons) writer.AddAttribute ("class", "tagtext-icon"); else writer.AddAttribute ("class", "tagtext-noicon"); writer.RenderBeginTag ("span"); writer.Write (tag.Name); writer.RenderEndTag (); //span.tagtext writer.RenderEndTag (); //a href writer.RenderEndTag (); //div.tag } writer.RenderEndTag (); //div#tagbox } public void SaveTagsPage () { System.IO.StreamWriter stream = System.IO.File.CreateText (SubdirPath (TagsIndexPath ())); System.Web.UI.HtmlTextWriter writer = new System.Web.UI.HtmlTextWriter (stream); writer.WriteLine (""); writer.AddAttribute ("xmlns", "http://www.w3.org/1999/xhtml"); writer.AddAttribute ("xml:lang", this.Language); writer.RenderBeginTag ("html"); string titleExtension = " " + Catalog.GetString ("Tags"); WriteHeader (writer, titleExtension); writer.AddAttribute ("onload", "checkForTheme()"); writer.AddAttribute ("id", "tagpage"); writer.RenderBeginTag ("body"); writer.AddAttribute ("class", "container1"); writer.RenderBeginTag ("div"); writer.AddAttribute ("class", "header"); writer.RenderBeginTag ("div"); writer.AddAttribute ("id", "title"); writer.RenderBeginTag ("div"); writer.Write (gallery_name + titleExtension); writer.RenderEndTag (); //title div writer.AddAttribute ("class", "navi"); writer.RenderBeginTag ("div"); writer.AddAttribute ("class", "navipage"); writer.RenderBeginTag ("div"); writer.AddAttribute ("href", IndexPath (0)); writer.RenderBeginTag ("a"); writer.Write (Catalog.GetString ("Index")); writer.RenderEndTag (); //a writer.RenderEndTag (); //navipage writer.RenderEndTag (); //navi writer.RenderEndTag (); //header WriteTagsLinks (writer, allTags.Values); WriteStyleSelectionBox (writer); writer.RenderEndTag (); //container1 WriteFooter (writer); writer.RenderEndTag (); //body writer.RenderEndTag (); //html writer.Close (); stream.Close (); } public void SaveTagIndex (string tag, int page_num) { System.IO.StreamWriter stream = System.IO.File.CreateText (SubdirPath (TagIndexPath (tag, page_num))); System.Web.UI.HtmlTextWriter writer = new System.Web.UI.HtmlTextWriter (stream); writer.WriteLine (""); writer.AddAttribute ("xmlns", "http://www.w3.org/1999/xhtml"); writer.AddAttribute ("xml:lang", this.Language); writer.RenderBeginTag ("html"); string titleExtension = ": " + tag; WriteHeader (writer, titleExtension); writer.AddAttribute ("onload", "checkForTheme()"); writer.RenderBeginTag ("body"); writer.AddAttribute ("class", "container1"); writer.RenderBeginTag ("div"); writer.AddAttribute ("class", "header"); writer.RenderBeginTag ("div"); writer.AddAttribute ("id", "title"); writer.RenderBeginTag ("div"); writer.Write (gallery_name + titleExtension); writer.RenderEndTag (); //title div writer.AddAttribute ("class", "navi"); writer.RenderBeginTag ("div"); // link to all photos writer.AddAttribute ("class", "navipage"); writer.RenderBeginTag ("div"); writer.AddAttribute ("href", IndexPath (0)); writer.RenderBeginTag ("a"); writer.Write ("Index"); writer.RenderEndTag (); //a writer.RenderEndTag (); //navipage // end link to all photos // link to all tags writer.AddAttribute ("class", "navipage"); writer.RenderBeginTag ("div"); writer.AddAttribute ("href", TagsIndexPath ()); writer.RenderBeginTag ("a"); writer.Write ("Tags"); writer.RenderEndTag (); //a writer.RenderEndTag (); //navipage // end link to all tags writer.AddAttribute ("class", "navilabel"); writer.RenderBeginTag ("div"); writer.Write (Catalog.GetString ("Page:")); writer.RenderEndTag (); //pages div int i; for (i = 0; i < TagPageCount (tag); i++) { writer.AddAttribute ("class", i == page_num ? "navipage-current" : "navipage"); writer.RenderBeginTag ("div"); writer.AddAttribute ("href", TagIndexPath (tag, i)); writer.RenderBeginTag ("a"); writer.Write (IndexTitle (i)); writer.RenderEndTag (); //a writer.RenderEndTag (); //navipage } writer.RenderEndTag (); //navi writer.RenderEndTag (); //header writer.AddAttribute ("class", "thumbs"); writer.RenderBeginTag ("div"); int start = page_num * perpage; ArrayList tagSet = (ArrayList) tagSets [tag]; int end = Math.Min (start + perpage, tagSet.Count); for (i = start; i < end; i++) { writer.AddAttribute ("href", PhotoIndexPath ((int) tagSet [i])); writer.RenderBeginTag ("a"); writer.AddAttribute ("src", PhotoThumbPath ((int) tagSet [i])); writer.AddAttribute ("alt", "#"); writer.RenderBeginTag ("img"); writer.RenderEndTag (); writer.RenderEndTag (); //a } writer.RenderEndTag (); //thumbs writer.AddAttribute ("id", "gallery_description"); writer.RenderBeginTag ("div"); writer.Write (description); writer.RenderEndTag (); //description WriteStyleSelectionBox (writer); writer.RenderEndTag (); //container1 WriteFooter (writer); writer.RenderEndTag (); //body writer.RenderEndTag (); //html writer.Close (); stream.Close (); } public void SaveTagIcons () { MakeDir (SubdirPath ("tags")); foreach (Tag tag in allTags.Values) SaveTagIcon (tag); } public void SaveTagIcon (Tag tag) { Gdk.Pixbuf icon = tag.Icon; Gdk.Pixbuf scaled = null; if (icon.Height != 52 || icon.Width != 52) { scaled=icon.ScaleSimple(52,52,Gdk.InterpType.Bilinear); } else scaled=icon.Copy (); scaled.Save (SubdirPath("tags",TagName(tag)), "png"); scaled.Dispose (); } public string TagPath (Tag tag) { return System.IO.Path.Combine("tags",TagName(tag)); } public string TagName (Tag tag) { return "tag_"+ ((DbItem)tag).Id+".png"; } public void SaveHtmlIndex (int page_num) { System.IO.StreamWriter stream = System.IO.File.CreateText (SubdirPath (IndexPath (page_num))); System.Web.UI.HtmlTextWriter writer = new System.Web.UI.HtmlTextWriter (stream); //writer.Indent = 4; //writer.Write (""); writer.WriteLine (""); writer.AddAttribute ("xmlns", "http://www.w3.org/1999/xhtml"); writer.AddAttribute ("xml:lang", this.Language); writer.RenderBeginTag ("html"); WriteHeader (writer); writer.AddAttribute ("onload", "checkForTheme()"); writer.RenderBeginTag ("body"); writer.AddAttribute ("class", "container1"); writer.RenderBeginTag ("div"); writer.AddAttribute ("class", "header"); writer.RenderBeginTag ("div"); writer.AddAttribute ("id", "title"); writer.RenderBeginTag ("div"); writer.Write (gallery_name); writer.RenderEndTag (); //title div writer.AddAttribute ("class", "navi"); writer.RenderBeginTag ("div"); if (exportTags) { // link to all tags writer.AddAttribute ("class", "navipage"); writer.RenderBeginTag ("div"); writer.AddAttribute ("href", TagsIndexPath ()); writer.RenderBeginTag ("a"); writer.Write ("Tags"); writer.RenderEndTag (); //a writer.RenderEndTag (); //navipage // end link to all tags } writer.AddAttribute ("class", "navilabel"); writer.RenderBeginTag ("div"); writer.Write (Catalog.GetString ("Page:")); writer.RenderEndTag (); //pages div int i; for (i = 0; i < PageCount; i++) { writer.AddAttribute ("class", i == page_num ? "navipage-current" : "navipage"); writer.RenderBeginTag ("div"); writer.AddAttribute ("href", IndexPath (i)); writer.RenderBeginTag ("a"); writer.Write (IndexTitle (i)); writer.RenderEndTag (); //a writer.RenderEndTag (); //navipage } writer.RenderEndTag (); //navi writer.RenderEndTag (); //header writer.AddAttribute ("class", "thumbs"); writer.RenderBeginTag ("div"); int start = page_num * perpage; int end = Math.Min (start + perpage, collection.Count); for (i = start; i < end; i++) { writer.AddAttribute ("href", PhotoIndexPath (i)); writer.RenderBeginTag ("a"); writer.AddAttribute ("src", PhotoThumbPath (i)); writer.AddAttribute ("alt", "#"); writer.RenderBeginTag ("img"); writer.RenderEndTag (); writer.RenderEndTag (); //a } writer.RenderEndTag (); //thumbs writer.AddAttribute ("id", "gallery_description"); writer.RenderBeginTag ("div"); writer.Write (description); writer.RenderEndTag (); //description WriteStyleSelectionBox (writer); writer.RenderEndTag (); //container1 WriteFooter (writer); writer.RenderEndTag (); //body writer.RenderEndTag (); //html writer.Close (); stream.Close (); } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Folder/Resources/0000777000175000017500000000000011503407455026403 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Folder/Resources/f-spot.js0000644000175000017500000000675211430555235030156 0ustar00rubenruben00000000000000function setActiveStyleSheet(title) { var i, a, main; for(i=0; (a = document.getElementsByTagName("link")[i]); i++) { if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) { a.disabled = true; if(a.getAttribute("title") == title) a.disabled = false; } } if (title!="") { setCookie("theme", title); } } function getInactiveStyleSheet() { var i, a; for(i=0; (a = document.getElementsByTagName("link")[i]); i++) { if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && a.disabled) return a.getAttribute("title"); } return null; } function setCookie(name, value, expires, path, domain, secure) { document.cookie= name + "=" + escape(value) + ((expires) ? "; expires=" + expires.toGMTString() : "") + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : ""); } function getCookie(name) { var dc = document.cookie; var prefix = name + "="; var begin = dc.indexOf("; " + prefix); if (begin == -1) { begin = dc.indexOf(prefix); if (begin != 0) return null; } else { begin += 2; } var end = document.cookie.indexOf(";", begin); if (end == -1) { end = dc.length; } return unescape(dc.substring(begin + prefix.length, end)); } function deleteCookie(name, path, domain) { if (getCookie(name)) { document.cookie = name + "=" + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + "; expires=Thu, 01-Jan-70 00:00:01 GMT"; } } function checkForTheme() { var theme = getCookie('theme'); //alert(theme); if (theme) { setActiveStyleSheet(theme); } } // to hide and show the styles // inspired by www.wikipedia.org function toggle_stylebox() { var stylebox = document.getElementById('stylebox'); var showlink=document.getElementById('showlink'); var hidelink=document.getElementById('hidelink'); if(stylebox.style.display == 'none') { stylebox_was = stylebox.style.display; stylebox.style.display = ''; hidelink.style.display=''; showlink.style.display='none'; } else { stylebox.style.display = stylebox_was; hidelink.style.display='none'; showlink.style.display=''; } } document.onkeyup = Navigate; // if key is pressed call function for navigation function Navigate(key) { var _Key = (window.event) ? event.keyCode : key.keyCode; switch(_Key) { case 37: //arrow left window.location = nav(-1); break; case 39: //arrow right window.location = nav(+1); break; } } //calculate next file name function nav(direction) { var regexp = new RegExp( "img-([0-9\.]*).html" ); var result = regexp.exec( window.location.href ); if ( result == null ) // redirect from index*.html to img-1.hml with any of key return "img-1.html"; else var next = parseInt(result[1]) + parseInt(direction); //calculate next file number if( next == 0 || (next > result[1] && !checkobject('next'))) //if next page number is higher then current, check if exist id="next" on page, if next number for page is 0 or if js is called from other then page then img-*.html: redirect to index.html return "index.html"; else // return next html page name for redirection return "img-" + next + ".html"; } //check if object exist in webpage id="object" function checkobject(object) { if (document.getElementById(object) != null) return true; else return false; } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Folder/Resources/f-spot-simple.css0000644000175000017500000000625711430555235031621 0ustar00rubenruben00000000000000/* Default F-Spot HTML Gallery Stylesheet Jakub 'jimmac' Steiner */ body { font-family: luxi sans, trebuchet ms, sans-serif; color: #888; margin: 12px; background-color: #3c3c3c; } .header { /* position: relative; */ width: 100%; margin-bottom: 20px; padding: 0px; border-bottom: 1px dotted #888; font-size: 12px; } #title { color: #bbb; font-weight: bold; margin: 0; padding: 0; margin-left: 3px; font-size: large; letter-spacing: .5em; } div.navi { float: right; text-align: right; margin-top: 3px; } div.navilabel { padding: 3px 10px 0px 0px; margin-right: 10px; } div.navi div { float: left; margin: 2px; } /* image pages navigation */ div.navi a { display: block; width: 80px; height: 17px; -moz-border-radius: 3px; border: 1px solid #444; text-align: center; padding-top: 3px; } div#index a:hover, div#prev a:hover, div#next a:hover { text-decoration: none; background-color: #c49200; color: #333; } /* index page navigation */ div.navi div.navipage a, div.navi div.navipage-current a { display: block; width: auto; padding-left: 6px; padding-right: 6px; height: 17px; -moz-border-radius: 3px; border: 1px solid #444; text-align: center; padding-top: 3px; } .navipage a:hover, .navipage-current a:hover { text-decoration: none; background-color: #c49200; color: #333; } .navipage-current a { background-color: #666; } a { text-decoration: none; color: #c49200; } a:hover { text-decoration: underline; color: #da1; } div.container1 { width: 630px; margin: auto; } div.photo { text-align: center; vertical-align: middle; margin-top: 5%; } div.thumbs { clear: both; padding: 6px; text-align: center; } div.thumbs a { margin: 6px; display: block; float: left; width: 140px; height: 140px; line-height: 140px; border: 1px solid #727272; background-color: #282828; -moz-border-radius: 5px; } div.thumbs img { padding: 4px; vertical-align: middle; border: 0px; } div#gallery_description { clear: both; padding: 10px 12px 0px 12px; } div.photo img.picture { padding: 16px; border: 1px solid #555; -moz-border-radius: 7px; background-color: #333; margin: 20px; } ul#innertagbox { display: inline; margin: 0px; padding: 0px; } div#tagbox { -moz-border-radius: 7px; border: 1px solid #555; background-color: #333; padding: 5px; margin-top: 2em; display: inline-block; } div#tagbox h1 { margin-left: 1em; } div#tagbox li { display: block; margin: 3px; } div#tagbox img.tag { margin: 5px; } div#tagbox .tagtext-icon { position:relative; top: -22px; } div.thumbs a:hover { background-color: #222; border: 2px solid #c49200; margin: 5px; } div.photo div { text-align: center; margin-top: 6px; font-size: 18px; font-family: Luxi Serif, Georgia, Helvetica; // font-style: italic; } div.footer { clear: both; padding: 20px 10px 0px 10px; font-size: 10px; width: 640px; margin: auto; } div#styleboxcontainer { position: fixed; bottom: 0px; right: 8px; font-size: 10px; margin: 4px; padding: 4px; } #stylebox ul { list-style-type: none; padding-left: 0px; } /* tags list */ #tagbox h1 { font-size: large; } #tagbox .tag { margin-left: 1em; } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Folder/Resources/f-spot-simple-white.css0000644000175000017500000000624311430555235032732 0ustar00rubenruben00000000000000/* Light F-Spot HTML Gallery Stylesheet Giacomo Rizzo based on Jakub 'jimmac' Steiner work. */ body { font-family: luxi sans, trebuchet ms, sans-serif; color: #888; margin: 12px; } .header { /* position: relative; */ width: 100%; margin-bottom: 20px; padding: 0px; border-bottom: 1px dotted #888; font-size: 12px; } #title { color: #bbb; font-weight: bold; margin: 0; padding: 0; margin-left: 3px; font-size: large; letter-spacing: .5em; } div.navi { float: right; text-align: right; margin-top: 3px; } div.navilabel { padding: 3px 10px 0px 0px; margin-right: 10px; } div.navi div { float: left; margin: 2px; } /* image pages navigation */ div.navi a { display: block; width: 80px; height: 17px; -moz-border-radius: 3px; border: 1px solid #444; text-align: center; padding-top: 3px; } div#index a:hover, div#prev a:hover, div#next a:hover { text-decoration: none; background-color: #c49200; color: #333; } /* index page navigation */ div.navi div.navipage a, div.navi div.navipage-current a { display: block; width: auto; padding-left: 6px; padding-right: 6px; height: 17px; -moz-border-radius: 3px; border: 1px solid #444; text-align: center; padding-top: 3px; } .navipage a:hover, .navipage-current a:hover { text-decoration: none; background-color: #c49200; color: #333; } .navipage-current a { background-color: #666; } a { text-decoration: none; color: #c49200; } a:hover { text-decoration: underline; color: #da1; } div.container1 { width: 630px; margin: auto; } div.photo { text-align: center; vertical-align: middle; margin-top: 5%; } div.thumbs { clear: both; padding: 6px; text-align: center; } div.thumbs a { margin: 6px; display: block; float: left; width: 140px; height: 140px; line-height: 140px; border: 1px solid #727272; -moz-border-radius: 5px; } div.thumbs img { padding: 4px; vertical-align: middle; border: 0px; } div#gallery_description { clear: both; padding: 10px 12px 0px 12px; } div.photo img.picture { padding: 16px; border: 1px solid #555; -moz-border-radius: 7px; background-color: #333; margin: 20px; } ul#innertagbox { display: inline; margin: 0px; padding: 0px; } div#tagbox { -moz-border-radius: 7px; border: 1px solid #555; background-color: #333; padding: 5px; margin-top: 2em; display: inline-block; } div#tagbox h1 { margin-left: 1em; } div#tagbox li { display: block; margin: 3px; } div#tagbox img.tag { margin: 5px; } div#tagbox .tagtext-icon { position:relative; top: -22px; } div.thumbs a:hover { background-color: #222; border: 2px solid #c49200; margin: 5px; } div.photo div { text-align: center; margin-top: 6px; font-size: 18px; font-family: Luxi Serif, Georgia, Helvetica; // font-style: italic; } div.footer { clear: both; padding: 20px 10px 0px 10px; font-size: 10px; width: 640px; margin: auto; } div#styleboxcontainer { position: fixed; bottom: 0px; right: 8px; font-size: 10px; margin: 4px; padding: 4px; } #stylebox ul { list-style-type: none; padding-left: 0px; } /* tags list */ #tagbox h1 { font-size: large; } #tagbox .tag { margin-left: 1em; } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Folder/Resources/FolderExport.addin.xml0000644000175000017500000000102411430555235032610 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Folder/Resources/folder_export.ui0000644000175000017500000006513511431562107031620 0ustar00rubenruben00000000000000 Folder Export dialog False True vertical True 6 True 0 none True 12 180 True True automatic automatic in True <b>Photos</b> True 0 True vertical 6 True 0 none True 12 True vertical 6 True 3 2 6 6 True 0 _Folder: True GTK_FILL True G_allery Name: True name_entry 1 2 GTK_FILL True True 1 2 1 2 True 6 1 2 GTK_FILL GTK_FILL True True 1 2 2 3 True D_escription: True description_entry 2 3 GTK_FILL 0 Open _destination when done exporting True True False True True True False False 1 True False False 2 True <b>Destination</b> True False False 0 True 0 none True 12 True vertical 6 Create standalone _web gallery True True False True True True False False 0 _Save the files only True True False True True static_radio False False 1 Create _gallery using "Original" True True False True True static_radio False False 2 True <b>Export Method</b> True False False 1 True 0 none True 12 True vertical 6 True _Resize to: True True False True True False False 0 True True adjustment1 1 False False 1 True pixels False False 2 0 True Export _tags True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True True False False 0 Export tag _icons True True False True True True False False 1 1 True <b>Style</b> True 2 1 1 True end gtk-cancel True True True False True False False 0 _Export True True True False True False False 1 False end 0 button20 export_button 400 10000 1 10 10 f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Folder/Makefile.in0000644000175000017500000006705411503407266026506 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Exporters/FSpot.Exporters.Folder ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Exporters.Folder TARGET = library LINK = $(REF_FSPOT_EXTENSION_FOLDEREXPORT) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Exporters.Folder/FolderExport.cs RESOURCES = \ Resources/folder_export.ui \ Resources/FolderExport.addin.xml \ Resources/f-spot.js \ Resources/f-spot-simple.css \ Resources/f-spot-simple-white.css # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.Folder/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.Folder/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Folder/Makefile.am0000644000175000017500000000061111431562107026453 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Exporters.Folder TARGET = library LINK = $(REF_FSPOT_EXTENSION_FOLDEREXPORT) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Exporters.Folder/FolderExport.cs RESOURCES = \ Resources/folder_export.ui \ Resources/FolderExport.addin.xml \ Resources/f-spot.js \ Resources/f-spot-simple.css \ Resources/f-spot-simple-white.css include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/0000777000175000017500000000000011503407461024416 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/FSpot.Exporters.Tabblo/0000777000175000017500000000000011503407461030645 5ustar00rubenruben00000000000000TabbloExportModel.cs0000644000175000017500000002307611431562107034506 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/FSpot.Exporters.Tabblo// // FSpotTabbloExport.TabbloExportModel // // Authors: // Wojciech Dzierzanowski (wojciech.dzierzanowski@gmail.com) // // (C) Copyright 2009 Wojciech Dzierzanowski // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using Hyena; using Mono.Tabblo; using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using FSpot.Core; namespace FSpot.Exporters.Tabblo { class TabbloExportModel : Mono.Tabblo.IPreferences { private IBrowsableCollection photo_collection; private string username; private string password; private bool attach_tags = false; private FSpot.Core.Tag [] attached_tags; private bool remove_tags = false; private FSpot.Core.Tag [] removed_tags; private static readonly FSpot.Core.Tag [] no_tags = new FSpot.Core.Tag [0]; // `FSpot.Preferences' constants. private const string PrefPrefix = FSpot.Preferences.APP_FSPOT_EXPORT + "tabblo/"; private const string PrefAttachTags = PrefPrefix + "attach_tags"; private const string PrefAttachedTags = PrefPrefix + "attached_tags"; private const string PrefRemoveTags = PrefPrefix + "remove_tags"; private const string PrefRemovedTags = PrefPrefix + "removed_tags"; // Keyring constants. private const string KeyringItemName = "Tabblo Account"; private const string KeyringItemApp = "FSpotTabbloExport"; private const string KeyringItemNameAttr = "name"; private const string KeyringItemUsernameAttr = "username"; private const string KeyringItemAppAttr = "application"; // The photos. internal IBrowsableCollection PhotoCollection { get { return photo_collection; } set { photo_collection = value; } } internal IPhoto [] Photos { get { return photo_collection.Items; } } // `Mono.Tabblo.IPreferences' implementation. internal event EventHandler UsernameChanged; public string Username { get { return null != username ? username : string.Empty; } internal set { string old_value = username; username = value; OnMaybePropertyChanged (old_value, username, UsernameChanged); } } internal event EventHandler PasswordChanged; public string Password { get { return null != password ? password : string.Empty; } internal set { string old_value = password; password = value; OnMaybePropertyChanged (old_value, password, PasswordChanged); } } // FIXME: Hopefully, we'll have a use for this one day. Then // we'll have to actually implement the property. public string Privacy { get { return "circle"; } } // The tags. internal event EventHandler AttachTagsChanged; internal bool AttachTags { get { return attach_tags; } set { bool old_value = attach_tags; attach_tags = value; OnMaybePropertyChanged (old_value, attach_tags, AttachTagsChanged); } } internal event EventHandler AttachedTagsChanged; internal FSpot.Core.Tag [] AttachedTags { get { return null != attached_tags ? attached_tags : no_tags; } set { FSpot.Core.Tag [] old_value = attached_tags; attached_tags = value; OnMaybePropertyChanged (old_value, attached_tags, AttachedTagsChanged); } } internal event EventHandler RemoveTagsChanged; internal bool RemoveTags { get { return remove_tags; } set { bool old_value = remove_tags; remove_tags = value; OnMaybePropertyChanged (old_value, remove_tags, RemoveTagsChanged); } } internal event EventHandler RemovedTagsChanged; internal FSpot.Core.Tag [] RemovedTags { get { return null != removed_tags ? removed_tags : no_tags; } set { FSpot.Core.Tag [] old_value = removed_tags; removed_tags = value; OnMaybePropertyChanged (old_value, removed_tags, RemovedTagsChanged); } } private void OnMaybePropertyChanged (object old_value, object new_value, EventHandler handler) { if (!object.Equals (old_value, new_value) && null != handler) { handler (this, EventArgs.Empty); } } internal void Serialize () { WriteAccountData (); WriteTagPreferences (); } internal void Deserialize () { ReadTagPreferences (); ReadAccountData (); } private void WriteAccountData () { try { string keyring = Gnome.Keyring .Ring.GetDefaultKeyring (); Hashtable attrs = new Hashtable (); attrs [KeyringItemNameAttr] = KeyringItemName; attrs [KeyringItemAppAttr] = KeyringItemApp; Gnome.Keyring.ItemType type = Gnome.Keyring .ItemType.GenericSecret; try { Gnome.Keyring.ItemData [] items = Gnome .Keyring.Ring.Find ( type, attrs); foreach (Gnome.Keyring.ItemData item in items) { Gnome.Keyring.Ring.DeleteItem ( keyring, item.ItemID); } } catch (Gnome.Keyring.KeyringException e) { Log.Exception ("Error deleting old " + "account data", e); } attrs [KeyringItemUsernameAttr] = Username; Gnome.Keyring.Ring.CreateItem (keyring, type, KeyringItemName, attrs, Password, true); } catch (Gnome.Keyring.KeyringException e) { Log.Exception ("Error writing account data", e); } } private void ReadAccountData () { string new_username = string.Empty; string new_password = string.Empty; Hashtable attrs = new Hashtable (); attrs [KeyringItemNameAttr] = KeyringItemName; attrs [KeyringItemAppAttr] = KeyringItemApp; try { Gnome.Keyring.ItemType type = Gnome.Keyring .ItemType.GenericSecret; Gnome.Keyring.ItemData [] items = Gnome.Keyring.Ring.Find ( type, attrs); if (1 < items.Length) { Log.WarningFormat ("More than one {0} " + " found in keyring", KeyringItemName); } if (1 <= items.Length) { Log.DebugFormat ("{0} data found in " + "keyring", KeyringItemName); attrs = items [0].Attributes; new_username = (string) attrs [ KeyringItemUsernameAttr]; new_password = items [0].Secret; } } catch (Gnome.Keyring.KeyringException e) { Log.Exception ("Error reading account data", e); } Username = new_username; Password = new_password; } private void WriteTagPreferences () { Debug.Assert (!AttachTags || (null != AttachedTags && AttachedTags.Length > 0)); FSpot.Preferences.Set (PrefAttachedTags, ToIds (AttachedTags)); FSpot.Preferences.Set (PrefAttachTags, AttachTags); Debug.Assert (!RemoveTags || (null != RemovedTags && RemovedTags.Length > 0)); FSpot.Preferences.Set (PrefRemovedTags, ToIds (RemovedTags)); FSpot.Preferences.Set (PrefRemoveTags, RemoveTags); } private void ReadTagPreferences () { int [] attached_tags_pref = null; if (FSpot.Preferences.TryGet (PrefAttachedTags, out attached_tags_pref)) { AttachedTags = ToTags (attached_tags_pref); } // FIXME: How do you `java.util.Arrays.toString(int[])' // in C#? Log.Debug ("Read from prefs: attached_tags = " + AttachedTags); bool attach_tags_pref = false; if (FSpot.Preferences.TryGet (PrefAttachTags, out attach_tags_pref)) { AttachTags = attach_tags_pref && AttachedTags.Length > 0; } Log.Debug ("Read from prefs: attach_tags_pref = " + attach_tags_pref); int [] removed_tags_pref = null; if (FSpot.Preferences.TryGet (PrefRemovedTags, out removed_tags_pref)) { RemovedTags = ToTags (removed_tags_pref); } // FIXME: How do you `java.util.Arrays.toString(int[])' // in C#? Log.Debug ("Read from prefs: removed_tags_pref = " + removed_tags_pref); bool remove_tags_pref = false; if (FSpot.Preferences.TryGet (PrefRemoveTags, out remove_tags_pref)) { RemoveTags = remove_tags_pref && RemovedTags.Length > 0; } Log.Debug ("Read from prefs: remove_tags_pref = " + remove_tags_pref); } private static FSpot.Core.Tag [] ToTags (int [] ids) { if (null == ids) { return null; } List tags = new List (ids.Length); foreach (int id in ids) { FSpot.Core.Tag tag = FSpot.App.Instance.Database.Tags .GetTagById (id); if (null != tag) { tags.Add (tag); } else { Log.Warning ("No such tag ID in DB: " + id); } } return tags.ToArray (); } private static int [] ToIds (FSpot.Core.Tag [] tags) { if (null == tags) { return null; } int [] ids = new int [tags.Length]; for (int i = 0; i < ids.Length; ++i) { ids [i] = (int) tags [i].Id; } return ids; } } } BlindTrustCertificatePolicy.cs0000644000175000017500000000331011430555235036525 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/FSpot.Exporters.Tabblo// // FSpotTabbloExport.BlindTrustCertificatePolicy // // Authors: // Wojciech Dzierzanowski (wojciech.dzierzanowski@gmail.com) // // (C) Copyright 2009 Wojciech Dzierzanowski // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System.Net; using System.Security.Cryptography.X509Certificates; using Hyena; namespace FSpot.Exporters.Tabblo { class BlindTrustCertificatePolicy : ICertificatePolicy { public bool CheckValidationResult (ServicePoint service_point, X509Certificate certificate, WebRequest request, int problem) { Log.Warning ("Blindly trusting " + request.RequestUri); return true; } } } FSpotTraceListener.cs0000644000175000017500000000300711430555235034633 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/FSpot.Exporters.Tabblo// // FSpotTabbloExport.FSpotTraceListener // // Authors: // Wojciech Dzierzanowski (wojciech.dzierzanowski@gmail.com) // // (C) Copyright 2009 Wojciech Dzierzanowski // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using Hyena; namespace FSpot.Exporters.Tabblo { class FSpotTraceListener : System.Diagnostics.TraceListener { public override void Write (string message) { Log.Debug ("Mono.Tabblo", message); } public override void WriteLine (string message) { Write (message); } } } UserDecisionCertificatePolicy.cs0000644000175000017500000000635311430555235037041 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/FSpot.Exporters.Tabblo// // FSpotTabbloExport.UserDecisionCertificatePolicy // // Authors: // Wojciech Dzierzanowski (wojciech.dzierzanowski@gmail.com) // // (C) Copyright 2008 Wojciech Dzierzanowski // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Diagnostics; using System.Net; using System.Reflection; using System.Security.Cryptography.X509Certificates; using System.Threading; using Hyena; namespace FSpot.Exporters.Tabblo { class UserDecisionCertificatePolicy : ApplicationCentricCertificatePolicy { private const string DialogName = "trust_error_dialog"; [GtkBeans.Builder.Object] Gtk.Dialog dialog; [GtkBeans.Builder.Object] Gtk.Label url_label; [GtkBeans.Builder.Object] Gtk.RadioButton abort_radiobutton; [GtkBeans.Builder.Object] Gtk.RadioButton once_radiobutton; [GtkBeans.Builder.Object] Gtk.RadioButton always_radiobutton; private WebRequest request; private Decision decision; private Object decision_lock = new Object (); private ManualResetEvent decision_event; protected override Decision GetDecision ( X509Certificate certificate, WebRequest request) { this.request = request; lock (decision_lock) { GLib.Idle.Add (this.DoGetDecision); decision_event = new ManualResetEvent (false); decision_event.WaitOne (); } return decision; } private bool DoGetDecision () { GtkBeans.Builder builder = new GtkBeans.Builder ( Assembly.GetExecutingAssembly (), "TrustError.ui", null); builder.Autoconnect (this); dialog = (Gtk.Dialog) builder.GetObject (DialogName); url_label.Markup = String.Format ( url_label.Text, String.Format ( "{0}", request.RequestUri)); Gtk.ResponseType response = (Gtk.ResponseType) dialog.Run (); Log.Debug ("Decision dialog response: " + response); dialog.Destroy (); decision = Decision.DontTrust; if (0 == response) { if (abort_radiobutton.Active) { decision = Decision.DontTrust; } else if (once_radiobutton.Active) { decision = Decision.TrustOnce; } else if (always_radiobutton.Active) { decision = Decision.TrustAlways; } else { Debug.Assert (false, "Unhandled decision"); } } decision_event.Set (); return false; } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/FSpot.Exporters.Tabblo/TabbloExport.cs0000644000175000017500000002435311431562107033603 0ustar00rubenruben00000000000000// // FSpotTabbloExport.TabbloExport // // Authors: // Wojciech Dzierzanowski (wojciech.dzierzanowski@gmail.com) // // (C) Copyright 2009 Wojciech Dzierzanowski // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using Mono.Tabblo; using Mono.Unix; using System; using System.Collections; using System.Diagnostics; using System.Net; using System.Threading; using Hyena; using FSpot; using FSpot.Core; using FSpot.UI.Dialog; namespace FSpot.Exporters.Tabblo { public class TabbloExport : FSpot.Extensions.IExporter { private readonly TabbloExportModel model; private TabbloExportView main_dialog; private ThreadProgressDialog progress_dialog; private readonly Uploader uploader; private TraceListener debug_listener; private TotalUploadProgress upload_progress; // // Initialization // public TabbloExport () { model = new TabbloExportModel (); uploader = new Uploader (model); } public void Run (IBrowsableCollection photos) { if (null == photos || null == photos.Items) { throw new ArgumentNullException ("photos"); } main_dialog = new TabbloExportView (photos); InitBindings (); model.Deserialize (); model.PhotoCollection = photos; // Model deserialization triggers the various event // handlers, which can cause the default widget to lose // focus (it can be invalid, and hence disabled, for a // moment). main_dialog.ResetFocus (); main_dialog.Show (); } private void InitBindings () { Debug.Assert (null != model); Debug.Assert (null != main_dialog); main_dialog.Response += HandleResponse; // Account data model.UsernameChanged += HandleUsernameChanged; main_dialog.username_entry.Changed += HandleUsernameChanged; model.PasswordChanged += HandlePasswordChanged; main_dialog.password_entry.Changed += HandlePasswordChanged; // Tags model.AttachTagsChanged += HandleAttachTagsToggled; main_dialog.attach_tags_button.Toggled += HandleAttachTagsToggled; model.AttachedTagsChanged += HandleAttachedTagsChanged; main_dialog.attached_tags_select_button.Clicked += HandleSelectAttachedTagsClicked; model.RemoveTagsChanged += HandleRemoveTagsToggled; main_dialog.remove_tags_button.Toggled += HandleRemoveTagsToggled; model.RemovedTagsChanged += HandleRemovedTagsChanged; main_dialog.removed_tags_select_button.Clicked += HandleSelectRemovedTagsClicked; } // // Event handlers // private void HandleUsernameChanged (object sender, EventArgs args) { if (model == sender) { main_dialog.username_entry.Text = model.Username; OnAccountDataChanged (); } else { model.Username = main_dialog.username_entry.Text; } } private void HandlePasswordChanged (object sender, EventArgs args) { if (model == sender) { main_dialog.password_entry.Text = model.Password; OnAccountDataChanged (); } else { model.Password = main_dialog.password_entry.Text; } } private void OnAccountDataChanged () { main_dialog.Validated = model.Username.Length > 0 && model.Password.Length > 0; } private void HandleAttachTagsToggled (object sender, EventArgs args) { if (model == sender) { if (model.AttachTags && 0 == model .AttachedTags.Length) { model.AttachedTags = SelectTags (); model.AttachTags = 0 < model.AttachedTags.Length; } main_dialog.attach_tags_button.Active = model.AttachTags; main_dialog.attached_tags_select_button .Sensitive = model.AttachTags; } else { model.AttachTags = main_dialog.attach_tags_button.Active; } } private void HandleRemoveTagsToggled (object sender, EventArgs args) { if (model == sender) { if (model.RemoveTags && 0 == model .RemovedTags.Length) { model.RemovedTags = SelectTags (); model.RemoveTags = 0 < model.RemovedTags.Length; } main_dialog.remove_tags_button.Active = model.RemoveTags; main_dialog.removed_tags_select_button .Sensitive = model.RemoveTags; } else { model.RemoveTags = main_dialog.remove_tags_button.Active; } } private void HandleSelectAttachedTagsClicked (object sender, EventArgs args) { Debug.Assert (model != sender); FSpot.Core.Tag [] tags = SelectTags (); if (null != tags) { model.AttachedTags = tags; } } private void HandleSelectRemovedTagsClicked (object sender, EventArgs args) { Debug.Assert (model != sender); FSpot.Core.Tag [] tags = SelectTags (); if (null != tags) { model.RemovedTags = tags; } } private void HandleAttachedTagsChanged (object sender, EventArgs args) { Debug.Assert (model == sender); main_dialog.attached_tags_view.Tags = model.AttachedTags; main_dialog.attach_tags_button.Active = model.AttachTags && model.AttachedTags.Length > 0; } private void HandleRemovedTagsChanged (object sender, EventArgs args) { Debug.Assert (model == sender); main_dialog.removed_tags_view.Tags = model.RemovedTags; main_dialog.remove_tags_button.Active = model.RemoveTags && model.RemovedTags.Length > 0; } private FSpot.Core.Tag [] SelectTags () { TagStore tag_store = FSpot.App.Instance.Database.Tags; TagSelectionDialog tagDialog = new TagSelectionDialog (tag_store); FSpot.Core.Tag [] tags = tagDialog.Run (); tagDialog.Hide (); return tags; } private void HandleResponse (object sender, Gtk.ResponseArgs args) { main_dialog.Destroy (); if (Gtk.ResponseType.Ok != args.ResponseId) { Log.Information ("Tabblo export was canceled."); return; } model.Serialize (); Log.Information ("Starting Tabblo export"); Thread upload_thread = new Thread (new ThreadStart (Upload)); progress_dialog = new ThreadProgressDialog ( upload_thread, model.Photos.Length); progress_dialog.Start (); } // // Upload logic // private void Upload () { Debug.Assert (null != uploader); Picture [] pictures = GetPicturesForUpload (); Debug.Assert (pictures.Length == model.Photos.Length); OnUploadStarted (pictures); try { for (int i = 0; i < pictures.Length; ++i) { uploader.Upload (pictures [i]); OnPhotoUploaded (model.Photos [i]); } progress_dialog.Message = Catalog.GetString ( "Done sending photos"); progress_dialog.ProgressText = Catalog .GetString ("Upload complete"); progress_dialog.Fraction = 1; progress_dialog.ButtonLabel = Gtk.Stock.Ok; } catch (TabbloException e) { progress_dialog.Message = Catalog.GetString ( "Error uploading to Tabblo: ") + e.Message; progress_dialog.ProgressText = Catalog.GetString ("Error"); // FIXME: Retry logic? // progressDialog.PerformRetrySkip (); Log.Exception (e); } finally { OnUploadFinished (); } } private void OnUploadStarted (Picture [] pictures) { Debug.Assert (null != pictures); Debug.Assert (null != uploader); Debug.Assert (null != progress_dialog); // Initialize the debug output listener. // `Mono.Tabblo' uses the standard // `System.Diagnostics.Debug' facilities for debug // output only. debug_listener = new FSpotTraceListener (); Debug.Listeners.Add (debug_listener); // Initialize the progress handler. upload_progress = new FSpotUploadProgress ( pictures, progress_dialog); uploader.ProgressChanged += upload_progress.HandleProgress; // Set up the certificate policy. ServicePointManager.CertificatePolicy = new UserDecisionCertificatePolicy (); } private void OnUploadFinished () { Debug.Assert (null != uploader); Debug.Assert (null != debug_listener); Debug.Assert (null != upload_progress); uploader.ProgressChanged -= upload_progress.HandleProgress; Debug.Listeners.Remove (debug_listener); } private void OnPhotoUploaded (IPhoto item) { Debug.Assert (null != item); if (!model.AttachTags && !model.RemoveTags) { return; } PhotoStore photo_store = FSpot.App.Instance.Database.Photos; FSpot.Photo photo = photo_store.GetByUri ( item.DefaultVersion.Uri); Debug.Assert (null != photo); if (null == photo) { return; } if (model.AttachTags) { photo.AddTag (model.AttachedTags); } if (model.RemoveTags) { photo.RemoveTag (model.RemovedTags); } photo_store.Commit (photo); } private Picture [] GetPicturesForUpload () { Picture [] pictures = new Picture [model.Photos.Length]; IPhoto [] items = model.Photos; for (int i = 0; i < pictures.Length; ++i) { string mime_type = GLib.FileFactory.NewForUri (items [i].DefaultVersion.Uri). QueryInfo ("standard::content-type", GLib.FileQueryInfoFlags.None, null).ContentType; pictures [i] = new Picture (items [i].Name, new Uri (items [i].DefaultVersion.Uri.AbsoluteUri), mime_type, model.Privacy); } return pictures; } } } FSpotUploadProgress.cs0000644000175000017500000000407011430555235035041 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/FSpot.Exporters.Tabblo// // FSpotTabbloExport.FSpotUploadProgress // // Authors: // Wojciech Dzierzanowski (wojciech.dzierzanowski@gmail.com) // // (C) Copyright 2008 Wojciech Dzierzanowski // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using Mono.Tabblo; using Mono.Unix; using System; using FSpot.UI.Dialog; using FSpot.Utils; namespace FSpot.Exporters.Tabblo { class FSpotUploadProgress : TotalUploadProgress { private ThreadProgressDialog progress_dialog; internal FSpotUploadProgress ( Picture [] pictures, ThreadProgressDialog progress_dialog) : base (pictures) { this.progress_dialog = progress_dialog; } protected override void ShowProgress (string title, long bytes_sent) { progress_dialog.Message = title; progress_dialog.ProgressText = String.Format ( Catalog.GetString ( "{0} of approx. {1}"), GLib.Format.SizeForDisplay (bytes_sent), GLib.Format.SizeForDisplay ( (long) TotalFileSize)); progress_dialog.Fraction = (double) bytes_sent / TotalFileSize; } } } TabbloExportView.cs0000644000175000017500000000612411441732556034363 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/FSpot.Exporters.Tabblo// // FSpotTabbloExport.TabbloExportView // // Authors: // Wojciech Dzierzanowski (wojciech.dzierzanowski@gmail.com) // // (C) Copyright 2009 Wojciech Dzierzanowski // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Diagnostics; using System.Reflection; using FSpot.Core; using FSpot.Widgets; namespace FSpot.Exporters.Tabblo { class TabbloExportView : FSpot.UI.Dialog.BuilderDialog { private const string DialogName = "tabblo_export_dialog"; [GtkBeans.Builder.Object] private Gtk.ScrolledWindow thumb_scrolled_window; [GtkBeans.Builder.Object] internal Gtk.Entry username_entry; [GtkBeans.Builder.Object] internal Gtk.Entry password_entry; [GtkBeans.Builder.Object] internal Gtk.CheckButton attach_tags_button; [GtkBeans.Builder.Object] private Gtk.Alignment attached_tags_alignment; internal FSpot.Widgets.TagView attached_tags_view; [GtkBeans.Builder.Object] internal Gtk.Button attached_tags_select_button; [GtkBeans.Builder.Object] internal Gtk.CheckButton remove_tags_button; [GtkBeans.Builder.Object] private Gtk.Alignment removed_tags_alignment; internal FSpot.Widgets.TagView removed_tags_view; [GtkBeans.Builder.Object] internal Gtk.Button removed_tags_select_button; [GtkBeans.Builder.Object] private Gtk.Button export_button; internal TabbloExportView (IBrowsableCollection photos) : base (Assembly.GetExecutingAssembly (), "TabbloExport.ui", DialogName) { // Thumbnails var icon_view = new TrayView (photos); icon_view.DisplayDates = false; icon_view.DisplayTags = false; thumb_scrolled_window.Add (icon_view); icon_view.Show (); // Tags attached_tags_view = new FSpot.Widgets.TagView (); attached_tags_alignment.Add (attached_tags_view); attached_tags_view.Show (); removed_tags_view = new FSpot.Widgets.TagView (); removed_tags_alignment.Add (removed_tags_view); removed_tags_view.Show (); } internal void ResetFocus () { export_button.HasFocus = true; } internal bool Validated { set { export_button.Sensitive = value; } } } } ApplicationCentricCertificatePolicy.cs0000644000175000017500000001073511430555235040217 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/FSpot.Exporters.Tabblo// // FSpotTabbloExport.ApplicationCentricCertificatePolicy // // Authors: // Wojciech Dzierzanowski (wojciech.dzierzanowski@gmail.com) // // (C) Copyright 2009 Wojciech Dzierzanowski // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.IO.IsolatedStorage; using System.Net; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Security.Cryptography.X509Certificates; using Hyena; namespace FSpot.Exporters.Tabblo { class ApplicationCentricCertificatePolicy : ICertificatePolicy { protected enum Decision { DontTrust, TrustOnce, TrustAlways }; private Dictionary cert_hashes; private static readonly IsolatedStorageFile isolated_store = IsolatedStorageFile.GetUserStoreForAssembly (); private const string StoreName = "cert_hashes"; public bool CheckValidationResult (ServicePoint service_point, X509Certificate certificate, WebRequest request, int problem) { Log.DebugFormat ("Checking validation result for {0}: " + "problem={1}", request.RequestUri, problem); if (0 == problem) { return true; } // Only try to deal with the problem if it is a trust // failure. if (-2146762486 != problem) { return false; } LoadCertificates (); string hash = certificate.GetCertHashString (); Log.Debug ("Certificate hash: " + hash); int stored_problem = 0; if (cert_hashes.TryGetValue (hash, out stored_problem) && problem == stored_problem) { Log.Debug ("We already trust this site"); return true; } Decision decision = GetDecision (certificate, request); Log.Debug ("Decision: " + decision); switch (decision) { case Decision.DontTrust: return false; case Decision.TrustOnce: return true; case Decision.TrustAlways: SaveCertificate (hash, problem); return true; default: Debug.Assert (false, "Unknown decision"); return false; } } protected virtual Decision GetDecision ( X509Certificate certificate, WebRequest request) { Decision decision = Decision.DontTrust; Log.Debug ("Making the default decision: " + decision); return decision; } private void LoadCertificates () { using (IsolatedStorageFileStream isol_stream = new IsolatedStorageFileStream ( StoreName, FileMode.OpenOrCreate, FileAccess.Read, isolated_store)) { try { BinaryFormatter formatter = new BinaryFormatter (); cert_hashes = (Dictionary) formatter.Deserialize ( isol_stream); } catch (SerializationException e) { // FIXME: handle Log.Exception (e); } } if (null == cert_hashes) { cert_hashes = new Dictionary (); } } private void SaveCertificate (string hash, int problem) { cert_hashes.Add (hash, problem); using (IsolatedStorageFileStream isolated_stream = new IsolatedStorageFileStream ( StoreName, FileMode.OpenOrCreate, FileAccess.Write, isolated_store)) { try { BinaryFormatter formatter = new BinaryFormatter (); formatter.Serialize (isolated_stream, cert_hashes); } catch (SerializationException e) { // FIXME: handle Log.Exception (e); } } } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/AssemblyInfo.cs0000644000175000017500000000220411503404762027333 0ustar00rubenruben00000000000000#region Using directives using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; #endregion // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle ("TabbloExport")] [assembly: AssemblyDescription ("TabbloExport is an F-Spot extension " + "adding support for uploading images to Tabblo.")] [assembly: AssemblyConfiguration ("")] [assembly: AssemblyCompany ("")] [assembly: AssemblyProduct ("TabbloExport")] [assembly: AssemblyCopyright ("")] [assembly: AssemblyTrademark ("")] [assembly: AssemblyCulture ("")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. [assembly: ComVisible (false)] // The assembly version has following format : // // Major.Minor.Build.Revision // // You can specify all the values or you can use the default the Revision and // Build Numbers by using the '*' as shown below: [assembly: AssemblyVersion ("0.3.1.*")] f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/Resources/0000777000175000017500000000000011503407461026370 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/Resources/ui/0000777000175000017500000000000011503407461027005 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/Resources/ui/TrustError.ui0000644000175000017500000001713211430555235031501 0ustar00rubenruben00000000000000 5 Trust Error False center-on-parent True dialog True False False True vertical 2 True vertical True True vertical True True 0 12 A trust error occured while attempting to access True False 1 True 0 12 <b>{0}</b>. True True False -1 True 0 12 Do you wish to: False 2 False False 0 True Abort this session True True False True True False False 0 Trust the site's certificate this once True True False True abort_radiobutton False False 1 Always trust this site's certificate True True False True once_radiobutton False False 2 False 1 1 True end gtk-ok True True True True False False 0 False end 0 ok_button f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/Resources/ui/TabbloExport.ui0000644000175000017500000004272711430555235031763 0ustar00rubenruben00000000000000 Export dialog False True vertical True 6 True 0 none True 12 180 180 True False automatic automatic in True <b>Photos</b> True 0 True vertical 6 True 0 none True 12 2 2 7 6 True 1 _Password: True password_entry 1 2 GTK_FILL True True False 1 2 1 2 True 1 _Username: True username_entry GTK_FILL True True 1 2 True <b>Tabblo account</b> True False False 0 True 0 none True 12 3 3 7 6 True 0 12 <small><i>F-Spot tags can help you track the export status of photos. Example: Use one tag for the photos that you plan to export, and another one for those already exported. Here, you can tell F-Spot to automatically replace these tags as appropriate.</i></small> True True 42 3 True False 1 2 2 3 True False 1 2 1 2 Select... True False True False 2 3 2 3 Select... True False True False 2 3 1 2 Rem_ove from exported photos: True True False True True 2 3 _Attach to exported photos: True True False True True 1 2 GTK_FILL GTK_FILL True <b>F-Spot tags</b> True False False 1 1 False False 0 True True end gtk-cancel True True True False True False False 0 _Export True True True True False True False False 1 False 1 cancel_button export_button f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/Resources/TabbloExport.addin.xml0000644000175000017500000000073111430555235032574 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/Makefile.in0000644000175000017500000006761711503407271026477 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Exporters/FSpot.Exporters.Tabblo ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Exporters.Tabblo TARGET = library LINK = $(REF_FSPOT_EXTENSION_TABBLOEXPORT) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Exporters.Tabblo/ApplicationCentricCertificatePolicy.cs \ FSpot.Exporters.Tabblo/BlindTrustCertificatePolicy.cs \ FSpot.Exporters.Tabblo/FSpotTraceListener.cs \ FSpot.Exporters.Tabblo/FSpotUploadProgress.cs \ FSpot.Exporters.Tabblo/TabbloExport.cs \ FSpot.Exporters.Tabblo/TabbloExportModel.cs \ FSpot.Exporters.Tabblo/TabbloExportView.cs \ FSpot.Exporters.Tabblo/UserDecisionCertificatePolicy.cs RESOURCES = \ Resources/TabbloExport.addin.xml \ Resources/ui/TabbloExport.ui \ Resources/ui/TrustError.ui ASSEMBLY_INFO_SOURCE = AssemblyInfo.cs # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.Tabblo/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.Tabblo/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Tabblo/Makefile.am0000644000175000017500000000135511430555235026454 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Exporters.Tabblo TARGET = library LINK = $(REF_FSPOT_EXTENSION_TABBLOEXPORT) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Exporters.Tabblo/ApplicationCentricCertificatePolicy.cs \ FSpot.Exporters.Tabblo/BlindTrustCertificatePolicy.cs \ FSpot.Exporters.Tabblo/FSpotTraceListener.cs \ FSpot.Exporters.Tabblo/FSpotUploadProgress.cs \ FSpot.Exporters.Tabblo/TabbloExport.cs \ FSpot.Exporters.Tabblo/TabbloExportModel.cs \ FSpot.Exporters.Tabblo/TabbloExportView.cs \ FSpot.Exporters.Tabblo/UserDecisionCertificatePolicy.cs RESOURCES = \ Resources/TabbloExport.addin.xml \ Resources/ui/TabbloExport.ui \ Resources/ui/TrustError.ui ASSEMBLY_INFO_SOURCE = AssemblyInfo.cs include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Gallery/0000777000175000017500000000000011503407456024616 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Gallery/FSpot.Exporters.Gallery/0000777000175000017500000000000011503407456031241 5ustar00rubenruben00000000000000GalleryRemote.cs0000644000175000017500000010326511503404762034264 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Gallery/FSpot.Exporters.Galleryusing System; using System.Net; using System.IO; using System.Text; using System.Collections; using System.Collections.Specialized; using System.Web; using Mono.Unix; using FSpot; using FSpot.Core; using FSpot.UI.Dialog; using Hyena; using Hyena.Widgets; /* These classes are based off the documentation at * * http://codex.gallery2.org/index.php/Gallery_Remote:Protocol */ namespace FSpot.Exporters.Gallery { public enum AlbumPermission : byte { None = 0, Add = 1, Write = 2, Delete = 4, DeleteAlbum = 8, CreateSubAlbum = 16 } public class Album : IComparable { public int RefNum; public string Name = null; public string Title = null; public string Summary = null; public int ParentRefNum; public int ResizeSize; public int ThumbSize; public ArrayList Images = null; public string BaseURL; Gallery gallery; public AlbumPermission Perms = AlbumPermission.None; public Album Parent { get { if (ParentRefNum != 0) return gallery.LookupAlbum (ParentRefNum); else return null; } } protected ArrayList parents = null; public ArrayList Parents { get { if (parents != null) return parents; if (Parent == null) { parents = new ArrayList (); } else { parents = Parent.Parents.Clone () as ArrayList; parents.Add (Parent.RefNum); } return parents; } } public Gallery Gallery { get { return gallery; } } public Album (Gallery gallery, string name, int ref_num) { Name = name; this.gallery = gallery; this.RefNum = ref_num; Images = new ArrayList (); } public void Rename (string name) { gallery.MoveAlbum (this, name); } public void Add (IPhoto item) { Add (item, item.DefaultVersion.Uri.LocalPath); } public int Add (IPhoto item, string path) { if (item == null) Log.Warning ("NO PHOTO"); return gallery.AddItem (this, path, Path.GetFileName (item.DefaultVersion.Uri.LocalPath), item.Name, item.Description, true); } public string GetUrl () { return gallery.GetAlbumUrl(this); } public int CompareTo (Object obj) { Album other = obj as Album; int numThis = this.Parents.Count; int numOther = other.Parents.Count; int thisVal = -1, otherVal = -1; //find where they first differ int maxIters = Math.Min (numThis, numOther); int i = 0; while (i < maxIters) { thisVal = (int)this.Parents[i]; otherVal = (int)other.Parents[i]; if (thisVal != otherVal) { break; } i++; } int retVal; if (i < numThis && i < numOther) { //Parentage differed retVal = thisVal.CompareTo (otherVal); } else if (i < numThis) { //other shorter thisVal = (int)this.Parents[i]; retVal = thisVal.CompareTo (other.RefNum); //if equal, we want to make the shorter one come first if (retVal == 0) retVal = 1; } else if (i < numOther) { //this shorter otherVal = (int)other.Parents[i]; retVal = this.RefNum.CompareTo (otherVal); //if equal, we want to make the shorter one come first if (retVal == 0) retVal = -1; } else { //children of the same parent retVal = this.RefNum.CompareTo (other.RefNum); } return retVal; } } public class Image { public string Name; public int RawWidth; public int RawHeight; public string ResizedName; public int ResizedWidth; public int ResizedHeight; public string ThumbName; public int ThumbWidth; public int ThumbHeight; public int RawFilesize; public string Caption; public string Description; public int Clicks; public Album Owner; public string Url; public Image (Album album, string name) { Name = name; Owner = album; } } public enum ResultCode { Success = 0, MajorVersionInvalid = 101, MajorMinorVersionInvalid = 102, VersionFormatInvalid = 103, VersionMissing = 104, PasswordWrong = 201, LoginMissing = 202, UnknownComand = 301, NoAddPermission = 401, NoFilename = 402, UploadPhotoFailed = 403, NoWritePermission = 404, NoCreateAlbumPermission = 501, CreateAlbumFailed = 502, // This result is specific to this implementation UnknownResponse = 1000 } public class GalleryException : System.Exception { string response_text; public string ResponseText { get { return response_text; } } public GalleryException (string text) : base (text) { } public GalleryException (string text, string full_response) : base (text) { response_text = full_response; } } public class GalleryCommandException : GalleryException { ResultCode status; public GalleryCommandException (string status_text, ResultCode result) : base (status_text) { status = result; } public ResultCode Status { get { return status; } } } public abstract class Gallery { protected Uri uri; public Uri Uri{ get { return uri; } } protected string name; public string Name { get { return name; } set { name = value; } } string auth_token; public string AuthToken { get { return auth_token; } set { auth_token = value; } } protected GalleryVersion version; public GalleryVersion Version { get { return version; } } protected ArrayList albums; public ArrayList Albums{ get { return albums; } } public bool expect_continue = true; protected CookieContainer cookies = null; public FSpot.ProgressItem Progress = null; public abstract void Login (string username, string passwd); public abstract ArrayList FetchAlbums (); public abstract ArrayList FetchAlbumsPrune (); public abstract bool MoveAlbum (Album album, string end_name); public abstract int AddItem (Album album, string path, string filename, string caption, string description, bool autorotate); //public abstract Album AlbumProperties (string album); public abstract bool NewAlbum (string parent_name, string name, string title, string description); public abstract ArrayList FetchAlbumImages (Album album, bool include_ablums); public abstract string GetAlbumUrl (Album album); public Gallery (string name) { this.name = name; cookies = new CookieContainer (); albums = new ArrayList (); } public static GalleryVersion DetectGalleryVersion (string url) { //Figure out if the url is for G1 or G2 Log.Debug ("Detecting Gallery version"); GalleryVersion version; if (url.EndsWith (Gallery1.script_name)) { version = GalleryVersion.Version1; } else if (url.EndsWith (Gallery2.script_name)) { version = GalleryVersion.Version2; } else { //check what script is available on the server FormClient client = new FormClient (); try { client.Submit (new Uri (Gallery.FixUrl (url, Gallery1.script_name))); version = GalleryVersion.Version1; } catch (System.Net.WebException) { try { client.Submit (new Uri (Gallery.FixUrl (url, Gallery2.script_name))); version = GalleryVersion.Version2; } catch (System.Net.WebException) { //Uh oh, neither version detected version = GalleryVersion.VersionUnknown; } } } Log.Debug ("Detected: " + version.ToString()); return version; } public bool IsConnected () { bool retVal = true; //Console.WriteLine ("^^^^^^^Checking IsConnected"); foreach (Cookie cookie in cookies.GetCookies(Uri)) { bool isExpired = cookie.Expired; //Console.WriteLine (cookie.Name + " " + (isExpired ? "expired" : "valid")); if (isExpired) retVal = false; } //return cookies.GetCookies(Uri).Count > 0; return retVal; } //Reads until it finds the start of the response protected StreamReader findResponse (HttpWebResponse response) { StreamReader reader = new StreamReader (response.GetResponseStream (), Encoding.UTF8); if (reader == null) throw new GalleryException (Catalog.GetString ("Error reading server response")); string line; string full_response = null; while ((line = reader.ReadLine ()) != null) { full_response += line; if (line.IndexOf ("#__GR2PROTO__", 0) > -1) break; } if (line == null) { // failed to find the response throw new GalleryException (Catalog.GetString ("Server returned response without Gallery content"), full_response); } return reader; } protected string [] GetNextLine (StreamReader reader) { char [] value_split = new char [1] {'='}; bool haveLine = false; string[] array = null; while(!haveLine) { string line = reader.ReadLine (); //Console.WriteLine ("READING: " + line); if (line != null) { array = line.Split (value_split, 2); haveLine = !LineIgnored (array); } else { //end of input return null; } } return array; } private bool LineIgnored (string[] line) { if (line[0].StartsWith ("debug")) { return true; } else if (line[0].StartsWith ("can_create_root")) { return true; } else { return false; } } protected bool ParseLogin (HttpWebResponse response) { string [] data; StreamReader reader = null; ResultCode status = ResultCode.UnknownResponse; string status_text = "Error: Unable to parse server response"; try { reader = findResponse (response); while ((data = GetNextLine (reader)) != null) { if (data[0] == "status") { status = (ResultCode) int.Parse (data [1]); } else if (data[0].StartsWith ("status_text")) { status_text = data[1]; Log.DebugFormat ("StatusText : {0}", data[1]); } else if (data[0].StartsWith ("server_version")) { //FIXME we should use the to determine what capabilities the server has } else if (data[0].StartsWith ("auth_token")) { AuthToken = data[1]; } else { Log.DebugFormat ("Unparsed Line in ParseLogin(): {0}={1}", data[0], data[1]); } } //Console.WriteLine ("Found: {0} cookies", response.Cookies.Count); if (status != ResultCode.Success) { Log.Debug (status_text); throw new GalleryCommandException (status_text, status); } return true; } finally { if (reader != null) reader.Close (); response.Close (); } } public ArrayList ParseFetchAlbums (HttpWebResponse response) { //Console.WriteLine ("in ParseFetchAlbums()"); string [] data; StreamReader reader = null; ResultCode status = ResultCode.UnknownResponse; string status_text = "Error: Unable to parse server response"; albums = new ArrayList (); try { Album current_album = null; reader = findResponse (response); while ((data = GetNextLine (reader)) != null) { //Console.WriteLine ("Parsing Line: {0}={1}", data[0], data[1]); if (data[0] == "status") { status = (ResultCode) int.Parse (data [1]); } else if (data[0].StartsWith ("status_text")) { status_text = data[1]; Log.DebugFormat ("StatusText : {0}", data[1]); } else if (data[0].StartsWith ("album.name")) { //this is the URL name int ref_num = -1; if (this.Version == GalleryVersion.Version1) { string [] segments = data[0].Split (new char[1]{'.'}); ref_num = int.Parse (segments[segments.Length -1]); } else { ref_num = int.Parse (data[1]); } current_album = new Album (this, data[1], ref_num); albums.Add (current_album); //Console.WriteLine ("current_album: " + data[1]); } else if (data[0].StartsWith ("album.title")) { //this is the display name current_album.Title = data[1]; } else if (data[0].StartsWith ("album.summary")) { current_album.Summary = data[1]; } else if (data[0].StartsWith ("album.parent")) { //FetchAlbums and G2 FetchAlbumsPrune return ints //G1 FetchAlbumsPrune returns album names (and 0 for root albums) try { current_album.ParentRefNum = int.Parse (data[1]); } catch (System.FormatException) { current_album.ParentRefNum = LookupAlbum (data[1]).RefNum; } //Console.WriteLine ("album.parent data[1]: " + data[1]); } else if (data[0].StartsWith ("album.resize_size")) { current_album.ResizeSize = int.Parse (data[1]); } else if (data[0].StartsWith ("album.thumb_size")) { current_album.ThumbSize = int.Parse (data[1]); } else if (data[0].StartsWith ("album.info.extrafields")) { //ignore, this is the album description } else if (data[0].StartsWith ("album.perms.add")) { if (data[1] == "true") current_album.Perms |= AlbumPermission.Add; } else if (data[0].StartsWith ("album.perms.write")) { if (data[1] == "true") current_album.Perms |= AlbumPermission.Write; } else if (data[0].StartsWith ("album.perms.del_item")) { if (data[1] == "true") current_album.Perms |= AlbumPermission.Delete; } else if (data[0].StartsWith ("album.perms.del_alb")) { if (data[1] == "true") current_album.Perms |= AlbumPermission.DeleteAlbum; } else if (data[0].StartsWith ("album.perms.create_sub")) { if (data[1] == "true") current_album.Perms |= AlbumPermission.CreateSubAlbum; } else if (data[0].StartsWith ("album_count")) { if (Albums.Count != int.Parse (data[1])) Log.Warning ("Parsed album count does not match album_count. Something is amiss"); } else if (data[0].StartsWith ("auth_token")) { AuthToken = data [1]; } else { Log.DebugFormat ("Unparsed Line in ParseFetchAlbums(): {0}={1}", data[0], data[1]); } } //Console.WriteLine ("Found: {0} cookies", response.Cookies.Count); if (status != ResultCode.Success) { Log.Debug (status_text); throw new GalleryCommandException (status_text, status); } //Console.WriteLine (After parse albums.Count + " albums parsed"); return albums; } finally { if (reader != null) reader.Close (); response.Close (); } } public int ParseAddItem (HttpWebResponse response) { string [] data; StreamReader reader = null; ResultCode status = ResultCode.UnknownResponse; string status_text = "Error: Unable to parse server response"; int item_id = 0; try { reader = findResponse (response); while ((data = GetNextLine (reader)) != null) { if (data[0] == "status") { status = (ResultCode) int.Parse (data [1]); } else if (data[0].StartsWith ("status_text")) { status_text = data[1]; Log.DebugFormat ("StatusText : {0}", data[1]); } else if (data[0].StartsWith ("auth_token")) { AuthToken = data[1]; } else if (data[0].StartsWith ("item_name")) { item_id = int.Parse (data [1]); } else { Log.DebugFormat ("Unparsed Line in ParseAddItem(): {0}={1}", data[0], data[1]); } } //Console.WriteLine ("Found: {0} cookies", response.Cookies.Count); if (status != ResultCode.Success) { Log.Debug (status_text); throw new GalleryCommandException (status_text, status); } return item_id; } finally { if (reader != null) reader.Close (); response.Close (); } } public bool ParseNewAlbum (HttpWebResponse response) { return ParseBasic (response); } public bool ParseMoveAlbum (HttpWebResponse response) { return ParseBasic (response); } /* public Album ParseAlbumProperties (HttpWebResponse response) { string [] data; StreamReader reader = null; ResultCode status = ResultCode.UnknownResponse; string status_text = "Error: Unable to parse server response"; try { reader = findResponse (response); while ((data = GetNextLine (reader)) != null) { if (data[0] == "status") { status = (ResultCode) int.Parse (data [1]); } else if (data[0].StartsWith ("status_text")) { status_text = data[1]; Log.Debug ("StatusText : {0}", data[1]); } else if (data[0].StartsWith ("auto-resize")) { //ignore } else { Log.Debug ("Unparsed Line in ParseBasic(): {0}={1}", data[0], data[1]); } } //Console.WriteLine ("Found: {0} cookies", response.Cookies.Count); if (status != ResultCode.Success) { Log.Debug (status_text); throw new GalleryCommandException (status_text, status); } return true; } finally { if (reader != null) reader.Close (); response.Close (); } } */ private bool ParseBasic (HttpWebResponse response) { string [] data; StreamReader reader = null; ResultCode status = ResultCode.UnknownResponse; string status_text = "Error: Unable to parse server response"; try { reader = findResponse (response); while ((data = GetNextLine (reader)) != null) { if (data[0] == "status") { status = (ResultCode) int.Parse (data [1]); } else if (data[0].StartsWith ("status_text")) { status_text = data[1]; Log.DebugFormat ("StatusText : {0}", data[1]); } else if (data[0].StartsWith ("auth_token")) { AuthToken = data[1]; } else { Log.DebugFormat ("Unparsed Line in ParseBasic(): {0}={1}", data[0], data[1]); } } //Console.WriteLine ("Found: {0} cookies", response.Cookies.Count); if (status != ResultCode.Success) { Log.Debug (status_text + " Status: " + status); throw new GalleryCommandException (status_text, status); } return true; } finally { if (reader != null) reader.Close (); response.Close (); } } public Album LookupAlbum (string name) { Album match = null; foreach (Album album in albums) { if (album.Name == name) { match = album; break; } } return match; } public Album LookupAlbum (int ref_num) { // FIXME this is really not the best way to do this Album match = null; foreach (Album album in albums) { if (album.RefNum == ref_num) { match = album; break; } } return match; } public static string FixUrl(string url, string end) { string fixedUrl = url; if (!url.EndsWith (end)) { if (!url.EndsWith ("/")) fixedUrl = url + "/"; fixedUrl = fixedUrl + end; } return fixedUrl; } public void PopupException (GalleryCommandException e, Gtk.Dialog d) { Log.DebugFormat ("{0} : {1} ({2})", e.Message, e.ResponseText, e.Status); HigMessageDialog md = new HigMessageDialog (d, Gtk.DialogFlags.Modal | Gtk.DialogFlags.DestroyWithParent, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, Catalog.GetString ("Error while creating new album"), String.Format (Catalog.GetString ("The following error was encountered while attempting to perform the requested operation:\n{0} ({1})"), e.Message, e.Status)); md.Run (); md.Destroy (); } } public class Gallery1 : Gallery { public const string script_name = "gallery_remote2.php"; public Gallery1 (string url) : this (url, url) {} public Gallery1 (string name, string url) : base (name) { this.uri = new Uri (FixUrl (url, script_name)); version = GalleryVersion.Version1; } public override void Login (string username, string passwd) { //Console.WriteLine ("Gallery1: Attempting to login"); FormClient client = new FormClient (cookies); client.Add ("cmd", "login"); client.Add ("protocol_version", "2.3"); client.Add ("uname", username); client.Add ("password", passwd); ParseLogin (client.Submit (uri)); } public override ArrayList FetchAlbums () { FormClient client = new FormClient (cookies); client.Add ("cmd", "fetch-albums"); client.Add ("protocol_version", "2.3"); return ParseFetchAlbums (client.Submit (uri)); } public override bool MoveAlbum (Album album, string end_name) { FormClient client = new FormClient (cookies); client.Add ("cmd", "move-album"); client.Add ("protocol_version", "2.7"); client.Add ("set_albumName", album.Name); client.Add ("set_destalbumName", end_name); return ParseMoveAlbum (client.Submit (uri)); } public override int AddItem (Album album, string path, string filename, string caption, string description, bool autorotate) { FormClient client = new FormClient (cookies); client.Add ("cmd", "add-item"); client.Add ("protocol_version", "2.9"); client.Add ("set_albumName", album.Name); client.Add ("caption", caption); client.Add ("userfile_name", filename); client.Add ("force_filename", filename); client.Add ("auto_rotate", autorotate ? "yes" : "no"); client.Add ("userfile", new FileInfo (path)); client.Add ("extrafield.Description", description); client.expect_continue = expect_continue; return ParseAddItem (client.Submit (uri, Progress)); } /* public override Album AlbumProperties (string album) { FormClient client = new FormClient (cookies); client.Add ("cmd", "album-properties"); client.Add ("protocol_version", "2.3"); client.Add ("set_albumName", album); return ParseAlbumProperties (client.Submit (uri)); } */ public override bool NewAlbum (string parent_name, string name, string title, string description) { FormClient client = new FormClient (cookies); client.Multipart = true; client.Add ("cmd", "new-album"); client.Add ("protocol_version", "2.8"); client.Add ("set_albumName", parent_name); client.Add ("newAlbumName", name); client.Add ("newAlbumTitle", title); client.Add ("newAlbumDesc", description); return ParseNewAlbum (client.Submit (uri)); } public override ArrayList FetchAlbumImages (Album album, bool include_ablums) { FormClient client = new FormClient (cookies); client.Add ("cmd", "fetch-album-images"); client.Add ("protocol_version","2.3"); client.Add ("set_albumName", album.Name); client.Add ("albums_too", include_ablums ? "yes" : "no"); album.Images = ParseFetchAlbumImages (client.Submit (uri), album); return album.Images; } public override ArrayList FetchAlbumsPrune () { FormClient client = new FormClient (cookies); client.Add ("cmd", "fetch-albums-prune"); client.Add ("protocol_version", "2.3"); client.Add ("check_writable", "no"); ArrayList a = ParseFetchAlbums (client.Submit (uri)); a.Sort(); return a; } public ArrayList ParseFetchAlbumImages (HttpWebResponse response, Album album) { string [] data; StreamReader reader = null; ResultCode status = ResultCode.UnknownResponse; string status_text = "Error: Unable to parse server response"; try { Image current_image = null; reader = findResponse (response); while ((data = GetNextLine (reader)) != null) { if (data[0] == "status") { status = (ResultCode) int.Parse (data [1]); } else if (data[0].StartsWith ("status_text")) { status_text = data[1]; Log.DebugFormat ("StatusText : {0}", data[1]); } else if (data[0].StartsWith ("image.name")) { current_image = new Image (album, data[1]); album.Images.Add (current_image); } else if (data[0].StartsWith ("image.raw_width")) { current_image.RawWidth = int.Parse (data[1]); } else if (data[0].StartsWith ("image.raw_height")) { current_image.RawHeight = int.Parse (data[1]); } else if (data[0].StartsWith ("image.raw_height")) { current_image.RawHeight = int.Parse (data[1]); } else if (data[0].StartsWith ("image.raw_filesize")) { } else if (data[0].StartsWith ("image.capturedate.year")) { } else if (data[0].StartsWith ("image.capturedate.mon")) { } else if (data[0].StartsWith ("image.capturedate.mday")) { } else if (data[0].StartsWith ("image.capturedate.hours")) { } else if (data[0].StartsWith ("image.capturedate.minutes")) { } else if (data[0].StartsWith ("image.capturedate.seconds")) { } else if (data[0].StartsWith ("image.hidden")) { } else if (data[0].StartsWith ("image.resizedName")) { current_image.ResizedName = data[1]; } else if (data[0].StartsWith ("image.resized_width")) { current_image.ResizedWidth = int.Parse (data[1]); } else if (data[0].StartsWith ("image.resized_height")) { current_image.ResizedHeight = int.Parse (data[1]); } else if (data[0].StartsWith ("image.thumbName")) { current_image.ThumbName = data[1]; } else if (data[0].StartsWith ("image.thumb_width")) { current_image.ThumbWidth = int.Parse (data[1]); } else if (data[0].StartsWith ("image.thumb_height")) { current_image.ThumbHeight = int.Parse (data[1]); } else if (data[0].StartsWith ("image.caption")) { current_image.Caption = data[1]; } else if (data[0].StartsWith ("image.extrafield.Description")) { current_image.Description = data[1]; } else if (data[0].StartsWith ("image.clicks")) { try { current_image.Clicks = int.Parse (data[1]); } catch (System.FormatException) { current_image.Clicks = 0; } } else if (data[0].StartsWith ("baseurl")) { album.BaseURL = data[1]; } else if (data[0].StartsWith ("image_count")) { if (album.Images.Count != int.Parse (data[1])) Log.Warning ("Parsed image count for " + album.Name + "(" + album.Images.Count + ") does not match image_count (" + data[1] + "). Something is amiss"); } else { Log.DebugFormat ("Unparsed Line in ParseFetchAlbumImages(): {0}={1}", data[0], data[1]); } } //Console.WriteLine ("Found: {0} cookies", response.Cookies.Count); if (status != ResultCode.Success) { Log.Debug (status_text); throw new GalleryCommandException (status_text, status); } //Set the Urls for downloading the images. string baseUrl = album.BaseURL + "/"; foreach (Image image in album.Images) { image.Url = baseUrl + image.Name; } return album.Images; } finally { if (reader != null) reader.Close (); response.Close (); } } public override string GetAlbumUrl (Album album) { string url = Uri.ToString(); url = url.Remove (url.Length - script_name.Length, script_name.Length); string path = album.Name; url = url + path; url = url.Replace (" ", "+"); return url; } } public class Gallery2 : Gallery { public const string script_name = "main.php"; public Gallery2 (string url) : this (url, url) {} public Gallery2 (string name, string url) : base (name) { this.uri = new Uri (FixUrl (url, script_name)); version = GalleryVersion.Version2; } public override void Login (string username, string passwd) { Log.Debug ("Gallery2: Attempting to login"); FormClient client = new FormClient (cookies); client.Add ("g2_form[cmd]", "login"); client.Add ("g2_form[protocol_version]", "2.10"); client.Add ("g2_form[uname]", username); client.Add ("g2_form[password]", passwd); AddG2Specific (client); ParseLogin (client.Submit (uri)); } public override ArrayList FetchAlbums () { //FetchAlbums doesn't exist for G2, we have to use FetchAlbumsPrune() return FetchAlbumsPrune (); } public override bool MoveAlbum (Album album, string end_name) { FormClient client = new FormClient (cookies); client.Add ("g2_form[cmd]", "move-album"); client.Add ("g2_form[protocol_version]", "2.10"); client.Add ("g2_form[set_albumName]", album.Name); client.Add ("g2_form[set_destalbumName]", end_name); AddG2Specific (client); return ParseMoveAlbum (client.Submit (uri)); } public override int AddItem (Album album, string path, string filename, string caption, string description, bool autorotate) { FormClient client = new FormClient (cookies); client.Add ("g2_form[cmd]", "add-item"); client.Add ("g2_form[protocol_version]", "2.10"); client.Add ("g2_form[set_albumName]", album.Name); client.Add ("g2_form[caption]", caption); client.Add ("g2_form[userfile_name]", filename); client.Add ("g2_form[force_filename]", filename); client.Add ("g2_form[auto_rotate]", autorotate ? "yes" : "no"); client.Add ("g2_form[extrafield.Description]", description); client.Add ("g2_userfile", new FileInfo (path)); client.expect_continue = expect_continue; AddG2Specific (client); return ParseAddItem (client.Submit (uri, Progress)); } /* public override Album AlbumProperties (string album) { FormClient client = new FormClient (cookies); client.Add ("cmd", "album-properties"); client.Add ("protocol_version", "2.3"); client.Add ("set_albumName", album); return ParseAlbumProperties (client.Submit (uri)); } */ public override bool NewAlbum (string parent_name, string name, string title, string description) { FormClient client = new FormClient (cookies); client.Multipart = true; client.Add ("g2_form[cmd]", "new-album"); client.Add ("g2_form[protocol_version]", "2.10"); client.Add ("g2_form[set_albumName]", parent_name); client.Add ("g2_form[newAlbumName]", name); client.Add ("g2_form[newAlbumTitle]", title); client.Add ("g2_form[newAlbumDesc]", description); AddG2Specific (client); return ParseNewAlbum (client.Submit (uri)); } public override ArrayList FetchAlbumImages (Album album, bool include_ablums) { FormClient client = new FormClient (cookies); client.Add ("g2_form[cmd]", "fetch-album-images"); client.Add ("g2_form[protocol_version]","2.10"); client.Add ("g2_form[set_albumName]", album.Name); client.Add ("g2_form[albums_too]", include_ablums ? "yes" : "no"); AddG2Specific (client); album.Images = ParseFetchAlbumImages (client.Submit (uri), album); return album.Images; } public override ArrayList FetchAlbumsPrune () { FormClient client = new FormClient (cookies); client.Add ("g2_form[cmd]", "fetch-albums-prune"); client.Add ("g2_form[protocol_version]", "2.10"); client.Add ("g2_form[check_writable]", "no"); AddG2Specific (client); ArrayList a = ParseFetchAlbums (client.Submit (uri)); a.Sort(); return a; } private void AddG2Specific (FormClient client) { if (AuthToken != null && AuthToken != String.Empty) client.Add("g2_authToken", AuthToken); client.Add("g2_controller", "remote.GalleryRemote"); } public ArrayList ParseFetchAlbumImages (HttpWebResponse response, Album album) { string [] data; StreamReader reader = null; ResultCode status = ResultCode.UnknownResponse; string status_text = "Error: Unable to parse server response"; try { Image current_image = null; string baseUrl = Uri.ToString() + "?g2_view=core.DownloadItem&g2_itemId="; reader = findResponse (response); while ((data = GetNextLine (reader)) != null) { if (data[0] == "status") { status = (ResultCode) int.Parse (data [1]); } else if (data[0].StartsWith ("status_text")) { status_text = data[1]; Log.DebugFormat ("StatusText : {0}", data[1]); } else if (data[0].StartsWith ("image.name")) { //for G2 this is the number used to download the image. current_image = new Image (album, "awaiting 'title'"); album.Images.Add (current_image); current_image.Url = baseUrl + data[1]; } else if (data[0].StartsWith ("image.title")) { //for G2 the "title" is the name" current_image.Name = data[1]; } else if (data[0].StartsWith ("image.raw_width")) { current_image.RawWidth = int.Parse (data[1]); } else if (data[0].StartsWith ("image.raw_height")) { current_image.RawHeight = int.Parse (data[1]); } else if (data[0].StartsWith ("image.raw_height")) { current_image.RawHeight = int.Parse (data[1]); //ignore these for now } else if (data[0].StartsWith ("image.raw_filesize")) { } else if (data[0].StartsWith ("image.forceExtension")) { } else if (data[0].StartsWith ("image.capturedate.year")) { } else if (data[0].StartsWith ("image.capturedate.mon")) { } else if (data[0].StartsWith ("image.capturedate.mday")) { } else if (data[0].StartsWith ("image.capturedate.hours")) { } else if (data[0].StartsWith ("image.capturedate.minutes")) { } else if (data[0].StartsWith ("image.capturedate.seconds")) { } else if (data[0].StartsWith ("image.hidden")) { } else if (data[0].StartsWith ("image.resizedName")) { current_image.ResizedName = data[1]; } else if (data[0].StartsWith ("image.resized_width")) { current_image.ResizedWidth = int.Parse (data[1]); } else if (data[0].StartsWith ("image.resized_height")) { current_image.ResizedHeight = int.Parse (data[1]); } else if (data[0].StartsWith ("image.thumbName")) { current_image.ThumbName = data[1]; } else if (data[0].StartsWith ("image.thumb_width")) { current_image.ThumbWidth = int.Parse (data[1]); } else if (data[0].StartsWith ("image.thumb_height")) { current_image.ThumbHeight = int.Parse (data[1]); } else if (data[0].StartsWith ("image.caption")) { current_image.Caption = data[1]; } else if (data[0].StartsWith ("image.extrafield.Description")) { current_image.Description = data[1]; } else if (data[0].StartsWith ("image.clicks")) { try { current_image.Clicks = int.Parse (data[1]); } catch (System.FormatException) { current_image.Clicks = 0; } } else if (data[0].StartsWith ("baseurl")) { album.BaseURL = data[1]; } else if (data[0].StartsWith ("image_count")) { if (album.Images.Count != int.Parse (data[1])) Log.Warning ("Parsed image count for " + album.Name + "(" + album.Images.Count + ") does not match image_count (" + data[1] + "). Something is amiss"); } else { Log.DebugFormat ("Unparsed Line in ParseFetchAlbumImages(): {0}={1}", data[0], data[1]); } } Log.DebugFormat ("Found: {0} cookies", response.Cookies.Count); if (status != ResultCode.Success) { Log.Debug (status_text); throw new GalleryCommandException (status_text, status); } return album.Images; } finally { if (reader != null) reader.Close (); response.Close (); } } public override string GetAlbumUrl (Album album) { return Uri.ToString() + "?g2_view=core.ShowItem&g2_itemId=" + album.Name; } } public enum GalleryVersion : byte { VersionUnknown = 0, Version1 = 1, Version2 = 2 } } GalleryAccount.cs0000644000175000017500000000601211503404762034415 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Gallery/FSpot.Exporters.Galleryusing System; using System.Net; using System.IO; using System.Text; using System.Collections; using System.Collections.Specialized; using System.Web; using Mono.Unix; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using FSpot.Utils; using FSpot.UI.Dialog; using FSpot.Extensions; using Hyena; using Hyena.Widgets; namespace FSpot.Exporters.Gallery { public class GalleryAccount { public GalleryAccount (string name, string url, string username, string password) : this (name, url, username, password, GalleryVersion.VersionUnknown) {} public GalleryAccount (string name, string url, string username, string password, GalleryVersion version) { this.name = name; this.username = username; this.password = password; this.Url = url; if (version != GalleryVersion.VersionUnknown) { this.version = version; } else { this.version = Gallery.DetectGalleryVersion(Url); } } public const string EXPORT_SERVICE = "gallery/"; public const string LIGHTTPD_WORKAROUND_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "lighttpd_workaround"; public Gallery Connect () { //System.Console.WriteLine ("GalleryAccount.Connect()"); Gallery gal = null; if (version == GalleryVersion.VersionUnknown) this.version = Gallery.DetectGalleryVersion(Url); if (version == GalleryVersion.Version1) { gal = new Gallery1 (url, url); } else if (version == GalleryVersion.Version2) { gal = new Gallery2 (url, url); } else { throw new GalleryException (Catalog.GetString("Cannot connect to a Gallery for which the version is unknown.\nPlease check that you have Remote plugin 1.0.8 or later")); } Log.Debug ("Gallery created: " + gal); gal.Login (username, password); gallery = gal; connected = true; gallery.expect_continue = Preferences.Get (LIGHTTPD_WORKAROUND_KEY); return gallery; } GalleryVersion version; public GalleryVersion Version{ get { return version; } } private bool connected; public bool Connected { get { bool retVal = false; if(gallery != null) { retVal = gallery.IsConnected (); } if (connected != retVal) { Log.Warning ("Connected and retVal for IsConnected() don't agree"); } return retVal; } } public void MarkChanged () { connected = false; gallery = null; } Gallery gallery; public Gallery Gallery { get { return gallery; } } string name; public string Name { get { return name; } set { name = value; } } string url; public string Url { get { return url; } set { if (url != value) { url = value; MarkChanged (); } } } string username; public string Username { get { return username; } set { if (username != value) { username = value; MarkChanged (); } } } string password; public string Password { get { return password; } set { if (password != value) { password = value; MarkChanged (); } } } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Gallery/FSpot.Exporters.Gallery/FormClient.cs0000644000175000017500000001713211503404762033627 0ustar00rubenruben00000000000000using System; using System.Net; using System.IO; using System.Text; using System.Collections; using System.Collections.Specialized; using System.Web; using Hyena; using FSpot.Core; namespace FSpot.Exporters.Gallery { public class FormClient { private struct FormItem { public string Name; public object Value; public FormItem (string name, object value) { Name = name; Value = value; } } private StreamWriter stream_writer; private ArrayList Items; private string boundary; private string start_boundary; private string end_boundary; private bool multipart = false; public bool Multipart { set { multipart = value; } } private bool first_item; public bool Buffer = false; public bool SuppressCookiePath = false; public bool expect_continue = true; public HttpWebRequest Request; public CookieContainer Cookies; public FSpot.ProgressItem Progress; public FormClient (CookieContainer cookies) { this.Cookies = cookies; this.Items = new ArrayList (); } public FormClient () { this.Items = new ArrayList (); this.Cookies = new CookieContainer (); } private void GenerateBoundary () { Guid guid = Guid.NewGuid (); boundary = "--------" + guid.ToString () + "-----"; start_boundary = "--" + boundary; end_boundary = start_boundary + "--"; } public void Add (string name, string value) { Items.Add (new FormItem (name, value)); } public void Add (string name, FileInfo fileinfo) { multipart = true; Items.Add (new FormItem (name, fileinfo)); } private void Write (FormItem item) { // The types we check here need to match the // types we allow in .Add if (item.Value == null) { Write (item.Name, (string)String.Empty); } else if (item.Value is FileInfo) { Write (item.Name, (FileInfo)item.Value); } else if (item.Value is string) { Write (item.Name, (string)item.Value); } else { throw new Exception ("Unknown value type"); } } private long MultipartLength (FormItem item) { // The types we check here need to match the // types we allow in .Add if (item.Value == null) { return MultipartLength (item.Name, (string)String.Empty); } else if (item.Value is FileInfo) { return MultipartLength (item.Name, (FileInfo)item.Value); } else if (item.Value is string) { return MultipartLength (item.Name, (string)item.Value); } else { throw new Exception ("Unknown value type"); } } private string MultipartHeader (string name, string value) { return string.Format ("{0}\r\n" + "Content-Disposition: form-data; name=\"{1}\"\r\n" + "\r\n", start_boundary, name); } private long MultipartLength (string name, string value) { long length = MultipartHeader (name, value).Length; length += Encoding.Default.GetBytes (value).Length + 2; return length; } private void Write (string name, string value) { string cmd; if (multipart) { cmd = String.Format ("{0}" + "{1}\r\n", MultipartHeader (name, value), value); } else { name = HttpUtility.UrlEncode (name.Replace(" ", "+")); value = HttpUtility.UrlEncode (value.Replace(" ", "+")); if (first_item) { cmd = string.Format ("{0}={1}", name, value); first_item = false; } else { cmd = string.Format ("&{0}={1}", name, value); } } //Console.WriteLine (cmd); stream_writer.Write (cmd); } private string MultipartHeader (string name, FileInfo file) { string cmd = string.Format ("{0}\r\n" + "Content-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\n" + "Content-Type: image/jpeg\r\n" + "\r\n", start_boundary, name, file.Name); return cmd; } private long MultipartLength (string name, FileInfo file) { long length = MultipartHeader (name, file).Length; length += file.Length + 2; return length; } private void Write (string name, FileInfo file) { if (multipart) { stream_writer.Write (MultipartHeader (name, file)); stream_writer.Flush (); Stream stream = stream_writer.BaseStream; byte [] data = new byte [32768]; FileStream fs = file.OpenRead (); long total = file.Length; long total_read = 0; int count; while ((count = fs.Read (data, 0, data.Length)) > 0) { stream.Write (data, 0, count); total_read += count; if (Progress != null) Progress.Value = total_read / (double)total; } fs.Close (); stream_writer.Write ("\r\n"); } else { throw new Exception ("Can't write files in url-encoded submissions"); } } public void Clear () { Items.Clear (); multipart = false; } public HttpWebResponse Submit (string url) { return Submit (url, null); } public HttpWebResponse Submit (string url, FSpot.ProgressItem item) { return Submit (new Uri (url), item); } public HttpWebResponse Submit (Uri uri) { return Submit (uri, null); } public HttpWebResponse Submit (Uri uri, FSpot.ProgressItem progress_item) { this.Progress = progress_item; Request = (HttpWebRequest) WebRequest.Create (uri); CookieCollection cookie_collection = Cookies.GetCookies (uri); if (uri.UserInfo != null && uri.UserInfo != String.Empty) { NetworkCredential cred = new NetworkCredential (); cred.GetCredential (uri, "basic"); CredentialCache credcache = new CredentialCache(); credcache.Add(uri, "basic", cred); Request.PreAuthenticate = true; Request.Credentials = credcache; } Request.ServicePoint.Expect100Continue = expect_continue; Request.CookieContainer = new CookieContainer (); foreach (Cookie c in cookie_collection) { if (SuppressCookiePath) Request.CookieContainer.Add (new Cookie (c.Name, c.Value)); else Request.CookieContainer.Add (c); } Request.Method = "POST"; Request.Headers["Accept-Charset"] = "utf-8;"; Request.UserAgent = String.Format("F-Spot {0} (http://www.f-spot.org)", Defines.VERSION); if (multipart) { GenerateBoundary (); Request.ContentType = "multipart/form-data; boundary=" + boundary; Request.Timeout = Request.Timeout * 3; long length = 0; for (int i = 0; i < Items.Count; i++) { FormItem item = (FormItem)Items[i]; length += MultipartLength (item); } length += end_boundary.Length + 2; //Request.Headers["My-Content-Length"] = length.ToString (); if (Buffer == false) { Request.ContentLength = length; Request.AllowWriteStreamBuffering = false; } } else { Request.ContentType = "application/x-www-form-urlencoded"; } stream_writer = new StreamWriter (Request.GetRequestStream ()); first_item = true; for (int i = 0; i < Items.Count; i++) { FormItem item = (FormItem)Items[i]; Write (item); } if (multipart) stream_writer.Write (end_boundary + "\r\n"); stream_writer.Flush (); stream_writer.Close (); HttpWebResponse response; try { response = (HttpWebResponse) Request.GetResponse (); //Console.WriteLine ("found {0} cookies", response.Cookies.Count); foreach (Cookie c in response.Cookies) { Cookies.Add (c); } } catch (WebException e) { if (e.Status == WebExceptionStatus.ProtocolError && ((HttpWebResponse)e.Response).StatusCode == HttpStatusCode.ExpectationFailed && expect_continue) { e.Response.Close (); expect_continue = false; return Submit (uri, progress_item); } throw new WebException (Mono.Unix.Catalog.GetString ("Unhandled exception"), e); } return response; } } } GalleryAddAlbum.cs0000644000175000017500000000770411503404762034503 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Gallery/FSpot.Exporters.Gallery using System; using System.Net; using System.IO; using System.Text; using System.Collections; using System.Collections.Specialized; using System.Web; using Mono.Unix; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using FSpot.Utils; using FSpot.UI.Dialog; using FSpot.Extensions; using Hyena; using Hyena.Widgets; namespace FSpot.Exporters.Gallery { public class GalleryAddAlbum { [GtkBeans.Builder.Object] Gtk.Dialog add_album_dialog; Gtk.ComboBox album_optionmenu; [GtkBeans.Builder.Object] Gtk.Entry name_entry; [GtkBeans.Builder.Object] Gtk.Entry description_entry; [GtkBeans.Builder.Object] Gtk.Entry title_entry; [GtkBeans.Builder.Object] Gtk.Button add_button; private GalleryExport export; private Gallery gallery; private string parent; private string name; private string description; private string title; public GalleryAddAlbum (GalleryExport export, Gallery gallery) { var builder = new GtkBeans.Builder (null, "gallery_add_album_dialog.ui", null); builder.Autoconnect (this); add_album_dialog = new Gtk.Dialog (builder.GetRawObject ("gallery_add_album_dialog")); add_album_dialog.Modal = true; album_optionmenu = new Gtk.ComboBox (); (name_entry.Parent as Gtk.Table).Attach (album_optionmenu, 1, 2, 1, 2); album_optionmenu.Show (); this.export = export; this.gallery = gallery; PopulateAlbums (); add_album_dialog.Response += HandleAddResponse; name_entry.Changed += HandleChanged; description_entry.Changed += HandleChanged; title_entry.Changed += HandleChanged; HandleChanged (null, null); } private void PopulateAlbums () { Gtk.Menu menu = new Gtk.Menu (); if (gallery.Version == GalleryVersion.Version1) { Gtk.MenuItem top_item = new Gtk.MenuItem (Catalog.GetString ("(TopLevel)")); menu.Append (top_item); } foreach (Album album in gallery.Albums) { System.Text.StringBuilder label_builder = new System.Text.StringBuilder (); for (int i=0; i < album.Parents.Count; i++) { label_builder.Append (" "); } label_builder.Append (album.Title); album_optionmenu.AppendText(label_builder.ToString()); AlbumPermission create_sub = album.Perms & AlbumPermission.CreateSubAlbum; } album_optionmenu.Sensitive = true; menu.ShowAll (); } private void HandleChanged (object sender, EventArgs args) { if (gallery.Version == GalleryVersion.Version1) { if (gallery.Albums.Count == 0 || album_optionmenu.Active <= 0) { parent = String.Empty; } else { parent = ((Album) gallery.Albums [album_optionmenu.Active-1]).Name; } } else { if (gallery.Albums.Count == 0 || album_optionmenu.Active < 0) { parent = String.Empty; } else { parent = ((Album) gallery.Albums [album_optionmenu.Active]).Name; } } name = name_entry.Text; description = description_entry.Text; title = title_entry.Text; if (name == String.Empty || title == String.Empty) add_button.Sensitive = false; else add_button.Sensitive = true; } [GLib.ConnectBefore] protected void HandleAddResponse (object sender, Gtk.ResponseArgs args) { if (args.ResponseId == Gtk.ResponseType.Ok) { if (!System.Text.RegularExpressions.Regex.IsMatch (name, "^[A-Za-z0-9_-]+$")) { HigMessageDialog md = new HigMessageDialog (add_album_dialog, Gtk.DialogFlags.Modal | Gtk.DialogFlags.DestroyWithParent, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, Catalog.GetString ("Invalid Gallery name"), Catalog.GetString ("The gallery name contains invalid characters.\nOnly letters, numbers, - and _ are allowed")); md.Run (); md.Destroy (); return; } try { gallery.NewAlbum (parent, name, title, description); export.HandleAlbumAdded (title); } catch (GalleryCommandException e) { gallery.PopupException(e, add_album_dialog); return; } } add_album_dialog.Destroy (); } } } GalleryAccountManager.cs0000644000175000017500000001065511503404762035720 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Gallery/FSpot.Exporters.Gallery using System; using System.Net; using System.IO; using System.Text; using System.Collections; using System.Collections.Specialized; using System.Web; using Mono.Unix; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using FSpot.Utils; using FSpot.UI.Dialog; using FSpot.Extensions; using Hyena; using Hyena.Widgets; namespace FSpot.Exporters.Gallery { public class GalleryAccountManager { private static GalleryAccountManager instance; string xml_path; ArrayList accounts; public delegate void AccountListChangedHandler (GalleryAccountManager manager, GalleryAccount changed_account); public event AccountListChangedHandler AccountListChanged; public static GalleryAccountManager GetInstance () { if (instance == null) { instance = new GalleryAccountManager (); } return instance; } private GalleryAccountManager () { // FIXME this xml file path should be be retrieved from a central location not hard coded there this.xml_path = System.IO.Path.Combine (FSpot.Core.Global.BaseDirectory, "Accounts.xml"); accounts = new ArrayList (); ReadAccounts (); } public void MarkChanged () { MarkChanged (true, null); } public void MarkChanged (bool write, GalleryAccount changed_account) { if (write) WriteAccounts (); if (AccountListChanged != null) AccountListChanged (this, changed_account); } public ArrayList GetAccounts () { return accounts; } public void AddAccount (GalleryAccount account) { AddAccount (account, true); } public void AddAccount (GalleryAccount account, bool write) { accounts.Add (account); MarkChanged (write, account); } public void RemoveAccount (GalleryAccount account) { accounts.Remove (account); MarkChanged (); } public void WriteAccounts () { System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter (xml_path, System.Text.Encoding.Default); writer.Formatting = System.Xml.Formatting.Indented; writer.Indentation = 2; writer.IndentChar = ' '; writer.WriteStartDocument (true); writer.WriteStartElement ("GalleryRemote"); foreach (GalleryAccount account in accounts) { writer.WriteStartElement ("Account"); writer.WriteElementString ("Name", account.Name); writer.WriteElementString ("Url", account.Url); writer.WriteElementString ("Username", account.Username); writer.WriteElementString ("Password", account.Password); writer.WriteElementString ("Version", account.Version.ToString()); writer.WriteEndElement (); //Account } writer.WriteEndElement (); writer.WriteEndDocument (); writer.Close (); } private GalleryAccount ParseAccount (System.Xml.XmlNode node) { if (node.Name != "Account") return null; string name = null; string url = null; string username = null; string password = null; GalleryVersion version = GalleryVersion.VersionUnknown; foreach (System.Xml.XmlNode child in node.ChildNodes) { if (child.Name == "Name") { name = child.ChildNodes [0].Value; } else if (child.Name == "Url") { url = child.ChildNodes [0].Value; } else if (child.Name == "Password") { password = child.ChildNodes [0].Value; } else if (child.Name == "Username") { username = child.ChildNodes [0].Value; } else if (child.Name == "Version") { string versionString = child.ChildNodes [0].Value; if (versionString == "Version1") version = GalleryVersion.Version1; else if (versionString == "Version2") version = GalleryVersion.Version2; else Log.Error ("Unexpected versions string: " + versionString); } } return new GalleryAccount (name, url, username, password, version); } private void ReadAccounts () { if (! File.Exists (xml_path)) { MarkChanged (); return; } try { string query = "//GalleryRemote/Account"; System.Xml.XmlDocument doc = new System.Xml.XmlDocument (); //System.Console.WriteLine ("xml_path: " + xml_path); doc.Load (xml_path); System.Xml.XmlNodeList nodes = doc.SelectNodes (query); //System.Console.WriteLine ("selected {0} nodes match {1}", nodes.Count, query); foreach (System.Xml.XmlNode node in nodes) { GalleryAccount account = ParseAccount (node); if (account != null) AddAccount (account, false); } } catch (System.Exception e) { // FIXME do something Log.Exception ("Exception loading gallery accounts", e); } MarkChanged (); } } } AccountDialog.cs0000644000175000017500000001461711503404762034227 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Gallery/FSpot.Exporters.Gallery using System; using System.Net; using System.IO; using System.Text; using System.Collections; using System.Collections.Specialized; using System.Web; using Mono.Unix; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using FSpot.Utils; using FSpot.UI.Dialog; using FSpot.Extensions; using Hyena; using Hyena.Widgets; namespace FSpot.Exporters.Gallery { public class AccountDialog { public AccountDialog (Gtk.Window parent) : this (parent, null, false) { add_dialog.Response += HandleAddResponse; add_button.Sensitive = false; } public AccountDialog (Gtk.Window parent, GalleryAccount account, bool show_error) { var builder = new GtkBeans.Builder (null, "gallery_add_dialog.ui", null); builder.Autoconnect (this); add_dialog = new Gtk.Dialog (builder.GetRawObject ("gallery_add_dialog")); add_dialog.Modal = false; add_dialog.TransientFor = parent; add_dialog.DefaultResponse = Gtk.ResponseType.Ok; this.account = account; status_area.Visible = show_error; if (account != null) { gallery_entry.Text = account.Name; url_entry.Text = account.Url; password_entry.Text = account.Password; username_entry.Text = account.Username; add_button.Label = Gtk.Stock.Ok; add_dialog.Response += HandleEditResponse; } if (remove_button != null) remove_button.Visible = account != null; add_dialog.Show (); gallery_entry.Changed += HandleChanged; url_entry.Changed += HandleChanged; password_entry.Changed += HandleChanged; username_entry.Changed += HandleChanged; HandleChanged (null, null); } private void HandleChanged (object sender, System.EventArgs args) { name = gallery_entry.Text; url = url_entry.Text; password = password_entry.Text; username = username_entry.Text; if (name == String.Empty || url == String.Empty || password == String.Empty || username == String.Empty) add_button.Sensitive = false; else add_button.Sensitive = true; } [GLib.ConnectBefore] protected void HandleAddResponse (object sender, Gtk.ResponseArgs args) { if (args.ResponseId == Gtk.ResponseType.Ok) { try { Uri uri = new Uri (url); if (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) throw new System.UriFormatException (); //Check for name uniqueness foreach (GalleryAccount acc in GalleryAccountManager.GetInstance ().GetAccounts ()) if (acc.Name == name) throw new ArgumentException ("name"); GalleryAccount created = new GalleryAccount (name, url, username, password); created.Connect (); GalleryAccountManager.GetInstance ().AddAccount (created); account = created; } catch (System.UriFormatException) { HigMessageDialog md = new HigMessageDialog (add_dialog, Gtk.DialogFlags.Modal | Gtk.DialogFlags.DestroyWithParent, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, Catalog.GetString ("Invalid URL"), Catalog.GetString ("The gallery URL entry does not appear to be a valid URL")); md.Run (); md.Destroy (); return; } catch (GalleryException e) { HigMessageDialog md = new HigMessageDialog (add_dialog, Gtk.DialogFlags.Modal | Gtk.DialogFlags.DestroyWithParent, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, Catalog.GetString ("Error while connecting to Gallery"), String.Format (Catalog.GetString ("The following error was encountered while attempting to log in: {0}"), e.Message)); if (e.ResponseText != null) { Log.Debug (e.Message); Log.Debug (e.ResponseText); } md.Run (); md.Destroy (); return; } catch (ArgumentException ae) { HigMessageDialog md = new HigMessageDialog (add_dialog, Gtk.DialogFlags.Modal | Gtk.DialogFlags.DestroyWithParent, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, Catalog.GetString ("A Gallery with this name already exists"), String.Format (Catalog.GetString ("There is already a Gallery with the same name in your registered Galleries. Please choose a unique name."))); Log.Exception (ae); md.Run (); md.Destroy (); return; } catch (System.Net.WebException we) { HigMessageDialog md = new HigMessageDialog (add_dialog, Gtk.DialogFlags.Modal | Gtk.DialogFlags.DestroyWithParent, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, Catalog.GetString ("Error while connecting to Gallery"), String.Format (Catalog.GetString ("The following error was encountered while attempting to log in: {0}"), we.Message)); md.Run (); md.Destroy (); return; } catch (System.Exception se) { HigMessageDialog md = new HigMessageDialog (add_dialog, Gtk.DialogFlags.Modal | Gtk.DialogFlags.DestroyWithParent, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, Catalog.GetString ("Error while connecting to Gallery"), String.Format (Catalog.GetString ("The following error was encountered while attempting to log in: {0}"), se.Message)); Log.Exception (se); md.Run (); md.Destroy (); return; } } add_dialog.Destroy (); } protected void HandleEditResponse (object sender, Gtk.ResponseArgs args) { if (args.ResponseId == Gtk.ResponseType.Ok) { account.Name = name; account.Url = url; account.Username = username; account.Password = password; GalleryAccountManager.GetInstance ().MarkChanged (true, account); } else if (args.ResponseId == Gtk.ResponseType.Reject) { // NOTE we are using Reject to signal the remove action. GalleryAccountManager.GetInstance ().RemoveAccount (account); } add_dialog.Destroy (); } private GalleryAccount account; private string name; private string url; private string password; private string username; // widgets [GtkBeans.Builder.Object] Gtk.Dialog add_dialog; [GtkBeans.Builder.Object] Gtk.Entry url_entry; [GtkBeans.Builder.Object] Gtk.Entry password_entry; [GtkBeans.Builder.Object] Gtk.Entry gallery_entry; [GtkBeans.Builder.Object] Gtk.Entry username_entry; [GtkBeans.Builder.Object] Gtk.Button add_button; [GtkBeans.Builder.Object] Gtk.Button remove_button; [GtkBeans.Builder.Object] Gtk.HBox status_area; } } GalleryExport.cs0000644000175000017500000002620711503404762034312 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Gallery/FSpot.Exporters.Galleryusing System; using System.Net; using System.IO; using System.Text; using System.Collections; using System.Collections.Specialized; using System.Web; using Mono.Unix; using FSpot; using FSpot.Core; using FSpot.Filters; using FSpot.Widgets; using FSpot.Utils; using FSpot.UI.Dialog; using FSpot.Extensions; using Hyena; using Hyena.Widgets; namespace FSpot.Exporters.Gallery { public class GalleryExport : IExporter { public GalleryExport () { } public void Run (IBrowsableCollection selection) { var builder = new GtkBeans.Builder (null, "gallery_export_dialog.ui", null); builder.Autoconnect (this); export_dialog = new Gtk.Dialog (builder.GetRawObject ("gallery_export_dialog")); album_optionmenu = new Gtk.ComboBox (); (album_button.Parent as Gtk.HBox).PackStart (album_optionmenu); (album_button.Parent as Gtk.HBox).ReorderChild (album_optionmenu, 1); album_optionmenu.Show (); gallery_optionmenu = new Gtk.ComboBox (); (edit_button.Parent as Gtk.HBox).PackStart (gallery_optionmenu); (edit_button.Parent as Gtk.HBox).ReorderChild (gallery_optionmenu, 1); gallery_optionmenu.Show (); this.items = selection.Items; Array.Sort (this.items, new IPhotoComparer.CompareDateName()); album_button.Sensitive = false; var view = new TrayView (selection); view.DisplayDates = false; view.DisplayTags = false; export_dialog.Modal = false; export_dialog.TransientFor = null; thumb_scrolledwindow.Add (view); view.Show (); export_dialog.Show (); GalleryAccountManager manager = GalleryAccountManager.GetInstance (); manager.AccountListChanged += PopulateGalleryOptionMenu; PopulateGalleryOptionMenu (manager, null); if (edit_button != null) edit_button.Clicked += HandleEditGallery; export_dialog.Response += HandleResponse; connect = true; HandleSizeActive (null, null); Connect (); LoadPreference (SCALE_KEY); LoadPreference (SIZE_KEY); LoadPreference (BROWSER_KEY); LoadPreference (META_KEY); } public const string EXPORT_SERVICE = "gallery/"; public const string SCALE_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "scale"; public const string SIZE_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "size"; public const string BROWSER_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "browser"; public const string META_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "meta"; public const string LIGHTTPD_WORKAROUND_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "lighttpd_workaround"; private bool scale; private int size; private bool browser; private bool meta; private bool connect = false; IPhoto[] items; int photo_index; ThreadProgressDialog progress_dialog; ArrayList accounts; private GalleryAccount account; private Album album; // Widgets [GtkBeans.Builder.Object] Gtk.Dialog export_dialog; Gtk.ComboBox gallery_optionmenu; Gtk.ComboBox album_optionmenu; [GtkBeans.Builder.Object] Gtk.CheckButton browser_check; [GtkBeans.Builder.Object] Gtk.CheckButton scale_check; [GtkBeans.Builder.Object] Gtk.CheckButton meta_check; [GtkBeans.Builder.Object] Gtk.SpinButton size_spin; [GtkBeans.Builder.Object] Gtk.Button album_button; [GtkBeans.Builder.Object] Gtk.Button edit_button; [GtkBeans.Builder.Object] Gtk.Button export_button; [GtkBeans.Builder.Object] Gtk.ScrolledWindow thumb_scrolledwindow; System.Threading.Thread command_thread; private void HandleResponse (object sender, Gtk.ResponseArgs args) { if (args.ResponseId != Gtk.ResponseType.Ok) { export_dialog.Destroy (); return; } if (scale_check != null) { scale = scale_check.Active; size = size_spin.ValueAsInt; } else scale = false; browser = browser_check.Active; meta = meta_check.Active; if (account != null) { //System.Console.WriteLine ("history = {0}", album_optionmenu.History); album = (Album) account.Gallery.Albums [Math.Max (0, album_optionmenu.Active)]; photo_index = 0; export_dialog.Destroy (); command_thread = new System.Threading.Thread (new System.Threading.ThreadStart (this.Upload)); command_thread.Name = Catalog.GetString ("Uploading Pictures"); progress_dialog = new ThreadProgressDialog (command_thread, items.Length); progress_dialog.Start (); // Save these settings for next time Preferences.Set (SCALE_KEY, scale); Preferences.Set (SIZE_KEY, size); Preferences.Set (BROWSER_KEY, browser); Preferences.Set (META_KEY, meta); } } private void HandleProgressChanged (ProgressItem item) { //System.Console.WriteLine ("Changed value = {0}", item.Value); progress_dialog.Fraction = (photo_index - 1.0 + item.Value) / (double) items.Length; } public void HandleSizeActive (object sender, EventArgs args) { size_spin.Sensitive = scale_check.Active; } private void Upload () { account.Gallery.Progress = new ProgressItem (); account.Gallery.Progress.Changed += HandleProgressChanged; Log.Debug ("Starting upload"); FilterSet filters = new FilterSet (); if (account.Version == GalleryVersion.Version1) filters.Add (new WhiteListFilter (new string []{".jpg", ".jpeg", ".png", ".gif"})); if (scale) filters.Add (new ResizeFilter ((uint) size)); while (photo_index < items.Length) { IPhoto item = items [photo_index]; Log.DebugFormat ("uploading {0}", photo_index); progress_dialog.Message = System.String.Format (Catalog.GetString ("Uploading picture \"{0}\""), item.Name); progress_dialog.Fraction = photo_index / (double) items.Length; photo_index++; progress_dialog.ProgressText = System.String.Format (Catalog.GetString ("{0} of {1}"), photo_index, items.Length); FilterRequest req = new FilterRequest (item.DefaultVersion.Uri); filters.Convert (req); try { int id = album.Add (item, req.Current.LocalPath); if (item != null && item is Photo && App.Instance.Database != null && id != 0) { App.Instance.Database.Exports.Create ((item as Photo).Id, (item as Photo).DefaultVersionId, ExportStore.Gallery2ExportType, String.Format("{0}:{1}",album.Gallery.Uri.ToString (), id.ToString ())); } } catch (System.Exception e) { progress_dialog.Message = String.Format (Catalog.GetString ("Error uploading picture \"{0}\" to Gallery: {1}"), item.Name, e.Message); progress_dialog.ProgressText = Catalog.GetString ("Error"); Log.Exception (e); if (progress_dialog.PerformRetrySkip ()) { photo_index--; } } } progress_dialog.Message = Catalog.GetString ("Done Sending Photos"); progress_dialog.Fraction = 1.0; progress_dialog.ProgressText = Catalog.GetString ("Upload Complete"); progress_dialog.ButtonLabel = Gtk.Stock.Ok; if (browser) { GtkBeans.Global.ShowUri (export_dialog.Screen, album.GetUrl()); } } private void PopulateGalleryOptionMenu (GalleryAccountManager manager, GalleryAccount changed_account) { this.account = changed_account; int pos = -1; accounts = manager.GetAccounts (); if (accounts == null || accounts.Count == 0) { gallery_optionmenu.AppendText(Catalog.GetString("(No Gallery)")); gallery_optionmenu.Sensitive = false; edit_button.Sensitive = false; } else { int i = 0; foreach (GalleryAccount account in accounts) { if (account == changed_account) pos = i; gallery_optionmenu.AppendText(account.Name); i++; } gallery_optionmenu.Sensitive = true; edit_button.Sensitive = true; } gallery_optionmenu.Active = pos; } private void Connect () { Connect (null); } private void Connect (GalleryAccount selected) { try { if (accounts.Count != 0 && connect) { if (selected == null) account = (GalleryAccount) accounts [gallery_optionmenu.Active]; else account = selected; if (!account.Connected) account.Connect (); PopulateAlbumOptionMenu (account.Gallery); album_button.Sensitive = true; } } catch (System.Exception ex) { if (selected != null) account = selected; Log.Exception (ex); PopulateAlbumOptionMenu (account.Gallery); album_button.Sensitive = false; new AccountDialog (export_dialog, account, true); } } private void HandleAccountSelected (object sender, System.EventArgs args) { Connect (); } public void HandleAlbumAdded (string title) { GalleryAccount account = (GalleryAccount) accounts [gallery_optionmenu.Active]; PopulateAlbumOptionMenu (account.Gallery); // make the newly created album selected ArrayList albums = account.Gallery.Albums; for (int i=0; i < albums.Count; i++) { if (((Album)albums[i]).Title == title) { album_optionmenu.Active = i; } } } private void PopulateAlbumOptionMenu (Gallery gallery) { System.Collections.ArrayList albums = null; if (gallery != null) { //gallery.FetchAlbumsPrune (); try { gallery.FetchAlbums (); albums = gallery.Albums; } catch (GalleryCommandException e) { gallery.PopupException (e, export_dialog); return; } } bool disconnected = gallery == null || !account.Connected || albums == null; if (disconnected || albums.Count == 0) { string msg = disconnected ? Catalog.GetString ("(Not Connected)") : Catalog.GetString ("(No Albums)"); album_optionmenu.AppendText(msg); export_button.Sensitive = false; album_optionmenu.Sensitive = false; album_button.Sensitive = false; if (disconnected) album_button.Sensitive = false; } else { foreach (Album album in albums) { System.Text.StringBuilder label_builder = new System.Text.StringBuilder (); for (int i=0; i < album.Parents.Count; i++) { label_builder.Append (" "); } label_builder.Append (album.Title); album_optionmenu.AppendText(label_builder.ToString()); AlbumPermission add_permission = album.Perms & AlbumPermission.Add; } export_button.Sensitive = items.Length > 0; album_optionmenu.Sensitive = true; album_button.Sensitive = true; } } public void HandleAddGallery (object sender, System.EventArgs args) { new AccountDialog (export_dialog); } public void HandleEditGallery (object sender, System.EventArgs args) { new AccountDialog (export_dialog, account, false); } public void HandleAddAlbum (object sender, System.EventArgs args) { if (account == null) throw new GalleryException (Catalog.GetString ("No account selected")); new GalleryAddAlbum (this, account.Gallery); } void LoadPreference (string key) { switch (key) { case SCALE_KEY: if (scale_check.Active != Preferences.Get (key)) scale_check.Active = Preferences.Get (key); break; case SIZE_KEY: size_spin.Value = (double) Preferences.Get (key); break; case BROWSER_KEY: if (browser_check.Active != Preferences.Get (key)) browser_check.Active = Preferences.Get (key); break; case META_KEY: if (meta_check.Active != Preferences.Get (key)) meta_check.Active = Preferences.Get (key); break; } } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Gallery/Resources/0000777000175000017500000000000011503407456026570 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Gallery/Resources/gallery_add_dialog.ui0000644000175000017500000003121211441732537032712 0ustar00rubenruben00000000000000 True dialog False True vertical True vertical True 12 True 0 gtk-dialog-question 6 False False 2 0 True 6 vertical True 0 <span weight='bold' size='larger'>Error Connecting to Gallery</span> True False False 0 True 0 Please verify that the settings for this gallery are correct. False False 1 1 False 0 True 12 4 2 7 6 True 1 _Gallery Name: True gallery_entry GTK_FILL True True 1 2 True 1 _Password: True password_entry 3 4 GTK_FILL True True False 1 2 3 4 True 1 _Username: True username_entry 2 3 GTK_FILL True True 1 2 2 3 True 1 U_RL: True url_entry 1 2 GTK_FILL True True 1 2 1 2 False False 1 False end 1 True end gtk-cancel True True True False True False False 0 gtk-remove True True True False True False False 1 gtk-add True True True False True False False 2 False end 0 cancel_button remove_button add_button f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Gallery/Resources/GalleryExport.addin.xml0000644000175000017500000000101711430555235033162 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Gallery/Resources/gallery_add_album_dialog.ui0000644000175000017500000001715711441732537034106 0ustar00rubenruben00000000000000 True dialog False True vertical True 12 4 2 7 6 True 1 _Parent Album: True GTK_FILL True 1 _Title: True title_entry 3 4 GTK_FILL True True 1 2 3 4 True 1 _Description: True description_entry 2 3 GTK_FILL True True 1 2 2 3 True 1 _Album Name: True name_entry 1 2 GTK_FILL True True 1 2 1 2 False end 1 True end gtk-cancel True True True False True False False 0 gtk-add True True True False True False False 1 False end 0 cancel_button add_button f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Gallery/Resources/gallery_export_dialog.ui0000644000175000017500000005226411441732537033515 0ustar00rubenruben00000000000000 Export dialog False True vertical True 6 True 0 none True 12 180 True True automatic automatic in True <b>Photos</b> True 0 True vertical 6 True 0 none True 12 True vertical 6 True 6 True _Gallery: True False False 0 gtk-add True True False True False False 2 gtk-edit True True False True False False 3 0 True False False 1 True <b>Gallery</b> True False False 0 True 0 none True 12 True vertical 6 True 6 True _Export to Album: True False False 0 gtk-add True True False True False False 2 0 Open _album in browser when done uploading True True False True True True False False 1 True <b>Album</b> True False False 1 True 0 none True 12 True vertical 6 True _Resize to: True True False True True False False 0 True True adjustment1 1 False False 1 True pixels False False 2 0 Export _titles and comments True True False True True True False False 1 True <b>Style</b> True False False 2 1 1 True end gtk-cancel True True True False True False False 0 _Export True True True False True False False 1 False end 0 cancel_button export_button 400 10000 1 10 f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Gallery/Makefile.in0000644000175000017500000006750111503407266026667 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Exporters/FSpot.Exporters.Gallery ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Exporters.Gallery TARGET = library LINK = $(REF_FSPOT_EXTENSION_GALLERYEXPORT) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Exporters.Gallery/AccountDialog.cs \ FSpot.Exporters.Gallery/FormClient.cs \ FSpot.Exporters.Gallery/GalleryAccount.cs \ FSpot.Exporters.Gallery/GalleryAccountManager.cs \ FSpot.Exporters.Gallery/GalleryAddAlbum.cs \ FSpot.Exporters.Gallery/GalleryExport.cs \ FSpot.Exporters.Gallery/GalleryRemote.cs RESOURCES = \ Resources/gallery_add_album_dialog.ui \ Resources/gallery_add_dialog.ui \ Resources/gallery_export_dialog.ui \ Resources/GalleryExport.addin.xml # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.Gallery/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.Gallery/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Gallery/Makefile.am0000644000175000017500000000123311441732537026647 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Exporters.Gallery TARGET = library LINK = $(REF_FSPOT_EXTENSION_GALLERYEXPORT) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Exporters.Gallery/AccountDialog.cs \ FSpot.Exporters.Gallery/FormClient.cs \ FSpot.Exporters.Gallery/GalleryAccount.cs \ FSpot.Exporters.Gallery/GalleryAccountManager.cs \ FSpot.Exporters.Gallery/GalleryAddAlbum.cs \ FSpot.Exporters.Gallery/GalleryExport.cs \ FSpot.Exporters.Gallery/GalleryRemote.cs RESOURCES = \ Resources/gallery_add_album_dialog.ui \ Resources/gallery_add_dialog.ui \ Resources/gallery_export_dialog.ui \ Resources/GalleryExport.addin.xml include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/0000777000175000017500000000000011503407454024726 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/0000777000175000017500000000000011503407454027346 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/Util.cs0000644000175000017500000002104111430555235030604 0ustar00rubenruben00000000000000// // Mono.Facebook.Util.cs: // // Authors: // Thomas Van Machelen (thomas.vanmachelen@gmail.com) // // (C) Copyright 2007 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Security.Cryptography; using System.Text; using System.Xml; using System.Xml.Serialization; namespace Mono.Facebook { public class Util { private const string URL = "http://api.facebook.com/restserver.php?"; private const string BOUNDARY = "SoMeTeXtWeWiLlNeVeRsEe"; private const string LINE = "\r\n"; private static Dictionary serializer_dict = new Dictionary(); private FacebookParam VersionParam = FacebookParam.Create ("v", "1.0"); private string api_key; private string secret; private bool use_json; private static XmlSerializer ErrorSerializer { get { return GetSerializer (typeof (Error)); } } public Util (string api_key, string secret) { this.api_key = api_key; this.secret = secret; } public bool UseJson { get { return use_json; } set { use_json = value; } } internal string SharedSecret { get { return secret; } set { secret = value; } } internal string ApiKey { get { return api_key; } } public T GetResponse(string method_name, params FacebookParam[] parameters) { string url = FormatGetUrl (method_name, parameters); byte[] response_bytes = GetResponseBytes (url); XmlSerializer response_serializer = GetSerializer (typeof (T)); try { T response = (T)response_serializer.Deserialize(new MemoryStream(response_bytes)); return response; } catch (InvalidOperationException e) { Error error; try { error = (Error) ErrorSerializer.Deserialize (new MemoryStream (response_bytes)); } catch { throw e; } throw new FacebookException (error.ErrorCode, error.ErrorMsg); } } public bool GetBoolResponse (string method_name, params FacebookParam[] parameters) { string url = FormatGetUrl (method_name, parameters); byte[] response_bytes = GetResponseBytes (url); XmlDocument doc = new XmlDocument (); doc.LoadXml (Encoding.Default.GetString (response_bytes)); try { return System.Convert.ToBoolean(Int32.Parse(doc.InnerText)); } catch (FormatException e) { Error error; try { error = (Error) ErrorSerializer.Deserialize (new MemoryStream (response_bytes)); } catch { Console.Error.WriteLine("Parse error: Inner text was '{0}'", doc.InnerText); throw e; } throw new FacebookException (error.ErrorCode, error.ErrorMsg); } } public XmlDocument GetResponse (string method_name, params FacebookParam[] parameters) { string url = FormatGetUrl (method_name, parameters); byte[] response_bytes = GetResponseBytes (url); XmlDocument doc = new XmlDocument (); doc.LoadXml (Encoding.Default.GetString (response_bytes)); return doc; } internal Photo Upload (string aid, string caption, string path, string session_key) { // check for file FileInfo file = new FileInfo (path); if (!file.Exists) throw new FileNotFoundException ("Upload file not found", path); // create parameter string List parameter_list = new List(); parameter_list.Add (FacebookParam.Create ("call_id", DateTime.Now.Ticks)); parameter_list.Add (FacebookParam.Create ("session_key", session_key)); parameter_list.Add (FacebookParam.Create ("aid", aid)); if (caption != null && caption != string.Empty) parameter_list.Add (FacebookParam.Create ("caption", caption)); FacebookParam[] param_array = Sign ("facebook.photos.upload", parameter_list.ToArray ()); string param_string = string.Empty; foreach (FacebookParam param in param_array) { param_string = param_string + "--" + BOUNDARY + LINE; param_string = param_string + "Content-Disposition: form-data; name=\"" + param.Name + "\"" + LINE + LINE + param.Value + LINE; } param_string = param_string + "--" + BOUNDARY + LINE + "Content-Disposition: form-data; name=\"filename\"; filename=\"" + file.Name + "\"" + LINE + "Content-Type: image/jpeg" + LINE + LINE; string closing_string = LINE + "--" + BOUNDARY + "--"; // get bytes byte[] param_bytes = System.Text.Encoding.Default.GetBytes (param_string); byte[] closing_bytes = System.Text.Encoding.Default.GetBytes (closing_string); byte[] file_bytes = System.IO.File.ReadAllBytes (path); // compose List byte_list = new List(param_bytes.Length + file_bytes.Length + closing_bytes.Length); byte_list.AddRange (param_bytes); byte_list.AddRange (file_bytes); byte_list.AddRange (closing_bytes); byte[] final_bytes = new byte[byte_list.Count]; byte_list.CopyTo (final_bytes); // create request WebClient wc = new WebClient (); wc.Headers.Set ("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); wc.Headers.Add ("MIME-version", "1.0"); // upload byte[] response = wc.UploadData ("http://api.facebook.com/restserver.php?", "POST", final_bytes); // deserialize XmlSerializer photo_serializer = new XmlSerializer (typeof (Photo)); try { return (Photo)photo_serializer.Deserialize (new MemoryStream (response)); } catch { Error error = (Error) ErrorSerializer.Deserialize (new MemoryStream (response)); throw new FacebookException (error.ErrorCode, error.ErrorMsg); } } private static byte[] GetResponseBytes (string url) { WebRequest request = HttpWebRequest.Create (url); WebResponse response = null; try { response = request.GetResponse (); using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { return Encoding.UTF8.GetBytes(reader.ReadToEnd()); } } finally { if (response != null) response.Close (); } } private string FormatGetUrl (string method_name, params FacebookParam[] parameters) { FacebookParam[] signed = Sign (method_name, parameters); StringBuilder builder = new StringBuilder (URL); for (int i = 0; i < signed.Length; i++) { if (i > 0) builder.Append ("&"); builder.Append (signed[i].ToString ()); } return builder.ToString (); } private static XmlSerializer GetSerializer (Type t) { int type_hash = t.GetHashCode (); if (!serializer_dict.ContainsKey (type_hash)) serializer_dict.Add (type_hash, new XmlSerializer (t)); return serializer_dict[type_hash]; } internal FacebookParam[] Sign (string method_name, FacebookParam[] parameters) { List list = new List (parameters); list.Add (FacebookParam.Create ("method", method_name)); list.Add (FacebookParam.Create ("api_key", api_key)); list.Add (VersionParam); list.Sort (); StringBuilder values = new StringBuilder (); foreach (FacebookParam param in list) values.Append (param.ToString ()); values.Append (secret); byte[] md5_result = MD5.Create ().ComputeHash (Encoding.ASCII.GetBytes (values.ToString ())); StringBuilder sig_builder = new StringBuilder (); foreach (byte b in md5_result) sig_builder.Append (b.ToString ("x2")); list.Add (FacebookParam.Create ("sig", sig_builder.ToString ())); return list.ToArray (); } internal static int GetIntFromString(string input) { try { return int.Parse(input); } catch { return 0; } } internal static bool GetBoolFromString(string input) { try { return bool.Parse(input); } catch { return false; } } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/Photo.cs0000644000175000017500000000562211430555235030767 0ustar00rubenruben00000000000000// // Mono.Facebook.Photo.cs: // // Authors: // Thomas Van Machelen (thomas.vanmachelen@gmail.com) // // (C) Copyright 2007 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System.Xml.Serialization; using Mono.Facebook.Schemas; namespace Mono.Facebook { [System.Xml.Serialization.XmlRootAttribute("photos_upload_response", Namespace="http://api.facebook.com/1.0/")] public class Photo : photo, SessionWrapper { [XmlIgnore] public FacebookSession Session { get; set; } [XmlIgnore] public string PId { get { return pid; } } public Tag[] GetTags () { PhotoTagsResponse rsp = Session.Util.GetResponse ("facebook.photos.getTags", FacebookParam.Create ("pids", pid), FacebookParam.Create ("session_key", Session.SessionKey), FacebookParam.Create ("call_id", System.DateTime.Now.Ticks)); foreach (Tag t in rsp.Tags) t.Session = Session; return rsp.Tags; } public Album GetAlbum () { var rsp = Session.Util.GetResponse ("facebook.photos.getAlbums", FacebookParam.Create ("aids", aid), FacebookParam.Create ("session_key", Session.SessionKey), FacebookParam.Create ("call_id", System.DateTime.Now.Ticks)); if (rsp.album.Length < 1) return null; rsp.album[0].Session = Session; return rsp.album[0]; } // does not work right now: cannot tag photo already visible on facebook public Tag AddTag (string tag_text, float x, float y) { Tag new_tag = Session.Util.GetResponse ("facebook.photos.addTag", FacebookParam.Create ("pid", PId), FacebookParam.Create ("tag_text", tag_text), FacebookParam.Create ("x", x), FacebookParam.Create ("y", y), FacebookParam.Create ("session_key", Session.SessionKey), FacebookParam.Create ("call_id", System.DateTime.Now.Ticks)); new_tag.Session = Session; return new_tag; } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/FriendInfo.cs0000644000175000017500000000263711430555235031724 0ustar00rubenruben00000000000000// // Mono.Facebook.FriendInfo.cs: // // Authors: // Thomas Van Machelen (thomas.vanmachelen@gmail.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Xml.Serialization; namespace Mono.Facebook { public class FriendInfo { [XmlElement ("uid1")] public long UId1; [XmlElement ("uid2")] public long UId2; [XmlElement ("are_friends")] public bool AreFriends; } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/Notification.cs0000644000175000017500000000341611430555235032323 0ustar00rubenruben00000000000000// // Mono.Facebook.Notification.cs: // // Authors: // George Talusan (george@convolve.ca) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.IO; using System.Xml.Serialization; using System.Text; namespace Mono.Facebook { public class Notification { [XmlElement ("unread")] public int Unread; [XmlElement ("most_recent")] public long MostRecent; } [XmlRoot ("notifications_get_response", Namespace = "http://api.facebook.com/1.0/", IsNullable = false)] public class Notifications { [XmlElement ("messages")] public Notification Messages; [XmlElement ("pokes")] public Notification Pokes; [XmlElement ("shares")] public Notification Shares; [XmlElement ("friend_requests")] public Friend[] FriendRequests; } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/SessionInfo.cs0000644000175000017500000000355211430555235032135 0ustar00rubenruben00000000000000// // Mono.Facebook.SessionInfo.cs: // // Authors: // Ruben Vermeersch (ruben@savanne.be) // // (C) Copyright 2007 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Xml.Serialization; using Mono.Facebook.Schemas; namespace Mono.Facebook { [System.Xml.Serialization.XmlRootAttribute("auth_getSession_response", Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class SessionInfo : session_info { [XmlIgnore] public bool IsInfinite { get { return expires == 0; } } public SessionInfo () {} // use this if you want to create a session based on infinite session // credentials public SessionInfo (string session_key, long uid, string secret) { this.session_key = session_key; this.uid = uid; this.secret = secret; this.expires = 0; } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/Error.cs0000644000175000017500000000301111430555235030755 0ustar00rubenruben00000000000000// // Mono.Facebook.FacebookException.cs: // // Authors: // George Talusan (george@convolve.ca) // // (C) Copyright 2007 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Xml.Serialization; namespace Mono.Facebook { [XmlRoot ("error_response", Namespace = "http://api.facebook.com/1.0/", IsNullable = false)] public class Error { [XmlElement ("error_code")] public int ErrorCode; [XmlElement ("error_msg")] public string ErrorMsg; } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/Responses.cs0000644000175000017500000001004711430555235031654 0ustar00rubenruben00000000000000// // Mono.Facebook.Responses.cs: // // Authors: // Thomas Van Machelen (thomas.vanmachelen@gmail.com) // George Talusan (george@convolve.ca) // // (C) Copyright 2007 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Xml.Serialization; using Mono.Facebook.Schemas; namespace Mono.Facebook { [XmlRoot ("photos_getAlbums_response", Namespace = "http://api.facebook.com/1.0/", IsNullable = false)] public class AlbumsResponse { [XmlElement ("album")] public Album[] album; [XmlIgnore ()] public Album[] albums { get { return album ?? new Album[0]; } } public bool list; } [XmlRoot ("photos_get_response", Namespace = "http://api.facebook.com/1.0/", IsNullable = false)] public class PhotosResponse { [XmlElement ("photo")] public Photo[] photo_array; [XmlIgnore ()] public Photo[] Photos { get { return photo_array ?? new Photo[0]; } } [XmlAttribute ("list")] public bool List; } [XmlRoot ("photos_getTags_response", Namespace = "http://api.facebook.com/1.0/", IsNullable = false)] public class PhotoTagsResponse { [XmlElement ("photo_tag")] public Tag[] tag_array; public Tag[] Tags { get { return tag_array ?? new Tag[0]; } } [XmlAttribute ("list")] public bool List; } [XmlRoot ("groups_get_response", Namespace = "http://api.facebook.com/1.0/")] public class GroupsResponse { [XmlElement ("group")] public Group[] group_array; public Group[] Groups { get { return group_array ?? new Group[0]; } } [XmlAttribute ("list")] public bool List; } [XmlRoot ("groups_getMembers_response", Namespace = "http://api.facebook.com/1.0/", IsNullable = false)] public class GroupMembersResponse { [XmlElement ("members")] public PeopleList Members; [XmlElement ("admins")] public PeopleList Admins; [XmlElement ("officers")] public PeopleList Officers; [XmlElement ("not_replied")] public PeopleList NotReplied; } [XmlRoot ("users_getInfo_response", Namespace = "http://api.facebook.com/1.0/", IsNullable = false)] public class UserInfoResponse { [XmlElement ("user")] public User[] user_array; public User[] Users { get { return user_array ?? new User[0]; } } [XmlAttribute ("list")] public bool List; } [XmlRoot ("events_get_response", Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class EventsResponse { [XmlElement ("event")] public Event[] event_array; public Event[] Events { get { return event_array ?? new Event[0]; } } [XmlAttribute ("list")] public bool List; } [XmlRoot ("friends_get_response", Namespace = "http://api.facebook.com/1.0/", IsNullable = false)] public class FriendsResponse { [XmlElement ("uid")] public long[] uids; [XmlIgnore ()] public long[] UIds { get { return uids ?? new long[0]; } } } [XmlRoot ("friends_areFriends_response", Namespace = "http://api.facebook.com/1.0/", IsNullable = false)] public class AreFriendsResponse { [XmlElement ("friend_info")] public FriendInfo[] friend_infos; } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/FacebookParam.cs0000644000175000017500000000455611430555235032375 0ustar00rubenruben00000000000000// // Mono.Facebook.FacebookParam.cs: // // Authors: // Thomas Van Machelen (thomas.vanmachelen@gmail.com) // George Talusan (george@convolvce.ca) // // (C) Copyright 2007 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Text; namespace Mono.Facebook { public class FacebookParam : IComparable { private string name; private object value; public string Name { get{ return name; } } public string Value { get { if (value is Array) return ConvertArrayToString (value as Array); else return value.ToString (); } } protected FacebookParam (string name, object value) { this.name = name; this.value = value; } public override string ToString () { return string.Format ("{0}={1}", Name, Value); } public static FacebookParam Create (string name, object value) { return new FacebookParam (name, value); } public int CompareTo (object obj) { if (!(obj is FacebookParam)) return -1; return this.name.CompareTo ((obj as FacebookParam).name); } private static string ConvertArrayToString (Array a) { StringBuilder builder = new StringBuilder (); for (int i = 0; i < a.Length; i++) { if (i > 0) builder.Append (","); builder.Append (a.GetValue (i).ToString ()); } return builder.ToString (); } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/User.cs0000644000175000017500000000412211430555235030606 0ustar00rubenruben00000000000000// // Mono.Facebook.User.cs: // // Authors: // Thomas Van Machelen (thomas.vanmachelen@gmail.com) // George Talusan (george@convolve.ca) // // (C) Copyright 2007 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Xml.Serialization; using Mono.Facebook.Schemas; namespace Mono.Facebook { public class User : user { public static readonly string[] FIELDS = { "about_me", "activities", "affiliations", "birthday", "books", "current_location", "education_history", "first_name", "hometown_location", "interests", "last_name", "movies", "music", "name", "notes_count", "pic", "pic_big", "pic_small", "political", "profile_update_time", "quotes", "relationship_status", "religion", "sex", "significant_other_id", "status", "timezone", "tv", "uid", "wall_count" }; [XmlIgnore ()] public Uri PicUri { get { return new Uri (pic); } } [XmlIgnore ()] public Uri PicBigUri { get { return new Uri (pic_big); } } [XmlIgnore ()] public Uri PicSmallUri { get { return new Uri (pic_small); } } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/Tag.cs0000644000175000017500000000363011430555235030406 0ustar00rubenruben00000000000000// // Mono.Facebook.Tag.cs: // // Authors: // Thomas Van Machelen (thomas.vanmachelen@gmail.com) // // (C) Copyright 2007 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System.Xml.Serialization; using Mono.Facebook.Schemas; namespace Mono.Facebook { public class Tag : photo_tag, SessionWrapper { [XmlIgnore] public FacebookSession Session { get; set; } [XmlIgnore] public long Subject { get { return subject; } } public Photo GetPhoto () { PhotosResponse rsp = Session.Util.GetResponse ("facebook.photos.get", FacebookParam.Create ("pids", pid), FacebookParam.Create ("session_key", Session.SessionKey), FacebookParam.Create ("call_id", System.DateTime.Now.Ticks)); if (rsp.Photos.Length < 1) return null; rsp.Photos[0].Session = Session; return rsp.Photos[0]; } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/FacebookSession.cs0000644000175000017500000002407711430555235032760 0ustar00rubenruben00000000000000// // Mono.Facebook.FacebookSession.cs: // // Authors: // Thomas Van Machelen (thomas.vanmachelen@gmail.com) // George Talusan (george@convolve.ca) // // (C) Copyright 2007 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Xml; using System.Collections.Generic; using System.Text; using System.IO; using System.Net; using System.Linq; using Mono.Facebook.Schemas; namespace Mono.Facebook { public class FacebookSession { Util util; SessionInfo session_info; string auth_token; internal string SessionKey { get { return session_info.session_key; } } internal Util Util { get { return util; } } // use this for plain sessions public FacebookSession (string api_key, string shared_secret) { util = new Util (api_key, shared_secret); } // use this if you want to re-start an infinite session public FacebookSession (string api_key, SessionInfo session_info) : this (api_key, session_info.secret) { this.session_info = session_info; } public Uri CreateToken () { XmlDocument doc = util.GetResponse ("facebook.auth.createToken"); auth_token = doc.InnerText; return new Uri (string.Format ("http://www.facebook.com/login.php?api_key={0}&v=1.0&auth_token={1}", util.ApiKey, auth_token)); } public Uri GetGrantUri (string permission) { return new Uri(string.Format("http://www.facebook.com/authorize.php?api_key={0}&v=1.0&ext_perm={1}", util.ApiKey, permission)); } public bool HasAppPermission(string permission) { return util.GetBoolResponse("facebook.users.hasAppPermission", FacebookParam.Create ("call_id", DateTime.Now.Ticks), FacebookParam.Create ("session_key", session_info.session_key), FacebookParam.Create ("ext_perm", permission)); } public bool RevokeAppPermission(string permission) { return util.GetBoolResponse ("facebook.auth.revokeExtendedPermission", FacebookParam.Create ("call_id", DateTime.Now.Ticks), FacebookParam.Create ("session_key", session_info.session_key), FacebookParam.Create ("perm", permission)); } public SessionInfo GetSession () { return GetSessionFromToken(auth_token); } public SessionInfo GetSessionFromToken(string auth_token) { this.session_info = util.GetResponse("facebook.auth.getSession", FacebookParam.Create("auth_token", auth_token)); this.util.SharedSecret = session_info.secret; this.auth_token = string.Empty; return session_info; } public Album[] GetAlbums () { try { var rsp = util.GetResponse ("facebook.photos.getAlbums", FacebookParam.Create ("uid", session_info.uid), FacebookParam.Create ("session_key", session_info.session_key), FacebookParam.Create ("call_id", DateTime.Now.Ticks)); var profile_rsp = util.GetResponse ("facebook.photos.getAlbums", FacebookParam.Create ("uid", session_info.uid), FacebookParam.Create ("session_key", session_info.session_key), FacebookParam.Create ("call_id", DateTime.Now.Ticks), FacebookParam.Create ("aid", -3)); // Filters out Profile pictures album, can't upload there. return rsp.albums.Where ((a) => a.aid != profile_rsp.album [0].aid).ToArray (); } catch (FormatException) { return new Album[0]; } } public Album CreateAlbum (string name, string description, string location) { // create parameter list List param_list = new List (); param_list.Add (FacebookParam.Create ("session_key", session_info.session_key)); param_list.Add (FacebookParam.Create ("call_id", DateTime.Now.Ticks)); param_list.Add (FacebookParam.Create ("name", name)); if (description != null && description != string.Empty) param_list.Add (FacebookParam.Create ("description", description)); if (location != null && location != string.Empty) param_list.Add (FacebookParam.Create ("location", location)); // create the albums Album new_album = util.GetResponse ("facebook.photos.createAlbum", param_list.ToArray ()); new_album.Session = this; // return return new_album; } public Group[] GetGroups () { return this.GetGroups (session_info.uid, null); } public Group[] GetGroups (long? uid, long[] gids) { List param_list = new List(); param_list.Add (FacebookParam.Create ("session_key", session_info.session_key)); param_list.Add (FacebookParam.Create ("call_id", DateTime.Now.Ticks)); if (uid != null) param_list.Add (FacebookParam.Create ("uid", uid)); if (gids != null) param_list.Add (FacebookParam.Create ("gids", gids)); GroupsResponse rsp = util.GetResponse("facebook.groups.get", param_list.ToArray ()); foreach (Group gr in rsp.Groups) gr.Session = this; return rsp.Groups; } public Event[] GetEvents () { return GetEvents (session_info.uid, null, 0, 0, null); } public Event[] GetEvents (long? uid, long[] eids, long start_time, long end_time, string rsvp_status) { List param_list = new List(); param_list.Add (FacebookParam.Create ("session_key", session_info.session_key)); param_list.Add (FacebookParam.Create ("call_id", DateTime.Now.Ticks)); if (uid != null) param_list.Add (FacebookParam.Create ("uid", uid)); if (eids != null) param_list.Add (FacebookParam.Create ("eids", eids)); param_list.Add (FacebookParam.Create ("start_time", start_time)); param_list.Add (FacebookParam.Create ("end_time", start_time)); if (rsvp_status != null) param_list.Add (FacebookParam.Create ("rsvp_status", rsvp_status)); EventsResponse rsp = util.GetResponse("facebook.events.get", param_list.ToArray ()); foreach (Event evt in rsp.Events) evt.Session = this; return rsp.Events; } public User GetUserInfo (long uid) { User[] users = this.GetUserInfo (new long[1] { uid }, User.FIELDS); if (users.Length < 1) return null; return users[0]; } public User[] GetUserInfo (long[] uids, string[] fields) { List param_list = new List(); param_list.Add (FacebookParam.Create ("session_key", session_info.session_key)); param_list.Add (FacebookParam.Create ("call_id", DateTime.Now.Ticks)); if (uids == null || uids.Length == 0) throw new Exception ("uid not provided"); param_list.Add (FacebookParam.Create ("uids", uids)); param_list.Add (FacebookParam.Create ("fields", fields)); UserInfoResponse rsp = util.GetResponse("facebook.users.getInfo", param_list.ToArray ()); return rsp.Users; } public Me GetLoggedInUser () { return new Me (session_info.uid, this); } public Notifications GetNotifications () { Notifications notifications = util.GetResponse("facebook.notifications.get", FacebookParam.Create ("uid", session_info.uid), FacebookParam.Create ("session_key", session_info.session_key), FacebookParam.Create ("call_id", DateTime.Now.Ticks)); foreach (Friend f in notifications.FriendRequests) f.Session = this; return notifications; } public Friend[] GetFriends () { FriendsResponse response = Util.GetResponse("facebook.friends.get", FacebookParam.Create ("session_key", session_info.session_key), FacebookParam.Create ("call_id", DateTime.Now.Ticks)); Friend[] friends = new Friend[response.UIds.Length]; for (int i = 0; i < friends.Length; i++) friends[i] = new Friend (response.UIds[i], this); return friends; } public bool AreFriends (Friend friend1, Friend friend2) { return AreFriends (friend1.UId, friend2.UId); } public bool AreFriends (long uid1, long uid2) { AreFriendsResponse response = Util.GetResponse("facebook.friends.areFriends", FacebookParam.Create ("session_key", session_info.session_key), FacebookParam.Create ("call_id", DateTime.Now.Ticks), FacebookParam.Create ("uids1", uid1), FacebookParam.Create ("uids2", uid2)); return response.friend_infos[0].AreFriends; } public FriendInfo[] AreFriends (long[] uids1, long[] uids2) { List param_list = new List (); param_list.Add (FacebookParam.Create ("session_key", session_info.session_key)); param_list.Add (FacebookParam.Create ("call_id", DateTime.Now.Ticks)); if (uids1 == null || uids1.Length == 0) throw new Exception ("uids1 not provided"); if (uids2 == null || uids2.Length == 0) throw new Exception ("uids2 not provided"); param_list.Add (FacebookParam.Create ("uids1", uids1)); param_list.Add (FacebookParam.Create ("uids2", uids2)); AreFriendsResponse rsp = util.GetResponse ("facebook.friends.areFriends", param_list.ToArray ()); return rsp.friend_infos; } public XmlDocument Query (string sql_query) { XmlDocument doc = Util.GetResponse ("facebook.fql.query", FacebookParam.Create ("session_key", session_info.session_key), FacebookParam.Create ("call_id", DateTime.Now.Ticks), FacebookParam.Create ("query", sql_query)); return doc; } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/SessionWrapper.cs0000644000175000017500000000256211430555235032662 0ustar00rubenruben00000000000000// // Mono.Facebook.SessionWrapper.cs: // // Authors: // Thomas Van Machelen (thomas.vanmachelen@gmail.com) // // (C) Copyright 2007 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System.Xml.Serialization; namespace Mono.Facebook { internal interface SessionWrapper { FacebookSession Session { get; set; } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/AssemblyInfo.cs0000644000175000017500000000300211430555235032257 0ustar00rubenruben00000000000000// AssemblyInfo.cs for Mono.Facebook.dll // // Authors: // Thomas Van Machelen (thomas.vanmachelen@gmail.com) // // Copyright (c) 2007 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System.Reflection; using System.Runtime.CompilerServices; [assembly: AssemblyVersion("0.1.0")] [assembly: AssemblyTitle ("Mono.Facebook")] [assembly: AssemblyDescription ("")] [assembly: AssemblyCopyright ("(c) 2007 Novell, Inc.")] [assembly: AssemblyCompany ("Novell, Inc.")] f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/facebook.cs0000644000175000017500000037333011503404762031452 0ustar00rubenruben00000000000000// ------------------------------------------------------------------------------ // // This code was generated by a tool. // Mono Runtime Version: 1.1.4322.2032 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // // ------------------------------------------------------------------------------ // //This source code was auto-generated by MonoXSD // namespace Mono.Facebook.Schemas { /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("feed_getRegisteredTemplateBundleByID_response", Namespace="http://api.facebook.com/1.0/")] public class template_bundle { /// public template_bundleOne_line_story_templates one_line_story_templates; /// public template_bundleShort_story_templates short_story_templates; /// public full_story_template full_story_template; /// public template_bundleAction_links action_links; /// public long time_created; /// public long template_bundle_id; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class template_bundleOne_line_story_templates { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("one_line_story_template")] public string[] one_line_story_template; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class template_bundleShort_story_templates { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("short_story_template")] public short_story_template[] short_story_template; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class short_story_template { /// public string template_title; /// public string template_body; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class full_story_template { /// public string template_title; /// public string template_body; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class template_bundleAction_links { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("stream_action_link")] public stream_action_link[] stream_action_link; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_action_link { /// public string text; /// public string href; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class batch_run_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("batch_run_response_elt")] public string[] batch_run_response_elt; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("data_getAssociationDefinition_response", Namespace="http://api.facebook.com/1.0/")] public class object_assoc_info { /// public string name; /// public int assoc_type; /// public assoc_object_type assoc_info1; /// public assoc_object_type assoc_info2; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class assoc_object_type { /// public string alias; /// public string object_type; /// public bool unique; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("dashboard_getNews_response", Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class container { } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("photos_upload_response", Namespace="http://api.facebook.com/1.0/")] public class photo { /// public string pid; /// public string aid; /// public long owner; /// public string src; /// public string src_big; /// public string src_small; /// public string link; /// public string caption; /// public long created; /// public long story_fbid; /// public long modified; /// public long object_id; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class links_getStats_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("link_stat")] public link_stat[] link_stat; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class link_stat { /// public string url; /// public long share_count; /// public long like_count; /// public long comment_count; /// public long total_count; /// public long click_count; /// public string normalized_url; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class stream_getComments_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("comment")] public comment[] comment; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class comment { /// public string xid; /// public long fromid; /// public long time; /// public string text; /// public string id; /// public string username; /// public string reply_xid; /// public string post_id; /// public long app_id; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("events_getMembers_response", Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class event_members { /// public event_membersAttending attending; /// public event_membersUnsure unsure; /// public event_membersDeclined declined; /// public event_membersNot_replied not_replied; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class event_membersAttending { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("uid")] public long[] uid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class event_membersUnsure { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("uid")] public long[] uid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class event_membersDeclined { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("uid")] public long[] uid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class event_membersNot_replied { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("uid")] public long[] uid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class fql_multiquery_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("fql_result")] public fql_result[] fql_result; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class fql_result { /// public string name; /// public string fql_result_set; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("groups_getMembers_response", Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class group_members { /// public group_membersMembers members; /// public group_membersAdmins admins; /// public group_membersOfficers officers; /// public group_membersNot_replied not_replied; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class group_membersMembers { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("uid")] public long[] uid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class group_membersAdmins { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("uid")] public long[] uid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class group_membersOfficers { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("uid")] public long[] uid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class group_membersNot_replied { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("uid")] public long[] uid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class intl_getTranslations_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("locale_data")] public locale_data[] locale_data; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class locale_data { /// public string locale; /// public locale_dataStrings strings; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class locale_dataStrings { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("locale_string")] public locale_string[] locale_string; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class locale_string { /// public string native_string; /// public locale_stringTranslations translations; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class locale_stringTranslations { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("translation_info")] public translation_info[] translation_info; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class translation_info { /// public string translation; /// public string status; /// public string description; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class links_get_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("link")] public link[] link; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class link { /// public long link_id; /// public long owner; /// public string owner_comment; /// public long created_time; /// public string title; /// public string summary; /// public string url; /// public linkImage_urls image_urls; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class linkImage_urls { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("image_urls_elt")] public string[] image_urls_elt; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("video_getUploadLimits_response", Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class video_limits { /// public int length; /// public long size; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class connect_unregisterUsers_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("connect_unregisterUsers_response_elt")] public string[] connect_unregisterUsers_response_elt; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("privacy_get_response", Namespace="http://api.facebook.com/1.0/")] public class privacy { /// public string description; /// public string value; /// public string friends; /// public privacyNetworks networks; /// public privacyAllow allow; /// public privacyDeny deny; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class privacyNetworks { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("networks_elt")] public string[] networks_elt; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class privacyAllow { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("allow_elt")] public string[] allow_elt; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class privacyDeny { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("deny_elt")] public string[] deny_elt; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class admin_getMetrics_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("metrics")] public metrics[] metrics; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class metrics { /// public long end_time; /// [System.Xml.Serialization.XmlIgnore()] public bool end_timeSpecified; /// public int active_users; /// [System.Xml.Serialization.XmlIgnore()] public bool active_usersSpecified; /// public int api_calls; /// [System.Xml.Serialization.XmlIgnore()] public bool api_callsSpecified; /// public int unique_api_calls; /// [System.Xml.Serialization.XmlIgnore()] public bool unique_api_callsSpecified; /// public int canvas_page_views; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_viewsSpecified; /// public int unique_canvas_page_views; /// [System.Xml.Serialization.XmlIgnore()] public bool unique_canvas_page_viewsSpecified; /// public int canvas_http_request_time_avg; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_http_request_time_avgSpecified; /// public int canvas_fbml_render_time_avg; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_fbml_render_time_avgSpecified; /// public int unique_adds; /// [System.Xml.Serialization.XmlIgnore()] public bool unique_addsSpecified; /// public int unique_removes; /// [System.Xml.Serialization.XmlIgnore()] public bool unique_removesSpecified; /// public int unique_blocks; /// [System.Xml.Serialization.XmlIgnore()] public bool unique_blocksSpecified; /// public int unique_unblocks; /// [System.Xml.Serialization.XmlIgnore()] public bool unique_unblocksSpecified; /// public int canvas_page_views_http_code_0; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_0Specified; /// public int canvas_page_views_http_code_100; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_100Specified; /// public int canvas_page_views_http_code_200; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_200Specified; /// public int canvas_page_views_http_code_200ND; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_200NDSpecified; /// public int canvas_page_views_http_code_301; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_301Specified; /// public int canvas_page_views_http_code_302; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_302Specified; /// public int canvas_page_views_http_code_303; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_303Specified; /// public int canvas_page_views_http_code_400; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_400Specified; /// public int canvas_page_views_http_code_401; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_401Specified; /// public int canvas_page_views_http_code_402; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_402Specified; /// public int canvas_page_views_http_code_403; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_403Specified; /// public int canvas_page_views_http_code_404; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_404Specified; /// public int canvas_page_views_http_code_405; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_405Specified; /// public int canvas_page_views_http_code_413; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_413Specified; /// public int canvas_page_views_http_code_422; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_422Specified; /// public int canvas_page_views_http_code_500; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_500Specified; /// public int canvas_page_views_http_code_502; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_502Specified; /// public int canvas_page_views_http_code_503; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_503Specified; /// public int canvas_page_views_http_code_505; /// [System.Xml.Serialization.XmlIgnore()] public bool canvas_page_views_http_code_505Specified; /// public int feedform_impression; /// [System.Xml.Serialization.XmlIgnore()] public bool feedform_impressionSpecified; /// public int feedform_publish; /// [System.Xml.Serialization.XmlIgnore()] public bool feedform_publishSpecified; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class update_decodeIDs_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("id_map")] public id_map[] id_map; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class id_map { /// public string old_id; /// public long new_id; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class data_getObjects_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("data_getObjects_response_elt")] public container[] data_getObjects_response_elt; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class pages_getInfo_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("page")] public page[] page; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class page { /// public long page_id; /// [System.Xml.Serialization.XmlIgnore()] public bool page_idSpecified; /// public string name; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string pic_small; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string pic_big; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string pic_square; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string pic; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string pic_large; /// public string page_url; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public user_status status; /// public string type; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string website; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public bool? has_added_app; /// [System.Xml.Serialization.XmlIgnore()] public bool has_added_appSpecified; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string founded; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string company_overview; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string mission; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string products; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public location location; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public page_parking parking; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string public_transit; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public page_hours hours; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string attire; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string payment_options; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string culinary_team; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string general_manager; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string price_range; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public page_restaurant_services restaurant_services; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public page_restaurant_specialties restaurant_specialties; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string release_date; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string genre; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string starring; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string screenplay_by; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string directed_by; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string produced_by; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string studio; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string awards; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string plot_outline; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string network; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string season; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string schedule; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string written_by; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string band_members; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string hometown; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string current_location; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string record_label; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string booking_agent; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string artists_we_like; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string influences; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string band_interests; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string bio; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string affiliation; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string birthday; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string personal_info; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string personal_interests; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string members; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string built; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string features; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string mpg; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string general_info; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string username; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class user_status { /// public string message; /// public long time; /// public long status_id; /// public string source; /// public long uid; /// public int comment_count; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class location { /// public string street; /// public string city; /// public string state; /// public string country; /// public string zip; /// public System.Decimal latitude; /// [System.Xml.Serialization.XmlIgnore()] public bool latitudeSpecified; /// public System.Decimal longitude; /// [System.Xml.Serialization.XmlIgnore()] public bool longitudeSpecified; /// public long id; /// [System.Xml.Serialization.XmlIgnore()] public bool idSpecified; /// public string name; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class page_parking { /// public bool street; /// public bool lot; /// public bool valet; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class page_hours { /// public long mon_1_open; /// public long mon_1_close; /// public long tue_1_open; /// public long tue_1_close; /// public long wed_1_open; /// public long thu_1_open; /// public long thu_1_close; /// public long fri_1_open; /// public long fri_1_close; /// public long sat_1_open; /// public long sat_1_close; /// public long sun_1_open; /// public long sun_1_close; /// public long mon_2_open; /// public long mon_2_close; /// public long tue_2_open; /// public long tue_2_close; /// public long wed_2_open; /// public long wed_2_close; /// public long thu_2_open; /// public long thu_2_close; /// public long fri_2_open; /// public long fri_2_close; /// public long sat_2_open; /// public long sat_2_close; /// public long sun_2_open; /// public long sun_2_close; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class page_restaurant_services { /// public bool reserve; /// public bool walkins; /// public bool groups; /// public bool kids; /// public bool takeout; /// public bool delivery; /// public bool catering; /// public bool waiter; /// public bool outdoor; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class page_restaurant_specialties { /// public bool breakfast; /// public bool lunch; /// public bool dinner; /// public bool coffee; /// public bool drinks; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("links_preview_response", Namespace="http://api.facebook.com/1.0/")] public class stream_attachment { /// public stream_attachmentMedia media; /// public string name; /// public string href; /// public string caption; /// public string description; /// public stream_attachmentProperties properties; /// public string icon; /// public string fb_object_type; /// public string fb_object_id; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_attachmentMedia { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("stream_media")] public stream_media[] stream_media; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_media { /// public string href; /// public string alt; /// public string type; /// public string src; /// public stream_video video; /// public string obj; /// public stream_music music; /// public string data; /// public stream_photo photo; /// public stream_swf swf; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_video { /// public string display_url; /// public string source_url; /// public long owner; /// public string permalink; /// public string preview_img; /// public string source_type; /// public long created_time; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_music { /// public string source_url; /// public string title; /// public string artist; /// public string album; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_photo { /// public string aid; /// public string pid; /// public long owner; /// public int index; /// public int width; /// public int height; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_swf { /// public string source_url; /// public string preview_img; /// public string flash_vars; /// public int width; /// public int height; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_attachmentProperties { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("stream_property")] public stream_property[] stream_property; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_property { /// public string name; /// public string text; /// public string href; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("photos_createAlbum_response", Namespace="http://api.facebook.com/1.0/")] public class album { /// public string aid; /// public string cover_pid; /// public long owner; /// public string name; /// public long created; /// public long modified; /// public string description; /// public string location; /// public string link; /// public int size; /// public string visible; /// public long modified_major; /// public string type; /// public long object_id; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class feed_getRegisteredTemplateBundles_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("template_bundle")] public template_bundle[] template_bundle; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class data_getAssociatedObjects_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("object_association")] public object_association[] object_association; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class object_association { /// public string name; /// public long id1; /// public long id2; /// public string data; /// public long time; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class feed_getAppFriendStories_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("feed_story")] public feed_story[] feed_story; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class feed_story { /// public long actor_id; /// public string post_id; /// public string story_title; /// public string story_body; /// public string images; /// public string flash; /// public string mp3; /// public string video; /// public long time_published; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class data_getAssociationDefinitions_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("object_assoc_info")] public object_assoc_info[] object_assoc_info; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("auth_getSession_response", Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class session_info { /// public string session_key; /// public long uid; /// public int expires; /// public string secret; /// public string base_domain; /// public string access_token; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class friends_getAppUsers_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("uid")] public long[] uid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class groups_get_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("group")] public group[] group; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class group { /// public long gid; /// public string name; /// public int nid; /// public string description; /// public string group_type; /// public string group_subtype; /// public string recent_news; /// public string pic; /// public string pic_big; /// public string pic_small; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public long? creator; /// public long update_time; /// public string office; /// public string website; /// public location venue; /// public string privacy; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class friends_getMutualFriends_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("uid")] public long[] uid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class profile_getInfo_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("user_info")] public user_info[] user_info; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class user_info { /// public string title; /// public int type; /// public user_infoInfo_fields info_fields; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class user_infoInfo_fields { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("info_field")] public info_field[] info_field; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class info_field { /// public string field; /// public info_fieldItems items; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class info_fieldItems { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("info_item")] public info_item[] info_item; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class info_item { /// public string label; /// public string sublabel; /// public string description; /// public string link; /// public string image; /// public string meta; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class data_getAssociations_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("object_association")] public object_association[] object_association; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class stream_getFilters_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("stream_filter")] public stream_filter[] stream_filter; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_filter { /// public long uid; /// public string filter_key; /// public string name; /// public int rank; /// public string icon_url; /// public bool is_visible; /// public string type; /// public long value; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("error_response", Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class FacebookApiException { /// public int error_code; /// public string error_msg; /// public FacebookApiExceptionRequest_args request_args; /// public string error_data; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class FacebookApiExceptionRequest_args { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("arg")] public arg[] arg; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class arg { /// public string key; /// public string value; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class permissions_checkGrantedApiAccess_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("permissions_checkGrantedApiAccess_response_elt")] public string[] permissions_checkGrantedApiAccess_response_elt; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class admin_getBannedUsers_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("uid")] public long[] uid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("notifications_get_response", Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class notifications { /// public notification_count messages; /// public notification_count pokes; /// public notification_count shares; /// public notificationsFriend_requests friend_requests; /// public notificationsGroup_invites group_invites; /// public notificationsEvent_invites event_invites; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class notification_count { /// public int unread; /// public long most_recent; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class notificationsFriend_requests { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("uid")] public long[] uid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class notificationsGroup_invites { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("gid")] public long[] gid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class notificationsEvent_invites { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("eid")] public long[] eid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class users_getInfo_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("user")] public user[] user; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class user { /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string about_me; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string activities; /// public userAffiliations affiliations; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string birthday; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string books; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public location current_location; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public userEducation_history education_history; /// public string first_name; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public location hometown_location; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public hs_info hs_info; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string interests; /// public bool is_app_user; /// [System.Xml.Serialization.XmlIgnore()] public bool is_app_userSpecified; /// public string last_name; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public userMeeting_for meeting_for; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public userMeeting_sex meeting_sex; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string movies; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string music; /// public string name; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public int? notes_count; /// [System.Xml.Serialization.XmlIgnore()] public bool notes_countSpecified; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string pic; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string pic_big; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string pic_small; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string political; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public long? profile_update_time; /// [System.Xml.Serialization.XmlIgnore()] public bool profile_update_timeSpecified; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string quotes; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string relationship_status; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string religion; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string sex; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public long? significant_other_id; /// [System.Xml.Serialization.XmlIgnore()] public bool significant_other_idSpecified; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public user_status status; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public System.Decimal? timezone; /// [System.Xml.Serialization.XmlIgnore()] public bool timezoneSpecified; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string tv; /// public long uid; /// [System.Xml.Serialization.XmlIgnore()] public bool uidSpecified; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public int? wall_count; /// [System.Xml.Serialization.XmlIgnore()] public bool wall_countSpecified; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public userWork_history work_history; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string pic_square; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public bool? has_added_app; /// [System.Xml.Serialization.XmlIgnore()] public bool has_added_appSpecified; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public userEmail_hashes email_hashes; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string locale; /// public userFamily family; /// public bool are_friends; /// [System.Xml.Serialization.XmlIgnore()] public bool are_friendsSpecified; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public bool? can_see_profile; /// [System.Xml.Serialization.XmlIgnore()] public bool can_see_profileSpecified; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string profile_url; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string username; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string proxied_email; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string pic_large; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string pic_big_with_logo; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string pic_small_with_logo; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string pic_square_with_logo; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string pic_with_logo; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string birthday_date; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string online_presence; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string website; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public bool? is_blocked; /// [System.Xml.Serialization.XmlIgnore()] public bool is_blockedSpecified; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class userAffiliations { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("affiliation")] public affiliation[] affiliation; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class affiliation { /// public int nid; /// public string name; /// public string type; /// public string status; /// public int year; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class userEducation_history { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("education_info")] public education_info[] education_info; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class education_info { /// public string name; /// public int year; /// public education_infoConcentrations concentrations; /// public string degree; /// public string school_type; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class education_infoConcentrations { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("concentration")] public string[] concentration; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class hs_info { /// public string hs1_name; /// public string hs2_name; /// public int grad_year; /// public int hs1_id; /// public int hs2_id; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class userMeeting_for { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("seeking")] public string[] seeking; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class userMeeting_sex { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("sex")] public string[] sex; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class userWork_history { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("work_info")] public work_info[] work_info; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class work_info { /// public location location; /// public string company_name; /// public string position; /// public string description; /// public string start_date; /// public string end_date; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class userEmail_hashes { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("email_hashes_elt")] public string[] email_hashes_elt; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class userFamily { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("family_info")] public family_info[] family_info; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class family_info { /// public string relationship; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public long? uid; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string name; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public string birthday; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public long? profile_id; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class notes_get_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("note")] public note[] note; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class note { /// public long note_id; /// public string title; /// public string content; /// public long created_time; /// public long updated_time; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class data_getUserPreferences_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("preference")] public preference[] preference; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class preference { /// public int pref_id; /// public string value; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class users_getStandardInfo_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("user")] public user[] user; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class events_get_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("event")] public @event[] @event; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class @event { /// public long eid; /// public string name; /// public string tagline; /// public int nid; /// public string pic; /// public string pic_big; /// public string pic_small; /// public string host; /// public string description; /// public string event_type; /// public string event_subtype; /// public long start_time; /// public long end_time; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public long? creator; /// public long update_time; /// public string location; /// public location venue; /// public string privacy; /// public bool hide_guest_list; /// public bool show_in_search; /// public bool show_wall; /// public bool show_videos; /// public bool show_photos; /// public bool show_posts; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class connect_registerUsers_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("connect_registerUsers_response_elt")] public string[] connect_registerUsers_response_elt; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class fbml_getCustomTags_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("custom_tag")] public custom_tag[] custom_tag; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class custom_tag { /// public string name; /// public int type; /// public string summary; /// public string description; /// public custom_tagParameter parameter; /// public string body; /// public string open_tag; /// public string close_tag; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class custom_tagParameter { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("custom_tag_parameter")] public custom_tag_parameter[] custom_tag_parameter; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class custom_tag_parameter { /// public string name; /// public string custom_tag_parameter_type; /// public string description; /// public string default_value; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class data_getObjectType_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("object_property_info")] public object_property_info[] object_property_info; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class object_property_info { /// public string name; /// public int data_type; /// public int index_type; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class data_getAssociatedObjectCounts_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("data_getAssociatedObjectCounts_response_elt")] public int[] data_getAssociatedObjectCounts_response_elt; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class photos_get_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("photo")] public photo[] photo; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class friends_get_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("uid")] public long[] uid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class comments_get_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("comment")] public comment[] comment; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class friends_areFriends_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("friend_info")] public friend_info[] friend_info; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class friend_info { /// public long uid1; /// [System.Xml.Serialization.XmlIgnore()] public bool uid1Specified; /// public long uid2; /// [System.Xml.Serialization.XmlIgnore()] public bool uid2Specified; /// [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public bool? are_friends; /// [System.Xml.Serialization.XmlIgnore()] public bool are_friendsSpecified; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class data_getObjectTypes_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("object_type_info")] public object_type_info[] object_type_info; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class object_type_info { /// public string name; /// public int object_class; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class data_getCookies_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("cookie")] public cookie[] cookie; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class cookie { /// public long uid; /// public string name; /// public string value; /// public int expires; /// public string path; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class privacy_canSee_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("privacy_canSee_response_elt")] public bool[] privacy_canSee_response_elt; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("auth_getSignedPublicSessionData_response", Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class public_session_data { /// public long uid; /// public string api_key; /// public int expires; /// public string sig; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class profile_getInfoOptions_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("info_item")] public info_item[] info_item; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class photos_getTags_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("photo_tag")] public photo_tag[] photo_tag; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class photo_tag { /// public string pid; /// public long subject; /// [System.Xml.Serialization.XmlIgnore()] public bool subjectSpecified; /// public string text; /// public System.Decimal xcoord; /// public System.Decimal ycoord; /// public long created; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class message_getThreadsInFolder_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("thread")] public thread[] thread; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class thread { /// public long thread_id; /// public string subject; /// public threadRecipients recipients; /// public long updated_time; /// public string parent_message_id; /// public long parent_thread_id; /// public int message_count; /// public string snippet; /// public long snippet_author; /// public long object_id; /// public bool unread; /// public threadMessages messages; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class threadRecipients { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("uid")] public long[] uid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class threadMessages { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("message")] public message[] message; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class message { /// public string message_id; /// public long author_id; /// public string body; /// public long created_time; /// public stream_attachment attachment; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("stream_get_response", Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class stream_data { /// public stream_dataPosts posts; /// public stream_dataProfiles profiles; /// public stream_dataAlbums albums; /// public stream_dataPhoto_tags photo_tags; /// public stream_dataPhoto_feedback photo_feedback; /// public stream_dataConnections connections; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_dataPosts { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("stream_post")] public stream_post[] stream_post; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_post { /// public string post_id; /// public long viewer_id; /// public string view; /// public long source_id; /// public string type; /// public long app_id; /// public string attribution; /// public long actor_id; /// public long target_id; /// public string message; /// public stream_attachment attachment; /// public stream_app_data app_data; /// public stream_postAction_links action_links; /// public stream_comments comments; /// public stream_likes likes; /// public privacy privacy; /// public long updated_time; /// public long created_time; /// public stream_postTagged_ids tagged_ids; /// public bool is_hidden; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_app_data { /// public long tbid; /// public string attachment_data; /// public string images; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_postAction_links { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("stream_action_link")] public stream_action_link[] stream_action_link; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_comments { /// public bool can_remove; /// public bool can_post; /// public int count; /// public stream_commentsComment_list comment_list; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_commentsComment_list { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("comment")] public comment[] comment; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_likes { /// public string href; /// public int count; /// public stream_likesSample sample; /// public stream_likesFriends friends; /// public bool user_likes; /// public bool can_like; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_likesSample { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("uid")] public long[] uid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_likesFriends { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("uid")] public long[] uid; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_postTagged_ids { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("id")] public long[] id; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_dataProfiles { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("profile")] public profile[] profile; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class profile { /// public long id; /// public string url; /// public string name; /// public string pic_square; /// public string type; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_dataAlbums { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("album")] public album[] album; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_dataPhoto_tags { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("photo_tag")] public photo_tag[] photo_tag; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_dataPhoto_feedback { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("photo_feedback")] public photo_feedback[] photo_feedback; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class photo_feedback { /// public string pid; /// public stream_comments comments; /// public stream_likes likes; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class stream_dataConnections { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("connection")] public connection[] connection; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class connection { /// public long source_id; /// public long target_id; /// public bool is_following; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class fql_query_response { } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class status_get_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("user_status")] public user_status[] user_status; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("friends_createList_response", Namespace="http://api.facebook.com/1.0/")] public class friendlist { /// public long flid; /// public string name; /// public long owner; /// [System.Xml.Serialization.XmlIgnore()] public bool ownerSpecified; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class permissions_checkAvailableApiAccess_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("permissions_checkAvailableApiAccess_response_elt")] public string[] permissions_checkAvailableApiAccess_response_elt; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class friends_getLists_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("friendlist")] public friendlist[] friendlist; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class photos_getAlbums_response { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("album")] public album[] album; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("application_getPublicInfo_response", Namespace="http://api.facebook.com/1.0/")] public class app_info { /// public long app_id; /// public string api_key; /// public string canvas_name; /// public string display_name; /// public string icon_url; /// public string logo_url; /// public app_infoDevelopers developers; /// public string company_name; /// public string description; /// public int daily_active_users; /// public int weekly_active_users; /// public int monthly_active_users; /// public string category; /// public string subcategory; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class app_infoDevelopers { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("developer_info")] public developer_info[] developer_info; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class developer_info { /// public int uid; /// public string name; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("video_upload_response", Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class video { /// public long vid; /// public string title; /// public string description; /// public string link; /// public long owner; /// public string thumbnail_link; /// public string embed_html; /// public long created_time; /// public long updated_time; /// public int length; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] [System.Xml.Serialization.XmlRootAttribute("notifications_getList_response", Namespace="http://api.facebook.com/1.0/", IsNullable=false)] public class notification_data { /// public notification_dataNotifications notifications; /// public notification_dataApps apps; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class notification_dataNotifications { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("notification")] public notification[] notification; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class notification { /// public long notification_id; /// public long sender_id; /// public long recipient_id; /// public long created_time; /// public long updated_time; /// public string title_html; /// public string title_text; /// public string body_html; /// public string body_text; /// public string href; /// public long app_id; /// public int is_unread; /// public int is_hidden; /// public string object_id; /// public string object_type; } /// [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.facebook.com/1.0/")] public class notification_dataApps { /// [System.Xml.Serialization.XmlAttributeAttribute(Namespace="")] public bool list; /// [System.Xml.Serialization.XmlIgnore()] public bool listSpecified; /// [System.Xml.Serialization.XmlElementAttribute("app_info")] public app_info[] app_info; } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/Group.cs0000644000175000017500000000621111430555235030765 0ustar00rubenruben00000000000000// // Mono.Facebook.Group.cs: // // Authors: // Thomas Van Machelen (thomas.vanmachelen@gmail.com) // George Talusan (george@convolve.ca) // // (C) Copyright 2007 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Xml.Serialization; using Mono.Facebook.Schemas; namespace Mono.Facebook { public class Group : group, SessionWrapper { [XmlIgnore] public FacebookSession Session { get; set; } [XmlIgnore ()] public Uri Picture { get { return new Uri (pic); } } [XmlIgnore ()] public Uri PictureBig { get { return new Uri (pic_big); } } [XmlIgnore ()] public Uri PictureSmall { get { return new Uri (pic_small); } } [XmlIgnore ()] public Uri WebSite { get { if (website == string.Empty) return null; return new Uri (website); } } public GroupMemberList GetMembers () { GroupMembersResponse rsp = Session.Util.GetResponse("facebook.groups.getMembers", FacebookParam.Create ("gid", gid), FacebookParam.Create ("call_id", DateTime.Now.Ticks), FacebookParam.Create ("session_key", Session.SessionKey)); GroupMemberList members = new GroupMemberList (); members.Members = new Friend [rsp.Members.UIds.Length]; for (int i = 0; i < members.Members.Length; i++) members.Members [i] = new Friend (rsp.Members.UIds [i], this.Session); members.Admins = new Friend [rsp.Admins.UIds.Length]; for (int i = 0; i < members.Admins.Length; i++) members.Admins [i] = new Friend (rsp.Admins.UIds [i], this.Session); members.NotReplied = new Friend [rsp.NotReplied.UIds.Length]; for (int i = 0; i < members.NotReplied.Length; i++) members.NotReplied [i] = new Friend (rsp.NotReplied.UIds [i], this.Session); members.Officers = new Friend [rsp.Officers.UIds.Length]; for (int i = 0; i < members.Officers.Length; i++) members.Officers [i] = new Friend (rsp.Officers.UIds [i], this.Session); return members; } } public class GroupMemberList { public Friend[] Members; public Friend[] Admins; public Friend[] Officers; public Friend[] NotReplied; } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/Album.cs0000644000175000017500000000535211430555235030736 0ustar00rubenruben00000000000000// // Mono.Facebook.Album.cs: // // Authors: // Thomas Van Machelen (thomas.vanmachelen@gmail.com) // // (C) Copyright 2007 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.IO; using System.Xml.Serialization; using System.Text; using System.Net; using Mono.Facebook.Schemas; namespace Mono.Facebook { [System.Xml.Serialization.XmlRootAttribute("photos_createAlbum_response", Namespace="http://api.facebook.com/1.0/")] public class Album : album, SessionWrapper { [XmlIgnore] public FacebookSession Session { get; set; } public Photo[] GetPhotos () { PhotosResponse rsp = Session.Util.GetResponse ("facebook.photos.get", FacebookParam.Create ("aid", aid), FacebookParam.Create ("session_key", Session.SessionKey), FacebookParam.Create ("call_id", DateTime.Now.Ticks)); foreach (Photo p in rsp.Photos) p.Session = Session; return rsp.Photos; } public Tag[] GetTags () { StringBuilder pids = new StringBuilder (); foreach (Photo p in GetPhotos ()) { if (pids.Length > 0) pids.Append (","); pids.Append (p.PId); } PhotoTagsResponse rsp = Session.Util.GetResponse ("facebook.photos.getTags", FacebookParam.Create ("pids", pids), FacebookParam.Create ("session_key", Session.SessionKey), FacebookParam.Create ("call_id", System.DateTime.Now.Ticks)); foreach (Tag t in rsp.Tags) t.Session = Session; return rsp.Tags; } public Photo Upload (string caption, string path) { Photo uploaded = Session.Util.Upload (aid, caption, path, Session.SessionKey); uploaded.Session = this.Session; return uploaded; } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/Location.cs0000644000175000017500000000277311430555235031452 0ustar00rubenruben00000000000000// // Mono.Facebook.Location.cs: // // Authors: // Thomas Van Machelen (thomas.vanmachelen@gmail.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Xml.Serialization; namespace Mono.Facebook { public class Location { [XmlElement ("street")] public string Street; [XmlElement ("city")] public string City; [XmlElement ("state")] public string State; [XmlElement ("country")] public string Country; [XmlElement ("zip")] public string Zip; } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/Friend.cs0000644000175000017500000000475311430555235031111 0ustar00rubenruben00000000000000// // Mono.Facebook.Friend.cs: // // Authors: // George Talusan (george@convolve.ca) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.IO; using System.Xml.Serialization; using System.Text; namespace Mono.Facebook { public class Friend : SessionWrapper { public FacebookSession Session { get; set; } public long UId { get; set; } public Friend (long UId, FacebookSession session) { this.UId = UId; this.Session = session; } public User GetUserInfo () { User[] users = Session.GetUserInfo (new long[] { UId }, User.FIELDS); return users[0]; } public bool IsFriendsWith (Friend friend) { FriendInfo[] info = IsFriendsWith (new Friend[] { friend }); return info[0].AreFriends; } public Group[] Groups { get { return Session.GetGroups (UId, null); } } public Event[] Events { get { return Session.GetEvents (UId, null, 0, 0, null); } } public FriendInfo[] IsFriendsWith (Friend[] friends) { long[] me = new long[friends.Length]; for (int i = 0; i < me.Length; i++) me[i] = UId; long[] them = new long[friends.Length]; for (int i = 0; i < friends.Length; i++) { them[i] = friends[i].UId; } return Session.AreFriends (me, them); } } public class Me : Friend { public Me (long uid, FacebookSession session) : base (uid, session) { } public Notifications Notifications { get { return Session.GetNotifications (); } } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/Event.cs0000644000175000017500000000546111430555235030760 0ustar00rubenruben00000000000000// // Mono.Facebook.Event.cs: // // Authors: // George Talusan (george@convolve.ca) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.IO; using System.Xml.Serialization; using System.Text; using Mono.Facebook.Schemas; namespace Mono.Facebook { public class EventMemberList { public Friend[] Attending; public Friend[] Unsure; public Friend[] Declined; public Friend[] NotReplied; } public class Event : @event, SessionWrapper { [XmlIgnore] public FacebookSession Session { get; set; } [XmlIgnore ()] public Uri PicUri { get { return new Uri (pic); } } [XmlIgnore ()] public Uri PicBigUri { get { return new Uri (pic_big); } } [XmlIgnore ()] public Uri PicSmallUri { get { return new Uri (pic_small); } } [XmlIgnore ()] public EventMemberList MemberList { get { var rsp = Session.Util.GetResponse ("facebook.events.getMembers", FacebookParam.Create ("session_key", Session.SessionKey), FacebookParam.Create ("call_id", DateTime.Now.Ticks), FacebookParam.Create ("eid", eid)); EventMemberList list = new EventMemberList (); list.Attending = new Friend [rsp.attending.uid.Length]; for (int i = 0; i < list.Attending.Length; i++) list.Attending[i] = new Friend (rsp.attending.uid [i], this.Session); list.Unsure = new Friend [rsp.unsure.uid.Length]; for (int i = 0; i < list.Unsure.Length; i++) list.Unsure [i] = new Friend (rsp.unsure.uid [i], this.Session); list.Declined = new Friend [rsp.declined.uid.Length]; for (int i = 0; i < list.Declined.Length; i ++) list.Declined [i] = new Friend (rsp.declined.uid [i], this.Session); list.NotReplied = new Friend [rsp.not_replied.uid.Length]; return list; } } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/PeopleList.cs0000644000175000017500000000262211430555235031753 0ustar00rubenruben00000000000000// // Mono.Facebook.PeopleList.cs: // // Authors: // George Talusan (george@convolve.ca) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Xml.Serialization; using System.Collections; namespace Mono.Facebook { public class PeopleList { [XmlElement ("uid")] public long[] uid_array; public long[] UIds { get { return uid_array ?? new long[0]; } } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Mono.Facebook/FacebookException.cs0000644000175000017500000000347511430555235033272 0ustar00rubenruben00000000000000// // Mono.Facebook.FacebookException.cs: // // Authors: // Thomas Van Machelen (thomas.vanmachelen@gmail.com) // // (C) Copyright 2007 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; public class FacebookException : Exception { private int error_code; private string error_message; public int ErrorCode { get { return error_code; } } public string ErrorMessage { get { return error_message; } } public FacebookException (int error_code, string error_message) : base (CreateMessage (error_code, error_message)) { this.error_code = error_code; this.error_message = error_message; } private static string CreateMessage (int error_code, string error_message) { return string.Format ("Code: {0}, Message: {1}", error_code, error_message); } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/FindNullableClashes.cs0000644000175000017500000000221211503404762031107 0ustar00rubenruben00000000000000using System; using System.Reflection; using Hyena; public class FindNullableClashes { public static void Main (string [] args) { Assembly asm = Assembly.LoadFrom (args[0]); foreach (Type type in asm.GetTypes ()) { foreach (FieldInfo field in type.GetFields ()) { var attrs = field.GetCustomAttributes (false); foreach (Attribute attr in attrs) { if (attr is System.Xml.Serialization.XmlElementAttribute) { var xattr = attr as System.Xml.Serialization.XmlElementAttribute; var ftype = field.FieldType; bool is_nullable = ftype.IsGenericType && ftype.GetGenericTypeDefinition() == typeof(Nullable<>); if (xattr.IsNullable && ftype.IsValueType && field.DeclaringType == type && !is_nullable) { Log.DebugFormat ("Possible clash for {0}/{1}", type.FullName, field.Name); Log.DebugFormat (" Type: {0}", field.FieldType.FullName); } } } } } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Resources/0000777000175000017500000000000011503407454026700 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Resources/FacebookExport.ui0000644000175000017500000007542511430555235032163 0ustar00rubenruben00000000000000 930 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 Export to Facebook False True center-on-parent True dialog False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 5 True 2 4 True 0 True True Not logged in 1 4 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Login True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Logout True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 2 True True 1 2 Permissions: 0 Stay Connected True True False True False 1 Auto-confirm Photos True True False True False 2 1 4 1 2 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False 0 True 2 2 Use an existing album True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 True True 1 2 GTK_FILL GTK_FILL True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 2 1 2 True 2 4 4 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 Name True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 Location 2 3 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 3 4 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 Description 1 2 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 4 1 2 1 2 Create a new album True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 True existing_album_radiobutton GTK_FILL GTK_FILL 1 5 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 4 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False 0 True 2 4 3 6 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK automatic automatic etched-in 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 0 Caption 1 2 GTK_FILL True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 0 In this photo True word-char 1 2 1 2 GTK_FILL True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK automatic automatic etched-in True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK word 2 3 203 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK automatic automatic etched-in True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False 2 3 1 2 200 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 3 4 2 1 2 False 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end gtk-cancel True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 gtk-add True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 1 False end 0 cancel_button add_button 190 300 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK popup mouse True popup-menu True True False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 3 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Who is this? False 3 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False 1 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK automatic automatic True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False 0 True False 3 2 f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Resources/FacebookExport.addin.xml0000644000175000017500000000102011430555235033400 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/FSpot.Exporters.Facebook/0000777000175000017500000000000011503407454031463 5ustar00rubenruben00000000000000FacebookExport.cs0000644000175000017500000002500711503404762034645 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/FSpot.Exporters.Facebook/* * FacebookExport.cs * * Authors: * George Talusan * Stephane Delcroix * Jim Ramsay * * Copyright (C) 2007 George Talusan * Copyright (c) 2008-2009 Novell, Inc. * Copyright (c) 2009 Jim Rasay * * This is free software. See COPYING for details. */ using System; using System.Net; using System.IO; using System.Text; using System.Threading; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Web; using Mono.Unix; using Gtk; using Gnome.Keyring; using GtkBeans; using FSpot; using FSpot.Core; using Hyena; using Hyena.Widgets; using FSpot.UI.Dialog; using FSpot.Extensions; using FSpot.Filters; using FSpot.Platform; using Mono.Facebook; namespace FSpot.Exporters.Facebook { internal class FacebookAccount { static string keyring_item_name = "Facebook Account"; static string api_key = "c23d1683e87313fa046954ea253a240e"; /* INSECURE! According to: * * http://wiki.developers.facebook.com/index.php/Desktop_App_Auth_Process * * We should *NOT* put our secret code here, but do an external * authorization using our own PHP page somewhere. */ static string secret = "743e9a2e6a1c35ce961321bceea7b514"; FacebookSession facebookSession; bool connected = false; public FacebookAccount () { SessionInfo info = ReadSessionInfo (); if (info != null) { facebookSession = new FacebookSession (api_key, info); try { /* This basically functions like a ping to ensure the * session is still valid: */ facebookSession.HasAppPermission("offline_access"); connected = true; } catch (FacebookException) { connected = false; } } } public Uri GetLoginUri () { FacebookSession session = new FacebookSession (api_key, secret); Uri uri = session.CreateToken(); facebookSession = session; connected = false; return uri; } public bool RevokePermission (string permission) { return facebookSession.RevokeAppPermission(permission); } public bool GrantPermission (string permission, Window parent) { if (facebookSession.HasAppPermission(permission)) return true; Uri uri = facebookSession.GetGrantUri (permission); GtkBeans.Global.ShowUri (parent.Screen, uri.ToString ()); HigMessageDialog mbox = new HigMessageDialog (parent, Gtk.DialogFlags.DestroyWithParent | Gtk.DialogFlags.Modal, Gtk.MessageType.Info, Gtk.ButtonsType.Ok, Catalog.GetString ("Waiting for authorization"), Catalog.GetString ("F-Spot will now launch your browser so that you can enable the permission you just selected.\n\nOnce you are directed by Facebook to return to this application, click \"Ok\" below." )); mbox.Run (); mbox.Destroy (); return facebookSession.HasAppPermission(permission); } public bool HasPermission(string permission) { return facebookSession.HasAppPermission(permission); } public FacebookSession Facebook { get { return facebookSession; } } public bool Authenticated { get { return connected; } } bool SaveSessionInfo (SessionInfo info) { string keyring; try { keyring = Ring.GetDefaultKeyring(); } catch (KeyringException e) { Log.DebugException (e); return false; } Hashtable attribs = new Hashtable(); attribs["name"] = keyring_item_name; attribs["uid"] = info.uid.ToString (); attribs["session_key"] = info.session_key; try { Ring.CreateItem (keyring, ItemType.GenericSecret, keyring_item_name, attribs, info.secret, true); } catch (KeyringException e) { Log.DebugException (e); return false; } return true; } SessionInfo ReadSessionInfo () { SessionInfo info = null; Hashtable request_attributes = new Hashtable (); request_attributes["name"] = keyring_item_name; try { foreach (ItemData result in Ring.Find (ItemType.GenericSecret, request_attributes)) { if (!result.Attributes.ContainsKey ("name") || !result.Attributes.ContainsKey ("uid") || !result.Attributes.ContainsKey ("session_key") || (result.Attributes["name"] as string) != keyring_item_name) continue; string session_key = (string)result.Attributes["session_key"]; long uid = Int64.Parse((string)result.Attributes["uid"]); string secret = result.Secret; info = new SessionInfo (session_key, uid, secret); break; } } catch (KeyringException e) { Log.DebugException (e); } return info; } bool ForgetSessionInfo() { string keyring; bool success = false; try { keyring = Ring.GetDefaultKeyring(); } catch (KeyringException e) { Log.DebugException (e); return false; } Hashtable request_attributes = new Hashtable (); request_attributes["name"] = keyring_item_name; try { foreach (ItemData result in Ring.Find (ItemType.GenericSecret, request_attributes)) { Ring.DeleteItem(keyring, result.ItemID); success = true; } } catch (KeyringException e) { Log.DebugException (e); } return success; } public bool Authenticate () { if (connected) return true; try { SessionInfo info = facebookSession.GetSession(); connected = true; if (SaveSessionInfo (info)) Log.Information ("Saved session information to keyring"); else Log.Warning ("Could not save session information to keyring"); } catch (KeyringException e) { connected = false; Log.DebugException (e); } catch (FacebookException fe) { connected = false; Log.DebugException (fe); } return connected; } public void Deauthenticate () { connected = false; ForgetSessionInfo (); } } internal class TagStore : ListStore { private List _tags; private Dictionary _friends; public TagStore (FacebookSession session, List tags, Dictionary friends) : base (typeof (string)) { _tags = tags; _friends = friends; foreach (Mono.Facebook.Tag tag in Tags) { long subject = tag.Subject; User info = _friends [subject]; if (info == null ) { try { info = session.GetUserInfo (new long[] { subject }, new string[] { "first_name", "last_name" }) [0]; } catch (FacebookException) { continue; } } AppendValues (String.Format ("{0} {1}", info.first_name ?? "", info.last_name ?? "")); } } public List Tags { get { return _tags ?? new List (); } } } public class FacebookExport : IExporter { private int size = 720; private int max_photos_per_album = 200; FacebookExportDialog dialog; ThreadProgressDialog progress_dialog; System.Threading.Thread command_thread; Album album = null; public FacebookExport () { } public void Run (IBrowsableCollection selection) { dialog = new FacebookExportDialog (selection); if (selection.Items.Length > max_photos_per_album) { HigMessageDialog mbox = new HigMessageDialog (dialog, Gtk.DialogFlags.DestroyWithParent | Gtk.DialogFlags.Modal, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, Catalog.GetString ("Too many images to export"), String.Format (Catalog.GetString ("Facebook only permits {0} photographs per album. Please refine your selection and try again."), max_photos_per_album)); mbox.Run (); mbox.Destroy (); return; } if (dialog.Run () != (int)ResponseType.Ok) { dialog.Destroy (); return; } if (dialog.CreateAlbum) { string name = dialog.AlbumName; if (String.IsNullOrEmpty (name)) { HigMessageDialog mbox = new HigMessageDialog (dialog, Gtk.DialogFlags.DestroyWithParent | Gtk.DialogFlags.Modal, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, Catalog.GetString ("Album must have a name"), Catalog.GetString ("Please name your album or choose an existing album.")); mbox.Run (); mbox.Destroy (); return; } string description = dialog.AlbumDescription; string location = dialog.AlbumLocation; try { album = dialog.Account.Facebook.CreateAlbum (name, description, location); } catch (FacebookException fe) { HigMessageDialog mbox = new HigMessageDialog (dialog, Gtk.DialogFlags.DestroyWithParent | Gtk.DialogFlags.Modal, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, Catalog.GetString ("Creating a new album failed"), String.Format (Catalog.GetString ("An error occurred creating a new album.\n\n{0}"), fe.Message)); mbox.Run (); mbox.Destroy (); return; } } else { album = dialog.ActiveAlbum; } if (dialog.Account != null) { dialog.Hide (); command_thread = new System.Threading.Thread (new System.Threading.ThreadStart (Upload)); command_thread.Name = Mono.Unix.Catalog.GetString ("Uploading Pictures"); progress_dialog = new ThreadProgressDialog (command_thread, selection.Items.Length); progress_dialog.Start (); } dialog.Destroy (); } void Upload () { IPhoto [] items = dialog.Items; string [] captions = dialog.Captions; dialog.StoreCaption (); long sent_bytes = 0; FilterSet filters = new FilterSet (); filters.Add (new JpegFilter ()); filters.Add (new ResizeFilter ((uint) size)); for (int i = 0; i < items.Length; i++) { try { IPhoto item = items [i]; FileInfo file_info; Log.DebugFormat ("uploading {0}", i); progress_dialog.Message = String.Format (Catalog.GetString ("Uploading picture \"{0}\" ({1} of {2})"), item.Name, i + 1, items.Length); progress_dialog.ProgressText = string.Empty; progress_dialog.Fraction = i / (double) items.Length; FilterRequest request = new FilterRequest (item.DefaultVersion.Uri); filters.Convert (request); file_info = new FileInfo (request.Current.LocalPath); album.Upload (captions [i] ?? "", request.Current.LocalPath); sent_bytes += file_info.Length; } catch (Exception e) { progress_dialog.Message = String.Format (Catalog.GetString ("Error Uploading To Facebook: {0}"), e.Message); progress_dialog.ProgressText = Catalog.GetString ("Error"); Log.DebugException (e); if (progress_dialog.PerformRetrySkip ()) i--; } } progress_dialog.Message = Catalog.GetString ("Done Sending Photos"); progress_dialog.Fraction = 1.0; progress_dialog.ProgressText = Catalog.GetString ("Upload Complete"); progress_dialog.ButtonLabel = Gtk.Stock.Ok; var li = new LinkButton ("http://www.facebook.com/group.php?gid=158960179844&ref=mf", Catalog.GetString ("Visit F-Spot group on Facebook")); progress_dialog.VBoxPackEnd (li); li.ShowAll (); } } } FacebookExportDialog.cs0000644000175000017500000003313711503404762035770 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/FSpot.Exporters.Facebook/* * FacebookExportDialog.cs * * Authors: * George Talusan * Stephane Delcroix * Jim Ramsay * * Copyright (C) 2007 George Talusan * Copyright (c) 2008-2009 Novell, Inc. * Later changes (2009) by Jim Ramsay * * This is free software. See COPYING for details. */ using System; using System.Reflection; using System.Collections; using System.Collections.Generic; using System.Threading; using Gtk; using GtkBeans; using Hyena; using Hyena.Widgets; using FSpot.Core; using FSpot.Utils; using FSpot.Widgets; using FSpot.Platform; using FSpot.UI.Dialog; using Mono.Facebook; using Mono.Unix; namespace FSpot.Exporters.Facebook { internal class FacebookExportDialog : BuilderDialog { [GtkBeans.Builder.Object] VBox album_info_vbox; [GtkBeans.Builder.Object] VBox picture_info_vbox; [GtkBeans.Builder.Object] HBox log_buttons_hbox; [GtkBeans.Builder.Object] HButtonBox dialog_action_area; [GtkBeans.Builder.Object] Button login_button; [GtkBeans.Builder.Object] Button logout_button; [GtkBeans.Builder.Object] ProgressBar login_progress; [GtkBeans.Builder.Object] RadioButton existing_album_radiobutton; [GtkBeans.Builder.Object] RadioButton create_album_radiobutton; [GtkBeans.Builder.Object] ComboBox existing_album_combobox; [GtkBeans.Builder.Object] Table new_album_info_table; [GtkBeans.Builder.Object] Entry album_name_entry; [GtkBeans.Builder.Object] Entry album_location_entry; [GtkBeans.Builder.Object] Entry album_description_entry; [GtkBeans.Builder.Object] Gtk.ScrolledWindow thumbnails_scrolled_window; [GtkBeans.Builder.Object] TextView caption_textview; [GtkBeans.Builder.Object] TreeView tag_treeview; [GtkBeans.Builder.Object] EventBox tag_image_eventbox; [GtkBeans.Builder.Object] HBox permissions_hbox; [GtkBeans.Builder.Object] CheckButton offline_perm_check; [GtkBeans.Builder.Object] CheckButton photo_perm_check; Gtk.Image tag_image; int tag_image_height; int tag_image_width; SelectionCollectionGridView tray_view; Dictionary friends; private class DateComparer : IComparer { public int Compare (object left, object right) { return DateTime.Compare ((left as IPhoto).Time, (right as IPhoto).Time); } } public FacebookExportDialog (IBrowsableCollection selection) : base (Assembly.GetExecutingAssembly (), "FacebookExport.ui", "facebook_export_dialog") { // Sort selection by date ascending items = selection.Items; Array.Sort (items, new DateComparer ()); current_item = -1; captions = new string [selection.Items.Length]; tags = new List [selection.Items.Length]; tray_view = new SelectionCollectionGridView (selection) { MaxColumns = 1, DisplayDates = false, DisplayTags = false, DisplayRatings = false }; tray_view.ButtonPressEvent += HandleThumbnailIconViewButtonPressEvent; tray_view.KeyPressEvent += delegate (object sender, KeyPressEventArgs e) {(sender as SelectionCollectionGridView).Selection.Clear(); }; thumbnails_scrolled_window.Add (tray_view); tray_view.Show (); login_button.Clicked += HandleLoginClicked; logout_button.Clicked += HandleLogoutClicked; offline_perm_check.Toggled += HandlePermissionToggled; photo_perm_check.Toggled += HandlePermissionToggled; create_album_radiobutton.Toggled += HandleCreateAlbumToggled; create_album_radiobutton.Active = true; existing_album_radiobutton.Toggled += HandleExistingAlbumToggled; CellRendererText cell = new CellRendererText (); existing_album_combobox.PackStart (cell, true); existing_album_combobox.SetAttributes (cell, "text", 0); tag_image_eventbox.ButtonPressEvent += HandleTagImageButtonPressEvent; tag_treeview.Sensitive = false; caption_textview.Sensitive = false; DoLogout (); account = new FacebookAccount(); if (account.Authenticated) DoLogin (); } FacebookAccount account; public FacebookAccount Account { get { return account; } } string[] captions; public string [] Captions { get {return captions; } } List[] tags; int current_item; IPhoto[] items; public IPhoto[] Items { get {return items; } } public bool CreateAlbum { get { return create_album_radiobutton.Active; } } public string AlbumName { get { return album_name_entry.Text; } } public string AlbumLocation { get { return album_location_entry.Text; } } public string AlbumDescription { get { return album_description_entry.Text; } } public Album ActiveAlbum { get { return ((AlbumStore) existing_album_combobox.Model).Albums [existing_album_combobox.Active]; } } public void StoreCaption () { // Check for empty text box if (current_item == -1) return; // Store the caption captions [current_item] = caption_textview.Buffer.Text; } void HandleThumbnailIconViewButtonPressEvent (object sender, Gtk.ButtonPressEventArgs args) { // Store caption before switching StoreCaption (); int old_item = current_item; current_item = tray_view.CellAtPosition ((int) args.Event.X, (int) args.Event.Y); if (current_item < 0 || current_item >= items.Length) { current_item = old_item; return; } string caption = captions [current_item]; if (caption == null) captions [current_item] = caption = ""; caption_textview.Buffer.Text = caption; caption_textview.Sensitive = true; tag_treeview.Model = new TagStore (account.Facebook, tags [current_item], friends); IPhoto item = items [current_item]; if (tag_image_eventbox.Children.Length > 0) { tag_image_eventbox.Remove (tag_image); tag_image.Destroy (); } using (Gdk.Pixbuf data = XdgThumbnailSpec.LoadThumbnail (item.DefaultVersion.Uri, ThumbnailSize.Large)) { tag_image_height = data.Height; tag_image_width = data.Width; tag_image = new Gtk.Image (data); tag_image_eventbox.Add (tag_image); tag_image_eventbox.ShowAll (); } } public void HandleLoginClicked (object sender, EventArgs args) { if (!account.Authenticated) { Uri uri = account.GetLoginUri (); GtkBeans.Global.ShowUri (Screen, uri.ToString ()); HigMessageDialog mbox = new HigMessageDialog (this, Gtk.DialogFlags.DestroyWithParent | Gtk.DialogFlags.Modal, Gtk.MessageType.Info, Gtk.ButtonsType.Ok, Catalog.GetString ("Waiting for authentication"), Catalog.GetString ("F-Spot will now launch your browser so that you can log into Facebook.\n\nOnce you are directed by Facebook to return to this application, click \"Ok\" below. F-Spot will cache your session in gnome-keyring, if possible, and re-use it on future Facebook exports." )); mbox.Run (); mbox.Destroy (); LoginProgress (0.0, Catalog.GetString ("Authenticating...")); account.Authenticate (); } DoLogin (); } void DoLogin () { if (!account.Authenticated) { HigMessageDialog error = new HigMessageDialog (this, Gtk.DialogFlags.DestroyWithParent | Gtk.DialogFlags.Modal, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, Catalog.GetString ("Error logging into Facebook"), Catalog.GetString ("There was a problem logging into Facebook. Check your credentials and try again.")); error.Run (); error.Destroy (); DoLogout (); } else { log_buttons_hbox.Sensitive = false; dialog_action_area.Sensitive = false; LoginProgress (0.0, Catalog.GetString ("Authorizing Session")); ThreadPool.QueueUserWorkItem (delegate { try { bool perm_offline = account.HasPermission("offline_access"); bool perm_upload = photo_perm_check.Active = account.HasPermission("photo_upload"); ThreadAssist.ProxyToMain (() => { offline_perm_check.Active = perm_offline; photo_perm_check.Active = perm_upload; LoginProgress (0.2, Catalog.GetString ("Session established, fetching user info...")); }); User me = account.Facebook.GetLoggedInUser ().GetUserInfo (); ThreadAssist.ProxyToMain (() => { LoginProgress (0.4, Catalog.GetString ("Session established, fetching friend list...")); }); Friend[] friend_list = account.Facebook.GetFriends (); long[] uids = new long [friend_list.Length]; for (int i = 0; i < friend_list.Length; i++) uids [i] = friend_list [i].UId; ThreadAssist.ProxyToMain (() => { LoginProgress (0.6, Catalog.GetString ("Session established, fetching friend details...")); }); if (uids.Length > 0) { User[] infos = account.Facebook.GetUserInfo (uids, new string[] { "first_name", "last_name" }); friends = new Dictionary (); foreach (User user in infos) friends.Add (user.uid, user); } ThreadAssist.ProxyToMain (() => { LoginProgress (0.8, Catalog.GetString ("Session established, fetching photo albums...")); }); Album[] albums = account.Facebook.GetAlbums (); ThreadAssist.ProxyToMain (() => { album_info_vbox.Sensitive = true; picture_info_vbox.Sensitive = true; permissions_hbox.Sensitive = true; login_button.Visible = false; logout_button.Visible = true; // Note for translators: {0} and {1} are respectively firstname and surname of the user LoginProgress (1.0, String.Format (Catalog.GetString ("{0} {1} is logged into Facebook"), me.first_name, me.last_name)); existing_album_combobox.Model = new AlbumStore (albums); existing_album_combobox.Active = 0; }); } catch (Exception e) { Log.DebugException (e); ThreadAssist.ProxyToMain (() => { HigMessageDialog error = new HigMessageDialog (this, Gtk.DialogFlags.DestroyWithParent | Gtk.DialogFlags.Modal, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, Catalog.GetString ("Facebook Connection Error"), String.Format (Catalog.GetString ("There was an error when downloading your information from Facebook.\n\nFacebook said: {0}"), e.Message)); error.Run (); error.Destroy (); }); account.Deauthenticate (); DoLogout (); } finally { ThreadAssist.ProxyToMain (() => { log_buttons_hbox.Sensitive = true; dialog_action_area.Sensitive = true; }); } }); } } void HandleLogoutClicked (object sender, EventArgs args) { account.Deauthenticate (); DoLogout (); } void DoLogout () { login_button.Visible = true; logout_button.Visible = false; login_progress.Fraction = 0; login_progress.Text = Catalog.GetString ("You are not logged in."); album_info_vbox.Sensitive = false; picture_info_vbox.Sensitive = false; offline_perm_check.Toggled -= HandlePermissionToggled; photo_perm_check.Toggled -= HandlePermissionToggled; offline_perm_check.Active = false; photo_perm_check.Active = false; offline_perm_check.Toggled += HandlePermissionToggled; photo_perm_check.Toggled += HandlePermissionToggled; permissions_hbox.Sensitive = false; } public void HandlePermissionToggled (object sender, EventArgs args) { string permission; if (sender == offline_perm_check) { permission = "offline_access"; } else if (sender == photo_perm_check) { permission = "photo_upload"; } else { throw new Exception ("Unknown Source object"); } CheckButton origin = (CheckButton)sender; bool desired = origin.Active; bool actual = account.HasPermission (permission); if (desired != actual) { if (desired) { Log.DebugFormat ("Granting {0}", permission); account.GrantPermission (permission, this); } else { Log.DebugFormat ("Revoking {0}", permission); account.RevokePermission (permission); } /* Double-check that things work... */ actual = account.HasPermission (permission); if (actual != desired) { Log.Warning("Failed to alter permissions"); } origin.Active = account.HasPermission (permission); } } void HandleCreateAlbumToggled (object sender, EventArgs args) { if (create_album_radiobutton.Active == false) return; new_album_info_table.Sensitive = true; existing_album_combobox.Sensitive = false; } void HandleExistingAlbumToggled (object sender, EventArgs args) { if (existing_album_radiobutton.Active == false) return; new_album_info_table.Sensitive = false; existing_album_combobox.Sensitive = true; } void HandleTagImageButtonPressEvent (object sender, Gtk.ButtonPressEventArgs args) { double x = args.Event.X; double y = args.Event.Y; // translate the centered image to top left corner double tag_image_center_x = tag_image_width / 2; double tag_image_center_y = tag_image_height / 2; double allocation_center_x = tag_image_eventbox.Allocation.Width / 2; double allocation_center_y = tag_image_eventbox.Allocation.Height / 2; double dx = allocation_center_x - tag_image_center_x; double dy = allocation_center_y - tag_image_center_y; if (dx < 0) dx = 0; if (dy < 0) dy = 0; x -= dx; y -= dy; // bail if we're in the eventbox but not the image if (x < 0 || x > tag_image_width) return; if (y < 0 || y > tag_image_height) return; //FacebookTagPopup popup = new FacebookTagPopup (friends); } void LoginProgress (double percentage, string message) { login_progress.Fraction = percentage; login_progress.Text = message; Log.Debug (message); } } internal class AlbumStore : ListStore { private Album[] _albums; public AlbumStore (Album[] albums) : base (typeof (string)) { _albums = albums; foreach (Album album in Albums) { AppendValues (album.name); } } public Album[] Albums { get { return _albums; } } } } FacebookTagPopup.cs0000644000175000017500000000141511503404762035120 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/FSpot.Exporters.Facebook/* * FacebookTagPopup.cs * * Authors: * George Talusan * Stephane Delcroix * * Copyright (C) 2007 George Talusan * Copyright (c) 2008-2009 Novell, Inc. * * This is free software. See COPYING for details. */ using System.Reflection; using System.Collections.Generic; using FSpot.Widgets; using Mono.Facebook; namespace FSpot.Exporters.Facebook { internal class FacebookTagPopup : BuilderWindow { Dictionary _friends; public FacebookTagPopup (Dictionary friends) : base (Assembly.GetExecutingAssembly (), "FacebookExport.ui", "facebook_tag_popup") { Friends = friends; } public Dictionary Friends { get { return _friends; } set { _friends = value; } } } } f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Makefile.in0000644000175000017500000007034611503407264027000 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Exporters/FSpot.Exporters.Facebook ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Exporters.Facebook TARGET = library LINK = $(REF_FSPOT_EXTENSION_FACEBOOKEXPORT) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FindNullableClashes.cs \ FSpot.Exporters.Facebook/FacebookExport.cs \ FSpot.Exporters.Facebook/FacebookExportDialog.cs \ FSpot.Exporters.Facebook/FacebookTagPopup.cs \ Mono.Facebook/Album.cs \ Mono.Facebook/Error.cs \ Mono.Facebook/Event.cs \ Mono.Facebook/facebook.cs \ Mono.Facebook/FacebookException.cs \ Mono.Facebook/FacebookParam.cs \ Mono.Facebook/FacebookSession.cs \ Mono.Facebook/Friend.cs \ Mono.Facebook/FriendInfo.cs \ Mono.Facebook/Group.cs \ Mono.Facebook/Location.cs \ Mono.Facebook/Notification.cs \ Mono.Facebook/PeopleList.cs \ Mono.Facebook/Photo.cs \ Mono.Facebook/Responses.cs \ Mono.Facebook/SessionInfo.cs \ Mono.Facebook/SessionWrapper.cs \ Mono.Facebook/Tag.cs \ Mono.Facebook/User.cs \ Mono.Facebook/Util.cs RESOURCES = \ Resources/FacebookExport.addin.xml \ Resources/FacebookExport.ui ASSEMBLY_INFO_SOURCE = Mono.Facebook/AssemblyInfo.cs # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.Facebook/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.Facebook/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Facebook/Makefile.am0000644000175000017500000000207511430555235026762 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Exporters.Facebook TARGET = library LINK = $(REF_FSPOT_EXTENSION_FACEBOOKEXPORT) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FindNullableClashes.cs \ FSpot.Exporters.Facebook/FacebookExport.cs \ FSpot.Exporters.Facebook/FacebookExportDialog.cs \ FSpot.Exporters.Facebook/FacebookTagPopup.cs \ Mono.Facebook/Album.cs \ Mono.Facebook/Error.cs \ Mono.Facebook/Event.cs \ Mono.Facebook/facebook.cs \ Mono.Facebook/FacebookException.cs \ Mono.Facebook/FacebookParam.cs \ Mono.Facebook/FacebookSession.cs \ Mono.Facebook/Friend.cs \ Mono.Facebook/FriendInfo.cs \ Mono.Facebook/Group.cs \ Mono.Facebook/Location.cs \ Mono.Facebook/Notification.cs \ Mono.Facebook/PeopleList.cs \ Mono.Facebook/Photo.cs \ Mono.Facebook/Responses.cs \ Mono.Facebook/SessionInfo.cs \ Mono.Facebook/SessionWrapper.cs \ Mono.Facebook/Tag.cs \ Mono.Facebook/User.cs \ Mono.Facebook/Util.cs RESOURCES = \ Resources/FacebookExport.addin.xml \ Resources/FacebookExport.ui ASSEMBLY_INFO_SOURCE = Mono.Facebook/AssemblyInfo.cs include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Exporters/Makefile.in0000644000175000017500000005237011503407272022237 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/Extensions/Exporters DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = \ FSpot.Exporters.CD \ FSpot.Exporters.Facebook \ FSpot.Exporters.Flickr \ FSpot.Exporters.Folder \ FSpot.Exporters.Gallery \ FSpot.Exporters.PicasaWeb \ FSpot.Exporters.SmugMug \ FSpot.Exporters.Tabblo \ FSpot.Exporters.Zip all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Exporters/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Exporters/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Exporters/Makefile.am0000644000175000017500000000041011430555235022214 0ustar00rubenruben00000000000000SUBDIRS = \ FSpot.Exporters.CD \ FSpot.Exporters.Facebook \ FSpot.Exporters.Flickr \ FSpot.Exporters.Folder \ FSpot.Exporters.Gallery \ FSpot.Exporters.PicasaWeb \ FSpot.Exporters.SmugMug \ FSpot.Exporters.Tabblo \ FSpot.Exporters.Zip f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Zip/0000777000175000017500000000000011503407462023756 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Zip/Resources/0000777000175000017500000000000011503407462025730 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Zip/Resources/zip_export.ui0000644000175000017500000002351011441732537030474 0ustar00rubenruben00000000000000 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 center-on-parent dialog False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 4 2 7 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 _Location: True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 _File name: True 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 2 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 2 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK adjustment1 False 0 1 2 2 3 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Scale: True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True 0 True False False 1 2 3 False 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end gtk-cancel True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 _Create True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 1 False end 0 button1 create_button 1024 1 10000 1 10 10 f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Zip/Resources/ZipExport.addin.xml0000644000175000017500000000073511430555235031476 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Zip/Makefile.in0000644000175000017500000006666611503407272026042 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Exporters/FSpot.Exporters.Zip ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Exporters.Zip TARGET = library LINK = $(REF_FSPOT_EXTENSION_ZIPEXPORT) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Exporters.Zip/ZipExport.cs RESOURCES = \ Resources/zip_export.ui \ Resources/ZipExport.addin.xml # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.Zip/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Exporters/FSpot.Exporters.Zip/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Zip/Makefile.am0000644000175000017500000000043411441732537026014 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Exporters.Zip TARGET = library LINK = $(REF_FSPOT_EXTENSION_ZIPEXPORT) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Exporters.Zip/ZipExport.cs RESOURCES = \ Resources/zip_export.ui \ Resources/ZipExport.addin.xml include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Zip/FSpot.Exporters.Zip/0000777000175000017500000000000011503407462027544 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Exporters/FSpot.Exporters.Zip/FSpot.Exporters.Zip/ZipExport.cs0000644000175000017500000001156111503404762032037 0ustar00rubenruben00000000000000/* * ZipExport.cs * Simple zip exporter. Creates a zip file with unmodified pictures. * * Author(s) * Lorenzo Milesi * * Many thanks to Stephane for his help and patience. :) * * This is free software. See COPYING for details * (c) YetOpen S.r.l. */ using FSpot; using FSpot.UI.Dialog; using FSpot.Core; using FSpot.Extensions; using FSpot.Filters; using Hyena; using Hyena.Widgets; using System; using System.IO; using System.Collections; using Mono.Unix; using Gtk; using ICSharpCode.SharpZipLib.Checksums; using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.GZip; namespace FSpot.Exporters.Zip { public class Zip : IExporter { [GtkBeans.Builder.Object] Gtk.Dialog zipdiag; [GtkBeans.Builder.Object] Gtk.HBox dirchooser_hbox; [GtkBeans.Builder.Object] Gtk.CheckButton scale_check; [GtkBeans.Builder.Object] Gtk.Entry filename; [GtkBeans.Builder.Object] Gtk.SpinButton scale_size; [GtkBeans.Builder.Object] Gtk.Button create_button; IPhoto [] photos; Gtk.FileChooserButton uri_chooser; public void Run (IBrowsableCollection p) { Log.Information ("Executing ZipExport extension"); if (p.Count == 0) { HigMessageDialog md = new HigMessageDialog (App.Instance.Organizer.Window, DialogFlags.DestroyWithParent, Gtk.MessageType.Error, ButtonsType.Ok, Catalog.GetString ("No selection available"), Catalog.GetString ("This tool requires an active selection. Please select one or more pictures and try again")); md.Run (); md.Destroy (); return; } photos = p.Items; ShowDialog (); } public void ShowDialog () { var builder = new GtkBeans.Builder (null, "zip_export.ui", null); builder.Autoconnect (this); zipdiag.Modal = false; zipdiag.TransientFor = null; uri_chooser = new Gtk.FileChooserButton (Catalog.GetString ("Select export folder"), Gtk.FileChooserAction.SelectFolder); uri_chooser.LocalOnly = true; uri_chooser.SetFilename (System.IO.Path.Combine (FSpot.Core.Global.HomeDirectory, "Desktop")); dirchooser_hbox.PackStart (uri_chooser, false, false, 2); filename.Text = "f-spot_export.zip"; zipdiag.Response += on_dialog_response; filename.Changed += on_filename_change; scale_check.Toggled += on_scalecheck_change; on_scalecheck_change (null, null); zipdiag.ShowAll (); } private void on_dialog_response (object sender, ResponseArgs args) { if (args.ResponseId != Gtk.ResponseType.Ok) { // FIXME this is to work around a bug in gtk+ where // the filesystem events are still listened to when // a FileChooserButton is destroyed but not finalized // and an event comes in that wants to update the child widgets. uri_chooser.Dispose (); uri_chooser = null; } else if (args.ResponseId == Gtk.ResponseType.Ok) { zip (); } zipdiag.Destroy (); } void zip () { System.Uri dest = new System.Uri (uri_chooser.Uri); Crc32 crc = new Crc32 (); string filedest = dest.LocalPath + "/" + filename.Text; Log.DebugFormat ("Creating zip file {0}", filedest); ZipOutputStream s = new ZipOutputStream (File.Create(filedest)); if (scale_check.Active) Log.DebugFormat ("Scaling to {0}", scale_size.ValueAsInt); ProgressDialog progress_dialog = new ProgressDialog (Catalog.GetString ("Exporting files"), ProgressDialog.CancelButtonType.Stop, photos.Length, zipdiag); //Pack up for (int i = 0; i < photos.Length; i ++) { if (progress_dialog.Update (String.Format (Catalog.GetString ("Preparing photo \"{0}\""), photos[i].Name))) { progress_dialog.Destroy (); return; } string f = null; // FIXME: embed in a try/catch if (scale_check.Active) { FilterSet filters = new FilterSet (); filters.Add (new JpegFilter ()); filters.Add (new ResizeFilter ((uint) scale_size.ValueAsInt)); FilterRequest freq = new FilterRequest (photos [i].DefaultVersion.Uri); filters.Convert (freq); f = freq.Current.LocalPath; } else { f = photos [i].DefaultVersion.Uri.LocalPath; } FileStream fs = File.OpenRead (f); byte [] buffer = new byte [fs.Length]; fs.Read (buffer, 0, buffer.Length); ZipEntry entry = new ZipEntry (System.IO.Path.GetFileName (photos [i].DefaultVersion.Uri.LocalPath)); entry.DateTime = DateTime.Now; entry.Size = fs.Length; fs.Close (); crc.Reset (); crc.Update (buffer); entry.Crc = crc.Value; s.PutNextEntry (entry); s.Write (buffer, 0, buffer.Length); } s.Finish (); s.Close (); if (progress_dialog != null) progress_dialog.Destroy (); } private void on_filename_change (object sender, System.EventArgs args) { create_button.Sensitive = System.Text.RegularExpressions.Regex.IsMatch (filename.Text, "[.]zip$"); } private void on_scalecheck_change (object sender, System.EventArgs args) { scale_size.Sensitive = scale_check.Active; } } } f-spot-0.8.2/src/Extensions/Transitions/0000777000175000017500000000000011503407466020516 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Transitions/Makefile.in0000644000175000017500000005203611503407304022554 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/Extensions/Transitions DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = \ FSpot.Transitions.Cover all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Transitions/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Transitions/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Transitions/FSpot.Transitions.Cover/0000777000175000017500000000000011503407466025142 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Transitions/FSpot.Transitions.Cover/FSpot.Addins.Transitions/0000777000175000017500000000000011503407466031712 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Transitions/FSpot.Transitions.Cover/FSpot.Addins.Transitions/Cover.cs0000644000175000017500000000263611503404762033316 0ustar00rubenruben00000000000000// // FSpot.Widgets.CoverTransition.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This is open source software. See COPYING for details. // using System; using Cairo; using Gdk; using FSpot.Utils; using FSpot.Transitions; using Color = Cairo.Color; namespace FSpot.Addins.Transitions { public class Cover : CairoTransition { public Cover () : base ("Cover") { } protected override void Draw (Context cr, Pixbuf prev, Pixbuf next, int width, int height, double progress) { cr.Color = new Color (0, 0, 0); if (next != null) { double scale = Math.Min ((double)width/(double)next.Width, (double)height/(double)next.Height); cr.Save (); cr.Translate (width * (1.0 - progress), 0); cr.Rectangle (0, 0, width, .5 * (height - scale*next.Height)); cr.Fill (); cr.Rectangle (0, height - .5 * (height - scale*next.Height), width, .5 * (height - scale*next.Height)); cr.Fill (); cr.Rectangle (0, 0, .5 * (width - scale*next.Width), height); cr.Fill (); cr.Rectangle (width - .5 * (width - scale*next.Width), 0, .5 * (width - scale*next.Width), height); cr.Fill (); cr.Rectangle (0, 0, width, height); cr.Scale (scale, scale); CairoHelper.SetSourcePixbuf (cr, next, .5 * ((double)width/scale - next.Width), .5 * ((double)height/scale - next.Height)); cr.Paint (); cr.Restore (); } } } } f-spot-0.8.2/src/Extensions/Transitions/FSpot.Transitions.Cover/Resources/0000777000175000017500000000000011503407466027114 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Transitions/FSpot.Transitions.Cover/Resources/CoverTransition.addin.xml0000644000175000017500000000070111430555235034034 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Transitions/FSpot.Transitions.Cover/Makefile.in0000644000175000017500000006670211503407303027204 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Transitions/FSpot.Transitions.Cover ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Exporters.CoverTransition TARGET = library LINK = $(REF_FSPOT_EXTENSION_COVERTRANSITION) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Addins.Transitions/Cover.cs RESOURCES = Resources/CoverTransition.addin.xml # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Transitions/FSpot.Transitions.Cover/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Transitions/FSpot.Transitions.Cover/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Transitions/FSpot.Transitions.Cover/Makefile.am0000644000175000017500000000042611430555235027171 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Exporters.CoverTransition TARGET = library LINK = $(REF_FSPOT_EXTENSION_COVERTRANSITION) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Addins.Transitions/Cover.cs RESOURCES = Resources/CoverTransition.addin.xml include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Transitions/Makefile.am0000644000175000017500000000005011430555235022536 0ustar00rubenruben00000000000000SUBDIRS = \ FSpot.Transitions.Cover f-spot-0.8.2/src/Extensions/Editors/0000777000175000017500000000000011503407451017604 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Flip/0000777000175000017500000000000011503407452023141 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Flip/Resources/0000777000175000017500000000000011503407452025113 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Flip/Resources/FlipEditor.addin.xml0000644000175000017500000000066611430555235030762 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Flip/Makefile.in0000644000175000017500000006662711503407260025220 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Editors/FSpot.Editors.Flip ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Editors.FlipEditor TARGET = library LINK = $(REF_FSPOT_EXTENSION_FLIPEDITOR) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Addins.Editors/FlipEditor.cs RESOURCES = Resources/FlipEditor.addin.xml # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Editors/FSpot.Editors.Flip/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Editors/FSpot.Editors.Flip/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Flip/FSpot.Addins.Editors/0000777000175000017500000000000011503407452027005 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Flip/FSpot.Addins.Editors/FlipEditor.cs0000644000175000017500000000107611503404762031376 0ustar00rubenruben00000000000000/* * FlipEditor.cs * * Author(s) * Ruben Vermeersch * * This is free software. See COPYING for details. */ using FSpot; using FSpot.Editors; using Gdk; using Mono.Unix; namespace FSpot.Addins.Editors { class FlipEditor : Editor { public FlipEditor () : base (Catalog.GetString ("Flip"), "object-flip-horizontal") { CanHandleMultiple = true; } protected override Pixbuf Process (Pixbuf input, Cms.Profile input_profile) { Pixbuf output = (Pixbuf) input.Clone (); return output.Flip (true); } } } f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Flip/Makefile.am0000644000175000017500000000040611430555235025173 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Editors.FlipEditor TARGET = library LINK = $(REF_FSPOT_EXTENSION_FLIPEDITOR) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Addins.Editors/FlipEditor.cs RESOURCES = Resources/FlipEditor.addin.xml include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Pixelate/0000777000175000017500000000000011503407452024022 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Pixelate/Resources/0000777000175000017500000000000011503407452025774 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Pixelate/Resources/PixelateEditor.addin.xml0000644000175000017500000000070411430555235032515 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Pixelate/Makefile.in0000644000175000017500000006666311503407261026102 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Editors/FSpot.Editors.Pixelate ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Editors.PixelateEditor TARGET = library LINK = $(REF_FSPOT_EXTENSION_PIXELATEEDITOR) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Addins.Editors/PixelateEditor.cs RESOURCES = Resources/PixelateEditor.addin.xml # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Editors/FSpot.Editors.Pixelate/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Editors/FSpot.Editors.Pixelate/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Pixelate/FSpot.Addins.Editors/0000777000175000017500000000000011503407452027666 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Pixelate/FSpot.Addins.Editors/PixelateEditor.cs0000644000175000017500000000235511503404762033141 0ustar00rubenruben00000000000000/* * PixelateEditor.cs * * Author(s) * Brian J. Murrell * * This is free software. See COPYING for details. */ using FSpot; using FSpot.Editors; using Gdk; using Gtk; using Mono.Unix; namespace FSpot.Addins.Editors { class PixelateEditor : Editor { public PixelateEditor () : base (Catalog.GetString ("Pixelate"), null) { CanHandleMultiple = false; NeedsSelection = true; } public override Widget ConfigurationWidget () { VBox vbox = new VBox (); Label info = new Label (Catalog.GetString ("Select the area that you want pixelated.")); vbox.Add (info); return vbox; } protected override Pixbuf Process (Pixbuf input, Cms.Profile input_profile) { Pixbuf output = input.Copy (); Pixbuf sub = new Pixbuf (output, State.Selection.X, State.Selection.Y, State.Selection.Width, State.Selection.Height); /* lazy man's pixelate: scale down and then back up */ Pixbuf down = sub.ScaleSimple (State.Selection.Width/75, State.Selection.Height/75, InterpType.Nearest); Pixbuf up = down.ScaleSimple (State.Selection.Width, State.Selection.Height, InterpType.Nearest); up.CopyArea (0, 0, State.Selection.Width, State.Selection.Height, sub, 0, 0); return output; } } } f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Pixelate/Makefile.am0000644000175000017500000000042611430555235026056 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Editors.PixelateEditor TARGET = library LINK = $(REF_FSPOT_EXTENSION_PIXELATEEDITOR) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Addins.Editors/PixelateEditor.cs RESOURCES = Resources/PixelateEditor.addin.xml include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Blackout/0000777000175000017500000000000011503407451024012 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Blackout/Resources/0000777000175000017500000000000011503407451025764 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Blackout/Resources/BlackoutEditor.addin.xml0000644000175000017500000000070511430555235032500 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Blackout/Makefile.in0000644000175000017500000006666311503407257026100 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Editors/FSpot.Editors.Blackout ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Editors.BlackoutEditor TARGET = library LINK = $(REF_FSPOT_EXTENSION_BLACKOUTEDITOR) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Addins.Editors/BlackoutEditor.cs RESOURCES = Resources/BlackoutEditor.addin.xml # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Editors/FSpot.Editors.Blackout/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Editors/FSpot.Editors.Blackout/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Blackout/FSpot.Addins.Editors/0000777000175000017500000000000011503407451027656 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Blackout/FSpot.Addins.Editors/BlackoutEditor.cs0000644000175000017500000000164311503404762033122 0ustar00rubenruben00000000000000/* * BlackoutEditor.cs * * Author(s) * Brian J. Murrell * * This is free software. See COPYING for details. */ using FSpot; using FSpot.Editors; using Gdk; using Gtk; using Mono.Unix; namespace FSpot.Addins.Editors { class BlackoutEditor : Editor { public BlackoutEditor () : base (Catalog.GetString ("Blackout"), null) { CanHandleMultiple = false; NeedsSelection = true; } public override Widget ConfigurationWidget () { VBox vbox = new VBox (); Label info = new Label (Catalog.GetString ("Select the area that you want blacked out.")); vbox.Add (info); return vbox; } protected override Pixbuf Process (Pixbuf input, Cms.Profile input_profile) { Pixbuf output = input.Copy (); Pixbuf sub = new Pixbuf (output, State.Selection.X, State.Selection.Y, State.Selection.Width, State.Selection.Height); sub.Fill (0x00000000); return output; } } } f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Blackout/Makefile.am0000644000175000017500000000042611430555235026047 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Editors.BlackoutEditor TARGET = library LINK = $(REF_FSPOT_EXTENSION_BLACKOUTEDITOR) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Addins.Editors/BlackoutEditor.cs RESOURCES = Resources/BlackoutEditor.addin.xml include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Resize/0000777000175000017500000000000011503407453023511 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Resize/Resources/0000777000175000017500000000000011503407453025463 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Resize/Resources/ResizeEditor.addin.xml0000644000175000017500000000066011430555235031672 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Resize/Makefile.in0000644000175000017500000006664511503407262025571 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Editors/FSpot.Editors.Resize ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Editors.ResizeEditor TARGET = library LINK = $(REF_FSPOT_EXTENSION_RESIZEEDITOR) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Addins.Editors/ResizeEditor.cs RESOURCES = Resources/ResizeEditor.addin.xml # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Editors/FSpot.Editors.Resize/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Editors/FSpot.Editors.Resize/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Resize/FSpot.Addins.Editors/0000777000175000017500000000000011503407453027355 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Resize/FSpot.Addins.Editors/ResizeEditor.cs0000644000175000017500000000210111503404762032302 0ustar00rubenruben00000000000000/* * ResizeEditor.cs * * Author(s) * Stephane Delcroix (stephane@delcroix.org) * * This is free software. See COPYING for details. */ using System; using FSpot; using FSpot.Editors; using FSpot.Imaging; using Gtk; using Gdk; using Mono.Unix; namespace FSpot.Addins.Editors { class ResizeEditor : Editor { SpinButton size; public ResizeEditor () : base (Catalog.GetString ("Resize"), null) { CanHandleMultiple = false; HasSettings = true; } protected override Pixbuf Process (Pixbuf input, Cms.Profile input_profile) { Pixbuf output = (Pixbuf) input.Clone (); double ratio = (double)size.Value / Math.Max (output.Width, output.Height); return output.ScaleSimple ((int)(output.Width * ratio), (int)(output.Height * ratio), InterpType.Bilinear); } public override Widget ConfigurationWidget () { int max; using (var img = ImageFile.Create (State.Items[0].DefaultVersion.Uri)) using (Pixbuf p = img.Load ()) max = Math.Max (p.Width, p.Height); size = new SpinButton (128, max, 10); size.Value = max; return size; } } } f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.Resize/Makefile.am0000644000175000017500000000041611430555235025543 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Editors.ResizeEditor TARGET = library LINK = $(REF_FSPOT_EXTENSION_RESIZEEDITOR) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Addins.Editors/ResizeEditor.cs RESOURCES = Resources/ResizeEditor.addin.xml include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Editors/Makefile.in0000644000175000017500000005215511503407262021655 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/Extensions/Editors DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = \ FSpot.Editors.Blackout \ FSpot.Editors.BW \ FSpot.Editors.Flip \ FSpot.Editors.Pixelate \ FSpot.Editors.Resize all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Editors/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Editors/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.BW/0000777000175000017500000000000011503407452022557 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.BW/Resources/0000777000175000017500000000000011503407452024531 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.BW/Resources/BWEditor.addin.xml0000644000175000017500000000070211430555235030005 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.BW/Makefile.in0000644000175000017500000006665011503407256024637 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Editors/FSpot.Editors.BW ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Editors.BWEditor ASSEMBLY_BUILD_FLAGS = -unsafe TARGET = library LINK = $(REF_FSPOT_EXTENSION_BWEDITOR) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Addins.Editors/BWEditor.cs RESOURCES = Resources/BWEditor.addin.xml # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Editors/FSpot.Editors.BW/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Editors/FSpot.Editors.BW/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.BW/FSpot.Addins.Editors/0000777000175000017500000000000011503407452026423 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Editors/FSpot.Editors.BW/FSpot.Addins.Editors/BWEditor.cs0000644000175000017500000000761111503404762030433 0ustar00rubenruben00000000000000/* * BWEditor.cs * * Author(s) * Stephane Delcroix (stephane@delcroix.org) * * Copyright (c) 2009 Novell, Inc. * * This is open source software. See COPYING for details. */ using System; using FSpot; using FSpot.Editors; using Gtk; using Gdk; using Mono.Unix; using Mono.Simd; using Hyena; namespace FSpot.Addins.Editors { class BWEditor : Editor { public BWEditor () : base (Catalog.GetString ("Convert to B/W"), null) { CanHandleMultiple = false; HasSettings = true; ApplyLabel = Catalog.GetString ("Apply"); } /* static bool enhanced_support = EnhancedSimdSupport (); static bool EnhancedSimdSupport () { //require sse3 return SimdRuntime.IsMethodAccelerated (typeof (VectorOperations), "HorizontalAdd", new Type[] {typeof (Vector4f), typeof (Vector4f)}) && SimdRuntime.IsMethodAccelerated (typeof (Vector4f), "op_Multiply"); }*/ protected override Pixbuf Process (Pixbuf input, Cms.Profile input_profile) { uint timer = Log.DebugTimerStart (); if (input.BitsPerSample != 8) { Log.Warning ("unsupported pixbuf format"); return (Pixbuf)input.Clone (); } Pixbuf output = new Pixbuf (input.Colorspace, input.HasAlpha, input.BitsPerSample, input.Width, input.Height); Vector4f multiply = new Vector4f ((float)(r.Value/100.0), (float)(g.Value/100.0), (float)(b.Value/100.0), 0); Normalize (ref multiply); bool has_alpha = input.HasAlpha; int chan = input.NChannels; int rowstride_in = input.Rowstride; int rowstride_out = output.Rowstride; Vector4f v_in; Vector4f v_out = new Vector4f (0); float[] fcurve = new float [256]; c.GetVector (fcurve.Length, fcurve); byte[] curve = new byte [fcurve.Length]; for (int i = 0; i < fcurve.Length; i++) curve[i] = (byte)fcurve[i]; unsafe { byte *pix_in = (byte *)input.Pixels; byte *pix_out = (byte *)output.Pixels; for (int i=0; i < input.Height; i++) for (int j=0; j // // Copyright (c) 2009 Novell, Inc. // // This is open source software. See COPYING for details. // using System; using System.Reflection; using Gtk; using FSpot; using FSpot.Core; using FSpot.UI.Dialog; using FSpot.Extensions; using FSpot.Widgets; namespace FSpot.Tools.ScreensaverConfig { public class ScreensaverConfig : ICommand { const string SaverCommand = "screensavers-f-spot-screensaver"; const string SaverMode = "single"; const string GNOME_SCREENSAVER_THEME = "/apps/gnome-screensaver/themes"; const string GNOME_SCREENSAVER_MODE = "/apps/gnome-screensaver/mode"; const string SCREENSAVER_TAG = Preferences.SCREENSAVER_TAG; const string SCREENSAVER_DELAY = Preferences.SCREENSAVER_DELAY; const double default_delay = 2.0; public void Run (object o, EventArgs e) { var d = new ScreensaverConfigDialog (); d.Run (); d.Destroy (); } class ScreensaverConfigDialog : BuilderDialog { [GtkBeans.Builder.Object] Range delay_scale; [GtkBeans.Builder.Object] Table table; [GtkBeans.Builder.Object] RadioButton all_radio; [GtkBeans.Builder.Object] RadioButton tagged_radio; [GtkBeans.Builder.Object] Button do_button; Adjustment delay_adjustment; MenuButton tag_button; public ScreensaverConfigDialog () : base (Assembly.GetExecutingAssembly (), "ScreensaverConfigDialog.ui", "screensaver-config-dialog") { delay_adjustment = new Adjustment (default_delay, 1.0, 20.0, .5, 5, 0); LoadPreference (SCREENSAVER_DELAY); delay_scale.Adjustment = delay_adjustment; delay_adjustment.ValueChanged += HandleDelayChanged; tag_button = new MenuButton (); tag_button.SizeRequested += delegate (object sender, SizeRequestedArgs args) { var req = args.Requisition; req.Width += 100; args.Requisition = req; }; TagMenu menu = new TagMenu (null, App.Instance.Database.Tags); menu.Populate (false); menu.TagSelected += HandleTagSelected; tag_button.Menu = menu; tag_button.ShowAll (); table.Attach (tag_button, 2, 3, 1, 2); LoadPreference (SCREENSAVER_TAG); all_radio.Toggled += HandleTagRadioToggled; do_button.Clicked += HandleUseFSpot; } void LoadPreference (string key) { switch (key) { case SCREENSAVER_DELAY: var delay = Preferences.Get (key); if (delay == 0.0) delay = default_delay; if (delay < delay_adjustment.Lower) delay = delay_adjustment.Lower; if (delay > delay_adjustment.Upper) delay = delay_adjustment.Upper; delay_adjustment.Value = delay; break; case SCREENSAVER_TAG: var screensaver_tag = Preferences.Get (key); Tag t = App.Instance.Database.Tags.GetTagById (screensaver_tag); if (screensaver_tag == 0 || t == null) { all_radio.Active = true; tag_button.Sensitive = false; } else { tagged_radio.Active = true; tag_button.Label = t.Name; } break; } } void HandleDelayChanged (object sender, EventArgs e) { Preferences.Set (SCREENSAVER_DELAY, delay_adjustment.Value); } void HandleTagRadioToggled (object sender, EventArgs e) { tag_button.Sensitive = tagged_radio.Active; if (all_radio.Active) Preferences.Set (SCREENSAVER_TAG, 0); else HandleTagSelected (((tag_button.Menu as Menu).Active as TagMenu.TagMenuItem).Value); } void HandleTagSelected (Tag t) { tag_button.Label = t.Name; Preferences.Set (SCREENSAVER_TAG, (int) t.Id); } void HandleUseFSpot (object sender, EventArgs e) { Preferences.Set (GNOME_SCREENSAVER_MODE, SaverMode); Preferences.Set (GNOME_SCREENSAVER_THEME, new string [] { SaverCommand }); } } } } f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.ScreensaverConfig/Resources/0000777000175000017500000000000011503407466027012 5ustar00rubenruben00000000000000ScreensaverConfigDialog.ui0000644000175000017500000001467211430555235034023 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.ScreensaverConfig/Resources 5 Screensaver Configuration False center-on-parent normal False True vertical 2 True 4 3 6 6 True 1 Display: All Images True True False True True 1 2 Images tagged with: True True False True True all_radio 1 2 1 2 True True left 1 2 2 3 6 True 1 Delay: 2 3 Make F-Spot my screensaver True True True 3 3 4 6 6 False False 6 1 True end gtk-close True True True True False False 0 False end 0 button1 ScreensaverConfig.addin.xml0000644000175000017500000000102111430555235034124 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.ScreensaverConfig/Resources f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.ScreensaverConfig/Makefile.in0000644000175000017500000006700111503407302027072 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Tools/FSpot.Tools.ScreensaverConfig ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Tools.ScreensaverConfig TARGET = library LINK = $(REF_FSPOT_EXTENSION_SCREENSAVERCONFIG) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Tools.ScreensaverConfig/ScreensaverConfig.cs RESOURCES = \ Resources/ScreensaverConfig.addin.xml \ Resources/ScreensaverConfigDialog.ui # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Tools/FSpot.Tools.ScreensaverConfig/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Tools/FSpot.Tools.ScreensaverConfig/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.ScreensaverConfig/Makefile.am0000644000175000017500000000052511430555235027067 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Tools.ScreensaverConfig TARGET = library LINK = $(REF_FSPOT_EXTENSION_SCREENSAVERCONFIG) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Tools.ScreensaverConfig/ScreensaverConfig.cs RESOURCES = \ Resources/ScreensaverConfig.addin.xml \ Resources/ScreensaverConfigDialog.ui include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.ChangePhotoPath/0000777000175000017500000000000011503407463024443 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.ChangePhotoPath/FSpot.Tools.ChangePhotoPath/0000777000175000017500000000000011503407463031610 5ustar00rubenruben00000000000000IChangePhotoPathGui.cs0000644000175000017500000000063511503404762035651 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.ChangePhotoPath/FSpot.Tools.ChangePhotoPath// // ChangePhotoPath.IChangePhotoPathGui.cs: Interfaces to ChangePhotoPathGui // // Author: // Bengt Thuree (bengt@thuree.com) // // Copyright (C) 2007 // namespace FSpot.Tools.ChangePhotoPath { public interface IChangePhotoPathGui { void remove_progress_dialog(); bool UpdateProgressBar (string hdr_txt, string text, int total_photos); void DisplayDefaultPaths (string oldpath, string newpath); } } ChangePhotoPathGui.cs0000644000175000017500000001221611503404762035536 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.ChangePhotoPath/FSpot.Tools.ChangePhotoPath// // ChangePhotoPath.IChangePhotoPathGui.cs: The Gui to change the photo path in photos.db // // Author: // Bengt Thuree (bengt@thuree.com) // // Copyright (C) 2007 // using FSpot.Extensions; using FSpot.UI.Dialog; using System; //using Gnome.Vfs; using Gtk; using Hyena; using Hyena.Widgets; namespace FSpot.Tools.ChangePhotoPath { public class Dump : Gtk.Dialog, ICommand, IChangePhotoPathGui { private string dialog_name = "ChangePhotoPath"; private GtkBeans.Builder builder; private Gtk.Dialog dialog; private ChangePathController contr; private ProgressDialog progress_dialog; private int progress_dialog_total = 0; [GtkBeans.Builder.Object] Gtk.Entry old_common_uri; [GtkBeans.Builder.Object] Gtk.Label new_common_uri; private bool LaunchController() { try { contr = new ChangePathController ( this ); } catch (Exception e) { Log.Exception(e); return false; } return true; } public void create_progress_dialog(string txt, int total) { progress_dialog = new ProgressDialog (txt, ProgressDialog.CancelButtonType.Stop, total, dialog); } public void LaunchDialog() { CreateDialog(); Dialog.Modal = false; Dialog.TransientFor = null; if (LaunchController() && contr.CanWeRun()) { DisplayDoNotStopFSpotMsg(); Dialog.ShowAll(); Dialog.Response += HandleResponse; } else { DisplayOrigBasePathNotFoundMsg(); Dialog.Destroy(); } } private void CreateDialog() { builder = new GtkBeans.Builder (null, "ChangePhotoPath.ui", null); builder.Autoconnect (this); } private Gtk.Dialog Dialog { get { if (dialog == null) dialog = new Gtk.Dialog (builder.GetRawObject (dialog_name)); return dialog; } } private void DisplayMsg(Gtk.MessageType MessageType, string msg) { HigMessageDialog.RunHigMessageDialog ( null, Gtk.DialogFlags.Modal | Gtk.DialogFlags.DestroyWithParent, MessageType, Gtk.ButtonsType.Ok, msg, null); } private void DisplayDoNotStopFSpotMsg() { DisplayMsg (Gtk.MessageType.Info, "It will take a long time for SqLite to update the database if you have many photos." + "\nWe recommend you to let F-Spot be running during the night to ensure everything is written to disk."+ "\nChanging path on 23000 photos took 2 hours until sqlite had updated all photos in the database."); } private void DisplayOrigBasePathNotFoundMsg() { DisplayMsg (Gtk.MessageType.Error, "Could not find an old base path. /YYYY/MM/DD need to start with /20, /19 or /18."); } private void DisplayCancelledMsg() { DisplayMsg (Gtk.MessageType.Warning, "Operation aborted. Database has not been modified."); } private void DisplaySamePathMsg() { DisplayMsg (Gtk.MessageType.Warning, "New and Old base path are the same."); } private void DisplayNoPhotosFoundMsg() { DisplayMsg (Gtk.MessageType.Warning, "Did not find any photos with the old base path."); } private void DisplayExecutionOkMsg() { DisplayMsg (Gtk.MessageType.Info, "Completed successfully. Please ensure you wait 1-2 hour before you exit f-spot. This to ensure the database cache is written to disk."); } private void DisplayExecutionNotOkMsg() { DisplayMsg (Gtk.MessageType.Error, "An error occured. Reverted all changes to the database."); } private void HandleResponse (object sender, Gtk.ResponseArgs args) { bool destroy_dialog = false; ChangePhotoPath.ProcessResult tmp_res; if (args.ResponseId == Gtk.ResponseType.Ok) { tmp_res = contr.ChangePathOnPhotos (old_common_uri.Text, new_common_uri.Text); switch (tmp_res) { case ProcessResult.Ok : DisplayExecutionOkMsg(); destroy_dialog=true; break; case ProcessResult.Cancelled : DisplayCancelledMsg(); break; case ProcessResult.Error : DisplayExecutionNotOkMsg(); break; case ProcessResult.SamePath : DisplaySamePathMsg(); break; case ProcessResult.NoPhotosFound : DisplayNoPhotosFoundMsg(); break; case ProcessResult.Processing : Log.Debug ("processing"); break; } } else destroy_dialog = true; remove_progress_dialog(); if (destroy_dialog) Dialog.Destroy(); return; } public void DisplayDefaultPaths (string oldpath, string newpath) { old_common_uri.Text = oldpath; new_common_uri.Text = newpath; } public void remove_progress_dialog () { if (progress_dialog != null) { progress_dialog.Destroy(); progress_dialog = null; } } public void check_if_remove_progress_dialog (int total) { if (total != progress_dialog_total) remove_progress_dialog(); } public bool UpdateProgressBar (string hdr_txt, string txt, int total) { if (progress_dialog != null) check_if_remove_progress_dialog(total); if (progress_dialog == null) create_progress_dialog(hdr_txt, total); progress_dialog_total = total; return progress_dialog.Update (String.Format ("{0} ", txt)); } public void Run (object sender, EventArgs args) { try { LaunchDialog( ); } catch (Exception e) { Log.Exception(e); } } } } ChangePhotoPathController.cs0000644000175000017500000002277411503404762037147 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.ChangePhotoPath/FSpot.Tools.ChangePhotoPath// // ChangePhotoPath.IChangePhotoPathController.cs: The logic to change the photo path in photos.db // // Author: // Bengt Thuree (bengt@thuree.com) // // Copyright (C) 2007 // using FSpot; using FSpot.Core; using FSpot.Query; using System; using System.IO; using System.Collections; using System.Collections.Specialized; using Hyena; /* Need to 1) Find old base path, assuming starting /YYYY/MM/DD so look for /YY (/19 or /20) 2) Confirm old base path and display new base path 3) For each Photo, check each version, and change every instance of old base path to new path Consider!!! photo_store.Commit(photo) is using db.ExecuteNonQuery, which is not waiting for the command to finish. On my test set of 20.000 photos, it took SQLite another 1 hour or so to commit all rows after this extension had finished its execution. Consider 2!!! A bit of mixture between URI and path. Old and New base path are in String path. Rest in URI. */ namespace FSpot.Tools.ChangePhotoPath { public enum ProcessResult { Ok, Cancelled, Error, SamePath, NoPhotosFound, Processing } public class ChangePathController { PhotoStore photo_store = FSpot.App.Instance.Database.Photos; ArrayList photo_id_array, version_id_array; StringCollection old_path_array, new_path_array; int total_photos; string orig_base_path; private const string BASE2000 = "/20"; private const string BASE1900 = "/19"; private const string BASE1800 = "/18"; private IChangePhotoPathGui gui_controller; private bool user_cancelled; public bool UserCancelled { get {return user_cancelled;} set {user_cancelled = value;} } public ChangePathController (IChangePhotoPathGui gui) { gui_controller = gui; total_photos = photo_store.TotalPhotos; orig_base_path = EnsureEndsWithOneDirectorySeparator (FindOrigBasePath()); // NOT URI string new_base_path = EnsureEndsWithOneDirectorySeparator (FSpot.Core.Global.PhotoUri.LocalPath); // NOT URI gui_controller.DisplayDefaultPaths (orig_base_path, new_base_path); user_cancelled = false; } private string EnsureEndsWithOneDirectorySeparator (string tmp_str) { if ( (tmp_str == null) || (tmp_str.Length == 0) ) return String.Format ("{0}", Path.DirectorySeparatorChar); while (tmp_str.EndsWith(String.Format ("{0}", Path.DirectorySeparatorChar))) tmp_str = tmp_str.Remove (tmp_str.Length-1, 1); return String.Format ("{0}{1}", tmp_str, Path.DirectorySeparatorChar); } // Should always return TRUE, since path always ends with "/" public bool CanWeRun () { return (orig_base_path != null); } private string IsThisPhotoOnOrigBasePath (string check_this_path) { int i; i = check_this_path.IndexOf(BASE2000); if (i > 0) return (check_this_path.Substring(0, i)); i = check_this_path.IndexOf(BASE1900); if (i > 0) return (check_this_path.Substring(0, i)); i = check_this_path.IndexOf(BASE1800); if (i > 0) return (check_this_path.Substring(0, i)); return null; } private string FindOrigBasePath() { string res_path = null; foreach ( IPhoto photo in photo_store.Query ( "SELECT * FROM photos " ) ) { string tmp_path = (photo as Photo).DefaultVersion.Uri.AbsolutePath; res_path = IsThisPhotoOnOrigBasePath (tmp_path); if (res_path != null) break; } return res_path; } private void InitializeArrays() { photo_id_array = new ArrayList(); version_id_array = new ArrayList(); old_path_array = new StringCollection(); new_path_array = new StringCollection(); } private void AddVersionToArrays ( uint photo_id, uint version_id, string old_path, string new_path) { photo_id_array.Add (photo_id); version_id_array.Add (version_id); old_path_array.Add (old_path); new_path_array.Add (new_path); } private string CreateNewPath (string old_base, string new_base, PhotoVersion version) { return string.Format ("{0}{1}", new_base, version.Uri.AbsolutePath.Substring(old_base.Length)); } private bool ChangeThisVersionUri (PhotoVersion version, string old_base, string new_base) { // Change to path from URI, since easier to compare with old_base which is not in URI format. string tmp_path = System.IO.Path.GetDirectoryName (version.Uri.AbsolutePath); return ( tmp_path.StartsWith (old_base) ); } private void SearchVersionUriToChange (Photo photo, string old_base, string new_base) { foreach (uint version_id in photo.VersionIds) { PhotoVersion version = photo.GetVersion (version_id) as PhotoVersion; if ( ChangeThisVersionUri (version, old_base, new_base) ) AddVersionToArrays ( photo.Id, version_id, version.Uri.AbsolutePath, CreateNewPath (old_base, new_base, version)); // else // System.Console.WriteLine ("L : {0}", version.Uri.AbsolutePath); } } public bool SearchUrisToChange (string old_base, string new_base) { int count = 0; foreach ( IPhoto ibrows in photo_store.Query ( "SELECT * FROM photos " ) ) { count++; if (gui_controller.UpdateProgressBar ("Scanning through database", "Checking photo", total_photos)) return false; SearchVersionUriToChange ((ibrows as Photo), old_base, new_base); } return true; } public bool StillOnSamePhotoId (int old_index, int current_index, ArrayList array) { try { return (array[old_index] == array[current_index]); } catch { return true; // return true if out of index. } } public void UpdateThisUri (int index, string path, ref Photo photo) { if (photo == null) photo = photo_store.Get ( (uint) photo_id_array[index]) as Photo; PhotoVersion version = photo.GetVersion ( (uint) version_id_array[index]) as PhotoVersion; version.BaseUri = new SafeUri ( path ).GetBaseUri (); version.Filename = new SafeUri ( path ).GetFilename (); photo.Changes.UriChanged = true; photo.Changes.ChangeVersion ( (uint) version_id_array[index] ); } /// FIXME Refactor, try to use one common method.... public void RevertAllUris (int last_index) { gui_controller.remove_progress_dialog(); Photo photo = null; for (int k = last_index; k >= 0; k--) { if (gui_controller.UpdateProgressBar ("Reverting changes to database", "Reverting photo", last_index)) {} // do nothing, ignore trying to abort the revert... if ( (photo != null) && !StillOnSamePhotoId (k+1, k, photo_id_array) ) { photo_store.Commit (photo); photo = null; } UpdateThisUri (k, old_path_array[k], ref photo); Log.DebugFormat ("R : {0} - {1}", k, old_path_array[k]); } if (photo != null) photo_store.Commit (photo); Log.Debug ("Changing path failed due to above error. Have reverted any modification that took place."); } public ProcessResult ChangeAllUris ( ref int last_index) { gui_controller.remove_progress_dialog(); Photo photo = null; last_index = 0; try { photo = null; for (last_index = 0; last_index < photo_id_array.Count; last_index++) { if (gui_controller.UpdateProgressBar ("Changing photos base path", "Changing photo", photo_id_array.Count)) { Log.Debug("User aborted the change of paths..."); return ProcessResult.Cancelled; } if ( (photo != null) && !StillOnSamePhotoId (last_index-1, last_index, photo_id_array) ) { photo_store.Commit (photo); photo = null; } UpdateThisUri (last_index, new_path_array[last_index], ref photo); Log.DebugFormat ("U : {0} - {1}", last_index, new_path_array[last_index]); // DEBUG ONLY // Cause an TEST exception on 6'th URI to be changed. // float apa = last_index / (last_index-6); } if (photo != null) photo_store.Commit (photo); } catch (Exception e) { Log.Exception(e); return ProcessResult.Error; } return ProcessResult.Ok; } public ProcessResult ProcessArrays() { int last_index = 0; ProcessResult tmp_res; tmp_res = ChangeAllUris(ref last_index); if (!(tmp_res == ProcessResult.Ok)) RevertAllUris(last_index); return tmp_res; } /* public void CheckIfUpdated (int test_index, StringCollection path_array) { Photo photo = photo_store.Get ( (uint) photo_id_array[test_index]) as Photo; PhotoVersion version = photo.GetVersion ( (uint) version_id_array[test_index]) as PhotoVersion; if (version.Uri.AbsolutePath.ToString() == path_array[ test_index ]) Log.DebugFormat ("Test URI ({0}) matches --- Should be finished", test_index); else Log.DebugFormat ("Test URI ({0}) DO NOT match --- Should NOT BE finished", test_index); } */ /* Check paths are different If (Scan all photos) // user might cancel If (Check there are photos on old path) ChangePathsOnPhotos */ public bool NewOldPathSame (ref string newpath, ref string oldpath) { string p1 = EnsureEndsWithOneDirectorySeparator(newpath); string p2 = EnsureEndsWithOneDirectorySeparator(oldpath); return (p1 == p2); } public ProcessResult ChangePathOnPhotos (string old_base, string new_base) { ProcessResult tmp_res = ProcessResult.Processing; InitializeArrays(); if (NewOldPathSame (ref new_base, ref old_base)) tmp_res = ProcessResult.SamePath; if ( (tmp_res == ProcessResult.Processing) && (!SearchUrisToChange (old_base, new_base)) ) tmp_res = ProcessResult.Cancelled; if ( (tmp_res == ProcessResult.Processing) && (photo_id_array.Count == 0) ) tmp_res = ProcessResult.NoPhotosFound; if (tmp_res == ProcessResult.Processing) tmp_res = ProcessArrays(); // if (res) // CheckIfUpdated (photo_id_array.Count-1, new_path_array); // else // CheckIfUpdated (0, old_path_array); return tmp_res; } } } f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.ChangePhotoPath/Resources/0000777000175000017500000000000011503407463026415 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.ChangePhotoPath/Resources/ChangePhotoPath.ui0000644000175000017500000002061711441732537031776 0ustar00rubenruben00000000000000 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 Change Photos directory center-on-parent dialog False True vertical 2 True 0 none True True 12 True 2 2 True True 1 2 5 True 0 1 2 1 2 5 True 0.10000000149011612 Old base path (URI) was True 0.10000000149011612 Change base path (URI) to 1 2 True <b>Specify the toplevel Photos directories</b> True 1 True end gtk-cancel True True False True False False 0 True True False True 0 0 True 2 True gtk-ok False False 0 True _Apply changes True False False 1 False False 1 False end 0 cancel Apply f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.ChangePhotoPath/Resources/ChangePhotoPath.addin.xml0000644000175000017500000000167111430555235033232 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.ChangePhotoPath/Makefile.in0000644000175000017500000006714211503407274026516 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Tools/FSpot.Tools.ChangePhotoPath ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Tools.ChangePhotoPath TARGET = library LINK = $(REF_FSPOT_EXTENSION_CHANGEPHOTOPATH) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Tools.ChangePhotoPath/ChangePhotoPathController.cs \ FSpot.Tools.ChangePhotoPath/ChangePhotoPathGui.cs \ FSpot.Tools.ChangePhotoPath/IChangePhotoPathGui.cs RESOURCES = \ Resources/ChangePhotoPath.addin.xml \ Resources/ChangePhotoPath.ui # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Tools/FSpot.Tools.ChangePhotoPath/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Tools/FSpot.Tools.ChangePhotoPath/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.ChangePhotoPath/Makefile.am0000755000175000017500000000067411441732537026511 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Tools.ChangePhotoPath TARGET = library LINK = $(REF_FSPOT_EXTENSION_CHANGEPHOTOPATH) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Tools.ChangePhotoPath/ChangePhotoPathController.cs \ FSpot.Tools.ChangePhotoPath/ChangePhotoPathGui.cs \ FSpot.Tools.ChangePhotoPath/IChangePhotoPathGui.cs RESOURCES = \ Resources/ChangePhotoPath.addin.xml \ Resources/ChangePhotoPath.ui include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.RetroactiveRoll/0000777000175000017500000000000011503407465024551 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.RetroactiveRoll/FSpot.Tools.RetroactiveRoll/0000777000175000017500000000000011503407465032022 5ustar00rubenruben00000000000000RetroactiveRoll.cs0000644000175000017500000000211211503404762035377 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.RetroactiveRoll/FSpot.Tools.RetroactiveRoll/* * RetroactiveRoll.cs * * Author(s) * Andy Wingo * * This is free software. See COPYING for details */ using FSpot; using FSpot.Core; using FSpot.Extensions; using System; using Hyena; using Hyena.Data.Sqlite; namespace FSpot.Tools.RetroactiveRoll { public class RetroactiveRoll: ICommand { public void Run (object o, EventArgs e) { Photo[] photos = App.Instance.Organizer.SelectedPhotos (); if (photos.Length == 0) { Log.Debug ("no photos selected, returning"); return; } DateTime import_time = photos[0].Time; foreach (Photo p in photos) if (p.Time > import_time) import_time = p.Time; RollStore rolls = App.Instance.Database.Rolls; Roll roll = rolls.Create(import_time); foreach (Photo p in photos) { HyenaSqliteCommand cmd = new HyenaSqliteCommand ("UPDATE photos SET roll_id = ? " + "WHERE id = ? ", roll.Id, p.Id); App.Instance.Database.Database.Execute (cmd); p.RollId = roll.Id; } Log.Debug ("RetroactiveRoll done: " + photos.Length + " photos in roll " + roll.Id); } } } f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.RetroactiveRoll/Resources/0000777000175000017500000000000011503407465026523 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.RetroactiveRoll/Resources/RetroactiveRoll.addin.xml0000644000175000017500000000100711430555235033433 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.RetroactiveRoll/Makefile.in0000644000175000017500000006670511503407301026615 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Tools/FSpot.Tools.RetroactiveRoll ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Tools.RetroactiveRoll TARGET = library LINK = $(REF_FSPOT_EXTENSION_RETROACTIVEROLL) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Tools.RetroactiveRoll/RetroactiveRoll.cs RESOURCES = Resources/RetroactiveRoll.addin.xml # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Tools/FSpot.Tools.RetroactiveRoll/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Tools/FSpot.Tools.RetroactiveRoll/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.RetroactiveRoll/Makefile.am0000644000175000017500000000043711430555235026603 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Tools.RetroactiveRoll TARGET = library LINK = $(REF_FSPOT_EXTENSION_RETROACTIVEROLL) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Tools.RetroactiveRoll/RetroactiveRoll.cs RESOURCES = Resources/RetroactiveRoll.addin.xml include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.DevelopInUFraw/0000777000175000017500000000000011503407463024261 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.DevelopInUFraw/FSpot.Tools.DevelopInUFraw/0000777000175000017500000000000011503407463031244 5ustar00rubenruben00000000000000DevelopInUFRawBatch.cs0000644000175000017500000000175611503404762035254 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.DevelopInUFraw/FSpot.Tools.DevelopInUFrawusing System; using System.IO; using Mono.Unix; using Hyena; using FSpot; using FSpot.Core; using FSpot.Utils; using FSpot.Extensions; using FSpot.Imaging; using FSpot.UI.Dialog; namespace FSpot.Tools.DevelopInUFraw { // Batch Version public class DevelopInUFRawBatch : AbstractDevelopInUFRaw { public DevelopInUFRawBatch() : base("ufraw-batch") { } public override void Run (object o, EventArgs e) { ProgressDialog pdialog = new ProgressDialog(Catalog.GetString ("Developing photos"), ProgressDialog.CancelButtonType.Cancel, App.Instance.Organizer.SelectedPhotos ().Length, App.Instance.Organizer.Window); Log.Information ("Executing DevelopInUFRaw extension in batch mode"); foreach (Photo p in App.Instance.Organizer.SelectedPhotos ()) { bool cancelled = pdialog.Update(String.Format(Catalog.GetString ("Developing {0}"), p.Name)); if (cancelled) { break; } DevelopPhoto (p); } pdialog.Destroy(); } } } AbstractDevelopInUFRaw.cs0000644000175000017500000001217011503404762035766 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.DevelopInUFraw/FSpot.Tools.DevelopInUFrawusing System; using System.IO; using Mono.Unix; using Hyena; using FSpot; using FSpot.Core; using FSpot.Utils; using FSpot.Extensions; using FSpot.Imaging; using FSpot.UI.Dialog; namespace FSpot.Tools.DevelopInUFraw { // Abstract version, contains shared functionality public abstract class AbstractDevelopInUFRaw : ICommand { // The executable used for developing RAWs private string executable; public const string APP_FSPOT_EXTENSION = Preferences.APP_FSPOT + "extension/"; public const string EXTENSION_DEVELOPINUFRAW = "developinufraw/"; public const string UFRAW_JPEG_QUALITY_KEY = APP_FSPOT_EXTENSION + EXTENSION_DEVELOPINUFRAW + "ufraw_jpeg_quality"; public const string UFRAW_ARGUMENTS_KEY = APP_FSPOT_EXTENSION + EXTENSION_DEVELOPINUFRAW + "ufraw_arguments"; public const string UFRAW_BATCH_ARGUMENTS_KEY = APP_FSPOT_EXTENSION + EXTENSION_DEVELOPINUFRAW + "ufraw_batch_arguments"; int ufraw_jpeg_quality; string ufraw_args; string ufraw_batch_args; public AbstractDevelopInUFRaw(string executable) { this.executable = executable; } public abstract void Run (object o, EventArgs e); protected void DevelopPhoto (Photo p) { LoadPreference (UFRAW_JPEG_QUALITY_KEY); LoadPreference (UFRAW_ARGUMENTS_KEY); LoadPreference (UFRAW_BATCH_ARGUMENTS_KEY); PhotoVersion raw = p.GetVersion (Photo.OriginalVersionId) as PhotoVersion; if (!ImageFile.IsRaw (raw.Uri)) { Log.Warning ("The original version of this image is not a (supported) RAW file"); return; } string name = GetVersionName (p); System.Uri developed = GetUriForVersionName (p, name); string idfile = ""; if (ufraw_jpeg_quality < 1 || ufraw_jpeg_quality > 100) { Log.Debug ("Invalid JPEG quality specified, defaulting to quality 98"); ufraw_jpeg_quality = 98; } string args = ""; switch (executable) { case "ufraw": args += ufraw_args; if (GLib.FileFactory.NewForUri (Path.ChangeExtension (raw.Uri.ToString (), ".ufraw")).Exists) { // We found an ID file, use that instead of the raw file idfile = "--conf=" + GLib.Shell.Quote (Path.ChangeExtension (raw.Uri.LocalPath, ".ufraw")); } break; case "ufraw-batch": args += ufraw_batch_args; if (GLib.FileFactory.NewForUri (Path.Combine (Global.BaseDirectory, "batch.ufraw")).Exists) { // We found an ID file, use that instead of the raw file idfile = "--conf=" + GLib.Shell.Quote (Path.Combine (Global.BaseDirectory, "batch.ufraw")); } break; } args += String.Format(" --overwrite --create-id=also --compression={0} --out-type=jpeg {1} --output={2} {3}", ufraw_jpeg_quality, idfile, GLib.Shell.Quote (developed.LocalPath), GLib.Shell.Quote (raw.Uri.LocalPath)); Log.Debug (executable + " " + args); System.Diagnostics.Process ufraw = System.Diagnostics.Process.Start (executable, args); ufraw.WaitForExit (); if (!(GLib.FileFactory.NewForUri (developed.ToString ())).Exists) { Log.Warning ("UFRaw quit with an error. Check that you have UFRaw 0.13 or newer. Or did you simply clicked on Cancel?"); return; } if (GLib.FileFactory.NewForUri (Path.ChangeExtension (developed.ToString (), ".ufraw")).Exists) { // We save our own copy of the last ufraw settings, as ufraw can overwrite it's own last used settings outside f-spot File.Delete (Path.Combine (Global.BaseDirectory, "batch.ufraw")); File.Copy (Path.ChangeExtension (developed.LocalPath, ".ufraw"), Path.Combine (Global.BaseDirectory, "batch.ufraw")); // Rename the ufraw file to match the original RAW filename, instead of the (Developed In UFRaw) filename File.Delete (Path.ChangeExtension (raw.Uri.LocalPath, ".ufraw")); File.Move (Path.ChangeExtension (developed.LocalPath, ".ufraw"), Path.ChangeExtension (raw.Uri.LocalPath, ".ufraw")); } p.DefaultVersionId = p.AddVersion (new SafeUri (developed).GetBaseUri (),new SafeUri (developed).GetFilename (), name, true); p.Changes.DataChanged = true; App.Instance.Database.Photos.Commit (p); } private static string GetVersionName (Photo p) { return GetVersionName (p, 1); } private static string GetVersionName (Photo p, int i) { string name = Catalog.GetPluralString ("Developed in UFRaw", "Developed in UFRaw ({0})", i); name = String.Format (name, i); if (p.VersionNameExists (name)) return GetVersionName (p, i + 1); return name; } private System.Uri GetUriForVersionName (Photo p, string version_name) { string name_without_ext = System.IO.Path.GetFileNameWithoutExtension (p.Name); return new System.Uri (System.IO.Path.Combine (DirectoryPath (p), name_without_ext + " (" + version_name + ")" + ".jpg")); } private static string DirectoryPath (Photo p) { return p.VersionUri (Photo.OriginalVersionId).GetBaseUri (); } void LoadPreference (string key) { switch (key) { case UFRAW_JPEG_QUALITY_KEY: ufraw_jpeg_quality = Preferences.Get (key); break; case UFRAW_ARGUMENTS_KEY: ufraw_args = Preferences.Get (key); break; case UFRAW_BATCH_ARGUMENTS_KEY: ufraw_batch_args = Preferences.Get (key); break; } } } } DevelopInUFRaw.cs0000644000175000017500000000130311503404762034276 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.DevelopInUFraw/FSpot.Tools.DevelopInUFraw/* * DevelopInUFraw.cs * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details */ using System; using System.IO; using Mono.Unix; using Hyena; using FSpot; using FSpot.Core; using FSpot.Utils; using FSpot.Extensions; using FSpot.Imaging; using FSpot.UI.Dialog; namespace FSpot.Tools.DevelopInUFraw { // GUI Version public class DevelopInUFRaw : AbstractDevelopInUFRaw { public DevelopInUFRaw() : base("ufraw") { } public override void Run (object o, EventArgs e) { Log.Information ("Executing DevelopInUFRaw extension"); foreach (Photo p in App.Instance.Organizer.SelectedPhotos ()) { DevelopPhoto (p); } } } } f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.DevelopInUFraw/Resources/0000777000175000017500000000000011503407463026233 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.DevelopInUFraw/Resources/DevelopInUFRaw.addin.xml0000644000175000017500000000154111430555235032622 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.DevelopInUFraw/Makefile.in0000644000175000017500000006705611503407275026341 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Tools/FSpot.Tools.DevelopInUFraw ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Tools.DevelopInUFRaw TARGET = library LINK = $(REF_FSPOT_EXTENSION_DEVELOPINUFRAW) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Tools.DevelopInUFraw/AbstractDevelopInUFRaw.cs \ FSpot.Tools.DevelopInUFraw/DevelopInUFRaw.cs \ FSpot.Tools.DevelopInUFraw/DevelopInUFRawBatch.cs RESOURCES = Resources/DevelopInUFRaw.addin.xml # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Tools/FSpot.Tools.DevelopInUFraw/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Tools/FSpot.Tools.DevelopInUFraw/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.DevelopInUFraw/Makefile.am0000644000175000017500000000061311430555235026311 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Tools.DevelopInUFRaw TARGET = library LINK = $(REF_FSPOT_EXTENSION_DEVELOPINUFRAW) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Tools.DevelopInUFraw/AbstractDevelopInUFRaw.cs \ FSpot.Tools.DevelopInUFraw/DevelopInUFRaw.cs \ FSpot.Tools.DevelopInUFraw/DevelopInUFRawBatch.cs RESOURCES = Resources/DevelopInUFRaw.addin.xml include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.RawPlusJpeg/0000777000175000017500000000000011503407465023634 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.RawPlusJpeg/FSpot.Tools.RawPlusJpeg/0000777000175000017500000000000011503407465030170 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.RawPlusJpeg/FSpot.Tools.RawPlusJpeg/RawPlusJpeg.cs0000644000175000017500000000663111503404762032721 0ustar00rubenruben00000000000000/* * RawPlusJpeg.cs * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details */ using System; using System.Collections.Generic; using Gtk; using FSpot; using FSpot.Core; using FSpot.UI.Dialog; using FSpot.Extensions; using FSpot.Imaging; using Hyena; using Hyena.Widgets; namespace FSpot.Tools.RawPlusJpeg { public class RawPlusJpeg : ICommand { public void Run (object o, EventArgs e) { Log.Debug ("EXECUTING RAW PLUS JPEG EXTENSION"); if (ResponseType.Ok != HigMessageDialog.RunHigConfirmation ( App.Instance.Organizer.Window, DialogFlags.DestroyWithParent, MessageType.Warning, "Merge Raw+Jpegs", "This operation will merge Raw and Jpegs versions of the same image as one unique image. The Raw image will be the Original version, the jpeg will be named 'Jpeg' and all subsequent versions will keep their original names (if possible).\n\nNote: only enabled for some formats right now.", "Do it now")) return; Photo [] photos = App.Instance.Database.Photos.Query ((Tag [])null, null, null, null); Array.Sort (photos, new IPhotoComparer.CompareDirectory ()); Photo raw = null; Photo jpeg = null; IList merge_requests = new List (); for (int i = 0; i < photos.Length; i++) { Photo p = photos [i]; if (!ImageFile.IsRaw (p.DefaultVersion.Uri) && !ImageFile.IsJpeg (p.DefaultVersion.Uri)) continue; if (ImageFile.IsJpeg (p.DefaultVersion.Uri)) jpeg = p; if (ImageFile.IsRaw (p.DefaultVersion.Uri)) raw = p; if (raw != null && jpeg != null && SamePlaceAndName (raw, jpeg)) merge_requests.Add (new MergeRequest (raw, jpeg)); } if (merge_requests.Count == 0) return; foreach (MergeRequest mr in merge_requests) mr.Merge (); App.Instance.Organizer.UpdateQuery (); } private static bool SamePlaceAndName (Photo p1, Photo p2) { return DirectoryPath (p1) == DirectoryPath (p2) && System.IO.Path.GetFileNameWithoutExtension (p1.Name) == System.IO.Path.GetFileNameWithoutExtension (p2.Name); } private static string DirectoryPath (Photo p) { return p.VersionUri (Photo.OriginalVersionId).GetBaseUri (); } class MergeRequest { Photo raw; Photo jpeg; public MergeRequest (Photo raw, Photo jpeg) { this.raw = raw; this.jpeg = jpeg; } public void Merge () { Log.DebugFormat ("Merging {0} and {1}", raw.VersionUri (Photo.OriginalVersionId), jpeg.VersionUri (Photo.OriginalVersionId)); foreach (uint version_id in jpeg.VersionIds) { string name = jpeg.GetVersion (version_id).Name; try { raw.DefaultVersionId = raw.CreateReparentedVersion (jpeg.GetVersion (version_id) as PhotoVersion, version_id == Photo.OriginalVersionId); if (version_id == Photo.OriginalVersionId) raw.RenameVersion (raw.DefaultVersionId, "Jpeg"); else raw.RenameVersion (raw.DefaultVersionId, name); } catch (Exception e) { Log.Exception (e); } } raw.AddTag (jpeg.Tags); uint [] version_ids = jpeg.VersionIds; Array.Reverse (version_ids); foreach (uint version_id in version_ids) { try { jpeg.DeleteVersion (version_id, true, true); } catch (Exception e) { Log.Exception (e); } } raw.Changes.DataChanged = true; App.Instance.Database.Photos.Commit (raw); App.Instance.Database.Photos.Remove (jpeg); } } } } f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.RawPlusJpeg/Resources/0000777000175000017500000000000011503407465025606 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.RawPlusJpeg/Resources/RawPlusJpeg.addin.xml0000644000175000017500000000100311430555235031575 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.RawPlusJpeg/Makefile.in0000644000175000017500000006664511503407300025702 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Tools/FSpot.Tools.RawPlusJpeg ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Tools.RawPlusJpeg TARGET = library LINK = $(REF_FSPOT_EXTENSION_RAWPLUSJPEG) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Tools.RawPlusJpeg/RawPlusJpeg.cs RESOURCES = Resources/RawPlusJpeg.addin.xml # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Tools/FSpot.Tools.RawPlusJpeg/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Tools/FSpot.Tools.RawPlusJpeg/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.RawPlusJpeg/Makefile.am0000644000175000017500000000041311430555235025660 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Tools.RawPlusJpeg TARGET = library LINK = $(REF_FSPOT_EXTENSION_RAWPLUSJPEG) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = FSpot.Tools.RawPlusJpeg/RawPlusJpeg.cs RESOURCES = Resources/RawPlusJpeg.addin.xml include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/0000777000175000017500000000000011503407464024305 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/FSpot.Tools.LiveWebGallery/0000777000175000017500000000000011503407464031313 5ustar00rubenruben00000000000000PhotoRequestHandler.cs0000644000175000017500000000477611503404762035533 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/FSpot.Tools.LiveWebGallery/* * LiveWebGalleryExtension.PhotoRequestHandler.cs * * Author(s): * Anton Keks * * This is free software. See COPYING for details */ using System; using System.IO; using System.Text; using FSpot; using FSpot.Filters; using FSpot.Utils; using Hyena; namespace FSpot.Tools.LiveWebGallery { public class PhotoRequestHandler : RequestHandler { private LiveWebGalleryStats stats; public PhotoRequestHandler (LiveWebGalleryStats stats) { this.stats = stats; } public override void Handle (string requested, Stream stream) { uint photo_id = uint.Parse (requested); Photo photo = App.Instance.Database.Photos.Get (photo_id); SendImage (photo, stream); } protected virtual void SendImage (Photo photo, Stream stream) { string path = photo.DefaultVersion.Uri.LocalPath; FileInfo file_info = new FileInfo(path); if (!file_info.Exists) { SendError (stream, "404 The file is not on the disk"); return; } FilterSet filters = new FilterSet (); filters.Add (new JpegFilter ()); filters.Add (new ResizeFilter (1600)); using (FilterRequest request = new FilterRequest (photo.DefaultVersion.Uri)) { filters.Convert (request); file_info = new FileInfo (request.Current.LocalPath); SendFile (file_info, photo, stream); } if (stats != null) stats.PhotoViews++; } protected void SendFile (FileInfo file, Photo photo, Stream dest) { stats.BytesSent += (int)file.Length; Log.DebugFormat ("Sending {0}, {1} kb", file.FullName, file.Length / 1024); SendHeadersAndStartContent(dest, "Content-Type: " + MimeTypeForExt (file.Extension), "Content-Length: " + file.Length, "Last-Modified: " + photo.Time.ToString ("r")); using (Stream src = file.OpenRead ()) { byte[] buf = new byte[10240]; int read; while((read = src.Read(buf, 0, buf.Length)) != 0) { dest.Write (buf, 0, read); } } } } public class ThumbnailRequestHandler : PhotoRequestHandler { public ThumbnailRequestHandler (LiveWebGalleryStats stats) : base (stats) {} protected override void SendImage (Photo photo, Stream dest) { Gdk.Pixbuf thumb = XdgThumbnailSpec.LoadThumbnail (photo.DefaultVersion.Uri, ThumbnailSize.Large); byte[] buf = thumb.SaveToBuffer ("png"); SendHeadersAndStartContent(dest, "Content-Type: " + MimeTypeForExt (".png"), "Content-Length: " + buf.Length, "Last-Modified: " + photo.Time.ToString ("r")); dest.Write (buf, 0, buf.Length); } } } ResourceRequestHandler.cs0000644000175000017500000000162511503404762036217 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/FSpot.Tools.LiveWebGallery/* * LiveWebGalleryExtension.ResourceRequestHandler.cs * * Author(s): * Anton Keks * * This is free software. See COPYING for details */ using System; using System.IO; using System.Text; using System.Reflection; using FSpot; namespace FSpot.Tools.LiveWebGallery { public class ResourceRequestHandler : RequestHandler { public override void Handle (string requested, Stream stream) { string resource = requested; using (Stream source = Assembly.GetCallingAssembly ().GetManifestResourceStream (resource)) { string ext = Path.GetExtension (resource); SendHeadersAndStartContent(stream, "Content-Type: " + MimeTypeForExt (ext), "Last-Modified: Fri, 21 Oct 2005 04:58:08 GMT"); // for caching byte[] buf = new byte[10240]; int read; while((read = source.Read(buf, 0, buf.Length)) != 0) { stream.Write (buf, 0, read); } } } } } SimpleWebServer.cs0000644000175000017500000001314711503404762034641 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/FSpot.Tools.LiveWebGallery/* * LiveWebGalleryExtension.SimpleWebServer.cs * * Author(s): * Anton Keks * * This is free software. See COPYING for details */ using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Collections; using System.Collections.Generic; using System.Text; using System.Threading; using FSpot; using FSpot.Extensions; using Hyena; namespace FSpot.Tools.LiveWebGallery { public class SimpleWebServer : IService { private Thread server_thread; private TcpListener listener; private Dictionary handlers = new Dictionary (); private IWebStats stats; public IWebStats Stats { set { stats = value; } } public bool Active { get { return server_thread != null && server_thread.IsAlive; } } public string HostPort { get { string host = Dns.GetHostName (); // TODO: add support for .local hostnames foreach (IPAddress addr in Dns.GetHostAddresses(host)) { if (!IPAddress.IsLoopback (addr)) { host = addr.ToString (); } } return host + ":" + (listener.LocalEndpoint as IPEndPoint).Port; } } public void RegisterHandler (string request_prefix, RequestHandler handler) { handlers.Add (request_prefix, handler); } public bool Start () { try { listener = new TcpListener (IPAddress.Any, 8080); listener.Start (); } catch (SocketException) { // address already in use? choose a random port then listener = new TcpListener (IPAddress.Any, 0); listener.Start (); } server_thread = new Thread (new ThreadStart(ServerLoop)); server_thread.Start (); return true; } public bool Stop () { server_thread.Abort (); server_thread.Join (); listener.Stop (); return true; } public void ServerLoop () { Log.Information ("Listening on " + listener.LocalEndpoint); while (true) { TcpClient client = listener.AcceptTcpClient (); if (client.Connected) { if (stats != null) stats.IncomingRequest ((client.Client.RemoteEndPoint as IPEndPoint).Address); RequestProcessor parser = new RequestProcessor (client, handlers); new Thread (new ThreadStart (parser.Process)).Start (); } } } class RequestProcessor { private TcpClient client; private Dictionary handlers; public RequestProcessor (TcpClient client, Dictionary handlers) { this.client = client; this.handlers = handlers; } public void Process () { using (client) { NetworkStream stream = client.GetStream (); TextReader reader = new StreamReader (stream, Encoding.UTF8); string line = reader.ReadLine (); if (line == null) return; Log.Debug ("Incoming request from " + (client.Client.RemoteEndPoint as IPEndPoint).Address + ": " + line); string request_method = null, request_string = null; int space_pos = line.IndexOf (' '); if (space_pos > 0) { request_method = line.Substring (0, space_pos); request_string = line.Substring (space_pos + 1, line.LastIndexOf (' ') - space_pos - 1); } while (!string.IsNullOrEmpty(line = reader.ReadLine ())) { // process other request headers here if needed } using (stream) { if (!"GET".Equals (request_method)) { RequestHandler.SendError (stream, "400 Bad Request"); return; } if (request_string.StartsWith ("/")) request_string = request_string.Substring (1); string request_prefix = request_string; int slash_pos = request_string.IndexOf ("/"); if (slash_pos >= 0) request_prefix = request_string.Substring (0, slash_pos); if (!handlers.ContainsKey (request_prefix)) { RequestHandler.SendError (stream, "404 No handler for \"" + request_string + "\""); return; } try { handlers[request_prefix].Handle (request_string.Substring (slash_pos+1), stream); } catch (Exception e) { Log.Exception (e); try { RequestHandler.SendError (stream, "500 " + e.Message); } catch (IOException) { // ignore already closed connections } } } } } } } public abstract class RequestHandler { public abstract void Handle (string requested, Stream stream); public static void SendLine (Stream stream, string header) { byte[] buf = Encoding.UTF8.GetBytes (header + "\r\n"); stream.Write (buf, 0, buf.Length); } public static void SendStatus (Stream stream, string status) { SendLine (stream, "HTTP/1.0 " + status + "\r\nServer: F-Spot"); } public static void SendError (Stream stream, string error) { SendStatus (stream, error); StartContent (stream); SendLine (stream, error); } public static void StartContent (Stream stream) { // sends the last empty newline after headers SendLine (stream, ""); } public static void SendHeadersAndStartContent (Stream stream, params string[] headers) { SendStatus (stream, "200 OK"); foreach (string header in headers) { SendLine (stream, header); } StartContent (stream); } public string MimeTypeForExt (string ext) { switch (ext.ToLower ()) { case ".jpg": case ".jpeg": return "image/jpeg"; case ".png": return "image/png"; case ".gif": return "image/gif"; case ".js": return "text/javascript"; case ".css": return "text/css"; default: throw new Exception ("Unknown file type: " + ext); } } } public interface IWebStats { void IncomingRequest (IPAddress addr); } } LiveWebGallery.cs0000644000175000017500000000510011503404762034426 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/FSpot.Tools.LiveWebGallery/* * LiveWebGalleryExtension.LiveWebGallery.cs * * Author(s): * Anton Keks * * This is free software. See COPYING for details */ using System; using System.IO; using System.Net; using System.Collections.Generic; using Gtk; using FSpot; using FSpot.Core; using FSpot.Extensions; using FSpot.Utils; using FSpot.Query; using FSpot.UI.Dialog; using Mono.Unix; namespace FSpot.Tools.LiveWebGallery { public class LiveWebGallery : ICommand { private static SimpleWebServer web_server; private static ILiveWebGalleryOptions options; private static LiveWebGalleryStats stats; private LiveWebGalleryDialog dialog; public LiveWebGallery () { } public void Run (object o, EventArgs e) { if (web_server == null) { stats = new LiveWebGalleryStats (); RequestHandler gallery = new GalleryRequestHandler (stats); options = gallery as ILiveWebGalleryOptions; web_server = new SimpleWebServer (); web_server.Stats = stats; web_server.RegisterHandler ("", gallery); web_server.RegisterHandler ("gallery", gallery); web_server.RegisterHandler ("ui", new ResourceRequestHandler ()); web_server.RegisterHandler ("ping", new PingRequestHandler ()); web_server.RegisterHandler ("photo", new PhotoRequestHandler (stats)); web_server.RegisterHandler ("thumb", new ThumbnailRequestHandler (stats)); web_server.RegisterHandler ("tag", new TagAddRemoveRequestHandler (options)); } dialog = new LiveWebGalleryDialog (web_server, options, stats); dialog.Response += HandleResponse; dialog.ShowAll (); } void HandleResponse (object obj, ResponseArgs args) { dialog.Destroy (); } } public enum QueryType {ByTag, CurrentView, Selected} public interface ILiveWebGalleryOptions { QueryType QueryType {get; set;} Tag QueryTag {get; set;} bool LimitMaxPhotos {get; set;} int MaxPhotos {get; set;} bool TaggingAllowed {get; set;} Tag EditableTag {get; set;} } public class LiveWebGalleryStats : IWebStats { public event EventHandler StatsChanged; private int gallery_views; public int GalleryViews { get { return gallery_views; } set { gallery_views = value; StatsChanged(this, null); } } private int photo_views; public int PhotoViews { get { return photo_views; } set { photo_views = value; StatsChanged(this, null); } } private IPAddress last_ip; public IPAddress LastIP { get { return last_ip; } set { last_ip = value; StatsChanged(this, null); } } public int BytesSent; public void IncomingRequest (IPAddress ip) { LastIP = ip; } } } GalleryRequestHandler.cs0000644000175000017500000001441111503404762036024 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/FSpot.Tools.LiveWebGallery/* * LiveWebGalleryExtension.GalleryRequestHandler.cs * * Author(s): * Anton Keks * * This is free software. See COPYING for details */ using System; using System.IO; using System.Text; using System.Reflection; using FSpot; using FSpot.Core; using Mono.Unix; namespace FSpot.Tools.LiveWebGallery { public abstract class PhotoAwareRequestHandler : RequestHandler { protected string TagsToString (Photo photo) { string tags = ""; foreach (Tag tag in photo.Tags) { tags += ", " + tag.Name; } return tags.Length > 1 ? tags.Substring (2) : tags; } } public abstract class TemplateRequestHandler : PhotoAwareRequestHandler { protected string template; public TemplateRequestHandler (string name) { template = LoadTemplate (name); } protected string GetSubTemplate (StringBuilder s, string begin, string end) { int start_pos = template.IndexOf (begin); string sub = template.Substring (start_pos, template.IndexOf (end, start_pos) - start_pos - 1); s.Replace (sub, ""); return sub.Substring (begin.Length, sub.Length - begin.Length); } protected string LoadTemplate (string name) { using (TextReader s = new StreamReader (Assembly.GetCallingAssembly ().GetManifestResourceStream (name))) { return s.ReadToEnd (); } } protected string Escape (string s) { // javascript-proof return s.Replace ("\"", "\\\""); } } public class GalleryRequestHandler : TemplateRequestHandler, ILiveWebGalleryOptions { private QueryType query_type = QueryType.ByTag; public QueryType QueryType { get { return query_type; } set { query_type = value; } } private Tag query_tag; public Tag QueryTag { get { return query_tag; } set { query_tag = value; } } private bool limit_max_photos = true; public bool LimitMaxPhotos { get { return limit_max_photos; } set { limit_max_photos = value; } } private int max_photos = 1000; public int MaxPhotos { get { return max_photos; } set { max_photos = value; } } private bool tagging_allowed = false; public bool TaggingAllowed { get { return tagging_allowed; } set { tagging_allowed = value; } } private Tag editable_tag; public Tag EditableTag { get { return editable_tag; } set { editable_tag = value; } } private LiveWebGalleryStats stats; public GalleryRequestHandler (LiveWebGalleryStats stats) : base ("gallery.html") { this.stats = stats; template = template.Replace ("TITLE", Catalog.GetString("F-Spot Gallery")); template = template.Replace ("OFFLINE_MESSAGE", Catalog.GetString("The web gallery seems to be offline now")); template = template.Replace ("SHOW_ALL", Catalog.GetString("Show All")); } public override void Handle (string requested, Stream stream) { Photo[] photos = GetChosenPhotos (); StringBuilder s = new StringBuilder (4096); s.Append (template); int num_photos = limit_max_photos ? Math.Min (photos.Length, max_photos) : photos.Length; s.Replace ("NUM_PHOTOS", String.Format(Catalog.GetPluralString("{0} photo", "{0} photos", num_photos), num_photos)); s.Replace ("QUERY_TYPE", QueryTypeToString ()); s.Replace ("EDITABLE_TAG_NAME", tagging_allowed ? Escape (editable_tag.Name) : ""); string photo_template = GetSubTemplate (s, "BEGIN_PHOTO", "END_PHOTO"); StringBuilder photos_s = new StringBuilder (4096); num_photos = 0; foreach (Photo photo in photos) { photos_s.Append (PreparePhoto (photo_template, photo)); if (++num_photos >= max_photos && limit_max_photos) break; } s.Replace ("END_PHOTO", photos_s.ToString ()); SendHeadersAndStartContent(stream, "Content-Type: text/html; charset=UTF-8"); SendLine (stream, s.ToString ()); stats.BytesSent += s.Length; stats.GalleryViews++; } private Photo[] GetChosenPhotos () { switch (query_type) { case QueryType.ByTag: return App.Instance.Database.Photos.Query (new Tag[] {query_tag}); case QueryType.CurrentView: return App.Instance.Organizer.Query.Photos; case QueryType.Selected: default: return App.Instance.Organizer.SelectedPhotos (); } } private string QueryTypeToString () { switch (query_type) { case QueryType.ByTag: return query_tag.Name; case QueryType.CurrentView: return Catalog.GetString ("Current View"); case QueryType.Selected: default: return Catalog.GetString ("Selected"); } } private string PreparePhoto (string template, Photo photo) { string photo_s = template.Replace ("PHOTO_ID", photo.Id.ToString ()) .Replace ("PHOTO_NAME", Escape (photo.Name)) .Replace ("PHOTO_DESCRIPTION", Escape (photo.Description)) .Replace ("VERSION_NAME", Escape (photo.DefaultVersion.Name)); string tags = TagsToString(photo); photo_s = photo_s.Replace ("PHOTO_TAGS", Escape (tags)); return photo_s; } } public class PingRequestHandler : RequestHandler { public override void Handle (string requested, Stream stream) { SendHeadersAndStartContent (stream); } } public class TagAddRemoveRequestHandler : PhotoAwareRequestHandler { private ILiveWebGalleryOptions options; public TagAddRemoveRequestHandler (ILiveWebGalleryOptions options) { this.options = options; } public override void Handle (string requested, Stream stream) { bool addTag = requested.StartsWith ("add"); if (!addTag && !requested.StartsWith ("remove")) { SendError (stream, "400 Bad request " + requested); return; } int slash_pos = requested.IndexOf ('/'); requested = requested.Substring (slash_pos + 1); slash_pos = requested.IndexOf ('/'); uint photo_id = uint.Parse (requested.Substring (0, slash_pos)); string tag_name = requested.Substring (slash_pos + 1); if (!options.TaggingAllowed || !options.EditableTag.Name.Equals (tag_name)) { SendError (stream, "403 Forbidden to change tag " + tag_name); return; } Photo photo = App.Instance.Database.Photos.Get (photo_id); if (addTag) photo.AddTag (options.EditableTag); else photo.RemoveTag (options.EditableTag); App.Instance.Database.Photos.Commit (photo); SendHeadersAndStartContent (stream, "Content-type: text/plain;charset=UTF-8"); SendLine (stream, TagsToString (photo)); } } } LiveWebGalleryDialog.cs0000644000175000017500000001437711503404762035566 0ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/FSpot.Tools.LiveWebGallery/* * LiveWebGalleryExtension.LiveWebGalleryDialog.cs * * Author(s): * Anton Keks * * This is free software. See COPYING for details */ using System; using System.Net; using System.Reflection; using FSpot; using FSpot.Core; using FSpot.Extensions; using FSpot.Query; using Gtk; using Mono.Unix; using Hyena; namespace FSpot.Tools.LiveWebGallery { internal class LiveWebGalleryDialog : FSpot.UI.Dialog.BuilderDialog { [GtkBeans.Builder.Object] Gtk.LinkButton url_button; [GtkBeans.Builder.Object] Gtk.ToggleButton activate_button; [GtkBeans.Builder.Object] Gtk.Button copy_button; [GtkBeans.Builder.Object] Gtk.Label stats_label; [GtkBeans.Builder.Object] Gtk.RadioButton current_view_radio; [GtkBeans.Builder.Object] Gtk.RadioButton tagged_radio; [GtkBeans.Builder.Object] Gtk.RadioButton selected_radio; [GtkBeans.Builder.Object] Gtk.Button tag_button; [GtkBeans.Builder.Object] Gtk.CheckButton limit_checkbox; [GtkBeans.Builder.Object] Gtk.SpinButton limit_spin; [GtkBeans.Builder.Object] Gtk.CheckButton allow_tagging_checkbox; [GtkBeans.Builder.Object] Gtk.Button tag_edit_button; private SimpleWebServer server; private ILiveWebGalleryOptions options; private LiveWebGalleryStats stats; private IPAddress last_ip; private string last_client; public LiveWebGalleryDialog (SimpleWebServer server, ILiveWebGalleryOptions options, LiveWebGalleryStats stats) : base (Assembly.GetExecutingAssembly (), "LiveWebGallery.ui", "live_web_gallery_dialog") { this.server = server; this.options = options; this.stats = stats; Modal = false; activate_button.Active = server.Active; UpdateGalleryURL (); limit_checkbox.Active = options.LimitMaxPhotos; limit_spin.Sensitive = options.LimitMaxPhotos; limit_spin.Value = options.MaxPhotos; UpdateQueryRadios (); HandleQueryTagSelected (options.QueryTag != null ? options.QueryTag : App.Instance.Database.Tags.GetTagById(1)); allow_tagging_checkbox.Active = options.TaggingAllowed; tag_edit_button.Sensitive = options.TaggingAllowed; HandleEditableTagSelected (options.EditableTag != null ? options.EditableTag : App.Instance.Database.Tags.GetTagById(3)); HandleStatsChanged (null, null); activate_button.Toggled += HandleActivated; copy_button.Clicked +=HandleCopyClicked; current_view_radio.Toggled += HandleRadioChanged; tagged_radio.Toggled += HandleRadioChanged; selected_radio.Toggled += HandleRadioChanged; tag_button.Clicked += HandleQueryTagClicked; limit_checkbox.Toggled += HandleLimitToggled; limit_spin.ValueChanged += HandleLimitValueChanged; allow_tagging_checkbox.Toggled += HandleAllowTaggingToggled; tag_edit_button.Clicked += HandleTagForEditClicked; stats.StatsChanged += HandleStatsChanged; } void HandleCopyClicked(object sender, EventArgs e) { Clipboard.Get(Gdk.Atom.Intern("CLIPBOARD", true)).Text = url_button.Uri; } void HandleStatsChanged (object sender, EventArgs e) { ThreadAssist.ProxyToMain (() => { if (last_ip == null || !last_ip.Equals (stats.LastIP)) { last_ip = stats.LastIP; try { last_client = Dns.GetHostEntry (last_ip).HostName; } catch (Exception) { last_client = last_ip != null ? last_ip.ToString () : Catalog.GetString ("none"); } } stats_label.Text = string.Format(Catalog.GetString (" Gallery: {0}, Photos: {1}, Last client: {3}"), stats.GalleryViews, stats.PhotoViews, stats.BytesSent / 1024, last_client); }); } void HandleLimitToggled (object sender, EventArgs e) { options.LimitMaxPhotos = limit_checkbox.Active; limit_spin.Sensitive = limit_checkbox.Active; HandleLimitValueChanged (sender, e); } void HandleLimitValueChanged (object sender, EventArgs e) { options.MaxPhotos = limit_spin.ValueAsInt; } void HandleRadioChanged (object o, EventArgs e) { tag_button.Sensitive = tagged_radio.Active; if (tagged_radio.Active) options.QueryType = QueryType.ByTag; else if (current_view_radio.Active) options.QueryType = QueryType.CurrentView; else options.QueryType = QueryType.Selected; } void UpdateQueryRadios () { switch (options.QueryType) { case QueryType.ByTag: tagged_radio.Active = true; break; case QueryType.CurrentView: current_view_radio.Active = true; break; case QueryType.Selected: default: selected_radio.Active = true; break; } HandleRadioChanged (null, null); } void HandleActivated (object o, EventArgs e) { if (activate_button.Active) server.Start (); else server.Stop (); UpdateGalleryURL (); } void UpdateGalleryURL () { url_button.Sensitive = server.Active; copy_button.Sensitive = server.Active; if (server.Active) { url_button.Uri = "http://" + server.HostPort; url_button.Label = url_button.Uri; } else { url_button.Label = Catalog.GetString ("Gallery is inactive"); } } void ShowTagMenuFor (Widget widget, TagMenu.TagSelectedHandler handler) { TagMenu tag_menu = new TagMenu (null, App.Instance.Database.Tags); tag_menu.TagSelected += handler; tag_menu.Populate (); int x, y; GetPosition (out x, out y); x += widget.Allocation.X; y += widget.Allocation.Y; tag_menu.Popup (null, null, delegate (Menu menu, out int x_, out int y_, out bool push_in) {x_ = x; y_ = y; push_in = true;}, 0, 0); } void HandleQueryTagClicked (object sender, EventArgs e) { ShowTagMenuFor (tag_button, HandleQueryTagSelected); } void HandleQueryTagSelected (Tag tag) { options.QueryTag = tag; tag_button.Label = tag.Name; tag_button.Image = tag.Icon != null ? new Gtk.Image (PixbufUtils.ScaleDown (tag.Icon, 16, 16)) : null; } void HandleAllowTaggingToggled (object sender, EventArgs e) { tag_edit_button.Sensitive = allow_tagging_checkbox.Active; options.TaggingAllowed = allow_tagging_checkbox.Active; } void HandleTagForEditClicked (object sender, EventArgs e) { ShowTagMenuFor (tag_edit_button, HandleEditableTagSelected); } void HandleEditableTagSelected (Tag tag) { options.EditableTag = tag; tag_edit_button.Label = tag.Name; tag_edit_button.Image = tag.Icon != null ? new Gtk.Image (PixbufUtils.ScaleDown (tag.Icon, 16, 16)) : null; } } } f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/Resources/0000777000175000017500000000000011503407464026257 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/Resources/LiveWebGallery.addin.xml0000644000175000017500000000110611430555235032725 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/Resources/ui/0000777000175000017500000000000011503407464026674 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/Resources/ui/LiveWebGallery.ui0000644000175000017500000004022111430555235032102 0ustar00rubenruben00000000000000 5 F-Spot Live Web Gallery center-on-parent dialog False True 2 True 2 9 4 6 6 Selected Photos True True False True current_view_radio 1 3 4 5 Photos with a Tag True True False True current_view_radio 1 2 2 3 Current View True True False True True 1 3 3 4 True 1 Share: 2 3 GTK_FILL True 0 <small><i>When the gallery is active, above is the URL you need to open on another computer to access the shared photos.</i></small> True 1 4 1 2 6 True 1 Gallery URL: GTK_FILL True False True True True none 1 2 True True True True True Activates and deactivates the web gallery activate_image 3 4 True True 4 limit_spin_adjustment 25 True 3 4 5 6 Allow viewers to add tags True True False True 1 2 6 7 True 1 Options: right 5 6 Limit number of shared photos to True True False True 1 3 5 6 True 0 1 <small><i>The gallery stays active until you either deactivate it or close F-Spot. Make sure local viewers access it bypassing HTTP proxy.</i></small> True 1 4 8 9 True False True True True 2 4 2 3 True 0 True 1 4 7 8 True 1 Views: 7 8 20 True True True Copy URL to clipboard copy_image 2 3 True False True True True 2 4 6 7 1 True end gtk-close True True True True False False 0 False end 0 close_button True gtk-connect 99999 5 50 50 True gtk-copy f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/Resources/ui/f-spot.js0000644000175000017500000001350311430555235030437 0ustar00rubenruben00000000000000/* * F-Spot Web Sharing Gallery Scripts * Author: Anton Keks */ var photos; var missing_thumbs; var thumb_size = screen.width <= 1280 ? 160 : screen.width <= 1600 ? 192 : 224; var current_photo_id; var editable_tag; function $(id) { return document.getElementById(id); } function generateThumbs() { missing_thumbs = {}; var html = ''; var prev_id = null; for (var id in photos) { if (prev_id) photos[prev_id].next_id = id; photos[id].prev_id = prev_id; prev_id = id; missing_thumbs[id] = true; html += '' + photos[id].name + ''; } document.getElementById('thumbs').innerHTML = html; } function loadThumb(img) { img.src = img.id.replace(/thumb_/, '/thumb/'); } function changeClass(img) { if (img.height > img.width) img.className = 'vertical'; } function loadVisibleThumbs() { var visibleTop, visibleBottom; if (window.innerHeight) { visibleTop = window.pageYOffset; visibleBottom = visibleTop + window.innerHeight; } else if (document.documentElement) { visibleTop = document.documentElement.scrollTop; visibleBottom = visibleTop + document.documentElement.clientHeight; } visibleTop -= 128; visibleBottom += 128; for (var id in missing_thumbs) { var img = $('thumb_' + id); if (img.offsetTop >= visibleTop && img.offsetTop <= visibleBottom) { loadThumb(img); delete missing_thumbs[id]; } } } function largerThumbs() { switch (thumb_size) { case 128: thumb_size = 160; break; case 160: thumb_size = 192; break; case 192: thumb_size = 224; break; default: thumb_size = 256; } resizeThumbs(); } function smallerThumbs() { switch (thumb_size) { case 256: thumb_size = 224; break; case 224: thumb_size = 192; break; case 192: thumb_size = 160; break; default: thumb_size = 128; } resizeThumbs(); } function resizeThumbs() { var cssRules = document.styleSheets[0].cssRules; if (!cssRules) cssRules = document.styleSheets[0].rules; // div.thumbs img.horizontal cssRules[3].style.width = thumb_size + 'px'; // div.thumbs img.vertical cssRules[4].style.height = thumb_size + 'px'; // div.thumbs a cssRules[5].style.width = cssRules[5].style.height = cssRules[5].style.lineHeight = (thumb_size + 5) + 'px'; loadVisibleThumbs(); } function scalePhoto(event) { var vHeight, vWidth; if (window.innerHeight) { vHeight = window.innerHeight; vWidth = window.innerWidth; } else if (document.documentElement) { vHeight = document.documentElement.clientHeight; vWidth = document.documentElement.clientWidth; } vHeight -= 100; vWidth -= 50; var img = $('photo_img'); if (img.width > vWidth || img.height > vHeight || (event && event.type == 'resize')) { if (vWidth / vHeight > img.width / img.height) img.height = vHeight; else img.width = vWidth; } img.style.display = 'inline'; } function showThumbs() { $('photo').style.display = 'none'; $('thumbs').style.display = 'block'; $('navi_photo').style.display = 'none'; $('navi_thumbs').style.display = 'block'; $('photo_img').src = 'ui/empty.png'; window.onresize = window.onscroll = loadVisibleThumbs; window.onkeydown = null; loadVisibleThumbs(); if (current_photo_id) window.scroll(0, $('thumb_' + current_photo_id).offsetTop - 150); } function showPhoto(id) { current_photo_id = id; var photo = photos[id]; $('thumbs').style.display = 'none'; $('navi_photo').style.display = 'inline'; $('navi_thumbs').style.display = 'none'; $('description').innerHTML = photo.description; showPhotoTags(photo); var img = $('photo_img'); img.style.display = 'none'; img.removeAttribute("width"); img.removeAttribute("height"); img.src = '/photo/' + id; img.title = photo.name + ' (' + photo.version + ')'; $('photo').style.display = 'block'; window.onresize = scalePhoto; window.onscroll = null; window.onkeydown = handleKeys; if (photo.next_id) { var preload = new Image(); preload.src = '/photo/' + photo.next_id; } } function nextPhoto() { var next_id = photos[current_photo_id].next_id; if (next_id) showPhoto(next_id); } function prevPhoto() { var prev_id = photos[current_photo_id].prev_id; if (prev_id) showPhoto(prev_id); } function handleKeys(e) { switch (e.keyCode) { case 27 /* esc */: showThumbs(); return true; case 37 /* left */: prevPhoto(); return true; case 39 /* right */: nextPhoto(); return true; } } function showPhotoTags(photo) { $('tags').innerHTML = photo.tags; if (editable_tag) { $('edit_tag').innerHTML = "" + (hasTag(editable_tag) ? "-" : "+") + " " + editable_tag; } } function hasTag(tag_name) { var tags = photos[current_photo_id].tags; var pos = tags.indexOf(editable_tag); var end = pos + editable_tag.length; return pos >= 0 && (pos == 0 || tags.charAt(pos-1) == ' ') && (end == tags.length || tags.charAt(end) == ','); } function addRemoveTag() { if (!editable_tag) return; var http = new XMLHttpRequest(); http.open('GET', '/tag/' + (hasTag(editable_tag) ? "remove" : "add") + "/" + current_photo_id + "/" + editable_tag); http.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { photos[current_photo_id].tags = this.responseText.replace(/[\r\n]/g, ""); showPhotoTags(photos[current_photo_id]); } else if (this.readyState == 4 && this.status != 200) { alert("Failed to update tags, Gallery is inactive?"); } }; http.send(""); } function galleryPing() { var http = new XMLHttpRequest(); http.open('GET', '/ping'); http.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { setTimeout(galleryPing, 5000); } else if (this.readyState == 4 && this.status != 200) { $('title').style.display = 'none'; $('offline').style.display = 'block'; } }; http.send(""); } setTimeout(galleryPing, 10000); f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/Resources/ui/f-spot.css0000644000175000017500000000363411430555235030617 0ustar00rubenruben00000000000000/* * F-Spot Web Sharing Gallery Stylesheet * Author: Anton Keks */ body { font-family: luxi sans, trebuchet ms, sans-serif; color: #888; background-color: #3c3c3c; margin: 0; } .header { position: fixed; top: 0; width: 100%; padding: 10px; font-size: 14px; color: black; background-color: #BBBBBB; text-align: center; opacity: 0.8; filter: alpha(opacity=80); margin-left: -12px; } div.thumbs { margin: 50px 12px 12px 12px; clear: both; padding: 6px; text-align: center; } div.thumbs img.horizontal { width: 256px; } div.thumbs img.vertical { height: 256px; } div.thumbs a { margin: 2px; padding: 8px; display: block; float: left; width: 260px; height: 260px; line-height: 260px; background-color: #333333; -moz-border-radius: 10px; -webkit-border-radius: 10px; } div.thumbs a:hover { background-color: #444444; } div.thumbs img, div.photo img { vertical-align: middle; padding: 1px; border: 1px solid #AAAAAA; } #navi_photo { position: absolute; left: 10px; } #navi_thumbs { position: absolute; right: 20px; } .navi a { float: left; border: 1px solid #444444; display: block; height: 1.4em; margin-left: 10px; text-align: center; padding-top: 1px; padding-left: 12px; padding-right: 12px; color: #000000; -moz-border-radius: 3px; -webkit-border-radius: 4px; } .navi a:hover { text-decoration: none; background-color: #FEFEFE; color: #000000; } #title, #offline { font-weight: bold; margin: 0; padding: 0; margin-left: 3px; font-size: large; letter-spacing: .3em; } #offline { color: red; } a { text-decoration: none; color: #000000; } div.photo { text-align: center; vertical-align: middle; margin-top: 60px; margin-bottom: 60px; } div.photo a { color: #AAAAAA; display: inline; float: none; } div.photo a:hover { text-decoration: underline; text-color: #FEFEFE; } f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/Resources/ui/gallery.html0000644000175000017500000000305211430555235031214 0ustar00rubenruben00000000000000 TITLE
F-Spot - QUERY_TYPE - NUM_PHOTOS
f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/Resources/ui/empty.png0000644000175000017500000000024711430555235030536 0ustar00rubenruben00000000000000‰PNG  IHDR@@ªiqÞsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÙ"a¹G'IDATxÚíÁ  ÷Om7 €w@@¯zèIEND®B`‚f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/Makefile.in0000644000175000017500000006753611503407276026370 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Tools/FSpot.Tools.LiveWebGallery ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Tools.LiveWebGallery TARGET = library LINK = $(REF_FSPOT_EXTENSION_LIVEWEBGALLERY) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Tools.LiveWebGallery/GalleryRequestHandler.cs \ FSpot.Tools.LiveWebGallery/LiveWebGallery.cs \ FSpot.Tools.LiveWebGallery/LiveWebGalleryDialog.cs \ FSpot.Tools.LiveWebGallery/PhotoRequestHandler.cs \ FSpot.Tools.LiveWebGallery/ResourceRequestHandler.cs \ FSpot.Tools.LiveWebGallery/SimpleWebServer.cs RESOURCES = \ Resources/LiveWebGallery.addin.xml \ Resources/ui/empty.png \ Resources/ui/f-spot.css \ Resources/ui/f-spot.js \ Resources/ui/gallery.html \ Resources/ui/LiveWebGallery.ui # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Tools/FSpot.Tools.LiveWebGallery/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Tools/FSpot.Tools.LiveWebGallery/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.LiveWebGallery/Makefile.am0000644000175000017500000000127311430555235026337 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Tools.LiveWebGallery TARGET = library LINK = $(REF_FSPOT_EXTENSION_LIVEWEBGALLERY) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Tools.LiveWebGallery/GalleryRequestHandler.cs \ FSpot.Tools.LiveWebGallery/LiveWebGallery.cs \ FSpot.Tools.LiveWebGallery/LiveWebGalleryDialog.cs \ FSpot.Tools.LiveWebGallery/PhotoRequestHandler.cs \ FSpot.Tools.LiveWebGallery/ResourceRequestHandler.cs \ FSpot.Tools.LiveWebGallery/SimpleWebServer.cs RESOURCES = \ Resources/LiveWebGallery.addin.xml \ Resources/ui/empty.png \ Resources/ui/f-spot.css \ Resources/ui/f-spot.js \ Resources/ui/gallery.html \ Resources/ui/LiveWebGallery.ui include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.MergeDb/0000777000175000017500000000000011503407464022735 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.MergeDb/FSpot.Tools.MergeDb/0000777000175000017500000000000011503407464026373 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.MergeDb/FSpot.Tools.MergeDb/MergeDbDialog.cs0000644000175000017500000000522411503404762031344 0ustar00rubenruben00000000000000/* * FSpot.MergeDbDialog.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details */ using System; using FSpot; using FSpot.Core; using FSpot.Query; namespace FSpot.Tools.MergeDb { internal class MergeDbDialog { [GtkBeans.Builder.Object] Gtk.Dialog mergedb_dialog; [GtkBeans.Builder.Object] Gtk.Button apply_button; [GtkBeans.Builder.Object] Gtk.FileChooserButton db_filechooser; [GtkBeans.Builder.Object] Gtk.RadioButton newrolls_radio; [GtkBeans.Builder.Object] Gtk.RadioButton allrolls_radio; [GtkBeans.Builder.Object] Gtk.RadioButton singleroll_radio; [GtkBeans.Builder.Object] Gtk.ComboBox rolls_combo; [GtkBeans.Builder.Object] Gtk.RadioButton copy_radio; [GtkBeans.Builder.Object] Gtk.RadioButton keep_radio; MergeDb parent; public event EventHandler FileSet; public MergeDbDialog (MergeDb parent) { this.parent = parent; var builder = new GtkBeans.Builder (null, "mergedb_dialog.ui", null); builder.Autoconnect (this); mergedb_dialog.Modal = false; mergedb_dialog.TransientFor = null; db_filechooser.LocalOnly = false; db_filechooser.FileSet += OnFileSet; newrolls_radio.Toggled += HandleRollsChanged; allrolls_radio.Toggled += HandleRollsChanged; singleroll_radio.Toggled += HandleRollsChanged; } void HandleRollsChanged (object o, EventArgs e) { rolls_combo.Sensitive = singleroll_radio.Active; } public Gtk.FileChooserButton FileChooser { get { return db_filechooser; } } Roll [] rolls; public Roll [] Rolls { get { return rolls; } set { rolls = value; foreach (Roll r in rolls) { uint numphotos = parent.FromDb.Rolls.PhotosInRoll (r); // Roll time is in UTC always DateTime date = r.Time.ToLocalTime (); rolls_combo.AppendText (String.Format ("{0} ({1})", date.ToString("%dd %MMM, %HH:%mm"), numphotos)); rolls_combo.Active = 0; } } } public Roll [] ActiveRolls { get { if (allrolls_radio.Active) return null; if (newrolls_radio.Active) return rolls; else return new Roll [] {rolls [rolls_combo.Active]}; } } public bool Copy { get { return copy_radio.Active; } } public void OnFileSet (object o, EventArgs e) { if (FileSet != null) FileSet (o, e); } public void SetSensitive () { newrolls_radio.Sensitive = true; allrolls_radio.Sensitive = true; singleroll_radio.Sensitive = true; apply_button.Sensitive = true; copy_radio.Sensitive = true; keep_radio.Sensitive = true; } public Gtk.Dialog Dialog { get { return mergedb_dialog; } } public void ShowAll () { mergedb_dialog.ShowAll (); } } } f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.MergeDb/FSpot.Tools.MergeDb/PickFolderDialog.cs0000644000175000017500000000242711503404762032063 0ustar00rubenruben00000000000000/* * FSpot.PickFolderDialog.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details */ using System; using FSpot; using FSpot.Query; using Mono.Unix; using Hyena; namespace FSpot.Tools.MergeDb { internal class PickFolderDialog { [GtkBeans.Builder.Object] Gtk.Dialog pickfolder_dialog; [GtkBeans.Builder.Object] Gtk.FileChooserWidget pickfolder_chooser; [GtkBeans.Builder.Object] Gtk.Label pickfolder_label; public PickFolderDialog (Gtk.Dialog parent, string folder) { var builder = new GtkBeans.Builder (null, "pickfolder_dialog.ui", null); builder.Autoconnect (this); Log.Debug ("new pickfolder"); pickfolder_dialog.Modal = false; pickfolder_dialog.TransientFor = parent; pickfolder_chooser.LocalOnly = false; pickfolder_label.Text = String.Format (Catalog.GetString ("The database refers to files contained in the {0} folder.\n Please select that folder so I can do the mapping."), folder); pickfolder_label.UseMarkup = true; } public string Run () { pickfolder_dialog.ShowAll (); if (pickfolder_dialog.Run () == -6) return pickfolder_chooser.Filename; else return null; } public Gtk.Dialog Dialog { get { return pickfolder_dialog; } } } } f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.MergeDb/FSpot.Tools.MergeDb/MergeDb.cs0000644000175000017500000002174211503404762030227 0ustar00rubenruben00000000000000/* * FSpot.MergeDb.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details */ using System; using System.IO; using System.Collections.Generic; using Gtk; using FSpot; using FSpot.Core; using FSpot.Database; using FSpot.Extensions; using FSpot.Query; using FSpot.UI.Dialog; using Mono.Unix; using Hyena; using Hyena.Widgets; namespace FSpot.Tools.MergeDb { public class MergeDb : ICommand { Db from_db; Db to_db; Roll [] new_rolls; MergeDbDialog mdd; Dictionary tag_map; //Key is a TagId from from_db, Value is a Tag from to_db Dictionary roll_map; public void Run (object o, EventArgs e) { from_db = new Db (); to_db = App.Instance.Database; //ShowDialog (); mdd = new MergeDbDialog (this); mdd.FileChooser.FileSet += HandleFileSet; mdd.Dialog.Response += HandleResponse; mdd.ShowAll (); } internal Db FromDb { get { return from_db; } } void HandleFileSet (object o, EventArgs e) { try { string tempfilename = System.IO.Path.GetTempFileName (); System.IO.File.Copy (mdd.FileChooser.Filename, tempfilename, true); from_db.Init (tempfilename, true); FillRolls (); mdd.Rolls = new_rolls; mdd.SetSensitive (); } catch (Exception ex) { string msg = Catalog.GetString ("Error opening the selected file"); string desc = String.Format (Catalog.GetString ("The file you selected is not a valid or supported database.\n\nReceived exception \"{0}\"."), ex.Message); HigMessageDialog md = new HigMessageDialog (mdd.Dialog, DialogFlags.DestroyWithParent, Gtk.MessageType.Error, ButtonsType.Ok, msg, desc); md.Run (); md.Destroy (); Log.Exception (ex); } } void FillRolls () { List from_rolls = new List (from_db.Rolls.GetRolls ()); Roll [] to_rolls = to_db.Rolls.GetRolls (); foreach (Roll tr in to_rolls) foreach (Roll fr in from_rolls.ToArray ()) if (tr.Time == fr.Time) from_rolls.Remove (fr); new_rolls = from_rolls.ToArray (); } void HandleResponse (object obj, ResponseArgs args) { if (args.ResponseId == ResponseType.Accept) { PhotoQuery query = new PhotoQuery (from_db.Photos); query.RollSet = mdd.ActiveRolls == null ? null : new RollSet (mdd.ActiveRolls); DoMerge (query, mdd.ActiveRolls, mdd.Copy); } mdd.Dialog.Destroy (); } public static void Merge (string path, Db to_db) { Log.WarningFormat ("Will merge db {0} into main f-spot db {1}", path, FSpot.Core.Global.BaseDirectory + "/photos.db" ); Db from_db = new Db (); from_db.Init (path, true); //MergeDb mdb = new MergeDb (from_db, to_db); } void DoMerge (PhotoQuery query, Roll [] rolls, bool copy) { tag_map = new Dictionary (); roll_map = new Dictionary (); Log.Warning ("Merging tags"); MergeTags (from_db.Tags.RootCategory); Log.Warning ("Creating the rolls"); CreateRolls (rolls); Log.Warning ("Importing photos"); ImportPhotos (query, copy); } void MergeTags (Tag tag_to_merge) { TagStore from_store = from_db.Tags; TagStore to_store = to_db.Tags; if (tag_to_merge != from_store.RootCategory) { //Do not merge RootCategory Tag dest_tag = to_store.GetTagByName (tag_to_merge.Name); if (dest_tag == null) { Category parent = (tag_to_merge.Category == from_store.RootCategory) ? to_store.RootCategory : to_store.GetTagByName (tag_to_merge.Category.Name) as Category; dest_tag = to_store.CreateTag (parent, tag_to_merge.Name, false); //FIXME: copy the tag icon and commit } tag_map [tag_to_merge.Id] = dest_tag; } if (!(tag_to_merge is Category)) return; foreach (Tag t in (tag_to_merge as Category).Children) MergeTags (t); } void CreateRolls (Roll [] rolls) { if (rolls == null) rolls = from_db.Rolls.GetRolls (); RollStore from_store = from_db.Rolls; RollStore to_store = to_db.Rolls; foreach (Roll roll in rolls) { if (from_store.PhotosInRoll (roll) == 0) continue; roll_map [roll.Id] = (to_store.Create (roll.Time).Id); } } void ImportPhotos (PhotoQuery query, bool copy) { foreach (Photo p in query.Photos) ImportPhoto (p, copy); } Dictionary path_map = null; Dictionary PathMap { get { if (path_map == null) path_map = new Dictionary (); return path_map; } } void ImportPhoto (Photo photo, bool copy) { Log.WarningFormat ("Importing {0}", photo.Name); PhotoStore to_store = to_db.Photos; string photo_path = photo.VersionUri (Photo.OriginalVersionId).AbsolutePath; while (!System.IO.File.Exists (photo_path)) { Log.Debug ("Not found, trying the mappings..."); foreach (string key in PathMap.Keys) { string path = photo_path; path = path.Replace (key, PathMap [key]); Log.DebugFormat ("Replaced path {0}", path); if (System.IO.File.Exists (path)) { photo_path = path; break;; } } if (System.IO.File.Exists (photo_path)) { Log.Debug ("Exists!!!"); continue; } string [] parts = photo_path.Split (new char[] {'/'}); if (parts.Length > 6) { string folder = String.Join ("/", parts, 0, parts.Length - 4); PickFolderDialog pfd = new PickFolderDialog (mdd.Dialog, folder); string new_folder = pfd.Run (); pfd.Dialog.Destroy (); if (new_folder == null) //Skip return; Log.DebugFormat ("{0} maps to {1}", folder, new_folder); PathMap[folder] = new_folder; } else Log.Debug ("point me to the file"); Log.DebugFormat ("FNF: {0}", photo_path); } string destination; Photo newp; if (copy) destination = FindImportDestination (new SafeUri (photo_path), photo.Time).AbsolutePath; else destination = photo_path; var dest_uri = new SafeUri (photo_path); photo.DefaultVersionId = 1; photo.DefaultVersion.Uri = dest_uri; if (photo.DefaultVersion.ImportMD5 == String.Empty) { (photo.DefaultVersion as PhotoVersion).ImportMD5 = HashUtils.GenerateMD5 (photo.DefaultVersion.Uri); } if (photo_path != destination) { System.IO.File.Copy (photo_path, destination); try { File.SetAttributes (destination, File.GetAttributes (destination) & ~FileAttributes.ReadOnly); DateTime create = File.GetCreationTime (photo_path); File.SetCreationTime (destination, create); DateTime mod = File.GetLastWriteTime (photo_path); File.SetLastWriteTime (destination, mod); } catch (IOException) { // we don't want an exception here to be fatal. } } newp = to_store.CreateFrom (photo, roll_map [photo.RollId]); if (newp == null) return; foreach (Tag t in photo.Tags) { Log.WarningFormat ("Tagging with {0}", t.Name); newp.AddTag (tag_map [t.Id]); } foreach (uint version_id in photo.VersionIds) if (version_id != Photo.OriginalVersionId) { PhotoVersion version = photo.GetVersion (version_id) as PhotoVersion; uint newv = newp.AddVersion (version.BaseUri, version.Filename, version.Name, version.IsProtected); if (version_id == photo.DefaultVersionId) newp.DefaultVersionId = newv; } //FIXME Import extra info (time, description, rating) newp.Time = photo.Time; newp.Description = photo.Description; newp.Rating = photo.Rating; to_store.Commit (newp); } SafeUri FindImportDestination (SafeUri uri, DateTime time) { // Find a new unique location inside the photo folder string name = uri.GetFilename (); var dest_uri = FSpot.Core.Global.PhotoUri.Append (time.Year.ToString ()) .Append (String.Format ("{0:D2}", time.Month)) .Append (String.Format ("{0:D2}", time.Day)); EnsureDirectory (dest_uri); // If the destination we'd like to use is the file itself return that if (dest_uri.Append (name) == uri) return uri; // Find an unused name int i = 1; var dest = dest_uri.Append (name); var file = GLib.FileFactory.NewForUri (dest); while (file.Exists) { var filename = uri.GetFilenameWithoutExtension (); var extension = uri.GetExtension (); dest = dest_uri.Append (String.Format ("{0}-{1}{2}", filename, i++, extension)); file = GLib.FileFactory.NewForUri (dest); } return dest; } void EnsureDirectory (SafeUri uri) { var parts = uri.AbsolutePath.Split('/'); SafeUri current = new SafeUri (uri.Scheme + ":///", true); for (int i = 0; i < parts.Length; i++) { current = current.Append (parts [i]); var file = GLib.FileFactory.NewForUri (current); if (!file.Exists) { file.MakeDirectory (null); } } } } } f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.MergeDb/Resources/0000777000175000017500000000000011503407464024707 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.MergeDb/Resources/pickfolder_dialog.ui0000644000175000017500000001027311441732537030711 0ustar00rubenruben00000000000000 5 center-on-parent 736 575 dialog False True vertical 2 True vertical True 0 12 True False False 0 True False select-folder False False True 1 1 True end Skip True True True False False 0 gtk-ok True True True True False False 1 False end 0 button2 button1 f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.MergeDb/Resources/MergeDb.addin.xml0000644000175000017500000000073511430555235030014 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.MergeDb/Resources/mergedb_dialog.ui0000644000175000017500000003251211441732537030174 0ustar00rubenruben00000000000000 5 Merge another F-Spot collection center-on-parent dialog False True 2 True 9 3 6 6 True 1 <small><i>Copy the images locally or keep them where they are. If you chose the later, be sure that this location will stay accessible from f-spot.</i></small> True True end 1 3 8 9 Keep the images at their original location True False True False True copy_radio 3 7 8 Copy images to photos folder True False True False True True 3 6 7 True 1 <small><i>Choose what to import from the selected db. "New Rolls Only" is the smart option that will avoid re-importing photos you could have imported during a previous operation. "A Single Import Roll" let you choose which roll you want to merge back. "Everything" will import everything, creating duplicates if you already imported from that database.</i></small> True True end 1 3 5 6 6 True False liststore1 0 2 3 3 4 Everything True False True False True newrolls_radio 1 3 4 5 A Single Import Roll True False True False True newrolls_radio 1 2 3 4 New Rolls Only True False True False True True 1 3 2 3 True 1 Import: 2 3 GTK_FILL True 1 <small><i>Choose the location of the database you want to import from</i></small> True 1 3 1 2 6 True 1 3 True 1 Database Location: GTK_FILL 1 True end gtk-cancel True True True True False False 0 gtk-ok True False True True True False False 1 False end 0 cancel_button apply_button f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.MergeDb/Makefile.in0000644000175000017500000006704111503407277025010 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Extensions/Tools/FSpot.Tools.MergeDb ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = FSpot.Tools.MergeDb TARGET = library LINK = $(REF_FSPOT_EXTENSION_MERGEDB) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Tools.MergeDb/MergeDb.cs \ FSpot.Tools.MergeDb/MergeDbDialog.cs \ FSpot.Tools.MergeDb/PickFolderDialog.cs RESOURCES = \ Resources/MergeDb.addin.xml \ Resources/mergedb_dialog.ui \ Resources/pickfolder_dialog.ui # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Tools/FSpot.Tools.MergeDb/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Tools/FSpot.Tools.MergeDb/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Tools/FSpot.Tools.MergeDb/Makefile.am0000644000175000017500000000062311441732537024771 0ustar00rubenruben00000000000000ASSEMBLY = FSpot.Tools.MergeDb TARGET = library LINK = $(REF_FSPOT_EXTENSION_MERGEDB) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ FSpot.Tools.MergeDb/MergeDb.cs \ FSpot.Tools.MergeDb/MergeDbDialog.cs \ FSpot.Tools.MergeDb/PickFolderDialog.cs RESOURCES = \ Resources/MergeDb.addin.xml \ Resources/mergedb_dialog.ui \ Resources/pickfolder_dialog.ui include $(top_srcdir)/build/build.mk f-spot-0.8.2/src/Extensions/Tools/Makefile.in0000644000175000017500000005230511503407302021334 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/Extensions/Tools DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = \ FSpot.Tools.ChangePhotoPath \ FSpot.Tools.DevelopInUFraw \ FSpot.Tools.LiveWebGallery \ FSpot.Tools.MergeDb \ FSpot.Tools.RawPlusJpeg \ FSpot.Tools.RetroactiveRoll \ FSpot.Tools.ScreensaverConfig all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Tools/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Tools/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Tools/Makefile.am0000644000175000017500000000034111443366215021326 0ustar00rubenruben00000000000000SUBDIRS = \ FSpot.Tools.ChangePhotoPath \ FSpot.Tools.DevelopInUFraw \ FSpot.Tools.LiveWebGallery \ FSpot.Tools.MergeDb \ FSpot.Tools.RawPlusJpeg \ FSpot.Tools.RetroactiveRoll \ FSpot.Tools.ScreensaverConfig f-spot-0.8.2/src/Extensions/Makefile.in0000644000175000017500000005202311503407273020240 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/Extensions DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = \ Editors \ Exporters \ Tools \ Transitions all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Extensions/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Extensions/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Extensions/Makefile.am0000644000175000017500000000010111430555235020216 0ustar00rubenruben00000000000000SUBDIRS = \ Editors \ Exporters \ Tools \ Transitions f-spot-0.8.2/src/AssemblyInfo.cs.in0000644000175000017500000000354211430555234017365 0ustar00rubenruben00000000000000using System; using System.Reflection; using System.Runtime.CompilerServices; [assembly: ApplicationVersion ("@VERSION@", "@DISPLAY_VERSION@")] [assembly: ApplicationBuildInformation ("@BUILD_VENDOR_ID@", "@BUILD_HOST_OS@", "@BUILD_HOST_CPU@", "@BUILD_TIME@")] [assembly: AssemblyVersion ("@ASM_VERSION@")] [assembly: AssemblyTitle ("F-Spot")] [assembly: AssemblyDescription ("Personal photo management for the GNOME Desktop")] [assembly: AssemblyCopyright ("Copyright (C) 2003-2010 Novell Inc. and others")] [assembly: AssemblyCompany ("Novell, Inc.")] [AttributeUsage (AttributeTargets.Assembly, Inherited = false)] internal sealed class ApplicationVersionAttribute : Attribute { private string release_version; public string ReleaseVersion { get { return release_version; } } private string display_version; public string DisplayVersion { get { return display_version; } } public ApplicationVersionAttribute (string releaseVersion, string displayVersion) { release_version = releaseVersion; display_version = displayVersion; } } [AttributeUsage (AttributeTargets.Assembly, Inherited = false)] internal sealed class ApplicationBuildInformationAttribute : Attribute { private string vendor; public string Vendor { get { return vendor; } } private string host_os; public string HostOperatingSystem { get { return host_os; } } private string host_cpu; public string HostCpu { get { return host_cpu; } } private string build_time; public string BuildTime { get { return build_time; } } public ApplicationBuildInformationAttribute (string vendor, string hostOs, string hostCpu, string time) { this.vendor = vendor; this.host_os = hostOs; this.host_cpu = hostCpu; this.build_time = time; } } f-spot-0.8.2/src/AssemblyInfo.cs0000644000175000017500000000350011503407350016746 0ustar00rubenruben00000000000000using System; using System.Reflection; using System.Runtime.CompilerServices; [assembly: ApplicationVersion ("0.8.2", "0.8.2")] [assembly: ApplicationBuildInformation ("git-checkout", "linux-gnu", "i686", "2010-12-19 14:55:45 CET")] [assembly: AssemblyVersion ("0.8.0.0")] [assembly: AssemblyTitle ("F-Spot")] [assembly: AssemblyDescription ("Personal photo management for the GNOME Desktop")] [assembly: AssemblyCopyright ("Copyright (C) 2003-2010 Novell Inc. and others")] [assembly: AssemblyCompany ("Novell, Inc.")] [AttributeUsage (AttributeTargets.Assembly, Inherited = false)] internal sealed class ApplicationVersionAttribute : Attribute { private string release_version; public string ReleaseVersion { get { return release_version; } } private string display_version; public string DisplayVersion { get { return display_version; } } public ApplicationVersionAttribute (string releaseVersion, string displayVersion) { release_version = releaseVersion; display_version = displayVersion; } } [AttributeUsage (AttributeTargets.Assembly, Inherited = false)] internal sealed class ApplicationBuildInformationAttribute : Attribute { private string vendor; public string Vendor { get { return vendor; } } private string host_os; public string HostOperatingSystem { get { return host_os; } } private string host_cpu; public string HostCpu { get { return host_cpu; } } private string build_time; public string BuildTime { get { return build_time; } } public ApplicationBuildInformationAttribute (string vendor, string hostOs, string hostCpu, string time) { this.vendor = vendor; this.host_os = hostOs; this.host_cpu = hostCpu; this.build_time = time; } } f-spot-0.8.2/src/Makefile.in0000644000175000017500000005252511503407305016104 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src DIST_COMMON = $(srcdir)/AssemblyInfo.cs.in $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = AssemblyInfo.cs CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = \ Core \ Clients \ Extensions EXTRA_DIST = AssemblyInfo.cs.in MAINTAINERCLEANFILES = Makefile.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): AssemblyInfo.cs: $(top_builddir)/config.status $(srcdir)/AssemblyInfo.cs.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am run: @pushd $(top_builddir); \ make run; \ popd; # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Makefile.am0000644000175000017500000000024611430555235016071 0ustar00rubenruben00000000000000SUBDIRS = \ Core \ Clients \ Extensions EXTRA_DIST = AssemblyInfo.cs.in run: @pushd $(top_builddir); \ make run; \ popd; MAINTAINERCLEANFILES = Makefile.in f-spot-0.8.2/src/Clients/0000777000175000017500000000000011503407445015440 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/Makefile.in0000644000175000017500000005174111503407247017511 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/Clients DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = \ MainApp all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Clients/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Clients/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Clients/MainApp/0000777000175000017500000000000011503407450016761 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/TagPopup.cs0000644000175000017500000000462111503404761021050 0ustar00rubenruben00000000000000/* * TagPopup.cs * * Author: * Larry Ewing * * Copyright (c) 2004 Novell, Inc. * * This is free software. See COPYING for details. */ using System; using Mono.Unix; using FSpot; using FSpot.Core; using FSpot.Utils; public class TagPopup { public void Activate (Gdk.EventButton eb, Tag tag, Tag [] tags) { int photo_count = App.Instance.Organizer.SelectedPhotos ().Length; int tags_count = tags.Length; Gtk.Menu popup_menu = new Gtk.Menu (); GtkUtil.MakeMenuItem (popup_menu, String.Format (Catalog.GetPluralString ("Find", "Find", tags.Length), tags.Length), "gtk-add", new EventHandler (App.Instance.Organizer.HandleIncludeTag), true ); FSpot.TermMenuItem.Create (tags, popup_menu); GtkUtil.MakeMenuSeparator (popup_menu); GtkUtil.MakeMenuItem (popup_menu, Catalog.GetString ("Create New Tag..."), "tag-new", App.Instance.Organizer.HandleCreateNewCategoryCommand, true); GtkUtil.MakeMenuSeparator (popup_menu); GtkUtil.MakeMenuItem (popup_menu, Catalog.GetString ("Edit Tag..."), "gtk-edit", delegate { App.Instance.Organizer.HandleEditSelectedTagWithTag (tag); }, tag != null && tags_count == 1); GtkUtil.MakeMenuItem (popup_menu, Catalog.GetPluralString ("Delete Tag", "Delete Tags", tags_count), "gtk-delete", new EventHandler (App.Instance.Organizer.HandleDeleteSelectedTagCommand), tag != null); GtkUtil.MakeMenuSeparator (popup_menu); GtkUtil.MakeMenuItem (popup_menu, Catalog.GetPluralString ("Attach Tag to Selection", "Attach Tags to Selection", tags_count), "gtk-add", new EventHandler (App.Instance.Organizer.HandleAttachTagCommand), tag != null && photo_count > 0); GtkUtil.MakeMenuItem (popup_menu, Catalog.GetPluralString ("Remove Tag From Selection", "Remove Tags From Selection", tags_count), "gtk-remove", new EventHandler (App.Instance.Organizer.HandleRemoveTagCommand), tag != null && photo_count > 0); if (tags_count > 1 && tag != null) { GtkUtil.MakeMenuSeparator (popup_menu); GtkUtil.MakeMenuItem (popup_menu, Catalog.GetString ("Merge Tags"), new EventHandler (App.Instance.Organizer.HandleMergeTagsCommand), true); } if (eb != null) popup_menu.Popup (null, null, null, eb.Button, eb.Time); else popup_menu.Popup (null, null, null, 0, Gtk.Global.CurrentEventTime); } } f-spot-0.8.2/src/Clients/MainApp/PixbufUtils.cs0000644000175000017500000003523211503404761021571 0ustar00rubenruben00000000000000// // FSpot.PixbufUtils.cs // // Author(s): // Ettore Perazzoli // Larry Ewing // Stephane Delcroix // // This is free software. See COPYING for details // using Gdk; using System.Collections; using System.Runtime.InteropServices; using System; using System.IO; using FSpot; using FSpot.Core; using FSpot.Utils; using FSpot.Imaging; using Hyena; using TagLib.Image; public static class PixbufUtils { static Pixbuf error_pixbuf = null; public static Pixbuf ErrorPixbuf { get { if (error_pixbuf == null) error_pixbuf = GtkUtil.TryLoadIcon (FSpot.Core.Global.IconTheme, "f-spot-question-mark", 256, (Gtk.IconLookupFlags)0); return error_pixbuf; } } public static Pixbuf LoadingPixbuf = PixbufUtils.LoadFromAssembly ("f-spot-loading.png"); public static double Fit (Pixbuf pixbuf, int dest_width, int dest_height, bool upscale_smaller, out int fit_width, out int fit_height) { return Fit (pixbuf.Width, pixbuf.Height, dest_width, dest_height, upscale_smaller, out fit_width, out fit_height); } public static double Fit (int orig_width, int orig_height, int dest_width, int dest_height, bool upscale_smaller, out int fit_width, out int fit_height) { if (orig_width == 0 || orig_height == 0) { fit_width = 0; fit_height = 0; return 0.0; } double scale = Math.Min (dest_width / (double)orig_width, dest_height / (double)orig_height); if (scale > 1.0 && !upscale_smaller) scale = 1.0; fit_width = (int) Math.Round (scale * orig_width); fit_height = (int) Math.Round (scale * orig_height); return scale; } // FIXME: These should be in GTK#. When my patch is committed, these LoadFrom* methods will // go away. public class AspectLoader { Gdk.PixbufLoader loader = new Gdk.PixbufLoader (); int max_width; int max_height; ImageOrientation orientation; public AspectLoader (int max_width, int max_height) { this.max_height = max_height; this.max_width = max_width; loader.SizePrepared += HandleSizePrepared; } private void HandleSizePrepared (object obj, SizePreparedArgs args) { switch (orientation) { case ImageOrientation.LeftTop: case ImageOrientation.LeftBottom: case ImageOrientation.RightTop: case ImageOrientation.RightBottom: int tmp = max_width; max_width = max_height; max_height = tmp; break; default: break; } int scale_width = 0; int scale_height = 0; double scale = Fit (args.Width, args.Height, max_width, max_height, true, out scale_width, out scale_height); if (scale < 1.0) loader.SetSize (scale_width, scale_height); } public Pixbuf Load (System.IO.Stream stream, ImageOrientation orientation) { int count; byte [] data = new byte [8192]; while (((count = stream.Read (data, 0, data.Length)) > 0) && loader.Write (data, (ulong)count)) ; loader.Close (); Pixbuf orig = loader.Pixbuf; Gdk.Pixbuf rotated = FSpot.Utils.PixbufUtils.TransformOrientation (orig, orientation); if (orig != rotated) { orig.Dispose (); } loader.Dispose (); return rotated; } public Pixbuf LoadFromFile (string path) { try { orientation = GetOrientation (path); using (FileStream fs = System.IO.File.OpenRead (path)) { return Load (fs, orientation); } } catch (Exception) { Log.ErrorFormat ("Error loading photo {0}", path); return null; } } } public static Pixbuf ScaleToMaxSize (Pixbuf pixbuf, int width, int height) { return ScaleToMaxSize (pixbuf, width, height, true); } public static Pixbuf ScaleToMaxSize (Pixbuf pixbuf, int width, int height, bool upscale) { int scale_width = 0; int scale_height = 0; double scale = Fit (pixbuf, width, height, upscale, out scale_width, out scale_height); Gdk.Pixbuf result; if (upscale || (scale < 1.0)) result = pixbuf.ScaleSimple (scale_width, scale_height, (scale_width > 20) ? Gdk.InterpType.Bilinear : Gdk.InterpType.Nearest); else result = pixbuf.Copy (); return result; } static public Pixbuf LoadAtMaxSize (string path, int max_width, int max_height) { PixbufUtils.AspectLoader loader = new AspectLoader (max_width, max_height); return loader.LoadFromFile (path); } public static Pixbuf TagIconFromPixbuf (Pixbuf source) { return IconFromPixbuf (source, (int) Tag.IconSize.Large); } public static Pixbuf IconFromPixbuf (Pixbuf source, int size) { Pixbuf tmp = null; Pixbuf icon = null; if (source.Width > source.Height) source = tmp = new Pixbuf (source, (source.Width - source.Height) /2, 0, source.Height, source.Height); else if (source.Width < source.Height) source = tmp = new Pixbuf (source, 0, (source.Height - source.Width) /2, source.Width, source.Width); if (source.Width == source.Height) icon = source.ScaleSimple (size, size, InterpType.Bilinear); else throw new Exception ("Bad logic leads to bad accidents"); if (tmp != null) tmp.Dispose (); return icon; } static Pixbuf LoadFromAssembly (string resource) { try { return new Pixbuf (System.Reflection.Assembly.GetEntryAssembly (), resource); } catch { return null; } } public static Gdk.Pixbuf ScaleToAspect (Gdk.Pixbuf orig, int width, int height) { Gdk.Rectangle pos; double scale = Fit (orig, width, height, false, out pos.Width, out pos.Height); pos.X = (width - pos.Width) / 2; pos.Y = (height - pos.Height) / 2; Pixbuf scaled = new Pixbuf (Colorspace.Rgb, false, 8, width, height); scaled.Fill (0x000000); orig.Composite (scaled, pos.X, pos.Y, pos.Width, pos.Height, pos.X, pos.Y, scale, scale, Gdk.InterpType.Bilinear, 255); return scaled; } public static Pixbuf Flatten (Pixbuf pixbuf) { if (!pixbuf.HasAlpha) return null; Pixbuf flattened = new Pixbuf (Colorspace.Rgb, false, 8, pixbuf.Width, pixbuf.Height); pixbuf.CompositeColor (flattened, 0, 0, pixbuf.Width, pixbuf.Height, 0, 0, 1, 1, InterpType.Bilinear, 255, 0, 0, 2000, 0xffffff, 0xffffff); return flattened; } [DllImport ("libfspot")] static extern IntPtr f_pixbuf_unsharp_mask (IntPtr src, double radius, double amount, double threshold); public static Pixbuf UnsharpMask (Pixbuf src, double radius, double amount, double threshold) { IntPtr raw_ret = f_pixbuf_unsharp_mask (src.Handle, radius, amount, threshold); Gdk.Pixbuf ret = (Gdk.Pixbuf) GLib.Object.GetObject(raw_ret, true); return ret; } [DllImport ("libfspot")] static extern IntPtr f_pixbuf_blur (IntPtr src, double radius); public static Pixbuf Blur (Pixbuf src, double radius) { IntPtr raw_ret = f_pixbuf_blur (src.Handle, radius); Gdk.Pixbuf ret = (Gdk.Pixbuf) GLib.Object.GetObject(raw_ret, true); return ret; } public unsafe static Gdk.Pixbuf RemoveRedeye (Gdk.Pixbuf src, Gdk.Rectangle area) { return RemoveRedeye (src, area, -15); } public unsafe static Gdk.Pixbuf RemoveRedeye (Gdk.Pixbuf src, Gdk.Rectangle area, int threshold) //threshold, factors and comparisons borrowed from the gimp plugin 'redeye.c' by Robert Merkel { Gdk.Pixbuf copy = src.Copy (); Gdk.Pixbuf selection = new Gdk.Pixbuf (copy, area.X, area.Y, area.Width, area.Height); byte *spix = (byte *)selection.Pixels; int h = selection.Height; int w = selection.Width; int channels = src.NChannels; double RED_FACTOR = 0.5133333; double GREEN_FACTOR = 1; double BLUE_FACTOR = 0.1933333; for (int j = 0; j < h; j++) { byte *s = spix; for (int i = 0; i < w; i++) { int adjusted_red = (int)(s[0] * RED_FACTOR); int adjusted_green = (int)(s[1] * GREEN_FACTOR); int adjusted_blue = (int)(s[2] * BLUE_FACTOR); if (adjusted_red >= adjusted_green - threshold && adjusted_red >= adjusted_blue - threshold) s[0] = (byte)(((double)(adjusted_green + adjusted_blue)) / (2.0 * RED_FACTOR)); s += channels; } spix += selection.Rowstride; } return copy; } public static unsafe Pixbuf ColorAdjust (Pixbuf src, double brightness, double contrast, double hue, double saturation, int src_color, int dest_color) { Pixbuf adjusted = new Pixbuf (Colorspace.Rgb, src.HasAlpha, 8, src.Width, src.Height); PixbufUtils.ColorAdjust (src, adjusted, brightness, contrast, hue, saturation, src_color, dest_color); return adjusted; } public static Cms.Format PixbufCmsFormat (Pixbuf buf) { return buf.HasAlpha ? Cms.Format.Rgba8Planar : Cms.Format.Rgb8; } public static unsafe void ColorAdjust (Pixbuf src, Pixbuf dest, double brightness, double contrast, double hue, double saturation, int src_color, int dest_color) { if (src.Width != dest.Width || src.Height != dest.Height) throw new Exception ("Invalid Dimensions"); Cms.Profile srgb = Cms.Profile.CreateStandardRgb (); Cms.Profile bchsw = Cms.Profile.CreateAbstract (256, 0.0, brightness, contrast, hue, saturation, src_color, dest_color); Cms.Profile [] list = new Cms.Profile [] { srgb, bchsw, srgb }; Cms.Transform trans = new Cms.Transform (list, PixbufCmsFormat (src), PixbufCmsFormat (dest), Cms.Intent.Perceptual, 0x0100); ColorAdjust (src, dest, trans); trans.Dispose (); srgb.Dispose (); bchsw.Dispose (); } public static unsafe void ColorAdjust (Gdk.Pixbuf src, Gdk.Pixbuf dest, Cms.Transform trans) { int width = src.Width; byte * srcpix = (byte *) src.Pixels; byte * destpix = (byte *) dest.Pixels; for (int row = 0; row < src.Height; row++) { trans.Apply ((IntPtr) (srcpix + row * src.Rowstride), (IntPtr) (destpix + row * dest.Rowstride), (uint)width); } } public static unsafe bool IsGray (Gdk.Pixbuf pixbuf, int max_difference) { int chan = pixbuf.NChannels; byte *pix = (byte *)pixbuf.Pixels; int h = pixbuf.Height; int w = pixbuf.Width; int stride = pixbuf.Rowstride; for (int j = 0; j < h; j++) { byte *p = pix; for (int i = 0; i < w; i++) { if (Math.Abs (p[0] - p[1]) > max_difference || Math.Abs (p[0] - p [2]) > max_difference) { goto Found; } p += chan; } pix += stride; } return true; Found: return false; } public static unsafe void ReplaceColor (Gdk.Pixbuf src, Gdk.Pixbuf dest) { if (src.HasAlpha || !dest.HasAlpha || (src.Width != dest.Width) || (src.Height != dest.Height)) throw new ApplicationException ("invalid pixbufs"); byte *dpix = (byte *)dest.Pixels; byte *spix = (byte *)src.Pixels; int h = src.Height; int w = src.Width; for (int j = 0; j < h; j++) { byte *d = dpix; byte *s = spix; for (int i = 0; i < w; i++) { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; d += 4; s += 3; } dpix += dest.Rowstride; spix += src.Rowstride; } } public static ImageOrientation GetOrientation (SafeUri uri) { using (var img = ImageFile.Create (uri)) { return img.Orientation; } } [Obsolete ("Use GetOrientation (SafeUri) instead")] public static ImageOrientation GetOrientation (string path) { return GetOrientation (new SafeUri (path)); } [DllImport("libgnomeui-2-0.dll")] static extern IntPtr gnome_thumbnail_scale_down_pixbuf(IntPtr pixbuf, int dest_width, int dest_height); public static Gdk.Pixbuf ScaleDown (Gdk.Pixbuf src, int width, int height) { IntPtr raw_ret = gnome_thumbnail_scale_down_pixbuf(src.Handle, width, height); Gdk.Pixbuf ret; if (raw_ret == IntPtr.Zero) ret = null; else ret = (Gdk.Pixbuf) GLib.Object.GetObject(raw_ret, true); return ret; } public static void CreateDerivedVersion (SafeUri source, SafeUri destination) { CreateDerivedVersion (source, destination, 95); } public static void CreateDerivedVersion (SafeUri source, SafeUri destination, uint jpeg_quality) { if (source.GetExtension () == destination.GetExtension ()) { // Simple copy will do! var file_from = GLib.FileFactory.NewForUri (source); var file_to = GLib.FileFactory.NewForUri (destination); file_from.Copy (file_to, GLib.FileCopyFlags.AllMetadata | GLib.FileCopyFlags.Overwrite, null, null); return; } // Else make a derived copy with metadata copied using (var img = ImageFile.Create (source)) { using (var pixbuf = img.Load ()) { CreateDerivedVersion (source, destination, jpeg_quality, pixbuf); } } } public static void CreateDerivedVersion (SafeUri source, SafeUri destination, uint jpeg_quality, Pixbuf pixbuf) { SaveToSuitableFormat (destination, pixbuf, jpeg_quality); using (var metadata_from = Metadata.Parse (source)) { using (var metadata_to = Metadata.Parse (destination)) { metadata_to.CopyFrom (metadata_from); // Reset orientation to make sure images appear upright. metadata_to.ImageTag.Orientation = ImageOrientation.TopLeft; metadata_to.Save (); } } } private static void SaveToSuitableFormat (SafeUri destination, Pixbuf pixbuf, uint jpeg_quality) { // FIXME: this needs to work on streams rather than filenames. Do that when we switch to // newer GDK. var extension = destination.GetExtension ().ToLower (); if (extension == ".png") { pixbuf.Save (destination.LocalPath, "png"); } else if (extension == ".jpg" || extension == ".jpeg") { pixbuf.Save (destination.LocalPath, "jpeg", jpeg_quality); } else { throw new NotImplementedException ("Saving this file format is not supported"); } } #region Gdk hackery // This hack below is needed because there is no wrapped version of // Save which allows specifying the variable arguments (it's not // possible with p/invoke). [DllImport("libgdk_pixbuf-2.0-0.dll")] static extern bool gdk_pixbuf_save(IntPtr raw, IntPtr filename, IntPtr type, out IntPtr error, IntPtr optlabel1, IntPtr optvalue1, IntPtr dummy); private static bool Save (this Pixbuf pixbuf, string filename, string type, uint jpeg_quality) { IntPtr error = IntPtr.Zero; IntPtr nfilename = GLib.Marshaller.StringToPtrGStrdup (filename); IntPtr ntype = GLib.Marshaller.StringToPtrGStrdup (type); IntPtr optlabel1 = GLib.Marshaller.StringToPtrGStrdup ("quality"); IntPtr optvalue1 = GLib.Marshaller.StringToPtrGStrdup (jpeg_quality.ToString ()); bool ret = gdk_pixbuf_save(pixbuf.Handle, nfilename, ntype, out error, optlabel1, optvalue1, IntPtr.Zero); GLib.Marshaller.Free (nfilename); GLib.Marshaller.Free (ntype); GLib.Marshaller.Free (optlabel1); GLib.Marshaller.Free (optvalue1); if (error != IntPtr.Zero) throw new GLib.GException (error); return ret; } #endregion } f-spot-0.8.2/src/Clients/MainApp/PhotoVersionCommands.cs0000644000175000017500000001745511503404761023443 0ustar00rubenruben00000000000000using Gtk; using System; using Mono.Unix; using FSpot; using Hyena; using Hyena.Widgets; using FSpot.UI.Dialog; public class PhotoVersionCommands { private class VersionNameRequest : BuilderDialog { private Photo photo; [GtkBeans.Builder.Object] private Button ok_button; [GtkBeans.Builder.Object] private Entry version_name_entry; [GtkBeans.Builder.Object] private Label prompt_label; [GtkBeans.Builder.Object] private Label already_in_use_label; public enum RequestType { Create, Rename } private RequestType request_type; private void Update () { string new_name = version_name_entry.Text; if (photo.VersionNameExists (new_name) && ! (request_type == RequestType.Rename && new_name == photo.GetVersion (photo.DefaultVersionId).Name)) { already_in_use_label.Markup = "This name is already in use"; ok_button.Sensitive = false; return; } already_in_use_label.Text = String.Empty; if (new_name.Length == 0) ok_button.Sensitive = false; else ok_button.Sensitive = true; } private void HandleVersionNameEntryChanged (object obj, EventArgs args) { Update (); } public VersionNameRequest (RequestType request_type, Photo photo, Gtk.Window parent_window) : base ("version_name_dialog.ui", "version_name_dialog") { this.request_type = request_type; this.photo = photo; switch (request_type) { case RequestType.Create: this.Title = Catalog.GetString ("Create New Version"); prompt_label.Text = Catalog.GetString ("Name:"); break; case RequestType.Rename: this.Title = Catalog.GetString ("Rename Version"); prompt_label.Text = Catalog.GetString ("New name:"); version_name_entry.Text = photo.GetVersion (photo.DefaultVersionId).Name; version_name_entry.SelectRegion (0, -1); break; } version_name_entry.Changed += HandleVersionNameEntryChanged; version_name_entry.ActivatesDefault = true; this.TransientFor = parent_window; this.DefaultResponse = ResponseType.Ok; Update (); } public ResponseType Run (out string name) { ResponseType response = (ResponseType) this.Run (); name = version_name_entry.Text; if (request_type == RequestType.Rename && name == photo.GetVersion (photo.DefaultVersionId).Name) response = ResponseType.Cancel; this.Destroy (); return response; } } // Creating a new version. public class Create { public bool Execute (PhotoStore store, Photo photo, Gtk.Window parent_window) { VersionNameRequest request = new VersionNameRequest (VersionNameRequest.RequestType.Create, photo, parent_window); string name; ResponseType response = request.Run (out name); if (response != ResponseType.Ok) return false; try { photo.DefaultVersionId = photo.CreateVersion (name, photo.DefaultVersionId, true); store.Commit (photo); return true; } catch (Exception e) { HandleException ("Could not create a new version", e, parent_window); return false; } } } // Deleting a version. public class Delete { public bool Execute (PhotoStore store, Photo photo, Gtk.Window parent_window) { string ok_caption = Catalog.GetString ("Delete"); string msg = String.Format (Catalog.GetString ("Really delete version \"{0}\"?"), photo.DefaultVersion.Name); string desc = Catalog.GetString ("This removes the version and deletes the corresponding file from disk."); try { if (ResponseType.Ok == HigMessageDialog.RunHigConfirmation(parent_window, DialogFlags.DestroyWithParent, MessageType.Warning, msg, desc, ok_caption)) { photo.DeleteVersion (photo.DefaultVersionId); store.Commit (photo); return true; } } catch (Exception e) { HandleException ("Could not delete a version", e, parent_window); } return false; } } // Renaming a version. public class Rename { public bool Execute (PhotoStore store, Photo photo, Gtk.Window parent_window) { VersionNameRequest request = new VersionNameRequest (VersionNameRequest.RequestType.Rename, photo, parent_window); string new_name; ResponseType response = request.Run (out new_name); if (response != ResponseType.Ok) return false; try { photo.RenameVersion (photo.DefaultVersionId, new_name); store.Commit (photo); return true; } catch (Exception e) { HandleException ("Could not rename a version", e, parent_window); return false; } } } // Detaching a version (making it a separate photo). public class Detach { public bool Execute (PhotoStore store, Photo photo, Gtk.Window parent_window) { string ok_caption = Catalog.GetString ("De_tach"); string msg = String.Format (Catalog.GetString ("Really detach version \"{0}\" from \"{1}\"?"), photo.DefaultVersion.Name, photo.Name.Replace("_", "__")); string desc = Catalog.GetString ("This makes the version appear as a separate photo in the library. To undo, drag the new photo back to its parent."); try { if (ResponseType.Ok == HigMessageDialog.RunHigConfirmation(parent_window, DialogFlags.DestroyWithParent, MessageType.Warning, msg, desc, ok_caption)) { Photo new_photo = store.CreateFrom (photo, photo.RollId); new_photo.CopyAttributesFrom (photo); photo.DeleteVersion (photo.DefaultVersionId, false, true); store.Commit (new Photo[] {new_photo, photo}); return true; } } catch (Exception e) { HandleException ("Could not detach a version", e, parent_window); } return false; } } // Reparenting a photo as version of another one public class Reparent { public bool Execute (PhotoStore store, Photo [] photos, Photo new_parent, Gtk.Window parent_window) { string ok_caption = Catalog.GetString ("Re_parent"); string msg = String.Format (Catalog.GetPluralString ("Really reparent \"{0}\" as version of \"{1}\"?", "Really reparent {2} photos as versions of \"{1}\"?", photos.Length), new_parent.Name.Replace ("_", "__"), photos[0].Name.Replace ("_", "__"), photos.Length); string desc = Catalog.GetString ("This makes the photos appear as a single one in the library. The versions can be detached using the Photo menu."); try { if (ResponseType.Ok == HigMessageDialog.RunHigConfirmation(parent_window, DialogFlags.DestroyWithParent, MessageType.Warning, msg, desc, ok_caption)) { uint highest_rating = new_parent.Rating; string new_description = new_parent.Description; foreach (Photo photo in photos) { highest_rating = Math.Max(photo.Rating, highest_rating); if (string.IsNullOrEmpty(new_description)) new_description = photo.Description; new_parent.AddTag (photo.Tags); foreach (uint version_id in photo.VersionIds) { new_parent.DefaultVersionId = new_parent.CreateReparentedVersion (photo.GetVersion (version_id) as PhotoVersion); store.Commit (new_parent); } uint [] version_ids = photo.VersionIds; Array.Reverse (version_ids); foreach (uint version_id in version_ids) { photo.DeleteVersion (version_id, true, true); } store.Remove (photo); } new_parent.Rating = highest_rating; new_parent.Description = new_description; store.Commit (new_parent); return true; } } catch (Exception e) { HandleException ("Could not reparent photos", e, parent_window); } return false; } } private static void HandleException (string msg, Exception e, Gtk.Window parent_window) { Log.DebugException (e); msg = Catalog.GetString (msg); string desc = String.Format (Catalog.GetString ("Received exception \"{0}\"."), e.Message); HigMessageDialog md = new HigMessageDialog (parent_window, DialogFlags.DestroyWithParent, Gtk.MessageType.Error, ButtonsType.Ok, msg, desc); md.Run (); md.Destroy (); } } f-spot-0.8.2/src/Clients/MainApp/FSpot.ColorAdjustment/0000777000175000017500000000000011503407445023134 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot.ColorAdjustment/FullColorAdjustment.cs0000644000175000017500000000267211503404760027423 0ustar00rubenruben00000000000000/* * FullColorAdjustment.cs * * Copyright 2006, 2007 Novell Inc. * * Author * Larry Ewing * Ruben Vermeersch * * See COPYING for license information * */ using Cms; using Gdk; using System; using System.Collections.Generic; namespace FSpot.ColorAdjustment { public class FullColorAdjustment : Adjustment { private double exposure; private double brightness; private double contrast; private double hue; private double saturation; private Cms.ColorCIEXYZ src_wp; private Cms.ColorCIEXYZ dest_wp; public FullColorAdjustment (Pixbuf input, Cms.Profile input_profile, double exposure, double brightness, double contrast, double hue, double saturation, Cms.ColorCIEXYZ src_wp, Cms.ColorCIEXYZ dest_wp) : base (input, input_profile) { this.exposure = exposure; this.brightness = brightness; this.contrast = contrast; this.hue = hue; this.saturation = saturation; this.src_wp = src_wp; this.dest_wp = dest_wp; } protected override List GenerateAdjustments () { List profiles = new List (); profiles.Add (InputProfile); profiles.Add (Cms.Profile.CreateAbstract (nsteps, Math.Pow (Math.Sqrt (2.0), exposure), brightness, contrast, hue, saturation, null, src_wp.ToxyY (), dest_wp.ToxyY ())); profiles.Add (DestinationProfile); return profiles; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.ColorAdjustment/Adjustment.cs0000644000175000017500000000424011503404760025572 0ustar00rubenruben00000000000000/* * Adjustment.cs * * Copyright 2006, 2007 Novell Inc. * * Author * Larry Ewing * Ruben Vermeersch * * See COPYING for license information * */ using FSpot.Utils; using Cms; using Gdk; using System.Collections.Generic; namespace FSpot.ColorAdjustment { public abstract class Adjustment { protected int nsteps = 20; private Cms.Intent intent = Cms.Intent.Perceptual; // This is the input pixbuf, on which the adjustment will be performed. protected readonly Gdk.Pixbuf Input; private Cms.Profile input_profile; public Cms.Profile InputProfile { get { if (input_profile == null) input_profile = Cms.Profile.CreateStandardRgb (); return input_profile; } set { input_profile = value; } } private Cms.Profile destination_profile; public Cms.Profile DestinationProfile { get { if (destination_profile == null) destination_profile = InputProfile; return destination_profile; } set { destination_profile = value; } } public Adjustment (Pixbuf input, Cms.Profile input_profile) { Input = input; InputProfile = input_profile; } protected abstract List GenerateAdjustments (); public Pixbuf Adjust () { Gdk.Pixbuf final = new Gdk.Pixbuf (Gdk.Colorspace.Rgb, false, 8, Input.Width, Input.Height); Cms.Profile [] list = GenerateAdjustments ().ToArray (); if (Input.HasAlpha) { Gdk.Pixbuf input_copy = (Gdk.Pixbuf)Input.Clone (); Pixbuf alpha = PixbufUtils.Flatten (Input); Transform transform = new Transform (list, PixbufUtils.PixbufCmsFormat (alpha), PixbufUtils.PixbufCmsFormat (final), intent, 0x0000); PixbufUtils.ColorAdjust (alpha, final, transform); PixbufUtils.ReplaceColor (final, input_copy); alpha.Dispose (); final.Dispose (); final = input_copy; } else { Cms.Transform transform = new Cms.Transform (list, PixbufUtils.PixbufCmsFormat (Input), PixbufUtils.PixbufCmsFormat (final), intent, 0x0000); PixbufUtils.ColorAdjust (Input, final, transform); } return final; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.ColorAdjustment/SepiaTone.cs0000644000175000017500000000210011503404760025334 0ustar00rubenruben00000000000000/* * SepiaTone.cs * * Copyright 2006, 2007 Novell Inc. * * Author * Larry Ewing * Ruben Vermeersch * * See COPYING for license information * */ using Cms; using Gdk; using System.Collections.Generic; namespace FSpot.ColorAdjustment { public class SepiaTone : Adjustment { public SepiaTone (Pixbuf input, Cms.Profile input_profile) : base (input, input_profile) { } protected override List GenerateAdjustments () { List profiles = new List (); profiles.Add (InputProfile); profiles.Add (Cms.Profile.CreateAbstract (nsteps, 1.0, 0.0, 0.0, 0.0, -100.0, null, ColorCIExyY.D50, ColorCIExyY.D50)); profiles.Add (Cms.Profile.CreateAbstract (nsteps, 1.0, 32.0, 0.0, 0.0, 0.0, null, ColorCIExyY.D50, ColorCIExyY.WhitePointFromTemperature (9934))); profiles.Add (DestinationProfile); return profiles; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.ColorAdjustment/Desaturate.cs0000644000175000017500000000153411503404760025560 0ustar00rubenruben00000000000000/* * Desaturate.cs * * Copyright 2006, 2007 Novell Inc. * * Author * Larry Ewing * Ruben Vermeersch * * See COPYING for license information * */ using Cms; using Gdk; using System.Collections.Generic; namespace FSpot.ColorAdjustment { public class Desaturate : Adjustment { public Desaturate (Pixbuf input, Cms.Profile input_profile) : base (input, input_profile) { } protected override List GenerateAdjustments () { List profiles = new List (); profiles.Add (InputProfile); profiles.Add (Cms.Profile.CreateAbstract (nsteps, 1.0, 0.0, 0.0, 0.0, -100.0, null, ColorCIExyY.D50, ColorCIExyY.D50)); profiles.Add (DestinationProfile); return profiles; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.ColorAdjustment/AutoStretch.cs0000644000175000017500000000306511503404760025725 0ustar00rubenruben00000000000000/* * AutoStretch.cs * * Author * Larry Ewing * Ruben Vermeersch * * See COPYING for license information * */ using Cms; using Gdk; using System; using System.Collections.Generic; using Hyena; namespace FSpot.ColorAdjustment { public class AutoStretch : Adjustment { public AutoStretch (Pixbuf input, Cms.Profile input_profile) : base (input, input_profile) { } protected override List GenerateAdjustments () { List profiles = new List (); Histogram hist = new Histogram (Input); tables = new GammaTable [3]; for (int channel = 0; channel < tables.Length; channel++) { int high, low; hist.GetHighLow (channel, out high, out low); Log.DebugFormat ("high = {0}, low = {1}", high, low); tables [channel] = StretchChannel (255, low / 255.0, high / 255.0); } profiles.Add (new Cms.Profile (IccColorSpace.Rgb, tables)); return profiles; } GammaTable StretchChannel (int count, double low, double high) { ushort [] entries = new ushort [count]; for (int i = 0; i < entries.Length; i++) { double val = i / (double)entries.Length; if (high != low) { val = Math.Max ((val - low), 0) / (high - low); } else { val = Math.Max ((val - low), 0); } entries [i] = (ushort) Math.Min (Math.Round (ushort.MaxValue * val), ushort.MaxValue); //System.Console.WriteLine ("val {0}, result {1}", Math.Round (val * ushort.MaxValue), entries [i]); } return new GammaTable (entries); } GammaTable [] tables; } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Editors/0000777000175000017500000000000011503407446021431 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot.Editors/RedEyeEditor.cs0000644000175000017500000000215211503404760024274 0ustar00rubenruben00000000000000/* * RedEyeEditor.cs * * Author(s) * Ruben Vermeersch * * This is free software. See COPYING for details. */ using FSpot; using FSpot.Utils; using Gdk; using Gtk; using Mono.Unix; using System; namespace FSpot.Editors { class RedEyeEditor : Editor { public RedEyeEditor () : base (Catalog.GetString ("Red-eye Reduction"), "red-eye-remove") { NeedsSelection = true; ApplyLabel = Catalog.GetString ("Fix!"); } public override Widget ConfigurationWidget () { return new Label(Catalog.GetString ("Select the eyes you wish to fix.")); } protected override Pixbuf Process (Pixbuf input, Cms.Profile input_profile) { Rectangle selection = FSpot.Utils.PixbufUtils.TransformOrientation ((int)State.PhotoImageView.PixbufOrientation <= 4 ? input.Width : input.Height, (int)State.PhotoImageView.PixbufOrientation <= 4 ? input.Height : input.Width, State.Selection, State.PhotoImageView.PixbufOrientation); int threshold = Preferences.Get (Preferences.EDIT_REDEYE_THRESHOLD); return PixbufUtils.RemoveRedeye (input, selection, threshold); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Editors/SepiaEditor.cs0000644000175000017500000000125411503404760024162 0ustar00rubenruben00000000000000/* * SepiaEditor.cs * * Author(s) * Ruben Vermeersch * * This is free software. See COPYING for details. */ using FSpot; using FSpot.ColorAdjustment; using Gdk; using Mono.Unix; namespace FSpot.Editors { class SepiaEditor : Editor { public SepiaEditor () : base (Catalog.GetString ("Sepia Tone"), "color-sepia") { // FIXME: need tooltip Catalog.GetString ("Convert the photo to sepia tones") CanHandleMultiple = true; } protected override Pixbuf Process (Pixbuf input, Cms.Profile input_profile) { SepiaTone sepia = new SepiaTone (input, input_profile); return sepia.Adjust (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Editors/DesaturateEditor.cs0000644000175000017500000000132011503404760025214 0ustar00rubenruben00000000000000/* * DesaturateEditor.cs * * Author(s) * Ruben Vermeersch * * This is free software. See COPYING for details. */ using FSpot; using FSpot.ColorAdjustment; using Gdk; using Mono.Unix; namespace FSpot.Editors { class DesaturateEditor : Editor { public DesaturateEditor () : base (Catalog.GetString ("Desaturate"), "color-desaturate") { // FIXME: need tooltip Catalog.GetString ("Convert the photo to black and white") CanHandleMultiple = true; } protected override Pixbuf Process (Pixbuf input, Cms.Profile input_profile) { Desaturate desaturate = new Desaturate (input, input_profile); return desaturate.Adjust (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Editors/TiltEditor.cs0000644000175000017500000000373011503404760024036 0ustar00rubenruben00000000000000/* * FSpot.Editors.TiltEditor.cs * * Author(s) * Ruben Vermeersch * Stephane Delcroix * * Copyright (c) 2009 Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using Mono.Unix; using Gdk; using Gtk; using Cairo; using FSpot.Widgets; namespace FSpot.Editors { // TODO: there were keybindings (left/right) to adjust tilt, maybe they should be added back. class TiltEditor : Editor { double angle; Scale scale; public TiltEditor () : base (Catalog.GetString ("Straighten"), "align-horizon") { // FIXME: need tooltip Catalog.GetString ("Adjust the angle of the image to straighten the horizon") HasSettings = true; } public override Widget ConfigurationWidget () { scale = new HScale (-45, 45, 1); scale.Value = 0.0; scale.ValueChanged += HandleValueChanged; return scale; } protected override Pixbuf Process (Pixbuf input, Cms.Profile input_profile) { return ProcessImpl (input, input_profile, false); } protected override Pixbuf ProcessFast (Pixbuf input, Cms.Profile input_profile) { return ProcessImpl (input, input_profile, true); } private Pixbuf ProcessImpl (Pixbuf input, Cms.Profile input_profile, bool fast) { Pixbuf result; using (ImageInfo info = new ImageInfo (input)) { using (MemorySurface surface = new MemorySurface (Format.Argb32, input.Width, input.Height)) { using (Context ctx = new Context (surface)) { ctx.Matrix = info.Fill (info.Bounds, angle); using (SurfacePattern p = new SurfacePattern (info.Surface)) { if (fast) p.Filter = Filter.Fast; ctx.Source = p; ctx.Paint (); } result = MemorySurface.CreatePixbuf (surface); surface.Flush (); } } } return result; } private void HandleValueChanged (object sender, System.EventArgs args) { angle = scale.Value * Math.PI / -180; UpdatePreview (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Editors/SoftFocusEditor.cs0000644000175000017500000000356011503404760025036 0ustar00rubenruben00000000000000/* * SoftFocusEditor.cs * * Author(s) * Ruben Vermeersch * Stephane Delcroix * * Copyright (c) 2009 Stephane Delcroix * * This is open source software. See COPYING for details. */ using System; using Mono.Unix; using Cairo; using Gdk; using Gtk; using FSpot.Widgets; namespace FSpot.Editors { // TODO: This had a keybinding e. Maybe we should add it back, but did people even knew it? class SoftFocusEditor : Editor { double radius; Scale scale; public SoftFocusEditor () : base (Catalog.GetString ("Soft Focus"), "filter-soft-focus") { // FIXME: need tooltip Catalog.GetString ("Create a soft focus visual effect") HasSettings = true; } public override Widget ConfigurationWidget () { scale = new HScale (0, 1, .01); scale.Value = 0.5; scale.ValueChanged += HandleValueChanged; return scale; } protected override Pixbuf Process (Pixbuf input, Cms.Profile input_profile) { return ProcessImpl (input, input_profile, false); } protected override Pixbuf ProcessFast (Pixbuf input, Cms.Profile input_profile) { return ProcessImpl (input, input_profile, true); } private Pixbuf ProcessImpl (Pixbuf input, Cms.Profile input_profile, bool fast) { Pixbuf result; using (ImageInfo info = new ImageInfo (input)) { using (Widgets.SoftFocus soft = new Widgets.SoftFocus (info)) { soft.Radius = radius; using (MemorySurface surface = new MemorySurface (Format.Argb32, input.Width, input.Height)) { using (Context ctx = new Context (surface)) { soft.Apply (ctx, info.Bounds); } result = MemorySurface.CreatePixbuf (surface); surface.Flush (); } } } return result; } private void HandleValueChanged (object sender, System.EventArgs args) { radius = scale.Value; UpdatePreview (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Editors/AutoStretchEditor.cs0000644000175000017500000000130511503404760025363 0ustar00rubenruben00000000000000/* * SepiaEditor.cs * * Author(s) * Ruben Vermeersch * * This is free software. See COPYING for details. */ using FSpot; using FSpot.ColorAdjustment; using Gdk; using Mono.Unix; namespace FSpot.Editors { class AutoStretchEditor : Editor { public AutoStretchEditor () : base (Catalog.GetString ("Auto Color"), "autocolor") { // FIXME: need tooltip Catalog.GetString ("Automatically adjust the colors") CanHandleMultiple = true; } protected override Pixbuf Process (Pixbuf input, Cms.Profile input_profile) { AutoStretch autostretch = new AutoStretch (input, input_profile); return autostretch.Adjust (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Editors/Editor.cs0000644000175000017500000001614111503404760023201 0ustar00rubenruben00000000000000/* * Editor.cs * * Author(s) * Ruben Vermeersch * * This is free software. See COPYING for details. */ using Hyena; using FSpot.Core; using FSpot.Widgets; using FSpot.Imaging; using Gdk; using Gtk; using Mono.Addins; using Mono.Unix; using System; namespace FSpot.Editors { [ExtensionNode ("Editor")] public class EditorNode : ExtensionNode { [NodeAttribute (Required=true)] protected string editor_type; public Editor GetEditor () { return (Editor) Addin.CreateInstance (editor_type); } } public class EditorState { // The area selected by the user. public Rectangle Selection; // The images selected by the user. public IPhoto [] Items; // The view, into which images are shown (null if we are in the browse view). public PhotoImageView PhotoImageView; // Has a portion of the image been selected? public bool HasSelection { get { return Selection != Rectangle.Zero; } } // Is the user in browse mode? public bool InBrowseMode { get { return PhotoImageView == null; } } } // This is the base class from which all editors inherit. public abstract class Editor { public delegate void ProcessingStartedHandler (string name, int count); public delegate void ProcessingStepHandler (int done); public delegate void ProcessingFinishedHandler (); public event ProcessingStartedHandler ProcessingStarted; public event ProcessingStepHandler ProcessingStep; public event ProcessingFinishedHandler ProcessingFinished; // Contains the current selection, the items being edited, ... private EditorState state; public EditorState State { get { if (!StateInitialized) throw new ApplicationException ("Editor has not been initialized yet!"); return state; } private set { state = value; } } public bool StateInitialized { get { return state != null; } } // Whether the user needs to select a part of the image before it can be applied. public bool NeedsSelection = false; // A tool can be applied if it doesn't need a selection, or if it has one. public bool CanBeApplied { get { Log.DebugFormat ("{0} can be applied? {1}", this, !NeedsSelection || (NeedsSelection && State.HasSelection)); return !NeedsSelection || (NeedsSelection && State.HasSelection); } } private bool can_handle_multiple = false; public bool CanHandleMultiple { get { return can_handle_multiple; } protected set { can_handle_multiple = value; } } protected void LoadPhoto (Photo photo, out Pixbuf photo_pixbuf, out Cms.Profile photo_profile) { // FIXME: We might get this value from the PhotoImageView. using (var img = ImageFile.Create (photo.DefaultVersion.Uri)) { photo_pixbuf = img.Load (); photo_profile = img.GetProfile (); } } // The human readable name for this action. public readonly string Label; // The label on the apply button (usually shorter than the label). private string apply_label = ""; public string ApplyLabel { get { return apply_label == "" ? Label : apply_label; } protected set { apply_label = value; } } // The icon name for this action (will be loaded from the theme). public readonly string IconName; public Editor (string label, string icon_name) { Label = label; IconName = icon_name; } // Apply the editor's action to a photo. public void Apply () { try { if (ProcessingStarted != null) { ProcessingStarted (Label, State.Items.Length); } TryApply (); } finally { if (ProcessingFinished != null) { ProcessingFinished (); } } } private void TryApply () { if (NeedsSelection && !State.HasSelection) { throw new Exception ("Cannot apply without selection!"); } int done = 0; foreach (Photo photo in State.Items) { Pixbuf input; Cms.Profile input_profile; LoadPhoto (photo, out input, out input_profile); Pixbuf edited = Process (input, input_profile); input.Dispose (); bool create_version = photo.DefaultVersion.IsProtected; photo.SaveVersion (edited, create_version); photo.Changes.DataChanged = true; App.Instance.Database.Photos.Commit (photo); done++; if (ProcessingStep != null) { ProcessingStep (done); } } Reset (); } protected abstract Pixbuf Process (Pixbuf input, Cms.Profile input_profile); protected virtual Pixbuf ProcessFast (Pixbuf input, Cms.Profile input_profile) { return Process (input, input_profile); } private bool has_settings; public bool HasSettings { get { return has_settings; } protected set { has_settings = value; } } private Pixbuf original; private Pixbuf preview; protected void UpdatePreview () { if (State.InBrowseMode) { throw new Exception ("Previews cannot be made in browse mode!"); } if (State.Items.Length > 1) { throw new Exception ("We should have one item selected when this happened, otherwise something is terribly wrong."); } if (original == null) { original = State.PhotoImageView.Pixbuf; } Pixbuf old_preview = null; if (preview == null) { int width, height; CalcPreviewSize (original, out width, out height); preview = original.ScaleSimple (width, height, InterpType.Nearest); } else { // We're updating a previous preview old_preview = State.PhotoImageView.Pixbuf; } Pixbuf previewed = ProcessFast (preview, null); State.PhotoImageView.Pixbuf = previewed; State.PhotoImageView.ZoomFit (false); App.Instance.Organizer.InfoBox.UpdateHistogram (previewed); if (old_preview != null) { old_preview.Dispose (); } } private void CalcPreviewSize (Pixbuf input, out int width, out int height) { int awidth = State.PhotoImageView.Allocation.Width; int aheight = State.PhotoImageView.Allocation.Height; int iwidth = input.Width; int iheight = input.Height; if (iwidth <= awidth && iheight <= aheight) { // Do not upscale width = iwidth; height = iheight; } else { double wratio = (double) iwidth / awidth; double hratio = (double) iheight / aheight; double ratio = Math.Max (wratio, hratio); width = (int) (iwidth / ratio); height = (int) (iheight / ratio); } //Log.Debug ("Preview size: Allocation: {0}x{1}, Input: {2}x{3}, Result: {4}x{5}", awidth, aheight, iwidth, iheight, width, height); } public void Restore () { if (original != null && State.PhotoImageView != null) { State.PhotoImageView.Pixbuf = original; State.PhotoImageView.ZoomFit (false); App.Instance.Organizer.InfoBox.UpdateHistogram (null); } Reset (); } private void Reset () { if (preview != null) { preview.Dispose (); } preview = null; original = null; State = null; } // Can be overriden to provide a specific configuration widget. // Returning null means no configuration widget. public virtual Widget ConfigurationWidget () { return null; } public virtual EditorState CreateState () { return new EditorState (); } public delegate void InitializedHandler (); public event InitializedHandler Initialized; public void Initialize (EditorState state) { State = state; if (Initialized != null) Initialized (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Editors/CropEditor.cs0000644000175000017500000001527011503404760024027 0ustar00rubenruben00000000000000/* * CropEditor.cs * * Author(s) * Ruben Vermeersch * * This is free software. See COPYING for details. */ using FSpot; using FSpot.UI.Dialog; using FSpot.Utils; using Hyena; using Gdk; using Gtk; using Mono.Unix; using System; using System.Collections.Generic; using System.IO; using System.Xml.Serialization; namespace FSpot.Editors { class CropEditor : Editor { private TreeStore constraints_store; private ComboBox constraints_combo; public enum ConstraintType { Normal, AddCustom, SameAsPhoto } private List custom_constraints; private static SelectionRatioDialog.SelectionConstraint [] default_constraints = { new SelectionRatioDialog.SelectionConstraint (Catalog.GetString ("4 x 3 (Book)"), 4.0 / 3.0), new SelectionRatioDialog.SelectionConstraint (Catalog.GetString ("4 x 6 (Postcard)"), 6.0 / 4.0), new SelectionRatioDialog.SelectionConstraint (Catalog.GetString ("5 x 7 (L, 2L)"), 7.0 / 5.0), new SelectionRatioDialog.SelectionConstraint (Catalog.GetString ("8 x 10"), 10.0 / 8.0), new SelectionRatioDialog.SelectionConstraint (Catalog.GetString ("Square"), 1.0) }; public CropEditor () : base (Catalog.GetString ("Crop"), "crop") { NeedsSelection = true; Preferences.SettingChanged += OnPreferencesChanged; Initialized += delegate { State.PhotoImageView.PhotoChanged += delegate { UpdateSelectionCombo (); }; }; } private void OnPreferencesChanged (object sender, NotifyEventArgs args) { LoadPreference (args.Key); } private void LoadPreference (String key) { switch (key) { case Preferences.CUSTOM_CROP_RATIOS: custom_constraints = new List (); if (Preferences.Get (key) != null) { XmlSerializer serializer = new XmlSerializer (typeof(SelectionRatioDialog.SelectionConstraint)); foreach (string xml in Preferences.Get (key)) custom_constraints.Add ((SelectionRatioDialog.SelectionConstraint)serializer.Deserialize (new StringReader (xml))); } PopulateConstraints (); break; } } public override Widget ConfigurationWidget () { VBox vbox = new VBox (); Label info = new Label (Catalog.GetString ("Select the area that needs cropping.")); constraints_combo = new ComboBox (); CellRendererText constraint_name_cell = new CellRendererText (); CellRendererPixbuf constraint_pix_cell = new CellRendererPixbuf (); constraints_combo.PackStart (constraint_name_cell, true); constraints_combo.PackStart (constraint_pix_cell, false); constraints_combo.SetCellDataFunc (constraint_name_cell, new CellLayoutDataFunc (ConstraintNameCellFunc)); constraints_combo.SetCellDataFunc (constraint_pix_cell, new CellLayoutDataFunc (ConstraintPixCellFunc)); constraints_combo.Changed += HandleConstraintsComboChanged; // FIXME: need tooltip Catalog.GetString ("Constrain the aspect ratio of the selection") LoadPreference (Preferences.CUSTOM_CROP_RATIOS); vbox.Add (info); vbox.Add (constraints_combo); return vbox; } private void PopulateConstraints() { constraints_store = new TreeStore (typeof (string), typeof (string), typeof (double), typeof (ConstraintType)); constraints_combo.Model = constraints_store; constraints_store.AppendValues (null, Catalog.GetString ("No Constraint"), 0.0, ConstraintType.Normal); constraints_store.AppendValues (null, Catalog.GetString ("Same as photo"), 0.0, ConstraintType.SameAsPhoto); foreach (SelectionRatioDialog.SelectionConstraint constraint in custom_constraints) constraints_store.AppendValues (null, constraint.Label, constraint.XyRatio, ConstraintType.Normal); foreach (SelectionRatioDialog.SelectionConstraint constraint in default_constraints) constraints_store.AppendValues (null, constraint.Label, constraint.XyRatio, ConstraintType.Normal); constraints_store.AppendValues (Stock.Edit, Catalog.GetString ("Custom Ratios..."), 0.0, ConstraintType.AddCustom); constraints_combo.Active = 0; } public void UpdateSelectionCombo () { if (!StateInitialized || constraints_combo == null) // Don't bomb out on instant-apply. return; //constraints_combo.Active = 0; TreeIter iter; if (constraints_combo.GetActiveIter (out iter)) { if (((ConstraintType)constraints_store.GetValue (iter, 3)) == ConstraintType.SameAsPhoto) constraints_combo.Active = 0; } } private void HandleConstraintsComboChanged (object o, EventArgs e) { if (State.PhotoImageView == null) { Log.Debug ("PhotoImageView is null"); return; } TreeIter iter; if (constraints_combo.GetActiveIter (out iter)) { double ratio = ((double)constraints_store.GetValue (iter, 2)); ConstraintType type = ((ConstraintType)constraints_store.GetValue (iter, 3)); switch (type) { case ConstraintType.Normal: State.PhotoImageView.SelectionXyRatio = ratio; break; case ConstraintType.AddCustom: SelectionRatioDialog dialog = new SelectionRatioDialog (); dialog.Run (); break; case ConstraintType.SameAsPhoto: try { Pixbuf pb = State.PhotoImageView.CompletePixbuf (); State.PhotoImageView.SelectionXyRatio = (double)pb.Width / (double)pb.Height; } catch (System.Exception ex) { Log.WarningFormat ("Exception in selection ratio's: {0}", ex); State.PhotoImageView.SelectionXyRatio = 0; } break; default: State.PhotoImageView.SelectionXyRatio = 0; break; } } } void ConstraintNameCellFunc (CellLayout cell_layout, CellRenderer cell, TreeModel tree_model, TreeIter iter) { string name = (string)tree_model.GetValue (iter, 1); (cell as CellRendererText).Text = name; } void ConstraintPixCellFunc (CellLayout cell_layout, CellRenderer cell, TreeModel tree_model, TreeIter iter) { string stockname = (string)tree_model.GetValue (iter, 0); if (stockname != null) (cell as CellRendererPixbuf).Pixbuf = GtkUtil.TryLoadIcon (FSpot.Core.Global.IconTheme, stockname, 16, (Gtk.IconLookupFlags)0); else (cell as CellRendererPixbuf).Pixbuf = null; } protected override Pixbuf Process (Pixbuf input, Cms.Profile input_profile) { Rectangle selection = FSpot.Utils.PixbufUtils.TransformOrientation ((int)State.PhotoImageView.PixbufOrientation <= 4 ? input.Width : input.Height, (int)State.PhotoImageView.PixbufOrientation <= 4 ? input.Height : input.Width, State.Selection, State.PhotoImageView.PixbufOrientation); Pixbuf edited = new Pixbuf (input.Colorspace, input.HasAlpha, input.BitsPerSample, selection.Width, selection.Height); input.CopyArea (selection.X, selection.Y, selection.Width, selection.Height, edited, 0, 0); return edited; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Editors/ColorEditor.cs0000644000175000017500000000635511503404760024206 0ustar00rubenruben00000000000000/* * ColorEditor.cs * * Author(s) * Larry Ewing * Ruben Vermeersch * Paul Lange * * This is free software. See COPYING for details. */ using FSpot; using FSpot.ColorAdjustment; using Gdk; using Gtk; using Mono.Unix; using System; using GtkBeans; namespace FSpot.Editors { class ColorEditor : Editor { GtkBeans.Builder builder; [GtkBeans.Builder.Object] private Gtk.HScale exposure_scale; [GtkBeans.Builder.Object] private Gtk.HScale temp_scale; [GtkBeans.Builder.Object] private Gtk.HScale temptint_scale; [GtkBeans.Builder.Object] private Gtk.HScale brightness_scale; [GtkBeans.Builder.Object] private Gtk.HScale contrast_scale; [GtkBeans.Builder.Object] private Gtk.HScale hue_scale; [GtkBeans.Builder.Object] private Gtk.HScale sat_scale; [GtkBeans.Builder.Object] private Gtk.SpinButton exposure_spinbutton; [GtkBeans.Builder.Object] private Gtk.SpinButton temp_spinbutton; [GtkBeans.Builder.Object] private Gtk.SpinButton temptint_spinbutton; [GtkBeans.Builder.Object] private Gtk.SpinButton brightness_spinbutton; [GtkBeans.Builder.Object] private Gtk.SpinButton contrast_spinbutton; [GtkBeans.Builder.Object] private Gtk.SpinButton hue_spinbutton; [GtkBeans.Builder.Object] private Gtk.SpinButton sat_spinbutton; public ColorEditor () : base (Catalog.GetString ("Adjust Colors"), "adjust-colors") { // FIXME: need tooltip Catalog.GetString ("Adjust the photo colors") HasSettings = true; ApplyLabel = Catalog.GetString ("Adjust"); } public override Widget ConfigurationWidget () { builder = new GtkBeans.Builder (null, "color_editor_prefs_window.ui", null); builder.Autoconnect (this); AttachInterface (); return new VBox (builder.GetRawObject ("color_editor_prefs")); } private void AttachInterface () { temp_spinbutton.Adjustment.ChangeValue (); temptint_spinbutton.Adjustment.ChangeValue (); brightness_spinbutton.Adjustment.ChangeValue (); contrast_spinbutton.Adjustment.ChangeValue (); hue_spinbutton.Adjustment.ChangeValue (); sat_spinbutton.Adjustment.ChangeValue (); exposure_spinbutton.Adjustment.ChangeValue (); temp_scale.Value = 5000; exposure_scale.ValueChanged += RangeChanged; temp_scale.ValueChanged += RangeChanged; temptint_scale.ValueChanged += RangeChanged; brightness_scale.ValueChanged += RangeChanged; contrast_scale.ValueChanged += RangeChanged; hue_scale.ValueChanged += RangeChanged; sat_scale.ValueChanged += RangeChanged; } public void RangeChanged (object sender, EventArgs args) { UpdatePreview (); } protected override Pixbuf Process (Pixbuf input, Cms.Profile input_profile) { Cms.ColorCIEXYZ src_wp; Cms.ColorCIEXYZ dest_wp; src_wp = Cms.ColorCIExyY.WhitePointFromTemperature (5000).ToXYZ (); dest_wp = Cms.ColorCIExyY.WhitePointFromTemperature ((int)temp_scale.Value).ToXYZ (); Cms.ColorCIELab dest_lab = dest_wp.ToLab (src_wp); dest_lab.a += temptint_scale.Value; dest_wp = dest_lab.ToXYZ (src_wp); FullColorAdjustment adjust = new FullColorAdjustment (input, input_profile, exposure_scale.Value, brightness_scale.Value, contrast_scale.Value, hue_scale.Value, sat_scale.Value, src_wp, dest_wp); return adjust.Adjust (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/0000777000175000017500000000000011503407447021427 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/BrowseablePointerGridView.cs0000644000175000017500000000740711503404760027044 0ustar00rubenruben00000000000000/* * BrowseablePointerGridView.cs * * Author(s) * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using Gdk; using Gtk; using FSpot.Core; namespace FSpot.Widgets { /// /// This widget displays a photo collection based on an BrowseablePointer. That means, that /// only one photo can be selected at once. /// public class BrowseablePointerGridView : CollectionGridView { #region Public Properties public BrowsablePointer Pointer { get; private set; } #endregion #region Constructors public BrowseablePointerGridView (IntPtr raw) : base (raw) { } public BrowseablePointerGridView (BrowsablePointer pointer) : base (pointer.Collection) { Pointer = pointer; Pointer.Changed += (obj, args) => { InvalidateCell (args.PreviousIndex); InvalidateCell (Pointer.Index); }; AddEvents ((int) EventMask.KeyPressMask | (int) EventMask.ButtonPressMask); CanFocus = true; } #endregion #region Drawing Methods protected override void DrawPhoto (int cell_num, Rectangle cell_area, Rectangle expose_area, bool selected, bool focussed) { base.DrawPhoto (cell_num, cell_area, expose_area, (Pointer.Index == cell_num), false); } #endregion #region Override Widget Events protected override bool OnButtonPressEvent (EventButton evnt) { int cell_num = CellAtPosition ((int) evnt.X, (int) evnt.Y); GrabFocus (); if (cell_num >= 0) Pointer.Index = cell_num; return true; } protected override bool OnKeyPressEvent (EventKey evnt) { bool shift = ModifierType.ShiftMask == (evnt.State & ModifierType.ShiftMask); bool control = ModifierType.ControlMask == (evnt.State & ModifierType.ControlMask); switch (evnt.Key) { case Gdk.Key.Down: case Gdk.Key.J: case Gdk.Key.j: Pointer.Index = Math.Min (Pointer.Collection.Count - 1, Pointer.Index + VisibleColums); break; case Gdk.Key.Left: case Gdk.Key.H: case Gdk.Key.h: if (control && shift) Pointer.Index -= Pointer.Index % VisibleColums; else Pointer.MovePrevious (); break; case Gdk.Key.Right: case Gdk.Key.L: case Gdk.Key.l: if (control && shift) Pointer.Index = Math.Min (Pointer.Collection.Count - 1, Pointer.Index + VisibleColums - (Pointer.Index % VisibleColums) - 1); else Pointer.MoveNext (); break; case Gdk.Key.Up: case Gdk.Key.K: case Gdk.Key.k: Pointer.Index = Math.Max (0, Pointer.Index - VisibleColums); break; case Gdk.Key.Page_Up: Pointer.Index = Math.Max (0, Pointer.Index - VisibleColums); break; case Gdk.Key.Page_Down: Pointer.Index = Math.Min (Pointer.Collection.Count - 1, Pointer.Index + VisibleColums * VisibleRows); break; case Gdk.Key.Home: Pointer.MoveFirst (); break; case Gdk.Key.End: Pointer.MoveLast (); break; default: return false; } ScrollTo (Pointer.Index); return true; } #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/Sharpener.cs0000644000175000017500000000775711503404761023715 0ustar00rubenruben00000000000000// // FSpot.Widgets.Sharpener.cs // // Author(s): // Larry Ewing * * This is free software. See COPYING for details. */ using System; using Gtk; using Gdk; using FSpot.Core; namespace FSpot.Widgets { /// /// This is a renderer for drawing annotations to a thumbnail. The annotations /// are rendered directly to the thumbnail and no previous size computation is needed. /// public abstract class ThumbnailDecorationRenderer { #region Constructor public ThumbnailDecorationRenderer () { } #endregion #region Drawing Methods public abstract void Render (Drawable window, Widget widget, Rectangle cell_area, Rectangle expose_area, StateType cell_state, IPhoto photo); #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/TagEntry.cs0000644000175000017500000001615511503404761023513 0ustar00rubenruben00000000000000/* * Widgets/TagEntry.cs * * Author(s) * Original work by Nat Friedman in MainWindow.cs * Refactored as a self-contained widget by Stephane Delcroix * * This is free software. See COPYING for details. * */ using System.Text; using System.Collections; using FSpot.Core; namespace FSpot.Widgets { public delegate void TagsAttachedHandler (object sender, string [] tags); public delegate void TagsRemovedHandler (object sender, Tag [] tags); public class TagEntry : Gtk.Entry { public event TagsAttachedHandler TagsAttached; public event TagsRemovedHandler TagsRemoved; TagStore tag_store; public TagEntry (TagStore tag_store) : this (tag_store, true) { } protected TagEntry (System.IntPtr raw) { Raw = raw; } public TagEntry (TagStore tag_store, bool update_on_focus_out) : base () { this.tag_store = tag_store; this.KeyPressEvent += HandleKeyPressEvent; if (update_on_focus_out) this.FocusOutEvent += HandleFocusOutEvent; } ArrayList selected_photos_tagnames; public void UpdateFromSelection (IPhoto [] sel) { Hashtable taghash = new Hashtable (); for (int i = 0; i < sel.Length; i++) { foreach (Tag tag in sel [i].Tags) { int count = 1; if (taghash.Contains (tag)) count = ((int) taghash [tag]) + 1; if (count <= i) taghash.Remove (tag); else taghash [tag] = count; } if (taghash.Count == 0) break; } selected_photos_tagnames = new ArrayList (); foreach (Tag tag in taghash.Keys) if ((int) (taghash [tag]) == sel.Length) selected_photos_tagnames.Add (tag.Name); Update (); } public void UpdateFromTagNames (string [] tagnames) { selected_photos_tagnames = new ArrayList (); foreach (string tagname in tagnames) selected_photos_tagnames.Add (tagname); Update (); } private void Update () { selected_photos_tagnames.Sort (); StringBuilder sb = new StringBuilder (); foreach (string tagname in selected_photos_tagnames) { if (sb.Length > 0) sb.Append (", "); sb.Append (tagname); } Text = sb.ToString (); ClearTagCompletions (); } private void AppendComma () { if (Text.Length != 0 && !Text.Trim ().EndsWith (",")) AppendText (", "); } public string [] GetTypedTagNames () { string [] tagnames = Text.Split (new char [] {','}); ArrayList list = new ArrayList (); for (int i = 0; i < tagnames.Length; i ++) { string s = tagnames [i].Trim (); if (s.Length > 0) list.Add (s); } return (string []) (list.ToArray (typeof (string))); } int tag_completion_index = -1; Tag [] tag_completions; public void ClearTagCompletions () { tag_completion_index = -1; tag_completions = null; } [GLib.ConnectBefore] private void HandleKeyPressEvent (object o, Gtk.KeyPressEventArgs args) { args.RetVal = false; if (args.Event.Key == Gdk.Key.Escape) { args.RetVal = false; } else if (args.Event.Key == Gdk.Key.comma) { if (tag_completion_index != -1) { // If we are completing a tag, then finish that FinishTagCompletion (); args.RetVal = true; } else // Otherwise do not handle this event here args.RetVal = false; } else if (args.Event.Key == Gdk.Key.Return) { // If we are completing a tag, then finish that if (tag_completion_index != -1) FinishTagCompletion (); // And pass the event to Gtk.Entry in any case, // which will call OnActivated args.RetVal = false; } else if (args.Event.Key == Gdk.Key.Tab) { DoTagCompletion (true); args.RetVal = true; } else if (args.Event.Key == Gdk.Key.ISO_Left_Tab) { DoTagCompletion (false); args.RetVal = true; } } bool tag_ignore_changes = false; protected override void OnChanged () { if (tag_ignore_changes) return; ClearTagCompletions (); } string tag_completion_typed_so_far; int tag_completion_typed_position; private void DoTagCompletion (bool forward) { string completion; if (tag_completion_index != -1) { if (forward) tag_completion_index = (tag_completion_index + 1) % tag_completions.Length; else tag_completion_index = (tag_completion_index + tag_completions.Length - 1) % tag_completions.Length; } else { tag_completion_typed_position = Position; string right_of_cursor = Text.Substring (tag_completion_typed_position); if (right_of_cursor.Length > 1) return; int last_comma = Text.LastIndexOf (','); if (last_comma > tag_completion_typed_position) return; tag_completion_typed_so_far = Text.Substring (last_comma + 1).TrimStart (new char [] {' '}); if (tag_completion_typed_so_far == null || tag_completion_typed_so_far.Length == 0) return; tag_completions = tag_store.GetTagsByNameStart (tag_completion_typed_so_far); if (tag_completions == null) return; if (forward) tag_completion_index = 0; else tag_completion_index = tag_completions.Length - 1; } tag_ignore_changes = true; completion = tag_completions [tag_completion_index].Name.Substring (tag_completion_typed_so_far.Length); Text = Text.Substring (0, tag_completion_typed_position) + completion; tag_ignore_changes = false; Position = Text.Length; SelectRegion (tag_completion_typed_position, Text.Length); } void FinishTagCompletion () { if (tag_completion_index == -1) return; int sel_start, sel_end, pos; pos = Position; if (GetSelectionBounds (out sel_start, out sel_end)) { pos = sel_end; SelectRegion (-1, -1); } InsertText (", ", ref pos); Position = pos + 2; ClearTagCompletions (); } //Activated means the user pressed 'Enter' protected override void OnActivated () { string [] tagnames = GetTypedTagNames (); if (tagnames == null) return; // Add any new tags to the selected photos ArrayList new_tags = new ArrayList (); for (int i = 0; i < tagnames.Length; i ++) { if (tagnames [i].Length == 0) continue; if (selected_photos_tagnames.Contains (tagnames [i])) continue; Tag t = tag_store.GetTagByName (tagnames [i]); if (t != null) // Correct for capitalization differences tagnames [i] = t.Name; new_tags.Add (tagnames [i]); } //Send event if (new_tags.Count != 0 && TagsAttached != null) TagsAttached (this, (string []) new_tags.ToArray (typeof (string))); // Remove any removed tags from the selected photos ArrayList remove_tags = new ArrayList (); foreach (string tagname in selected_photos_tagnames) { if (! IsTagInList (tagnames, tagname)) { Tag tag = tag_store.GetTagByName (tagname); remove_tags.Add (tag); } } //Send event if (remove_tags.Count != 0 && TagsRemoved != null) TagsRemoved (this, (Tag []) remove_tags.ToArray (typeof (Tag))); } private static bool IsTagInList (string [] tags, string tag) { foreach (string t in tags) if (t == tag) return true; return false; } private void HandleFocusOutEvent (object o, Gtk.FocusOutEventArgs args) { Update (); } protected override bool OnFocusInEvent (Gdk.EventFocus evnt) { AppendComma (); return base.OnFocusInEvent (evnt); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/ThumbnailDateCaptionRenderer.cs0000644000175000017500000000502411503404761027475 0ustar00rubenruben00000000000000/* * ThumbnailDateCaptionRenderer.cs * * Author(s) * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using System.Collections.Generic; using Gtk; using Gdk; using Hyena.Gui; using FSpot.Core; namespace FSpot.Widgets { /// /// Renders a text caption with the date of the photo. This class is not based on /// TextCaptionRenderer, because it uses caching of the dates. /// public class ThumbnailDateCaptionRenderer : ThumbnailCaptionRenderer { #region Private Fields private Dictionary cache = new Dictionary (); #endregion #region Constructor public ThumbnailDateCaptionRenderer () { } #endregion #region Drawing Methods public override int GetHeight (Widget widget, int width) { return widget.Style.FontDescription.MeasureTextHeight (widget.PangoContext); } public override void Render (Drawable window, Widget widget, Rectangle cell_area, Rectangle expose_area, StateType cell_state, IPhoto photo) { string date_text = null; if (photo is IInvalidPhotoCheck && (photo as IInvalidPhotoCheck).IsInvalid) return; if (cell_area.Width > 200) { date_text = photo.Time.ToString (); } else { date_text = photo.Time.ToShortDateString (); } Pango.Layout layout = null; if ( ! cache.TryGetValue (date_text, out layout)) { layout = new Pango.Layout (widget.PangoContext); layout.SetText (date_text); cache.Add (date_text, layout); } Rectangle layout_bounds; layout.GetPixelSize (out layout_bounds.Width, out layout_bounds.Height); layout_bounds.Y = cell_area.Y; layout_bounds.X = cell_area.X + (cell_area.Width - layout_bounds.Width) / 2; if (layout_bounds.IntersectsWith (expose_area)) { Style.PaintLayout (widget.Style, window, cell_state, true, expose_area, widget, "IconView", layout_bounds.X, layout_bounds.Y, layout); } } #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/SlideShow.cs0000644000175000017500000001024311503404761023647 0ustar00rubenruben00000000000000// // FSpot.Widgets.SlideShow.cs // // Author(s): // Stephane Delcroix // // This is open source software. See COPYING for details. // using System; using System.Collections.Generic; using Gtk; using Gdk; using Mono.Addins; using FSpot.Core; using FSpot.Bling; using FSpot.Extensions; using FSpot.Imaging; using FSpot.Transitions; using FSpot.Utils; namespace FSpot.Widgets { public class SlideShow : DrawingArea { bool running; BrowsablePointer item; int loadRetries = 0; #region Public API public SlideShow (BrowsablePointer item) : this (item, 6000, false) { } public SlideShow (BrowsablePointer item, uint interval_ms, bool init) : base () { this.item = item; DoubleBuffered = false; AppPaintable = true; CanFocus = true; item.Changed += HandleItemChanged; foreach (TransitionNode transition in AddinManager.GetExtensionNodes ("/FSpot/SlideShow")) { if (this.transition == null) this.transition = transition.Transition; transitions.Add (transition.Transition); } flip = new DelayedOperation (interval_ms, delegate {item.MoveNext (true); return true;}); animation = new DoubleAnimation (0, 1, new TimeSpan (0, 0, 2), HandleProgressChanged, GLib.Priority.Default); if (init) { HandleItemChanged (null, null); } } SlideShowTransition transition; public SlideShowTransition Transition { get { return transition; } set { if (value == transition) return; transition = value; QueueDraw (); } } List transitions = new List (); public IEnumerable Transitions { get { return transitions; } } DoubleAnimation animation; DelayedOperation flip; public void Start () { running = true; flip.Start (); } public void Stop () { running = false; flip.Stop (); } #endregion #region Event Handlers Pixbuf prev, next; object sync_handle = new object (); void HandleItemChanged (object sender, EventArgs e) { flip.Stop (); if (running) flip.Start (); lock (sync_handle) { if (prev != null && prev != PixbufUtils.ErrorPixbuf) prev.Dispose (); prev = next; LoadNext (); if (animation.IsRunning) animation.Stop (); progress = 0; animation.Start (); } } void LoadNext () { if (next != null) { next = null; } if (item == null || item.Current == null) return; using (var img = ImageFile.Create (item.Current.DefaultVersion.Uri)) { try { using (var pb = img.Load ()) { double scale = Math.Min ((double)Allocation.Width/(double)pb.Width, (double)Allocation.Height/(double)pb.Height); int w = (int)(pb.Width * scale); int h = (int)(pb.Height * scale); if (w > 0 && h > 0) next = pb.ScaleSimple ((int)(pb.Width * scale), (int)(pb.Height * scale), InterpType.Bilinear); } Cms.Profile screen_profile; if (FSpot.ColorManagement.Profiles.TryGetValue (Preferences.Get (Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE), out screen_profile)) FSpot.ColorManagement.ApplyProfile (next, screen_profile); loadRetries = 0; } catch (Exception) { next = PixbufUtils.ErrorPixbuf; if (++loadRetries < 10) item.MoveNext (true); else loadRetries = 0; } } } double progress = 0; void HandleProgressChanged (double progress) { lock (sync_handle) { this.progress = progress; QueueDraw (); } } #endregion #region Gtk Widgetry protected override bool OnExposeEvent (Gdk.EventExpose args) { lock (sync_handle) { transition.Draw (args.Window, prev, next, Allocation.Width, Allocation.Height, progress); } return true; } protected override void OnDestroyed () { if (prev != null && prev != PixbufUtils.ErrorPixbuf) prev.Dispose (); if (next != null && next != PixbufUtils.ErrorPixbuf) next.Dispose (); base.OnDestroyed (); } protected override void OnSizeAllocated (Rectangle allocation) { base.OnSizeAllocated (allocation); LoadNext (); QueueDraw (); } protected override void OnUnrealized () { flip.Stop (); base.OnUnrealized (); } #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/TrayView.cs0000644000175000017500000000140511503404761023520 0ustar00rubenruben00000000000000/* * TrayView.cs * * Author(s): * Larry Ewing * Mike Gemuende * * Copyright (C) 2004 Novell, Inc. * Copyright (C) 2010 Mike Gemuende * * This is free software. See COPYING for details. */ using Gdk; using Gtk; using FSpot.Core; namespace FSpot.Widgets { /// /// This class implements a simply tray widget which which shows a collection of photos /// and does not react to user interaction. /// public class TrayView : CollectionGridView { #region Constructors public TrayView (System.IntPtr raw) : base (raw) {} public TrayView (IBrowsableCollection collection) : base (collection) { MaxColumns = 1; } #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/CellRendererTextProgress.cs0000644000175000017500000001146511503404760026714 0ustar00rubenruben00000000000000/* * FSpot.Widgets.CellRendererTextProgress.cs * * Author(s) * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using System.Collections.Generic; using Gtk; using GLib; using FSpot; using FSpot.Utils; using Mono.Unix; namespace FSpot.Widgets { /* * Because subclassing of CellRendererText does not to work, we * use a new cellrenderer, which renderes a simple text and a * progress bar below the text similar to the one used in baobab (gnome-utils) */ public class CellRendererTextProgress : CellRenderer { readonly int progress_width; readonly int progress_height; static Gdk.Color green = new Gdk.Color (0xcc, 0x00, 0x00); static Gdk.Color yellow = new Gdk.Color (0xed, 0xd4, 0x00); static Gdk.Color red = new Gdk.Color (0x73, 0xd2, 0x16); public CellRendererTextProgress () : this (70, 8) { } public CellRendererTextProgress (int progress_width, int progress_height) { this.progress_width = progress_width; this.progress_height = progress_height; Xalign = 0.0f; Yalign = 0.5f; Xpad = Ypad = 2; } protected CellRendererTextProgress (IntPtr ptr) : base (ptr) { } int progress_value; [GLib.PropertyAttribute ("value")] public int Value { get { return progress_value; } set { /* normalize value */ progress_value = Math.Max (Math.Min (value, 100), 0); } } Pango.Layout text_layout; string text; [GLib.PropertyAttribute ("text")] public string Text { get { return text; } set { if (text == value) return; text = value; text_layout = null; } } bool use_markup; public bool UseMarkup { get { return use_markup; } set { if (use_markup == value) return; use_markup = value; text_layout = null; } } void UpdateLayout (Widget widget) { text_layout = new Pango.Layout (widget.PangoContext); if (UseMarkup) text_layout.SetMarkup (text); else text_layout.SetText (text); } Gdk.Color GetValueColor () { if (progress_value <= 33) return green; if (progress_value <= 66) return yellow; return red; } public override void GetSize (Gtk.Widget widget, ref Gdk.Rectangle cell_area, out int x_offset, out int y_offset, out int width, out int height) { if (text_layout == null) UpdateLayout (widget); int text_width, text_height; text_layout.GetPixelSize (out text_width, out text_height); width = (int) (2 * Xpad + Math.Max (progress_width, text_width)); height = (int) (3 * Ypad + progress_height + text_height); x_offset = Math.Max ((int) (Xalign * (cell_area.Width - width)), 0); y_offset = Math.Max ((int) (Yalign * (cell_area.Height - height)), 0); } protected override void Render (Gdk.Drawable window, Gtk.Widget widget, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, Gdk.Rectangle expose_area, Gtk.CellRendererState flags) { base.Render (window, widget, background_area, cell_area, expose_area, flags); if (text_layout == null) UpdateLayout (widget); int x, y, width, height, text_width, text_height; /* first render the text */ text_layout.GetPixelSize (out text_width, out text_height); x = (int) (cell_area.X + Xpad + Math.Max ((int) (Xalign * (cell_area.Width - 2 * Xpad - text_width)), 0)); y = (int) (cell_area.Y + Ypad); Style.PaintLayout (widget.Style, window, StateType.Normal, true, cell_area, widget, "cellrenderertextprogress", x, y, text_layout); y += (int) (text_height + Ypad); x = (int) (cell_area.X + Xpad + Math.Max ((int) (Xalign * (cell_area.Width - 2 * Xpad - progress_width)), 0)); /* second render the progress bar */ using (Cairo.Context cairo_context = Gdk.CairoHelper.Create (window)) { width = progress_width; height = progress_height; cairo_context.Rectangle (x, y, width, height); Gdk.CairoHelper.SetSourceColor (cairo_context, widget.Style.Dark (StateType.Normal)); cairo_context.Fill (); x += widget.Style.XThickness; y += widget.Style.XThickness; width -= 2* widget.Style.XThickness; height -= 2 * widget.Style.Ythickness; cairo_context.Rectangle (x, y, width, height); Gdk.CairoHelper.SetSourceColor (cairo_context, widget.Style.Light (StateType.Normal)); cairo_context.Fill (); /* scale the value and ensure, that at least one pixel is drawn, if the value is greater than zero */ int scaled_width = (int) Math.Max (((progress_value * width) / 100.0), (progress_value == 0)? 0 : 1); cairo_context.Rectangle (x, y, scaled_width, height); Gdk.CairoHelper.SetSourceColor (cairo_context, GetValueColor ()); cairo_context.Fill (); } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/ImageInfo.cs0000644000175000017500000000747611503404761023622 0ustar00rubenruben00000000000000/* * ImageInfo.cs * * Author * LarryEwing Bounds.Height) { len = viewport.Height; orig_len = Bounds.Height; } else { len = viewport.Width; orig_len = Bounds.Width; } double a = Math.Sqrt (viewport.Width * viewport.Width + viewport.Height * viewport.Height); double alpha = Math.Acos (len / a); double theta = alpha - Math.Abs (tilt); double slen = a * Math.Cos (theta); double scale = slen / orig_len; double x_offset = (viewport.Width - Bounds.Width * scale) / 2.0; double y_offset = (viewport.Height - Bounds.Height * scale) / 2.0; m.Translate (x_offset, y_offset); m.Scale (scale, scale); m.Invert (); m.Translate (viewport.Width * 0.5, viewport.Height * 0.5); m.Rotate (tilt); m.Translate (viewport.Width * -0.5, viewport.Height * -0.5); m.Invert (); return m; } public Matrix Fit (Gdk.Rectangle viewport) { Matrix m = new Matrix (); m.InitIdentity (); double scale = Math.Min (viewport.Width / (double) Bounds.Width, viewport.Height / (double) Bounds.Height); double x_offset = (viewport.Width - Bounds.Width * scale) / 2.0; double y_offset = (viewport.Height - Bounds.Height * scale) / 2.0; m.Translate (x_offset, y_offset); m.Scale (scale, scale); return m; } public void Dispose () { ((IDisposable)Surface).Dispose (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/PreviewPopup.cs0000644000175000017500000001711611503404761024421 0ustar00rubenruben00000000000000/* * * Author(s) * * Larry Ewing * * This is free software. See COPYING for details * */ using System; using Cairo; using Gdk; using FSpot.Core; using FSpot.Widgets; using FSpot.Utils; using FSpot.Gui; namespace FSpot { public class PreviewPopup : Gtk.Window { private CollectionGridView view; private Gtk.Image image; private Gtk.Label label; private bool show_histogram; public bool ShowHistogram { get { return show_histogram; } set { if (value != show_histogram) item = -1; show_histogram = value; } } private FSpot.Histogram hist; private DisposableCache preview_cache = new DisposableCache (50); private int item = -1; public new int Item { get { return item; } set { if (value != item) { item = value; UpdateImage (); } UpdatePosition (); } } private void AddHistogram (Gdk.Pixbuf pixbuf) { if (show_histogram) { Gdk.Pixbuf image = hist.Generate (pixbuf); double scalex = 0.5; double scaley = 0.5; int width = (int)(image.Width * scalex); int height = (int)(image.Height * scaley); image.Composite (pixbuf, pixbuf.Width - width - 10, pixbuf.Height - height - 10, width, height, pixbuf.Width - width - 10, pixbuf.Height - height - 10, scalex, scaley, Gdk.InterpType.Bilinear, 200); } } protected override void OnRealized () { bool composited = CompositeUtils.IsComposited (Screen) && CompositeUtils.SetRgbaColormap (this); AppPaintable = composited; base.OnRealized (); } protected override bool OnExposeEvent (Gdk.EventExpose args) { int round = 12; Context g = Gdk.CairoHelper.Create (GdkWindow); g.Operator = Operator.Source; g.Source = new SolidPattern (new Cairo.Color (0, 0, 0, 0)); g.Paint (); g.Operator = Operator.Over; g.Source = new SolidPattern (new Cairo.Color (0, 0, 0, .7)); g.MoveTo (round, 0); //g.LineTo (Allocation.Width - round, 0); g.Arc (Allocation.Width - round, round, round, - Math.PI * 0.5, 0); //g.LineTo (Allocation.Width, Allocation.Height - round); g.Arc (Allocation.Width - round, Allocation.Height - round, round, 0, Math.PI * 0.5); //g.LineTo (round, Allocation.Height); g.Arc (round, Allocation.Height - round, round, Math.PI * 0.5, Math.PI); g.Arc (round, round, round, Math.PI, Math.PI * 1.5); g.ClosePath (); g.Fill (); ((IDisposable)g).Dispose (); return base.OnExposeEvent (args); } private void UpdateImage () { IPhoto item = view.Collection [Item]; string orig_path = item.DefaultVersion.Uri.LocalPath; Gdk.Pixbuf pixbuf = FSpot.Utils.PixbufUtils.ShallowCopy (preview_cache.Get (orig_path + show_histogram.ToString ())); if (pixbuf == null) { // A bizarre pixbuf = hack to try to deal with cinematic displays, etc. int preview_size = ((this.Screen.Width + this.Screen.Height)/2)/3; try { pixbuf = FSpot.PhotoLoader.LoadAtMaxSize (item, preview_size, preview_size); } catch (Exception) { pixbuf = null; } if (pixbuf != null) { preview_cache.Add (orig_path + show_histogram.ToString (), pixbuf); AddHistogram (pixbuf); image.Pixbuf = pixbuf; } else { image.Pixbuf = PixbufUtils.ErrorPixbuf; } } else { image.Pixbuf = pixbuf; pixbuf.Dispose (); } string desc = String.Empty; if (item.Description != null && item.Description.Length > 0) desc = item.Description + Environment.NewLine; desc += item.Time.ToString () + " " + item.Name; label.Text = desc; } private void UpdatePosition () { int x, y; Gdk.Rectangle bounds = view.CellBounds (this.Item); Gtk.Requisition requisition = this.SizeRequest (); this.Resize (requisition.Width, requisition.Height); view.GdkWindow.GetOrigin (out x, out y); // Acount for scrolling bounds.X -= (int)view.Hadjustment.Value; bounds.Y -= (int)view.Vadjustment.Value; // calculate the cell center x += bounds.X + (bounds.Width / 2); y += bounds.Y + (bounds.Height / 2); // find the window's x location limiting it to the screen x = Math.Max (0, x - requisition.Width / 2); x = Math.Min (x, this.Screen.Width - requisition.Width); // find the window's y location offset above or below depending on space y = Math.Max (0, y - requisition.Height / 2); y = Math.Min (y, this.Screen.Height - requisition.Height); this.Move (x, y); } private void UpdateItem (int x, int y) { int item = view.CellAtPosition (x, y); if (item >= 0) { this.Item = item; Show (); } else { this.Hide (); } } private void UpdateItem () { int x, y; view.GetPointer (out x, out y); x += (int) view.Hadjustment.Value; y += (int) view.Vadjustment.Value; UpdateItem (x, y); } private void HandleIconViewMotion (object sender, Gtk.MotionNotifyEventArgs args) { if (!this.Visible) return; int x = (int) args.Event.X; int y = (int) args.Event.Y; view.GrabFocus (); UpdateItem (x, y); } private void HandleIconViewKeyPress (object sender, Gtk.KeyPressEventArgs args) { switch (args.Event.Key) { case Gdk.Key.v: ShowHistogram = false; UpdateItem (); args.RetVal = true; break; case Gdk.Key.V: ShowHistogram = true; UpdateItem (); args.RetVal = true; break; } } private void HandleKeyRelease (object sender, Gtk.KeyReleaseEventArgs args) { switch (args.Event.Key) { case Gdk.Key.v: case Gdk.Key.V: case Gdk.Key.h: this.Hide (); break; } } private void HandleButtonPress (object sender, Gtk.ButtonPressEventArgs args) { this.Hide (); } private void HandleIconViewDestroy (object sender, Gtk.DestroyEventArgs args) { this.Destroy (); } private void HandleDestroyed (object sender, System.EventArgs args) { this.preview_cache.Dispose (); } protected override bool OnMotionNotifyEvent (Gdk.EventMotion args) { // // We look for motion events on the popup window so that // if the pointer manages to get over the window we can // Update the image properly and/or get out of the way. // UpdateItem (); return false; } public PreviewPopup (SelectionCollectionGridView view) : base (Gtk.WindowType.Toplevel) { Gtk.VBox vbox = new Gtk.VBox (); this.Add (vbox); this.AddEvents ((int) (Gdk.EventMask.PointerMotionMask | Gdk.EventMask.KeyReleaseMask | Gdk.EventMask.ButtonPressMask)); this.Decorated = false; this.SkipTaskbarHint = true; this.SkipPagerHint = true; this.SetPosition (Gtk.WindowPosition.None); this.KeyReleaseEvent += HandleKeyRelease; this.ButtonPressEvent += HandleButtonPress; this.Destroyed += HandleDestroyed; this.view = view; view.MotionNotifyEvent += HandleIconViewMotion; view.KeyPressEvent += HandleIconViewKeyPress; view.KeyReleaseEvent += HandleKeyRelease; view.DestroyEvent += HandleIconViewDestroy; this.BorderWidth = 6; hist = new FSpot.Histogram (); hist.RedColorHint = 127; hist.GreenColorHint = 127; hist.BlueColorHint = 127; hist.BackgroundColorHint = 0xff; image = new Gtk.Image (); image.CanFocus = false; label = new Gtk.Label (String.Empty); label.CanFocus = false; label.ModifyFg (Gtk.StateType.Normal, new Gdk.Color (127, 127, 127)); label.ModifyBg (Gtk.StateType.Normal, new Gdk.Color (0, 0, 0)); this.ModifyFg (Gtk.StateType.Normal, new Gdk.Color (127, 127, 127)); this.ModifyBg (Gtk.StateType.Normal, new Gdk.Color (0, 0, 0)); vbox.PackStart (image, true, true, 0); vbox.PackStart (label, true, false, 0); vbox.ShowAll (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/RatingMenuItem.cs0000644000175000017500000000377511441732537024660 0ustar00rubenruben00000000000000// // RatingMenuItem.cs // // Author: // Aaron Bockover // Mike Gemuende // // Copyright (C) 2007 Novell, Inc. // Copyright (C) 2010 Mike Gemuende // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace FSpot.Widgets { public class RatingMenuItem : Hyena.Widgets.RatingMenuItem { private RatingEntry entry; public RatingMenuItem () : base (new FSpot.Widgets.RatingEntry ()) { entry = this.RatingEntry as FSpot.Widgets.RatingEntry; } public RatingMenuItem (object parent) : this () { if (parent is FullScreenView) { entry.Value = (int)(parent as FullScreenView).View.Item.Current.Rating; } else if (App.Instance.Organizer.Selection.Count == 1) { entry.Value = (int)App.Instance.Organizer.Selection[0].Rating; } } protected RatingMenuItem (IntPtr raw) : base (raw) { } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/FindBar.cs0000644000175000017500000004254511503404760023264 0ustar00rubenruben00000000000000/* * Widgets/FindBar.cs * * Author(s) * Gabriel Burt * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using System.Collections; using System.Text; using System.Text.RegularExpressions; using Gtk; using Gdk; using Mono.Unix; using FSpot.Core; using FSpot.Query; using Hyena; namespace FSpot.Widgets { public class FindBar : HighlightedBox { private Entry entry; private string last_entry_text = String.Empty; private int open_parens = 0, close_parens = 0; private PhotoQuery query; private Term root_term = null; private HBox box; /* * Properties */ public bool Completing { get { return (entry.Completion as LogicEntryCompletion).Completing; } } public Gtk.Entry Entry { get { return entry; } } public Term RootTerm { get { return root_term; } } /* * Constructor */ public FindBar (PhotoQuery query, TreeModel model) : base(new HBox()) { this.query = query; box = Child as HBox; box.Spacing = 6; box.BorderWidth = 2; box.PackStart (new Label (Catalog.GetString ("Find:")), false, false, 0); entry = new Entry (); entry.Completion = new LogicEntryCompletion (entry, model); entry.TextInserted += HandleEntryTextInserted; entry.TextDeleted += HandleEntryTextDeleted; entry.KeyPressEvent += HandleEntryKeyPress; box.PackStart (entry, true, true, 0); Button clear_button = new Gtk.Button (); clear_button.Add (new Gtk.Image ("gtk-close", Gtk.IconSize.Button)); clear_button.Clicked += HandleCloseButtonClicked; clear_button.Relief = Gtk.ReliefStyle.None; box.PackStart (clear_button, false, false, 0); } /* * Event Handlers */ private void HandleCloseButtonClicked (object sender, EventArgs args) { Clear (); } private void HandleEntryTextInserted (object sender, TextInsertedArgs args) { //Log.DebugFormat ("inserting {0}, ( = {1} ) = {2}", args.Text, open_parens, close_parens); //int start = args.Position - args.Length; for (int i = 0; i < args.Text.Length; i++) { char c = args.Text [i]; if (c == '(') open_parens++; else if (c == ')') close_parens++; } int pos = entry.Position + 1; int close_parens_needed = open_parens - close_parens; for (int i = 0; i < close_parens_needed; i++) { entry.TextInserted -= HandleEntryTextInserted; entry.InsertText (")", ref pos); close_parens++; entry.TextInserted += HandleEntryTextInserted; pos++; } //Log.DebugFormat ("done w/ insert, {0}, ( = {1} ) = {2}", args.Text, open_parens, close_parens); last_entry_text = entry.Text; QueueUpdate (); } private void HandleEntryTextDeleted (object sender, TextDeletedArgs args) { int length = args.EndPos - args.StartPos; //Log.DebugFormat ("start {0} end {1} len {2} last {3}", args.StartPos, args.EndPos, length, last_entry_text); string txt = length < 0 ? last_entry_text : last_entry_text.Substring (args.StartPos, length); for (int i = 0; i < txt.Length; i++) { if (txt [i] == '(') open_parens--; else if (txt [i] == ')') close_parens--; } last_entry_text = entry.Text; QueueUpdate (); } private void HandleEntryKeyPress (object sender, KeyPressEventArgs args) { //bool shift = ModifierType.ShiftMask == (args.Event.State & ModifierType.ShiftMask); switch (args.Event.Key) { case (Gdk.Key.Escape): Clear (); args.RetVal = true; break; case (Gdk.Key.Tab): // If we are at the end of the entry box, let the normal Tab handler do its job if (entry.Position == entry.Text.Length) { args.RetVal = false; return; } // Go until the current character is an open paren while (entry.Position < entry.Text.Length && entry.Text [entry.Position] != '(') entry.Position++; // Put the cursor right after the open paren entry.Position++; args.RetVal = true; break; default: args.RetVal = false; break; } } /* * Helper methods. */ private void Clear () { entry.Text = String.Empty; Hide (); } // OPS The operators we support, case insensitive //private static string op_str = "(?'Ops' or | and |, | \\s+ )"; private static string op_str = "(?'Ops' "+ Catalog.GetString ("or") + " | "+ Catalog.GetString ("and") + " |, )"; // Match literals, eg tags or other text to search on private static string literal_str = "[^{0}{1}]+?"; //private static string not_literal_str = "not\\s*\\((?'NotTag'[^{0}{1}]+)\\)"; // Match a group surrounded by parenthesis and one or more terms separated by operators private static string term_str = "(((?'Open'{0})(?'Pre'[^{0}{1}]*?))+((?'Close-Open'{1})(?'Post'[^{0}{1}]*?))+)*?(?(Open)(?!))"; // Match a group surrounded by parenthesis and one or more terms separated by operators, surrounded by not() //private static string not_term_str = String.Format("not\\s*(?'NotTerm'{0})", term_str); // Match a simple term or a group term or a not(group term) //private static string comb_term_str = String.Format ("(?'Term'{0}|{2}|{1})", simple_term_str, term_str, not_term_str); private static string comb_term_str = String.Format ("(?'Term'{0}|{1})|not\\s*\\((?'NotTerm'{0})\\)|not\\s*(?'NotTerm'{1})", literal_str, term_str); // Match a single term or a set of terms separated by operators private static string regex_str = String.Format ("^((?'Terms'{0}){1})*(?'Terms'{0})$", comb_term_str, op_str); private static Regex term_regex = new Regex ( String.Format (regex_str, "\\(", "\\)"), RegexOptions.IgnoreCase | RegexOptions.Compiled ); // Breaking the query the user typed into something useful involves running // it through the above regular expression recursively until it is broken down // into literals and operators that we can use to generate SQL queries. private bool ConstructQuery (Term parent, int depth, string txt) { return ConstructQuery(parent, depth, txt, false); } private bool ConstructQuery (Term parent, int depth, string txt, bool negated) { if (txt == null || txt.Length == 0) return true; string indent = String.Format ("{0," + depth*2 + "}", " "); //Log.DebugFormat (indent + "Have text: {0}", txt); // Match the query the user typed against our regular expression Match match = term_regex.Match (txt); if (!match.Success) { //Log.Debug (indent + "Failed to match."); return false; } bool op_valid = true; string op = String.Empty; // For the moment at least we don't support operator precedence, so we require // that only a single operator is used for any given term unless it is made unambiguous // by using parenthesis. foreach (Capture capture in match.Groups ["Ops"].Captures) { if (op == String.Empty) op = capture.Value; else if (op != capture.Value) { op_valid = false; break; } } if (!op_valid) { Log.Information (indent + "Ambiguous operator sequence. Use parenthesis to explicitly define evaluation order."); return false; } if (match.Groups ["Terms"].Captures.Count == 1 && match.Groups["NotTerm"].Captures.Count != 1) { //Log.DebugFormat (indent + "Unbreakable term: {0}", match.Groups ["Terms"].Captures [0]); string literal; bool is_negated = false; Tag tag = null; if (match.Groups ["NotTag"].Captures.Count == 1) { literal = match.Groups ["NotTag"].Captures [0].Value; is_negated = true; } else { literal = match.Groups ["Terms"].Captures [0].Value; } is_negated = is_negated || negated; tag = App.Instance.Database.Tags.GetTagByName (literal); // New OR term so we can match against both tag and text search parent = new OrTerm(parent, null); // If the literal is the name of a tag, include it in the OR //AbstractLiteral term = null; if (tag != null) { new Literal (parent, tag, null); } // Always include the literal text in the search (path, comment, etc) new TextLiteral (parent, literal); // If the term was negated, negate the OR parent term if (is_negated) { parent = parent.Invert(true); } if (RootTerm == null) root_term = parent; return true; } else { Term us = null; if (op != null && op != String.Empty) { us = Term.TermFromOperator (op, parent, null); if (RootTerm == null) root_term = us; } foreach (Capture capture in match.Groups ["Term"].Captures) { string subterm = capture.Value.Trim (); if (subterm == null || subterm.Length == 0) continue; // Strip leading/trailing parens if (subterm [0] == '(' && subterm [subterm.Length - 1] == ')') { subterm = subterm.Remove (subterm.Length - 1, 1); subterm = subterm.Remove (0, 1); } //Log.DebugFormat (indent + "Breaking subterm apart: {0}", subterm); if (!ConstructQuery (us, depth + 1, subterm, negated)) return false; } foreach (Capture capture in match.Groups ["NotTerm"].Captures) { string subterm = capture.Value.Trim (); if (subterm == null || subterm.Length == 0) continue; // Strip leading/trailing parens if (subterm [0] == '(' && subterm [subterm.Length - 1] == ')') { subterm = subterm.Remove (subterm.Length - 1, 1); subterm = subterm.Remove (0, 1); } //Log.DebugFormat (indent + "Breaking not subterm apart: {0}", subterm); if (!ConstructQuery (us, depth + 1, subterm, true)) return false; } if (negated && us != null) { if (us == RootTerm) root_term = us.Invert(false); else us.Invert(false); } return true; } } private bool updating = false; private uint update_timeout_id = 0; private void QueueUpdate () { if (updating || update_timeout_id != 0) { lock(this) { // If there is a timer set and we are not yet handling its timeout, then remove the timer // so we delay its trigger for another 500ms. if (!updating && update_timeout_id != 0) GLib.Source.Remove (update_timeout_id); // Assuming we're not currently handling a timeout, add a new timer if (!updating) update_timeout_id = GLib.Timeout.Add(500, OnUpdateTimer); } } else { // If we are not updating and there isn't a timer already set, then there is // no risk of race condition with the timeout handler. update_timeout_id = GLib.Timeout.Add(500, OnUpdateTimer); } } private bool OnUpdateTimer () { lock(this) { updating = true; } Update(); lock(this) { updating = false; update_timeout_id = 0; } return false; } private void Update () { // Clear the last root term root_term = null; if (ParensValid () && ConstructQuery (null, 0, entry.Text)) { if (RootTerm != null) { //Log.DebugFormat("rootTerm = {0}", RootTerm); if (!(RootTerm is AndTerm)) { // A little hacky, here to make sure the root term is a AndTerm which will // ensure we handle the Hidden tag properly AndTerm root_parent = new AndTerm(null, null); RootTerm.Parent = root_parent; root_term = root_parent; } //Log.DebugFormat("rootTerm = {0}", RootTerm); if (!(RootTerm is AndTerm)) { // A little hacky, here to make sure the root term is a AndTerm which will // ensure we handle the Hidden tag properly AndTerm root_parent = new AndTerm(null, null); RootTerm.Parent = root_parent; root_term = root_parent; } //Log.DebugFormat ("condition = {0}", RootTerm.SqlCondition ()); query.TagTerm = new ConditionWrapper (RootTerm.SqlCondition ()); } else { query.TagTerm = null; //Log.Debug ("root term is null"); } } } private bool ParensValid () { for (int i = 0; i < entry.Text.Length; i++) { if (entry.Text [i] == '(' || entry.Text [i] == ')') { int pair_pos = ParenPairPosition (entry.Text, i); if (pair_pos == -1) return false; } } return true; } /* * Static Utility Methods */ private static int ParenPairPosition (string txt, int pos) { char one = txt [pos]; bool open = (one == '('); char two = (open) ? ')' : '('; //int level = 0; int num = (open) ? txt.Length - pos - 1: pos; int sames = 0; for (int i = 0; i < num; i++) { if (open) pos++; else pos--; if (pos < 0 || pos > txt.Length - 1) return -1; if (txt [pos] == one) sames++; else if (txt [pos] == two) { if (sames == 0) return pos; else sames--; } } return -1; } /*private static string ReverseString (string txt) { char [] txt_a = txt.ToCharArray (); System.Reverse (txt_a); return new String (txt_a); }*/ } public class LogicEntryCompletion : EntryCompletion { private Entry entry; private bool completing = false; public bool Completing { get { return completing; } } public LogicEntryCompletion (Entry entry, TreeModel tree_model) { this.entry = entry; Model = new DependentListStore(tree_model); InlineCompletion = false; MinimumKeyLength = 1; TextColumn = 1; PopupSetWidth = false; MatchFunc = LogicEntryCompletionMatchFunc; MatchSelected += HandleMatchSelected; // Insert these when appropriate.. //InsertActionText (0, "or"); //InsertActionText (1, "and"); // HandleAction... } [GLib.ConnectBefore] private void HandleMatchSelected (object sender, MatchSelectedArgs args) { string name = args.Model.GetValue (args.Iter, TextColumn) as string; //Log.DebugFormat ("match selected..{0}", name); int pos = entry.Position; string updated_text = completion_logic.ReplaceKey (entry.Text, name, ref pos); completing = true; entry.Text = updated_text; entry.Position = pos; completing = false; args.RetVal = true; //Log.Debug ("done w/ match selected"); } private CompletionLogic completion_logic = new CompletionLogic (); public bool LogicEntryCompletionMatchFunc (EntryCompletion completion, string key, TreeIter iter) { if (Completing) return false; key = key == null ? null : key.Normalize(NormalizationForm.FormC); string name = completion.Model.GetValue (iter, completion.TextColumn) as string; int pos = entry.Position - 1; return completion_logic.MatchFunc (name, key, pos); } } public class CompletionLogic { string last_key = String.Empty; string transformed_key = String.Empty; int start = 0; private static string or_op = " " + Catalog.GetString ("or") + " "; private static string and_op = " " + Catalog.GetString ("and") + " "; private static int or_op_len = or_op.Length; private static int and_op_len = and_op.Length; public bool MatchFunc (string name, string key, int pos) { // If this is the fist comparison for this key, convert the key (which is the entire search string) // into just the part that is relevant to completing this tag name. if (key != last_key) { last_key = key; if (key == null || key.Length == 0 || pos < 0 || pos > key.Length - 1) transformed_key = String.Empty; else if (key [pos] == '(' || key [pos] == ')' || key [pos] == ',') transformed_key = String.Empty; else { start = 0; for (int i = pos; i >= 0; i--) { if (key [i] == ')' || key [i] == '(' || (i >= and_op_len - 1 && String.Compare (key.Substring (i - and_op_len + 1, and_op_len), and_op, true) == 0) || (i >= or_op_len - 1 && String.Compare (key.Substring (i - or_op_len + 1, or_op_len), or_op, true) == 0)) { //Log.DebugFormat ("have start break char at {0}", i); start = i + 1; break; } } int end = key.Length - 1; for (int j = pos; j < key.Length; j++) { if (key [j] == ')' || key [j] == '(' || (key.Length >= j + and_op_len && String.Compare (key.Substring (j, and_op_len), and_op, true) == 0) || (key.Length >= j + or_op_len && String.Compare (key.Substring (j, or_op_len), or_op, true) == 0)) { end = j - 1; break; } } //Log.DebugFormat ("start = {0} end = {1}", start, end); int len = end - start + 1; if (len > 0 && start < last_key.Length) transformed_key = last_key.Substring (start, end - start + 1); else transformed_key = String.Empty; } //Log.DebugFormat ("transformed key {0} into {1}", key, transformed_key); } if (transformed_key == String.Empty) return false; // Ignore null or names that are too short if (name == null || name.Length <= transformed_key.Length) return false; //Log.DebugFormat ("entered = {0} compared to {1}", transformed_key, name); // Try to match key and name case insensitive if (String.Compare (transformed_key, name.Substring (0, transformed_key.Length), true) == 0) { return true; } // Try to match with diacritics removed from name string simplified_name = StringUtil.SearchKey (name.Substring (0, transformed_key.Length)); //Log.DebugFormat ("entered = {0} compared to {1}", transformed_key, simplified_name); return (String.Compare (transformed_key, simplified_name, true) == 0); } public string ReplaceKey (string query, string name, ref int pos) { // do some sanity checks first if (start > query.Length) { Log.Error ("ReplaceKey: start > query.length"); return query; } // move caret after inserted name, even if it was not // at the end of the key pos = start + name.Length; return query.Substring (0, start) + name + query.Substring (start + transformed_key.Length); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/SelectionCollectionGridView.cs0000644000175000017500000004105711503404761027357 0ustar00rubenruben00000000000000/* * SelectionCollectionGridView.cs * * Author(s) * Etore Perazzoli * Larry Ewing * Stephane Delcroix * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using System.Collections.Generic; using Gdk; using Gtk; using FSpot.Core; namespace FSpot.Widgets { // TODO: This event ahndler is a hack. The default event from a widget // (DragBegin) should be used, but therfore, the event must be fired // correctly. public delegate void StartDragHandler (object o, StartDragArgs args); public class StartDragArgs { public Event Event { get; set; } public uint Button { get; set; } public StartDragArgs (uint but, Event evt) { this.Button = but; this.Event = evt; } } public class SelectionCollectionGridView : CollectionGridView { #region Public Properties public SelectionCollection Selection { get; private set; } // Focus Handling private int real_focus_cell; public int FocusCell { get { return real_focus_cell; } set { if (value != real_focus_cell) { value = Math.Max (value, 0); value = Math.Min (value, Collection.Count - 1); InvalidateCell (value); InvalidateCell (real_focus_cell); real_focus_cell = value; } } } #endregion #region Constructors public SelectionCollectionGridView (IntPtr raw) : base (raw) { } public SelectionCollectionGridView (IBrowsableCollection collection) : base (collection) { Selection = new SelectionCollection (Collection); Selection.DetailedChanged += delegate(IBrowsableCollection sender, Int32 [] ids) { if (ids == null) QueueDraw (); else foreach (int id in ids) InvalidateCell (id); }; AddEvents ((int) EventMask.KeyPressMask | (int) EventMask.KeyReleaseMask | (int) EventMask.ButtonPressMask | (int) EventMask.ButtonReleaseMask | (int) EventMask.PointerMotionMask | (int) EventMask.PointerMotionHintMask); CanFocus = true; } #endregion #region Event Handlers public event EventHandler DoubleClicked; // TODO: hack. See definition of StartDragHandler public event StartDragHandler StartDrag; #endregion #region Drawing Methods protected override void DrawPhoto (int cell_num, Rectangle cell_area, Rectangle expose_area, bool selected, bool focussed) { base.DrawPhoto (cell_num, cell_area, expose_area, Selection.Contains (cell_num), (FocusCell == cell_num)); } protected override bool OnExposeEvent (Gdk.EventExpose args) { bool ret = base.OnExposeEvent (args); foreach (Rectangle area in args.Region.GetRectangles ()) { DrawSelection (area); } return ret; } private void DrawSelection (Rectangle expose_area) { if ( ! isRectSelection) return; Gdk.Rectangle region; if ( ! expose_area.Intersect (rect_select, out region)) return; // draw selection using (Cairo.Context cairo_g = CairoHelper.Create (BinWindow)) { Gdk.Color color = Style.Background(StateType.Selected); cairo_g.Color = new Cairo.Color (color.Red/65535.0, color.Green/65535.0, color.Blue/65535.0, 0.5); cairo_g.Rectangle (region.X, region.Y, region.Width, region.Height); cairo_g.Fill (); } //((IDisposable) cairo_g.Target).Dispose (); //((IDisposable) cairo_g).Dispose (); } #endregion #region Utility Methods // TODO: move this to SelectionCollection public void SelectAllCells () { Selection.Add (0, Collection.Count - 1); } protected virtual void ContextMenu (EventButton evnt, int cell_num) { } #endregion #region Event Handler // TODO: the following code need to be cleaned up. // TODO: rubberband selection behaves different than Gtk.IconView. This needs to be fixed. // TODO: selection by clicks behaves different than Gtk.IconView. This needs to be fixed. protected override bool OnButtonPressEvent (EventButton evnt) { int cell_num = CellAtPosition ((int) evnt.X, (int) evnt.Y); start_select_event = evnt; selection_start = new Point ((int) evnt.X, (int) evnt.Y); selection_modifier = evnt.State; isRectSelection = false; isDragDrop = false; switch (evnt.Type) { case EventType.TwoButtonPress: if (evnt.Button != 1 || (evnt.State & (ModifierType.ControlMask | ModifierType.ShiftMask)) != 0) return false; if (DoubleClicked != null) DoubleClicked (this, new BrowsableEventArgs (cell_num, null)); return true; case EventType.ButtonPress: GrabFocus (); // on a cell : context menu if button 3 // cell selection is done on button release if (evnt.Button == 3) { ContextMenu (evnt, cell_num); return true; } else { return false; } } return false; } protected override bool OnButtonReleaseEvent (EventButton evnt) { if (isRectSelection) { // remove scrolling and rectangular selection if (scroll_timeout != 0) { GLib.Source.Remove (scroll_timeout); scroll_timeout = 0; } isRectSelection = false; if (BinWindow != null) { BinWindow.InvalidateRect (rect_select, false); BinWindow.ProcessUpdates (true); } rect_select = new Rectangle(); } else if (!isDragDrop) { int cell_num = CellAtPosition ((int) evnt.X, (int) evnt.Y); if (cell_num != -1) { if ((evnt.State & ModifierType.ControlMask) != 0) { Selection.ToggleCell (cell_num); } else if ((evnt.State & ModifierType.ShiftMask) != 0) { Selection.Add (FocusCell, cell_num); } else { Selection.Clear (); Selection.Add (cell_num); } FocusCell = cell_num; } } isDragDrop = false; return true; } // rectangle of dragging selection private Rectangle rect_select; private Point selection_start; private Point selection_end; private ModifierType selection_modifier; private bool isRectSelection = false; private bool isDragDrop = false; // initial selection private int[] start_select_selection; // initial event used to detect drag&drop private EventButton start_select_event; // timer using when scrolling selection private uint scroll_timeout = 0; private Rectangle BoundedRectangle (Point p1, Point p2) { return new Rectangle (Math.Min (p1.X, p2.X), Math.Min (p1.Y, p2.Y), Math.Abs (p1.X - p2.X) + 1, Math.Abs (p1.Y- p2.Y) + 1); } protected Point GetPointer () { int x, y; GetPointer (out x, out y); return new Point (x + (int) Hadjustment.Value, y + (int) Vadjustment.Value); } // during pointer motion, select/toggle pictures between initial x/y (param) // and current x/y (get pointer) private void UpdateRubberband () { // determine old and new selection var old_selection = rect_select; selection_end = GetPointer (); var new_selection = BoundedRectangle (selection_start, selection_end); // determine region to invalidate var region = Region.Rectangle (old_selection); region.Xor (Region.Rectangle (new_selection)); region.Shrink (-1, -1); BinWindow.InvalidateRegion (region, true); rect_select = new_selection; UpdateRubberbandSelection (); } private void UpdateRubberbandSelection () { var selected_area = BoundedRectangle (selection_start, selection_end); // Restore initial selection var initial_selection = Selection.ToBitArray(); Selection.Clear (false); foreach (int i in start_select_selection) Selection.Add (i, false); // Set selection int first = -1; foreach (var cell_num in CellsInRect (selected_area)) { if (first == -1) first = cell_num; if ((selection_modifier & ModifierType.ControlMask) == 0) Selection.Add (cell_num, false); else Selection.ToggleCell (cell_num, false); } if (first != -1) FocusCell = first; // fire events for cells which have changed selection flag var new_selection = Selection.ToBitArray(); var selection_changed = initial_selection.Xor (new_selection); var changed = new List(); for (int i = 0; i < selection_changed.Length; i++) if (selection_changed.Get(i)) changed.Add (i); if (changed.Count != 0) Selection.SignalChange (changed.ToArray()); } // if scroll is required, a timeout is fired // until the button is release or the pointer is // in window again private int deltaVscroll; private bool HandleMotionTimeout () { int new_x, new_y; // do scroll double newVadj = Vadjustment.Value; if (deltaVscroll < 130) deltaVscroll += 15; Gdk.ModifierType new_mod; Display.GetPointer (out new_x, out new_y, out new_mod); GetPointer (out new_x, out new_y); if (new_y <= 0) { newVadj -= deltaVscroll; if (newVadj < 0) newVadj = 0; } else if ((new_y > Allocation.Height) && (newVadj < Vadjustment.Upper - Allocation.Height - deltaVscroll)) newVadj += deltaVscroll; Vadjustment.Value = newVadj; UpdateRubberband ();// (new Point (new_x + (int) Hadjustment.Value, new_y + (int) Vadjustment.Value)); Vadjustment.ChangeValue (); // stop firing timeout when no button pressed return (new_mod & (ModifierType.Button1Mask | ModifierType.Button3Mask)) != 0; } protected override bool OnMotionNotifyEvent (EventMotion evnt) { if ((evnt.State & (ModifierType.Button1Mask | ModifierType.Button3Mask)) == 0) return false; if (! Gtk.Drag.CheckThreshold (this, selection_start.X, selection_start.Y, (int) evnt.X, (int) evnt.Y)) return false; if (isRectSelection) { // scroll if out of window double d_x, d_y; deltaVscroll = 30; if (EventHelper.GetCoords (evnt, out d_x, out d_y)) { int new_y = (int) d_y; if ((new_y <= 0) || (new_y >= Allocation.Height)) { if (scroll_timeout == 0) scroll_timeout = GLib.Timeout.Add (100, new GLib.TimeoutHandler (HandleMotionTimeout)); } else if (scroll_timeout != 0) { GLib.Source.Remove (scroll_timeout); scroll_timeout = 0; } } else if (scroll_timeout != 0) { GLib.Source.Remove (scroll_timeout); scroll_timeout = 0; } // handle selection UpdateRubberband (); //SelectMotion (new Point ((int) args.Event.X, (int) args.Event.Y)); } else { int cell_num = CellAtPosition (selection_start); if (Selection.Contains (cell_num)) { // on a selected cell : do drag&drop isDragDrop = true; if (StartDrag != null) { uint but; if ((evnt.State & ModifierType.Button1Mask) != 0) but = 1; else but = 3; StartDrag (this, new StartDragArgs(but, start_select_event)); } } else { // not on a selected cell : do rectangular select isRectSelection = true; // ctrl : toggle selected, shift : keep selected if ((evnt.State & (ModifierType.ShiftMask | ModifierType.ControlMask)) == 0) Selection.Clear (); start_select_selection = Selection.Ids; // keep initial selection // no rect draw at beginning rect_select = Rectangle.Zero; return false; } } return true; } protected override bool OnKeyPressEvent (EventKey evnt) { int focus_old = FocusCell; bool shift = ModifierType.ShiftMask == (evnt.State & ModifierType.ShiftMask); bool control = ModifierType.ControlMask == (evnt.State & ModifierType.ControlMask); switch (evnt.Key) { case Gdk.Key.Down: case Gdk.Key.J: case Gdk.Key.j: FocusCell += VisibleColums; break; case Gdk.Key.Left: case Gdk.Key.H: case Gdk.Key.h: if (control && shift) FocusCell -= FocusCell % VisibleColums; else FocusCell--; break; case Gdk.Key.Right: case Gdk.Key.L: case Gdk.Key.l: if (control && shift) FocusCell += VisibleColums - (FocusCell % VisibleColums) - 1; else FocusCell++; break; case Gdk.Key.Up: case Gdk.Key.K: case Gdk.Key.k: FocusCell -= VisibleColums; break; case Gdk.Key.Page_Up: FocusCell -= VisibleColums * VisibleRows; break; case Gdk.Key.Page_Down: FocusCell += VisibleColums * VisibleRows; break; case Gdk.Key.Home: FocusCell = 0; break; case Gdk.Key.End: FocusCell = Collection.Count - 1; break; case Gdk.Key.R: case Gdk.Key.r: FocusCell = new Random().Next(0, Collection.Count - 1); break; case Gdk.Key.space: Selection.ToggleCell (FocusCell); break; case Gdk.Key.Return: if (DoubleClicked != null) DoubleClicked (this, new BrowsableEventArgs (FocusCell, null)); break; default: return false; } if (shift) { if (focus_old != FocusCell && Selection.Contains (focus_old) && Selection.Contains (FocusCell)) Selection.Remove (FocusCell, focus_old); else Selection.Add (focus_old, FocusCell); } else if (!control) { Selection.Clear (); Selection.Add (FocusCell); } ScrollTo (FocusCell); return true; } #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/FolderTreeView.cs0000644000175000017500000001053311503404761024636 0ustar00rubenruben00000000000000/* * FSpot.Widgets.FolderTreeView.cs * * Author(s) * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using System.Collections.Generic; using Gtk; using GLib; using FSpot; using FSpot.Utils; using Hyena; using Mono.Unix; namespace FSpot.Widgets { public class FolderTreeView : SaneTreeView { FolderTreeModel folder_tree_model; protected FolderTreeView (IntPtr raw) : base (raw) {} public FolderTreeView () : this (new FolderTreeModel ()) { } public FolderTreeView (FolderTreeModel tree_model) : base (tree_model) { folder_tree_model = tree_model; HeadersVisible = false; TreeViewColumn column = new TreeViewColumn (); CellRendererPixbuf pixbuf_renderer = new CellRendererPixbuf (); column.PackStart (pixbuf_renderer, false); column.SetCellDataFunc (pixbuf_renderer, PixbufDataFunc as TreeCellDataFunc); CellRendererTextProgress folder_renderer = new CellRendererTextProgress (); column.PackStart (folder_renderer, true); column.SetCellDataFunc (folder_renderer, FolderDataFunc as TreeCellDataFunc); AppendColumn (column); Gtk.Drag.SourceSet (this, Gdk.ModifierType.Button1Mask | Gdk.ModifierType.Button3Mask, folder_tree_source_target_table, Gdk.DragAction.Copy | Gdk.DragAction.Move); } public UriList SelectedUris { get { UriList list = new UriList (); TreePath[] selected_rows = Selection.GetSelectedRows (); foreach (TreePath row in selected_rows) list.Add (new SafeUri (folder_tree_model.GetUriByPath (row))); return list; } } void PixbufDataFunc (TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter) { CellRendererPixbuf renderer = cell as CellRendererPixbuf; string stock; var uri = folder_tree_model.GetUriByIter (iter); if (uri == null) return; File file = FileFactory.NewForUri (uri); try { FileInfo info = file.QueryInfo ("standard::icon", FileQueryInfoFlags.None, null); ThemedIcon themed_icon = info.Icon as ThemedIcon; if (themed_icon != null && themed_icon.Names.Length > 0) stock = themed_icon.Names[0]; else stock = "gtk-directory"; } catch (Exception) { stock = "gtk-directory"; } TreeIter tmp; if (tree_model.IterParent (out tmp, iter)) { renderer.IconName = stock; renderer.CellBackground = null; } else { renderer.IconName = stock; renderer.CellBackgroundGdk = Style.Background (StateType.Selected); } } void FolderDataFunc (TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter) { CellRendererTextProgress renderer = cell as CellRendererTextProgress; int progress_value = 0; int count = (tree_model as FolderTreeModel).Count; if (count != 0) progress_value = (int) ((100.0 * folder_tree_model.GetPhotoCountByIter (iter)) / count); renderer.Value = progress_value; string text = folder_tree_model.GetFolderNameByIter (iter); TreeIter tmp; if (tree_model.IterParent (out tmp, iter)) { renderer.UseMarkup = false; renderer.Text = text; renderer.CellBackground = null; } else { renderer.UseMarkup = true; /* since import do not use GIO at the moment, no other prefix than file:/// is * possible. */ if (text == Uri.UriSchemeFile) renderer.Text = String.Format ("{0}", Catalog.GetString ("Filesystem")); else renderer.Text = String.Format ("{0}", text); renderer.CellBackgroundGdk = Style.Background (StateType.Selected); } } private static TargetEntry [] folder_tree_source_target_table = new TargetEntry [] { DragDropTargets.UriQueryEntry, DragDropTargets.UriListEntry, DragDropTargets.PlainTextEntry }; protected override void OnDragDataGet (Gdk.DragContext context, Gtk.SelectionData selection_data, uint info, uint time_) { if (info == DragDropTargets.UriQueryEntry.Info || info == DragDropTargets.UriListEntry.Info || info == DragDropTargets.PlainTextEntry.Info) { selection_data.SetUriListData (SelectedUris, context.Targets[0]); return; } } protected override bool OnDragDrop (Gdk.DragContext context, int x, int y, uint time_) { return true; } protected override void OnRowActivated (Gtk.TreePath path, Gtk.TreeViewColumn column) { App.Instance.Organizer.SetFolderQuery (SelectedUris); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/ViewContext.cs0000644000175000017500000000066411503404761024233 0ustar00rubenruben00000000000000/* * Widgets.ViewContext.cs * * Author(s) * Ruben Vermeersch * * This is free software. See COPYING for details. */ namespace FSpot.Widgets { // This nasty enum serves to differentiate between the different view // modes. As we have both SingleView and normal F-Spot, there is no // uniform way of naming these contexts. public enum ViewContext { Unknown, Single, Library, Edit, FullScreen } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/ThumbnailTextCaptionRenderer.cs0000644000175000017500000000362411503404761027550 0ustar00rubenruben00000000000000/* * ThumbnailTextCaptionRenderer.cs * * Author(s) * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using Gtk; using Gdk; using Hyena.Gui; using FSpot.Core; namespace FSpot.Widgets { /// /// Class to provide a single text line rendered as caption to a thumbnail. /// public abstract class ThumbnailTextCaptionRenderer : ThumbnailCaptionRenderer { #region Constructor public ThumbnailTextCaptionRenderer () { } #endregion #region Drawing Methods public override int GetHeight (Widget widget, int width) { return widget.Style.FontDescription.MeasureTextHeight (widget.PangoContext); } public override void Render (Drawable window, Widget widget, Rectangle cell_area, Rectangle expose_area, StateType cell_state, IPhoto photo) { string text = GetRenderText (photo); var layout = new Pango.Layout (widget.PangoContext); layout.SetText (text); Rectangle layout_bounds; layout.GetPixelSize (out layout_bounds.Width, out layout_bounds.Height); layout_bounds.Y = cell_area.Y; layout_bounds.X = cell_area.X + (cell_area.Width - layout_bounds.Width) / 2; if (layout_bounds.IntersectsWith (expose_area)) { Style.PaintLayout (widget.Style, window, cell_state, true, expose_area, widget, "IconView", layout_bounds.X, layout_bounds.Y, layout); } } protected abstract string GetRenderText (IPhoto photo); #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/ThumbnailCaptionRenderer.cs0000644000175000017500000000172711503404761026705 0ustar00rubenruben00000000000000/* * ThumbnailCaptionRenderer.cs * * Author(s) * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using Gtk; using Gdk; using FSpot.Core; namespace FSpot.Widgets { /// /// Renders a caption below a thumbnail. It must compute the height needed for /// the annotation. /// public abstract class ThumbnailCaptionRenderer { #region Constructor public ThumbnailCaptionRenderer () { } #endregion #region Drawing Methods public abstract int GetHeight (Widget widget, int width); public abstract void Render (Drawable window, Widget widget, Rectangle cell_area, Rectangle expose_area, StateType cell_state, IPhoto photo); #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/FolderTreePage.cs0000644000175000017500000000115311503404761024576 0ustar00rubenruben00000000000000/* * FSpot.Widgets.FolderTreePage.cs * * Author(s) * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using Gtk; using Mono.Unix; using FSpot.Extensions; namespace FSpot.Widgets { public class FolderTreePage : SidebarPage { readonly FolderTreeView folder_tree_widget; public FolderTreePage () : base (new ScrolledWindow (), Catalog.GetString ("Folders"), "gtk-directory") { ScrolledWindow scrolled_window = SidebarWidget as ScrolledWindow; folder_tree_widget = new FolderTreeView (); scrolled_window.Add (folder_tree_widget); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/FolderTreeModel.cs0000644000175000017500000001051311503404761024762 0ustar00rubenruben00000000000000/* * FSpot.Widgets.FolderTreeModel.cs * * Author(s) * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using System.Collections.Generic; using Gtk; using GLib; using FSpot; using FSpot.Database; using FSpot.Core; using Hyena; using Hyena.Data.Sqlite; using Mono.Unix; namespace FSpot.Widgets { public class FolderTreeModel : TreeStore { protected FolderTreeModel (IntPtr raw) : base (raw) { } Db database; const string query_string = "SELECT base_uri, COUNT(*) AS count " + "FROM photos " + "GROUP BY base_uri " + "ORDER BY base_uri ASC"; public FolderTreeModel () : base (typeof (string), typeof (int), typeof (SafeUri)) { database = App.Instance.Database; database.Photos.ItemsChanged += HandlePhotoItemsChanged; UpdateFolderTree (); } void HandlePhotoItemsChanged (object sender, DbItemEventArgs e) { UpdateFolderTree (); } public string GetFolderNameByIter (TreeIter iter) { if ( ! IterIsValid (iter)) return null; return (string) GetValue (iter, 0); } public int GetPhotoCountByIter (TreeIter iter) { if ( ! IterIsValid (iter)) return -1; return (int) GetValue (iter, 1); } public SafeUri GetUriByIter (TreeIter iter) { if ( ! IterIsValid (iter)) return null; return (SafeUri) GetValue (iter, 2); } public SafeUri GetUriByPath (TreePath row) { TreeIter iter; GetIter (out iter, row); return GetUriByIter (iter); } int count_all; public int Count { get { return count_all; } } /* * UpdateFolderTree queries for directories in database and updates * a possibly existing folder-tree to the queried structure */ private void UpdateFolderTree () { Clear (); count_all = 0; /* points at start of each iteration to the leaf of the last inserted uri */ TreeIter iter = TreeIter.Zero; /* stores the segments of the last inserted uri */ string[] last_segments = new string[] {}; int last_count = 0; IDataReader reader = database.Database.Query (query_string); while (reader.Read ()) { var base_uri = new SafeUri (reader["base_uri"].ToString (), true); int count = Convert.ToInt32 (reader["count"]); // FIXME: this is a workaround hack to stop things from crashing - https://bugzilla.gnome.org/show_bug.cgi?id=622318 int index = base_uri.ToString ().IndexOf ("://"); var hack = base_uri.ToString ().Substring (index + 3); hack = hack.IndexOf ('/') == 0 ? hack : "/" + hack; string[] segments = hack.TrimEnd ('/').Split ('/'); /* First segment contains nothing (since we split by /), so we * can overwrite the first segment for our needs and put the * scheme here. */ segments[0] = base_uri.Scheme; int i = 0; /* find first difference of last inserted an current uri */ while (i < last_segments.Length && i < segments.Length) { if (segments[i] != last_segments[i]) break; i++; } /* points to the parent node of the current iter */ TreeIter parent_iter = iter; /* step back to the level, where the difference occur */ for (int j = 0; j + i < last_segments.Length; j++) { iter = parent_iter; if (IterParent (out parent_iter, iter)) { last_count += (int)GetValue (parent_iter, 1); SetValue (parent_iter, 1, last_count); } else count_all += (int)last_count; } while (i < segments.Length) { if (IterIsValid (parent_iter)) { iter = AppendValues (parent_iter, Uri.UnescapeDataString (segments[i]), (segments.Length - 1 == i)? count : 0, (GetValue (parent_iter, 2) as SafeUri).Append (String.Format ("{0}/", segments[i])) ); } else { iter = AppendValues (Uri.UnescapeDataString (segments[i]), (segments.Length - 1 == i)? count : 0, new SafeUri (String.Format ("{0}:///", base_uri.Scheme), true)); } parent_iter = iter; i++; } last_count = count; last_segments = segments; } if (IterIsValid (iter)) { /* and at least, step back and update photo count */ while (IterParent (out iter, iter)) { last_count += (int)GetValue (iter, 1); SetValue (iter, 1, last_count); } count_all += (int)last_count; } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/Tests/0000777000175000017500000000000011503407447022531 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/Tests/FindBarTests.cs0000644000175000017500000001144211503404761025402 0ustar00rubenruben00000000000000#if ENABLE_TESTS using NUnit.Framework; namespace FSpot.Widgets.Tests { [TestFixture] public class FindBarTests { [Test] public void SuccessfulCompletionTest () { CompletionLogic logic = new CompletionLogic (); Assert.IsTrue (logic.MatchFunc ("Tagname", "T", 0), "first char"); Assert.IsTrue (logic.MatchFunc ("Tagname", "t", 0), "first char, different casing"); Assert.IsTrue (logic.MatchFunc ("Tagname", "Ta", 1), "two chars"); Assert.IsTrue (logic.MatchFunc ("Tagname", "tA", 1), "two chars, different casing"); Assert.IsTrue (logic.MatchFunc ("Tagname", "tagnam", 5), "except one char, different casing"); Assert.IsTrue (logic.MatchFunc ("Tagname", "Tagnam", 3), "except one char, caret in between"); } [Test] public void MatchTagsWithDiacritics () { CompletionLogic logic = new CompletionLogic (); Assert.IsTrue (logic.MatchFunc ("àáâãäåa", "àáâãäå", 5), "chars with diacritics"); Assert.IsTrue (logic.MatchFunc ("ÒÓÔÕÖØO", "òóôõöø", 5), "chars with diacritics, different casing"); Assert.IsTrue (logic.MatchFunc ("àáâãäåa", "aaaaaa", 5), "remove diacritics"); Assert.IsTrue (logic.MatchFunc ("ÒÓÔÕÖØO", "oooooo", 5), "remove diacritics, different casing"); } [Test] public void MatchTagsWithSpaces () { CompletionLogic logic = new CompletionLogic (); Assert.IsTrue (logic.MatchFunc ("Tag with spaces", "Ta", 1), ""); Assert.IsTrue (logic.MatchFunc ("Tag with spaces", "Tag", 2), ""); Assert.IsTrue (logic.MatchFunc ("Tag with spaces", "Tag ", 3), ""); Assert.IsTrue (logic.MatchFunc ("Tag with spaces", "Tag w", 4), ""); Assert.IsTrue (logic.MatchFunc ("Tag with spaces", "Tag with", 7), ""); Assert.IsFalse (logic.MatchFunc ("Tag with spaces", "Tag with spaces", 14), ""); Assert.IsFalse (logic.MatchFunc ("Tag with spaces", "wit", 2), ""); Assert.IsFalse (logic.MatchFunc ("Tag with spaces", "with s", 5), ""); } [Test] public void UnsuccessfulCompletionTest () { CompletionLogic logic = new CompletionLogic (); Assert.IsFalse (logic.MatchFunc ("Tagname", "", 0), "empty string"); Assert.IsFalse (logic.MatchFunc ("Tagname", "a", 0), "single char, no match"); Assert.IsFalse (logic.MatchFunc ("Tagname", "tagname", 6), "complete tag name"); Assert.IsFalse (logic.MatchFunc ("Tagname", "Tagname ", 7), "complete tag with space"); } [Test] public void SuccessfulCompletionTestWithParenthesis () { CompletionLogic logic = new CompletionLogic (); Assert.IsTrue (logic.MatchFunc ("Tagname", "(T", 1), "first char"); Assert.IsTrue (logic.MatchFunc ("Tagname", "(tagnam", 6), "except one char, different casing"); Assert.IsTrue (logic.MatchFunc ("Tagname", "(Ta)", 2), "with closing parenthesis"); Assert.IsTrue (logic.MatchFunc ("Tagname", "(Tagnam)", 2), "with closing parenthesis, caret in between"); } [Test] public void SuccessfulCompletionTestWithAndOperator () { CompletionLogic logic = new CompletionLogic (); Assert.IsTrue (logic.MatchFunc ("Tagname", "XY and T", 7), "first char, after operator"); Assert.IsTrue (logic.MatchFunc ("Tagname", "XY and tagnam", 12), "except one char, different casing, after operator"); Assert.IsTrue (logic.MatchFunc ("Tagname", "T and XY", 0), "first char, before operator"); Assert.IsTrue (logic.MatchFunc ("Tagname", "tagnam and XY", 5), "except one char, different casing, before operator"); } [Test] public void SuccessfulCompletionTestWithOrOperator () { CompletionLogic logic = new CompletionLogic (); Assert.IsTrue (logic.MatchFunc ("Tagname", "XY or T", 6), "first char"); Assert.IsTrue (logic.MatchFunc ("Tagname", "XY or tagnam", 11), "except one char, different casing"); Assert.IsTrue (logic.MatchFunc ("Tagname", "T or XY", 0), "first char"); Assert.IsTrue (logic.MatchFunc ("Tagname", "tagnam or XY", 5), "except one char, different casing"); } [Test] public void SuccessfulCompletionTestInBetween () { CompletionLogic logic = new CompletionLogic (); Assert.IsTrue (logic.MatchFunc ("Tagname", "XY and T and AB", 7), "first char"); Assert.IsTrue (logic.MatchFunc ("Tagname", "XY and tagnam and AB", 12), "except one char, different casing"); } [Test] public void ReplaceKeyTest () { int pos; CompletionLogic logic = new CompletionLogic (); pos = 0; logic.MatchFunc ("Tagname", "T", pos); Assert.AreEqual (logic.ReplaceKey ("T", "Tagname", ref pos), "Tagname"); Assert.AreEqual (pos, 7); pos = 2; logic.MatchFunc ("Tagname", "Tagn", pos); Assert.AreEqual (logic.ReplaceKey ("Tagn", "Tagname", ref pos), "Tagname"); Assert.AreEqual (pos, 7); pos = 4; logic.MatchFunc ("Tagname", "(Tagn and XY)", pos); Assert.AreEqual (logic.ReplaceKey ("(Tagn and XY)", "Tagname", ref pos), "(Tagname and XY)"); Assert.AreEqual (pos, 8); } } } #endif f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/InfoBox.cs0000644000175000017500000007450611503404761023326 0ustar00rubenruben00000000000000/* * FSpot.Widgets.InfoBox * * Author(s) * Ettore Perazzoli * Larry Ewing * Gabriel Burt * Stephane Delcroix * Ruben Vermeersch * Mike Gemuende * * This is free software. See COPYING for details. */ using Gtk; using System; using System.IO; using FSpot.Core; using FSpot.Imaging; using Mono.Unix; using FSpot.Utils; using GLib; using GFile = GLib.File; using GFileInfo = GLib.FileInfo; using Hyena; // FIXME TODO: We want to use something like EClippedLabel here throughout so it handles small sizes // gracefully using ellipsis. namespace FSpot.Widgets { public class InfoBox : VBox { DelayedOperation update_delay; private IPhoto [] photos = new IPhoto [0]; public IPhoto [] Photos { set { photos = value; update_delay.Start (); } private get { return photos; } } public IPhoto Photo { set { if (value != null) { Photos = new IPhoto [] { value }; } } } private bool show_tags = false; public bool ShowTags { get { return show_tags; } set { if (show_tags == value) return; show_tags = value; tag_view.Visible = show_tags; } } private bool show_rating = false; public bool ShowRating { get { return show_rating; } set { if (show_rating == value) return; show_rating = value; rating_label.Visible = show_rating; rating_view.Visible = show_rating; } } public delegate void VersionChangedHandler (InfoBox info_box, IPhotoVersion version); public event VersionChangedHandler VersionChanged; private Expander info_expander; private Expander histogram_expander; private Gtk.Image histogram_image; private Histogram histogram; private DelayedOperation histogram_delay; // Context switching (toggles visibility). public event EventHandler ContextChanged; private ViewContext view_context = ViewContext.Unknown; public ViewContext Context { get { return view_context; } set { view_context = value; if (ContextChanged != null) ContextChanged (this, null); } } private readonly InfoBoxContextSwitchStrategy ContextSwitchStrategy; // Widgetry. private Label name_label; private Label name_value_label; private Label version_label; private ListStore version_list; private ComboBox version_combo; private Label date_label; private Label date_value_label; private Label size_label; private Label size_value_label; private Label exposure_label; private Label exposure_value_label; private Label focal_length_label; private Label focal_length_value_label; private Label camera_label; private Label camera_value_label; private Label file_size_label; private Label file_size_value_label; private Label rating_label; private RatingEntry rating_view; private TagView tag_view; private string default_exposure_string; private bool show_name; private bool show_date; private bool show_size; private bool show_exposure; private bool show_focal_length; private bool show_camera; private bool show_file_size; private void HandleRatingChanged (object o, EventArgs e) { App.Instance.Organizer.HandleRatingMenuSelected ((o as Widgets.RatingEntry).Value); } private Label CreateRightAlignedLabel (string text) { Label label = new Label (); label.UseMarkup = true; label.Markup = text; label.Xalign = 1; return label; } const int TABLE_XPADDING = 3; const int TABLE_YPADDING = 3; private Label AttachLabel (Table table, int row_num, Widget entry) { Label label = new Label (String.Empty); label.Xalign = 0; label.Selectable = true; label.Ellipsize = Pango.EllipsizeMode.End; label.Show (); label.PopulatePopup += HandlePopulatePopup; table.Attach (label, 1, 2, (uint) row_num, (uint) row_num + 1, AttachOptions.Expand | AttachOptions.Fill, AttachOptions.Expand | AttachOptions.Fill, (uint) entry.Style.XThickness + TABLE_XPADDING, (uint) entry.Style.YThickness); return label; } private void SetupWidgets () { histogram_expander = new Expander (Catalog.GetString ("Histogram")); histogram_expander.Activated += delegate (object sender, EventArgs e) { ContextSwitchStrategy.SetHistogramVisible (Context, histogram_expander.Expanded); UpdateHistogram (); }; histogram_expander.StyleSet += delegate (object sender, StyleSetArgs args) { Gdk.Color c = this.Toplevel.Style.Backgrounds [(int)Gtk.StateType.Active]; histogram.RedColorHint = (byte) (c.Red / 0xff); histogram.GreenColorHint = (byte) (c.Green / 0xff); histogram.BlueColorHint = (byte) (c.Blue / 0xff); histogram.BackgroundColorHint = 0xff; UpdateHistogram (); }; histogram_image = new Gtk.Image (); histogram = new Histogram (); histogram_expander.Add (histogram_image); Add (histogram_expander); info_expander = new Expander (Catalog.GetString ("Image Information")); info_expander.Activated += delegate (object sender, EventArgs e) { ContextSwitchStrategy.SetInfoBoxVisible (Context, info_expander.Expanded); }; Table info_table = new Table (10, 2, false); info_table.BorderWidth = 0; string name_pre = ""; string name_post = ""; name_label = CreateRightAlignedLabel (name_pre + Catalog.GetString ("Name") + name_post); info_table.Attach (name_label, 0, 1, 0, 1, AttachOptions.Fill, AttachOptions.Fill, TABLE_XPADDING, TABLE_YPADDING); version_label = CreateRightAlignedLabel (name_pre + Catalog.GetString ("Version") + name_post); info_table.Attach (version_label, 0, 1, 1, 2, AttachOptions.Fill, AttachOptions.Fill, TABLE_XPADDING, TABLE_YPADDING); date_label = CreateRightAlignedLabel (name_pre + Catalog.GetString ("Date") + name_post + Environment.NewLine); info_table.Attach (date_label, 0, 1, 2, 3, AttachOptions.Fill, AttachOptions.Fill, TABLE_XPADDING, TABLE_YPADDING); size_label = CreateRightAlignedLabel (name_pre + Catalog.GetString ("Size") + name_post); info_table.Attach (size_label, 0, 1, 3, 4, AttachOptions.Fill, AttachOptions.Fill, TABLE_XPADDING, TABLE_YPADDING); default_exposure_string = name_pre + Catalog.GetString ("Exposure") + name_post; exposure_label = CreateRightAlignedLabel (default_exposure_string); info_table.Attach (exposure_label, 0, 1, 4, 5, AttachOptions.Fill, AttachOptions.Fill, TABLE_XPADDING, TABLE_YPADDING); focal_length_label = CreateRightAlignedLabel (name_pre + Catalog.GetString ("Focal Length") + name_post); info_table.Attach (focal_length_label, 0, 1, 5, 6, AttachOptions.Fill, AttachOptions.Fill, TABLE_XPADDING, TABLE_YPADDING); camera_label = CreateRightAlignedLabel (name_pre + Catalog.GetString ("Camera") + name_post); info_table.Attach (camera_label, 0, 1, 6, 7, AttachOptions.Fill, AttachOptions.Fill, TABLE_XPADDING, TABLE_YPADDING); file_size_label = CreateRightAlignedLabel (name_pre + Catalog.GetString ("File Size") + name_post); info_table.Attach (file_size_label, 0, 1, 7, 8, AttachOptions.Fill, AttachOptions.Fill, TABLE_XPADDING, TABLE_YPADDING); rating_label = CreateRightAlignedLabel (name_pre + Catalog.GetString ("Rating") + name_post); info_table.Attach (rating_label, 0, 1, 8, 9, AttachOptions.Fill, AttachOptions.Fill, TABLE_XPADDING, TABLE_YPADDING); rating_label.Visible = false; name_value_label = new Label (); name_value_label.Ellipsize = Pango.EllipsizeMode.Middle; name_value_label.Justify = Gtk.Justification.Left; name_value_label.Selectable = true; name_value_label.Xalign = 0; name_value_label.PopulatePopup += HandlePopulatePopup; info_table.Attach (name_value_label, 1, 2, 0, 1, AttachOptions.Fill | AttachOptions.Expand, AttachOptions.Fill, 3, 0); date_value_label = AttachLabel (info_table, 2, name_value_label); size_value_label = AttachLabel (info_table, 3, name_value_label); exposure_value_label = AttachLabel (info_table, 4, name_value_label); version_list = new ListStore (typeof (IPhotoVersion), typeof (string), typeof (bool)); version_combo = new ComboBox (); CellRendererText version_name_cell = new CellRendererText (); version_name_cell.Ellipsize = Pango.EllipsizeMode.End; version_combo.PackStart (version_name_cell, true); version_combo.SetCellDataFunc (version_name_cell, new CellLayoutDataFunc (VersionNameCellFunc)); version_combo.Model = version_list; version_combo.Changed += OnVersionComboChanged; info_table.Attach (version_combo, 1, 2, 1, 2, AttachOptions.Fill, AttachOptions.Fill, TABLE_XPADDING, TABLE_YPADDING); date_value_label.Text = Environment.NewLine; exposure_value_label.Text = Environment.NewLine; focal_length_value_label = AttachLabel (info_table, 5, name_value_label); camera_value_label = AttachLabel (info_table, 6, name_value_label); file_size_value_label = AttachLabel (info_table, 7, name_value_label); Gtk.Alignment rating_align = new Gtk.Alignment( 0, 0, 0, 0); info_table.Attach (rating_align, 1, 2, 8, 9, AttachOptions.Fill, AttachOptions.Fill, TABLE_XPADDING, TABLE_YPADDING); rating_view = new RatingEntry () { HasFrame = false }; rating_view.Visible = false; rating_view.Changed += HandleRatingChanged; rating_align.Add (rating_view); tag_view = new TagView (); info_table.Attach (tag_view, 0, 2, 9, 10, AttachOptions.Fill, AttachOptions.Fill, TABLE_XPADDING, TABLE_YPADDING); info_table.ShowAll (); EventBox eb = new EventBox (); eb.Add (info_table); info_expander.Add (eb); eb.ButtonPressEvent += HandleButtonPressEvent; Add (info_expander); rating_label.Visible = show_rating; rating_view.Visible = show_rating; } // FIXME: We should pull this info directly out of IBrowsableItem private class ImageInfo { int width; int height; double? fnumber; double? exposure_time; uint? iso_speed; double? focal_length; string camera_model; public ImageInfo (IImageFile img) { if (img == null) return; using (var metadata = Metadata.Parse (img.Uri)) { width = metadata.Properties.PhotoWidth; height = metadata.Properties.PhotoHeight; fnumber = metadata.ImageTag.FNumber; exposure_time = metadata.ImageTag.ExposureTime; iso_speed = metadata.ImageTag.ISOSpeedRatings; focal_length = metadata.ImageTag.FocalLength; camera_model = metadata.ImageTag.Model; } } public string ExposureInfo { get { string info = String.Empty; if (fnumber.HasValue && fnumber.Value != 0.0) { try { info += String.Format ("f/{0:.0} ", fnumber.Value); } catch (FormatException) { return Catalog.GetString("(wrong format)"); } } if (exposure_time.HasValue) { if (Math.Abs (exposure_time.Value) >= 1.0) { info += String.Format ("{0} sec ", exposure_time.Value); } else { info += String.Format ("1/{0} sec ", (int) (1 / exposure_time.Value)); } } if (iso_speed.HasValue) { info += String.Format ("{0}ISO {1}", Environment.NewLine, iso_speed.Value); } if (info == String.Empty) return Catalog.GetString ("(None)"); return info; } } public string FocalLength { get { if (focal_length == null) return Catalog.GetString ("(Unknown)"); return String.Format ("{0} mm", focal_length.Value); } } public string CameraModel { get { if (camera_model != String.Empty) return camera_model; else return Catalog.GetString ("(Unknown)"); } } public string Dimensions { get { if (width != 0 && height != 0) return String.Format ("{0}x{1}", width, height); else return Catalog.GetString ("(Unknown)"); } } } public bool Update () { if (Photos == null || Photos.Length == 0) { Hide (); } else if (Photos.Length == 1) { Show (); UpdateSingle (); } else if (Photos.Length > 1) { Show (); UpdateMultiple (); } return false; } private void UpdateSingle () { ImageInfo info; IPhoto photo = Photos [0]; histogram_expander.Visible = true; UpdateHistogram (); if (show_name) { name_value_label.Text = photo.Name != null ? photo.Name : String.Empty; } name_label.Visible = show_name; name_value_label.Visible = show_name; try { using (var img = ImageFile.Create (photo.DefaultVersion.Uri)) { info = new ImageInfo (img); } } catch (System.Exception e) { Hyena.Log.Debug (e.StackTrace); info = new ImageInfo (null); } if (show_exposure) { exposure_value_label.Text = info.ExposureInfo; if (exposure_value_label.Text.IndexOf (Environment.NewLine) != -1) exposure_label.Markup = default_exposure_string + Environment.NewLine; else exposure_label.Markup = default_exposure_string; } exposure_label.Visible = show_exposure; exposure_value_label.Visible = show_exposure; if (show_size) size_value_label.Text = info.Dimensions; size_label.Visible = show_size; size_value_label.Visible = show_size; if (show_date) { DateTime local_time = photo.Time; date_value_label.Text = String.Format ("{0}{2}{1}", local_time.ToShortDateString (), local_time.ToShortTimeString (), Environment.NewLine ); } date_label.Visible = show_date; date_value_label.Visible = show_date; if (show_focal_length) focal_length_value_label.Text = info.FocalLength; focal_length_label.Visible = show_focal_length; focal_length_value_label.Visible = show_focal_length; if (show_camera) camera_value_label.Text = info.CameraModel; camera_label.Visible = show_camera; camera_value_label.Visible = show_camera; version_label.Visible = true; version_combo.Visible = true; version_list.Clear (); version_combo.Changed -= OnVersionComboChanged; int count = 0; foreach (IPhotoVersion version in photo.Versions) { version_list.AppendValues (version, version.Name, true); if (version == photo.DefaultVersion) version_combo.Active = count; count++; } if (count <= 1) { version_combo.Sensitive = false; version_combo.TooltipText = Catalog.GetString ("(No Edits)"); } else { version_combo.Sensitive = true; version_combo.TooltipText = String.Format (Catalog.GetPluralString ("(One Edit)", "({0} Edits)", count - 1), count - 1); } version_combo.Changed += OnVersionComboChanged; if (show_file_size) { try { GFile file = FileFactory.NewForUri (photo.DefaultVersion.Uri); GFileInfo file_info = file.QueryInfo ("standard::size", FileQueryInfoFlags.None, null); file_size_value_label.Text = Format.SizeForDisplay (file_info.Size); } catch (GLib.GException e) { file_size_value_label.Text = Catalog.GetString("(File read error)"); Hyena.Log.DebugException (e); } } file_size_label.Visible = show_file_size; file_size_value_label.Visible = show_file_size; if (show_tags) tag_view.Current = photo; rating_label.Visible = show_rating; rating_view.Visible = show_rating; if (show_rating) { rating_view.Value = (int) photo.Rating; } Show (); } void VersionNameCellFunc (CellLayout cell_layout, CellRenderer cell, TreeModel tree_model, TreeIter iter) { string name = (string)tree_model.GetValue (iter, 1); (cell as CellRendererText).Text = name; cell.Sensitive = (bool)tree_model.GetValue (iter, 2); } void OnVersionComboChanged (object o, EventArgs e) { ComboBox combo = o as ComboBox; if (combo == null) return; TreeIter iter; if (combo.GetActiveIter (out iter)) VersionChanged (this, (IPhotoVersion)version_list.GetValue (iter, 0)); } private void UpdateMultiple () { histogram_expander.Visible = false; name_label.Visible = false; name_value_label.Text = String.Format(Catalog.GetString("{0} Photos"), Photos.Length); name_value_label.Visible = true; version_label.Visible = false; version_combo.Visible = false; exposure_label.Visible = false; exposure_value_label.Visible = false; focal_length_label.Visible = false; focal_length_value_label.Visible = false; camera_label.Visible = false; camera_value_label.Visible = false; if (show_date) { IPhoto first = Photos[Photos.Length-1]; IPhoto last = Photos [0]; if (first.Time.Date == last.Time.Date) { //Note for translators: {0} is a date, {1} and {2} are times. date_value_label.Text = String.Format(Catalog.GetString("On {0} between \n{1} and {2}"), first.Time.ToShortDateString (), first.Time.ToShortTimeString (), last.Time.ToShortTimeString ()); } else { date_value_label.Text = String.Format(Catalog.GetString("Between {0} \nand {1}"), first.Time.ToShortDateString (), last.Time.ToShortDateString ()); } } date_label.Visible = show_date; date_value_label.Visible = show_date; if (show_file_size) { long file_size = 0; foreach (IPhoto photo in Photos) { try { GFile file = FileFactory.NewForUri (photo.DefaultVersion.Uri); GFileInfo file_info = file.QueryInfo ("standard::size", FileQueryInfoFlags.None, null); file_size += file_info.Size; } catch (GLib.GException e) { file_size = -1; Hyena.Log.DebugException (e); break; } } if (file_size != -1) file_size_value_label.Text = Format.SizeForDisplay (file_size); else file_size_value_label.Text = Catalog.GetString("(At least one File not found)"); } file_size_label.Visible = show_file_size; file_size_value_label.Visible = show_file_size; size_label.Visible = false; size_value_label.Visible = false; rating_label.Visible = false; rating_view.Visible = false; } private Gdk.Pixbuf histogram_hint; private void UpdateHistogram () { if (histogram_expander.Expanded) histogram_delay.Start (); } public void UpdateHistogram (Gdk.Pixbuf pixbuf) { histogram_hint = pixbuf; UpdateHistogram (); } private bool DelayedUpdateHistogram () { if (Photos.Length == 0) return false; IPhoto photo = Photos [0]; Gdk.Pixbuf hint = histogram_hint; histogram_hint = null; int max = histogram_expander.Allocation.Width; try { if (hint == null) using (var img = ImageFile.Create (photo.DefaultVersion.Uri)) hint = img.Load (256, 256); histogram_image.Pixbuf = histogram.Generate (hint, max); hint.Dispose (); } catch (System.Exception e) { Hyena.Log.Debug (e.StackTrace); using (Gdk.Pixbuf empty = new Gdk.Pixbuf (Gdk.Colorspace.Rgb, true, 8, 256, 256)) { empty.Fill (0x0); histogram_image.Pixbuf = histogram.Generate (empty, max); } } return false; } // Context switching private void HandleContextChanged (object sender, EventArgs args) { bool infobox_visible = ContextSwitchStrategy.InfoBoxVisible (Context); info_expander.Expanded = infobox_visible; bool histogram_visible = ContextSwitchStrategy.HistogramVisible (Context); histogram_expander.Expanded = histogram_visible; show_name = ContextSwitchStrategy.InfoBoxNameVisible (Context); show_date = ContextSwitchStrategy.InfoBoxDateVisible (Context); show_size = ContextSwitchStrategy.InfoBoxSizeVisible (Context); show_exposure = ContextSwitchStrategy.InfoBoxExposureVisible (Context); show_focal_length = ContextSwitchStrategy.InfoBoxFocalLengthVisible (Context); show_camera = ContextSwitchStrategy.InfoBoxCameraVisible (Context); show_file_size = ContextSwitchStrategy.InfoBoxFileSizeVisible (Context); if (infobox_visible) update_delay.Start (); } public void HandleMainWindowViewModeChanged (object o, EventArgs args) { MainWindow.ModeType mode = App.Instance.Organizer.ViewMode; if (mode == MainWindow.ModeType.IconView) Context = ViewContext.Library; else if (mode == MainWindow.ModeType.PhotoView) Context = ViewContext.Edit; } void HandleButtonPressEvent (object sender, ButtonPressEventArgs args) { if (args.Event.Button == 3) { Menu popup_menu = new Menu (); AddMenuItems (popup_menu); if (args.Event != null) popup_menu.Popup (null, null, null, args.Event.Button, args.Event.Time); else popup_menu.Popup (null, null, null, 0, Gtk.Global.CurrentEventTime); args.RetVal = true; } } void HandlePopulatePopup (object sender, PopulatePopupArgs args) { AddMenuItems (args.Menu); args.RetVal = true; } private void AddMenuItems (Menu popup_menu) { if (popup_menu.Children.Length > 0) { GtkUtil.MakeMenuSeparator (popup_menu); } MenuItem item; item = GtkUtil.MakeCheckMenuItem (popup_menu, Catalog.GetString ("Show Photo Name"), HandleMenuItemSelected, true, show_name, false); item.SetData ("cb", name_label.Handle); item = GtkUtil.MakeCheckMenuItem (popup_menu, Catalog.GetString ("Show Date"), HandleMenuItemSelected, true, show_date, false); item.SetData ("cb", date_label.Handle); item = GtkUtil.MakeCheckMenuItem (popup_menu, Catalog.GetString ("Show Size"), HandleMenuItemSelected, true, show_size, false); item.SetData ("cb", size_label.Handle); item = GtkUtil.MakeCheckMenuItem (popup_menu, Catalog.GetString ("Show Exposure"), HandleMenuItemSelected, true, show_exposure, false); item.SetData ("cb", exposure_label.Handle); item = GtkUtil.MakeCheckMenuItem (popup_menu, Catalog.GetString ("Show Focal Length"), HandleMenuItemSelected, true, show_focal_length, false); item.SetData ("cb", focal_length_label.Handle); item = GtkUtil.MakeCheckMenuItem (popup_menu, Catalog.GetString ("Show Camera"), HandleMenuItemSelected, true, show_camera, false); item.SetData ("cb", camera_label.Handle); item = GtkUtil.MakeCheckMenuItem (popup_menu, Catalog.GetString ("Show File Size"), HandleMenuItemSelected, true, show_file_size, false); item.SetData ("cb", file_size_label.Handle); } private void HandleMenuItemSelected (object sender, EventArgs args) { IntPtr handle = (sender as CheckMenuItem).GetData ("cb"); if (handle == name_label.Handle) { show_name = (sender as CheckMenuItem).Active; ContextSwitchStrategy.SetInfoBoxNameVisible (Context, show_name); } else if (handle == date_label.Handle) { show_date = (sender as CheckMenuItem).Active; ContextSwitchStrategy.SetInfoBoxDateVisible (Context, show_date); } else if (handle == size_label.Handle) { show_size = (sender as CheckMenuItem).Active; ContextSwitchStrategy.SetInfoBoxSizeVisible (Context, show_size); } else if (handle == exposure_label.Handle) { show_exposure = (sender as CheckMenuItem).Active; ContextSwitchStrategy.SetInfoBoxExposureVisible (Context, show_exposure); } else if (handle == focal_length_label.Handle) { show_focal_length = (sender as CheckMenuItem).Active; ContextSwitchStrategy.SetInfoBoxFocalLengthVisible (Context, show_focal_length); } else if (handle == camera_label.Handle) { show_camera = (sender as CheckMenuItem).Active; ContextSwitchStrategy.SetInfoBoxCameraVisible (Context, show_camera); } else if (handle == file_size_label.Handle) { show_file_size = (sender as CheckMenuItem).Active; ContextSwitchStrategy.SetInfoBoxFileSizeVisible (Context, show_file_size); } update_delay.Start (); } // Constructor. public InfoBox () : base (false, 0) { ContextSwitchStrategy = new MRUInfoBoxContextSwitchStrategy (); ContextChanged += HandleContextChanged; SetupWidgets (); update_delay = new DelayedOperation (Update); update_delay.Start (); histogram_delay = new DelayedOperation (DelayedUpdateHistogram); BorderWidth = 2; Hide (); } } // Decides whether infobox / histogram should be shown for each context. Implemented // using the Strategy pattern, to make it swappable easily, in case the // default MRUInfoBoxContextSwitchStrategy is not sufficiently usable. public abstract class InfoBoxContextSwitchStrategy { public abstract bool InfoBoxVisible (ViewContext context); public abstract bool HistogramVisible (ViewContext context); public abstract bool InfoBoxNameVisible (ViewContext context); public abstract bool InfoBoxDateVisible (ViewContext context); public abstract bool InfoBoxSizeVisible (ViewContext context); public abstract bool InfoBoxExposureVisible (ViewContext context); public abstract bool InfoBoxFocalLengthVisible (ViewContext context); public abstract bool InfoBoxCameraVisible (ViewContext context); public abstract bool InfoBoxFileSizeVisible (ViewContext context); public abstract void SetInfoBoxVisible (ViewContext context, bool visible); public abstract void SetHistogramVisible (ViewContext context, bool visible); public abstract void SetInfoBoxNameVisible (ViewContext context, bool visible); public abstract void SetInfoBoxDateVisible (ViewContext context, bool visible); public abstract void SetInfoBoxSizeVisible (ViewContext context, bool visible); public abstract void SetInfoBoxExposureVisible (ViewContext context, bool visible); public abstract void SetInfoBoxFocalLengthVisible (ViewContext context, bool visible); public abstract void SetInfoBoxCameraVisible (ViewContext context, bool visible); public abstract void SetInfoBoxFileSizeVisible (ViewContext context, bool visible); } // Values are stored as strings, because bool is not nullable through Preferences. public class MRUInfoBoxContextSwitchStrategy : InfoBoxContextSwitchStrategy { public const string PREF_PREFIX = Preferences.APP_FSPOT + "ui"; private string PrefKeyForContext (ViewContext context, string item) { return String.Format ("{0}/{1}_visible/{2}", PREF_PREFIX, item, context); } private string PrefKeyForContext (ViewContext context, string parent, string item) { return String.Format ("{0}/{1}_visible/{2}/{3}", PREF_PREFIX, parent, item, context); } private bool VisibilityForContext (ViewContext context, string item, bool default_value) { string visible = Preferences.Get (PrefKeyForContext (context, item)); if (visible == null) return default_value; else return visible == "1"; } private bool VisibilityForContext (ViewContext context, string parent, string item, bool default_value) { string visible = Preferences.Get (PrefKeyForContext (context, parent, item)); if (visible == null) return default_value; else return visible == "1"; } private void SetVisibilityForContext (ViewContext context, string item, bool visible) { Preferences.Set (PrefKeyForContext (context, item), visible ? "1" : "0"); } private void SetVisibilityForContext (ViewContext context, string parent, string item, bool visible) { Preferences.Set (PrefKeyForContext (context, parent, item), visible ? "1" : "0"); } public override bool InfoBoxVisible (ViewContext context) { return VisibilityForContext (context, "infobox", true); } public override bool HistogramVisible (ViewContext context) { return VisibilityForContext (context, "histogram", true); } public override bool InfoBoxNameVisible (ViewContext context) { return VisibilityForContext (context, "infobox", "name", true); } public override bool InfoBoxDateVisible (ViewContext context) { return VisibilityForContext (context, "infobox", "date", true); } public override bool InfoBoxSizeVisible (ViewContext context) { return VisibilityForContext (context, "infobox", "size", true); } public override bool InfoBoxExposureVisible (ViewContext context) { return VisibilityForContext (context, "infobox", "exposure", true); } public override bool InfoBoxFocalLengthVisible (ViewContext context) { return VisibilityForContext (context, "infobox", "focal_length", false); } public override bool InfoBoxCameraVisible (ViewContext context) { return VisibilityForContext (context, "infobox", "camera", false); } public override bool InfoBoxFileSizeVisible (ViewContext context) { return VisibilityForContext (context, "infobox", "file_size", false); } public override void SetInfoBoxVisible (ViewContext context, bool visible) { SetVisibilityForContext (context, "infobox", visible); } public override void SetHistogramVisible (ViewContext context, bool visible) { SetVisibilityForContext (context, "histogram", visible); } public override void SetInfoBoxNameVisible (ViewContext context, bool visible) { SetVisibilityForContext (context, "infobox", "name", visible); } public override void SetInfoBoxDateVisible (ViewContext context, bool visible) { SetVisibilityForContext (context, "infobox", "date", visible); } public override void SetInfoBoxSizeVisible (ViewContext context, bool visible) { SetVisibilityForContext (context, "infobox", "size", visible); } public override void SetInfoBoxExposureVisible (ViewContext context, bool visible) { SetVisibilityForContext (context, "infobox", "exposure", visible); } public override void SetInfoBoxFocalLengthVisible (ViewContext context, bool visible) { SetVisibilityForContext (context, "infobox", "focal_length", visible); } public override void SetInfoBoxCameraVisible (ViewContext context, bool visible) { SetVisibilityForContext (context, "infobox", "camera", visible); } public override void SetInfoBoxFileSizeVisible (ViewContext context, bool visible) { SetVisibilityForContext (context, "infobox", "file_size", visible); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/Loupe.cs0000644000175000017500000003054311503404761023037 0ustar00rubenruben00000000000000// // FSpot.Widgets.Loupe.cs // // Author(s): // Larry Ewing 0; start_angle = Angle; } else { Angle += Math.PI /8; } break; case Gdk.EventType.TwoButtonPress: dragging = false; App.Instance.Organizer.HideLoupe (); break; } } private void HandleViewZoomChanged (object sender, System.EventArgs args) { UpdateSample (); } private void HandleButtonReleaseEvent (object sender, ButtonReleaseEventArgs args) { dragging = false; } private void HandleKeyPressEvent (object sender, Gtk.KeyPressEventArgs args) { switch (args.Event.Key) { case Gdk.Key.v: App.Instance.Organizer.HideLoupe (); args.RetVal = true; break; default: break; } return; } protected override void OnDestroyed () { view.MotionNotifyEvent -= HandleImageViewMotion; view.Item.Changed -= HandleItemChanged; view.ZoomChanged -= HandleViewZoomChanged; opened_hand_cursor.Dispose (); closed_hand_cursor.Dispose (); opened_hand_cursor = null; closed_hand_cursor = null; base.OnDestroyed (); } protected Widget SetFancyStyle (Widget widget) { //widget.ModifyFg (Gtk.StateType.Normal, new Gdk.Color (127, 127, 127)); //widget.ModifyBg (Gtk.StateType.Normal, new Gdk.Color (0, 0, 0)); return widget; } protected override void OnSizeRequested (ref Requisition requisition) { Layout (); requisition = Bounds; } protected virtual void BuildUI () { SetFancyStyle (this); TransientFor = (Gtk.Window) view.Toplevel; SkipPagerHint = true; SkipTaskbarHint = true; //view.MotionNotifyEvent += HandleImageViewMotion; view.Item.Changed += HandleItemChanged; view.ZoomChanged += HandleViewZoomChanged; SetSamplePoint (Gdk.Point.Zero); AddEvents ((int) (Gdk.EventMask.PointerMotionMask | Gdk.EventMask.ButtonPressMask | Gdk.EventMask.ButtonReleaseMask)); ButtonPressEvent += HandleButtonPressEvent; ButtonReleaseEvent += HandleButtonReleaseEvent; MotionNotifyEvent += HandleMotionNotifyEvent; KeyPressEvent += HandleKeyPressEvent; drag = new DelayedOperation (20, new GLib.IdleHandler (DragUpdate)); // Update the cursor appropriate to indicate dragability/dragging bool inside = false, pressed = false; EnterNotifyEvent += delegate { inside = true; if (!pressed) GdkWindow.Cursor = opened_hand_cursor; }; LeaveNotifyEvent += delegate { inside = false; if (!pressed) GdkWindow.Cursor = null; }; ButtonPressEvent += delegate { pressed = true; GdkWindow.Cursor = closed_hand_cursor; }; ButtonReleaseEvent += delegate { pressed = false; GdkWindow.Cursor = inside ? opened_hand_cursor : null; }; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/QueryView.cs0000644000175000017500000000263211503404761023711 0ustar00rubenruben00000000000000// // QueryView.cs // // Copyright (C) 2004 Novell, Inc. // using System; using Gdk; using Gtk; using FSpot.Core; namespace FSpot.Widgets { public class QueryView : SelectionCollectionGridView { public QueryView (System.IntPtr raw) : base(raw) { } public QueryView (IBrowsableCollection query) : base(query) { ScrollEvent += new ScrollEventHandler (HandleScrollEvent); } protected override bool OnPopupMenu () { PhotoPopup popup = new PhotoPopup (); popup.Activate (); return true; } protected override void ContextMenu (EventButton evnt, int cell_num) { PhotoPopup popup = new PhotoPopup (); popup.Activate (this.Toplevel, evnt); } private void HandleScrollEvent(object sender, ScrollEventArgs args) { // Activated only by Control + ScrollWheelUp/ScrollWheelDown if (ModifierType.ControlMask != (args.Event.State & ModifierType.ControlMask)) return; if (args.Event.Direction == ScrollDirection.Up) { ZoomIn (); // stop event from propagating. args.RetVal = true; } else if (args.Event.Direction == ScrollDirection.Down ) { ZoomOut (); args.RetVal = true; } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/ThumbnailTagsCaptionRenderer.cs0000644000175000017500000000705511503404761027524 0ustar00rubenruben00000000000000/* * ThumbnailCaptionRenderer.cs * * Author(s) * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using Gtk; using Gdk; using FSpot.Core; namespace FSpot.Widgets { public class ThumbnailTagsCaptionRenderer : ThumbnailCaptionRenderer { #region private fields private int tag_icon_size; private int tag_icon_hspacing; #endregion #region Constructor public ThumbnailTagsCaptionRenderer () : this (16) { } public ThumbnailTagsCaptionRenderer (int tag_icon_size) : this (tag_icon_size, 2) { } public ThumbnailTagsCaptionRenderer (int tag_icon_size, int tag_icon_hspacing) { this.tag_icon_size = tag_icon_size; this.tag_icon_hspacing = tag_icon_hspacing; } #endregion #region Drawing Methods public override int GetHeight (Widget widget, int width) { return tag_icon_size; } public override void Render (Drawable window, Widget widget, Rectangle cell_area, Rectangle expose_area, StateType cell_state, IPhoto photo) { Tag [] tags = photo.Tags; Rectangle tag_bounds; tag_bounds.X = cell_area.X + (cell_area.Width + tag_icon_hspacing - tags.Length * (tag_icon_size + tag_icon_hspacing)) / 2; tag_bounds.Y = cell_area.Y;// + cell_area.Height - cell_border_width - tag_icon_size + tag_icon_vspacing; tag_bounds.Width = tag_icon_size; tag_bounds.Height = tag_icon_size; foreach (Tag t in tags) { if (t == null) continue; Pixbuf icon = t.Icon; Tag tag_iter = t.Category; while (icon == null && tag_iter != App.Instance.Database.Tags.RootCategory && tag_iter != null) { icon = tag_iter.Icon; tag_iter = tag_iter.Category; } if (icon == null) continue; Rectangle region; if (tag_bounds.Intersect (expose_area, out region)) { Pixbuf scaled_icon; if (icon.Width == tag_bounds.Width) { scaled_icon = icon; } else { scaled_icon = icon.ScaleSimple (tag_bounds.Width, tag_bounds.Height, InterpType.Bilinear); } Cms.Profile screen_profile; if (FSpot.ColorManagement.Profiles.TryGetValue (Preferences.Get (Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE), out screen_profile)) FSpot.ColorManagement.ApplyProfile (scaled_icon, screen_profile); scaled_icon.RenderToDrawable (window, widget.Style.WhiteGC, region.X - tag_bounds.X, region.Y - tag_bounds.Y, region.X, region.Y, region.Width, region.Height, RgbDither.None, region.X, region.Y); if (scaled_icon != icon) { scaled_icon.Dispose (); } } tag_bounds.X += tag_bounds.Width + tag_icon_hspacing; } } #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/MetadataDisplay.cs0000644000175000017500000002615711503404761025027 0ustar00rubenruben00000000000000/* * Widgets.MetadataDisplay.cs * * Author(s) * Mike Gemuende * Ruben Vermeersch * * This is free software. See COPYING for details. */ using System; using System.IO; using System.Text; using System.Collections.Generic; using Gtk; using Mono.Unix; using FSpot.Core; using FSpot.Utils; using FSpot.Extensions; using FSpot.Imaging; namespace FSpot.Widgets { public class MetadataDisplayPage : SidebarPage { public MetadataDisplayPage() : base(new MetadataDisplayWidget(), Catalog.GetString ("Metadata"), "gtk-info") { (SidebarWidget as MetadataDisplayWidget).Page = this; } protected override void AddedToSidebar () { MetadataDisplayWidget widget = SidebarWidget as MetadataDisplayWidget; (Sidebar as Sidebar).SelectionChanged += widget.HandleSelectionChanged; (Sidebar as Sidebar).SelectionItemsChanged += widget.HandleSelectionItemsChanged; } } public class MetadataDisplayWidget : ScrolledWindow { DelayedOperation update_delay; /* This VBox only contains exif-data, so it is seperated from other information */ VBox metadata_vbox; VBox main_vbox; Label metadata_message; State display; private MetadataDisplayPage page; public MetadataDisplayPage Page { set { page = value; } get { return page; } } // stores list of the expanded expanders List open_list; ListStore extended_metadata; bool up_to_date = false; enum State { metadata, message }; public MetadataDisplayWidget () { main_vbox = new VBox (); main_vbox.Spacing = 6; metadata_message = new Label (String.Empty); metadata_message.UseMarkup = true; metadata_message.LineWrap = true; metadata_vbox = new VBox (); metadata_vbox.Spacing = 6; main_vbox.PackStart (metadata_vbox, false, false, 0); AddWithViewport (metadata_message); ((Viewport) Child).ShadowType = ShadowType.None; BorderWidth = 3; display = State.message; ExposeEvent += HandleExposeEvent; open_list = new List (); // Create Expander and TreeView for // extended metadata TreeView tree_view = new TreeView (); tree_view.HeadersVisible = false; tree_view.RulesHint = true; TreeViewColumn col = new TreeViewColumn (); col.Sizing = TreeViewColumnSizing.Autosize; CellRenderer colr = new CellRendererText (); col.PackStart (colr, false); col.AddAttribute (colr, "markup", 0); tree_view.AppendColumn (col); extended_metadata = new ListStore (typeof(string)); tree_view.Model = extended_metadata; Expander expander = new Expander (String.Format("{0}", Catalog.GetString ("Extended Metadata"))); expander.UseMarkup = true; expander.Add (tree_view); expander.Expanded = true; main_vbox.PackStart (expander, false, false, 6); expander.ShowAll (); update_delay = new DelayedOperation (Update); update_delay.Start (); } private IPhoto photo; public IPhoto Photo { get { return photo; } set { photo = value; if (!Visible) { up_to_date = false; } else { update_delay.Start (); } } } private void HandleExposeEvent (object sender, ExposeEventArgs args) { if (!up_to_date) { update_delay.Start (); } } internal void HandleSelectionChanged (IBrowsableCollection collection) { // Don't show metadata when multiple photos are selected. Photo = (collection != null && collection.Count == 1) ? collection [0] : null; } internal void HandleSelectionItemsChanged (IBrowsableCollection collection, BrowsableEventArgs args) { if (!args.Changes.MetadataChanged) return; if (!Visible) { up_to_date = false; } else { update_delay.Start (); } } private bool Visible { get { return (Page.Sidebar as Sidebar).IsActive (Page); } } private ListStore AddExpander (string name, int pos) { TreeView tree_view = new TreeView (); tree_view.HeadersVisible = false; tree_view.RulesHint = true; TreeViewColumn col = new TreeViewColumn (); col.Sizing = TreeViewColumnSizing.Autosize; CellRenderer colr = new CellRendererText (); col.PackStart (colr, false); col.AddAttribute (colr, "markup", 0); tree_view.AppendColumn (col); ListStore model = new ListStore (typeof(string)); tree_view.Model = model; Expander expander = new Expander (String.Format ("{0}", name)); expander.UseMarkup = true; expander.Add (tree_view); expander.Expanded = true; metadata_vbox.PackStart (expander, false, false, 6); metadata_vbox.ReorderChild (expander, pos); if (open_list.Contains (name)) expander.Expanded = true; expander.Activated += HandleExpanderActivated; expander.ShowAll (); return model; } public void HandleExpanderActivated (object sender, EventArgs e) { Expander expander = (Expander) sender; if (expander.Expanded) open_list.Add (expander.Label); else open_list.Remove (expander.Label); } private bool Update () { bool empty = true; int index_of_expander = 0; bool missing = false; System.Exception error = null; /* // FIXME: The stuff below needs to be ported to Taglib#. TreeIter iter; ListStore model; string name; up_to_date = true; int i = 0; // Write Exif-Data if (exif_info != null) { foreach (ExifContent content in exif_info.GetContents ()) { ExifEntry [] entries = content.GetEntries (); i++; if (entries.Length < 1) continue; empty = false; name = ExifUtil.GetIfdNameExtended ((Ifd)i - 1); if (index_of_expander >= metadata_vbox.Children.Length) model = AddExpander (name, index_of_expander); else { Expander expander = (Expander)metadata_vbox.Children[index_of_expander]; if (expander.Label == name) model = (ListStore)((TreeView)expander.Child).Model; else { model = AddExpander (name, index_of_expander); } } model.GetIterFirst(out iter); foreach (ExifEntry entry in entries) { string s; if (entry.Title != null) s = String.Format ("{0}\n\t{1}", entry.Title, entry.Value); else s = String.Format ("Unknown Tag ID={0}\n\t{1}", entry.Tag.ToString (), entry.Value); if (model.IterIsValid(iter)) { model.SetValue (iter, 0, s); model.IterNext(ref iter); } else model.AppendValues (s); } // remove rows, that are not used while (model.IterIsValid(iter)) { model.Remove (ref iter); } index_of_expander++; } } // Write Extended Metadata if (photo != null) { MetadataStore store = new MetadataStore (); try { using (var img = ImageFile.Create (photo.DefaultVersion.Uri)) { if (img is SemWeb.StatementSource) { StatementSource source = (StatementSource)img; source.Select (store); } } } catch (System.IO.FileNotFoundException) { missing = true; } catch (System.Exception e){ // Sometimes we don't get the right exception, check for the file if (!System.IO.File.Exists (photo.DefaultVersion.Uri.LocalPath)) { missing = true; } else { // if the file is there but we still got an exception display it. error = e; } } model = extended_metadata; model.GetIterFirst(out iter); if (store.StatementCount > 0) { empty = false; foreach (Statement stmt in store) { // Skip anonymous subjects because they are // probably part of a collection if (stmt.Subject.Uri == null && store.SelectSubjects (null, stmt.Subject).Length > 0) continue; string title; string value; string s; Description.GetDescription (store, stmt, out title, out value); if (value == null) { MemoryStore substore = store.Select (new Statement ((Entity)stmt.Object, null, null, null)).Load(); StringBuilder collection = new StringBuilder (); collection.Append (title); WriteCollection (substore, collection); if (model.IterIsValid(iter)) { model.SetValue (iter, 0, collection.ToString ()); model.IterNext(ref iter); } else model.AppendValues (collection.ToString ()); } else { s = String.Format ("{0}\n\t{1}", title, value); if (model.IterIsValid(iter)) { model.SetValue (iter, 0, s); model.IterNext(ref iter); } else model.AppendValues (s); } } } else { // clear Extended Metadata String s = String.Format ("{0}", Catalog.GetString ("No Extended Metadata Available")); if (model.IterIsValid(iter)) { model.SetValue (iter, 0, s); model.IterNext(ref iter); } else model.AppendValues (s); } // remove rows, that are not used while (model.IterIsValid(iter)) { model.Remove (ref iter); } }*/ if (empty) { string msg; if (photo == null) { msg = Catalog.GetString ("No active photo"); } else if (missing) { msg = String.Format (Catalog.GetString ("The photo \"{0}\" does not exist"), photo.DefaultVersion.Uri); } else { msg = Catalog.GetString ("No metadata available"); if (error != null) { msg = String.Format ("{0}", error); } } metadata_message.Markup = "" + msg + ""; if (display == State.metadata) { // Child is a Viewport, (AddWithViewport in ctor) ((Viewport)Child).Remove (main_vbox); ((Viewport)Child).Add (metadata_message); display = State.message; metadata_message.Show (); } } else { // remove Expanders, that are not used while (index_of_expander < metadata_vbox.Children.Length) metadata_vbox.Remove (metadata_vbox.Children[index_of_expander]); if (display == State.message) { // Child is a Viewport, (AddWithViewport in ctor) ((Viewport)Child).Remove (metadata_message); ((Viewport)Child).Add (main_vbox); display = State.metadata; main_vbox.ShowAll (); } } return false; } /* private void WriteCollection (MemoryStore substore, StringBuilder collection) { string type = null; foreach (Statement stmt in substore) { if (stmt.Predicate.Uri == MetadataStore.Namespaces.Resolve ("rdf:type")) { string prefix; MetadataStore.Namespaces.Normalize (stmt.Object.Uri, out prefix, out type); } } foreach (Statement sub in substore) { if (sub.Object is SemWeb.Literal) { string title; string value = ((SemWeb.Literal)sub.Object).Value; Description.GetDescription (substore, sub, out title, out value); if (type == null) collection.AppendFormat ("\n\t{0}: {1}", title, value); else collection.AppendFormat ("\n\t{0}", value); } else { if (type == null) { MemoryStore substore2 = substore.Select (new Statement ((Entity)sub.Object, null, null, null)).Load(); if (substore.StatementCount > 0) WriteCollection (substore2, collection); } } } }*/ } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/TagView.cs0000644000175000017500000000512311503404761023315 0ustar00rubenruben00000000000000/* * FSpot.Widgets.TagView * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. * */ using System; using Gtk; using Gdk; using FSpot.Core; namespace FSpot.Widgets { public class TagView : EventBox { private int thumbnail_size = 20; private IPhoto photo; private Tag [] tags; private static int TAG_ICON_VSPACING = 5; private bool HideTags { get { return (FSpot.Preferences.Get (FSpot.Preferences.TAG_ICON_SIZE) == (int) Tag.IconSize.Hidden); } } public TagView () { VisibleWindow = false; } protected TagView (IntPtr raw) : base (raw) { VisibleWindow = false; } public IPhoto Current { set { photo = value; if (photo != null && photo.Tags != null && !HideTags) { SetSizeRequest ((thumbnail_size + TAG_ICON_VSPACING) * photo.Tags.Length, thumbnail_size); } else { SetSizeRequest (0, thumbnail_size); } QueueResize (); QueueDraw (); } } public Tag [] Tags { get { return tags; } set { this.tags = value; this.QueueDraw (); } } protected override bool OnExposeEvent (Gdk.EventExpose args) { if (photo != null) tags = photo.Tags; if (tags == null || HideTags) { SetSizeRequest(0,thumbnail_size); return base.OnExposeEvent (args); } DrawTags(); return base.OnExposeEvent (args); } public void DrawTags() { if (tags == null) return; SetSizeRequest ((thumbnail_size + TAG_ICON_VSPACING) * tags.Length, thumbnail_size); int tag_x = Allocation.X; int tag_y = Allocation.Y + (Allocation.Height - thumbnail_size)/2; string [] names = new string [tags.Length]; int i = 0; foreach (Tag t in tags) { names [i++] = t.Name; Pixbuf icon = t.Icon; Category category = t.Category; while (icon == null && category != null) { icon = category.Icon; category = category.Category; } if (icon == null) continue; Pixbuf scaled_icon; if (icon.Width == thumbnail_size) { scaled_icon = icon; } else { scaled_icon = icon.ScaleSimple (thumbnail_size, thumbnail_size, InterpType.Bilinear); } Cms.Profile screen_profile; if (FSpot.ColorManagement.Profiles.TryGetValue (Preferences.Get (Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE), out screen_profile)) FSpot.ColorManagement.ApplyProfile (scaled_icon, screen_profile); scaled_icon.RenderToDrawable (GdkWindow, Style.WhiteGC, 0, 0, tag_x, tag_y, thumbnail_size, thumbnail_size, RgbDither.None, tag_x, tag_y); tag_x += thumbnail_size + TAG_ICON_VSPACING; } this.TooltipText = String.Join (", ", names); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/ThumbnailRatingDecorationRenderer.cs0000644000175000017500000000275011503404761030541 0ustar00rubenruben00000000000000/* * ThumbnailRatingDecorationRenderer.cs * * Author(s) * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using Gtk; using Gdk; using FSpot.Core; namespace FSpot.Widgets { /// /// Renders the Rating of a photo as stars to the top left of the thumbnail. /// public class ThumbnailRatingDecorationRenderer : ThumbnailDecorationRenderer { #region Private Fields RatingRenderer rating_renderer = new RatingRenderer (); #endregion #region Constructor public ThumbnailRatingDecorationRenderer () { } #endregion #region Drawing Methods public override void Render (Drawable window, Widget widget, Rectangle cell_area, Rectangle expose_area, StateType cell_state, IPhoto photo) { if (photo.Rating > 0) { rating_renderer.Value = (int) photo.Rating; using (var rating_pixbuf = rating_renderer.RenderPixbuf ()) { rating_pixbuf.RenderToDrawable (window, widget.Style.WhiteGC, 0, 0, cell_area.X, cell_area.Y, -1, -1, RgbDither.None, 0, 0); } } } #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/ThumbnailFilenameCaptionRenderer.cs0000644000175000017500000000116411503404761030341 0ustar00rubenruben00000000000000/* * ThumbnailFilenameCaptionRenderer.cs * * Author(s) * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using System.IO; using FSpot.Core; namespace FSpot.Widgets { public class ThumbnailFilenameCaptionRenderer : ThumbnailTextCaptionRenderer { #region Constructor public ThumbnailFilenameCaptionRenderer () { } #endregion #region Drawing Methods protected override string GetRenderText (IPhoto photo) { return Path.GetFileName (photo.DefaultVersion.Uri.LocalPath); } #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/Filmstrip.cs0000644000175000017500000004352511503404760023727 0ustar00rubenruben00000000000000/* * Widgets.Filmstrip.cs * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. */ //TODO: // * only redraw required parts on ExposeEvents (low) // * Handle orientation changes (low) (require gtk# changes, so I can trigger an OrientationChanged event) using System; using System.Collections; using Gtk; using Gdk; using FSpot.Core; using FSpot.Utils; using FSpot.Platform; using FSpot.Bling; using Hyena; namespace FSpot.Widgets { public class Filmstrip : EventBox, IDisposable { // public event OrientationChangedHandler OrientationChanged; public event EventHandler PositionChanged; DoubleAnimation animation; bool extendable = true; public bool Extendable { get { return extendable; } set { extendable = value; } } Orientation orientation = Orientation.Horizontal; public Orientation Orientation { get { return orientation; } set { if (orientation == value) return; BackgroundPixbuf = null; orientation = value; // if (OrientationChanged != null) { // OrientationChangedArgs args = new OrientationChangedArgs (); // args.Orientation = value; // OrientationChanged (this, args); // } } } int spacing = 6; public int Spacing { get { return spacing; } set { if (value < 0) throw new ArgumentException ("Spacing is negative!"); spacing = value; } } int thumb_offset = 17; public int ThumbOffset { get { return thumb_offset; } set { if (value < 0) throw new ArgumentException ("ThumbOffset is negative!"); thumb_offset = value; } } int thumb_size = 67; public int ThumbSize { get { return thumb_size; } set { if (value < 0) throw new ArgumentException ("ThumbSize is negative!"); thumb_size = value; } } bool squared_thumbs = false; public bool SquaredThumbs { get { return squared_thumbs; } set { squared_thumbs = value; } } Pixbuf background_tile; public Pixbuf BackgroundTile { get { if (background_tile == null) { background_tile = new Gdk.Pixbuf (Gdk.Colorspace.Rgb, true, 8, 1, 77); background_tile.Fill (0x00000000); } if (Orientation == Orientation.Horizontal && background_tile.Height < background_tile.Width) background_tile = background_tile.RotateSimple (PixbufRotation.Counterclockwise); else if (Orientation == Orientation.Vertical && background_tile.Width < background_tile.Height) background_tile = background_tile.RotateSimple (PixbufRotation.Clockwise); return background_tile; } set { if (background_tile != value && background_tile != null) background_tile.Dispose (); background_tile = value; BackgroundPixbuf = null; } } int x_offset = 2; public int XOffset { get { return x_offset; } set { if (value < 0) throw new ArgumentException ("value is negative!"); x_offset = value; } } int y_offset = 2; public int YOffset { get { return y_offset; } set { if (value < 0) throw new ArgumentException ("value is negative!"); y_offset = value; } } float x_align = 0.5f, y_align = 0.5f; public float XAlign { get { return x_align; } set { if (value < 0.0 || value > 1.0) throw new ArgumentException ("value is not between 0.0 and 1.0"); x_align = value; } } public float YAlign { get { return y_align; } set { if (value < 0.0 || value > 1.0) throw new ArgumentException ("value is not between 0.0 and 1.0"); y_align = value; } } public int ActiveItem { get { return selection.Index; } set { if (value == selection.Index) return; if (value < 0) value = 0; if (value > selection.Collection.Count - 1) value = selection.Collection.Count - 1; selection.Index = value; } } double position; public double Position { get { return position; } set { if (value == position) return; if (value < 0) value = 0; if (value > selection.Collection.Count - 1) value = selection.Collection.Count - 1; animation.From = position; animation.To = value; animation.Restart (); if (PositionChanged != null) PositionChanged (this, EventArgs.Empty); } } BrowsablePointer selection; DisposableCache thumb_cache; public Filmstrip (BrowsablePointer selection) : this (selection, true) { } public Filmstrip (BrowsablePointer selection, bool squared_thumbs) : base () { CanFocus = true; this.selection = selection; this.selection.Changed += HandlePointerChanged; this.selection.Collection.Changed += HandleCollectionChanged; this.selection.Collection.ItemsChanged += HandleCollectionItemsChanged; this.squared_thumbs = squared_thumbs; thumb_cache = new DisposableCache (30); ThumbnailLoader.Default.OnPixbufLoaded += HandlePixbufLoaded; animation = new DoubleAnimation (0, 0, TimeSpan.FromSeconds (1.5), SetPositionCore, new CubicEase (EasingMode.EaseOut)); } int min_length = 400; int min_height = 200; protected override void OnSizeRequested (ref Gtk.Requisition requisition) { base.OnSizeRequested (ref requisition); requisition.Width = (Orientation == Orientation.Horizontal ? min_length : BackgroundTile.Width) + 2 * x_offset; requisition.Height = (Orientation == Orientation.Vertical ? min_height : BackgroundTile.Height) + 2 * y_offset; switch (Orientation) { case Orientation.Horizontal: if (min_length % BackgroundTile.Width != 0) requisition.Width += BackgroundTile.Width - min_length % BackgroundTile.Width; break; case Orientation.Vertical: if (min_height % BackgroundTile.Height != 0) requisition.Height += BackgroundTile.Height - min_height % BackgroundTile.Height; break; } } Pixbuf background_pixbuf; protected Pixbuf BackgroundPixbuf { get { if (background_pixbuf == null) { int length = BackgroundTile.Width; int height = BackgroundTile.Height; switch (Orientation) { case Orientation.Horizontal: if (Allocation.Width < min_length || !extendable) length = min_length; else length = Allocation.Width; length = length - length % BackgroundTile.Width; break; case Orientation.Vertical: if (Allocation.Height < min_height || !extendable) height = min_height; else height = Allocation.Height; height = height - height % BackgroundTile.Height; break; } background_pixbuf = new Pixbuf (Gdk.Colorspace.Rgb, true, 8, length, height); switch (Orientation) { case Orientation.Horizontal: for (int i = 0; i < length; i += BackgroundTile.Width) { BackgroundTile.CopyArea (0, 0, BackgroundTile.Width, BackgroundTile.Height, background_pixbuf, i, 0); } break; case Orientation.Vertical: for (int i = 0; i < height; i += BackgroundTile.Height) { BackgroundTile.CopyArea (0, 0, BackgroundTile.Width, BackgroundTile.Height, background_pixbuf, 0, i); } break; } } return background_pixbuf; } set { if (background_pixbuf != value && background_pixbuf != null) { background_pixbuf.Dispose (); background_pixbuf = value; } } } Hashtable start_indexes; int filmstrip_start_pos; int filmstrip_end_pos; protected override bool OnExposeEvent (EventExpose evnt) { if (evnt.Window != GdkWindow) return true; if (selection.Collection.Count == 0) return true; if (Orientation == Orientation.Horizontal && (extendable && Allocation.Width >= BackgroundPixbuf.Width + (2 * x_offset) + BackgroundTile.Width) || Orientation == Orientation.Vertical && (extendable && Allocation.Height >= BackgroundPixbuf.Height + (2 * y_offset) + BackgroundTile.Height) ) BackgroundPixbuf = null; if ( Orientation == Orientation.Horizontal && (extendable && Allocation.Width < BackgroundPixbuf.Width + (2 * x_offset) ) || Orientation == Orientation.Vertical && ( extendable && Allocation.Height < BackgroundPixbuf.Height + (2 * y_offset) )) BackgroundPixbuf = null; int xpad = 0, ypad = 0; if (Allocation.Width > BackgroundPixbuf.Width + (2 * x_offset)) xpad = (int) (x_align * (Allocation.Width - (BackgroundPixbuf.Width + (2 * x_offset)))); if (Allocation.Height > BackgroundPixbuf.Height + (2 * y_offset)) ypad = (int) (y_align * (Allocation.Height - (BackgroundPixbuf.Height + (2 * y_offset)))); GdkWindow.DrawPixbuf (Style.BackgroundGC (StateType.Normal), BackgroundPixbuf, 0, 0, x_offset + xpad, y_offset + ypad, BackgroundPixbuf.Width, BackgroundPixbuf.Height, Gdk.RgbDither.None, 0, 0); //drawing the icons... start_indexes = new Hashtable (); Pixbuf icon_pixbuf = null; if (Orientation == Orientation.Horizontal) icon_pixbuf = new Pixbuf (Gdk.Colorspace.Rgb, true, 8, BackgroundPixbuf.Width, thumb_size); else if (Orientation == Orientation.Vertical) icon_pixbuf = new Pixbuf (Gdk.Colorspace.Rgb, true, 8, thumb_size, BackgroundPixbuf.Height); icon_pixbuf.Fill (0x00000000); Pixbuf current = GetPixbuf ((int) Math.Round (Position)); int ref_x = (int)(icon_pixbuf.Width / 2.0 - current.Width * (Position + 0.5f - Math.Round (Position))); //xpos of the reference icon int ref_y = (int)(icon_pixbuf.Height / 2.0 - current.Height * (Position + 0.5f - Math.Round (Position))); int start_x = Orientation == Orientation.Horizontal ? ref_x : 0; int start_y = Orientation == Orientation.Vertical ? ref_y : 0; for (int i = (int) Math.Round (Position); i < selection.Collection.Count; i++) { current = GetPixbuf (i, ActiveItem == i); if (Orientation == Orientation.Horizontal) { current.CopyArea (0, 0, Math.Min (current.Width, icon_pixbuf.Width - start_x) , current.Height, icon_pixbuf, start_x, start_y); start_indexes [start_x] = i; start_x += current.Width + spacing; if (start_x > icon_pixbuf.Width) break; } else if (Orientation == Orientation.Vertical) { current.CopyArea (0, 0, current.Width, Math.Min (current.Height, icon_pixbuf.Height - start_y), icon_pixbuf, start_x, start_y); start_indexes [start_y] = i; start_y += current.Height + spacing; if (start_y > icon_pixbuf.Height) break; } } filmstrip_end_pos = (Orientation == Orientation.Horizontal ? start_x : start_y); start_x = Orientation == Orientation.Horizontal ? ref_x : 0; start_y = Orientation == Orientation.Vertical ? ref_y : 0; for (int i = (int) Math.Round (Position) - 1; i >= 0; i--) { current = GetPixbuf (i, ActiveItem == i); if (Orientation == Orientation.Horizontal) { start_x -= (current.Width + spacing); current.CopyArea (Math.Max (0, -start_x), 0, Math.Min (current.Width, current.Width + start_x), current.Height, icon_pixbuf, Math.Max (start_x, 0), 0); start_indexes [Math.Max (0, start_x)] = i; if (start_x < 0) break; } else if (Orientation == Orientation.Vertical) { start_y -= (current.Height + spacing); current.CopyArea (0, Math.Max (0, -start_y), current.Width, Math.Min (current.Height, current.Height + start_y), icon_pixbuf, 0, Math.Max (start_y, 0)); start_indexes [Math.Max (0, start_y)] = i; if (start_y < 0) break; } } filmstrip_start_pos = Orientation == Orientation.Horizontal ? start_x : start_y; GdkWindow.DrawPixbuf (Style.BackgroundGC (StateType.Normal), icon_pixbuf, 0, 0, x_offset + xpad, y_offset + ypad + thumb_offset, icon_pixbuf.Width, icon_pixbuf.Height, Gdk.RgbDither.None, 0, 0); icon_pixbuf.Dispose (); return true; } protected override bool OnScrollEvent (EventScroll args) { float shift = 1f; if ((args.State & Gdk.ModifierType.ShiftMask) > 0) shift = 6f; switch (args.Direction) { case ScrollDirection.Up: case ScrollDirection.Right: Position = animation.To - shift; return true; case Gdk.ScrollDirection.Down: case Gdk.ScrollDirection.Left: Position = animation.To + shift; return true; } return false; } protected override bool OnKeyPressEvent (Gdk.EventKey ek) { switch (ek.Key) { case Gdk.Key.Page_Down: case Gdk.Key.Down: case Gdk.Key.Right: ActiveItem ++; return true; case Gdk.Key.Page_Up: case Gdk.Key.Up: case Gdk.Key.Left: ActiveItem --; return true; } return false; } protected virtual void SetPositionCore (double position) { if (this.position == position) return; if (position < 0) position = 0; if (position > selection.Collection.Count - 1) position = selection.Collection.Count - 1; this.position = position; QueueDraw (); } void HandlePointerChanged (object sender, BrowsablePointerChangedEventArgs args) { Position = ActiveItem; } void HandleCollectionChanged (IBrowsableCollection coll) { this.position = ActiveItem; QueueDraw (); } void HandleCollectionItemsChanged (IBrowsableCollection coll, BrowsableEventArgs args) { if (!args.Changes.DataChanged) return; foreach (int item in args.Items) thumb_cache.TryRemove ((selection.Collection [item]).DefaultVersion.Uri); //FIXME call QueueDrawArea QueueDraw (); } void HandlePixbufLoaded (ImageLoaderThread pl, ImageLoaderThread.RequestItem item) { if (!thumb_cache.Contains (item.Uri)) { return; } //FIXME use QueueDrawArea //FIXME only invalidate if displayed QueueDraw (); } protected override bool OnPopupMenu () { DrawOrientationMenu (null); return true; } private bool DrawOrientationMenu (Gdk.EventButton args) { Gtk.Menu placement_menu = new Gtk.Menu (); GtkUtil.MakeCheckMenuItem (placement_menu, Mono.Unix.Catalog.GetString ("_Horizontal"), App.Instance.Organizer.HandleFilmstripHorizontal, true, Orientation == Orientation.Horizontal, true); GtkUtil.MakeCheckMenuItem (placement_menu, Mono.Unix.Catalog.GetString ("_Vertical"), App.Instance.Organizer.HandleFilmstripVertical, true, Orientation == Orientation.Vertical, true); if (args != null) placement_menu.Popup (null, null, null, args.Button, args.Time); else placement_menu.Popup (null, null, null, 0, Gtk.Global.CurrentEventTime); return true; } protected override bool OnButtonPressEvent (EventButton evnt) { if (evnt.Button == 3) return DrawOrientationMenu (evnt); if (evnt.Button != 1 || ( (Orientation == Orientation.Horizontal && (evnt.X > filmstrip_end_pos || evnt.X < filmstrip_start_pos)) || (Orientation == Orientation.Vertical && (evnt.Y > filmstrip_end_pos || evnt.Y < filmstrip_start_pos)) )) return false; HasFocus = true; int pos = -1; foreach (int key in start_indexes.Keys) if (key <= (Orientation == Orientation.Horizontal ? evnt.X : evnt.Y) && key > pos) pos = key; ActiveItem = (int)start_indexes [pos]; return true; } protected Pixbuf GetPixbuf (int i) { return GetPixbuf (i, false); } protected virtual Pixbuf GetPixbuf (int i, bool highlighted) { Pixbuf current = null; SafeUri uri = (selection.Collection [i]).DefaultVersion.Uri; try { var pixbuf = thumb_cache.Get (uri); if (pixbuf != null) current = pixbuf.ShallowCopy (); } catch (IndexOutOfRangeException) { current = null; } if (current == null) { var pixbuf = XdgThumbnailSpec.LoadThumbnail (uri, ThumbnailSize.Large, null); if (pixbuf == null) { ThumbnailLoader.Default.Request (uri, ThumbnailSize.Large, 0); current = FSpot.Core.Global.IconTheme.LoadIcon ("gtk-missing-image", ThumbSize, (Gtk.IconLookupFlags)0); } else { if (SquaredThumbs) { current = PixbufUtils.IconFromPixbuf (pixbuf, ThumbSize); } else { current = pixbuf.ScaleSimple (ThumbSize, ThumbSize, InterpType.Nearest); } pixbuf.Dispose (); thumb_cache.Add (uri, current); } } //FIXME: we might end up leaking a pixbuf here Cms.Profile screen_profile; if (FSpot.ColorManagement.Profiles.TryGetValue (Preferences.Get (Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE), out screen_profile)) { Pixbuf t = current.Copy (); current = t; FSpot.ColorManagement.ApplyProfile (current, screen_profile); } // Add a four pixel white border around the thumbnail Pixbuf whiteBorder = new Pixbuf (Gdk.Colorspace.Rgb, true, 8, current.Width, current.Height); whiteBorder.Fill (0); current.CopyArea (1, 1, current.Width - 8, current.Height - 8, whiteBorder, 4, 4); current = whiteBorder; if (!highlighted) return current; Pixbuf highlight = new Pixbuf (Gdk.Colorspace.Rgb, true, 8, current.Width, current.Height); highlight.Fill (ColorToInt (Style.Light (StateType.Selected))); // Add a two pixel highlight around the thumbnail current.CopyArea (2, 2, current.Width - 4, current.Height - 4, highlight, 2, 2); return highlight; } private static uint ColorToInt(Gdk.Color color) { return (uint)((uint)color.Red / 256 << 24 ) + ((uint)color.Green / 256 << 16) + ((uint)color.Blue / 256 << 8) + 255; } ~Filmstrip () { Log.DebugFormat ("Finalizer called on {0}. Should be Disposed", GetType ()); Dispose (false); } public override void Dispose () { Dispose (true); base.Dispose (); System.GC.SuppressFinalize (this); } bool is_disposed = false; protected virtual void Dispose (bool disposing) { if (is_disposed) return; if (disposing) { this.selection.Changed -= HandlePointerChanged; this.selection.Collection.Changed -= HandleCollectionChanged; this.selection.Collection.ItemsChanged -= HandleCollectionItemsChanged; ThumbnailLoader.Default.OnPixbufLoaded -= HandlePixbufLoaded; if (background_pixbuf != null) background_pixbuf.Dispose (); if (background_tile != null) background_tile.Dispose (); thumb_cache.Dispose (); } //Free unmanaged resources is_disposed = true; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/CollectionCellGridView.cs0000644000175000017500000004457211503404760026315 0ustar00rubenruben00000000000000/* * CollectionGridView.cs * * Author(s) * Etore Perazzoli * Larry Ewing * Stephane Delcroix * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using Gtk; using Gdk; using FSpot.Core; using FSpot.Utils; namespace FSpot.Widgets { /// /// This class extends CellGridView to provide a grid view for a photo collection. /// public abstract class CollectionGridView : CellGridView { #region Private Fields private ThumbnailDecorationRenderer rating_renderer = new ThumbnailRatingDecorationRenderer (); private ThumbnailCaptionRenderer tag_renderer = new ThumbnailTagsCaptionRenderer (); private ThumbnailCaptionRenderer date_renderer = new ThumbnailDateCaptionRenderer (); private ThumbnailCaptionRenderer filename_renderer = new ThumbnailFilenameCaptionRenderer (); #endregion #region Public Properties public IBrowsableCollection Collection { get; private set; } public FSpot.PixbufCache Cache { get; private set; } #endregion #region Constructors public CollectionGridView (IntPtr raw) : base (raw) { } public CollectionGridView (IBrowsableCollection collection) : base () { Collection = collection; Collection.Changed += (obj) => { QueueResize (); }; Collection.ItemsChanged += (obj, args) => { foreach (int item in args.Items) { if (args.Changes.DataChanged) UpdateThumbnail (item); InvalidateCell (item); } }; Name = "ImageContainer"; Cache = new FSpot.PixbufCache (); Cache.OnPixbufLoaded += HandlePixbufLoaded; } #endregion #region Zooming and Thumbnail Size // fixed constants protected const double ZOOM_FACTOR = 1.2; protected const int MAX_THUMBNAIL_WIDTH = 256; protected const int MIN_THUMBNAIL_WIDTH = 64; // size of the border of the whole pane protected const int SELECTION_THICKNESS = 5; // frame around the whole cell protected const int CELL_BORDER_WIDTH = 10; // padding between the thumbnail and the thumbnail caption protected const int CAPTION_PADDING = 6; // current with of the thumbnails. (height is calculated) private int thumbnail_width = 128; // current ratio of thumbnail width and height private double thumbnail_ratio = 4.0 / 3.0; public int ThumbnailWidth { get { return thumbnail_width; } set { value = Math.Min (value, MAX_THUMBNAIL_WIDTH); value = Math.Max (value, MIN_THUMBNAIL_WIDTH); if (thumbnail_width != value) { thumbnail_width = value; QueueResize (); if (ZoomChanged != null) ZoomChanged (this, System.EventArgs.Empty); } } } public double Zoom { get { return ((double)(ThumbnailWidth - MIN_THUMBNAIL_WIDTH) / (double)(MAX_THUMBNAIL_WIDTH - MIN_THUMBNAIL_WIDTH)); } set { ThumbnailWidth = (int) ((value) * (MAX_THUMBNAIL_WIDTH - MIN_THUMBNAIL_WIDTH)) + MIN_THUMBNAIL_WIDTH; } } public double ThumbnailRatio { get { return thumbnail_ratio; } set { thumbnail_ratio = value; QueueResize (); } } public int ThumbnailHeight { get { return (int) Math.Round ((double) thumbnail_width / ThumbnailRatio); } } public void ZoomIn () { ThumbnailWidth = (int) (ThumbnailWidth * ZOOM_FACTOR); } public void ZoomOut () { ThumbnailWidth = (int) (ThumbnailWidth / ZOOM_FACTOR); } #endregion #region Implementation of Base Class Layout Properties protected override int MinCellHeight { get { int cell_height = ThumbnailHeight + 2 * CELL_BORDER_WIDTH; if (DisplayTags || DisplayDates || DisplayFilenames) cell_height += CAPTION_PADDING; if (DisplayTags) cell_height += tag_renderer.GetHeight (this, ThumbnailWidth); if (DisplayDates && Style != null) cell_height += date_renderer.GetHeight (this, ThumbnailWidth); if (DisplayFilenames && Style != null) cell_height += filename_renderer.GetHeight (this, ThumbnailWidth); return cell_height; } } protected override int MinCellWidth { get { return ThumbnailWidth + 2 * CELL_BORDER_WIDTH; } } protected override int CellCount { get { if (Collection == null) return 0; return Collection.Count; } } #endregion #region Thumbnail Decoration private bool display_tags = true; public bool DisplayTags { get { return display_tags; } set { display_tags = value; QueueResize (); } } private bool display_dates = true; public bool DisplayDates { get { if (MinCellWidth > 100) return display_dates; else return false; } set { display_dates = value; QueueResize (); } } private bool display_filenames = false; public bool DisplayFilenames { get { return display_filenames; } set { if (value != display_filenames) { display_filenames = value; QueueResize (); } } } private bool display_ratings = true; public bool DisplayRatings { get { if (MinCellWidth > 100) return display_ratings; else return false; } set { display_ratings = value; QueueResize (); } } #endregion #region Public Events public event EventHandler ZoomChanged; #endregion #region Event Handlers private void HandlePixbufLoaded (FSpot.PixbufCache Cache, FSpot.PixbufCache.CacheEntry entry) { Gdk.Pixbuf result = entry.ShallowCopyPixbuf (); int order = (int) entry.Data; if (result == null) return; // We have to do the scaling here rather than on load because we need to preserve the // Pixbuf option iformation to verify the thumbnail validity later int width, height; PixbufUtils.Fit (result, ThumbnailWidth, ThumbnailHeight, false, out width, out height); if (result.Width > width && result.Height > height) { // Log.Debug ("scaling"); Gdk.Pixbuf temp = PixbufUtils.ScaleDown (result, width, height); result.Dispose (); result = temp; } else if (result.Width < ThumbnailWidth && result.Height < ThumbnailHeight) { // FIXME this is a workaround to handle images whose actual size is smaller than // the thumbnail size, it needs to be fixed at a different level. Gdk.Pixbuf temp = new Gdk.Pixbuf (Gdk.Colorspace.Rgb, true, 8, ThumbnailWidth, ThumbnailHeight); temp.Fill (0x00000000); result.CopyArea (0, 0, result.Width, result.Height, temp, (temp.Width - result.Width)/ 2, temp.Height - result.Height); result.Dispose (); result = temp; } Cache.Update (entry, result); InvalidateCell (order); } #endregion #region Drawing Methods public void UpdateThumbnail (int thumbnail_num) { IPhoto photo = Collection [thumbnail_num]; Cache.Remove (photo.DefaultVersion.Uri); InvalidateCell (thumbnail_num); } protected override void DrawCell (int cell_num, Rectangle cell_area, Rectangle expose_area) { DrawPhoto (cell_num, cell_area, expose_area, false, false); } // FIXME Cache the GCs? protected virtual void DrawPhoto (int cell_num, Rectangle cell_area, Rectangle expose_area, bool selected, bool focussed) { if (!cell_area.Intersect (expose_area, out expose_area)) return; IPhoto photo = Collection [cell_num]; FSpot.PixbufCache.CacheEntry entry = Cache.Lookup (photo.DefaultVersion.Uri); if (entry == null) Cache.Request (photo.DefaultVersion.Uri, cell_num, ThumbnailWidth, ThumbnailHeight); else entry.Data = cell_num; StateType cell_state = selected ? (HasFocus ? StateType.Selected : StateType.Active) : State; if (cell_state != State) Style.PaintBox (Style, BinWindow, cell_state, ShadowType.Out, expose_area, this, "IconView", cell_area.X, cell_area.Y, cell_area.Width - 1, cell_area.Height - 1); Gdk.Rectangle focus = Gdk.Rectangle.Inflate (cell_area, -3, -3); if (HasFocus && focussed) { Style.PaintFocus(Style, BinWindow, cell_state, expose_area, this, null, focus.X, focus.Y, focus.Width, focus.Height); } Gdk.Rectangle region = Gdk.Rectangle.Zero; Gdk.Rectangle image_bounds = Gdk.Rectangle.Inflate (cell_area, -CELL_BORDER_WIDTH, -CELL_BORDER_WIDTH); int expansion = ThrobExpansion (cell_num, selected); Gdk.Pixbuf thumbnail = null; if (entry != null) thumbnail = entry.ShallowCopyPixbuf (); Gdk.Rectangle draw = Gdk.Rectangle.Zero; if (Gdk.Rectangle.Inflate (image_bounds, expansion + 1, expansion + 1).Intersect (expose_area, out image_bounds) && thumbnail != null) { PixbufUtils.Fit (thumbnail, ThumbnailWidth, ThumbnailHeight, true, out region.Width, out region.Height); region.X = (int) (cell_area.X + (cell_area.Width - region.Width) / 2); region.Y = (int) cell_area.Y + ThumbnailHeight - region.Height + CELL_BORDER_WIDTH; if (Math.Abs (region.Width - thumbnail.Width) > 1 && Math.Abs (region.Height - thumbnail.Height) > 1) Cache.Reload (entry, cell_num, thumbnail.Width, thumbnail.Height); region = Gdk.Rectangle.Inflate (region, expansion, expansion); Pixbuf temp_thumbnail; region.Width = System.Math.Max (1, region.Width); region.Height = System.Math.Max (1, region.Height); if (Math.Abs (region.Width - thumbnail.Width) > 1 && Math.Abs (region.Height - thumbnail.Height) > 1) { if (region.Width < thumbnail.Width && region.Height < thumbnail.Height) { /* temp_thumbnail = PixbufUtils.ScaleDown (thumbnail, region.Width, region.Height); */ temp_thumbnail = thumbnail.ScaleSimple (region.Width, region.Height, InterpType.Bilinear); lock (entry) { if (entry.Reload && expansion == 0 && !entry.IsDisposed) { entry.SetPixbufExtended (temp_thumbnail.ShallowCopy (), false); entry.Reload = true; } } } else { temp_thumbnail = thumbnail.ScaleSimple (region.Width, region.Height, InterpType.Bilinear); } } else temp_thumbnail = thumbnail; // FIXME There seems to be a rounding issue between the // scaled thumbnail sizes, we avoid this for now by using // the actual thumnail sizes here. region.Width = temp_thumbnail.Width; region.Height = temp_thumbnail.Height; draw = Gdk.Rectangle.Inflate (region, 1, 1); if (!temp_thumbnail.HasAlpha) Style.PaintShadow (Style, BinWindow, cell_state, ShadowType.Out, expose_area, this, "IconView", draw.X, draw.Y, draw.Width, draw.Height); if (region.Intersect (expose_area, out draw)) { Cms.Profile screen_profile; if (FSpot.ColorManagement.Profiles.TryGetValue (Preferences.Get (Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE), out screen_profile)) { Pixbuf t = temp_thumbnail.Copy (); temp_thumbnail.Dispose (); temp_thumbnail = t; FSpot.ColorManagement.ApplyProfile (temp_thumbnail, screen_profile); } temp_thumbnail.RenderToDrawable (BinWindow, Style.WhiteGC, draw.X - region.X, draw.Y - region.Y, draw.X, draw.Y, draw.Width, draw.Height, RgbDither.None, draw.X, draw.Y); } if (temp_thumbnail != thumbnail) { temp_thumbnail.Dispose (); } } if (thumbnail != null) { thumbnail.Dispose (); } // Render Decorations if (DisplayRatings && region.X == draw.X && region.X != 0) { rating_renderer.Render (BinWindow, this, region, expose_area, cell_state, photo); } // Render Captions Rectangle caption_area = Rectangle.Zero; caption_area.Y = cell_area.Y + CELL_BORDER_WIDTH + ThumbnailHeight + CAPTION_PADDING; caption_area.X = cell_area.X + CELL_BORDER_WIDTH; caption_area.Width = cell_area.Width - 2 * CELL_BORDER_WIDTH; if (DisplayDates) { caption_area.Height = date_renderer.GetHeight (this, ThumbnailWidth); date_renderer.Render (BinWindow, this, caption_area, expose_area, cell_state, photo); caption_area.Y += caption_area.Height; } if (DisplayFilenames) { caption_area.Height = filename_renderer.GetHeight (this, ThumbnailWidth); filename_renderer.Render (BinWindow, this, caption_area, expose_area, cell_state, photo); caption_area.Y += caption_area.Height; } if (DisplayTags) { caption_area.Height = tag_renderer.GetHeight (this, ThumbnailWidth); tag_renderer.Render (BinWindow, this, caption_area, expose_area, cell_state, photo); caption_area.Y += caption_area.Height; } } protected override void PreloadCell (int cell_num) { var photo = Collection [cell_num]; var entry = Cache.Lookup (photo.DefaultVersion.Uri); if (entry == null) Cache.Request (photo.DefaultVersion.Uri, cell_num, ThumbnailWidth, ThumbnailHeight); } #endregion #region Throb Interface private uint throb_timer_id; private int throb_cell = -1; private int throb_state; private const int throb_state_max = 40; public void Throb (int cell_num) { throb_state = 0; throb_cell = cell_num; if (throb_timer_id == 0) throb_timer_id = GLib.Timeout.Add ((39000/throb_state_max)/100, new GLib.TimeoutHandler (HandleThrobTimer)); InvalidateCell (cell_num); } private void CancelThrob () { if (throb_timer_id != 0) GLib.Source.Remove (throb_timer_id); } private bool HandleThrobTimer () { InvalidateCell (throb_cell); if (throb_state++ < throb_state_max) { return true; } else { throb_cell = -1; throb_timer_id = 0; return false; } } private int ThrobExpansion (int cell, bool selected) { int expansion = 0; if (cell == throb_cell) { double t = throb_state / (double) (throb_state_max - 1); double s; if (selected) s = Math.Cos (-2 * Math.PI * t); else s = 1 - Math.Cos (-2 * Math.PI * t); expansion = (int) (SELECTION_THICKNESS * s); } else if (selected) { expansion = SELECTION_THICKNESS; } return expansion; } #endregion #region Theming private void SetColors () { if (IsRealized) { BinWindow.Background = Style.DarkColors [(int)State]; } } protected override void OnRealized () { base.OnRealized (); SetColors (); } protected override void OnStateChanged (StateType previous) { base.OnStateChanged (previous); SetColors (); } protected override void OnStyleSet (Style previous) { base.OnStyleSet (previous); SetColors (); } #endregion #region Override Other Base Class Behavior protected override void OnDestroyed () { Cache.OnPixbufLoaded -= HandlePixbufLoaded; CancelThrob (); base.OnDestroyed (); } #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/EditorPage.cs0000644000175000017500000001770211503404760023777 0ustar00rubenruben00000000000000/* * Widgets.EditorPage.cs * * Author(s) * Ruben Vermeersch * * This is free software. See COPYING for details. */ using FSpot; using FSpot.Extensions; using FSpot.Editors; using FSpot.UI.Dialog; using FSpot.Utils; using FSpot.Core; using Gtk; using Mono.Addins; using Mono.Unix; using System; using System.Collections.Generic; using Hyena; using Hyena.Widgets; namespace FSpot.Widgets { public class EditorPage : SidebarPage { internal bool InPhotoView; private readonly EditorPageWidget EditorPageWidget; public EditorPage () : base (new EditorPageWidget (), Catalog.GetString ("Edit"), "mode-image-edit") { // TODO: Somebody might need to change the icon to something more suitable. // FIXME: The icon isn't shown in the menu, are we missing a size? EditorPageWidget = SidebarWidget as EditorPageWidget; EditorPageWidget.Page = this; } protected override void AddedToSidebar () { (Sidebar as Sidebar).SelectionChanged += delegate (IBrowsableCollection collection) { EditorPageWidget.ShowTools (); }; (Sidebar as Sidebar).ContextChanged += HandleContextChanged; } private void HandleContextChanged (object sender, EventArgs args) { InPhotoView = ((Sidebar as Sidebar).Context == ViewContext.Edit); EditorPageWidget.ChangeButtonVisibility (); } } public class EditorPageWidget : Gtk.ScrolledWindow { private VBox widgets; private VButtonBox buttons; private Widget active_editor; private List editors; private Editor current_editor; // Used to make buttons insensitive when selecting multiple images. private Dictionary editor_buttons; private EditorPage page; internal EditorPage Page { get { return page; } set { page = value; ChangeButtonVisibility (); } } public EditorPageWidget () { editors = new List (); editor_buttons = new Dictionary (); ShowTools (); AddinManager.AddExtensionNodeHandler ("/FSpot/Editors", OnExtensionChanged); } private void OnExtensionChanged (object s, ExtensionNodeEventArgs args) { // FIXME: We do not do run-time removal of editors yet! if (args.Change == ExtensionChange.Add) { Editor editor = (args.ExtensionNode as EditorNode).GetEditor (); editor.ProcessingStarted += OnProcessingStarted; editor.ProcessingStep += OnProcessingStep; editor.ProcessingFinished += OnProcessingFinished; editors.Add (editor); PackButton (editor); } } private ProgressDialog progress; private void OnProcessingStarted (string name, int count) { progress = new ProgressDialog (name, ProgressDialog.CancelButtonType.None, count, App.Instance.Organizer.Window); } private void OnProcessingStep (int done) { if (progress != null) progress.Update (String.Empty); } private void OnProcessingFinished () { if (progress != null) { progress.Destroy (); progress = null; } } internal void ChangeButtonVisibility () { foreach (Editor editor in editors) { Button button; if (editor_buttons.TryGetValue (editor, out button)) button.Visible = Page.InPhotoView || editor.CanHandleMultiple; } } void PackButton (Editor editor) { Button button = new Button (editor.Label); if (editor.IconName != null) button.Image = new Image (GtkUtil.TryLoadIcon (FSpot.Core.Global.IconTheme, editor.IconName, 22, (Gtk.IconLookupFlags)0)); button.Clicked += delegate (object o, EventArgs e) { ChooseEditor (editor); }; button.Show (); buttons.Add (button); editor_buttons.Add (editor, button); } public void ShowTools () { // Remove any open editor, if present. if (current_editor != null) { active_editor.Hide (); widgets.Remove (active_editor); active_editor = null; current_editor.Restore (); current_editor = null; } // No need to build the widget twice. if (buttons != null) { buttons.Show (); return; } if (widgets == null) { widgets = new VBox (false, 0); widgets.NoShowAll = true; widgets.Show (); Viewport widgets_port = new Viewport (); widgets_port.Add (widgets); Add (widgets_port); widgets_port.ShowAll (); } // Build the widget (first time we call this method). buttons = new VButtonBox (); buttons.BorderWidth = 5; buttons.Spacing = 5; buttons.LayoutStyle = ButtonBoxStyle.Start; foreach (Editor editor in editors) PackButton (editor); buttons.Show (); widgets.Add (buttons); } private void ChooseEditor (Editor editor) { SetupEditor (editor); if (!editor.CanBeApplied || editor.HasSettings) ShowEditor (editor); else Apply (editor); // Instant apply } private bool SetupEditor (Editor editor) { EditorState state = editor.CreateState (); PhotoImageView photo_view = App.Instance.Organizer.PhotoView.View; if (Page.InPhotoView && photo_view != null) { state.Selection = photo_view.Selection; state.PhotoImageView = photo_view; } else { state.Selection = Gdk.Rectangle.Zero; state.PhotoImageView = null; } if ((Page.Sidebar as Sidebar).Selection == null) return false; state.Items = (Page.Sidebar as Sidebar).Selection.Items; editor.Initialize (state); return true; } private void Apply (Editor editor) { if (!SetupEditor (editor)) return; if (!editor.CanBeApplied) { string msg = Catalog.GetString ("No selection available"); string desc = Catalog.GetString ("This tool requires an active selection. Please select a region of the photo and try the operation again"); HigMessageDialog md = new HigMessageDialog (App.Instance.Organizer.Window, DialogFlags.DestroyWithParent, Gtk.MessageType.Error, ButtonsType.Ok, msg, desc); md.Run (); md.Destroy (); return; } // TODO: Might need to do some nicer things for multiple selections (progress?) try { editor.Apply (); } catch (Exception e) { Log.DebugException (e); string msg = Catalog.GetPluralString ("Error saving adjusted photo", "Error saving adjusted photos", editor.State.Items.Length); string desc = String.Format (Catalog.GetString ("Received exception \"{0}\". Note that you have to develop RAW files into JPEG before you can edit them."), e.Message); HigMessageDialog md = new HigMessageDialog (App.Instance.Organizer.Window, DialogFlags.DestroyWithParent, Gtk.MessageType.Error, ButtonsType.Ok, msg, desc); md.Run (); md.Destroy (); } ShowTools (); } private void ShowEditor (Editor editor) { SetupEditor (editor); current_editor = editor; buttons.Hide (); // Top label VBox vbox = new VBox (false, 4); Label label = new Label (); label.Markup = String.Format("{0}", editor.Label); vbox.PackStart (label, false, false, 5); // Optional config widget Widget config = editor.ConfigurationWidget (); if (config != null) { // This is necessary because GtkBuilder widgets need to be // reparented. if (config.Parent != null) { config.Reparent (vbox); } else { vbox.PackStart (config, false, false, 0); } } // Apply / Cancel buttons HButtonBox tool_buttons = new HButtonBox (); tool_buttons.LayoutStyle = ButtonBoxStyle.End; tool_buttons.Spacing = 5; tool_buttons.BorderWidth = 5; tool_buttons.Homogeneous = false; Button cancel = new Button (Stock.Cancel); cancel.Clicked += HandleCancel; tool_buttons.Add (cancel); Button apply = new Button (editor.ApplyLabel); apply.Image = new Image (GtkUtil.TryLoadIcon (FSpot.Core.Global.IconTheme, editor.IconName, 22, (Gtk.IconLookupFlags)0)); apply.Clicked += delegate { Apply (editor); }; tool_buttons.Add (apply); // Pack it all together vbox.PackEnd (tool_buttons, false, false, 0); active_editor = vbox; widgets.Add (active_editor); active_editor.ShowAll (); } void HandleCancel (object sender, System.EventArgs args) { ShowTools (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/Sidebar.cs0000644000175000017500000001566311503404761023332 0ustar00rubenruben00000000000000/* * Widgets.Sidebar.cs * * Author(s) * Mike Gemuende * Stephane Delcroix * Ruben Vermeersch * * This is free software. See COPYING for details. */ using FSpot.Core; using FSpot.Extensions; using FSpot.Utils; using Gtk; using Mono.Addins; using Mono.Unix; using System; using System.Collections.Generic; namespace FSpot.Widgets { // Decides which sidebar page should be shown for each context. Implemented // using the Strategy pattern, to make it swappable easily, in case the // default MRUSidebarContextSwitchStrategy is not sufficiently usable. public interface ISidebarContextSwitchStrategy { string PageForContext (ViewContext context); void SwitchedToPage (ViewContext context, string name); } // Implements a Most Recently Used switching strategy. The last page you used // for a given context is used. public class MRUSidebarContextSwitchStrategy : ISidebarContextSwitchStrategy { public const string PREF_PREFIX = Preferences.APP_FSPOT + "ui/sidebar"; private string PrefKeyForContext (ViewContext context) { return String.Format ("{0}/{1}", PREF_PREFIX, context); } public string PageForContext (ViewContext context) { string name = Preferences.Get (PrefKeyForContext (context)); if (name == null) name = DefaultForContext (context); return name; } public void SwitchedToPage (ViewContext context, string name) { Preferences.Set (PrefKeyForContext (context), name); } private string DefaultForContext (ViewContext context) { if (context == ViewContext.Edit) return Catalog.GetString ("Edit"); // Don't care otherwise, Tags sounds reasonable return Catalog.GetString ("Tags"); } } public class Sidebar : VBox { private HBox button_box; public Notebook Notebook { get; private set; } private MenuButton choose_button; private EventBox eventBox; private Menu choose_menu; private List menu_list; private List image_list; public event EventHandler CloseRequested; // Selection change events, sidebar pages can subscribed to this. public event IBrowsableCollectionChangedHandler SelectionChanged; public event IBrowsableCollectionItemsChangedHandler SelectionItemsChanged; // The photos selected. private IBrowsableCollection selection; public IBrowsableCollection Selection { get { return selection; } private set { selection = value; } } public event EventHandler ContextChanged; private ViewContext view_context = ViewContext.Unknown; public ViewContext Context { get { return view_context; } set { view_context = value; if (ContextChanged != null) ContextChanged (this, null); } } private readonly ISidebarContextSwitchStrategy ContextSwitchStrategy; public Sidebar () : base () { ContextSwitchStrategy = new MRUSidebarContextSwitchStrategy (); ContextChanged += HandleContextChanged; button_box = new HBox (); PackStart (button_box, false, false, 0); Notebook = new Notebook (); Notebook.ShowTabs = false; Notebook.ShowBorder = false; PackStart (Notebook, true, true, 0); Button button = new Button (); button.Image = new Image ("gtk-close", IconSize.Button); button.Relief = ReliefStyle.None; button.Pressed += HandleCloseButtonPressed; button_box.PackEnd (button, false, true, 0); choose_button = new MenuButton (); choose_button.Relief = ReliefStyle.None; eventBox = new EventBox (); eventBox.Add (choose_button); button_box.PackStart (eventBox, true, true, 0); choose_menu = new Menu (); choose_button.Menu = choose_menu; menu_list = new List (); image_list = new List (); } private void HandleContextChanged (object sender, EventArgs args) { // Make sure the ViewModeCondition is set correctly. if (Context == ViewContext.Single) ViewModeCondition.Mode = FSpot.Extensions.ViewMode.Single; else if (Context == ViewContext.Library || Context == ViewContext.Edit) ViewModeCondition.Mode = FSpot.Extensions.ViewMode.Library; else ViewModeCondition.Mode = FSpot.Extensions.ViewMode.Unknown; string name = ContextSwitchStrategy.PageForContext (Context); SwitchTo (name); } private void HandleCanSelectChanged (object sender, EventArgs args) { //Log.Debug ("Can select changed for {0} to {1}", sender, (sender as SidebarPage).CanSelect); } public void AppendPage (Widget widget, string label, string icon_name) { AppendPage (new SidebarPage (widget, label, icon_name)); } public void AppendPage (SidebarPage page) { page.Sidebar = this; page.CanSelectChanged += HandleCanSelectChanged; string label = page.Label; string icon_name = page.IconName; Notebook.AppendPage (page.SidebarWidget, new Label (label)); page.SidebarWidget.Show (); MenuItem item; if (icon_name == null) item = new MenuItem (label); else { item = new ImageMenuItem (label); (item as ImageMenuItem).Image = new Image (); ((item as ImageMenuItem).Image as Image).IconName = icon_name; } item.Activated += HandleItemClicked; choose_menu.Append (item); item.Show (); if (Notebook.Children.Length == 1) { choose_button.Label = label; choose_button.Image.IconName = icon_name; } menu_list.Add (label); image_list.Add (icon_name); } public void HandleMainWindowViewModeChanged (object o, EventArgs args) { MainWindow.ModeType mode = App.Instance.Organizer.ViewMode; if (mode == MainWindow.ModeType.IconView) Context = ViewContext.Library; else if (mode == MainWindow.ModeType.PhotoView) Context = ViewContext.Edit; } public void HandleItemClicked (object o, EventArgs args) { string name = ((o as MenuItem).Child as Label).Text; SwitchTo (name); ContextSwitchStrategy.SwitchedToPage (Context, name); } public void HandleCloseButtonPressed (object sender, EventArgs args) { if (CloseRequested != null) CloseRequested (this, args); } public void SwitchTo (int n) { if (n >= Notebook.Children.Length) { n = 0; } Notebook.CurrentPage = n; choose_button.Label = menu_list [n]; choose_button.Image.IconName = image_list [n]; } public int CurrentPage { get { return Notebook.CurrentPage; } } public void SwitchTo (string name) { if (menu_list.Contains (name)) SwitchTo (menu_list.IndexOf (name)); } public bool IsActive (SidebarPage page) { return (Notebook.GetNthPage (Notebook.CurrentPage) == page.SidebarWidget); } public void HandleSelectionChanged (IBrowsableCollection collection) { Selection = collection; // Proxy selection change to the subscribed sidebar pages. if (SelectionChanged != null) SelectionChanged (collection); } // Proxy selection item changes to the subscribed sidebar pages. public void HandleSelectionItemsChanged (IBrowsableCollection collection, BrowsableEventArgs args) { if (SelectionItemsChanged != null) SelectionItemsChanged (collection, args); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/PhotoImageView.cs0000644000175000017500000002450611503404761024644 0ustar00rubenruben00000000000000// // FSpot.Widgets.PhotoImageView.cs // // Copyright (c) 2004-2009 Novell, Inc. // // Author(s) // Larry Ewing // Stephane Delcroix // // This is free software. See COPYING for details. // using System; using FSpot.Core; using FSpot.Editors; using FSpot.Utils; using FSpot.Loaders; using Hyena; using Gdk; using TagLib.Image; namespace FSpot.Widgets { public class PhotoImageView : ImageView { #region public API protected PhotoImageView (IntPtr raw) : base (raw) { } public PhotoImageView (IBrowsableCollection query) : this (new BrowsablePointer (query, -1)) { } public PhotoImageView (BrowsablePointer item) : base () { Accelerometer.OrientationChanged += HandleOrientationChanged; Preferences.SettingChanged += OnPreferencesChanged; this.item = item; item.Changed += HandlePhotoItemChanged; } public BrowsablePointer Item { get { return item; } } public IBrowsableCollection Query { get { return item.Collection; } } public Loupe Loupe { get { return loupe; } } public Gdk.Pixbuf CompletePixbuf () { //FIXME: this should be an async call if (loader != null) while (loader.Loading) Gtk.Application.RunIteration (); return this.Pixbuf; } public void Reload () { if (Item == null || !Item.IsValid) return; HandlePhotoItemChanged (this, null); } // Zoom scaled between 0.0 and 1.0 public double NormalizedZoom { get { return (Zoom - MIN_ZOOM) / (MAX_ZOOM - MIN_ZOOM); } set { Zoom = (value * (MAX_ZOOM - MIN_ZOOM)) + MIN_ZOOM; } } public event EventHandler PhotoChanged; #endregion #region Gtk widgetry protected override void OnStyleSet (Gtk.Style previous) { CheckPattern = new CheckPattern (this.Style.Backgrounds [(int)Gtk.StateType.Normal]); } protected override bool OnKeyPressEvent (Gdk.EventKey evnt) { if ((evnt.State & (ModifierType.Mod1Mask | ModifierType.ControlMask)) != 0) return base.OnKeyPressEvent (evnt); bool handled = true; // Scroll if image is zoomed in (scrollbars are visible) Gtk.ScrolledWindow scrolled_w = this.Parent as Gtk.ScrolledWindow; bool scrolled = scrolled_w != null && !this.Fit; // Go to the next/previous photo when not zoomed (no scrollbars) switch (evnt.Key) { case Gdk.Key.Up: case Gdk.Key.KP_Up: case Gdk.Key.Left: case Gdk.Key.KP_Left: case Gdk.Key.h: case Gdk.Key.H: case Gdk.Key.k: case Gdk.Key.K: if (scrolled) handled = false; else this.Item.MovePrevious (); break; case Gdk.Key.Page_Up: case Gdk.Key.KP_Page_Up: case Gdk.Key.BackSpace: case Gdk.Key.b: case Gdk.Key.B: this.Item.MovePrevious (); break; case Gdk.Key.Down: case Gdk.Key.KP_Down: case Gdk.Key.Right: case Gdk.Key.KP_Right: case Gdk.Key.j: case Gdk.Key.J: case Gdk.Key.l: case Gdk.Key.L: if (scrolled) handled = false; else this.Item.MoveNext (); break; case Gdk.Key.Page_Down: case Gdk.Key.KP_Page_Down: case Gdk.Key.space: case Gdk.Key.KP_Space: case Gdk.Key.n: case Gdk.Key.N: this.Item.MoveNext (); break; case Gdk.Key.Home: case Gdk.Key.KP_Home: this.Item.Index = 0; break; case Gdk.Key.r: case Gdk.Key.R: this.Item.Index = new Random().Next(0, this.Query.Count - 1); break; case Gdk.Key.End: case Gdk.Key.KP_End: this.Item.Index = this.Query.Count - 1; break; default: handled = false; break; } return handled || base.OnKeyPressEvent (evnt); } protected override void OnDestroyed () { if (loader != null) { loader.AreaUpdated -= HandlePixbufAreaUpdated; loader.AreaPrepared -= HandlePixbufPrepared; loader.Dispose (); } base.OnDestroyed (); } #endregion #region loader uint timer; IImageLoader loader; void Load (SafeUri uri) { timer = Log.DebugTimerStart (); if (loader != null) loader.Dispose (); loader = ImageLoader.Create (uri); loader.AreaPrepared += HandlePixbufPrepared; loader.AreaUpdated += HandlePixbufAreaUpdated; loader.Completed += HandleDone; loader.Load (uri); } void HandlePixbufPrepared (object sender, AreaPreparedEventArgs args) { IImageLoader loader = sender as IImageLoader; if (loader != this.loader) return; if (!ShowProgress) return; Gdk.Pixbuf prev = this.Pixbuf; this.Pixbuf = loader.Pixbuf; PixbufOrientation = Accelerometer.GetViewOrientation (loader.PixbufOrientation); if (prev != null) prev.Dispose (); this.ZoomFit (args.ReducedResolution); } void HandlePixbufAreaUpdated (object sender, AreaUpdatedEventArgs args) { IImageLoader loader = sender as IImageLoader; if (loader != this.loader) return; if (!ShowProgress) return; Gdk.Rectangle area = this.ImageCoordsToWindow (args.Area); this.QueueDrawArea (area.X, area.Y, area.Width, area.Height); } void HandleDone (object sender, System.EventArgs args) { Log.DebugTimerPrint (timer, "Loading image took {0}"); IImageLoader loader = sender as IImageLoader; if (loader != this.loader) return; Pixbuf prev = this.Pixbuf; if (Pixbuf != loader.Pixbuf) Pixbuf = loader.Pixbuf; if (Pixbuf == null) { // FIXME: Do we have test cases for this ??? // FIXME in some cases the image passes completely through the // pixbuf loader without properly loading... I'm not sure what to do about this other // than try to load the image one last time. try { Log.Warning ("Falling back to file loader"); Pixbuf = PhotoLoader.Load (item.Collection, item.Index); } catch (Exception e) { LoadErrorImage (e); } } if (loader.Pixbuf != null) //FIXME: this test in case the photo was loaded with the direct loader PixbufOrientation = Accelerometer.GetViewOrientation (loader.PixbufOrientation); else PixbufOrientation = ImageOrientation.TopLeft; if (Pixbuf == null) LoadErrorImage (null); else ZoomFit (); progressive_display = true; if (prev != this.Pixbuf && prev != null) prev.Dispose (); } #endregion protected BrowsablePointer item; protected Loupe loupe; protected Loupe sharpener; void HandleOrientationChanged (object sender, EventArgs e) { Reload (); } bool progressive_display = true; bool ShowProgress { get { return progressive_display; } } void LoadErrorImage (System.Exception e) { // FIXME we should check the exception type and do something // like offer the user a chance to locate the moved file and // update the db entry, but for now just set the error pixbuf Pixbuf old = Pixbuf; Pixbuf = new Pixbuf (PixbufUtils.ErrorPixbuf, 0, 0, PixbufUtils.ErrorPixbuf.Width, PixbufUtils.ErrorPixbuf.Height); if (old != null) old.Dispose (); PixbufOrientation = ImageOrientation.TopLeft; ZoomFit (false); } void HandlePhotoItemChanged (object sender, BrowsablePointerChangedEventArgs args) { // If it is just the position that changed fall out if (args != null && args.PreviousItem != null && Item.IsValid && (args.PreviousIndex != item.Index) && (this.Item.Current.DefaultVersion.Uri == args.PreviousItem.DefaultVersion.Uri)) return; // Don't reload if the image didn't change at all. if (args != null && args.Changes != null && !args.Changes.DataChanged && args.PreviousItem != null && Item.IsValid && this.Item.Current.DefaultVersion.Uri == args.PreviousItem.DefaultVersion.Uri) return; // Same image, don't load it progressively if (args != null && args.PreviousItem != null && Item.IsValid && Item.Current.DefaultVersion.Uri == args.PreviousItem.DefaultVersion.Uri) progressive_display = false; try { if (Item.IsValid) Load (Item.Current.DefaultVersion.Uri); else LoadErrorImage (null); } catch (System.Exception e) { Log.DebugException (e); LoadErrorImage (e); } Selection = Gdk.Rectangle.Zero; EventHandler eh = PhotoChanged; if (eh != null) eh (this, EventArgs.Empty); } private void HandleLoupeDestroy (object sender, EventArgs args) { if (sender == loupe) loupe = null; if (sender == sharpener) sharpener = null; } public void ShowHideLoupe () { if (loupe == null) { loupe = new Loupe (this); loupe.Destroyed += HandleLoupeDestroy; loupe.Show (); } else { loupe.Destroy (); } } public void ShowSharpener () { if (sharpener == null) { sharpener = new Sharpener (this); sharpener.Destroyed += HandleLoupeDestroy; } sharpener.Show (); } void OnPreferencesChanged (object sender, NotifyEventArgs args) { LoadPreference (args.Key); } void LoadPreference (String key) { switch (key) { case Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE: Reload (); break; } } protected override void ApplyColorTransform (Pixbuf pixbuf) { Cms.Profile screen_profile; if (FSpot.ColorManagement.Profiles.TryGetValue (Preferences.Get (Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE), out screen_profile)) FSpot.ColorManagement.ApplyProfile (pixbuf, screen_profile); } bool crop_helpers = true; public bool CropHelpers { get { return crop_helpers; } set { if (crop_helpers == value) return; crop_helpers = value; QueueDraw (); } } protected override bool OnExposeEvent (EventExpose evnt) { if (!base.OnExposeEvent (evnt)) return false; if (!CanSelect || !CropHelpers || Selection == Rectangle.Zero) return true; using (Cairo.Context ctx = CairoHelper.Create (GdkWindow)) { ctx.SetSourceRGBA (.7, .7, .7, .8); ctx.SetDash (new double [] {10, 15}, 0); ctx.LineWidth = .8; for (int i=1; i<3; i++) { Point s = ImageCoordsToWindow (new Point (Selection.X + Selection.Width / 3 * i, Selection.Y)); Point e = ImageCoordsToWindow (new Point (Selection.X + Selection.Width / 3 * i, Selection.Y + Selection.Height)); ctx.MoveTo (s.X, s.Y); ctx.LineTo (e.X, e.Y); ctx.Stroke (); } for (int i=1; i<3; i++) { Point s = ImageCoordsToWindow (new Point (Selection.X, Selection.Y + Selection.Height / 3 * i)); Point e = ImageCoordsToWindow (new Point (Selection.X + Selection.Width, Selection.Y + Selection.Height / 3 * i)); ctx.MoveTo (s.X, s.Y); ctx.LineTo (e.X, e.Y); ctx.Stroke (); } } return true; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Widgets/SoftFocus.cs0000644000175000017500000000635611503404761023673 0ustar00rubenruben00000000000000/* * SoftFocus.cs * * Author * Larry Ewing * * See COPYING for details. */ using Cairo; using System; using System.Runtime.InteropServices; namespace FSpot.Widgets { public class SoftFocus : IDisposable { ImageInfo info; double radius; double amount; Gdk.Point center; ImageInfo blur; Pattern mask; public SoftFocus (ImageInfo info) { this.info = info; center.X = info.Bounds.Width / 2; center.Y = info.Bounds.Height / 2; Amount = 3; Radius = .5; } public Gdk.Point Center { get { return center; } set { center = value; } } public double Amount { get { return amount; } set { amount = value; if (blur != null) blur.Dispose (); blur = CreateBlur (info); } } public double Radius { get { return radius; } set { radius = value; if (blur == null) return; if (mask != null) mask.Destroy (); mask = CreateMask (); } } private ImageInfo CreateBlur (ImageInfo source) { double scale = Math.Max (256 / (double) source.Bounds.Width, 256 / (double) source.Bounds.Height); Gdk.Rectangle small = new Gdk.Rectangle (0, 0, (int) Math.Ceiling (source.Bounds.Width * scale), (int) Math.Ceiling (source.Bounds.Height * scale)); MemorySurface image = new MemorySurface (Format.Argb32, small.Width, small.Height); Context ctx = new Context (image); //Pattern solid = new SolidPattern (0, 0, 0, 0); //ctx.Source = solid; //ctx.Paint (); //solid.Destroy (); ctx.Matrix = source.Fit (small); ctx.Operator = Operator.Source; Pattern p = new SurfacePattern (source.Surface); ctx.Source = p; //Log.Debug (small); ctx.Paint (); p.Destroy (); ((IDisposable)ctx).Dispose (); Gdk.Pixbuf normal = MemorySurface.CreatePixbuf (image); Gdk.Pixbuf blur = PixbufUtils.Blur (normal, 3); ImageInfo overlay = new ImageInfo (blur); blur.Dispose (); normal.Dispose (); image.Destroy (); return overlay; } private Pattern CreateMask () { double max = Math.Max (blur.Bounds.Width, blur.Bounds.Height) * .25; double scale = blur.Bounds.Width / (double) info.Bounds.Width; RadialGradient circle; circle = new RadialGradient (center.X * scale, center.Y * scale, radius * max * .7, center.X * scale, center.Y * scale, radius * max + max * .2); circle.AddColorStop (0, new Cairo.Color (0.0, 0.0, 0.0, 0.0)); circle.AddColorStop (1.0, new Cairo.Color (1.0, 1.0, 1.0, 1.0)); return circle; } public void Apply (Context ctx, Gdk.Rectangle allocation) { SurfacePattern p = new SurfacePattern (info.Surface); ctx.Matrix = new Matrix (); Matrix m = info.Fit (allocation); ctx.Operator = Operator.Over; ctx.Matrix = m; ctx.Source = p; ctx.Paint (); SurfacePattern overlay = new SurfacePattern (blur.Surface); ctx.Matrix = new Matrix (); ctx.Matrix = blur.Fit (allocation); ctx.Operator = Operator.Over; ctx.Source = overlay; // FIXME ouch this is ugly. if (mask == null) Radius = Radius; //ctx.Paint (); ctx.Mask (mask); overlay.Destroy (); p.Destroy (); } public void Dispose () { if (mask != null) mask.Destroy (); if (blur != null) blur.Dispose (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Database/0000777000175000017500000000000011503407445021523 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot.Database/DbException.cs0000644000175000017500000000026411503404760024251 0ustar00rubenruben00000000000000using System; namespace FSpot.Database { public class DbException : ApplicationException { public DbException (string msg) : base(msg) { } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Database/Db.cs0000644000175000017500000001016111503404760022367 0ustar00rubenruben00000000000000using System.IO; using System; using Hyena; // A Store maps to a SQL table. We have separate stores (i.e. SQL tables) for tags, photos and imports. namespace FSpot.Database { // The Database puts the stores together. public class Db : IDisposable { TagStore tag_store; PhotoStore photo_store; RollStore roll_store; ExportStore export_store; JobStore job_store; MetaStore meta_store; bool empty; string path; public TagStore Tags { get { return tag_store; } } public RollStore Rolls { get { return roll_store; } } public ExportStore Exports { get { return export_store; } } public JobStore Jobs { get { return job_store; } } public PhotoStore Photos { get { return photo_store; } } public MetaStore Meta { get { return meta_store; } } // This affects how often the database writes data back to disk, and // therefore how likely corruption is in the event of power loss. public bool Sync { set { string query = "PRAGMA synchronous = " + (value ? "ON" : "OFF"); Database.Execute (query); } } FSpotDatabaseConnection database; public FSpotDatabaseConnection Database { get { return database; } } public string Repair () { string backup_path = path; int i = 0; while (File.Exists (backup_path)) { backup_path = String.Format ("{0}-{1}-{2}{3}", Path.GetFileNameWithoutExtension (path), System.DateTime.Now.ToString ("yyyyMMdd"), i++, Path.GetExtension (path)); } File.Move (path, backup_path); Init (path, true); return backup_path; } public void Init (string path, bool create_if_missing) { uint timer = Log.DebugTimerStart (); bool new_db = !File.Exists (path); this.path = path; if (new_db && !create_if_missing) throw new Exception (path + ": File not found"); database = new FSpotDatabaseConnection (path); // Load or create the meta table meta_store = new MetaStore (Database, new_db); // Update the database schema if necessary FSpot.Database.Updater.Run (Database); Database.BeginTransaction (); tag_store = new TagStore (Database, new_db); roll_store = new RollStore (Database, new_db); export_store = new ExportStore (Database, new_db); job_store = new JobStore (Database, new_db); photo_store = new PhotoStore (Database, new_db); Database.CommitTransaction (); empty = new_db; Log.DebugTimerPrint (timer, "Db Initialization took {0}"); } public bool Empty { get { return empty; } } public void Dispose () { Dispose (true); GC.SuppressFinalize (this); } bool already_disposed = false; protected virtual void Dispose (bool is_disposing) { if (already_disposed) return; if (is_disposing) { //Free managed resources Database.Dispose (); } //Free unmanaged resources already_disposed = true; } ~Db () { Log.DebugFormat ("Finalizer called on {0}. Should be Disposed", GetType ()); Dispose (false); } public void BeginTransaction () { Database.BeginTransaction (); } public void CommitTransaction () { Database.CommitTransaction (); } public void RollbackTransaction () { Database.RollbackTransaction (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Database/Updater.cs0000644000175000017500000007674211503404760023467 0ustar00rubenruben00000000000000using Mono.Unix; using Gtk; using System; using System.Collections; using FSpot.Utils; using FSpot.UI.Dialog; using Hyena; using Hyena.Data.Sqlite; namespace FSpot.Database { public static class Updater { private static ProgressDialog dialog; private static Hashtable updates = new Hashtable (); private static Version db_version; private static FSpotDatabaseConnection db; public static bool silent = false; public static Version LatestVersion { get { if (updates == null || updates.Count == 0) return new Version (0, 0); ArrayList keys = new ArrayList (updates.Keys); keys.Sort (); return keys[keys.Count - 1] as Version; } } static Updater () { // Update from version 0 to 1: Remove empty Other tags AddUpdate (new Version ("1"), delegate () { string other_id = SelectSingleString ("SELECT id FROM tags WHERE name = 'Other'"); if (other_id == null) return; // Don't do anything if there are subtags string tag_count = SelectSingleString ( String.Format ("SELECT COUNT(*) FROM tags WHERE category_id = {0}", other_id)); if (tag_count == null || System.Int32.Parse (tag_count) != 0) return; // Don't do anything if there are photos tagged with this string photo_count = SelectSingleString ( String.Format ("SELECT COUNT(*) FROM photo_tags WHERE tag_id = {0}", other_id)); if (photo_count == null || System.Int32.Parse (photo_count) != 0) return; // Finally, we know that the Other tag exists and has no children, so remove it Execute ("DELETE FROM tags WHERE name = 'Other'"); }); // Update from version 1 to 2: Restore Other tags that were removed leaving dangling child tags AddUpdate (new Version ("2"), delegate () { string tag_count = SelectSingleString ("SELECT COUNT(*) FROM tags WHERE category_id != 0 AND category_id NOT IN (SELECT id FROM tags)"); // If there are no dangling tags, then don't do anything if (tag_count == null || System.Int32.Parse (tag_count) == 0) return; int id = ExecuteScalar ("INSERT INTO tags (name, category_id, is_category, icon) VALUES ('Other', 0, 1, 'stock_icon:f-spot-other.png')"); Execute (String.Format ( "UPDATE tags SET category_id = {0} WHERE id IN " + "(SELECT id FROM tags WHERE category_id != 0 AND category_id " + "NOT IN (SELECT id FROM tags))", id)); Log.Debug ("Other tag restored. Sorry about that!"); }); // Update from version 2 to 3: ensure that Hidden is the only tag left which is a real tag (not category) AddUpdate (new Version ("3"), delegate () { Execute ("UPDATE tags SET is_category = 1 WHERE name != 'Hidden'"); }); //Version 3.1, clean old (and unused) items in Export AddUpdate (new Version (3, 1), delegate () { if (TableExists ("exports")) ExecuteScalar ("DELETE FROM exports WHERE export_type='fspot:Folder'"); }); //Version 4.0, bump the version number to a integer, for backward compatibility AddUpdate (new Version (4, 0), delegate () {}); //Version 5.0, add a roll_id field to photos, rename table 'imports' to 'rolls' //and fix bgo 324425. AddUpdate (new Version (5, 0), delegate () { Log.Debug ("Will add a roll_id field to photos!"); string tmp_photos = MoveTableToTemp ("photos"); Execute ( "CREATE TABLE photos ( " + " id INTEGER PRIMARY KEY NOT NULL, " + " time INTEGER NOT NULL, " + " directory_path STRING NOT NULL, " + " name STRING NOT NULL, " + " description TEXT NOT NULL, " + " roll_id INTEGER NOT NULL, " + " default_version_id INTEGER NOT NULL " + ")"); ExecuteScalar (String.Format("INSERT INTO photos SELECT id, time, directory_path, name, description, 0, default_version_id FROM {0}", tmp_photos)); Log.Debug ("Will rename imports to rolls!"); string tmp_rolls = MoveTableToTemp ("imports"); Execute ( "CREATE TABLE rolls ( " + " id INTEGER PRIMARY KEY NOT NULL, " + " time INTEGER NOT NULL " + ")"); ExecuteScalar (String.Format("INSERT INTO rolls SELECT id, time FROM {0}", tmp_rolls)); Log.Debug ("Cleaning weird descriptions, fixes bug #324425."); Execute ("UPDATE photos SET description = \"\" WHERE description LIKE \"Invalid size of entry%\""); }); //Version 6.0, change tag icon f-spot-tag-other to emblem-generic AddUpdate (new Version (6,0), delegate () { ExecuteScalar ("UPDATE tags SET icon = \"stock_icon:emblem-generic\" " + " WHERE icon LIKE \"stock_icon:f-spot-other.png\""); }); //Update to version 7.0, keep photo uri instead of path AddUpdate (new Version (7,0), delegate () { string tmp_photos = MoveTableToTemp ("photos"); Execute ( "CREATE TABLE photos (" + " id INTEGER PRIMARY KEY NOT NULL," + " time INTEGER NOT NULL," + " uri STRING NOT NULL," + " description TEXT NOT NULL," + " roll_id INTEGER NOT NULL," + " default_version_id INTEGER NOT NULL" + ")"); Execute (String.Format ( "INSERT INTO photos (id, time, uri, description, roll_id, default_version_id) " + "SELECT id, time, 'file://' || directory_path || '/' || name, " + "description, roll_id, default_version_id FROM {0}", tmp_photos)); }, true); // Update to version 8.0, store full version uri AddUpdate (new Version (8,0),delegate () { string tmp_versions = MoveTableToTemp ("photo_versions"); Execute ( "CREATE TABLE photo_versions ( " + " photo_id INTEGER, " + " version_id INTEGER, " + " name STRING, " + " uri STRING NOT NULL " + ")"); IDataReader reader = ExecuteReader (String.Format ( "SELECT photo_id, version_id, name, uri " + "FROM {0}, photos " + "WHERE photo_id = id ", tmp_versions)); while (reader.Read ()) { System.Uri photo_uri = new System.Uri (reader [3] as string); string name_without_extension = System.IO.Path.GetFileNameWithoutExtension (photo_uri.AbsolutePath); string extension = System.IO.Path.GetExtension (photo_uri.AbsolutePath); string uri = photo_uri.Scheme + "://" + photo_uri.Host + System.IO.Path.GetDirectoryName (photo_uri.AbsolutePath) + "/" + name_without_extension + " (" + (reader [2]).ToString () + ")" + extension; Execute (new HyenaSqliteCommand ( "INSERT INTO photo_versions (photo_id, version_id, name, uri) " + "VALUES (?, ?, ?, ?)", Convert.ToUInt32 (reader [0]), Convert.ToUInt32 (reader [1]), (reader [2]).ToString (), uri)); } }, true); // Update to version 9.0 AddUpdate (new Version (9,0),delegate () { string tmp_versions = MoveTableToTemp ("photo_versions"); Execute ( "CREATE TABLE photo_versions ( " + " photo_id INTEGER, " + " version_id INTEGER, " + " name STRING, " + " uri STRING NOT NULL," + " protected BOOLEAN " + ")"); Execute (String.Format ( "INSERT INTO photo_versions (photo_id, version_id, name, uri, protected) " + "SELECT photo_id, version_id, name, uri, 0 " + "FROM {0} ", tmp_versions)); }); // Update to version 10.0, make id autoincrement AddUpdate (new Version (10,0),delegate () { string tmp_photos = MoveTableToTemp ("photos"); Execute ( "CREATE TABLE photos ( " + " id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + " time INTEGER NOT NULL, " + " uri STRING NOT NULL, " + " description TEXT NOT NULL, " + " roll_id INTEGER NOT NULL, " + " default_version_id INTEGER NOT NULL " + ")"); Execute (String.Format ( "INSERT INTO photos (id, time, uri, description, roll_id, default_version_id) " + "SELECT id, time, uri, description, roll_id, default_version_id " + "FROM {0} ", tmp_photos)); }, false); // Update to version 11.0, rating AddUpdate (new Version (11,0),delegate () { string tmp_photos = MoveTableToTemp ("photos"); Execute ( "CREATE TABLE photos ( " + " id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + " time INTEGER NOT NULL, " + " uri STRING NOT NULL, " + " description TEXT NOT NULL, " + " roll_id INTEGER NOT NULL, " + " default_version_id INTEGER NOT NULL, " + " rating INTEGER NULL " + ")"); Execute (String.Format ( "INSERT INTO photos (id, time, uri, description, roll_id, default_version_id, rating) " + "SELECT id, time, uri, description, roll_id, default_version_id, null " + "FROM {0} ", tmp_photos)); }); //Update to version 12.0, remove dead associations, bgo #507950, #488545 AddUpdate (new Version (12, 0), delegate () { Execute ("DELETE FROM photo_tags WHERE tag_id NOT IN (SELECT id FROM tags)"); }); // Update to version 13.0 AddUpdate (new Version (13,0), delegate () { Execute ("UPDATE photos SET rating = 0 WHERE rating IS NULL"); }); // Update to version 14.0 AddUpdate (new Version (14,0), delegate () { Execute ("UPDATE photos SET rating = 0 WHERE rating IS NULL"); }); // Update to version 15.0 AddUpdate (new Version (15,0), delegate () { string tmp_photo_tags = MoveTableToTemp ("photo_tags"); Execute ( "CREATE TABLE photo_tags ( " + " photo_id INTEGER, " + " tag_id INTEGER, " + " UNIQUE (photo_id, tag_id) " + ")"); Execute (String.Format ( "INSERT OR IGNORE INTO photo_tags (photo_id, tag_id) " + "SELECT photo_id, tag_id FROM {0}", tmp_photo_tags)); string tmp_photo_versions = MoveTableToTemp ("photo_versions"); Execute ( "CREATE TABLE photo_versions ( "+ " photo_id INTEGER, " + " version_id INTEGER, " + " name STRING, " + " uri STRING NOT NULL," + " protected BOOLEAN, " + " UNIQUE (photo_id, version_id) " + ")"); Execute (String.Format ( "INSERT OR IGNORE INTO photo_versions " + "(photo_id, version_id, name, uri, protected) " + "SELECT photo_id, version_id, name, uri, protected FROM {0}", tmp_photo_versions)); }); // Update to version 16.0 AddUpdate (new Version (16,0), delegate () { string temp_table = MoveTableToTemp ("photos"); Execute ("CREATE TABLE photos ( " + " id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + " time INTEGER NOT NULL, " + " uri STRING NOT NULL, " + " description TEXT NOT NULL, " + " roll_id INTEGER NOT NULL, " + " default_version_id INTEGER NOT NULL, " + " rating INTEGER NULL, " + " md5_sum TEXT NULL " + ")" ); Execute (string.Format ("INSERT INTO photos (id, time, uri, description, roll_id, " + "default_version_id, rating, md5_sum) " + "SELECT id, time, uri, description, roll_id, " + " default_version_id, rating, '' " + "FROM {0} ", temp_table ) ); string temp_versions_table = MoveTableToTemp ("photo_versions"); Execute ("CREATE TABLE photo_versions ( " + " photo_id INTEGER, " + " version_id INTEGER, " + " name STRING, " + " uri STRING NOT NULL," + " md5_sum STRING NOT NULL," + " protected BOOLEAN " + ")"); Execute (String.Format ("INSERT INTO photo_versions (photo_id, version_id, name, uri, md5_sum, protected) " + "SELECT photo_id, version_id, name, uri, '', protected " + "FROM {0} ", temp_versions_table ) ); JobStore.CreateTable (db); // This is kind of hacky but should be a lot faster on // large photo databases Execute (string.Format ("INSERT INTO jobs (job_type, job_options, run_at, job_priority) " + "SELECT '{0}', id, {1}, {2} " + "FROM photos ", typeof(Jobs.CalculateHashJob).ToString (), DateTimeUtil.FromDateTime (DateTime.Now), 0 ) ); }, true); // Update to version 16.1 AddUpdate (new Version (16,1), delegate () { Execute ("CREATE INDEX idx_photo_versions_id ON photo_versions(photo_id)"); }, false); // Update to version 16.2 AddUpdate (new Version (16,2), delegate () { Execute ("CREATE INDEX idx_photos_roll_id ON photos(roll_id)"); }, false); // Update to version 16.3 AddUpdate (new Version (16,3), delegate () { Execute (String.Format ("DELETE FROM jobs WHERE job_type = '{0}'", typeof(Jobs.CalculateHashJob).ToString ())); }, false); // Update to version 16.4 AddUpdate (new Version (16,4), delegate () { //fix the tables schema EOL string temp_table = MoveTableToTemp ("exports"); Execute ( "CREATE TABLE exports (\n" + " id INTEGER PRIMARY KEY NOT NULL, \n" + " image_id INTEGER NOT NULL, \n" + " image_version_id INTEGER NOT NULL, \n" + " export_type TEXT NOT NULL, \n" + " export_token TEXT NOT NULL\n" + ")"); Execute (String.Format ( "INSERT INTO exports (id, image_id, image_version_id, export_type, export_token) " + "SELECT id, image_id, image_version_id, export_type, export_token " + "FROM {0}", temp_table)); temp_table = MoveTableToTemp ("jobs"); Execute ( "CREATE TABLE jobs (\n" + " id INTEGER PRIMARY KEY NOT NULL, \n" + " job_type TEXT NOT NULL, \n" + " job_options TEXT NOT NULL, \n" + " run_at INTEGER, \n" + " job_priority INTEGER NOT NULL\n" + ")"); Execute (String.Format ( "INSERT INTO jobs (id, job_type, job_options, run_at, job_priority) " + "SELECT id, job_type, job_options, run_at, job_priority " + "FROM {0}", temp_table)); temp_table = MoveTableToTemp ("meta"); Execute ( "CREATE TABLE meta (\n" + " id INTEGER PRIMARY KEY NOT NULL, \n" + " name TEXT UNIQUE NOT NULL, \n" + " data TEXT\n" + ")"); Execute (String.Format ( "INSERT INTO meta (id, name, data) " + "SELECT id, name, data " + "FROM {0}", temp_table)); temp_table = MoveTableToTemp ("photos"); Execute ( "CREATE TABLE photos (\n" + " id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \n" + " time INTEGER NOT NULL, \n" + " uri STRING NOT NULL, \n" + " description TEXT NOT NULL, \n" + " roll_id INTEGER NOT NULL, \n" + " default_version_id INTEGER NOT NULL, \n" + " rating INTEGER NULL, \n" + " md5_sum TEXT NULL\n" + ")"); Execute (String.Format ( "INSERT INTO photos (id, time, uri, description, roll_id, default_version_id, rating, md5_sum) " + "SELECT id, time, uri, description, roll_id, default_version_id, rating, md5_sum " + "FROM {0}", temp_table)); temp_table = MoveTableToTemp ("photo_tags"); Execute( "CREATE TABLE photo_tags (\n" + " photo_id INTEGER, \n" + " tag_id INTEGER, \n" + " UNIQUE (photo_id, tag_id)\n" + ")"); Execute (String.Format ( "INSERT OR IGNORE INTO photo_tags (photo_id, tag_id) " + "SELECT photo_id, tag_id " + "FROM {0}", temp_table)); temp_table = MoveTableToTemp ("photo_versions"); Execute ( "CREATE TABLE photo_versions (\n"+ " photo_id INTEGER, \n" + " version_id INTEGER, \n" + " name STRING, \n" + " uri STRING NOT NULL, \n" + " md5_sum STRING NOT NULL, \n" + " protected BOOLEAN, \n" + " UNIQUE (photo_id, version_id)\n" + ")"); Execute (String.Format ( "INSERT OR IGNORE INTO photo_versions (photo_id, version_id, name, uri, md5_sum, protected) " + "SELECT photo_id, version_id, name, uri, md5_sum, protected " + "FROM {0}", temp_table)); Execute ("CREATE INDEX idx_photo_versions_id ON photo_versions(photo_id)"); Execute ("CREATE INDEX idx_photos_roll_id ON photos(roll_id)"); temp_table = MoveTableToTemp ("rolls"); Execute ( "CREATE TABLE rolls (\n" + " id INTEGER PRIMARY KEY NOT NULL, \n" + " time INTEGER NOT NULL\n" + ")"); Execute (String.Format ( "INSERT INTO rolls (id, time) " + "SELECT id, time " + "FROM {0}", temp_table)); temp_table = MoveTableToTemp ("tags"); Execute ( "CREATE TABLE tags (\n" + " id INTEGER PRIMARY KEY NOT NULL, \n" + " name TEXT UNIQUE, \n" + " category_id INTEGER, \n" + " is_category BOOLEAN, \n" + " sort_priority INTEGER, \n" + " icon TEXT\n" + ")"); Execute (String.Format ( "INSERT INTO tags (id, name, category_id, is_category, sort_priority, icon) " + "SELECT id, name, category_id, is_category, sort_priority, icon " + "FROM {0}", temp_table)); }); // Update to version 16.5 AddUpdate (new Version (16,5), delegate () { //fix md5 null in photos and photo_versions table string temp_table = MoveTableToTemp ("photo_versions"); Execute ( "CREATE TABLE photo_versions (\n"+ " photo_id INTEGER, \n" + " version_id INTEGER, \n" + " name STRING, \n" + " uri STRING NOT NULL, \n" + " md5_sum TEXT NULL, \n" + " protected BOOLEAN, \n" + " UNIQUE (photo_id, version_id)\n" + ")"); Execute (String.Format ( "INSERT OR IGNORE INTO photo_versions (photo_id, version_id, name, uri, md5_sum, protected) " + "SELECT photo_id, version_id, name, uri, md5_sum, protected " + "FROM {0}", temp_table)); Execute ("CREATE INDEX idx_photo_versions_id ON photo_versions(photo_id)"); Execute ("UPDATE photos SET md5_sum = NULL WHERE md5_sum = ''"); Execute ("UPDATE photo_versions SET md5_sum = NULL WHERE md5_sum = ''"); }); // Update to version 17.0, split uri and filename AddUpdate (new Version (17,0),delegate () { string tmp_photos = MoveTableToTemp ("photos"); string tmp_versions = MoveTableToTemp ("photo_versions"); Execute ( "CREATE TABLE photos (\n" + " id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \n" + " time INTEGER NOT NULL, \n" + " base_uri STRING NOT NULL, \n" + " filename STRING NOT NULL, \n" + " description TEXT NOT NULL, \n" + " roll_id INTEGER NOT NULL, \n" + " default_version_id INTEGER NOT NULL, \n" + " rating INTEGER NULL, \n" + " md5_sum TEXT NULL\n" + ")"); Execute ( "CREATE TABLE photo_versions (\n"+ " photo_id INTEGER, \n" + " version_id INTEGER, \n" + " name STRING, \n" + " base_uri STRING NOT NULL, \n" + " filename STRING NOT NULL, \n" + " md5_sum TEXT NULL, \n" + " protected BOOLEAN, \n" + " UNIQUE (photo_id, version_id)\n" + ")"); IDataReader reader = ExecuteReader (String.Format ( "SELECT id, time, uri, description, roll_id, default_version_id, rating, md5_sum " + "FROM {0} ", tmp_photos)); while (reader.Read ()) { System.Uri photo_uri = new System.Uri (reader ["uri"] as string); string filename = photo_uri.GetFilename (); Uri base_uri = photo_uri.GetDirectoryUri (); string md5 = reader["md5_sum"] != null ? reader ["md5_sum"].ToString () : null; Execute (new HyenaSqliteCommand ( "INSERT INTO photos (id, time, base_uri, filename, description, roll_id, default_version_id, rating, md5_sum) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", Convert.ToUInt32 (reader ["id"]), reader ["time"], base_uri.ToString (), filename, reader["description"].ToString (), Convert.ToUInt32 (reader ["roll_id"]), Convert.ToUInt32 (reader ["default_version_id"]), Convert.ToUInt32 (reader ["rating"]), String.IsNullOrEmpty (md5) ? null : md5)); } reader.Dispose(); reader = ExecuteReader (String.Format ( "SELECT photo_id, version_id, name, uri, md5_sum, protected " + "FROM {0} ", tmp_versions)); while (reader.Read ()) { System.Uri photo_uri = new System.Uri (reader ["uri"] as string); string filename = photo_uri.GetFilename (); Uri base_uri = photo_uri.GetDirectoryUri (); string md5 = reader["md5_sum"] != null ? reader ["md5_sum"].ToString () : null; Execute (new HyenaSqliteCommand ( "INSERT INTO photo_versions (photo_id, version_id, name, base_uri, filename, protected, md5_sum) " + "VALUES (?, ?, ?, ?, ?, ?, ?)", Convert.ToUInt32 (reader ["photo_id"]), Convert.ToUInt32 (reader ["version_id"]), reader["name"].ToString (), base_uri.ToString (), filename, Convert.ToBoolean (reader["protected"]), String.IsNullOrEmpty (md5) ? null : md5)); } Execute ("CREATE INDEX idx_photos_roll_id ON photos(roll_id)"); Execute ("CREATE INDEX idx_photo_versions_id ON photo_versions(photo_id)"); }, true); // Update to version 17.1, Rename 'Import Tags' to 'Imported Tags' AddUpdate (new Version (17,1),delegate () { Execute ("UPDATE tags SET name = 'Imported Tags' WHERE name = 'Import Tags'"); }); // Update to version 17.2, Make sure every photo has an Original version in photo_versions AddUpdate (new Version(17,2),delegate () { // Find photos that have no original version; var have_original_query = "SELECT id FROM photos LEFT JOIN photo_versions AS pv ON pv.photo_id = id WHERE pv.version_id = 1"; var no_original_query = String.Format ("SELECT id, base_uri, filename FROM photos WHERE id NOT IN ({0})", have_original_query); var reader = ExecuteReader (no_original_query); while (reader.Read ()) { Execute (new HyenaSqliteCommand ( "INSERT INTO photo_versions (photo_id, version_id, name, base_uri, filename, protected, md5_sum) " + "VALUES (?, ?, ?, ?, ?, ?, ?)", Convert.ToUInt32 (reader ["id"]), 1, "Original", reader["base_uri"].ToString (), reader["filename"].ToString (), 1, "")); } }, true); // Update to version 18.0, Import MD5 hashes AddUpdate (new Version(18,0),delegate () { string tmp_photos = MoveTableToTemp ("photos"); string tmp_versions = MoveTableToTemp ("photo_versions"); Execute ( "CREATE TABLE photos (\n" + " id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \n" + " time INTEGER NOT NULL, \n" + " base_uri STRING NOT NULL, \n" + " filename STRING NOT NULL, \n" + " description TEXT NOT NULL, \n" + " roll_id INTEGER NOT NULL, \n" + " default_version_id INTEGER NOT NULL, \n" + " rating INTEGER NULL \n" + ")"); Execute ( "CREATE TABLE photo_versions (\n"+ " photo_id INTEGER, \n" + " version_id INTEGER, \n" + " name STRING, \n" + " base_uri STRING NOT NULL, \n" + " filename STRING NOT NULL, \n" + " import_md5 TEXT NULL, \n" + " protected BOOLEAN, \n" + " UNIQUE (photo_id, version_id)\n" + ")"); var reader = ExecuteReader (String.Format ( "SELECT id, time, base_uri, filename, description, roll_id, default_version_id, rating " + "FROM {0} ", tmp_photos)); while (reader.Read ()) { Execute (new HyenaSqliteCommand ( "INSERT INTO photos (id, time, base_uri, filename, description, roll_id, default_version_id, rating) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)", Convert.ToUInt32 (reader ["id"]), reader ["time"], reader ["base_uri"].ToString (), reader ["filename"].ToString (), reader["description"].ToString (), Convert.ToUInt32 (reader ["roll_id"]), Convert.ToUInt32 (reader ["default_version_id"]), Convert.ToUInt32 (reader ["rating"]))); } reader.Dispose(); reader = ExecuteReader (String.Format ( "SELECT photo_id, version_id, name, base_uri, filename, protected " + "FROM {0} ", tmp_versions)); while (reader.Read ()) { Execute (new HyenaSqliteCommand ( "INSERT INTO photo_versions (photo_id, version_id, name, base_uri, filename, protected, import_md5) " + "VALUES (?, ?, ?, ?, ?, ?, ?)", Convert.ToUInt32 (reader ["photo_id"]), Convert.ToUInt32 (reader ["version_id"]), reader["name"].ToString (), reader["base_uri"].ToString (), reader["filename"].ToString (), Convert.ToBoolean (reader["protected"]), "")); } Execute ("CREATE INDEX idx_photo_versions_import_md5 ON photo_versions(import_md5)"); }, true); } private const string meta_db_version_string = "F-Spot Database Version"; private static Version GetDatabaseVersion () { if (!TableExists ("meta")) throw new Exception ("No meta table found!"); var query = String.Format ("SELECT data FROM meta WHERE name = '{0}'", meta_db_version_string); var version_id = SelectSingleString (query); return new Version (version_id); } public static void Run (FSpotDatabaseConnection database) { db = database; db_version = GetDatabaseVersion (); if (updates.Count == 0) return; if (db_version == LatestVersion) return; else if (db_version > LatestVersion) { if (!silent) Log.Information ("The existing database version is more recent than this version of F-Spot expects."); return; } uint timer = 0; if (!silent) timer = Log.InformationTimerStart ("Updating F-Spot Database"); // Only create and show the dialog if one or more of the updates to be done is // marked as being slow bool slow = false; foreach (Version version in updates.Keys) { if (version > db_version && (updates[version] as Update).IsSlow) slow = true; break; } if (slow && !silent) { dialog = new ProgressDialog (Catalog.GetString ("Updating F-Spot Database"), ProgressDialog.CancelButtonType.None, 0, null); dialog.Message.Text = Catalog.GetString ("Please wait while your F-Spot gallery's database is updated. This may take some time."); dialog.Bar.Fraction = 0.0; dialog.Modal = false; dialog.SkipTaskbarHint = true; dialog.WindowPosition = WindowPosition.Center; dialog.ShowAll (); dialog.Present (); dialog.QueueDraw (); } db.BeginTransaction (); try { ArrayList keys = new ArrayList (updates.Keys); keys.Sort (); foreach (Version version in keys) { if (version <= db_version) continue; Pulse (); (updates[version] as Update).Execute (db, db_version); } db.CommitTransaction (); } catch (Exception e) { if (!silent) { Log.DebugException (e); Log.Warning ("Rolling back database changes because of Exception"); } // There was an error, roll back the database db.RollbackTransaction (); // Pass the exception on, this is fatal throw e; } if (dialog != null) dialog.Destroy (); if (db_version == LatestVersion && !silent) Log.InformationTimerPrint (timer, "Database updates completed successfully (in {0})."); } private static void AddUpdate (Version version, UpdateCode code) { AddUpdate (version, code, false); } private static void AddUpdate (Version version, UpdateCode code, bool is_slow) { updates[version] = new Update (version, code, is_slow); } public static void Pulse () { if (dialog != null) { dialog.Bar.Pulse (); dialog.ShowAll (); } } private static int Execute (string statement) { return db.Execute (statement); } private static int Execute (HyenaSqliteCommand command) { return db.Execute (command); } private static int ExecuteScalar (string statement) { return db.Execute(statement); } private static IDataReader ExecuteReader (string statement) { return db.Query (statement); } private static bool TableExists (string table) { return db.TableExists (table); } private static string SelectSingleString (string statement) { string result = null; try { result = db.Query (statement); } catch (Exception) {} return result; } private static string MoveTableToTemp (string table_name) { string temp_name = table_name + "_temp"; // Get the table definition for the table we are copying string sql = SelectSingleString (String.Format ("SELECT sql FROM sqlite_master WHERE tbl_name = '{0}' AND type = 'table' ORDER BY type DESC", table_name)); // Drop temp table if already exists Execute ("DROP TABLE IF EXISTS " + temp_name); // Change the SQL to create the temp table Execute (sql.Replace ("CREATE TABLE " + table_name, "CREATE TEMPORARY TABLE " + temp_name)); // Copy the data ExecuteScalar (String.Format ("INSERT INTO {0} SELECT * FROM {1}", temp_name, table_name)); // Delete the original table Execute ("DROP TABLE " + table_name); return temp_name; } private delegate void UpdateCode (); private class Update { public Version Version; private UpdateCode code; public bool IsSlow = false; public Update (Version to_version, UpdateCode code, bool slow) { this.Version = to_version; this.code = code; IsSlow = slow; } public Update (Version to_version, UpdateCode code) { this.Version = to_version; this.code = code; } public void Execute (HyenaSqliteConnection db, Version db_version) { code (); if (!silent) Log.DebugFormat ("Updated database from version {0} to {1}", db_version.ToString (), Version.ToString ()); db_version = Version; db.Execute(new HyenaSqliteCommand("UPDATE meta SET data = ? WHERE name = ?", db_version.ToString (), meta_db_version_string)); } } public class Version : IComparable { int maj = 0; int min = 0; public Version (int maj, int min) { this.maj = maj; this.min = min; } public Version (string version) { string [] parts = version.Split (new char [] {'.'}, 2); try { this.maj = Convert.ToInt32 (parts [0]); } catch (Exception) { this.maj = 0; } try { this.min = Convert.ToInt32 (parts [1]); } catch (Exception) { this.min = 0; } } //IComparable public int CompareTo (object obj) { if (this.GetType () == obj.GetType ()) return Compare (this, (Version)obj); else throw new Exception ("Object must be of type Version"); } public int CompareTo (Version version) { return Compare (this, version); } public static int Compare (Version v1, Version v2) { if (v1.maj == v2.maj) return v1.min.CompareTo (v2.min); return v1.maj.CompareTo (v2.maj); } public override string ToString () { if (min == 0) return maj.ToString (); return maj + "." + min; } public override bool Equals (object obj) { return obj is Version && this == (Version)obj; } public override int GetHashCode () { return maj ^ min; } public static bool operator == (Version v1, Version v2) { return v1.maj == v2.maj && v1.min == v2.min; } public static bool operator != (Version v1, Version v2) { return !(v1 == v2); } public static bool operator < (Version v1, Version v2) { return Compare (v1,v2) < 0; } public static bool operator > (Version v1, Version v2) { return Compare (v1,v2) > 0; } public static bool operator <= (Version v1, Version v2) { return !(v1 > v2); } public static bool operator >= (Version v1, Version v2) { return !(v1 < v2); } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Database/FSpotDatabaseConnection.cs0000644000175000017500000000127411503404760026547 0ustar00rubenruben00000000000000// // FSpotDatabaseConnection.cs // // Author: // Mike Gemuende // Ruben Vermeersch // // Copyright (c) 2010 Mike Gemuende // Copyright (c) 2010 Ruben Vermeersch // // This is free software. See COPYING for details. // using System; using Hyena.Data.Sqlite; namespace FSpot.Database { public class FSpotDatabaseConnection : HyenaSqliteConnection { public FSpotDatabaseConnection (string dbpath) : base(dbpath) { //Execute ("PRAGMA synchronous = OFF"); //Execute ("PRAGMA temp_store = MEMORY"); //Execute ("PRAGMA count_changes = OFF"); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Database/DbStore.cs0000644000175000017500000000631111503404760023406 0ustar00rubenruben00000000000000using System; using System.Collections.Generic; using Hyena; using FSpot.Core; namespace FSpot.Database { public abstract class DbStore where T : DbItem { // DbItem cache. public event EventHandler> ItemsAdded; public event EventHandler> ItemsRemoved; public event EventHandler> ItemsChanged; protected Dictionary item_cache; bool cache_is_immortal; protected void AddToCache (T item) { if (item_cache.ContainsKey (item.Id)) item_cache.Remove (item.Id); if (cache_is_immortal) item_cache.Add (item.Id, item); else item_cache.Add (item.Id, new WeakReference (item)); } protected T LookupInCache (uint id) { if (!item_cache.ContainsKey (id)) return null; if (cache_is_immortal) return item_cache[id] as T; WeakReference weakref = item_cache[id] as WeakReference; return (T)weakref.Target; } protected void RemoveFromCache (T item) { item_cache.Remove (item.Id); } protected void EmitAdded (T item) { EmitAdded (new T[] { item }); } protected void EmitAdded (T[] items) { EmitEvent (ItemsAdded, new DbItemEventArgs (items)); } protected void EmitChanged (T item) { EmitChanged (new T[] { item }); } protected void EmitChanged (T[] items) { EmitChanged (items, new DbItemEventArgs (items)); } protected void EmitChanged (T[] items, DbItemEventArgs args) { EmitEvent (ItemsChanged, args); } protected void EmitRemoved (T item) { EmitRemoved (new T[] { item }); } protected void EmitRemoved (T[] items) { EmitEvent (ItemsRemoved, new DbItemEventArgs (items)); } private void EmitEvent (EventHandler> evnt, DbItemEventArgs args) { if (evnt == null) // No subscribers. return; ThreadAssist.ProxyToMain (() => { evnt (this, args); }); } public bool CacheEmpty { get { return item_cache.Count == 0; } } FSpotDatabaseConnection database; protected FSpotDatabaseConnection Database { get { return database; } } // Constructor. public DbStore (FSpotDatabaseConnection database, bool cache_is_immortal) { this.database = database; this.cache_is_immortal = cache_is_immortal; item_cache = new Dictionary (); } // Abstract methods. public abstract T Get (uint id); public abstract void Remove (T item); // If you have made changes to "obj", you have to invoke Commit() to have the changes // saved into the database. public abstract void Commit (T item); } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Database/Tests/0000777000175000017500000000000011503407445022625 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot.Database/Tests/UpdaterTests.cs0000644000175000017500000010620011503404760025573 0ustar00rubenruben00000000000000#if ENABLE_TESTS using NUnit.Framework; using System; using Hyena; using FSpot; namespace FSpot.Database.Tests { [TestFixture] public class UpdaterTests { static bool initialized = false; static void Initialize () { GLib.GType.Init (); Updater.silent = true; initialized = true; } [Test] public void Test_0_6_1_5 () { TestUpdate ("0.6.1.5", "17.0"); } [Test] public void Test_0_6_2 () { TestUpdate ("0.6.2", "17.1"); } [Test] public void Test_0_7_0_17_2 () { TestUpdate ("0.7.0-17.2", "17.2"); } [Test] public void Test_0_7_0_18_0 () { TestUpdate ("0.7.0-18.0", "18"); } private void TestUpdate (string version, string revision) { if (!initialized) Initialize (); var uri = new SafeUri (Environment.CurrentDirectory + "/../tests/data/f-spot-"+version+".db"); var file = GLib.FileFactory.NewForUri (uri); Assert.IsTrue (file.Exists, String.Format ("Test database for version {0} not found", version)); var tmp = System.IO.Path.GetTempFileName (); var uri2 = new SafeUri (tmp); var file2 = GLib.FileFactory.NewForUri (uri2); file.Copy (file2, GLib.FileCopyFlags.Overwrite, null, null); var db = new FSpotDatabaseConnection (uri2.AbsolutePath); ValidateRevision (db, revision); Updater.Run (db); ValidateRevision (db, Updater.LatestVersion.ToString ()); ValidateTableStructure (db); CheckPhotosTable (db); CheckPhotoVersionsTable (db); CheckTagsTable (db); file2.Delete (); } private void ValidateRevision (FSpotDatabaseConnection db, string revision) { var query = "SELECT data FROM meta WHERE name = 'F-Spot Database Version'"; var found = db.Query (query).ToString (); Assert.AreEqual (revision, found); } private void ValidateTableStructure (FSpotDatabaseConnection db) { CheckTableExistance (db, "exports"); CheckTableExistance (db, "jobs"); CheckTableExistance (db, "meta"); CheckTableExistance (db, "photo_tags"); CheckTableExistance (db, "photo_versions"); CheckTableExistance (db, "photos"); CheckTableExistance (db, "rolls"); CheckTableExistance (db, "tags"); } private void CheckTableExistance (FSpotDatabaseConnection db, string name) { Assert.IsTrue (db.TableExists (name), String.Format ("Expected table {0} does not exist.", name)); } private void CheckPhotosTable (FSpotDatabaseConnection db) { CheckPhoto (db, 1, 1249579156, "file:///tmp/database/", "sample.jpg", "Testing!", 1, 2, 5); CheckPhoto (db, 2, 1276191607, "file:///tmp/database/", "sample_canon_bibble5.jpg", "", 1, 1, 0); CheckPhoto (db, 3, 1249834364, "file:///tmp/database/", "sample_canon_zoombrowser.jpg", "%test comment%", 1, 1, 0); CheckPhoto (db, 4, 1276191607, "file:///tmp/database/", "sample_gimp_exiftool.jpg", "", 1, 1, 5); CheckPhoto (db, 5, 1242995279, "file:///tmp/database/", "sample_nikon1.jpg", "", 1, 1, 1); CheckPhoto (db, 6, 1276191607, "file:///tmp/database/", "sample_nikon1_bibble5.jpg", "", 1, 1, 0); CheckPhoto (db, 7, 1167646774, "file:///tmp/database/", "sample_nikon2.jpg", "", 1, 1, 0); CheckPhoto (db, 8, 1276191607, "file:///tmp/database/", "sample_nikon2_bibble5.jpg", "", 1, 1, 0); CheckPhoto (db, 9, 1256140553, "file:///tmp/database/", "sample_nikon3.jpg", " ", 1, 1, 0); CheckPhoto (db, 10, 1238587697, "file:///tmp/database/", "sample_nikon4.jpg", " ", 1, 1, 0); CheckPhoto (db, 11, 1276191607, "file:///tmp/database/", "sample_no_metadata.jpg", "", 1, 1, 0); CheckPhoto (db, 12, 1265446642, "file:///tmp/database/", "sample_null_orientation.jpg", "", 1, 1, 0); CheckPhoto (db, 13, 1161575860, "file:///tmp/database/", "sample_olympus1.jpg", "", 1, 1, 0); CheckPhoto (db, 14, 1236006332, "file:///tmp/database/", "sample_olympus2.jpg", "", 1, 1, 0); CheckPhoto (db, 15, 1246010310, "file:///tmp/database/", "sample_panasonic.jpg", "", 1, 1, 0); CheckPhoto (db, 16, 1258799979, "file:///tmp/database/", "sample_sony1.jpg", "", 1, 1, 0); CheckPhoto (db, 17, 1257533767, "file:///tmp/database/", "sample_sony2.jpg", "", 1, 1, 0); CheckPhoto (db, 18, 1026565108, "file:///tmp/database/", "sample_xap.jpg", "", 1, 1, 4); CheckPhoto (db, 19, 1093249257, "file:///tmp/database/", "sample_xmpcrash.jpg", "", 1, 1, 0); CheckPhoto (db, 20, 1276191607, "file:///tmp/database/test/", "sample_tangled1.jpg", "test comment", 1, 1, 0); CheckCount (db, "photos", 20); } private void CheckPhotoVersionsTable (FSpotDatabaseConnection db) { CheckPhotoVersion (db, 1, 1, "Original", "file:///tmp/database/", "sample.jpg", "", 1); CheckPhotoVersion (db, 2, 1, "Original", "file:///tmp/database/", "sample_canon_bibble5.jpg", "", 1); CheckPhotoVersion (db, 3, 1, "Original", "file:///tmp/database/", "sample_canon_zoombrowser.jpg", "", 1); CheckPhotoVersion (db, 4, 1, "Original", "file:///tmp/database/", "sample_gimp_exiftool.jpg", "", 1); CheckPhotoVersion (db, 5, 1, "Original", "file:///tmp/database/", "sample_nikon1.jpg", "", 1); CheckPhotoVersion (db, 6, 1, "Original", "file:///tmp/database/", "sample_nikon1_bibble5.jpg", "", 1); CheckPhotoVersion (db, 7, 1, "Original", "file:///tmp/database/", "sample_nikon2.jpg", "", 1); CheckPhotoVersion (db, 8, 1, "Original", "file:///tmp/database/", "sample_nikon2_bibble5.jpg", "", 1); CheckPhotoVersion (db, 9, 1, "Original", "file:///tmp/database/", "sample_nikon3.jpg", "", 1); CheckPhotoVersion (db, 10, 1, "Original", "file:///tmp/database/", "sample_nikon4.jpg", "", 1); CheckPhotoVersion (db, 1, 2, "Modified", "file:///tmp/database/", "sample%20(Modified).jpg", "", 0); CheckPhotoVersion (db, 11, 1, "Original", "file:///tmp/database/", "sample_no_metadata.jpg", "", 1); CheckPhotoVersion (db, 12, 1, "Original", "file:///tmp/database/", "sample_null_orientation.jpg", "", 1); CheckPhotoVersion (db, 13, 1, "Original", "file:///tmp/database/", "sample_olympus1.jpg", "", 1); CheckPhotoVersion (db, 14, 1, "Original", "file:///tmp/database/", "sample_olympus2.jpg", "", 1); CheckPhotoVersion (db, 15, 1, "Original", "file:///tmp/database/", "sample_panasonic.jpg", "", 1); CheckPhotoVersion (db, 16, 1, "Original", "file:///tmp/database/", "sample_sony1.jpg", "", 1); CheckPhotoVersion (db, 17, 1, "Original", "file:///tmp/database/", "sample_sony2.jpg", "", 1); CheckPhotoVersion (db, 18, 1, "Original", "file:///tmp/database/", "sample_xap.jpg", "", 1); CheckPhotoVersion (db, 19, 1, "Original", "file:///tmp/database/", "sample_xmpcrash.jpg", "", 1); CheckPhotoVersion (db, 20, 1, "Original", "file:///tmp/database/test/", "sample_tangled1.jpg", "", 1); CheckCount (db, "photo_versions", 21); CheckOriginalVersionCount (db); } private void CheckTagsTable (FSpotDatabaseConnection db) { CheckTag (db, 1, "Favorites", 0, 1, -10, "stock_icon:emblem-favorite"); CheckTag (db, 2, "Hidden", 0, 0, -9, "stock_icon:emblem-readonly"); CheckTag (db, 3, "People", 0, 1, -8, "stock_icon:emblem-people"); CheckTag (db, 4, "Places", 0, 1, -8, "stock_icon:emblem-places"); CheckTag (db, 5, "Events", 0, 1, -7, "stock_icon:emblem-event"); CheckTag (db, 6, "Imported Tags", 0, 1, 0, "stock_icon:gtk-new"); CheckTag (db, 7, "keyword1", 6, 1, 0, ""); CheckTag (db, 8, "keyword2", 6, 1, 0, ""); CheckTag (db, 9, "keyword3", 6, 1, 0, ""); CheckTag (db, 10, "keyword 1", 6, 1, 0, ""); CheckTag (db, 11, "keyword 2", 6, 1, 0, ""); CheckTag (db, 12, "Kirche Sulzbach", 6, 1, 0, ""); CheckTag (db, 13, "Nikon D70s", 6, 1, 0, ""); CheckTag (db, 14, "Food", 6, 1, 0, ""); CheckTag (db, 15, "2007", 6, 1, 0, ""); CheckTag (db, 16, "2006", 6, 1, 0, ""); CheckTag (db, 17, "Neujahr", 6, 1, 0, tag_icon_emblem); CheckTag (db, 18, "Sylvester", 6, 1, 0, ""); CheckTag (db, 19, "Olympus µ 700", 6, 1, 0, ""); CheckTag (db, 20, "Rom 2006-10", 6, 1, 0, ""); CheckTag (db, 21, "Architecture", 5, 1, 0, tag_icon_img); CheckTag (db, 22, "Flughafen", 6, 1, 0, ""); CheckTag (db, 23, "Basel", 6, 1, 0, ""); CheckTag (db, 24, "FreeFoto.com", 6, 1, 0, ""); CheckTag (db, 25, "City", 6, 1, 0, "stock_icon:emblem-places"); CheckTag (db, 26, " ", 25, 1, 0, ""); CheckTag (db, 27, "State", 6, 1, 0, "stock_icon:emblem-places"); CheckTag (db, 28, "Country", 6, 1, 0, "stock_icon:emblem-places"); CheckTag (db, 29, "Ubited Kingdom", 28, 1, 0, ""); CheckTag (db, 30, "Communications", 6, 1, 0, ""); CheckTag (db, 31, "Türkei 2004", 6, 1, 0, ""); CheckCount (db, "tags", 31); } private void CheckPhoto (FSpotDatabaseConnection db, uint id, uint time, string base_uri, string filename, string description, uint roll_id, uint default_version_id, uint rating) { var reader = db.Query ("SELECT id, time, base_uri, filename, description, roll_id, default_version_id, rating FROM photos WHERE id = " + id); var found = false; while (reader.Read ()) { Assert.AreEqual (id, Convert.ToUInt32 (reader[0]), "id on photo "+id); Assert.AreEqual (time, Convert.ToUInt32 (reader[1]), "time on photo "+id); Assert.AreEqual (base_uri, reader[2], "base_uri on photo "+id); Assert.AreEqual (filename, reader[3], "filename on photo "+id); Assert.AreEqual (description, reader[4], "description on photo "+id); Assert.AreEqual (roll_id, Convert.ToUInt32 (reader[5]), "roll_id on photo "+id); Assert.AreEqual (default_version_id, Convert.ToUInt32 (reader[6]), "default_version_id on photo "+id); Assert.AreEqual (rating, Convert.ToUInt32 (reader[7]), "rating on photo "+id); found = true; } Assert.IsTrue (found, "photo "+id+" missing"); } private void CheckPhotoVersion (FSpotDatabaseConnection db, uint photo_id, uint version_id, string name, string base_uri, string filename, string import_md5, uint is_protected) { var reader = db.Query ("SELECT photo_id, version_id, name, base_uri, filename, import_md5, protected FROM photo_versions WHERE photo_id = " + photo_id + " AND version_id = " + version_id); var found = false; while (reader.Read ()) { Assert.AreEqual (photo_id, Convert.ToUInt32 (reader[0]), "photo_id on photo version "+photo_id+"/"+version_id); Assert.AreEqual (version_id, Convert.ToUInt32 (reader[1]), "version_id on photo version "+photo_id+"/"+version_id); Assert.AreEqual (name, reader[2], "name on photo version "+photo_id+"/"+version_id); Assert.AreEqual (base_uri, reader[3], "base_uri on photo version "+photo_id+"/"+version_id); Assert.AreEqual (filename, reader[4], "filename on photo version "+photo_id+"/"+version_id); Assert.AreEqual (import_md5, reader[5], "import_md5 on photo version "+photo_id+"/"+version_id); Assert.AreEqual (is_protected, Convert.ToUInt32 (reader[6]), "protected on photo version "+photo_id+"/"+version_id); found = true; } Assert.IsTrue (found, "photo version "+photo_id+"/"+version_id+" missing"); } private void CheckOriginalVersionCount (FSpotDatabaseConnection db) { var photo_count = GetCount (db, "photos", "1"); var orig_version_count = GetCount (db, "photo_versions", "version_id = 1"); Assert.AreEqual (photo_count, orig_version_count, "Expecting an original version for each photo"); } private void CheckTag (FSpotDatabaseConnection db, uint id, string name, uint cat_id, int is_cat, int sort, string icon) { var reader = db.Query ("SELECT id, name, category_id, is_category, sort_priority, icon FROM tags WHERE id = " + id); var found = false; while (reader.Read ()) { Assert.AreEqual (id, Convert.ToUInt32 (reader[0]), "id on tag "+id); Assert.AreEqual (name, reader[1], "name on tag "+id); Assert.AreEqual (cat_id, Convert.ToUInt32 (reader[2]), "category_id on tag "+id); Assert.AreEqual (is_cat, Convert.ToInt32 (reader[3]), "is_cat on tag "+id); Assert.AreEqual (sort, reader[4], "sort_priority on tag "+id); Assert.AreEqual (icon, reader[5], "icon on tag "+id); found = true; } Assert.IsTrue (found, "tag "+id+" missing"); } private int GetCount (FSpotDatabaseConnection db, string table, string where) { return db.Query ("SELECT COUNT(*) FROM "+table+" WHERE "+where); } private void CheckCount (FSpotDatabaseConnection db, string table, int count) { var counted = GetCount (db, table, "1"); Assert.AreEqual (count, counted, "Count on "+table); } private const string tag_icon_img = "R2RrUAAAJBgBAQACAAAAwAAAADAAAAAw////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wBRlAATTZoFYE+dCKFRnQfBUZ4H3E+dBvFOmwb8UJwG71GeB9pRnge/UJ4InU+ZBlpVmQAP////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wBJkgAOTZsHblCfBsxPnAf4c7cx9KHVb/+14Yr/x+mk/9fxv//i9s//1vC8/8Xpov+z4Ij/ndRp/2uxJ/NPmwf5UJ0Gxk6bBWZNmQAK////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AVaoABk6bB3NQnQbxeb04967egP/b88P/3vTH/73qkP+u5Xj/oeFj/5TdTv+L2j7/l95S/6TiaP+x5n3/wuuZ/+T20v/X8r7/qtx6/3G3L/ZPnAbuUJsFZlWqAAP///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wBNmgZTUJ0H6m+1LvbA6Jr/1PG4/6vkc/+H2Df/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3TSF/+M2kD/seZ9/9vzw/+45I7/Z7Ai9E+cB+FPmgdH////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AgIAAAk+eBY5apBT1sOCC/9Txt/+f4GD/dNIY/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3fTHf+q5HH/2fO//6fbdf9VoAz2UJwIfP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wBVlQAMUZwHumuyJ/XJ7af/quRy/3fTHf9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/fNUm/7joif/E6p//Yaoa9VCcCKpVqgAG////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AE6dAA1QnAfZfsA/+Mzuqv+U3U7/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv+i4WT/zO6q/3K4LvdQnQbJVaoABv///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AgIAAAk+dB7uAwUH4x+2i/4fYN/9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/4PXMP+t5Xf/x+2i/9byu//l99P/3vTH/87vrf+76Y//ld1P/3XTGf9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/j9tF/8vuqf9zuDH3UJwIpf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AT5wGi2yyKfTH7aL/hdg0/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv+h4WL/4/bQ//////////////////////////////////////////////////X87v/C65n/ftYo/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/47bQ//G7KH/YKgb9lGcCXH///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wBNmgZTXKQW9cDplv+R3Ej/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/jdpB/+D1zP//////////////////////////////////////////////////////////////////////9/zx/7PmgP900hf/c9IW/3PSFv9z0hb/c9IW/3PSFv+c31r/uuaO/1ahDfZOmAQ+////AP///wD///8A////AP///wD///8A////AP///wD///8A////AEmSAAdQnQfqqd52/5/gYP9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv+i4WT/+v32///////////////////////////////////////////////////////////////////////////////////////T8bX/etQh/3PSFv9z0hb/c9IW/3PSFv9z0hb/q+Rz/5vVYv9PnQfbAP8AAf///wD///8A////AP///wD///8A////AP///wD///8A////AE6ZB3VytzH0uumM/3XTGv9z0hb/c9IW/3PSFv9z0hb/c9IW/67leP/+//7/////////////////////////////////////////////////////////////////////////////////////////////////5PbR/3rUIf9z0hb/c9IW/3PSFv9z0hb/etQh/8Drlv9irBzzTpoGW////wD///8A////AP///wD///8A////AP///wD///8AVZkAD1GcCPKu4X3/j9tF/3PSFv9z0hb/c9IW/3PSFv9z0hb/md5V//3+/P////////////////////////////////////////////X58P/u9ej/7vXo//r8+P///////////////////////////////////////////9Pxtv900hf/c9IW/3PSFv9z0hb/c9IW/5rfV/+i22v/UJ0H6VWqAAb///8A////AP///wD///8A////AP///wD///8ATpsHc3m8Ofaw5nv/dNIX/3PSFv9z0hb/c9IW/3PSFv+A1iz/9vzv////////////////////////////////////////////9fnw/1WeD/9UnQ7/UpwN/3qzRP////////////////////////////////////////////////+054P/c9IW/3PSFv9z0hb/c9IW/3bTG/+56Ir/arIk806aBlv///8A////AP///wD///8A////AP///wD///8AUJ4Hz57XZ/+P20X/c9IW/3PSFv9z0hb/c9IW/3PSFv/G7aH/////////////////////////////////////////////////7vXo/1SdDv9Omgb/TpoG/2mpLP/////////////////////////////////////////////////4/fP/f9Yq/3PSFv9z0hb/c9IW/3PSFv+Z3lb/ktFU/1GdB7f///8A////AP///wD///8A////AP///wBNmQAUUp4L+bXmhf941B7/c9IW/3PSFv9z0hb/c9IW/4jZOv/9/vv//////////////////////+jy3//l8Nv/////////////////7vXo/1SdDv9Omgb/TpoG/2mpLP//////////////////////1ujF//b68v//////////////////////xOyc/3PSFv9z0hb/c9IW/3PSFv+B1y7/sOR+/1CbB/ZVqgAG////AP///wD///8A////AP///wBOmQVfcbUw9qbiav9z0hb/c9IW/3PSFv9z0hb/c9IW/73qkf//////////////////////+/35/1+jHf9TnQ7/kMBk/+/26f//////7vXo/1SdDv9Omgb/TpoG/2mpLP///////////9npyf9wrTb/UZwK/4+/Yv//////////////////////9/zx/3bTG/9z0hb/c9IW/3PSFv9z0hb/suZ+/2avH/FPmgdH////AP///wD///8A////AP///wBQngetj85R/5DbRv9z0hb/c9IW/3PSFv9z0hb/c9IW/+r43P//////////////////////sdKR/1efEf9Omgb/UpwM/1WfEP+ly4D/5/Le/1SdDv9Omgb/TpoG/2mpLP/n8d3/g7hQ/1WdD/9Pmgf/TpoG/1OdDv/l8Nr//////////////////////5jeVP9z0hb/c9IW/3PSFv9z0hb/nN9a/4THQ/5OmwWP////AP///wD///8A////AP///wBRngbNmdZf/4bYNf9z0hb/c9IW/3PSFv9z0hb/htg1////////////////////////////fbVI/1WeDv9Omgb/TpoG/06aBv9VnhD/Vp8S/1SdDv9Omgb/TpoG/1OdDv9VnhD/UZsK/06aBv9Omgb/TpoG/1SdDv+82aH//////////////////////7/rlf9z0hb/c9IW/3PSFv9z0hb/kdxH/47PT/9Rnwe0////AP///wD///8A////AP///wBQnQfjodxo/3/WKf9z0hb/c9IW/3PSFv9z0hb/l95S////////////////////////////+fz3/6/Rjv9YoBP/VZ0P/06aBv9Omgb/TpoG/0+bCP9Omgb/TpoG/1CbCP9Omgb/TpoG/06aBv9XnxP/aKgq/8ziuP///////////////////////////9LxtP9z0hb/c9IW/3PSFv9z0hb/idk7/5fWWv9RnwfR////AP///wD///8A////AP///wBPnAf1qOFw/3jUHv9z0hb/c9IW/3PSFv9z0hb/peJp///////////////////////////////////////3+vP/p8yC/1efEv9UnQ7/TpoG/06aBv9Omgb/TpoG/06aBv9Omgb/V58S/2ClIP/D3ar//v/+/////////////////////////////////+H1zv9z0hb/c9IW/3PSFv9z0hb/gtcv/5/cY/9QnQfo////AP///wD///8A////AFWqAANPmgf+rOR1/3PSFv9z0hb/c9IW/3PSFv9z0hb/rOR1/////////////////////////////////////////////f78/7DSkP9Pmgf/UJsI/06aBv9Omgb/TpoG/06aBv9UnhD/Vp8S/9LlwP///////////////////////////////////////////+n42v9z0hb/c9IW/3PSFv9z0hb/fNUl/6Tgaf9Pmwf4////AP///wD///8A////AP///wBOmwb4puFt/3bTG/9z0hb/c9IW/3PSFv9z0hb/n+Bg///////////////////////////////////////G36//YqUi/1afEf9Omgb/TpoG/06aBv9Omgb/TpoG/06aBv9Omgb/T5sH/1aeEf95s0P/3uzR/////////////////////////////////9v0xP9z0hb/c9IW/3PSFv9z0hb/gNYr/53cYP9QnQbs////AP///wD///8A////AP///wBRngfnnNtg/3zVJf9z0hb/c9IW/3PSFv9z0hb/ktxJ////////////////////////////1ujF/2qqLf9XnxL/TpoG/06aBv9Omgb/U50N/1efE/9Omgb/TpoG/1aeEf9Omgf/TpoG/06aBv9Pmwj/VZ4P/4W5U//u9ef//////////////////////8zvqv9z0hb/c9IW/3PSFv9z0hb/hdg0/5PVU/9RngfW////AP///wD///8A////AP///wBRnwfRktRS/4HWLf9z0hb/c9IW/3PSFv9z0hb/fNUl//z++v//////////////////////e7RF/06aBv9Omgb/TpoG/1CbCf9VnQ//irxa/1SdDv9Omgb/TpoG/1+kHf9zrzn/Vp8S/06aBv9Omgb/TpoG/1KdDP+52J3//////////////////////7PmgP9z0hb/c9IW/3PSFv9z0hb/itk8/4nORv9QnQe7////AP///wD///8A////AP///wBRnge2iM1F/4fYN/9z0hb/c9IW/3PSFv9z0hb/c9IW/9nzwP//////////////////////1ujF/1aeEf9Omgb/VZ4Q/362Sv/l8Nv/7vXo/1SdDv9Omgb/TpoG/2mpLP//////yuG1/2KlIv9XnhH/TpoG/1qhFv/5+/b//////////////////////4jZOf9z0hb/c9IW/3PSFv9z0hb/kNtG/37GOf9QnQWZ////AP///wD///8A////AP///wBPnAdxcbkr95TdTf9z0hb/c9IW/3PSFv9z0hb/c9IW/6zkdf///////////////////////////4a6Vf9rqy//1efE////////////7vXo/1SdDv9Omgb/TpoG/2mpLP////////////z9+/+31pj/XKIZ/73Zof//////////////////////6fja/3PSFv9z0hb/c9IW/3PSFv9z0hb/nN9b/2exIPJOmgZY////AP///wD///8A////AP///wBLnggiVKAM9p/fX/910xn/c9IW/3PSFv9z0hb/c9IW/3jUH//x+uf/////////////////////////////////////////////////7vXo/1SdDv9Omgb/TpoG/2mpLP//////////////////////////////////////////////////////p+Nt/3PSFv9z0hb/c9IW/3PSFv951CD/nt9e/1GcCPdVmQAP////AP///wD///8A////AP///wD///8AUZwH4I7TS/+B1i3/c9IW/3PSFv9z0hb/c9IW/3PSFv+q5HH/////////////////////////////////////////////////7vXo/1OdDf9Omgb/TpoG/2mpLP/////////////////////////////////////////////////m99X/dNIY/3PSFv9z0hb/c9IW/3PSFv+H2Tj/hs5A/1GeBsr///8A////AP///wD///8A////AP///wD///8ATZsGh3K8K/qR3Ej/c9IW/3PSFv9z0hb/c9IW/3PSFv910xn/3PTF////////////////////////////////////////////+/35/4e6Vf90rzv/dK87/63Qi/////////////////////////////////////////////z++v+S3Er/c9IW/3PSFv9z0hb/c9IW/3PSFv+X3lL/arUh9k2aB23///8A////AP///wD///8A////AP///wD///8ATZsIIVGdCfeU2VL/fdUm/3PSFv9z0hb/c9IW/3PSFv9z0hb/ftYo/+354f///////////////////////////////////////////////////////////////////////////////////////////////////////////6njcP9z0hb/c9IW/3PSFv9z0hb/c9IW/4LXMP+Q1kr/UJwH81WcABL///8A////AP///wD///8A////AP///wD///8A////AFCcBZVttyb4ktxJ/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/4rZO//t+eL////////////////////////////////////////////////////////////////////////////////////////////+//7/tuiF/3PSFv9z0hb/c9IW/3PSFv9z0hb/dNIY/5feUv9lsBr2T5sIe////wD///8A////AP///wD///8A////AP///wD///8A////AFGUABNQnQj0jdVI/4HWLf9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9+1ij/3PTF//////////////////////////////////////////////////////////////////////////////////n99f+f4GD/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/htg2/4jSP/9QnAbtVY4ACf///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAFOmgZ5XaoW9ZTcTv961CL/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/ddMa/6zkdf/y++n////////////////////////////////////////////////////////////+//7/zu+t/4XYM/9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9+1ij/lNtO/1mlEPROmQVfAAAAAf///wD///8A////AP///wD///8A////AP///wD///8AAAAAAQAAAAEAVQADT5wHvGm3IPeS3En/dtMb/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv951CD/ruV5/9rzwv/8/vr/////////////////////////////////7fnh/8Lrmv+N2kL/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3nUIP+U3U3/Yq8Y9k+cCKUAAAACAAAAAgAAAAEAAAAB////AP///wD///8A////AP///wAAAAABAAAAAQAAAAIAAAAEOXEAElCdB992wyv8jdpC/3bTG/9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv971ST/kdxI/5/gYP+s5HX/puJq/5feUv+H2Df/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/eNQf/5HcSP9vviX6T5wH0SdOAA0AAAAFAAAAAwAAAAIAAAABAAAAAf///wD///8A////AAAAAAEAAAABAAAAAgAAAAQAAAAHAAAACjl3Bi1PnAbwd8Uq/Y7bRP951CD/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv981Sb/kdxI/3G/JftPnAfrMFoHJQAAAA0AAAAJAAAABgAAAAQAAAACAAAAAQAAAAH///8A////AAAAAAEAAAACAAAABAAAAAYAAAAKAAAADgAAABM1ZQQ6T5oH5mm3HfmO20T/ftYo/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/4HWLf+O2kT/ZLIZ906ZB94rUgU1AAAAFwAAABMAAAAOAAAACgAAAAYAAAADAAAAAgAAAAH///8AAAAAAQAAAAEAAAADAAAABQAAAAkAAAANAAAAEgAAABcAAAAdGjMAMk2WBs5dqxP2h9U8/4rZO/961CH/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv981SX/jNo//4bUOf9YpRD2SpIHxA8kADIAAAAiAAAAHAAAABcAAAARAAAADAAAAAgAAAAFAAAAAgAAAAEAAAABAAAAAQAAAAEAAAADAAAABgAAAAoAAAAPAAAAFAAAABkAAAAgAAAAJwULADBEhQWlT5sI+Gu6H/yL1z7/htg1/3vVJP900hf/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv9z0hb/c9IW/3PSFv900hj/fNUm/4jZOf+J1zz/aLcb+06bB/c/fAaeAAUANgAAACwAAAAlAAAAHwAAABkAAAATAAAADgAAAAkAAAAFAAAAAwAAAAEAAAABAAAAAQAAAAEAAAADAAAABQAAAAkAAAAOAAAAEwAAABgAAAAeAAAAJQAAAC0AAAA4GzQDXkaJBslQnAj6br8i/oPTNv+M2j//hdgz/33VJv961CH/dtMb/3TSF/9z0hb/dNIY/3fTHP961CL/ftYo/4bYNf+M2kD/gtI0/2u8H/5Rmgj6QoEGxhIkA2MAAABDAAAANgAAACsAAAAkAAAAHQAAABgAAAASAAAADQAAAAgAAAAFAAAAAgAAAAEAAAAB////AAAAAAEAAAACAAAABAAAAAcAAAALAAAAEAAAABUAAAAaAAAAIAAAACgAAAAyAAAAQQAAAFAePQJ+Q4QG0U6YB/pVoQz4bL0f/n3MLv+E1DX/iNk6/4vaPv+L2j3/i9o9/4jYOv+D0zT/e8ws/2i5HP5Tnwv5TpgH+UF+BtAZMwKDAAAAWwAAAEwAAAA9AAAAMAAAACUAAAAfAAAAGQAAABQAAAAOAAAACgAAAAYAAAADAAAAAgAAAAH///8A////AAAAAAEAAAACAAAAAwAAAAUAAAAHAAAACwAAAA8AAAATAAAAGAAAAB4AAAAmAAAAMQAAAD0AAABKAAAAVgMFAGYiRQOUO3cFykuSBu9Olwf6TpoG/lCaB/pSngr5TpkG+02aBv5NmAb5SpAG7zpyBMoePAKYAgIAbQAAAGAAAABUAAAARwAAADkAAAAuAAAAIwAAABwAAAAXAAAAEgAAAA4AAAAKAAAABwAAAAQAAAACAAAAAQAAAAH///8A////AP///wAAAAABAAAAAgAAAAMAAAAEAAAABgAAAAkAAAAMAAAADwAAABQAAAAYAAAAHgAAACcAAAAvAAAAOQAAAEIAAABLAAAAVQAAAFwAAABhBQoAahMnAnwcOAKJEiUCfQUHAG0AAABmAAAAYQAAAFkAAABSAAAASAAAAD8AAAA1AAAALAAAACQAAAAcAAAAGAAAABIAAAAOAAAACwAAAAgAAAAGAAAABAAAAAIAAAABAAAAAf///wD///8A////AP///wAAAAABAAAAAQAAAAEAAAACAAAAAwAAAAUAAAAGAAAACAAAAAsAAAAOAAAAEAAAABQAAAAaAAAAHQAAACMAAAApAAAALQAAADIAAAA1AAAAOQAAADoAAAA8AAAAOwAAADoAAAA5AAAANAAAADEAAAAsAAAAJwAAACEAAAAbAAAAFwAAABMAAAAQAAAADAAAAAoAAAAIAAAABgAAAAQAAAADAAAAAgAAAAEAAAAB////AP///wD///8A////AP///wD///8A////AAAAAAEAAAABAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGAAAABYAAAAUAAAAEQAAAA8AAAANAAAACwAAAAgAAAAHAAAABgAAAAUAAAADAAAAAwAAAAIAAAABAAAAAf///wD///8A////AP///wD///8A"; private const string tag_icon_emblem = "R2RrUAAAGxgBAQABAAAAkAAAADAAAAAwgYFpgYFpdnZkZGVbVlZUTExRZl5iem1xlH+CinuAe3N6Z2lyYmZvb21zfnZ5jn5+jX59jH18i3x7hnh4fW1wdGJobVliYU9WVkZJTT4/QTQ1NCstKiMmIRwgKCEjLSQlMykoQzUyUz87ZkxFfWBXlXdss5SH0bGi17us38a55tLG28m+tqadkoJ8dWZhdWZhgYFpgYFpdnZkZGVbVlZUTExRZl5iem1xlH+CinuAe3N6Z2lyYmZvb21zfnZ5jn5+jX59jH18i3x7hnh4fW1wdGJobVliYU9WVkZJTT4/QTQ1NCstKiMmIRwgKCEjLSQlMykoQzUyUz87ZkxFfWBXlXdss5SH0bGi17us38a55tLG28m+tqadkoJ8dWZhdWZhhIFthIFteHVnZGNcU1NTSEhPY11ieG1xk4GEi32CfnZ7bmxzaWlvcm1yfXJ1iHh5hXV2gHJzfG9weGtscmNmbFthaFVcXUxRU0RHSj0+PzQ1NCstKiMmIh0gJyAiKiMjLyYlQDIvUD05Y0tFel5Wj3NpqYyAw6aYyq+i0ruu2se60L6zrp2UjHx1cWFccWFcioB1ioB1e3RsY19eUE9SQkNLXlphdG1ykISIjYKFhXt+enJ0dW1veG1ve21wf21wd2dqbWBjY1lcX1VZX1NWX1BUYE5TV0dLTkFDRzw8PTQ0MystKyQnIx4gJR8gJiAgKCEfOi4qSzs2YEpEdVxUhWtjmX91rZOItJyRvaicxrOnvqyhoI6GgXBqaVlUaVlUjoB6joB6fnJwY11fTUtSPD9JWlhgcW1zj4aKj4WHin6Ag3Z2fnBvfGxteWhrd2Vpa1xhXVJXT0hNS0RJUEZKVUdKWUhLUUNFSj4/RDo7OzQ0MywtLCUnJB8hJB4fIx0dIx0aNSonRzgzXUpDcFpSfGZei3RsmoN6oo2DrJiOtqSYsJ6TlIN6eWdhY1JOY1JOmIWFmIWFhnh6aWFmUU9XP0JMXFxkc3F3kIuPk4mLj4KCi3l2hHBtfWppdGJkbFpgXU9VTEJJOjY8NzI5QDc8SDw/T0BCST0+Qzo6Pzc4ODIyMSssKyUmJR8gIx0dIRsaHxkXMigkRTgzXUxFcFtTd2NbgWxkinZukn51m4h+pZOHn42Ch3Vsb11XW0pGW0pGsqSfsqSfo5iUi4SCd3R0aGdpfXl6jYeIoZiamo6Pj4GCgXBwdGNjbV1fY1VZWk1TT0VLQjtBNTE3Mi40ODE2PjQ4Qzc6PjM2OTAyNS0vMCkqKiQlJSAhIBwdIhwcJB0cJx0bPTArU0I8bllQgWpfh3BljndslX9yl4J1moZ3nYl6lYJ0fWthZlRPU0NAU0NAxr20xr20urKqpqCZlpKLiYWAlpCMoZiWr6KioJKTj4CCeWlraFlcYFNWVktQTERJRD1DOjY7MC40LisxMi0yNS4zOC80NSwwMSgrLiUoKSEkJB4gIBwdHRoaIhwcJx4dLSAeRjYxXkpDfGRaj3Zpk3ttmIBxnYZ2m4V0mYNyloJwjHlpdWNZXk5ITD07TD074NvO4NvO19PEyMO1vLeosqudt6yju66nwK+tqJeYj3+Cb2FmWExSUEZMRT9EOzc9NjM5MS80KyovKSctKictKyYtLCYtKSIoJx4jJRsfIRgcHRcZGRcYGBcXIhsbKh8eNCQiUT03a1RMjHJloYV1o4h3pYx4qI96oIl0l4FsjnlkgW1ba1lOVUVARDY1RDY16+fZ6+fZ5N7P18+/zcKywbSjuaqfsqKcqpmYkYKEem1wXVJYSEBHQjxCOzc8NDI2MS80LiwwKigtKSYsJyQqJiMpJSIoIx4kIBsgHhgcHRcaGxcZGhcYGhgYJR0cLSIfNyckUj43a1RKi3BioINypYh2rI96s5Z/qIx2mX9ri3Nff2dXb1dNX0ZDUjo8Ujo88e3f8e3f6uPV39PD1ca1yLWktaKXpZONkYCBeWtuZVpfTEVLOzc9ODU6NDI2MTAyLy0xLSovKyctKSUrJiMpIyEnIR8lHxwiHBkeGhcbGRcaGhgaGxkZHRsaJyAeLyQhOSkkUj42aVJHhWtdm35tpIZzsJB7vJqDro54nH5ri25df2NVdVZPaklIYj9DYj9D+fPn+fPn8+rc6dnI4Mu50belr5iNlH97cmBjW09US0NJNzQ7LCwyLCwwLCwvLCwtLCotLCgsKyYsKSQrJSEnIB4kHBwhGRofFxgcFBYaFhcaGRkaHRsbIR0cKyIfMiYiOyslUT00ZU5Df2RWlXdmo4NwtZF8xqCItZB7n3xqiWlaf15TfFVQeUxOdkVNdkVN/PXq/PXq9Ond59XG3cW0yq6cooqAgm1pWUlNRjtBOjQ6KysxJCctJyktKywtLy4tLi0uLisuLSkuKictJCMpHiAlGh0iFxsgFBoeEhkdFBkcGRsdHh0dJCAeLiUhNSkkPi4nUj41ZE5CemFTj3Jinn5ssY15w52GsYt4mnZmhGFVfVdPglRSiFFVjE9YjE9Y+O/n+O/n7eDX2ce7ybOkspmJjnlwcV9cTUBDPjU7NTI3Ky0yJywwLC8xMjMzODc0NTU0MjI0LzA0LC0yJikuICYrGyMoGCEmFSAkEx4iFR4hGh8gHyAfJSEfMCcjOCwmQzIqVUI4ZVBFeWJVinFilXppooVysJB7oH9ujWtfeVdPd1BMhlRUlFhcoFtioFti9Ofj9Ofj49XPx7atsJ2Rk35ydWRdXU5MPjQ3NC8zMC8zKi8zKzE0MjY2Ozw5Q0E9Pj88ODs7Mjg6LTU4JzE1IS0yHCowGSgtFicrFCUqFiQnGyMkICMiJiQgMislPDApSDctWEY7ZlNId2RYhHBjiXVmkXppmH9tjHBifF1VbEpHcUhIilRWpGBkuWpwuWpw8ODg8ODg2srItaSfmIZ/dWRbXE9KSD48LygrKigsKiwvKjEzLzc4OD08Q0VAT0xFSElEPkVCNUFBLz0/KTk8IzU5HjE3Gy81GC4zFS0xFystHSgoISYkKCYhNS4nQDQrTTwxW0o/Z1dLdWZbfW9jfm9if29hgG9fd2FWa1BLYD5Aaj9Dj1RYtGlt0nl90nl989rd89rd3MbHtqOgl4eCc2hgW1RRR0RFLjA2KzE3LTY8LzxBNUNGPkhISU5LVFVPTVFNRE1LO0lJNkZIMUJFLT9DKjxBJTk+Hzc7GzU5HDE0IS0uJCkpKyglODAqQjYuTz4zXEo/Z1RJc2FXfGpffmtggG1hgm9iemRacVZRZ0lHbUpJiFhYo2dmuHNyuHNy9tPa9tPa38HFtqKilomGcW1nWVtaRkxQLjpDLT1GMUNLNkpSPVFXRVVYUFpZWmBaU1xZS1dWQlNUPlBSPE5ROktPOElOMUVKKUFGIz5DIjk9JjM1KS4vLioqOzIuRTgxUkA1Xkk/Z1FHcltSemNafWZdgWphhW5lf2dfd19YcFdRcldRgF5XjmZemWxjmWxj+szX+szX4bzEt6GklYuKbnJuV2JjRFRbLURQLkhUNU9bPFljRWBoTWNnV2dnYWtmWmdkUmJhSl1fR1pdR1lcR1hbR1daPVJVM0xRKkhNKEFGKzk9LTI1Mi0vPjQySDo0VUI3X0k/Z09FcFZNeFxVfWFagmdhiG1pg2tlfmhgeGVbdmRYd2RXeGRWeWRVeWRV9sDN9sDN3bO8s5ugkYmKa3NyV2dqR11kM1BcNFNgOlllQWFsSGZvTWdtVGhqW2lnV2ZmUmNjTWBhTV9hT19hUmBhVGFiR1pdO1RYMU9ULUdMLj1BLzQ5My4xQDY0Szw3WEQ6YUtBaVFHclhPeF5Xe2JcfmdjgWxqgGxnfm1lfW1iemtec2ZYbGFRZl1NZl1N6Km36Km30J+qqY6ViYCFZnJzWW1xT2lvQmRsQWRuQ2ZvRWhyR2dwR2NrR15kR1ldSVpdTFtdTl1dUl9fWWRiX2hlZWxoVWVkRV1gOFdcMkxTMUBFMTc7My8xQjc2Tj45XEc9Z1FHbllPd2Nae2lhd2ljcmhmbWhpcmtpeXBpgHRqfXFmcGZaY1tPWFJGWFJG2pGh2pGhxIuYnoGLgHiAYXF1W3N4V3V6UXh9TnV8THJ6Sm53RmhyQF9pOlReM0pUO05VRVRXT1pZV19cYmhjbXFqdnhvY29rUGVnQF5kN1JZNERKMjk9MzAyQzk3UUE8YUpBbFZNdGFXfW5kfXRsc29rZmppWWVoZWtrdHNug3pygXdtbmZdWlRMSkdASkdAz36Pz36PunuKlnaCenJ8XXB2XXh+XX+DXYeLWIOHVHyCTnR8RWlzO1xoL01aIz1MMEVPQE5SUFdWXGBbamxkeHhtg4F0bXdxWGxtR2RqO1dfN0hNMzs/MzEyRTs5U0I+ZUxEcVtReGdegXdtf3x0cHVwXGtsSWJnWmtscHVyhYB5hHtza2VfU1BKPz46Pz46u3B9u3B9rHF8knR8fXd8aHp9ZH6AYYGDXYWHVnyAT3N4RmhuPVtkNFBZKUJMHjRALT5FP0tMUlhUXGBZZGhha3BocnduYXBsUGlrQmNpO1phOk9TOkVJPD4/TENBWEhDZ05FcV1TeGphgXtyf4J6cXp2YHFyTmhtWm5wanV0eXx4eHhyZGViUVJRQkREQkREqGFqqGFqnmhvjnN3gXx9coSDa4ODZYODXYKDU3Z5SmpuP1xhNE5VLERLIjg/GCwzKjg8P0hHVFhRXWBYXmVeX2lkYGxoVGloR2VoPWNoOl1jPlZaQVBTRkpLU0xJXU5IaVBHcl9VeG5kgIB2f4d/coB8Y3d3U29zW3F0ZHV1bXl3bHRyXWVlT1VYRElORElOmVZcmVZck2Bki3JyhIB+eo2JcIiGaISDXX+AUXFzRmNmOVJXLUNJJjpAHS80FCUpJzM0P0ZCVllQXmFXWmJbVWNgUmRjSWNlQWNmOmJoOl9lQVtfRlhaTlRVWFNQYFNMalJIcmFXeHBmgIN6f4uEc4WAZXx8V3R4W3R3X3V3ZHZ2YnFyWGRnTlhdRk5VRk5VmF5dmF5dk2dlinVyg4F8eouGboWDZYCBWXp+TGxwQl5jNk5SKz9EJDc8Gy0xEiMmJDEyOkRAUVZPV15WUl5bTV9gSV9kQ2BlPWFnOWJoO2FnQl9kSF5iUFxfWlpZYllUbFdPcmVcdnNre4R9eoyHc4eEaYCAYHp9YHl8YXh7YXh7X3N3WmluVV5lUlZdUlZdo3Vso3Vsm3hvjHx1gIB6coJ+Zn19XXl9UXR9R2dwQFxkN05ULUJHJTo/HC81EiUrITI1M0FBRlFOTFhWSVtcR11jRV9oQWBpPWFqOmJqPGJqQmFpRmFpTWBnWGBiYV9ebF9ZcGpkcXVwc4J/c4mIcYeGboSEbIGCaoCCZ36DZH2DY3mAY3B2Y2hsY2FlY2FlrYd4rYd4oYV4joJ4fn93bHt3YHZ5V3N6S257Q2RwPltkN09WL0RJJzxBHDE4EicuHjI3LkBCPU1NQ1RVQlhdQltlQV5sP19sPWBsO2FsPWJsQWNtRGNuSmNuV2RpYGVmbWVhbm5rbXZ1bIGBbYeIb4eHcoaGdoaFcYWHbIOIZoGKZX6HanZ9bm9ycWlqcWlqr5R/r5R/oo58i4R3eXx0ZXNxWnF1Um55R2x9QmRzP11oPFNaNkpOLEFGIDU8FCoyHTM6KT9ENUpOOlBVPVZfP1toQF9wP2BvP2JvPmNvP2RwQmVyRGZ0SGd1VWlyX2tva21sa3JyZ3h6ZH+DZIOIa4WIc4eIe4iHdoiKb4eOaYaSaYSPcn6Eend5gHJxgHJxjnhljnhlhndneXVrb3RuY3NyXXZ6WHeBUnqJUnR/U250VWdmT1xZQFBQLkBDGzE3JDk/LkNIOU1RP1NZQ1piR2JsS2dzSmh0SGp1R2t1R2x2R2x4SGx5Sm15Um94WHB3YHF2X3R6XXd9WnqBWnyDXnyCYnyAZnx/Z4CFaYWNa4qVb4mUeISJgX5+iHp1iHp1c2FQc2FQcGRWa2pgZ25pYnNzX3p+XX+HWoWSXoGJY3x+aXZwY2tiUFxXOUlJIjY8KT1DM0ZMPE9UQlZcSF5lTmduU252Um94UHB5T3F7TXJ8THF8S3F8S3J9T3N9U3R+V3V/V3Z/VXaAU3eAUnZ/U3V9VHN6VXF4XHmBZIOMbYyXdI6YfYmMhoSBjX94jX94UkU2UkU2VE1BWVtUXGZiYHN0Yn+DY4iPZZOebpGWd46LgYl9fH1uZGthR1RRKT1BMENIOEpQQFJYR1lfT2NoV25yXnZ5XHd8Wnh/WHmBVXmCUniBT3iBTHeBTHiETHmGTHqJS3iGS3WDSXJ+SG96Rmx3Q2hzQGVvTnF7XoCLb5CbepScg4+RjYqFlId8lId8PTIlPTIlRT0yUVFJW2FcZXNxZX6BZoiOZpOebpOYdo+Pf4uDeoB1Y21mR1ZVKj9DMENINklPPVBVRFZcTGFmVWxwXXV4WnZ7WHd+VniBVHiCUniCUHeBTXeBTHiES3iGSXmJS3iGTnaCUXR+T293R2dwPV1mNFNcQ2BpVnF6aYKKdIiOfYaHhoSAjIJ7jIJ7LyQZLyQZOjIoTUpCXF1Wa3JuaH1+Z4aLZJGbapGXcY6QeYqGc395Xm1qQ1ZXKT9ELkNINEhNOk1SQFNYSV5iUmltWXJ1V3N5VXR9U3WAUXaBUHaBT3aBTnaBTHaDSneFSHeHTXeEU3eBWnd+WHF1S2RpO1NaLENLO1FYT2JoY3R5bnt+dnt8fXx7g315g315HhQKHhQKLSQbSEE4XVhPcXFqbHx6aISHY4+YZo6Wa4yRcImKan5+V2xuQFZZKEBELENHMEZKNUpOO1BTRFpeTWVpVW1yUm92UHF6T3J9TnN/T3SAT3SAT3WATHWCSnWCR3WEUHeCWXmAZXt9Y3NzUGBiOUhMITA2Mj5DRlBTW2JjZmprbG5vcnJzd3V3d3V3HBEIHBEILCIYST81X1ZMdHBmbXl1Z4CCYIqRY4uTZ4qRbImPZoCFVW90P1lfKURKK0VKLkZLMUhLNkxQP1ZbSGFmT2luTWtzS213Sm56SnB9THJ+TXN/TnSASnOASHKARHGAUHV/XXl+bX18bHVyWGBePkVGJCotMzc5RkhIWVhXY2JhaGlqbnBzc3V6c3V6LB8WLB8WOS0jUEU6YVhNcm1ianVwZHt7XYOJYYeOZomQbIyTaIWMV3V8Q2FoLkxULktSLklOLkdLMUpOOlRZQ15jSWVrSGdvR2lzRmt2R216SXB8SnF+S3OASHF/RXB+Qm59T3N8Xnd7b317cXdyYGVhSk1LNTY1QEFATk5NXVxaZWVkbW5vdHZ7en2Een2EQTAoQTAoSjsxWUxBZFpPb2leZ29qYXRzWXt/XoKIZYiPbY+XaoyVW32GR2pzM1dhMVJbLkxTKkZMLEdMNFBWPFlfQmFnQmNrQmVvQWdyQ2l2RW16RnB9R3KARG99Qm17P2p4Tm94XnV4cn15eHpya2pkW1dSSkRAUUxIWVZTYmBeaWlocnR2e3+FgoiQgoiQVkI5VkI5Wkk/YlRJZ1xQa2ZaZGpjXW5rVnJ0XH2CZIeObpOcbZOeXoWQS3N/OWFtNFlkLU9YJ0VMJ0RLLk1TNVVcO1xjPF5mPGBqPWJtPmZyQWt4Qm58Q3GAQW18Pmp4PGZ0TWx0X3R2dX13fnxydXBna2JYYFNKYlhRZV5ZZ2VibGxsd3p+goePipKdipKdbltQbltQbVxSal9VaGFXZWRaXmhjWWtqU29zWHl/X4KKaI6YZ4+bW4SRTXeEP2l3OF9rMFJcKEZNJkNKK0pRMVBXNVVcN1hgOVtlOl5oPmNuQ2t2R3B9SnWCR3F+RG17QGl3TW11W3J1bXh0d3lxdXNqdGxicmZacmlhcW1pcXFxdHd6foOJiI+Yj5mjj5mjjXltjXlthHRqdW1kamZfXWFbWGRjVGdpT2pxU3R9WX2GYIiTYIuXWISRT3yKRXSCPWd0M1diKUdPJkJKKEZNK0lRLUxUMVFZNVVeOFliPmFqRmt1TXJ+UnqFTnWBSnJ+Rm56Tm53V3B0Y3JwbnRudnduf3puiX1uhX50gX98fICEfoWLh4+Xj5qilqKrlqKrq5iKq5iKm42BgHpza2xnVV5cUWFjT2NoS2ZvTm96U3eDWIGOWYaUVYSSUYGQTH6OQm59NltnKkhRJUFJJUJKJUNLJURLK0lRME9XNVRcPl5mSWt0UnV+W36IVXqEUXaBTHJ9T3B4VG5zWWxtZXBsdnpyi4d6oJWCmZOIkZKPiJCXiJOdkJull6Stnaq0naq0taOVtaOVo5aLhoF6bnBsVWBfUGFkTGJoR2NtSWt2TXN/UnyJVIKQU4KQUYKRUIKSR3OBO2BsME1XKkVOKEVNJkRMJENLKklRME9YNVRdP19nTGx0VnZ/X4CJWn2GVnqDUXaAUnJ6VG91VmtuYnBud313kY6CqqCNoJqPkpSShY2Vgo6Zi5ahk5+omaaumaausKCUsKCUoZaLiIR8dHZxXWhlU2RmSmJnQF9oQmVwRm14S3aDTn2KUH6MUYGOU4OQTXeDRWlyPVpiOFNaM1BXLU1VKUtTLlBZNFZgOFtlQmRtTm94WHeAYX+IXn6GW36GWHyEWHh/WXV6WnB0ZXR0eYF9lJKIrqOUnJaNhoaGcHZ+a3R/dX6IgImRiJGYiJGYrJ2TrJ2Tn5WMi4d/enx1ZnBrVmhoSWJmOVtjOmBqPmdyRHB8SXeETXuHUX+LVoSPU3uFT3F5S2dtRmBmPVtiNVZeLlJbM1hhOF5oPGJtRWl0UXJ7WniBY3+GYoCHYYGIX4OIXn6EXnp/XXV5Z3h7fIaEl5aPsaebmZKMenl5W19nVFpkYGZvbXN6d32Cd32CqJuSqJuSnpSMjYqCf4F5bXZwWGtqSGJlM1dfNFxmOWNuPmt3RXN/SniDUX6IWISNV3+GVnh+VXF1UWtwRmRrO15lMlhhNl5oO2NuPmhzR255U3R+XHmBZX+FZYKIZYSJZYeMY4OIYn+EX3l+aXyAfomJmZmUtKqglo+LcG5wSkxVQUVPT1NbXmFnaWxxaWxxqJuSqJuSnpSMjYqCf4F5bXZwWGtqSGJlM1dfNFxmOWNuPmt3RXN/SniDUX6IWISNV3+GVnh+VXF1UWtwRmRrO15lMlhhNl5oO2NuPmhzR255U3R+XHmBZX+FZYKIZYSJZYeMY4OIYn+EX3l+aXyAfomJmZmUtKqglo+LcG5wSkxVQUVPT1NbXmFnaWxxaWxx"; } } #endif f-spot-0.8.2/src/Clients/MainApp/DependentListStore.cs0000644000175000017500000000736511503404760023077 0ustar00rubenruben00000000000000/* * DependentListStore.cs * * Author(s) * Gabriel Burt * * This is free software. See COPYING for details. */ using Gtk; using Gdk; using System; public class DependentListStore : ListStore { private TreeModel parent = null; public TreeModel Parent { get { return parent; } set { if (parent != null) { parent.RowInserted -= HandleInserted; parent.RowDeleted -= HandleDeleted; parent.RowChanged -= HandleChanged; } parent = value; GLib.GType [] types = new GLib.GType[parent.NColumns]; for(int i = 0; i < parent.NColumns; i++) { types[i] = parent.GetColumnType(i); } this.ColumnTypes = types; Copy(parent, this); // Listen to the parent to mimick its changes parent.RowInserted += HandleInserted; parent.RowDeleted += HandleDeleted; parent.RowChanged += HandleChanged; } } public DependentListStore(TreeModel tree_model) { Parent = tree_model; } /* FIXME: triggering a recopy of the parent doesn't seem to be enough to * get the updated values from it -- at least in the particular case of F-Spot's tag selection widget's model */ private void HandleInserted(object sender, RowInsertedArgs args) { QueueUpdate(); } private void HandleDeleted(object sender, RowDeletedArgs args) { QueueUpdate(); } private void HandleChanged(object sender, RowChangedArgs args) { QueueUpdate(); } private uint timeout_id = 0; private void QueueUpdate() { if (timeout_id != 0) GLib.Source.Remove(timeout_id); timeout_id = GLib.Timeout.Add(1000, OnUpdateTimer); } private bool OnUpdateTimer() { timeout_id = 0; Copy(Parent, this); return false; } public static void Copy(TreeModel tree, ListStore list) { list.Clear(); TreeIter tree_iter; if (tree.IterChildren(out tree_iter)) { Copy(tree, tree_iter, list, true); } } public static void Copy(TreeModel tree, TreeIter tree_iter, ListStore list, bool first) { // Copy this iter's values to the list TreeIter list_iter = list.Append(); for (int i = 0; i < list.NColumns; i++) { list.SetValue(list_iter, i, tree.GetValue(tree_iter, i)); if (i == 1) { //Console.WriteLine("Copying {0}", list.GetValue(list_iter, i)); } } // Copy the first child, which will trigger the copy if its siblings (and their children) TreeIter child_iter; if (tree.IterChildren(out child_iter, tree_iter)) { Copy(tree, child_iter, list, true); } // Add siblings and their children if we are the first child, otherwise doing so would repeat if (first) { while (tree.IterNext(ref tree_iter)) { Copy(tree, tree_iter, list, false); } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Jobs/0000777000175000017500000000000011503407446020715 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot.Jobs/SyncMetadataJob.cs0000644000175000017500000000511611503404760024247 0ustar00rubenruben00000000000000/* * Jobs/SyncMetadataJob.cs * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using Banshee.Kernel; using Hyena; using FSpot.Core; using FSpot.Utils; using Mono.Unix; namespace FSpot.Jobs { public class SyncMetadataJob : Job { public SyncMetadataJob (uint id, string job_options, int run_at, JobPriority job_priority, bool persistent) : this (id, job_options, DateTimeUtil.ToDateTime (run_at), job_priority, persistent) { } public SyncMetadataJob (uint id, string job_options, DateTime run_at, JobPriority job_priority, bool persistent) : base (id, job_options, job_priority, run_at, persistent) { } //Use THIS static method to create a job... public static SyncMetadataJob Create (JobStore job_store, Photo photo) { return (SyncMetadataJob) job_store.CreatePersistent (typeof (FSpot.Jobs.SyncMetadataJob), photo.Id.ToString ()); } protected override bool Execute () { //this will add some more reactivity to the system System.Threading.Thread.Sleep (500); try { Photo photo = FSpot.App.Instance.Database.Photos.Get (Convert.ToUInt32 (JobOptions)) as Photo; if (photo == null) return false; Log.DebugFormat ("Syncing metadata to file ({0})...", photo.DefaultVersion.Uri); WriteMetadataToImage (photo); return true; } catch (System.Exception e) { Log.ErrorFormat ("Error syncing metadata to file\n{0}", e); } return false; } void WriteMetadataToImage (Photo photo) { Tag [] tags = photo.Tags; string [] names = new string [tags.Length]; for (int i = 0; i < tags.Length; i++) names [i] = tags [i].Name; using (var metadata = Metadata.Parse (photo.DefaultVersion.Uri)) { metadata.EnsureAvailableTags (); var tag = metadata.ImageTag; tag.DateTime = photo.Time; tag.Comment = photo.Description ?? String.Empty; tag.Keywords = names; tag.Rating = photo.Rating; tag.Software = Defines.PACKAGE + " version " + Defines.VERSION; var always_sidecar = Preferences.Get (Preferences.METADATA_ALWAYS_USE_SIDECAR); metadata.SaveSafely (photo.DefaultVersion.Uri, always_sidecar); } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Jobs/CalculateHashJob.cs0000644000175000017500000000266311503404760024377 0ustar00rubenruben00000000000000/* * Jobs/CalculateHashJob.cs * * Author(s) * Thomas Van Machelen * * This is free software. See COPYING for details. */ using System; using Banshee.Kernel; using Hyena; namespace FSpot.Jobs { public class CalculateHashJob : Job { public CalculateHashJob (uint id, string job_options, int run_at, JobPriority job_priority, bool persistent) : this (id, job_options, DateTimeUtil.ToDateTime (run_at), job_priority, persistent) { } public CalculateHashJob (uint id, string job_options, DateTime run_at, JobPriority job_priority, bool persistent) : base (id, job_options, job_priority, run_at, persistent) { } public static CalculateHashJob Create (JobStore job_store, uint photo_id) { return (CalculateHashJob) job_store.CreatePersistent (typeof(FSpot.Jobs.CalculateHashJob), photo_id.ToString ()); } protected override bool Execute () { //this will add some more reactivity to the system System.Threading.Thread.Sleep (200); uint photo_id = Convert.ToUInt32 (JobOptions); Log.DebugFormat ("Calculating Hash {0}...", photo_id); try { Photo photo = FSpot.App.Instance.Database.Photos.Get (Convert.ToUInt32 (photo_id)) as Photo; FSpot.App.Instance.Database.Photos.CalculateMD5Sum (photo); return true; } catch (System.Exception e) { Log.DebugFormat ("Error Calculating Hash for photo {0}: {1}", JobOptions, e.Message); } return false; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.addin.xml0000644000175000017500000000651711430555234021624 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Clients/MainApp/ThumbnailCommand.cs0000644000175000017500000000203611503404761022531 0ustar00rubenruben00000000000000using System; using Gtk; using FSpot; using FSpot.Core; using FSpot.Utils; using FSpot.UI.Dialog; public class ThumbnailCommand { private Gtk.Window parent_window; public ThumbnailCommand (Gtk.Window parent_window) { this.parent_window = parent_window; } public bool Execute (IPhoto [] photos) { ProgressDialog progress_dialog = null; var loader = ThumbnailLoader.Default; if (photos.Length > 1) { progress_dialog = new ProgressDialog (Mono.Unix.Catalog.GetString ("Updating Thumbnails"), ProgressDialog.CancelButtonType.Stop, photos.Length, parent_window); } int count = 0; foreach (IPhoto photo in photos) { if (progress_dialog != null && progress_dialog.Update (String.Format (Mono.Unix.Catalog.GetString ("Updating picture \"{0}\""), photo.Name))) break; foreach (IPhotoVersion version in photo.Versions) { loader.Request (version.Uri, ThumbnailSize.Large, 10); } count++; } if (progress_dialog != null) progress_dialog.Destroy (); return true; } } f-spot-0.8.2/src/Clients/MainApp/ui/0000777000175000017500000000000011503407450017376 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/ui/color_editor_prefs_window.ui0000644000175000017500000005254211431562107025214 0ustar00rubenruben00000000000000 True vertical True True True True 6 10 2 6 True True adjustment6 1 2 1 2 8 9 True True adjustment7 1 1 2 6 7 True True adjustment8 1 1 1 2 4 5 True True adjustment9 1 1 2 2 3 True True adjustment10 False 2 1 2 True True adjustment9 0 False right 2 3 4 True True adjustment8 False right 2 5 6 True True adjustment7 0 False right 2 7 8 True True adjustment6 2 False right 2 9 10 True True adjustment10 1 1 1 2 True 0 C_ontrast: True True center contrast_scale 8 9 True 0 _Hue: True True right hue_scale 6 7 True 0 _Brightness: True True right brightness_scale 4 5 True 0 _Saturation: True True sat_scale 2 3 True 0 _Exposure: True True exposure_scale True 0 <b>Co_rrections</b> True True False 0 True True True True 6 4 2 6 True True adjustment2 1 1 2 True True adjustment1 1 1 2 2 3 True True adjustment2 0 False 2 1 2 True True adjustment1 0 False 2 3 4 True 0 _Tint: True True temptint_scale 2 3 True 0 Te_mp: True True temp_scale True 0 <b>_White Balance</b> True True False 1 True False False 2 -150 150 1 12 5000 1000 25000 1 100 -1 1 0.0099999997764800008 0.0099999997764800008 -180 180 0.5 36 -100 100 1 1 -100 100 1 10 -4 4 0.10000000149 0.10000000149 f-spot-0.8.2/src/Clients/MainApp/ui/viewer_preferences.ui0000644000175000017500000003157011430555234023624 0ustar00rubenruben00000000000000 True Preferences dialog False True True True 0 none True 12 True _Interpolate image on zoom True True False True True True False False 0 True 0 12 <small><i>Enable this to allow interpolation on zoomed images. You shouldn't disable this for viewing photos, but disabling the interpolation could be usefull in icon design.</i></small> True True False False 12 1 True <b>Image Interpolation</b> True 0 True 0 none True 12 True As _background True True False True True True False False 0 As check _pattern True True False True True as_background_radio False False 1 True As _custom color: True True False True True as_background_radio False False 0 True True False False False 1 False False 2 True 0 12 <small><i>You can choose how to display transparent parts in images. This option has no effect on photos, but setting this as check pattern or custom color could be usefull when viewing icons or other artworks with transparent parts.</i></small> True True False False 12 3 True <b>Transparent Parts</b> True 3 1 True end gtk-close True True True False True False False 0 False end 0 button28 f-spot-0.8.2/src/Clients/MainApp/ui/single_view.ui0000644000175000017500000005051011430555234022250 0ustar00rubenruben00000000000000 True F-Spot View 640 480 True True True _Photo True _New Window True True True accelgroup1 gtk-open True True True accelgroup1 Open _Folder... True True True accelgroup1 True True _Export True True gtk-close True True True accelgroup1 True _Edit True Rotate _Left True True True accelgroup1 Rotate _Right True True True accelgroup1 True True Set as _Background True True gtk-preferences True True True accelgroup1 True _View True True _Slideshow True True _Fullscreen True True True Show or hide the toolbar _Toolbar True True Show or hide the side pane Side _pane True True Display File _Names True True True Zoom _in True True Zoom _out True True _Help True gtk-about True True True accelgroup1 False False 0 True False False 1 True True 189 True False True True True automatic automatic in True True 2 True True 0 True 1 True True True GDK_BUTTON_PRESS_MASK Zoom out True True view-far False False 0 100 True True adjustment1 False 1 True True GDK_BUTTON_PRESS_MASK Zoom in True True view-near False False 2 False False 6 2 False False 3 1 0.0099999997764800008 0.10000000149 0.10000000149 f-spot-0.8.2/src/Clients/MainApp/ui/import.ui0000644000175000017500000004046211430555234021254 0ustar00rubenruben00000000000000 Import True 664 dialog False True vertical True 6 vertical 6 True vertical 6 True 6 True Import _from: True sources_combo False False 0 True True False False 1 False False 0 True True 1 True True automatic automatic in False True True True automatic automatic in True True 1 True 0.02 False False 2 0 True 6 True 0 _Attach tags: True False 0 True 1 False 1 True 2 2 6 6 True _Detect duplicates True True False True True True C_opy files to the Photos folder True True False True True True 1 2 I_nclude subfolders True True False True True True 1 2 True 2 _Remove original files after import True True False True True 0 True 1 True True True True gtk-dialog-warning 1 False False 1 1 2 1 2 False 2 1 True end gtk-cancel True True True False True False False 0 True True True False True 0 0 True 2 True gtk-ok False False 0 True _Import True False False 1 False False 1 False end 0 cancel_button import_button f-spot-0.8.2/src/Clients/MainApp/ui/mail_dialog.ui0000644000175000017500000005523411430555234022206 0ustar00rubenruben00000000000000 True Create Mail dialog True vertical True 12 True 0 none True 12 200 True True automatic automatic in True <b>Photos</b> True 0 True vertical True 0 none True 12 True vertical True 3 3 2 20 3 Tiny True True False 320 px True True GTK_FILL Small True True False 480 px True True tiny_size 1 2 GTK_FILL Medium True True False 640 px True True tiny_size 2 3 GTK_FILL Large True True False 800 px True True tiny_size 1 2 GTK_FILL Extra large True True False 1024 px True True tiny_size 1 2 1 2 GTK_FILL Original True True False Original size (possible very large file size) True True tiny_size 1 2 2 3 GTK_FILL False False 0 True <b>Size</b> True 0 True 0 none True 3 12 True 3 2 3 3 True 0 Number of pictures right GTK_FILL True 0 Total original size right 1 2 GTK_FILL True 0 Estimated new size right 2 3 GTK_FILL True 0 1 2 GTK_FILL True 0 1 2 1 2 GTK_FILL True 0 1 2 2 3 GTK_FILL True <b>Summary</b> True 2 1 2 True end gtk-cancel True True True False Do not send a mail True False False 0 _Create Mail True True True False Create a mail with the selected photos (possibly resized) attached image1 True False False 1 False end 0 cancelbutton7 okbutton8 True gtk-apply f-spot-0.8.2/src/Clients/MainApp/ui/version_name_dialog.ui0000644000175000017500000001117411430555234023744 0ustar00rubenruben00000000000000 6 True True dialog False True vertical 2 True 6 True False False 0 200 True True 1 False 6 1 True 0 0 True <small> </small> True False 2 True end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False 2 end 0 cancel_button ok_button f-spot-0.8.2/src/Clients/MainApp/ui/main_window.ui0000644000175000017500000012527611430555234022264 0ustar00rubenruben00000000000000 1 0 0 0.10000000149 0 0.78461538461500002 file1 _Photo gtk-add new1 _Import... version_menu_item _Version create_version_menu_item Create _New Version... delete_version_menu_item _Delete Version rename_version_menu_item _Rename Version detach_version_menu_item De_tach Version export _Export to gtk-print print pagesetup_menu_item Page Set_up... send_mail Send by _Mail... gtk-close close1 _Close gtk-quit quit _Quit edit2 _Edit copy Copy select_all Select _All select_none Select _None select_invert _Invert Selection rotate_left Rotate _Left rotate_right Rotate _Right sharpen _Sharpen... adjust_time Adjust _Time... update_thumbnail Re_fresh Thumbnail delete_from_drive _Delete From Drive remove_from_catalog _Remove From Catalog set_as_background Set as _Background gtk-add attach_tag _Attach Tag gtk-remove remove_tag Rem_ove Tag gtk-preferences preferences3 extensions Manage _Extensions view1 _View slide_show _Slideshow fullscreen1 _Fullscreen thumbnails_elements_menu Thumbnail _elements True display_dates_menu_item _Dates True display_tags_menu_item T_ags True display_ratings_menu_item _Ratings components_menu _Components True display_sidebar Side_bar True display_timeline _Timeline True display_filmstrip _Filmstrip True display_toolbar Too_lbar gtk-zoom-in zoom_in Zoom _in gtk-zoom-out zoom_out Zoom _out loupe_menu_item _Loupe tag_icon_size _Tag Icons tag_icon_hidden _Hidden tag_icon_hidden tag_icon_small _Small tag_icon_hidden tag_icon_medium _Medium tag_icon_hidden tag_icon_large _Large arranged_by Arrange _by reverse_order _Reverse Order find Fin_d gtk-find find_by_tag gtk-add find_add_tag find_add_tag_with rate_submenu By _Rating set_rating_filter1 _Set Rating filter... clear_rating_filter _Clear Rating Filter date_submenu By _Date set_date_range1 _Set Date Range... clear_date_range _Clear Date Range rolls_submenu By _Import Roll last_roll _Last Import Roll select_rolls _Select Import Rolls... clear_roll_filter _Clear Roll Filter find_untagged _Untagged Photos tags1 _Tags create_new_category1 Create New _Tag... gtk-edit edit_selected_tag _Edit Tag... gtk-delete delete_selected_tag _Delete Selected Tag gtk-add attach_tag_to_selection _Attach Tag to Selection gtk-remove remove_tag_from_selection _Remove Tag From Selection tools _Tools help _Help gtk-help help1 _Contents gtk-about about1 F-Spot GTK_WIN_POS_CENTER True vertical True False False True vertical False False 1 True vertical True True 200 True vertical True vertical True vertical False 1 False True True vertical True False False True True GTK_POLICY_NEVER GTK_SHADOW_IN True Browse False False True 1 False True View 1 False False 1 2 1 True Tags: False False True vertical 1 True True GTK_RELIEF_NONE True gtk-close False False 2 False GTK_PACK_END 1 True True 2 True 142 True False False True 1 True True True GDK_BUTTON_PRESS_MASK Zoom out True True view-far False False 100 True True adjustment1 False 1 True True GDK_BUTTON_PRESS_MASK Zoom in True True view-near False False 2 False False 6 2 False False GTK_PACK_END 3 f-spot-0.8.2/src/Clients/MainApp/ui/tag_selection_dialog.ui0000644000175000017500000000636011430555234024100 0ustar00rubenruben00000000000000 300 300 True Select a Tag... dialog True vertical True True automatic automatic in 2 True end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False end 0 cancel_button ok_button f-spot-0.8.2/src/Clients/MainApp/ImageLoaderThread.cs0000644000175000017500000001613311503404761022613 0ustar00rubenruben00000000000000/* * ImageLoaderThread.cs * * Author(s): * Ettore Perazzoli * Larry Ewing * * This is free software. See COPYING for details */ using Gdk; using Gtk; using System.Collections; using System.Collections.Generic; using System.Threading; using System; using Hyena; using FSpot.Utils; using FSpot.Imaging; public class ImageLoaderThread { // Types. public class RequestItem { /* The uri to the image. */ public SafeUri Uri { get; set; } /* Order value; requests with a lower value get performed first. */ public int Order { get; set; } /* The pixbuf obtained from the operation. */ private Pixbuf result; public Pixbuf Result { get { if (result == null) return null; return result.ShallowCopy (); } set { result = value; } } /* the maximium size both must be greater than zero if either is */ public int Width { get; set; } public int Height { get; set; } public RequestItem (SafeUri uri, int order, int width, int height) { this.Uri = uri; this.Order = order; this.Width = width; this.Height = height; if ((width <= 0 && height > 0) || (height <= 0 && width > 0)) throw new System.Exception ("Invalid arguments"); } ~RequestItem () { if (result != null) result.Dispose (); result = null; } } // Private members. static List instances = new List (); /* The thread used to handle the requests. */ private Thread worker_thread; /* The request queue; it's shared between the threads so it needs to be locked prior to access. */ private ArrayList queue; /* A dict of all the requests; note that the current request isn't in the dict. */ Dictionary requests_by_uri; /* Current request. Request currently being handled by the auxiliary thread. Should be modified only by the auxiliary thread (the GTK thread can only read it). */ private RequestItem current_request; /* The queue of processed requests. */ private Queue processed_requests; /* This is used by the helper thread to notify the main GLib thread that there are pending items in the `processed_requests' queue. */ ThreadNotify pending_notify; /* Whether a notification is pending on `pending_notify' already or not. */ private bool pending_notify_notified; volatile bool should_cancel = false; // Public API. public delegate void PixbufLoadedHandler (ImageLoaderThread loader, RequestItem result); public event PixbufLoadedHandler OnPixbufLoaded; public ImageLoaderThread () { queue = new ArrayList (); requests_by_uri = new Dictionary (); // requests_by_path = Hashtable.Synchronized (new Hashtable ()); processed_requests = new Queue (); pending_notify = new ThreadNotify (new Gtk.ReadyEvent (HandleProcessedRequests)); instances.Add (this); } void StartWorker () { if (worker_thread != null) return; should_cancel = false; worker_thread = new Thread (new ThreadStart (WorkerThread)); worker_thread.Start (); } int block_count; public void PushBlock () { System.Threading.Interlocked.Increment (ref block_count); } public void PopBlock () { if (System.Threading.Interlocked.Decrement (ref block_count) == 0) { lock (queue) { Monitor.Pulse (queue); } } } public void Cleanup () { should_cancel = true; if (worker_thread != null) { lock (queue) { Monitor.Pulse (queue); } worker_thread.Join (); } worker_thread = null; } public static void CleanAll () { foreach (var thread in instances) thread.Cleanup (); } public void Request (SafeUri uri, int order) { Request (uri, order, 0, 0); } public virtual void Request (SafeUri uri, int order, int width, int height) { lock (queue) { if (InsertRequest (uri, order, width, height)) Monitor.Pulse (queue); } } public void Cancel (SafeUri uri) { lock (queue) { RequestItem r = requests_by_uri [uri]; if (r != null) { requests_by_uri.Remove (uri); queue.Remove (r); } } } // Private utility methods. protected virtual void ProcessRequest (RequestItem request) { Pixbuf orig_image; try { using (var img = ImageFile.Create (request.Uri)) { if (request.Width > 0) { orig_image = img.Load (request.Width, request.Height); } else { orig_image = img.Load (); } } } catch (GLib.GException e){ Log.Exception (e); return; } if (orig_image == null) return; request.Result = orig_image; } /* Insert the request in the queue, return TRUE if the queue actually grew. NOTE: Lock the queue before calling. */ private bool InsertRequest (SafeUri uri, int order, int width, int height) { StartWorker (); /* Check if this is the same as the request currently being processed. */ lock(processed_requests) { if (current_request != null && current_request.Uri == uri) return false; } /* Check if a request for this path has already been queued. */ RequestItem existing_request; if (requests_by_uri.TryGetValue (uri, out existing_request)) { /* FIXME: At least for now, this shouldn't happen. */ if (existing_request.Order != order) Log.WarningFormat ("BUG: Filing another request of order {0} (previously {1}) for `{2}'", order, existing_request.Order, uri); queue.Remove (existing_request); queue.Add (existing_request); return false; } /* New request, just put it on the queue with the right order. */ RequestItem new_request = new RequestItem (uri, order, width, height); queue.Add (new_request); lock (queue) { requests_by_uri.Add (uri, new_request); } return true; } /* The worker thread's main function. */ private void WorkerThread () { Log.Debug (this.ToString (), "Worker starting"); try { while (!should_cancel) { lock (processed_requests) { if (current_request != null) { processed_requests.Enqueue (current_request); if (! pending_notify_notified) { pending_notify.WakeupMain (); pending_notify_notified = true; } current_request = null; } } lock (queue) { while ((queue.Count == 0 || block_count > 0) && !should_cancel) Monitor.Wait (queue); if (should_cancel) return; int pos = queue.Count - 1; current_request = queue [pos] as RequestItem; queue.RemoveAt (pos); requests_by_uri.Remove (current_request.Uri); } ProcessRequest (current_request); } } catch (ThreadAbortException) { //Aborting } } protected virtual void EmitLoaded (Queue results) { if (OnPixbufLoaded != null) { foreach (RequestItem r in results) OnPixbufLoaded (this, r); } } private void HandleProcessedRequests () { Queue results; lock (processed_requests) { /* Copy the queued items out of the shared queue so we hold the lock for as little time as possible. */ results = processed_requests.Clone() as Queue; processed_requests.Clear (); pending_notify_notified = false; } EmitLoaded (results); } } f-spot-0.8.2/src/Clients/MainApp/PhotoVersionMenu.cs0000644000175000017500000000262611503404761022600 0ustar00rubenruben00000000000000 using Gtk; using System; using System.Collections.Generic; using FSpot; using FSpot.Core; public class PhotoVersionMenu : Menu { public IPhotoVersion Version { get; private set; } public delegate void VersionChangedHandler (PhotoVersionMenu menu); public event VersionChangedHandler VersionChanged; private Dictionary version_mapping; private void HandleMenuItemActivated (object sender, EventArgs args) { MenuItem item = sender as MenuItem; if (item != null && version_mapping.ContainsKey (item)) { Version = version_mapping [item]; VersionChanged (this); } } public PhotoVersionMenu (IPhoto photo) { Version = photo.DefaultVersion; version_mapping = new Dictionary (); foreach (IPhotoVersion version in photo.Versions) { MenuItem menu_item = new MenuItem (version.Name); menu_item.Show (); menu_item.Sensitive = true; Gtk.Label child = ((Gtk.Label) menu_item.Child); if (version == photo.DefaultVersion) { child.UseMarkup = true; child.Markup = String.Format ("{0}", version.Name); } version_mapping.Add (menu_item, version); Append (menu_item); } if (version_mapping.Count == 1) { MenuItem no_edits_menu_item = new MenuItem (Mono.Unix.Catalog.GetString ("(No Edits)")); no_edits_menu_item.Show (); no_edits_menu_item.Sensitive = false; Append (no_edits_menu_item); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Extensions/0000777000175000017500000000000011503407446022157 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot.Extensions/CommandMenuItemNode.cs0000644000175000017500000000104411503404760026325 0ustar00rubenruben00000000000000/* * FSpot.Extensions.CommandMenuItemNode * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. * */ using Mono.Addins; using System; namespace FSpot.Extensions { [ExtensionNode ("Command")] public class CommandMenuItemNode : MenuItemNode { [NodeAttribute ("command_type", true)] protected string command_type; protected override void OnActivated (object o, EventArgs e) { ICommand cmd = (ICommand) Addin.CreateInstance (command_type); cmd.Run (o, e); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Extensions/MenuNode.cs0000644000175000017500000000530511503404760024213 0ustar00rubenruben00000000000000/* * MenuNode.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details * */ using System; using Mono.Addins; using Mono.Unix; namespace FSpot.Extensions { [ExtensionNode ("Menu")] [ExtensionNodeChild (typeof (MenuItemNode))] [ExtensionNodeChild (typeof (ExportMenuItemNode))] [ExtensionNodeChild (typeof (CommandMenuItemNode))] [ExtensionNodeChild (typeof (MenuSeparatorNode))] [ExtensionNodeChild (typeof (SubmenuNode))] [ExtensionNodeChild (typeof (MenuGeneratorNode))] [ExtensionNodeChild (typeof (ComplexMenuItemNode))] public class SubmenuNode : MenuNode { public override Gtk.MenuItem GetMenuItem (object parent) { Gtk.MenuItem item = base.GetMenuItem (parent); Gtk.Menu submenu = GetSubmenu (parent); if (item.Submenu != null) item.Submenu.Dispose (); item.Submenu = submenu; return item; } public Gtk.Menu GetSubmenu () { return GetSubmenu (null); } public Gtk.Menu GetSubmenu (object parent) { Gtk.Menu submenu = new Gtk.Menu (); foreach (MenuNode node in ChildNodes) submenu.Insert (node.GetMenuItem (parent), -1); return submenu; } } [ExtensionNode ("MenuGenerator")] public class MenuGeneratorNode : MenuNode { [NodeAttribute ("generator_type", true)] protected string command_type; private IMenuGenerator menu_generator; public override Gtk.MenuItem GetMenuItem (object parent) { Gtk.MenuItem item = base.GetMenuItem (parent); menu_generator = (IMenuGenerator) Addin.CreateInstance (command_type); item.Submenu = menu_generator.GetMenu (); item.Activated += menu_generator.OnActivated; return item; } } [ExtensionNode ("MenuItem")] public class MenuItemNode : MenuNode { public override Gtk.MenuItem GetMenuItem (object parent) { Gtk.MenuItem item = base.GetMenuItem (parent); item.Activated += OnActivated; return item; } protected virtual void OnActivated (object o, EventArgs e) { } } [ExtensionNode ("MenuSeparator")] public class MenuSeparatorNode : MenuNode { public override Gtk.MenuItem GetMenuItem (object parent) { return new Gtk.SeparatorMenuItem (); } } public abstract class MenuNode : ExtensionNode { [NodeAttribute (Localizable=true)] protected string _label; [NodeAttribute] protected string icon; public virtual Gtk.MenuItem GetMenuItem (object parent) { Gtk.MenuItem item; if (icon == null) item = new Gtk.MenuItem (_label != null ? Catalog.GetString (_label) : Id); else { item = new Gtk.ImageMenuItem (_label != null ? Catalog.GetString (_label) : Id); (item as Gtk.ImageMenuItem).Image = Gtk.Image.NewFromIconName (icon, Gtk.IconSize.Menu); } return item; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Extensions/SidebarPage.cs0000644000175000017500000000327311503404760024651 0ustar00rubenruben00000000000000/* * Widgets.SidebarPage.cs * * Author(s) * Mike Gemuende * Stephane Delcroix * Ruben Vermeersch * * This is free software. See COPYING for details. */ using FSpot.Extensions; using FSpot.Utils; using Gtk; using Mono.Addins; using Mono.Unix; using System; using System.Collections.Generic; namespace FSpot.Extensions { public class SidebarPage { // The widget shown on the sidebar page. private readonly Widget widget; public Widget SidebarWidget { get { return widget; } } // Whether this page can be selected private bool can_select; public bool CanSelect { protected set { can_select = value; if (CanSelectChanged != null) CanSelectChanged (this, null); } get { return can_select; } } public event EventHandler CanSelectChanged; // The label of the sidebar page. private readonly string label; public string Label { get { return label; } } // The icon name, used for the selector private readonly string icon_name; public string IconName { get { return icon_name; } } // The sidebar onto which this page is attached private Gtk.Widget sidebar; public Gtk.Widget Sidebar { get { return sidebar; } set { sidebar = value; AddedToSidebar (); } } // Can be overriden to get notified as soon as we're added to a sidebar. protected virtual void AddedToSidebar () { } // // Whether this page is currently visible // public bool IsActive { // get { return Sidebar.IsActive (this); } // } public SidebarPage (Widget widget, string label, string icon_name) { this.widget = widget; this.label = label; this.icon_name = icon_name; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Extensions/ViewModeCondition.cs0000644000175000017500000000311711503404760026066 0ustar00rubenruben00000000000000/* * FSpot.Extensions.ViewModeCondition.cs * * Author(s) * Ruben Vermeersch * * This is free software. See COPYING for details. * */ using Mono.Addins; namespace FSpot.Extensions { public enum ViewMode { Unknown, Single, Library } // Defines a view mode condition, which determines which view mode is used. // // There are two valid values for the "mode" attribute, which // should be added to the Condition tag. // - single: Single view mode. // - library: Full F-Spot mode. // // This class contains a very nasty hack using a static initialization method // to keep track of the current view mode. This is (unfortunately) needed // because there is no way to get hold of a reference to the current window. public class ViewModeCondition : ConditionType { private delegate void ViewModeChangedHandler (); private static event ViewModeChangedHandler ViewModeChanged; private static ViewMode mode = ViewMode.Unknown; public static ViewMode Mode { get { return mode; } set { mode = value; if (ViewModeChanged != null) ViewModeChanged (); } } public ViewModeCondition () { ViewModeChanged += delegate { NotifyChanged (); }; } public override bool Evaluate (NodeElement conditionNode) { string val = conditionNode.GetAttribute ("mode"); if (val.Length > 0) { foreach (string mode in val.Split(',')) { if (mode == "single" && Mode == ViewMode.Single) { return true; } else if (mode == "library" && Mode == ViewMode.Library) { return true; } } } return false; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Extensions/SidebarPageNode.cs0000644000175000017500000000106311503404760025452 0ustar00rubenruben00000000000000/* * FSpot.Extensions.ServiceNode.cs * * Author(s): * Ruben Vermeersch * Stephane Delcroix * * Copyright (c) 2010 Stephane Delcroix * * This is free software. See COPYING for details. * */ using System; using Mono.Addins; namespace FSpot.Extensions { public class SidebarPageNode : ExtensionNode { [NodeAttribute (Required=true)] protected string sidebar_page_type; public SidebarPage GetPage () { return (SidebarPage) Addin.CreateInstance (sidebar_page_type); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Extensions/ServiceNode.cs0000644000175000017500000000150011503404760024700 0ustar00rubenruben00000000000000/* * FSpot.Extensions.ServiceNode.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details. * */ using System; using Mono.Addins; namespace FSpot.Extensions { public class ServiceNode : ExtensionNode { [NodeAttribute ("class", true)] protected string class_name; IService service = null; public void Initialize () { service = Addin.CreateInstance (class_name) as IService; } public bool Start () { if (service == null) throw new Exception ("Service not initialized. Call Initialize () prior to Start() or Stop()"); return service.Start (); } public bool Stop () { if (service == null) throw new Exception ("Service not initialized. Call Initialize () prior to Start() or Stop()"); return service.Stop (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Extensions/IExporter.cs0000644000175000017500000000046311503404760024422 0ustar00rubenruben00000000000000/* * IExporter.cs * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. * */ using Mono.Addins; using System; using FSpot.Core; namespace FSpot.Extensions { public interface IExporter { void Run (IBrowsableCollection selection); } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Extensions/ICommand.cs0000644000175000017500000000042311503404760024164 0ustar00rubenruben00000000000000/* * FSpot.Extensions.ICommand.cs * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. * */ using System; namespace FSpot.Extensions { public interface ICommand { void Run (object o, EventArgs e); } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Extensions/IService.cs0000644000175000017500000000037711503404760024216 0ustar00rubenruben00000000000000/* * FSpot.Extensions.IService.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details. */ namespace FSpot.Extensions { public interface IService { bool Start (); bool Stop (); } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Extensions/TransitionNode.cs0000644000175000017500000000123311503404760025435 0ustar00rubenruben00000000000000/* * FSpot.Extensions.TransitionNode.cs * * Author(s): * Stephane Delcroix * * Copyright (c) 2009 Novell, Inc. * * This is open source software. See COPYING for details. * */ using System; using Mono.Addins; using Gdk; using FSpot.Transitions; namespace FSpot.Extensions { public class TransitionNode : ExtensionNode { [NodeAttribute ("transition_type", true)] protected string class_name; SlideShowTransition transition = null; public SlideShowTransition Transition { get { if (transition == null) transition = Addin.CreateInstance (class_name) as SlideShowTransition; return transition; } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Extensions/IMenuGenerator.cs0000644000175000017500000000047011503404760025363 0ustar00rubenruben00000000000000/* * FSpot.Extensions.IMenuGenerator * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. * */ namespace FSpot.Extensions { public interface IMenuGenerator { Gtk.Menu GetMenu (); void OnActivated (object sender, System.EventArgs e); } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Extensions/ComplexMenuItemNode.cs0000644000175000017500000000171411503404760026362 0ustar00rubenruben00000000000000/* * FSpot.Extensions.ComplexMenuItemNode * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. * */ using Mono.Addins; using FSpot.Widgets; using System; using Hyena.Widgets; namespace FSpot.Extensions { [ExtensionNode ("ComplexMenuItem")] public class ComplexMenuItemNode : MenuNode { [NodeAttribute] protected string widget_type; [NodeAttribute] protected string command_type; ICommand cmd; public override Gtk.MenuItem GetMenuItem (object parent) { ComplexMenuItem item = System.Activator.CreateInstance (Type.GetType (widget_type), parent) as ComplexMenuItem; cmd = (ICommand) Addin.CreateInstance (command_type); if (item != null) item.Activated += OnActivated; return item; } private void OnActivated (object o, EventArgs e) { if (cmd != null) cmd.Run (o, e); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Extensions/PopupCommands.cs0000644000175000017500000000356011503404760025267 0ustar00rubenruben00000000000000/* * FSpot.Extensions.PopupCommands * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. * */ using System; using GLib; using FSpot.Widgets; namespace FSpot.Extensions { public class Copy : ICommand { public void Run (object o, EventArgs e) { App.Instance.Organizer.HandleCopy (o, e); } } public class Rotate270 : ICommand { public void Run (object o, EventArgs e) { App.Instance.Organizer.HandleRotate270Command (o, e); } } public class Rotate90 : ICommand { public void Run (object o, EventArgs e) { App.Instance.Organizer.HandleRotate90Command (o, e); } } public class Remove : ICommand { public void Run (object o, EventArgs e) { App.Instance.Organizer.HandleRemoveCommand (o, e); } } public class Delete : ICommand { public void Run (object o, EventArgs e) { App.Instance.Organizer.HandleDeleteCommand (o, e); } } public class OpenWith : IMenuGenerator { private Widgets.OpenWithMenu owm; public Gtk.Menu GetMenu () { owm = new Widgets.OpenWithMenu (App.Instance.Organizer.SelectedMimeTypes, "f-spot"); owm.ApplicationActivated += App.Instance.Organizer.HandleOpenWith; return (Gtk.Menu) owm; } public void OnActivated (object o, EventArgs e) { if (owm != null) owm.Populate (o, e); } } public class RemoveTag : IMenuGenerator { public Gtk.Menu GetMenu () { PhotoTagMenu tag_menu = new PhotoTagMenu (); tag_menu.TagSelected += App.Instance.Organizer.HandleRemoveTagMenuSelected; return (Gtk.Menu) tag_menu; } public void OnActivated (object o, EventArgs e) { App.Instance.Organizer.HandleTagMenuActivate (o, e); } } public class Rate : ICommand { public void Run (object o, EventArgs e) { App.Instance.Organizer.HandleRatingMenuSelected ((o as FSpot.Widgets.RatingMenuItem).Value); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Extensions/PhotoSelectionCondition.cs0000644000175000017500000000214211503404760027303 0ustar00rubenruben00000000000000/* * FSpot.Extensions.PhotoSelectionCondition.cs * * Author(s) * Ruben Vermeersch * * This is free software. See COPYING for details. * */ using Mono.Addins; namespace FSpot.Extensions { // Defines a selection condition, which determines the number of photos // selected. // // There are two valid values for the "selection" attribute, which // should be added to the Condition tag. // - single: One photo is selected // - multiple: Multiple photos are selected public class PhotoSelectionCondition : ConditionType { public PhotoSelectionCondition() { App.Instance.Organizer.Selection.Changed += delegate { NotifyChanged ();}; } public override bool Evaluate (NodeElement conditionNode) { int count = App.Instance.Organizer.Selection.Count; string val = conditionNode.GetAttribute ("selection"); if (val.Length > 0) { foreach (string selection in val.Split(',')) { if (selection == "multiple" && count > 1) { return true; } else if (selection == "single" && count == 1) { return true; } } } return false; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Extensions/ExportMenuItemNode.cs0000644000175000017500000000123311503404760026230 0ustar00rubenruben00000000000000/* * ExportMenuItemNode.cs * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. * */ using Mono.Addins; using System; using FSpot.Core; namespace FSpot.Extensions { public delegate PhotoList SelectedImages (); [ExtensionNode ("ExportMenuItem")] public class ExportMenuItemNode : MenuItemNode { [NodeAttribute ("class", true)] protected string class_name; public static SelectedImages SelectedImages; protected override void OnActivated (object o, EventArgs e) { IExporter exporter = (IExporter) Addin.CreateInstance (class_name); exporter.Run (SelectedImages ()); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Imaging/0000777000175000017500000000000011503407446021373 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot.Imaging/Tiff.cs0000644000175000017500000001274511503404760022613 0ustar00rubenruben00000000000000using FSpot; using FSpot.Utils; using System; using System.IO; using System.Collections.Generic; using Hyena; using TagLib; using TagLib.Image; using TagLib.IFD; using TagLib.IFD.Entries; using TagLib.IFD.Tags; namespace FSpot.Imaging { /* public Cms.Profile GetProfile () { Cms.ColorCIExyY whitepoint = new Cms.ColorCIExyY (0, 0, 0); Cms.ColorCIExyYTriple primaries = new Cms.ColorCIExyYTriple (whitepoint, whitepoint, whitepoint); Cms.GammaTable [] transfer = null; int bits_per_sample = 8; double gamma = 2.2; foreach (DirectoryEntry e in entries) { switch (e.Id) { case TagId.InterColorProfile: try { return new Cms.Profile (e.RawData); } catch (System.Exception ex) { Log.Exception (ex); } break; case TagId.ColorSpace: switch ((ColorSpace)e.ValueAsLong [0]) { case ColorSpace.StandardRGB: return Cms.Profile.CreateStandardRgb (); case ColorSpace.AdobeRGB: return Cms.Profile.CreateAlternateRgb (); case ColorSpace.Uncalibrated: Log.Debug ("Uncalibrated colorspace"); break; } break; case TagId.WhitePoint: Rational [] white = e.RationalValue; whitepoint.x = white [0].Value; whitepoint.y = white [1].Value; whitepoint.Y = 1.0; break; case TagId.PrimaryChromaticities: Rational [] colors = e.RationalValue; primaries.Red.x = colors [0].Value; primaries.Red.y = colors [1].Value; primaries.Red.Y = 1.0; primaries.Green.x = colors [2].Value; primaries.Green.y = colors [3].Value; primaries.Green.Y = 1.0; primaries.Blue.x = colors [4].Value; primaries.Blue.y = colors [5].Value; primaries.Blue.Y = 1.0; break; case TagId.TransferFunction: ushort [] trns = e.ShortValue; ushort gamma_count = (ushort) (1 << bits_per_sample); Cms.GammaTable [] tables = new Cms.GammaTable [3]; Log.DebugFormat ("Parsing transfer function: count = {0}", trns.Length); // FIXME we should use the TransferRange here // FIXME we should use bits per sample here for (int c = 0; c < 3; c++) { tables [c] = new Cms.GammaTable (trns, c * gamma_count, gamma_count); } transfer = tables; break; case TagId.ExifIfdPointer: SubdirectoryEntry exif = (SubdirectoryEntry) e; DirectoryEntry ee = exif.Directory [0].Lookup ((int)TagId.Gamma); if (ee == null) break; Rational rgamma = ee.RationalValue [0]; gamma = rgamma.Value; break; } } if (transfer == null) { Cms.GammaTable basic = new Cms.GammaTable (1 << bits_per_sample, gamma); transfer = new Cms.GammaTable [] { basic, basic, basic }; } // if we didn't get a white point or primaries, give up if (whitepoint.Y != 1.0 || primaries.Red.Y != 1.0) return null; return new Cms.Profile (whitepoint, primaries, transfer); } }*/ public class DngFile : BaseImageFile { uint offset; public DngFile (SafeUri uri) : base (uri) { } protected override void ExtractMetadata (TagLib.Image.File metadata) { base.ExtractMetadata (metadata); if (metadata == null) return; try { var tag = metadata.GetTag (TagTypes.TiffIFD) as IFDTag; var structure = tag.Structure; var sub_entries = (structure.GetEntry (0, (ushort) IFDEntryTag.SubIFDs) as SubIFDArrayEntry).Entries; var subimage_structure = sub_entries [sub_entries.Length - 1]; var entry = subimage_structure.GetEntry (0, (ushort) IFDEntryTag.StripOffsets); offset = (entry as StripOffsetsIFDEntry).Values [0]; } catch (Exception e) { Log.DebugException (e); } } public override System.IO.Stream PixbufStream () { try { System.IO.Stream file = base.PixbufStream (); file.Position = offset; return file; } catch { return DCRawFile.RawPixbufStream (Uri); } } } public class NefFile : BaseImageFile { byte [] jpeg_data; public NefFile (SafeUri uri) : base (uri) { } protected override void ExtractMetadata (TagLib.Image.File metadata) { base.ExtractMetadata (metadata); if (metadata == null) return; try { var tag = metadata.GetTag (TagTypes.TiffIFD) as IFDTag; var structure = tag.Structure; var SubImage1_structure = (structure.GetEntry (0, (ushort) IFDEntryTag.SubIFDs) as SubIFDArrayEntry).Entries [0]; var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.JPEGInterchangeFormat); jpeg_data = (entry as ThumbnailDataIFDEntry).Data.Data; } catch (Exception e) { Log.DebugException (e); jpeg_data = null; } } public override System.IO.Stream PixbufStream () { if (jpeg_data != null) { return new MemoryStream (jpeg_data); } else { return DCRawFile.RawPixbufStream (Uri); } } } public class Cr2File : BaseImageFile { uint offset; public Cr2File (SafeUri uri) : base (uri) { } protected override void ExtractMetadata (TagLib.Image.File metadata) { base.ExtractMetadata (metadata); if (metadata == null) return; try { var tag = metadata.GetTag (TagTypes.TiffIFD) as IFDTag; var structure = tag.Structure; var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripOffsets); offset = (entry as StripOffsetsIFDEntry).Values [0]; } catch (Exception e) { Log.DebugException (e); } } public override System.IO.Stream PixbufStream () { System.IO.Stream file = base.PixbufStream (); file.Position = offset; return file; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Imaging/DCRawFile.cs0000644000175000017500000000126611503404760023457 0ustar00rubenruben00000000000000using System.Diagnostics; using System.IO; using System; using Hyena; namespace FSpot.Imaging { public class DCRawFile : BaseImageFile { const string dcraw_command = "dcraw"; public DCRawFile (SafeUri uri) : base (uri) { } public override System.IO.Stream PixbufStream () { return RawPixbufStream (Uri); } internal static System.IO.Stream RawPixbufStream (SafeUri location) { string path = location.LocalPath; string [] args = new string [] { dcraw_command, "-h", "-w", "-c", "-t", "0", path }; InternalProcess proc = new InternalProcess (System.IO.Path.GetDirectoryName (path), args); proc.StandardInput.Close (); return proc.StandardOutput; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Imaging/ImageFile.cs0000644000175000017500000002041211503404760023533 0ustar00rubenruben00000000000000using Hyena; using System; using System.IO; using System.Collections.Generic; using FSpot.Utils; using Mono.Unix; using Mono.Unix.Native; using Gdk; using GLib; using TagLib.Image; using GFileInfo = GLib.FileInfo; namespace FSpot.Imaging { public class ImageFormatException : ApplicationException { public ImageFormatException (string msg) : base (msg) { } } public static class ImageFile { #region Factory functionality static Dictionary name_table; internal static Dictionary NameTable { get { return name_table; } } static ImageFile () { var base_type = typeof (BaseImageFile); var raw_type = typeof (DCRawFile); var nef_type = typeof (FSpot.Imaging.NefFile); name_table = new Dictionary (); // Plain image files name_table ["image/gif"] = name_table [".gif"] = base_type; name_table ["image/x-pcx"] = name_table [".pcx"] = base_type; name_table ["image/x-portable-anymap"] = name_table [".pnm"] = base_type; name_table ["image/x-portable-bitmap"] = name_table [".pbm"] = base_type; name_table ["image/x-portable-graymap"] = name_table [".pgm"] = base_type; name_table ["image/x-portable-pixmap"] = name_table [".ppm"] = base_type; name_table ["image/x-bmp"] = name_table ["image/x-MS-bmp"] = name_table [".bmp"] = base_type; name_table ["image/jpeg"] = name_table [".jfi"] = name_table [".jfif"] = name_table [".jif"] = name_table [".jpe"] = name_table [".jpeg"] = name_table [".jpg"] = base_type; name_table ["image/png"] = name_table [".png"] = base_type; name_table ["image/tiff"] = name_table [".tif"] = name_table [".tiff"] = base_type; name_table ["image/svg+xml"] = name_table [".svg"] = name_table [".svgz"] = base_type; // RAW files name_table ["image/arw"] = name_table ["image/x-sony-arw"] = name_table [".arw"] = nef_type; name_table ["image/cr2"] = name_table ["image/x-canon-cr2"] = name_table [".cr2"] = typeof (FSpot.Imaging.Cr2File); name_table ["image/dng"] = name_table ["image/x-adobe-dng"] = name_table [".dng"] = typeof (FSpot.Imaging.DngFile); name_table ["image/nef"] = name_table ["image/x-nikon-nef"] = name_table [".nef"] = nef_type; name_table ["image/rw2"] = name_table ["image/x-raw"] = name_table [".rw2"] = raw_type; name_table ["image/pef"] = name_table ["image/x-pentax-pef"] = name_table [".pef"] = nef_type; name_table ["image/raw"] = name_table ["image/x-panasonic-raw"] = name_table [".raw"] = nef_type; // Other types (FIXME: Currently unsupported by Taglib#, this list should shrink). name_table [".kdc"] = typeof (FSpot.Imaging.NefFile); name_table [".rw2"] = typeof (FSpot.Imaging.DCRawFile); name_table [".orf"] = typeof (FSpot.Imaging.NefFile); name_table [".srf"] = typeof (FSpot.Imaging.NefFile); name_table [".crw"] = typeof (FSpot.Imaging.Ciff.CiffFile); name_table [".mrw"] = typeof (FSpot.Imaging.DCRawFile); name_table [".raf"] = typeof (FSpot.Imaging.RafFile); name_table [".x3f"] = typeof (FSpot.Imaging.DCRawFile); name_table ["image/x-ciff"] = name_table [".crw"]; name_table ["image/x-mrw"] = name_table [".mrw"]; name_table ["image/x-x3f"] = name_table [".x3f"]; name_table ["image/x-orf"] = name_table [".orf"]; name_table ["image/x-raf"] = name_table [".raf"]; // as xcf pixbufloader is not part of gdk-pixbuf, check if it's there, // and enable it if needed. foreach (Gdk.PixbufFormat format in Gdk.Pixbuf.Formats) { if (format.Name == "xcf") { if (format.IsDisabled) format.SetDisabled (false); name_table [".xcf"] = base_type; } } } public static bool HasLoader (SafeUri uri) { return GetLoaderType (uri) != null; } static Type GetLoaderType (SafeUri uri) { // check if GIO can find the file, which is not the case // with filenames with invalid encoding var file = GLib.FileFactory.NewForUri (uri); if (!file.Exists) { return null; } var extension = uri.GetExtension ().ToLower (); if (extension == ".thm") { // Ignore video thumbnails. return null; } // Detect mime-type var info = file.QueryInfo ("standard::content-type,standard::size", FileQueryInfoFlags.None, null); var mime = info.ContentType; var size = info.Size; if (size == 0) { // Empty file return null; } Type t = null; if (name_table.TryGetValue (mime, out t)) { return t; } else if (name_table.TryGetValue (extension, out t)) { return t; } return null; } public static IImageFile Create (SafeUri uri) { var t = GetLoaderType (uri); if (t == null) throw new Exception (String.Format ("Unsupported image: {0}", uri)); try { return (IImageFile) System.Activator.CreateInstance (t, new object[] { uri }); } catch (Exception e) { Hyena.Log.DebugException (e); throw e; } } public static bool IsRaw (SafeUri uri) { string [] raw_extensions = { ".arw", ".crw", ".cr2", ".dng", ".mrw", ".nef", ".orf", ".pef", ".raw", ".raf", ".rw2", }; var extension = uri.GetExtension ().ToLower (); foreach (string ext in raw_extensions) if (ext == extension) return true; return false; } public static bool IsJpeg (SafeUri uri) { string [] jpg_extensions = {".jpg", ".jpeg"}; var extension = uri.GetExtension ().ToLower (); foreach (string ext in jpg_extensions) if (ext == extension) return true; return false; } #endregion } public interface IImageFile : IDisposable { SafeUri Uri { get; } Gdk.Pixbuf Load (); Cms.Profile GetProfile (); Gdk.Pixbuf Load (int max_width, int max_height); Stream PixbufStream (); ImageOrientation Orientation { get; } } public class BaseImageFile : IImageFile { public SafeUri Uri { get; private set; } public ImageOrientation Orientation { get; private set; } public BaseImageFile (SafeUri uri) { Uri = uri; Orientation = ImageOrientation.TopLeft; using (var metadata_file = Metadata.Parse (uri)) { ExtractMetadata (metadata_file); } } protected virtual void ExtractMetadata (TagLib.Image.File metadata) { if (metadata != null) { Orientation = metadata.ImageTag.Orientation; } } ~BaseImageFile () { Dispose (); } public virtual Stream PixbufStream () { Hyena.Log.DebugFormat ("open uri = {0}", Uri.ToString ()); return new GLib.GioStream (GLib.FileFactory.NewForUri (Uri).Read (null)); } protected Gdk.Pixbuf TransformAndDispose (Gdk.Pixbuf orig) { if (orig == null) return null; Gdk.Pixbuf rotated = FSpot.Utils.PixbufUtils.TransformOrientation (orig, this.Orientation); orig.Dispose (); return rotated; } public Gdk.Pixbuf Load () { using (Stream stream = PixbufStream ()) { Gdk.Pixbuf orig = new Gdk.Pixbuf (stream); return TransformAndDispose (orig); } } public Gdk.Pixbuf Load (int max_width, int max_height) { Gdk.Pixbuf full = this.Load (); Gdk.Pixbuf scaled = PixbufUtils.ScaleToMaxSize (full, max_width, max_height); full.Dispose (); return scaled; } // FIXME this need to have an intent just like the loading stuff. public virtual Cms.Profile GetProfile () { return null; } public void Dispose () { Close (); System.GC.SuppressFinalize (this); } protected virtual void Close () { } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Imaging/Tests/0000777000175000017500000000000011503407446022475 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot.Imaging/Tests/ImageFileTests.cs0000644000175000017500000000344111503404760025663 0ustar00rubenruben00000000000000#if ENABLE_TESTS using NUnit.Framework; using System; using Hyena; namespace FSpot.Imaging.Tests { [TestFixture] public class ImageFileTests { [SetUp] public void Initialize () { GLib.GType.Init (); } [Test] public void CheckLoadableTypes () { bool missing = false; // Test that we have loaders defined for all Taglib# parseable types. foreach (var key in TagLib.FileTypes.AvailableTypes.Keys) { Type type = TagLib.FileTypes.AvailableTypes [key]; if (!type.IsSubclassOf (typeof (TagLib.Image.File))) { continue; } var test_key = key; if (key.StartsWith ("taglib/")) { test_key = "." + key.Substring (7); } if (!ImageFile.NameTable.ContainsKey (test_key)) { Log.InformationFormat ("Missing key for {0}", test_key); missing = true; } } Assert.IsFalse (missing, "No missing loaders for Taglib# parseable files."); } [Test] public void CheckTaglibSupport () { bool missing = false; foreach (var key in ImageFile.NameTable.Keys) { string type = key; if (type.StartsWith (".")) type = String.Format ("taglib/{0}", type.Substring (1)); if (!TagLib.FileTypes.AvailableTypes.ContainsKey (type)) { Log.InformationFormat ("Missing type support in Taglib# for {0}", type); missing = true; } } Assert.IsFalse (missing, "No missing type support in Taglib#."); } } } #endif f-spot-0.8.2/src/Clients/MainApp/FSpot.Imaging/Ciff.cs0000644000175000017500000000723011503404760022563 0ustar00rubenruben00000000000000using System; using FSpot.Utils; using Hyena; using TagLib.Image; namespace FSpot.Imaging.Ciff { internal enum Tag { JpgFromRaw = 0x2007, } public enum EntryType : ushort { Byte = 0x0000, Ascii = 0x0800, Short = 0x1000, Int = 0x1800, Struct = 0x2000, Directory1 = 0x2800, Directory2 = 0x2800, } public enum Mask { Type = 0x3800, } /* See http://www.sno.phy.queensu.ca/~phil/exiftool/canon_raw.html */ internal struct Entry { internal Tag Tag; internal uint Size; internal uint Offset; public Entry (byte [] data, int pos, bool little) { Tag = (Tag) BitConverter.ToUInt16 (data, pos, little); Size = BitConverter.ToUInt32 (data, pos + 2, little); Offset = BitConverter.ToUInt32 (data, pos + 6, little); } } class ImageDirectory { System.Collections.ArrayList entry_list; uint Count; bool little; uint start; long DirPosition; System.IO.Stream stream; public ImageDirectory (System.IO.Stream stream, uint start, long end, bool little) { this.start = start; this.little = little; this.stream = stream; entry_list = new System.Collections.ArrayList (); stream.Position = end - 4; byte [] buf = new byte [10]; stream.Read (buf, 0, 4); uint directory_pos = BitConverter.ToUInt32 (buf, 0, little); DirPosition = start + directory_pos; stream.Position = DirPosition; stream.Read (buf, 0, 2); Count = BitConverter.ToUInt16 (buf, 0, little); for (int i = 0; i < Count; i++) { stream.Read (buf, 0, 10); Log.DebugFormat ("reading {0} {1}", i, stream.Position); Entry entry = new Entry (buf, 0, little); entry_list.Add (entry); } } public ImageDirectory ReadDirectory (Tag tag) { foreach (Entry e in entry_list) { if (e.Tag == tag) { uint subdir_start = this.start + e.Offset; ImageDirectory subdir = new ImageDirectory (stream, subdir_start, subdir_start + e.Size, little); return subdir; } } return null; } public byte [] ReadEntry (int pos) { Entry e = (Entry) entry_list [pos]; stream.Position = this.start + e.Offset; byte [] data = new byte [e.Size]; stream.Read (data, 0, data.Length); return data; } public byte [] ReadEntry (Tag tag) { int pos = 0; foreach (Entry e in entry_list) { if (e.Tag == tag) return ReadEntry (pos); pos++; } return null; } } public class CiffFile : BaseImageFile { ImageDirectory root; bool little; System.IO.Stream stream; ImageDirectory Root { get { if (root == null) { stream = base.PixbufStream (); root = Load (stream); } return root; } } public CiffFile (SafeUri uri) : base (uri) { } private ImageDirectory Load (System.IO.Stream stream) { byte [] header = new byte [26]; // the spec reserves the first 26 bytes as the header block stream.Read (header, 0, header.Length); uint start; little = (header [0] == 'I' && header [1] == 'I'); start = BitConverter.ToUInt32 (header, 2, little); // HEAP is the type CCDR is the subtype if (System.Text.Encoding.ASCII.GetString (header, 6, 8) != "HEAPCCDR") throw new ImageFormatException ("Invalid Ciff Header Block"); long end = stream.Length; return new ImageDirectory (stream, start, end, little); } public override System.IO.Stream PixbufStream () { byte [] data = GetEmbeddedJpeg (); if (data != null) return new System.IO.MemoryStream (data); else return DCRawFile.RawPixbufStream (Uri); } private byte [] GetEmbeddedJpeg () { return Root.ReadEntry (Tag.JpgFromRaw); } protected override void Close () { if (stream != null) { stream.Close (); stream = null; } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Imaging/IOChannel.cs0000644000175000017500000001435611503404760023523 0ustar00rubenruben00000000000000using System; using System.IO; using System.Runtime.InteropServices; using GLib; using Hyena; namespace FSpot.Imaging { [Flags] public enum IOFlags { Append = 1, Nonblock = 1 << 1, Readable = 1 << 2, Writable = 1 << 3, Seekable = 1 << 4 } public enum IOStatus { Error, Normal, Eof, Again } public enum IOCondition { // FIXME these are system dependent and I'm hardcoding them because I don't // want to write glue today. If you are debugging image loading and get // to this point and find that that your problem is my fault, well... we all // have bad days. In = 1, Out = 4, Priority = 2, Error = 8, HungUp = 16, Invalid = 32 } public class DataReadEventArgs : EventArgs { public bool Continue; IOCondition condition; public IOCondition Condition { get { return condition; } } public DataReadEventArgs (IOCondition condition) { this.condition = condition; Continue = true; } } public class IOChannel : System.IO.Stream { private HandleRef handle; private delegate bool IOFunc (IntPtr source_channel, IOCondition cond, IntPtr data); [DllImport("libglib-2.0-0.dll")] static extern IOFlags g_io_channel_get_flags (HandleRef channel); public override bool CanRead { get { IOFlags flags = g_io_channel_get_flags (handle); return (flags & IOFlags.Readable) == IOFlags.Readable; } } public override bool CanSeek { get { #if NOTDONE IOFlags flags = g_io_channel_get_flags (handle); return (flags & IOFlags.Seekable) == IOFlags.Seekable; #else return false; #endif } } public override bool CanWrite { get { IOFlags flags = g_io_channel_get_flags (handle); return (flags & IOFlags.Writable) == IOFlags.Writable; } } public override long Length { get { throw new NotSupportedException ("IOChannel doesn't support seeking"); } } public override long Position { get { throw new NotSupportedException ("IOChannel doesn't support seeking"); } set { throw new NotSupportedException ("IOChannel doesn't support seeking"); } } [DllImport("libglib-2.0-0.dll")] static extern IntPtr g_io_channel_unix_new (int fd); [DllImport("libglib-2.0-0.dll")] static extern IOStatus g_io_channel_set_encoding (HandleRef handle, string encoding, out IntPtr error); public IOChannel (int fd) { IntPtr raw = g_io_channel_unix_new (fd); handle = new HandleRef (this, raw); IntPtr error; g_io_channel_set_encoding (handle, null, out error); if (error != IntPtr.Zero) throw new GException (error); } [DllImport("libglib-2.0-0.dll")] static extern IOStatus g_io_channel_flush (HandleRef channel, out IntPtr error); public override void Flush () { IOStatus status; IntPtr error; status = g_io_channel_flush (handle, out error); if (status != IOStatus.Normal && status != IOStatus.Eof) Hyena.Log.DebugFormat ("IOChannel status = {0}", status); if (error != IntPtr.Zero) throw new GException (error); } [DllImport("libglib-2.0-0.dll")] static extern unsafe IOStatus g_io_channel_write_chars (HandleRef channel, byte *data, int count, out int bytes_written, out IntPtr error); public override void Write (byte [] buffer, int offset, int count) { IOStatus status = IOStatus.Again; IntPtr error; int written; if (buffer == null) throw new ArgumentNullException (); unsafe { while (status == IOStatus.Again && count > 0) { fixed (byte *data = &buffer [offset]) { status = g_io_channel_write_chars (handle, data, count, out written, out error); } if (error != IntPtr.Zero) throw new GException (error); offset += written; count -= written; } } } [DllImport("libglib-2.0-0.dll")] static unsafe extern IOStatus g_io_channel_read_chars (HandleRef channel, byte *data, int count, out int bytes_read, out IntPtr error); public override int Read (byte [] buffer, int offset, int count) { int read; IOStatus status; IntPtr error; unsafe { fixed (byte *data = &buffer[offset]) { status = g_io_channel_read_chars (handle, data, count, out read, out error); } } if (status != IOStatus.Normal && status != IOStatus.Eof) Hyena.Log.DebugFormat ("IOChannel status = {0}", status); if (error != IntPtr.Zero) throw new GException (error); return (int)read; } [DllImport("libglib-2.0-0.dll")] static extern uint g_io_add_watch (HandleRef handle, IOCondition cond, IOFunc func, IntPtr data); private uint AddWatch (IOCondition condition, IOFunc func) { return g_io_add_watch (handle, condition, func, IntPtr.Zero); } // FIXME this should hold more than one source in a table // but I am lazy uint data_ready_source; private EventHandler data_ready; private IOFunc func; public event EventHandler DataReady { add { data_ready += value; func = new IOFunc (DataReadyHandler); data_ready_source = AddWatch (IOCondition.In, func); } remove { GLib.Source.Remove (data_ready_source); data_ready_source = 0; data_ready -= value; } } private bool DataReadyHandler (IntPtr channel, IOCondition condition, IntPtr data) { DataReadEventArgs args = new DataReadEventArgs (condition); if (data_ready != null) data_ready (this, args); return args.Continue; } public override void SetLength (long length) { throw new NotSupportedException (); } private enum SeekType { Current, Set, End } public override long Seek (long position, SeekOrigin origin) { throw new NotSupportedException (); } [DllImport("libglib-2.0-0.dll")] static extern IOStatus g_io_channel_shutdown (HandleRef handle, bool flush, out IntPtr error); [DllImport("libglib-2.0-0.dll")] static extern void g_io_channel_unref (HandleRef handle); public override void Close () { IntPtr error; if (data_ready_source != 0) GLib.Source.Remove (data_ready_source); data_ready_source = 0; g_io_channel_shutdown (handle, false, out error); base.Close (); if (error != IntPtr.Zero) throw new GException (error); } ~IOChannel () { if (data_ready_source != 0) GLib.Source.Remove (data_ready_source); data_ready_source = 0; g_io_channel_unref (handle); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Imaging/InternalProcess.cs0000644000175000017500000000325211503404760025027 0ustar00rubenruben00000000000000using System; using System.IO; using System.Runtime.InteropServices; using GLib; namespace FSpot.Imaging { [Flags] internal enum InternalProcessFlags { LeaveDescriptorsOpen = 1 << 0, DoNotReapChild = 1 << 1, SearchPath = 1 << 2, StandardOutputToDevNull = 1 << 3, StandardErrorToDevNull = 1 << 4, ChildInheritsStandardInput = 1 << 5, FileAndArgvZero = 1 << 6 } internal class InternalProcess { int stdin; int stdout; IOChannel input; IOChannel output; public IOChannel StandardInput { get { return input; } } public IOChannel StandardOutput { get { return output; } } [DllImport("libglib-2.0-0.dll")] static extern bool g_spawn_async_with_pipes (string working_dir, string [] argv, string [] envp, InternalProcessFlags flags, IntPtr child_setup, IntPtr child_data, IntPtr pid, ref int stdin, ref int stdout, IntPtr err, //ref int stderr, out IntPtr error); public InternalProcess (string path, string [] args) { IntPtr error; if (args[args.Length -1] != null) { string [] nargs = new string [args.Length + 1]; Array.Copy (args, nargs, args.Length); args = nargs; } g_spawn_async_with_pipes (path, args, null, InternalProcessFlags.SearchPath, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, ref stdin, ref stdout, IntPtr.Zero, out error); if (error != IntPtr.Zero) throw new GException (error); input = new IOChannel (stdin); output = new IOChannel (stdout); //errorput = new IOChannel (stderr); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Imaging/RafFile.cs0000644000175000017500000000337511503404760023232 0ustar00rubenruben00000000000000using FSpot.Utils; using Hyena; using TagLib.Image; namespace FSpot.Imaging { // This is reverse engineered from looking at the sample files I have // from what I can tell the file is always BigEndian, although the embedded jpeg may not be // and there is a start long offset at 0x54 (or possibly 0x56 if it is a short) that points to // the start of the embedded jpeg and followed by a long length that gives the length of the jpeg // data. // // Following that there seem to be more offsets and lengths (probably for the raw data) that I haven't // completely figured out yet. More to follow. // ALL the sample files I have begin with "FUJIFILMCCD-RAW " public class RafFile : BaseImageFile { public RafFile (SafeUri uri) : base (uri) { } public override System.IO.Stream PixbufStream () { byte [] data = GetEmbeddedJpeg (); if (data != null) return new System.IO.MemoryStream (data); else return DCRawFile.RawPixbufStream (Uri); } private byte [] GetEmbeddedJpeg () { using (System.IO.Stream stream = base.PixbufStream ()) { stream.Position = 0x54; byte [] data = new byte [24]; stream.Read (data, 0, data.Length); uint jpeg_offset = BitConverter.ToUInt32 (data, 0, false); uint jpeg_length = BitConverter.ToUInt32 (data, 4, false); // FIXME implement wb parsing //uint wb_offset = BitConverter.ToUInt32 (data, 8, false); //uint wb_length = BitConverter.ToUInt32 (data, 12, false); // FIXME implement decoding //uint raw_offset = BitConverter.ToUInt32 (data, 16, false); //uint raw_length = BitConverter.ToUInt32 (data, 20, false); byte [] image = new byte [jpeg_length]; stream.Position = jpeg_offset; stream.Read (image, 0, image.Length); return image; } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Import/0000777000175000017500000000000011503407446021272 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot.Import/ImportController.cs0000644000175000017500000003720411503404760025135 0ustar00rubenruben00000000000000using Hyena; using FSpot.Core; using FSpot.Utils; using System; using System.Collections.Generic; using System.Threading; using Mono.Unix; namespace FSpot.Import { public enum ImportEvent { SourceChanged, PhotoScanStarted, PhotoScanFinished, ImportStarted, ImportFinished, ImportError } public class ImportController { public BrowsableCollectionProxy Photos { get; private set; } public ImportController (bool persist_preferences) { // This flag determines whether or not the chosen options will be // saved. You don't want to overwrite user preferences when running // headless. this.persist_preferences = persist_preferences; Photos = new BrowsableCollectionProxy (); FailedImports = new List (); LoadPreferences (); } ~ImportController () { DeactivateSource (ActiveSource); } #region Import Preferences private bool persist_preferences = false; private bool copy_files = true; private bool remove_originals = false; private bool recurse_subdirectories = true; private bool duplicate_detect = true; public bool CopyFiles { get { return copy_files; } set { copy_files = value; SavePreferences (); } } public bool RemoveOriginals { get { return remove_originals; } set { remove_originals = value; SavePreferences (); } } public bool RecurseSubdirectories { get { return recurse_subdirectories; } set { if (recurse_subdirectories == value) return; recurse_subdirectories = value; SavePreferences (); RescanPhotos (); } } public bool DuplicateDetect { get { return duplicate_detect; } set { duplicate_detect = value; SavePreferences (); } } void LoadPreferences () { if (!persist_preferences) return; copy_files = Preferences.Get (Preferences.IMPORT_COPY_FILES); recurse_subdirectories = Preferences.Get (Preferences.IMPORT_INCLUDE_SUBFOLDERS); duplicate_detect = Preferences.Get (Preferences.IMPORT_CHECK_DUPLICATES); remove_originals = Preferences.Get (Preferences.IMPORT_REMOVE_ORIGINALS); } void SavePreferences () { if (!persist_preferences) return; Preferences.Set(Preferences.IMPORT_COPY_FILES, copy_files); Preferences.Set(Preferences.IMPORT_INCLUDE_SUBFOLDERS, recurse_subdirectories); Preferences.Set(Preferences.IMPORT_CHECK_DUPLICATES, duplicate_detect); Preferences.Set(Preferences.IMPORT_REMOVE_ORIGINALS, remove_originals); } #endregion #region Source Scanning private List sources; public List Sources { get { if (sources == null) sources = ScanSources (); return sources; } } List ScanSources () { var monitor = GLib.VolumeMonitor.Default; var sources = new List (); foreach (var mount in monitor.Mounts) { var root = new SafeUri (mount.Root.Uri, true); var themed_icon = (mount.Icon as GLib.ThemedIcon); if (themed_icon != null && themed_icon.Names.Length > 0) { sources.Add (new FileImportSource (root, mount.Name, themed_icon.Names [0])); } else { sources.Add (new FileImportSource (root, mount.Name, null)); } } return sources; } #endregion #region Status Reporting public delegate void ImportProgressHandler (int current, int total); public event ImportProgressHandler ProgressUpdated; public delegate void ImportEventHandler (ImportEvent evnt); public event ImportEventHandler StatusEvent; void FireEvent (ImportEvent evnt) { ThreadAssist.ProxyToMain (() => { var h = StatusEvent; if (h != null) h (evnt); }); } void ReportProgress (int current, int total) { var h = ProgressUpdated; if (h != null) h (current, total); } public int PhotosImported { get; private set; } public Roll CreatedRoll { get; private set; } public List FailedImports { get; private set; } #endregion #region Source Switching private ImportSource active_source; public ImportSource ActiveSource { set { if (value == active_source) return; var old_source = active_source; active_source = value; FireEvent (ImportEvent.SourceChanged); RescanPhotos (); DeactivateSource (old_source); } get { return active_source; } } void DeactivateSource (ImportSource source) { if (source == null) return; source.Deactivate (); } void RescanPhotos () { if (ActiveSource == null) return; photo_scan_running = true; PhotoList pl = new PhotoList (); Photos.Collection = pl; ActiveSource.StartPhotoScan (this, pl); FireEvent (ImportEvent.PhotoScanStarted); } #endregion #region Source Progress Signalling // These are callbacks that should be called by the sources. public void PhotoScanFinished () { photo_scan_running = false; FireEvent (ImportEvent.PhotoScanFinished); } #endregion #region Importing Thread ImportThread; public void StartImport () { if (ImportThread != null) throw new Exception ("Import already running!"); ImportThread = ThreadAssist.Spawn (() => DoImport ()); } public void CancelImport () { import_cancelled = true; if (ImportThread != null) ImportThread.Join (); Cleanup (); } Stack created_directories; List imported_photos; List copied_files; List original_files; PhotoStore store = App.Instance.Database.Photos; RollStore rolls = App.Instance.Database.Rolls; volatile bool photo_scan_running; MetadataImporter metadata_importer; volatile bool import_cancelled = false; void DoImport () { while (photo_scan_running) { Thread.Sleep (1000); // FIXME: we can do this with a better primitive! } FireEvent (ImportEvent.ImportStarted); App.Instance.Database.Sync = false; created_directories = new Stack (); imported_photos = new List (); copied_files = new List (); original_files = new List (); metadata_importer = new MetadataImporter (); CreatedRoll = rolls.Create (); EnsureDirectory (Global.PhotoUri); try { int i = 0; int total = Photos.Count; foreach (var info in Photos.Items) { if (import_cancelled) { RollbackImport (); return; } ThreadAssist.ProxyToMain (() => ReportProgress (i++, total)); try { ImportPhoto (info, CreatedRoll); } catch (Exception e) { Log.DebugFormat ("Failed to import {0}", info.DefaultVersion.Uri); Log.DebugException (e); FailedImports.Add (info.DefaultVersion.Uri); } } PhotosImported = imported_photos.Count; FinishImport (); } catch (Exception e) { RollbackImport (); throw e; } finally { Cleanup (); } } void Cleanup () { if (imported_photos != null && imported_photos.Count == 0) rolls.Remove (CreatedRoll); imported_photos = null; created_directories = null; Photo.ResetMD5Cache (); DeactivateSource (ActiveSource); System.GC.Collect (); App.Instance.Database.Sync = true; } void FinishImport () { if (RemoveOriginals) { foreach (var uri in original_files) { try { var file = GLib.FileFactory.NewForUri (uri); file.Delete (null); } catch (Exception) { Log.WarningFormat ("Failed to remove original file: {0}", uri); } } } ImportThread = null; FireEvent (ImportEvent.ImportFinished); } void RollbackImport () { // Remove photos foreach (var id in imported_photos) { store.Remove (store.Get (id)); } foreach (var uri in copied_files) { var file = GLib.FileFactory.NewForUri (uri); file.Delete (null); } // Clean up directories while (created_directories.Count > 0) { var uri = created_directories.Pop (); var dir = GLib.FileFactory.NewForUri (uri); var enumerator = dir.EnumerateChildren ("standard::name", GLib.FileQueryInfoFlags.None, null); if (!enumerator.HasPending) { dir.Delete (null); } } // Clean created tags metadata_importer.Cancel(); // Remove created roll rolls.Remove (CreatedRoll); } void ImportPhoto (IPhoto item, Roll roll) { if (item is IInvalidPhotoCheck && (item as IInvalidPhotoCheck).IsInvalid) { throw new Exception ("Failed to parse metadata, probably not a photo"); } var destination = FindImportDestination (item); // Do duplicate detection if (DuplicateDetect && store.HasDuplicate (item)) { return; } // Copy into photo folder. CopyIfNeeded (item, destination); // Import photo var photo = store.CreateFrom (item, roll.Id); bool needs_commit = false; // Add tags if (attach_tags.Count > 0) { photo.AddTag (attach_tags); needs_commit = true; } // Import XMP metadata needs_commit |= metadata_importer.Import (photo, item); if (needs_commit) { store.Commit (photo); } // Prepare thumbnail (Import is I/O bound anyway) ThumbnailLoader.Default.Request (destination, ThumbnailSize.Large, 10); imported_photos.Add (photo.Id); } void CopyIfNeeded (IPhoto item, SafeUri destination) { if (item.DefaultVersion.Uri.Equals (destination)) return; // Copy image var file = GLib.FileFactory.NewForUri (item.DefaultVersion.Uri); var new_file = GLib.FileFactory.NewForUri (destination); file.Copy (new_file, GLib.FileCopyFlags.AllMetadata, null, null); copied_files.Add (destination); original_files.Add (item.DefaultVersion.Uri); item.DefaultVersion.Uri = destination; // Copy XMP sidecar var xmp_original = item.DefaultVersion.Uri.ReplaceExtension(".xmp"); var xmp_file = GLib.FileFactory.NewForUri (xmp_original); if (xmp_file.Exists) { var xmp_destination = destination.ReplaceExtension (".xmp"); var new_xmp_file = GLib.FileFactory.NewForUri (xmp_destination); xmp_file.Copy (new_xmp_file, GLib.FileCopyFlags.AllMetadata | GLib.FileCopyFlags.Overwrite, null, null); copied_files.Add (xmp_destination); original_files.Add (xmp_original); } } SafeUri FindImportDestination (IPhoto item) { var uri = item.DefaultVersion.Uri; if (!CopyFiles) return uri; // Keep it at the same place // Find a new unique location inside the photo folder string name = uri.GetFilename (); DateTime time = item.Time; var dest_uri = Global.PhotoUri.Append (time.Year.ToString ()) .Append (String.Format ("{0:D2}", time.Month)) .Append (String.Format ("{0:D2}", time.Day)); EnsureDirectory (dest_uri); // If the destination we'd like to use is the file itself return that if (dest_uri.Append (name) == uri) return uri; // Find an unused name int i = 1; var dest = dest_uri.Append (name); var file = GLib.FileFactory.NewForUri (dest); while (file.Exists) { var filename = uri.GetFilenameWithoutExtension (); var extension = uri.GetExtension (); dest = dest_uri.Append (String.Format ("{0}-{1}{2}", filename, i++, extension)); file = GLib.FileFactory.NewForUri (dest); } return dest; } void EnsureDirectory (SafeUri uri) { var parts = uri.AbsolutePath.Split('/'); SafeUri current = new SafeUri (uri.Scheme + ":///", true); for (int i = 0; i < parts.Length; i++) { current = current.Append (parts [i]); var file = GLib.FileFactory.NewForUri (current); if (!file.Exists) { file.MakeDirectory (null); } } } #endregion #region Tagging List attach_tags = new List (); TagStore tag_store = App.Instance.Database.Tags; // Set the tags that will be added on import. public void AttachTags (IEnumerable tags) { App.Instance.Database.BeginTransaction (); var import_category = GetImportedTagsCategory (); foreach (var tagname in tags) { var tag = tag_store.GetTagByName (tagname); if (tag == null) { tag = tag_store.CreateCategory (import_category, tagname, false) as Tag; tag_store.Commit (tag); } attach_tags.Add (tag); } App.Instance.Database.CommitTransaction (); } Category GetImportedTagsCategory () { var default_category = tag_store.GetTagByName (Catalog.GetString ("Imported Tags")) as Category; if (default_category == null) { default_category = tag_store.CreateCategory (null, Catalog.GetString ("Imported Tags"), false); default_category.ThemeIconName = "gtk-new"; } return default_category; } #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Import/FileImportSource.cs0000644000175000017500000001157111503404760025051 0ustar00rubenruben00000000000000using Hyena; using System; using System.Threading; using System.Collections.Generic; using FSpot.Core; using FSpot.Utils; using FSpot.Imaging; using Gtk; using Mono.Unix.Native; namespace FSpot.Import { internal class FileImportSource : ImportSource { public string Name { get; set; } public string IconName { get; set; } public SafeUri Root { get; set; } public Thread PhotoScanner; bool run_photoscanner = false; public FileImportSource (SafeUri root, string name, string icon_name) { Root = root; Name = name; if (root != null) { if (IsIPodPhoto) { IconName = "multimedia-player"; } else if (IsCamera) { IconName = "media-flash"; } else { IconName = icon_name; } } } public void StartPhotoScan (ImportController controller, PhotoList photo_list) { if (PhotoScanner != null) { run_photoscanner = false; PhotoScanner.Join (); } run_photoscanner = true; PhotoScanner = ThreadAssist.Spawn (() => ScanPhotos (controller, photo_list)); } protected virtual void ScanPhotos (ImportController controller, PhotoList photo_list) { ScanPhotoDirectory (controller, Root, photo_list); ThreadAssist.ProxyToMain (() => controller.PhotoScanFinished ()); } protected void ScanPhotoDirectory (ImportController controller, SafeUri uri, PhotoList photo_list) { var enumerator = new RecursiveFileEnumerator (uri) { Recurse = controller.RecurseSubdirectories, CatchErrors = true, IgnoreSymlinks = true }; var infos = new List (); foreach (var file in enumerator) { if (ImageFile.HasLoader (new SafeUri (file.Uri, true))) { infos.Add (new FileImportInfo (new SafeUri(file.Uri, true))); } if (infos.Count % 10 == 0 || infos.Count < 10) { var to_add = infos; // prevents race condition ThreadAssist.ProxyToMain (() => photo_list.Add (to_add.ToArray ())); infos = new List (); } if (!run_photoscanner) return; } if (infos.Count > 0) { var to_add = infos; // prevents race condition ThreadAssist.ProxyToMain (() => photo_list.Add (to_add.ToArray ())); } } public void Deactivate () { if (PhotoScanner != null) { run_photoscanner = false; PhotoScanner.Join (); // Make sure all photos are added. This is needed to prevent // a race condition where a source is deactivated, yet photos // are still added to the collection because they are // queued on the mainloop. while (Application.EventsPending ()) Application.RunIteration (false); PhotoScanner = null; } } private bool IsCamera { get { try { var file = GLib.FileFactory.NewForUri (Root.Append ("DCIM")); return file.Exists; } catch { return false; } } } private bool IsIPodPhoto { get { try { var file = GLib.FileFactory.NewForUri (Root.Append ("Photos")); var file2 = GLib.FileFactory.NewForUri (Root.Append ("iPod_Control")); return file.Exists && file2.Exists; } catch { return false; } } } } // Multi root version for drag and drop import. internal class MultiFileImportSource : FileImportSource { private IEnumerable uris; public MultiFileImportSource (IEnumerable uris) : base (null, String.Empty, String.Empty) { this.uris = uris; } protected override void ScanPhotos (ImportController controller, PhotoList photo_list) { foreach (var uri in uris) { Log.Debug ("Scanning "+uri); ScanPhotoDirectory (controller, uri, photo_list); } ThreadAssist.ProxyToMain (() => controller.PhotoScanFinished ()); } } internal class FileImportInfo : FilePhoto { public FileImportInfo (SafeUri original) : base (original) { } public SafeUri DestinationUri { get; set; } internal uint PhotoId { get; set; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Import/ImportSource.cs0000644000175000017500000000044111503404760024243 0ustar00rubenruben00000000000000using Hyena; using System; using FSpot.Core; namespace FSpot.Import { public interface ImportSource { string Name { get; } string IconName { get; } void StartPhotoScan (ImportController controller, PhotoList photo_list); void Deactivate (); } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Import/MetadataImporter.cs0000644000175000017500000000711011503404760025052 0ustar00rubenruben00000000000000using System; using Mono.Unix; using System.Collections.Generic; using FSpot.Core; using FSpot.Utils; namespace FSpot.Import { internal class MetadataImporter { private TagStore tag_store; private Stack tags_created; static private string LastImportIcon = "gtk-new"; private class TagInfo { // This class contains the Root tag name, and its Icon name (if any) string tag_name; string icon_name; public string TagName { get { return tag_name; } } public string IconName { get { return icon_name; } } public bool HasIcon { get { return icon_name != null; } } public TagInfo (string t_name, string i_name) { tag_name = t_name; icon_name = i_name; } public TagInfo (string t_name) { tag_name = t_name; icon_name = null; } } // TagInfo TagInfo li_root_tag; // This is the Last Import root tag public MetadataImporter () { this.tag_store = App.Instance.Database.Tags; tags_created = new Stack (); li_root_tag = new TagInfo (Catalog.GetString ("Imported Tags"), LastImportIcon); } private Tag EnsureTag (TagInfo info, Category parent) { Tag tag = tag_store.GetTagByName (info.TagName); if (tag != null) return tag; tag = tag_store.CreateCategory (parent, info.TagName, false); if (info.HasIcon) { tag.ThemeIconName = info.IconName; tag_store.Commit(tag); } tags_created.Push (tag); return tag; } private void AddTagToPhoto (Photo photo, string new_tag_name) { if (new_tag_name == null || new_tag_name.Length == 0) return; Tag parent = EnsureTag (li_root_tag, tag_store.RootCategory); Tag tag = EnsureTag (new TagInfo (new_tag_name), parent as Category); // Now we have the tag for this place, add the photo to it photo.AddTag (tag); } public bool Import (Photo photo, IPhoto importing_from) { using (var metadata = Metadata.Parse (importing_from.DefaultVersion.Uri)) { if (metadata == null) return true; // Copy Rating var rating = metadata.ImageTag.Rating; if (rating.HasValue) { var rating_val = Math.Min (metadata.ImageTag.Rating.Value, 5); photo.Rating = Math.Max (0, rating_val); } // Copy Keywords foreach (var keyword in metadata.ImageTag.Keywords) { AddTagToPhoto (photo, keyword); } // XXX: We might want to copy more data. } return true; } public void Cancel() { // User have cancelled the import. // Remove all created tags while (tags_created.Count > 0) tag_store.Remove (tags_created.Pop()); // Clear the tags_created array tags_created.Clear(); } public void Finish() { // Clear the tags_created array, since we do not need it anymore. tags_created.Clear(); } } } // namespace f-spot-0.8.2/src/Clients/MainApp/FSpot.Loaders/0000777000175000017500000000000011503407446021411 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot.Loaders/AreaUpdatedEventArgs.cs0000644000175000017500000000073611503404760025734 0ustar00rubenruben00000000000000// // Fspot.Loaders.AreaUpdatedEventArgs.cs // // Copyright (c) 2009 Novell, Inc. // // Author(s) // Stephane Delcroix // // This is free software. See COPYING for details // using System; using Gdk; namespace FSpot.Loaders { public class AreaUpdatedEventArgs : EventArgs { Gdk.Rectangle area; public Gdk.Rectangle Area { get { return area; } } public AreaUpdatedEventArgs (Gdk.Rectangle area) : base () { this.area = area; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Loaders/GdkImageLoader.cs0000644000175000017500000001143211503404760024530 0ustar00rubenruben00000000000000// // Fspot.ImageLoader.cs // // Copyright (c) 2009 Novell, Inc. // // Author(s) // Stephane Delcroix // // This is free software. See COPYING for details // using System; using System.Threading; using Gdk; using FSpot.Utils; using FSpot.Platform; using FSpot.Imaging; using Hyena; using TagLib.Image; namespace FSpot.Loaders { public class GdkImageLoader : Gdk.PixbufLoader, IImageLoader { #region public api public GdkImageLoader () : base () { } ~GdkImageLoader () { if (!is_disposed) Dispose (); } public void Load (SafeUri uri) { if (is_disposed) return; //First, send a thumbnail if we have one if ((thumb = XdgThumbnailSpec.LoadThumbnail (uri, ThumbnailSize.Large, null)) != null) { pixbuf_orientation = ImageOrientation.TopLeft; EventHandler prep = AreaPrepared; if (prep != null) prep (this, new AreaPreparedEventArgs (true)); EventHandler upd = AreaUpdated; if (upd != null) upd (this, new AreaUpdatedEventArgs (new Rectangle (0, 0, thumb.Width, thumb.Height))); } using (var image_file = ImageFile.Create (uri)) { image_stream = image_file.PixbufStream (); pixbuf_orientation = image_file.Orientation; } loading = true; // The ThreadPool.QueueUserWorkItem hack is there cause, as the bytes to read are present in the stream, // the Read is CompletedAsynchronously, blocking the mainloop image_stream.BeginRead (buffer, 0, count, delegate (IAsyncResult r) { ThreadPool.QueueUserWorkItem (delegate {HandleReadDone (r);}); }, null); } new public event EventHandler AreaPrepared; new public event EventHandler AreaUpdated; public event EventHandler Completed; Pixbuf thumb; new public Pixbuf Pixbuf { get { if (thumb != null) return thumb; return base.Pixbuf; } } bool loading = false; public bool Loading { get { return loading; } } bool notify_prepared = false; bool prepared = false; public bool Prepared { get { return prepared; } } ImageOrientation pixbuf_orientation = ImageOrientation.TopLeft; public ImageOrientation PixbufOrientation { get { return pixbuf_orientation; } } bool is_disposed = false; public override void Dispose () { is_disposed = true; if (image_stream != null) try { image_stream.Close (); } catch (GLib.GException) { } Close (); if (thumb != null) { thumb.Dispose (); thumb = null; } base.Dispose (); } public new bool Close () { lock (sync_handle) { return base.Close (true); } } #endregion #region event handlers protected override void OnAreaPrepared () { if (is_disposed) return; prepared = notify_prepared = true; damage = Rectangle.Zero; base.OnAreaPrepared (); } protected override void OnAreaUpdated (int x, int y, int width, int height) { if (is_disposed) return; Rectangle area = new Rectangle (x, y, width, height); damage = damage == Rectangle.Zero ? area : damage.Union (area); base.OnAreaUpdated (x, y, width, height); } protected virtual void OnCompleted () { if (is_disposed) return; EventHandler eh = Completed; if (eh != null) eh (this, EventArgs.Empty); Close (); } #endregion #region private stuffs System.IO.Stream image_stream; const int count = 1 << 16; byte [] buffer = new byte [count]; bool notify_completed = false; Rectangle damage; object sync_handle = new object (); void HandleReadDone (IAsyncResult ar) { if (is_disposed) return; int byte_read = image_stream.EndRead (ar); lock (sync_handle) { if (byte_read == 0) { image_stream.Close (); Close (); loading = false; notify_completed = true; } else { try { if (!is_disposed && Write (buffer, (ulong)byte_read)) image_stream.BeginRead (buffer, 0, count, HandleReadDone, null); } catch (System.ObjectDisposedException) { } catch (GLib.GException) { } } } GLib.Idle.Add (delegate { //Send the AreaPrepared event if (notify_prepared) { notify_prepared = false; if (thumb != null) { thumb.Dispose (); thumb = null; } EventHandler eh = AreaPrepared; if (eh != null) eh (this, new AreaPreparedEventArgs (false)); } //Send the AreaUpdated events if (damage != Rectangle.Zero) { EventHandler eh = AreaUpdated; if (eh != null) eh (this, new AreaUpdatedEventArgs (damage)); damage = Rectangle.Zero; } //Send the Completed event if (notify_completed) { notify_completed = false; OnCompleted (); } return false; }); } #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Loaders/ImageLoader.cs0000644000175000017500000000316111503404760024102 0ustar00rubenruben00000000000000// // Fspot.Loaders.ImageLoader.cs // // Copyright (c) 2009 Novell, Inc. // // Author(s) // Stephane Delcroix // Ruben Vermeersch // // This is free software. See COPYING for details // using FSpot.Utils; using FSpot.Imaging; using System; using System.Collections.Generic; using Gdk; using Hyena; namespace FSpot.Loaders { public static class ImageLoader { static Dictionary name_table; static ImageLoader () { name_table = new Dictionary (); System.Type gdk_loader = typeof (GdkImageLoader); foreach (string key in ImageFile.NameTable.Keys) { name_table [key] = gdk_loader; } //as xcf pixbufloader is not part of gdk-pixbuf, check if it's there, //and enable it if needed. foreach (Gdk.PixbufFormat format in Gdk.Pixbuf.Formats) if (format.Name == "xcf") { if (format.IsDisabled) format.SetDisabled (false); name_table [".xcf"] = typeof (GdkImageLoader); } } public static IImageLoader Create (SafeUri uri) { string path = uri.AbsolutePath; string extension = System.IO.Path.GetExtension (path).ToLower (); System.Type t; IImageLoader loader; if (!name_table.TryGetValue (extension, out t)) { GLib.FileInfo info = GLib.FileFactory.NewForUri (uri).QueryInfo ("standard::type,standard::content-type", GLib.FileQueryInfoFlags.None, null); if (!name_table.TryGetValue (info.ContentType, out t)) throw new Exception ("Loader requested for unknown file type: "+extension); } loader = (IImageLoader) System.Activator.CreateInstance (t); return loader; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Loaders/AreaPreparedEventArgs.cs0000644000175000017500000000103211503404760026076 0ustar00rubenruben00000000000000// // Fspot.Loaders.AreaPreparedEventArgs.cs // // Copyright (c) 2009 Novell, Inc. // // Author(s) // Stephane Delcroix // // This is free software. See COPYING for details // using System; using Gdk; namespace FSpot.Loaders { public class AreaPreparedEventArgs : EventArgs { bool reduced_resolution; public bool ReducedResolution { get { return reduced_resolution; } } public AreaPreparedEventArgs (bool reduced_resolution) : base () { this.reduced_resolution = reduced_resolution; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Loaders/IImageLoader.cs0000644000175000017500000000114611503404760024214 0ustar00rubenruben00000000000000// // Fspot.Loaders.IImageLoader.cs // // Copyright (c) 2009 Novell, Inc. // // Author(s) // Ruben Vermeersch // // This is free software. See COPYING for details // using FSpot.Utils; using System; using Gdk; using Hyena; using TagLib.Image; namespace FSpot.Loaders { public interface IImageLoader : IDisposable { bool Loading { get; } event EventHandler AreaPrepared; event EventHandler AreaUpdated; event EventHandler Completed; void Load (SafeUri uri); Pixbuf Pixbuf { get; } ImageOrientation PixbufOrientation { get; } } } f-spot-0.8.2/src/Clients/MainApp/f-spot.in0000644000175000017500000000561511430555234020527 0ustar00rubenruben00000000000000#!/bin/bash prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ turtledir=@TURTLEDIR@ EXE_TO_RUN="$libdir/f-spot/f-spot.exe" if test "x$DBUS_SESSION_BUS_ADDRESS" == "x"; then echo "** No session dbus found. Starting one **" DBUSLAUNCH="dbus-launch" else DBUSLAUNCH="" fi if test "x$turtledir" != "x"; then export MONO_PATH=$turtledir/lib:$turtledir/gui:$MONO_PATH fi [ -n "$FSPOT_DEBUG" ] && FSPOT_DEBUG="--debug" [ -n "$FSPOT_TRACE" ] && FSPOT_TRACE="--trace=$FSPOT_TRACE" [ -n "$FSPOT_PROFILE" ] && FSPOT_PROFILE="--profile=$FSPOT_PROFILE" run_mdb=false run_gdb=false run_valgrind=false run_strace=false basedir_set=false for arg in "$@"; do case "x$arg" in x--debug) FSPOT_DEBUG="$arg" ;; x--mdb) run_mdb=true ;; x--gdb) run_gdb=true ;; x-b) basedir_set=true;; x-basedir) basedir_set=true;; x--basedir) basedir_set=true;; x--valgrind) run_valgrind=true ;; x--trace=*) FSPOT_TRACE="$arg" ;; x--strace) run_strace=true ;; x--profile=*) FSPOT_PROFILE="$arg" ;; x--uninstalled) echo "*** Running uninstalled f-spot ***" EXE_TO_RUN="./f-spot.exe" export MONO_PATH=../lib/gio-sharp/gio:../lib/gtk-sharp-beans:../lib/unique-sharp/unique:../bin:$MONO_PATH ;; esac done if [ "$basedir_set" != "true" ]; then if [ ! -n "$XDG_CONFIG_HOME" ]; then XDG_CONFIG_HOME="$HOME/.config" fi if [ -e "$HOME/.gnome2/f-spot" ] && [ -e "$XDG_CONFIG_HOME/f-spot" ]; then echo "It looks like you have 2 settings directories for f-spot ($HOME/.gnome2/f-spot and $XDG_CONFIG_HOME/f-spot). Remove one or run f-spot with --basedir option" zenity --error --text="It looks like you have 2 settings directories for f-spot ($HOME/.gnome2/f-spot and $XDG_CONFIG_HOME/f-spot). Remove one or run f-spot with --basedir option" exit -1 elif [ -e "$HOME/.gnome2/f-spot" ]; then mkdir -p $XDG_CONFIG_HOME/ echo "Moving $HOME/.gnome2/f-spot to $XDG_CONFIG_HOME/" mv $HOME/.gnome2/f-spot $XDG_CONFIG_HOME/ rm -rf $XDG_CONFIG_HOME/addin* fi fi if [ -n "$FSPOT_DEBUG" ]; then echo "** Running f-spot in Debug Mode **" fi if [ -n "$FSPOT_DEBUG" -o -n "$FSPOT_TRACE" -o -n "$FSPOT_PROFILE" ]; then MONO_OPTIONS="$FSPOT_DEBUG $FSPOT_TRACE $FSPOT_PROFILE" echo "** Running Mono with $MONO_OPTIONS **" fi if $run_mdb; then mdb $EXE_TO_RUN -args "$@" elif $run_gdb; then gdb --eval-command="handle SIGXCPU SIG33 SIG35 SIGPWR nostop noprint" --eval-command=run --args mono $MONO_OPTIONS $EXE_TO_RUN "$@" elif $run_valgrind; then valgrind --tool=memcheck --leak-check=full --show-reachable=yes --log-file=valgrind --smc-check=all --suppressions=/home/sde/Mono/mono/data/mono.supp mono $MONO_OPTIONS $EXE_TO_RUN "$@" elif $run_strace; then strace -ttt -f -o /tmp/f-spot.strace mono $MONO_OPTIONS $EXE_TO_RUN "$@" else exec -a @PACKAGE@ $DBUSLAUNCH mono $MONO_OPTIONS $EXE_TO_RUN "$@" fi f-spot-0.8.2/src/Clients/MainApp/FSpot.Query/0000777000175000017500000000000011503407446021125 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot.Query/HiddenTag.cs0000644000175000017500000000207311503404760023275 0ustar00rubenruben00000000000000/* * HiddenTag.cs * * Author(s): * Mike Gemuende * * This is free software. See COPYING for details. * */ using System; using FSpot; using FSpot.Core; namespace FSpot.Query { public class HiddenTag : IQueryCondition { private static HiddenTag show_hidden_tag; private static HiddenTag hide_hidden_tag; public static HiddenTag ShowHiddenTag { get { if (show_hidden_tag == null) show_hidden_tag = new HiddenTag (true); return show_hidden_tag; } } public static HiddenTag HideHiddenTag { get { if (hide_hidden_tag == null) hide_hidden_tag = new HiddenTag (false); return hide_hidden_tag; } } bool show_hidden; private HiddenTag (bool show_hidden) { this.show_hidden = show_hidden; } public string SqlClause () { Tag hidden = App.Instance.Database.Tags.Hidden; if ( ! show_hidden && hidden != null) return String.Format (" photos.id NOT IN (SELECT photo_id FROM photo_tags WHERE tag_id = {0}) ", hidden.Id); else return null; } } } f-spot-0.8.2/src/Clients/MainApp/f-spot.exe.config.in0000644000175000017500000000056411431562107022547 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Clients/MainApp/Makefile.in0000644000175000017500000010640411503407247021033 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/f-spot.exe.config.in $(srcdir)/f-spot.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = src/Clients/MainApp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = f-spot f-spot.exe.config CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(moduledir)" SCRIPTS = $(bin_SCRIPTS) $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = f-spot TARGET = exe LINK = $(REF_FSPOT) $(am__append_1) ASSEMBLY_BUILD_FLAGS = -unsafe SOURCES = \ DependentListStore.cs \ FSpot.ColorAdjustment/Adjustment.cs \ FSpot.ColorAdjustment/AutoStretch.cs \ FSpot.ColorAdjustment/Desaturate.cs \ FSpot.ColorAdjustment/FullColorAdjustment.cs \ FSpot.ColorAdjustment/SepiaTone.cs \ FSpot.Database/Db.cs \ FSpot.Database/DbException.cs \ FSpot.Database/DbStore.cs \ FSpot.Database/FSpotDatabaseConnection.cs \ FSpot.Database/Tests/UpdaterTests.cs \ FSpot.Database/Updater.cs \ FSpot.Editors/AutoStretchEditor.cs \ FSpot.Editors/ColorEditor.cs \ FSpot.Editors/CropEditor.cs \ FSpot.Editors/DesaturateEditor.cs \ FSpot.Editors/Editor.cs \ FSpot.Editors/RedEyeEditor.cs \ FSpot.Editors/SepiaEditor.cs \ FSpot.Editors/SoftFocusEditor.cs \ FSpot.Editors/TiltEditor.cs \ FSpot.Extensions/CommandMenuItemNode.cs \ FSpot.Extensions/ComplexMenuItemNode.cs \ FSpot.Extensions/ExportMenuItemNode.cs \ FSpot.Extensions/ICommand.cs \ FSpot.Extensions/IExporter.cs \ FSpot.Extensions/IMenuGenerator.cs \ FSpot.Extensions/IService.cs \ FSpot.Extensions/MenuNode.cs \ FSpot.Extensions/PhotoSelectionCondition.cs \ FSpot.Extensions/PopupCommands.cs \ FSpot.Extensions/ServiceNode.cs \ FSpot.Extensions/SidebarPage.cs \ FSpot.Extensions/SidebarPageNode.cs \ FSpot.Extensions/TransitionNode.cs \ FSpot.Extensions/ViewModeCondition.cs \ FSpot.Filters/ChmodFilter.cs \ FSpot.Filters/FilterRequest.cs \ FSpot.Filters/FilterSet.cs \ FSpot.Filters/IFilter.cs \ FSpot.Filters/JpegFilter.cs \ FSpot.Filters/ResizeFilter.cs \ FSpot.Filters/SharpFilter.cs \ FSpot.Filters/UniqueNameFilter.cs \ FSpot.Filters/WhiteListFilter.cs \ FSpot.Imaging/Ciff.cs \ FSpot.Imaging/DCRawFile.cs \ FSpot.Imaging/ImageFile.cs \ FSpot.Imaging/InternalProcess.cs \ FSpot.Imaging/IOChannel.cs \ FSpot.Imaging/RafFile.cs \ FSpot.Imaging/Tests/ImageFileTests.cs \ FSpot.Imaging/Tiff.cs \ FSpot.Import/FileImportSource.cs \ FSpot.Import/ImportController.cs \ FSpot.Import/ImportSource.cs \ FSpot.Import/MetadataImporter.cs \ FSpot.Jobs/CalculateHashJob.cs \ FSpot.Jobs/SyncMetadataJob.cs \ FSpot.Loaders/AreaPreparedEventArgs.cs \ FSpot.Loaders/AreaUpdatedEventArgs.cs \ FSpot.Loaders/GdkImageLoader.cs \ FSpot.Loaders/IImageLoader.cs \ FSpot.Loaders/ImageLoader.cs \ FSpot.Query/HiddenTag.cs \ FSpot.UI.Dialog/AboutDialog.cs \ FSpot.UI.Dialog/AdjustTimeDialog.cs \ FSpot.UI.Dialog/BuilderDialog.cs \ FSpot.UI.Dialog/DateRangeDialog.cs \ FSpot.UI.Dialog/EditExceptionDialog.cs \ FSpot.UI.Dialog/EditTagDialog.cs \ FSpot.UI.Dialog/EditTagIconDialog.cs \ FSpot.UI.Dialog/ImportDialog.cs \ FSpot.UI.Dialog/ImportFailureDialog.cs \ FSpot.UI.Dialog/LastRollDialog.cs \ FSpot.UI.Dialog/PreferenceDialog.cs \ FSpot.UI.Dialog/ProgressDialog.cs \ FSpot.UI.Dialog/RatingFilterDialog.cs \ FSpot.UI.Dialog/RepairDbDialog.cs \ FSpot.UI.Dialog/RepairDialog.cs \ FSpot.UI.Dialog/SelectionRatioDialog.cs \ FSpot.UI.Dialog/TagSelectionDialog.cs \ FSpot.UI.Dialog/ThreadProgressDialog.cs \ FSpot.Widgets/BrowseablePointerGridView.cs \ FSpot.Widgets/CellRendererTextProgress.cs \ FSpot.Widgets/CollectionCellGridView.cs \ FSpot.Widgets/EditorPage.cs \ FSpot.Widgets/Filmstrip.cs \ FSpot.Widgets/FindBar.cs \ FSpot.Widgets/FolderTreeModel.cs \ FSpot.Widgets/FolderTreePage.cs \ FSpot.Widgets/FolderTreeView.cs \ FSpot.Widgets/ImageInfo.cs \ FSpot.Widgets/InfoBox.cs \ FSpot.Widgets/Loupe.cs \ FSpot.Widgets/MetadataDisplay.cs \ FSpot.Widgets/PhotoImageView.cs \ FSpot.Widgets/PreviewPopup.cs \ FSpot.Widgets/QueryView.cs \ FSpot.Widgets/RatingMenuItem.cs \ FSpot.Widgets/SelectionCollectionGridView.cs \ FSpot.Widgets/Sharpener.cs \ FSpot.Widgets/Sidebar.cs \ FSpot.Widgets/SlideShow.cs \ FSpot.Widgets/SoftFocus.cs \ FSpot.Widgets/TagEntry.cs \ FSpot.Widgets/TagMenu.cs \ FSpot.Widgets/TagView.cs \ FSpot.Widgets/Tests/FindBarTests.cs \ FSpot.Widgets/ThumbnailCaptionRenderer.cs \ FSpot.Widgets/ThumbnailDateCaptionRenderer.cs \ FSpot.Widgets/ThumbnailDecorationRenderer.cs \ FSpot.Widgets/ThumbnailFilenameCaptionRenderer.cs \ FSpot.Widgets/ThumbnailRatingDecorationRenderer.cs \ FSpot.Widgets/ThumbnailTagsCaptionRenderer.cs \ FSpot.Widgets/ThumbnailTextCaptionRenderer.cs \ FSpot.Widgets/TrayView.cs \ FSpot.Widgets/ViewContext.cs \ FSpot/Accelerometer.cs \ FSpot/App.cs \ FSpot/BitConverter.cs \ FSpot/ColorManagement.cs \ FSpot/ControlOverlay.cs \ FSpot/DragDropTargets.cs \ FSpot/ExportStore.cs \ FSpot/FolderQueryWidget.cs \ FSpot/FullScreenView.cs \ FSpot/GroupAdaptor.cs \ FSpot/GroupSelector.cs \ FSpot/Histogram.cs \ FSpot/InfoOverlay.cs \ FSpot/ItemAction.cs \ FSpot/JobStore.cs \ FSpot/main.cs \ FSpot/MainWindow.cs \ FSpot/MetaStore.cs \ FSpot/Photo.cs \ FSpot/PhotoEventArgs.cs \ FSpot/PhotoLoader.cs \ FSpot/PhotoPopup.cs \ FSpot/PhotoQuery.cs \ FSpot/PhotoStore.cs \ FSpot/PhotoVersion.cs \ FSpot/PhotoView.cs \ FSpot/PixbufCache.cs \ FSpot/Preferences.cs \ FSpot/PrintOperation.cs \ FSpot/ProgressItem.cs \ FSpot/QueryWidget.cs \ FSpot/RollStore.cs \ FSpot/RotateCommand.cs \ FSpot/SelectionDataExtensions.cs \ FSpot/SendEmail.cs \ FSpot/SingleView.cs \ FSpot/TagQueryWidget.cs \ FSpot/TagSelectionWidget.cs \ FSpot/TagStore.cs \ FSpot/Term.cs \ FSpot/ThumbnailCache.cs \ FSpot/ThumbnailGenerator.cs \ FSpot/TimeAdaptor.cs \ FSpot/UriCollection.cs \ FSpot/XScreenSaverSlide.cs \ ImageLoaderThread.cs \ PhotoTagMenu.cs \ PhotoVersionCommands.cs \ PhotoVersionMenu.cs \ PixbufUtils.cs \ TagCommands.cs \ TagPopup.cs \ ThumbnailCommand.cs RESOURCES = \ ../../../COPYING \ ../../../icons/flower.png \ ../../../icons/f-spot-128.png \ ../../../icons/f-spot-not.png \ FSpot.addin.xml \ FSpot.UI.Dialog/ui/AdjustTimeDialog.ui \ FSpot.UI.Dialog/ui/CreateTagDialog.ui \ FSpot.UI.Dialog/ui/DateRangeDialog.ui \ FSpot.UI.Dialog/ui/EditTagDialog.ui \ FSpot.UI.Dialog/ui/EditTagIconDialog.ui \ FSpot.UI.Dialog/ui/LastImportRollFilterDialog.ui \ FSpot.UI.Dialog/ui/PreferenceDialog.ui \ FSpot.UI.Dialog/ui/RatingFilterDialog.ui \ FSpot.UI.Dialog/ui/RepairDialog.ui \ FSpot.UI.Dialog/ui/SelectionRatioDialog.ui \ ui/color_editor_prefs_window.ui \ ui/import.ui \ ui/mail_dialog.ui \ ui/main_window.ui \ ui/single_view.ui \ ui/tag_selection_dialog.ui \ ui/version_name_dialog.ui \ ui/viewer_preferences.ui # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) f-spot.exe.config EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) \ $(THEME_ICONS_SOURCE) f-spot.exe.config CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in bin_SCRIPTS = f-spot all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Clients/MainApp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Clients/MainApp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): f-spot: $(top_builddir)/config.status $(srcdir)/f-spot.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ f-spot.exe.config: $(top_builddir)/config.status $(srcdir)/f-spot.exe.config.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS uninstall-local \ uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binSCRIPTS install-data install-data-am \ install-data-local install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-moduleSCRIPTS install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-binSCRIPTS uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/src/Clients/MainApp/PhotoTagMenu.cs0000644000175000017500000000463511503404761021670 0ustar00rubenruben00000000000000// // PhotoTagMenu.cs // // Copyright (C) 2004 Novell, Inc. // // // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using Gtk; using FSpot; using FSpot.Core; using Hyena; public class PhotoTagMenu : Menu { public delegate void TagSelectedHandler (Tag t); public event TagSelectedHandler TagSelected; public PhotoTagMenu () : base () { } protected PhotoTagMenu (IntPtr raw) : base (raw) {} public void Populate (IPhoto [] photos) { Hashtable hash = new Hashtable (); if (photos != null) { foreach (IPhoto p in photos) { foreach (Tag t in p.Tags) { if (!hash.Contains (t.Id)) { hash.Add (t.Id, t); } } } } foreach (Widget w in this.Children) { w.Destroy (); } if (hash.Count == 0) { /* Fixme this should really set parent menu items insensitve */ MenuItem item = new MenuItem (Mono.Unix.Catalog.GetString ("(No Tags)")); this.Append (item); item.Sensitive = false; item.ShowAll (); return; } foreach (Tag t in hash.Values) { MenuItem item = new TagMenu.TagMenuItem (t); this.Append (item); item.ShowAll (); item.Activated += HandleActivate; } } void HandleActivate (object obj, EventArgs args) { if (TagSelected != null) { TagMenu.TagMenuItem t = obj as TagMenu.TagMenuItem; if (t != null) TagSelected (t.Value); else Log.Debug ("Item was not a TagMenuItem"); } } } f-spot-0.8.2/src/Clients/MainApp/TagCommands.cs0000644000175000017500000001300711503404761021504 0ustar00rubenruben00000000000000/* * TagCommand.cs * * Author(s): * Larry Ewing * Stephane Delcroix * * Copyright (c) 2003-2009 Novell, Inc, * Copyright (c) 2007 Stephane Delcroix * * This is free software. See COPYING for details */ using Gtk; using Gdk; using System; using System.Text; using System.Collections; using Mono.Unix; using FSpot; using FSpot.Core; using FSpot.Utils; using FSpot.UI.Dialog; using FSpot.Widgets; using Hyena; public class TagCommands { public enum TagType { Tag, Category } public class Create : BuilderDialog { TagStore tag_store; [GtkBeans.Builder.Object] private Button create_button; [GtkBeans.Builder.Object] private Entry tag_name_entry; [GtkBeans.Builder.Object] private Label prompt_label; [GtkBeans.Builder.Object] private Label already_in_use_label; [GtkBeans.Builder.Object] private ComboBox category_option_menu; [GtkBeans.Builder.Object] private CheckButton auto_icon_checkbutton; private ArrayList categories; private void PopulateCategories (ArrayList categories, Category parent) { foreach (Tag tag in parent.Children) { if (tag is Category) { categories.Add (tag); PopulateCategories (categories, tag as Category); } } } private string Indentation (Category category) { int indentations = 0; for (Category parent = category.Category; parent != null && parent.Category != null; parent = parent.Category) indentations++; return new string (' ', indentations*2); } private void PopulateCategoryOptionMenu () { categories = new ArrayList (); categories.Add (tag_store.RootCategory); PopulateCategories (categories, tag_store.RootCategory); ListStore category_store = new ListStore (typeof(Pixbuf), typeof(string)); foreach (Category category in categories) { category_store.AppendValues (category.SizedIcon, Indentation (category) + category.Name); } category_option_menu.Sensitive = true; category_option_menu.Model = category_store; var icon_renderer = new CellRendererPixbuf (); icon_renderer.Width = (int)Tag.TagIconSize; category_option_menu.PackStart (icon_renderer, true); var text_renderer = new CellRendererText (); text_renderer.Alignment = Pango.Alignment.Left; text_renderer.Width = 150; category_option_menu.PackStart (text_renderer, true); category_option_menu.AddAttribute (icon_renderer, "pixbuf", 0); category_option_menu.AddAttribute (text_renderer, "text", 1); category_option_menu.ShowAll (); } private bool TagNameExistsInCategory (string name, Category category) { foreach (Tag tag in category.Children) { if (String.Compare(tag.Name, name, true) == 0) return true; if (tag is Category && TagNameExistsInCategory (name, tag as Category)) return true; } return false; } private void Update () { if (tag_name_entry.Text == String.Empty) { create_button.Sensitive = false; already_in_use_label.Markup = String.Empty; } else if (TagNameExistsInCategory (tag_name_entry.Text, tag_store.RootCategory)) { create_button.Sensitive = false; already_in_use_label.Markup = "" + Catalog.GetString ("This name is already in use") + ""; } else { create_button.Sensitive = true; already_in_use_label.Markup = String.Empty; } } private void HandleTagNameEntryChanged (object sender, EventArgs args) { Update (); } private Category Category { get { if (categories.Count == 0) return tag_store.RootCategory; else return categories [category_option_menu.Active] as Category; } set { if ((value != null) && (categories.Count > 0)) { //System.Console.WriteLine("TagCreateCommand.set_Category(" + value.Name + ")"); for (int i = 0; i < categories.Count; i++) { Category category = (Category)categories[i]; // should there be an equals type method? if (value.Id == category.Id) { category_option_menu.Active = i; return; } } } else { category_option_menu.Active = 0; } } } public Tag Execute (TagType type, Tag [] selection) { Category default_category = null; if (selection.Length > 0) { if (selection [0] is Category) default_category = (Category) selection [0]; else default_category = selection [0].Category; } else { default_category = tag_store.RootCategory; } this.DefaultResponse = ResponseType.Ok; this.Title = Catalog.GetString ("Create New Tag"); prompt_label.Text = Catalog.GetString ("Name of New Tag:"); this.auto_icon_checkbutton.Active = Preferences.Get (Preferences.TAG_ICON_AUTOMATIC); PopulateCategoryOptionMenu (); this.Category = default_category; Update (); tag_name_entry.GrabFocus (); ResponseType response = (ResponseType) this.Run (); Tag new_tag = null; if (response == ResponseType.Ok) { bool autoicon = this.auto_icon_checkbutton.Active; Preferences.Set (Preferences.TAG_ICON_AUTOMATIC, autoicon); try { Category parent_category = Category; if (type == TagType.Category) new_tag = tag_store.CreateCategory (parent_category, tag_name_entry.Text, autoicon) as Tag; else new_tag = tag_store.CreateTag (parent_category, tag_name_entry.Text, autoicon); } catch (Exception ex) { // FIXME error dialog. Log.Exception (ex); } } this.Destroy (); return new_tag; } public Create (TagStore tag_store) : base ("CreateTagDialog.ui", "create_tag_dialog") { this.tag_store = tag_store; } } } f-spot-0.8.2/src/Clients/MainApp/Makefile.am0000644000175000017500000001454011474466733021035 0ustar00rubenruben00000000000000ASSEMBLY = f-spot TARGET = exe LINK = $(REF_FSPOT) ASSEMBLY_BUILD_FLAGS = -unsafe SOURCES = \ DependentListStore.cs \ FSpot.ColorAdjustment/Adjustment.cs \ FSpot.ColorAdjustment/AutoStretch.cs \ FSpot.ColorAdjustment/Desaturate.cs \ FSpot.ColorAdjustment/FullColorAdjustment.cs \ FSpot.ColorAdjustment/SepiaTone.cs \ FSpot.Database/Db.cs \ FSpot.Database/DbException.cs \ FSpot.Database/DbStore.cs \ FSpot.Database/FSpotDatabaseConnection.cs \ FSpot.Database/Tests/UpdaterTests.cs \ FSpot.Database/Updater.cs \ FSpot.Editors/AutoStretchEditor.cs \ FSpot.Editors/ColorEditor.cs \ FSpot.Editors/CropEditor.cs \ FSpot.Editors/DesaturateEditor.cs \ FSpot.Editors/Editor.cs \ FSpot.Editors/RedEyeEditor.cs \ FSpot.Editors/SepiaEditor.cs \ FSpot.Editors/SoftFocusEditor.cs \ FSpot.Editors/TiltEditor.cs \ FSpot.Extensions/CommandMenuItemNode.cs \ FSpot.Extensions/ComplexMenuItemNode.cs \ FSpot.Extensions/ExportMenuItemNode.cs \ FSpot.Extensions/ICommand.cs \ FSpot.Extensions/IExporter.cs \ FSpot.Extensions/IMenuGenerator.cs \ FSpot.Extensions/IService.cs \ FSpot.Extensions/MenuNode.cs \ FSpot.Extensions/PhotoSelectionCondition.cs \ FSpot.Extensions/PopupCommands.cs \ FSpot.Extensions/ServiceNode.cs \ FSpot.Extensions/SidebarPage.cs \ FSpot.Extensions/SidebarPageNode.cs \ FSpot.Extensions/TransitionNode.cs \ FSpot.Extensions/ViewModeCondition.cs \ FSpot.Filters/ChmodFilter.cs \ FSpot.Filters/FilterRequest.cs \ FSpot.Filters/FilterSet.cs \ FSpot.Filters/IFilter.cs \ FSpot.Filters/JpegFilter.cs \ FSpot.Filters/ResizeFilter.cs \ FSpot.Filters/SharpFilter.cs \ FSpot.Filters/UniqueNameFilter.cs \ FSpot.Filters/WhiteListFilter.cs \ FSpot.Imaging/Ciff.cs \ FSpot.Imaging/DCRawFile.cs \ FSpot.Imaging/ImageFile.cs \ FSpot.Imaging/InternalProcess.cs \ FSpot.Imaging/IOChannel.cs \ FSpot.Imaging/RafFile.cs \ FSpot.Imaging/Tests/ImageFileTests.cs \ FSpot.Imaging/Tiff.cs \ FSpot.Import/FileImportSource.cs \ FSpot.Import/ImportController.cs \ FSpot.Import/ImportSource.cs \ FSpot.Import/MetadataImporter.cs \ FSpot.Jobs/CalculateHashJob.cs \ FSpot.Jobs/SyncMetadataJob.cs \ FSpot.Loaders/AreaPreparedEventArgs.cs \ FSpot.Loaders/AreaUpdatedEventArgs.cs \ FSpot.Loaders/GdkImageLoader.cs \ FSpot.Loaders/IImageLoader.cs \ FSpot.Loaders/ImageLoader.cs \ FSpot.Query/HiddenTag.cs \ FSpot.UI.Dialog/AboutDialog.cs \ FSpot.UI.Dialog/AdjustTimeDialog.cs \ FSpot.UI.Dialog/BuilderDialog.cs \ FSpot.UI.Dialog/DateRangeDialog.cs \ FSpot.UI.Dialog/EditExceptionDialog.cs \ FSpot.UI.Dialog/EditTagDialog.cs \ FSpot.UI.Dialog/EditTagIconDialog.cs \ FSpot.UI.Dialog/ImportDialog.cs \ FSpot.UI.Dialog/ImportFailureDialog.cs \ FSpot.UI.Dialog/LastRollDialog.cs \ FSpot.UI.Dialog/PreferenceDialog.cs \ FSpot.UI.Dialog/ProgressDialog.cs \ FSpot.UI.Dialog/RatingFilterDialog.cs \ FSpot.UI.Dialog/RepairDbDialog.cs \ FSpot.UI.Dialog/RepairDialog.cs \ FSpot.UI.Dialog/SelectionRatioDialog.cs \ FSpot.UI.Dialog/TagSelectionDialog.cs \ FSpot.UI.Dialog/ThreadProgressDialog.cs \ FSpot.Widgets/BrowseablePointerGridView.cs \ FSpot.Widgets/CellRendererTextProgress.cs \ FSpot.Widgets/CollectionCellGridView.cs \ FSpot.Widgets/EditorPage.cs \ FSpot.Widgets/Filmstrip.cs \ FSpot.Widgets/FindBar.cs \ FSpot.Widgets/FolderTreeModel.cs \ FSpot.Widgets/FolderTreePage.cs \ FSpot.Widgets/FolderTreeView.cs \ FSpot.Widgets/ImageInfo.cs \ FSpot.Widgets/InfoBox.cs \ FSpot.Widgets/Loupe.cs \ FSpot.Widgets/MetadataDisplay.cs \ FSpot.Widgets/PhotoImageView.cs \ FSpot.Widgets/PreviewPopup.cs \ FSpot.Widgets/QueryView.cs \ FSpot.Widgets/RatingMenuItem.cs \ FSpot.Widgets/SelectionCollectionGridView.cs \ FSpot.Widgets/Sharpener.cs \ FSpot.Widgets/Sidebar.cs \ FSpot.Widgets/SlideShow.cs \ FSpot.Widgets/SoftFocus.cs \ FSpot.Widgets/TagEntry.cs \ FSpot.Widgets/TagMenu.cs \ FSpot.Widgets/TagView.cs \ FSpot.Widgets/Tests/FindBarTests.cs \ FSpot.Widgets/ThumbnailCaptionRenderer.cs \ FSpot.Widgets/ThumbnailDateCaptionRenderer.cs \ FSpot.Widgets/ThumbnailDecorationRenderer.cs \ FSpot.Widgets/ThumbnailFilenameCaptionRenderer.cs \ FSpot.Widgets/ThumbnailRatingDecorationRenderer.cs \ FSpot.Widgets/ThumbnailTagsCaptionRenderer.cs \ FSpot.Widgets/ThumbnailTextCaptionRenderer.cs \ FSpot.Widgets/TrayView.cs \ FSpot.Widgets/ViewContext.cs \ FSpot/Accelerometer.cs \ FSpot/App.cs \ FSpot/BitConverter.cs \ FSpot/ColorManagement.cs \ FSpot/ControlOverlay.cs \ FSpot/DragDropTargets.cs \ FSpot/ExportStore.cs \ FSpot/FolderQueryWidget.cs \ FSpot/FullScreenView.cs \ FSpot/GroupAdaptor.cs \ FSpot/GroupSelector.cs \ FSpot/Histogram.cs \ FSpot/InfoOverlay.cs \ FSpot/ItemAction.cs \ FSpot/JobStore.cs \ FSpot/main.cs \ FSpot/MainWindow.cs \ FSpot/MetaStore.cs \ FSpot/Photo.cs \ FSpot/PhotoEventArgs.cs \ FSpot/PhotoLoader.cs \ FSpot/PhotoPopup.cs \ FSpot/PhotoQuery.cs \ FSpot/PhotoStore.cs \ FSpot/PhotoVersion.cs \ FSpot/PhotoView.cs \ FSpot/PixbufCache.cs \ FSpot/Preferences.cs \ FSpot/PrintOperation.cs \ FSpot/ProgressItem.cs \ FSpot/QueryWidget.cs \ FSpot/RollStore.cs \ FSpot/RotateCommand.cs \ FSpot/SelectionDataExtensions.cs \ FSpot/SendEmail.cs \ FSpot/SingleView.cs \ FSpot/TagQueryWidget.cs \ FSpot/TagSelectionWidget.cs \ FSpot/TagStore.cs \ FSpot/Term.cs \ FSpot/ThumbnailCache.cs \ FSpot/ThumbnailGenerator.cs \ FSpot/TimeAdaptor.cs \ FSpot/UriCollection.cs \ FSpot/XScreenSaverSlide.cs \ ImageLoaderThread.cs \ PhotoTagMenu.cs \ PhotoVersionCommands.cs \ PhotoVersionMenu.cs \ PixbufUtils.cs \ TagCommands.cs \ TagPopup.cs \ ThumbnailCommand.cs RESOURCES = \ ../../../COPYING \ ../../../icons/flower.png \ ../../../icons/f-spot-128.png \ ../../../icons/f-spot-not.png \ FSpot.addin.xml \ FSpot.UI.Dialog/ui/AdjustTimeDialog.ui \ FSpot.UI.Dialog/ui/CreateTagDialog.ui \ FSpot.UI.Dialog/ui/DateRangeDialog.ui \ FSpot.UI.Dialog/ui/EditTagDialog.ui \ FSpot.UI.Dialog/ui/EditTagIconDialog.ui \ FSpot.UI.Dialog/ui/LastImportRollFilterDialog.ui \ FSpot.UI.Dialog/ui/PreferenceDialog.ui \ FSpot.UI.Dialog/ui/RatingFilterDialog.ui \ FSpot.UI.Dialog/ui/RepairDialog.ui \ FSpot.UI.Dialog/ui/SelectionRatioDialog.ui \ ui/color_editor_prefs_window.ui \ ui/import.ui \ ui/mail_dialog.ui \ ui/main_window.ui \ ui/single_view.ui \ ui/tag_selection_dialog.ui \ ui/version_name_dialog.ui \ ui/viewer_preferences.ui include $(top_srcdir)/build/build.mk bin_SCRIPTS = f-spot EXTRA_DIST += f-spot.exe.config module_SCRIPTS += f-spot.exe.config f-spot-0.8.2/src/Clients/MainApp/FSpot.Filters/0000777000175000017500000000000011503407446021430 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot.Filters/ChmodFilter.cs0000644000175000017500000000144211503404760024150 0ustar00rubenruben00000000000000/* * Filters/ChmodFilter * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. * */ using Mono.Unix.Native; namespace FSpot.Filters { public class ChmodFilter : IFilter { FilePermissions mode; public ChmodFilter () : this (FilePermissions.S_IRUSR | FilePermissions.S_IWUSR | FilePermissions.S_IRGRP | FilePermissions.S_IROTH) { } public ChmodFilter (FilePermissions mode) { this.mode = mode; } public bool Convert (FilterRequest req) { if (req.Current == req.Source) { var uri = req.TempUri (); System.IO.File.Copy (req.Current.LocalPath, uri.LocalPath, true); req.Current = uri; } Syscall.chmod (req.Current.LocalPath, mode); return true; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Filters/ResizeFilter.cs0000644000175000017500000000251711503404760024363 0ustar00rubenruben00000000000000/* * Filters/ResizeFilter.cs * * Author(s) * * Stephane Delcroix * Larry Ewing * * This is free software. See COPYING for details * */ using System; using System.IO; using FSpot.Utils; using FSpot.Imaging; using Mono.Unix; using Gdk; namespace FSpot.Filters { public class ResizeFilter : IFilter { public ResizeFilter () { } public ResizeFilter (uint size) { this.size = size; } private uint size = 600; public uint Size { get { return size; } set { size = value; } } public bool Convert (FilterRequest req) { string source = req.Current.LocalPath; var dest_uri = req.TempUri (System.IO.Path.GetExtension (source)); using (var img = ImageFile.Create (req.Current)) { using (Pixbuf pixbuf = img.Load ()) { if (pixbuf.Width < size && pixbuf.Height < size) return false; } using (Pixbuf pixbuf = img.Load ((int)size, (int)size)) { PixbufUtils.CreateDerivedVersion (req.Current, dest_uri, 95, pixbuf); } } req.Current = dest_uri; return true; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Filters/WhiteListFilter.cs0000644000175000017500000000156211503404760025035 0ustar00rubenruben00000000000000/* * Filters/WhiteListFilter * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. * */ namespace FSpot.Filters { public class WhiteListFilter : IFilter { System.Collections.ArrayList valid_extensions; public WhiteListFilter (string [] valid_extensions) { this.valid_extensions = new System.Collections.ArrayList (); foreach (string extension in valid_extensions) this.valid_extensions.Add (extension.ToLower ()); } public bool Convert (FilterRequest req) { if ( valid_extensions.Contains (System.IO.Path.GetExtension(req.Current.LocalPath).ToLower ()) ) return false; if ( !valid_extensions.Contains (".jpg") && !valid_extensions.Contains (".jpeg")) throw new System.NotImplementedException ("can only save jpeg :("); return (new JpegFilter ()).Convert (req); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Filters/FilterSet.cs0000644000175000017500000000112311503404760023645 0ustar00rubenruben00000000000000/* * Filters/FilterSet.cs * * Authors: * Larry Ewing * Stephane Delcroix * * I don't like per file copyright notices. */ using System.Collections; namespace FSpot.Filters { public class FilterSet : IFilter { public ArrayList list; public FilterSet () { list = new ArrayList (); } public void Add (IFilter filter) { list.Add (filter); } public bool Convert (FilterRequest req) { bool changed = false; foreach (IFilter filter in list) { changed |= filter.Convert (req); } return changed; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Filters/JpegFilter.cs0000644000175000017500000000150311503404760024001 0ustar00rubenruben00000000000000/* * Filters/JpegFilter.cs * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. * */ using System; using FSpot.Utils; using FSpot.Imaging; namespace FSpot.Filters { public class JpegFilter : IFilter { private uint quality = 95; public uint Quality { get { return quality; } set { quality = value; } } public JpegFilter (uint quality) { this.quality = quality; } public JpegFilter() { } public bool Convert (FilterRequest req) { var source = req.Current; req.Current = req.TempUri ("jpg"); PixbufUtils.CreateDerivedVersion (source, req.Current, quality); return true; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Filters/FilterRequest.cs0000644000175000017500000000322011503404760024542 0ustar00rubenruben00000000000000/* * Filters/FilterRequest.cs * * Author(s) * Stephane Delcroix * Larry Ewing * * This is free software. See COPYING for details * */ using System; using System.Collections; using Hyena; using FSpot.Utils; namespace FSpot.Filters { public class FilterRequest : IDisposable { SafeUri source; SafeUri current; ArrayList temp_uris; public FilterRequest (SafeUri source) { this.source = source; this.current = source; temp_uris = new ArrayList (); } ~FilterRequest () { Close (); } public SafeUri Source { get { return source; } } public SafeUri Current { get { return current; } set { if (!value.Equals (source) && !temp_uris.Contains (value)) temp_uris.Add (value); current = value; } } public virtual void Close () { foreach (SafeUri uri in temp_uris) { try { System.IO.File.Delete (uri.LocalPath); } catch (System.IO.IOException e) { Log.Exception (e); } } temp_uris.Clear (); } public void Dispose () { Close (); System.GC.SuppressFinalize (this); } public SafeUri TempUri () { return TempUri (null); } public SafeUri TempUri (string extension) { string imgtemp; if (extension != null) { string temp = System.IO.Path.GetTempFileName (); imgtemp = temp + "." + extension; System.IO.File.Move (temp, imgtemp); } else imgtemp = System.IO.Path.GetTempFileName (); SafeUri uri = new SafeUri (imgtemp); if (!temp_uris.Contains (uri)) temp_uris.Add (uri); return uri; } public void Preserve (SafeUri uri) { temp_uris.Remove (uri); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Filters/UniqueNameFilter.cs0000644000175000017500000000210411503404760025161 0ustar00rubenruben00000000000000/* * Filters/UniqueNameFilter.cs * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details * */ using System; using FSpot.Utils; using Hyena; namespace FSpot.Filters { public class UniqueNameFilter : IFilter { SafeUri destination; public UniqueNameFilter (SafeUri destination) { this.destination = destination; } public bool Convert (FilterRequest request) { //FIXME: make it works for uri (and use it in CDExport) int i = 1; string path = destination.LocalPath; string filename = System.IO.Path.GetFileName (request.Source.LocalPath); string dest = System.IO.Path.Combine (path, filename); while (System.IO.File.Exists (dest)) { string numbered_name = String.Format ("{0}-{1}{2}", System.IO.Path.GetFileNameWithoutExtension (filename), i++, System.IO.Path.GetExtension (filename)); dest = System.IO.Path.Combine (path, numbered_name); } System.IO.File.Copy (request.Current.LocalPath, dest); request.Current = new SafeUri (dest); return true; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Filters/SharpFilter.cs0000644000175000017500000000226211503404760024174 0ustar00rubenruben00000000000000/* * Filters/SharpFilter.cs : Apply an UnsharpMask to images * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. * */ using System; using System.IO; using Gdk; using Mono.Unix; using FSpot.Utils; using FSpot.Imaging; namespace FSpot.Filters { public class SharpFilter : IFilter { double radius, amount, threshold; public SharpFilter (double radius, double amount, double threshold) { this.radius = radius; this.amount = amount; this.threshold = threshold; } public bool Convert (FilterRequest req) { var dest_uri = req.TempUri (req.Current.GetExtension ()); using (var img = ImageFile.Create (req.Current)) { using (Pixbuf in_pixbuf = img.Load ()) { using (Pixbuf out_pixbuf = PixbufUtils.UnsharpMask (in_pixbuf, radius, amount, threshold)) { PixbufUtils.CreateDerivedVersion (req.Current, dest_uri, 95, out_pixbuf); } } } req.Current = dest_uri; return true; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.Filters/IFilter.cs0000644000175000017500000000037111503404760023306 0ustar00rubenruben00000000000000/* * Filters/IFilter.cs * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details * */ namespace FSpot.Filters { public interface IFilter { bool Convert (FilterRequest request); } } f-spot-0.8.2/src/Clients/MainApp/f-spot.exe.config0000644000175000017500000000057011503407352022137 0ustar00rubenruben00000000000000 f-spot-0.8.2/src/Clients/MainApp/FSpot/0000777000175000017500000000000011503407450020014 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot/FolderQueryWidget.cs0000644000175000017500000000451411503404761023752 0ustar00rubenruben00000000000000/* * FSpot.FolderQueryWidget.cs * * Author(s) * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using System.Text; using System.Collections; using System.Collections.Generic; using System.Linq; using Gtk; using Hyena; using FSpot; using FSpot.Utils; using FSpot.Query; namespace FSpot { public class FolderQueryWidget : HBox { PhotoQuery query; FolderSet folder_set; public FolderQueryWidget (PhotoQuery query) : base () { folder_set = new FolderSet (); this.query = query; query.SetCondition (folder_set); Drag.DestSet (this, DestDefaults.All, folder_query_widget_source_table, Gdk.DragAction.Copy | Gdk.DragAction.Move); } void UpdateGui () { while (Children.Length != 0) Remove (Children[0]); int length = folder_set.Folders.Count (); if (length == 0) { Hide (); return; } if (length < 4) { foreach (var uri in folder_set.Folders) { Image image = new Image ("gtk-directory", IconSize.Button); image.TooltipText = uri.ToString (); PackStart (image); } TooltipText = String.Empty; } else { Label label = new Label (String.Format ("{0}x", length)); label.UseMarkup = true; PackStart (label); Image image = new Image ("gtk-directory", IconSize.Button); PackStart (image); StringBuilder builder = new StringBuilder (); foreach (var uri in folder_set.Folders) { if (builder.Length > 0) builder.AppendLine (); builder.Append (uri.ToString ()); } TooltipText = builder.ToString (); } ShowAll (); } public void SetFolders (IEnumerable uris) { folder_set.Folders = uris; UpdateGui (); } public void Clear () { folder_set.Folders = null; } public bool Empty { get { return folder_set.Folders == null || folder_set.Folders.Count () == 0; } } private static TargetEntry [] folder_query_widget_source_table = new TargetEntry [] { DragDropTargets.UriQueryEntry }; protected override void OnDragDataReceived (Gdk.DragContext context, int x, int y, Gtk.SelectionData selection_data, uint info, uint time_) { base.OnDragDataReceived (context, x, y, selection_data, info, time_); SetFolders (selection_data.GetUriListData ()); query.RequestReload (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/Photo.cs0000644000175000017500000003753011503404761021442 0ustar00rubenruben00000000000000/* * FSpot.Photo.cs * * Author(s): * Ettore Perazzoli * Larry Ewing * Stephane Delcroix * * This is free software. See COPYING for details. */ using Hyena; using System; using System.IO; using System.Linq; using System.Collections; using System.Collections.Generic; using Mono.Unix; using FSpot.Core; using FSpot.Utils; using FSpot.Platform; using FSpot.Imaging; namespace FSpot { public class Photo : DbItem, IComparable, IPhoto, IPhotoVersionable { PhotoChanges changes = new PhotoChanges (); public PhotoChanges Changes { get{ return changes; } set { if (value != null) throw new ArgumentException ("The only valid value is null"); changes = new PhotoChanges (); } } // The time is always in UTC. private DateTime time; public DateTime Time { get { return time; } set { if (time == value) return; time = value; changes.TimeChanged = true; } } public string Name { get { return Uri.UnescapeDataString (System.IO.Path.GetFileName (VersionUri (OriginalVersionId).AbsolutePath)); } } private ArrayList tags; public Tag [] Tags { get { if (tags == null) return new Tag [0]; return (Tag []) tags.ToArray (typeof (Tag)); } } private bool all_versions_loaded = false; internal bool AllVersionsLoaded { get { return all_versions_loaded; } set { if (value) { if (DefaultVersionId != OriginalVersionId && !versions.ContainsKey (DefaultVersionId)) DefaultVersionId = OriginalVersionId; } all_versions_loaded = value; } } private string description; public string Description { get { return description; } set { if (description == value) return; description = value; changes.DescriptionChanged = true; } } private uint roll_id = 0; public uint RollId { get { return roll_id; } set { if (roll_id == value) return; roll_id = value; changes.RollIdChanged = true; } } private uint rating; public uint Rating { get { return rating; } set { if (rating == value || value < 0 || value > 5) return; rating = value; changes.RatingChanged = true; } } // Version management public const int OriginalVersionId = 1; private uint highest_version_id; private Dictionary versions = new Dictionary (); public IEnumerable Versions { get { foreach (var version in versions.Values) yield return version; } } public uint [] VersionIds { get { if (versions == null) return new uint [0]; uint [] ids = new uint [versions.Count]; versions.Keys.CopyTo (ids, 0); Array.Sort (ids); return ids; } } public PhotoVersion GetVersion (uint version_id) { if (versions == null) return null; return versions [version_id]; } private uint default_version_id = OriginalVersionId; public uint DefaultVersionId { get { return default_version_id; } set { if (default_version_id == value) return; default_version_id = value; changes.DefaultVersionIdChanged = true; } } // This doesn't check if a version of that name already exists, // it's supposed to be used only within the Photo and PhotoStore classes. internal void AddVersionUnsafely (uint version_id, SafeUri base_uri, string filename, string import_md5, string name, bool is_protected) { versions [version_id] = new PhotoVersion (this, version_id, base_uri, filename, import_md5, name, is_protected); highest_version_id = Math.Max (version_id, highest_version_id); changes.AddVersion (version_id); } public uint AddVersion (SafeUri base_uri, string filename, string name) { return AddVersion (base_uri, filename, name, false); } public uint AddVersion (SafeUri base_uri, string filename, string name, bool is_protected) { if (VersionNameExists (name)) throw new ApplicationException ("A version with that name already exists"); highest_version_id ++; string import_md5 = String.Empty; // Modified version versions [highest_version_id] = new PhotoVersion (this, highest_version_id, base_uri, filename, import_md5, name, is_protected); changes.AddVersion (highest_version_id); return highest_version_id; } //FIXME: store versions next to originals. will crash on ro locations. private string GetFilenameForVersionName (string version_name, string extension) { string name_without_extension = System.IO.Path.GetFileNameWithoutExtension (Name); return name_without_extension + " (" + UriUtils.EscapeString (version_name, true, true, true) + ")" + extension; } public bool VersionNameExists (string version_name) { return Versions.Where ((v) => v.Name == version_name).Any (); } public SafeUri VersionUri (uint version_id) { if (!versions.ContainsKey (version_id)) return null; PhotoVersion v = versions [version_id]; if (v != null) return v.Uri; return null; } public IPhotoVersion DefaultVersion { get { if (!versions.ContainsKey (DefaultVersionId)) throw new Exception ("Something is horribly wrong, this should never happen: no default version!"); return versions [DefaultVersionId]; } } public void SetDefaultVersion (IPhotoVersion version) { PhotoVersion photo_version = version as PhotoVersion; if (photo_version == null) throw new ArgumentException ("Not a valid version for this photo"); DefaultVersionId = photo_version.VersionId; } //FIXME: won't work on non file uris public uint SaveVersion (Gdk.Pixbuf buffer, bool create_version) { uint version = DefaultVersionId; using (var img = ImageFile.Create (DefaultVersion.Uri)) { // Always create a version if the source is not a jpeg for now. create_version = create_version || ImageFile.IsJpeg (DefaultVersion.Uri); if (buffer == null) throw new ApplicationException ("invalid (null) image"); if (create_version) version = CreateDefaultModifiedVersion (DefaultVersionId, false); try { var versionUri = VersionUri (version); PixbufUtils.CreateDerivedVersion (DefaultVersion.Uri, versionUri, 95, buffer); (GetVersion (version) as PhotoVersion).ImportMD5 = HashUtils.GenerateMD5 (VersionUri (version)); DefaultVersionId = version; } catch (System.Exception e) { Log.Exception (e); if (create_version) DeleteVersion (version); throw e; } } return version; } public void DeleteVersion (uint version_id) { DeleteVersion (version_id, false, false); } public void DeleteVersion (uint version_id, bool remove_original) { DeleteVersion (version_id, remove_original, false); } public void DeleteVersion (uint version_id, bool remove_original, bool keep_file) { if (version_id == OriginalVersionId && !remove_original) throw new Exception ("Cannot delete original version"); SafeUri uri = VersionUri (version_id); if (!keep_file) { GLib.File file = GLib.FileFactory.NewForUri (uri); if (file.Exists) { try { file.Trash (null); } catch (GLib.GException) { Log.Debug ("Unable to Trash, trying to Delete"); file.Delete (); } } try { XdgThumbnailSpec.RemoveThumbnail (uri); } catch { // ignore an error here we don't really care. } // do we really need to check if the parent is a directory? // i.e. is file.Parent always a directory if the file instance is // an actual file? GLib.File directory = file.Parent; GLib.FileType file_type = directory.QueryFileType (GLib.FileQueryInfoFlags.None, null); if (directory.Exists && file_type == GLib.FileType.Directory) DeleteEmptyDirectory (directory); } versions.Remove (version_id); changes.RemoveVersion (version_id); for (version_id = highest_version_id; version_id >= OriginalVersionId; version_id--) { if (versions.ContainsKey (version_id)) { DefaultVersionId = version_id; break; } } } private void DeleteEmptyDirectory (GLib.File directory) { // if the directory we're dealing with is not in the // F-Spot photos directory, don't delete anything, // even if it is empty string photo_uri = SafeUri.UriToFilename (Global.PhotoUri.ToString ()); bool path_matched = directory.Path.IndexOf (photo_uri) > -1; if (directory.Path.Equals (photo_uri) || !path_matched) return; if (DirectoryIsEmpty (directory)) { try { Log.DebugFormat ("Removing empty directory: {0}", directory.Path); directory.Delete (); } catch (GLib.GException e) { // silently log the exception, but don't re-throw it // as to not annoy the user Log.Exception (e); } // check to see if the parent is empty DeleteEmptyDirectory (directory.Parent); } } private bool DirectoryIsEmpty (GLib.File directory) { uint count = 0; GLib.FileEnumerator list = directory.EnumerateChildren ("standard::name", GLib.FileQueryInfoFlags.None, null); foreach (var item in list) count++; return count == 0; } public uint CreateVersion (string name, uint base_version_id, bool create) { return CreateVersion (name, null, base_version_id, create, false); } private uint CreateVersion (string name, string extension, uint base_version_id, bool create) { return CreateVersion (name, extension, base_version_id, create, false); } private uint CreateVersion (string name, string extension, uint base_version_id, bool create, bool is_protected) { extension = extension ?? VersionUri (base_version_id).GetExtension (); SafeUri new_base_uri = DefaultVersion.BaseUri; string filename = GetFilenameForVersionName (name, extension); SafeUri original_uri = VersionUri (base_version_id); SafeUri new_uri = new_base_uri.Append (filename); string import_md5 = DefaultVersion.ImportMD5; if (VersionNameExists (name)) throw new Exception ("This version name already exists"); if (create) { GLib.File destination = GLib.FileFactory.NewForUri (new_uri); if (destination.Exists) throw new Exception (String.Format ("An object at this uri {0} already exists", new_uri)); //FIXME. or better, fix the copy api ! GLib.File source = GLib.FileFactory.NewForUri (original_uri); source.Copy (destination, GLib.FileCopyFlags.None, null, null); } highest_version_id ++; versions [highest_version_id] = new PhotoVersion (this, highest_version_id, new_base_uri, filename, import_md5, name, is_protected); changes.AddVersion (highest_version_id); return highest_version_id; } public uint CreateReparentedVersion (PhotoVersion version) { return CreateReparentedVersion (version, false); } public uint CreateReparentedVersion (PhotoVersion version, bool is_protected) { // Try to derive version name from its filename string filename = Uri.UnescapeDataString (Path.GetFileNameWithoutExtension (version.Uri.AbsolutePath)); string parent_filename = Path.GetFileNameWithoutExtension (Name); string name = null; if (filename.StartsWith (parent_filename)) name = filename.Substring (parent_filename.Length).Replace ("(", "").Replace (")", "").Replace ("_", " "). Trim(); if (String.IsNullOrEmpty (name)) { // Note for translators: Reparented is a picture becoming a version of another one string rep = name = Catalog.GetString ("Reparented"); for (int num = 1; VersionNameExists (name); num++) name = String.Format (rep + " ({0})", num); } highest_version_id ++; versions [highest_version_id] = new PhotoVersion (this, highest_version_id, version.BaseUri, version.Filename, version.ImportMD5, name, is_protected); changes.AddVersion (highest_version_id); return highest_version_id; } public uint CreateDefaultModifiedVersion (uint base_version_id, bool create_file) { int num = 1; while (true) { string name = Catalog.GetPluralString ("Modified", "Modified ({0})", num); name = String.Format (name, num); //SafeUri uri = GetUriForVersionName (name, System.IO.Path.GetExtension (VersionUri(base_version_id).GetFilename())); string filename = GetFilenameForVersionName (name, System.IO.Path.GetExtension (versions[base_version_id].Filename)); SafeUri uri = DefaultVersion.BaseUri.Append (filename); GLib.File file = GLib.FileFactory.NewForUri (uri); if (! VersionNameExists (name) && ! file.Exists) return CreateVersion (name, base_version_id, create_file); num ++; } } public uint CreateNamedVersion (string name, string extension, uint base_version_id, bool create_file) { int num = 1; string final_name; while (true) { final_name = String.Format ( (num == 1) ? Catalog.GetString ("Modified in {1}") : Catalog.GetString ("Modified in {1} ({0})"), num, name); string filename = GetFilenameForVersionName (name, System.IO.Path.GetExtension (versions[base_version_id].Filename)); SafeUri uri = DefaultVersion.BaseUri.Append (filename); GLib.File file = GLib.FileFactory.NewForUri (uri); if (! VersionNameExists (final_name) && ! file.Exists) return CreateVersion (final_name, extension, base_version_id, create_file); num ++; } } public void RenameVersion (uint version_id, string new_name) { if (version_id == OriginalVersionId) throw new Exception ("Cannot rename original version"); if (VersionNameExists (new_name)) throw new Exception ("This name already exists"); (GetVersion (version_id) as PhotoVersion).Name = new_name; changes.ChangeVersion (version_id); //TODO: rename file too ??? // if (System.IO.File.Exists (new_path)) // throw new Exception ("File with this name already exists"); // // File.Move (old_path, new_path); // PhotoStore.MoveThumbnail (old_path, new_path); } public void CopyAttributesFrom (Photo that) { Time = that.Time; Description = that.Description; Rating = that.Rating; AddTag (that.Tags); } // Tag management. // This doesn't check if the tag is already there, use with caution. public void AddTagUnsafely (Tag tag) { if (tags == null) tags = new ArrayList (); tags.Add (tag); changes.AddTag (tag); } // This on the other hand does, but is O(n) with n being the number of existing tags. public void AddTag (Tag tag) { if (!HasTag (tag)) AddTagUnsafely (tag); } public void AddTag (IEnumerable taglist) { /* * FIXME need a better naming convention here, perhaps just * plain Add. */ foreach (Tag tag in taglist) AddTag (tag); } public void RemoveTag (Tag tag) { if (!HasTag (tag)) return; tags.Remove (tag); changes.RemoveTag (tag); } public void RemoveTag (Tag []taglist) { foreach (Tag tag in taglist) RemoveTag (tag); } public void RemoveCategory (IList taglist) { foreach (Tag tag in taglist) { Category cat = tag as Category; if (cat != null) RemoveCategory (cat.Children); RemoveTag (tag); } } public bool HasTag (Tag tag) { if (tags == null) return false; return tags.Contains (tag); } private static IDictionary md5_cache = new Dictionary (); public static void ResetMD5Cache () { if (md5_cache != null) md5_cache.Clear (); } // Constructor public Photo (uint id, long unix_time) : base (id) { time = DateTimeUtil.ToDateTime (unix_time); description = String.Empty; rating = 0; } #region IComparable implementation // IComparable public int CompareTo (object obj) { if (this.GetType () == obj.GetType ()) { return this.Compare((Photo)obj); } else if (obj is DateTime) { return this.time.CompareTo ((DateTime)obj); } else { throw new Exception ("Object must be of type Photo"); } } public int CompareTo (Photo photo) { int result = Id.CompareTo (photo.Id); if (result == 0) return 0; else return (this as IPhoto).Compare (photo); } #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot/Histogram.cs0000644000175000017500000001116311503404761022300 0ustar00rubenruben00000000000000/* * FSpot.Histogram.cs * * Author(s): * Larry Ewing * Ruben Vermeersch * * This is free software, See COPYING for details. */ using System; namespace FSpot { public class Histogram { #region Color hints private byte [] colors = new byte [] {0x00, 0x00, 0x00, 0xff}; public byte RedColorHint { set { colors [0] = value; } } public byte GreenColorHint { set { colors [1] = value; } } public byte BlueColorHint { set { colors [2] = value; } } public byte BackgroundColorHint { set { colors [3] = value; } } private int [,] values = new int [256, 3]; #endregion public Histogram (Gdk.Pixbuf src) { FillValues (src); } public Histogram () {} private void FillValues (Gdk.Pixbuf src) { values = new int [256, 3]; if (src.BitsPerSample != 8) throw new System.Exception ("Invalid bits per sample"); unsafe { byte * srcb = (byte *)src.Pixels; byte * pixels = srcb; bool alpha = src.HasAlpha; int rowstride = src.Rowstride; int width = src.Width; int height = src.Height; // FIXME array bounds checks slow this down a lot // so we use a pointer. It is sad but I want fastness fixed (int * v = &values [0,0]) { for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { v [*(srcb++) * 3 + 0]++; v [*(srcb++) * 3 + 1]++; v [*(srcb++) * 3 + 2]++; if (alpha) srcb++; } srcb = ((byte *) pixels) + j * rowstride; } } } } private int ChannelSum (int channel) { int sum = 0; for (int i = 0; i < values.GetLength (0); i++) { sum += values [i, channel]; } return sum; } public void GetHighLow (int channel, out int high, out int low) { double total = ChannelSum (channel); double current = 0.0; double percentage; double next_percentage; low = 0; high = 0; for (int i = 0; i < values.GetLength (0) - 1; i++) { current += values [i, channel]; percentage = current / total; next_percentage = (current + values [i + 1, channel]) / total; if (Math.Abs (percentage - 0.006) < Math.Abs (next_percentage - 0.006)) { low = i + 1; break; } } for (int i = values.GetLength (0) - 1; i > 0; i--) { current += values [i, channel]; percentage = current / total; next_percentage = (current + values [i - 1, channel]) / total; if (Math.Abs (percentage - 0.006) < Math.Abs (next_percentage - 0.006)) { high = i - 1; break; } } } private void Draw (Gdk.Pixbuf image) { int max = 0; for (int i = 0; i < values.GetLength (0); i++) { for (int j = 0; j < values.GetLength (1); j++) { max = System.Math.Max (max, values [i, j]); } } unsafe { int height = image.Height; int rowstride = image.Rowstride; int r = 0; int b = 0; int g = 0; for (int i = 0; i < image.Width; i++) { byte * pixels = (byte *)image.Pixels + i * 4; if (max > 0) { r = values [i, 0] * height / max; g = values [i, 1] * height / max; b = values [i, 2] * height / max; } else r = g = b = 0; int top = Math.Max (r, Math.Max (g, b)); int j = 0; for (; j < height - top; j++) { pixels [0] = colors [0]; pixels [1] = colors [1]; pixels [2] = colors [2]; pixels [3] = colors [3]; pixels += rowstride; } for (; j < height; j++) { pixels [0] = (byte) ((j >= height - r) ? 0xff : 0x00); pixels [1] = (byte) ((j >= height - g) ? 0xff : 0x00); pixels [2] = (byte) ((j >= height - b) ? 0xff : 0x00); pixels [3] = 0xff; pixels += rowstride; } } } } public Gdk.Pixbuf Generate (Gdk.Pixbuf input, int max_width) { Gdk.Pixbuf scaled; using (Gdk.Pixbuf pixbuf = Generate (input)) scaled = PixbufUtils.ScaleToMaxSize (pixbuf, max_width, 128); return scaled; } public Gdk.Pixbuf Generate (Gdk.Pixbuf input) { FillValues (input); int height = 128; Gdk.Pixbuf pixbuf = new Gdk.Pixbuf (Gdk.Colorspace.Rgb, true, 8, values.GetLength (0), height); Draw (pixbuf); return pixbuf; } #if FSPOT_HISTOGRAM_MAIN public static void Main (string [] args) { Gtk.Application.Init (); Gdk.Pixbuf pixbuf = new Gdk.Pixbuf (args [0]); Log.DebugFormat ("loaded {0}", args [0]); Histogram hist = new Histogram (); Log.DebugFormat ("loaded histgram", args [0]); Gtk.Window win = new Gtk.Window ("display"); Gtk.Image image = new Gtk.Image (); Gdk.Pixbuf img = hist.Generate (pixbuf); image.Pixbuf = img; win.Add (image); win.ShowAll (); Gtk.Application.Run (); } #endif } } f-spot-0.8.2/src/Clients/MainApp/FSpot/PixbufCache.cs0000644000175000017500000001732611503404761022533 0ustar00rubenruben00000000000000/* * FSpot.PixbufCache.cs * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ using System; using System.Collections; using System.Threading; using Hyena; using FSpot.Utils; using FSpot.Platform; namespace FSpot { public class PixbufCache { Hashtable items; ArrayList items_mru; int total_size; int max_size = 256 * 256 * 4 * 30; private Thread worker; public delegate void PixbufLoadedHandler (PixbufCache cache, CacheEntry entry); public event PixbufLoadedHandler OnPixbufLoaded; public PixbufCache () { items = new Hashtable (); items_mru = new ArrayList (); worker = new Thread (new ThreadStart (WorkerTask)); worker.Start (); ThumbnailLoader.Default.OnPixbufLoaded += HandleThumbnailLoaded; } public void HandleThumbnailLoaded (ImageLoaderThread loader, ImageLoaderThread.RequestItem result) { Reload (result.Uri); } public void Request (SafeUri uri, object closure, int width, int height) { lock (items) { CacheEntry entry = items[uri] as CacheEntry; if (entry == null) { entry = new CacheEntry (this, uri, closure, width, height); items [uri] = entry; items_mru.Add (entry); } else { MoveForward (entry); entry.Data = closure; } Monitor.Pulse (items); } } // public void Update (SafeUri uri, Gdk.Pixbuf pixbuf) // { // lock (items) { // CacheEntry entry = (CacheEntry) items [uri]; // if (entry != null) { // entry.SetPixbufExtended (pixbuf, true); // } // } // } public void Update (CacheEntry entry, Gdk.Pixbuf pixbuf) { lock (items) { entry.SetPixbufExtended (pixbuf, true); } } public void Reload (CacheEntry entry, object data, int width, int height) { lock (items) { lock (entry) { entry.Reload = true; entry.Width = width; entry.Height = height; entry.Data = data; } Monitor.Pulse (items); } } public void Reload (SafeUri uri) { CacheEntry entry; lock (items) { entry = (CacheEntry) items [uri]; if (entry != null) { lock (entry) { entry.Reload = true; } Monitor.Pulse (items); } } } private CacheEntry FindNext () { CacheEntry entry; int i = items_mru.Count; int size = 0; if (total_size > max_size * 4) { //System.Console.WriteLine ("Hit major limit ({0}) out of {1}", // total_size, max_size); return null; } while (i-- > 0) { entry = (CacheEntry) items_mru [i]; lock (entry) { if (entry.Reload) { entry.Reload = false; return entry; } //if the depth of the queue is so large that we've reached double our limit //break out of here and let the queue shrink. if (entry.Pixbuf != null) size += entry.Size; if (size > max_size * 2) { //System.Console.WriteLine ("Hit limit ({0},{1}) out of {2}", // size, total_size,max_size); return null; } } } return null; } private bool ShrinkIfNeeded () { int num = 0; while ((items_mru.Count - num) > 10 && total_size > max_size) { CacheEntry entry = (CacheEntry) items_mru [num++]; items.Remove (entry.Uri); entry.Dispose (); } if (num > 0) { //System.Console.WriteLine ("removing {0} out of {3} ({1} > {2})", // num, total_size, max_size, items_mru.Count); items_mru.RemoveRange (0, num); return true; } return false; } private void WorkerTask () { CacheEntry current = null; //ThumbnailGenerator.Default.PushBlock (); while (true) { try { lock (items) { /* find the next item */ while ((current = FindNext ()) == null) { if (!ShrinkIfNeeded ()){ //ThumbnailGenerator.Default.PopBlock (); Monitor.Wait (items); //ThumbnailGenerator.Default.PushBlock (); } } } ProcessRequest (current); QueueLast (current); } catch (System.Exception e) { Log.Exception (e); current = null; } } } protected virtual void ProcessRequest (CacheEntry entry) { Gdk.Pixbuf loaded = null; try { loaded = XdgThumbnailSpec.LoadThumbnail (entry.Uri, ThumbnailSize.Large); this.Update (entry, loaded); } catch (GLib.GException){ if (loaded != null) loaded.Dispose (); return; } } private void QueueLast (CacheEntry entry) { ThreadAssist.ProxyToMain (() => { if (entry.Uri != null && OnPixbufLoaded != null) OnPixbufLoaded (this, entry); }); } private void MoveForward (CacheEntry entry) { #if true int i = items_mru.Count; CacheEntry tmp1 = entry; CacheEntry tmp2; while (i-- > 0) { tmp2 = (CacheEntry) items_mru [i]; items_mru [i] = tmp1; tmp1 = tmp2; if (tmp2 == entry) return; } throw new System.Exception ("move forward failed"); #else items_mru.Remove (entry); items_mru.Add (entry); #endif } private CacheEntry ULookup (SafeUri uri) { CacheEntry entry = (CacheEntry) items [uri]; if (entry != null) { MoveForward (entry); } return (CacheEntry) entry; } public CacheEntry Lookup (SafeUri uri) { lock (items) { return ULookup (uri); } } private void URemove (SafeUri uri) { CacheEntry entry = (CacheEntry) items [uri]; if (entry != null) { items.Remove (uri); items_mru.Remove (entry); entry.Dispose (); } } public void Remove (SafeUri uri) { lock (items) { URemove (uri); } } public class CacheEntry : System.IDisposable { private Gdk.Pixbuf pixbuf; private SafeUri uri; private int width; private int height; private object data; private bool reload; private PixbufCache cache; public CacheEntry (PixbufCache cache, SafeUri uri, object closure, int width, int height) { this.uri = uri; this.width = width; this.height = height; this.data = closure; this.Reload = true; this.cache = cache; cache.total_size += this.Size; } public bool Reload { get { return reload; } set { reload = value; } } public SafeUri Uri { get { return uri; } } public int Width { get { return width; } set { width = value; } } public int Height { get { return height; } set { height = value; } } public object Data { get { lock (this) { return data; } } set { lock (this) { data = value; } } } public bool IsDisposed { get { return uri == null; } } public void SetPixbufExtended (Gdk.Pixbuf value, bool ignore_undead) { lock (this) { if (IsDisposed) { if (ignore_undead) { return; } else { throw new System.Exception ("I don't want to be undead"); } } Gdk.Pixbuf old = this.Pixbuf; cache.total_size -= this.Size; this.pixbuf = value; if (pixbuf != null) { this.width = pixbuf.Width; this.height = pixbuf.Height; } cache.total_size += this.Size; this.Reload = false; if (old != null) old.Dispose (); } } public Gdk.Pixbuf Pixbuf { get { lock (this) { return pixbuf; } } } public Gdk.Pixbuf ShallowCopyPixbuf () { lock (this) { if (IsDisposed) return null; if (pixbuf == null) return null; return pixbuf.ShallowCopy (); } } ~CacheEntry () { if (!IsDisposed) this.Dispose (); } public void Dispose () { lock (this) { if (! IsDisposed) cache.total_size -= this.Size; if (this.pixbuf != null) { this.pixbuf.Dispose (); } this.pixbuf = null; this.cache = null; this.uri = null; } System.GC.SuppressFinalize (this); } public int Size { get { return width * height * 3; } } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/GroupSelector.cs0000644000175000017500000007007711503404761023151 0ustar00rubenruben00000000000000using System; using Mono.Unix; using Gtk; using Gdk; using GLib; using FSpot.Core; using FSpot.Utils; using FSpot.Widgets; namespace FSpot { public class GroupSelector : Fixed { internal static GType groupSelectorGType; int border = 6; int box_spacing = 2; int box_top_padding = 6; public static int MIN_BOX_WIDTH = 20; private Glass glass; private Limit min_limit; private Limit max_limit; private Gtk.Button left; private Gtk.Button right; private DelayedOperation left_delay; private DelayedOperation right_delay; private Gdk.Window event_window; public Gdk.Rectangle background; public Gdk.Rectangle legend; public Gdk.Rectangle action; Pango.Layout [] tick_layouts; int [] box_counts = new int [0]; int box_count_max; int min_filled; int max_filled; bool has_limits; protected FSpot.GroupAdaptor adaptor; public FSpot.GroupAdaptor Adaptor { set { if (adaptor != null) { adaptor.Changed -= HandleAdaptorChanged; adaptor.Dispose (); } adaptor = value; HandleAdaptorChanged (adaptor); has_limits = adaptor is FSpot.ILimitable; if (has_limits) { min_limit.SetPosition (0, false); max_limit.SetPosition (adaptor.Count () - 1, false); } if (adaptor is TimeAdaptor) { left.TooltipText = Catalog.GetString ("More dates"); right.TooltipText = Catalog.GetString ("More dates"); } else { left.TooltipText = Catalog.GetString ("More"); right.TooltipText = Catalog.GetString ("More"); } adaptor.Changed += HandleAdaptorChanged; } get { return adaptor; } } public bool GlassUpdating { get { return glass.GlassUpdating; } set { glass.GlassUpdating = value; } } public int GlassPosition { get { return glass.Position; } } private void HandleAdaptorChanged (GroupAdaptor adaptor) { bool size_changed = box_counts.Length != adaptor.Count (); int [] box_values = new int [adaptor.Count ()]; if (tick_layouts != null) { foreach (Pango.Layout l in tick_layouts) { if (l != null) l.Dispose (); } } tick_layouts = new Pango.Layout [adaptor.Count ()]; int i = 0; while (i < adaptor.Count ()) { box_values [i] = adaptor.Value (i); string label = adaptor.TickLabel (i); if (label != null) { tick_layouts [i] = CreatePangoLayout (label); } i++; } if (glass.Position >= adaptor.Count()) glass.SetPosition (adaptor.Count() - 1); Counts = box_values; if (has_limits && size_changed) { min_limit.SetPosition (0, false); max_limit.SetPosition (adaptor.Count () - 1, false); } for (i = min_limit.Position; i < box_counts.Length; i++) if (box_counts [i] > 0) break; SetPosition (i < box_counts.Length ? i : min_limit.Position); ScrollTo (min_limit.Position); this.QueueDraw (); } private int [] Counts { set { bool min_found = false; box_count_max = 0; min_filled = 0; max_filled = 0; if (value != null) box_counts = value; else value = new int [0]; for (int i = 0; i < box_counts.Length; i++){ int count = box_counts [i]; box_count_max = Math.Max (count, box_count_max); if (count > 0) { if (!min_found) { min_filled = i; min_found = true; } max_filled = i; } } } } public enum RangeType { All, Fixed, Min } private RangeType mode = RangeType.Min; public RangeType Mode { get { return mode; } set { mode = value; if (Visible) GdkWindow.InvalidateRect (Allocation, false); } } private void ScrollTo (int position) { if (position == min_filled) position = 0; else if (position == max_filled) position = box_counts.Length - 1; Gdk.Rectangle box = new Box (this, position).Bounds; // Only scroll to position if we are not dragging if (!glass.Dragging) { if (box.Right > background.Right) Offset -= box.X + box.Width - (background.X + background.Width); else if (box.X < background.X) Offset += background.X - box.X; } } private int scroll_offset; public int Offset { get { return scroll_offset; } set { scroll_offset = value; int total_width = (int)(box_counts.Length * BoxWidth); if (total_width + scroll_offset < background.Width) scroll_offset = background.Width - total_width; if (total_width <= background.Width) scroll_offset = 0; UpdateButtons (); if (Visible) GdkWindow.InvalidateRect (Allocation, false); } } private void UpdateButtons () { left.Sensitive = (scroll_offset < 0); right.Sensitive = (box_counts.Length * BoxWidth > background.Width - scroll_offset); if (!left.Sensitive && left_delay.IsPending) left_delay.Stop (); if (!right.Sensitive && right_delay.IsPending) right_delay.Stop (); } private void BoxXHitFilled (double x, out int out_position) { x -= BoxX (0); double position = (x / BoxWidth); position = System.Math.Max (0, position); position = System.Math.Min (position, box_counts.Length - 1); if (box_counts [(int)position] > 0) { out_position = (int)position; } else { int upper = (int)position; while (upper < box_counts.Length && box_counts [upper] == 0) upper++; int lower = (int)position; while (lower >= 0 && box_counts [lower] == 0) lower--; if (lower == -1 && upper == box_counts.Length) { out_position = (int)position; } else if (lower == -1 && upper < box_counts.Length) { out_position = upper; } else if (upper == box_counts.Length && lower > -1){ out_position = lower; } else if (upper + 1 - position > position - lower) { out_position = lower; } else { out_position = upper; } } } private bool BoxXHit (double x, out int position) { x -= BoxX (0); position = (int) (x / BoxWidth); if (position < 0) { position = 0; return false; } else if (position >= box_counts.Length) { position = box_counts.Length -1; return false; } return true; } private bool BoxHit (double x, double y, out int position) { if (BoxXHit (x, out position)) { Box box = new Box (this, position); if (box.Bounds.Contains ((int) x, (int) y)) return true; position++; } return false; } public void SetPosition (int group) { if (!glass.Dragging) glass.SetPosition(group); } protected override bool OnButtonPressEvent (Gdk.EventButton args) { if (args.Button == 3) return DrawOrderMenu (args); double x = args.X + action.X; double y = args.Y + action.Y; if (glass.Contains (x, y)) { glass.StartDrag (x, y, args.Time); } else if (has_limits && min_limit.Contains (x, y)) { min_limit.StartDrag (x, y, args.Time); } else if (has_limits && max_limit.Contains (x, y)) { max_limit.StartDrag (x, y, args.Time); } else { int position; if (BoxHit (x, y, out position)) { BoxXHitFilled (x, out position); glass.UpdateGlass = true; glass.SetPosition (position); glass.UpdateGlass = false; return true; } } return base.OnButtonPressEvent (args); } protected override bool OnButtonReleaseEvent (Gdk.EventButton args) { double x = args.X + action.X; double y = args.Y + action.Y; if (glass.Dragging) { glass.EndDrag (x, y); } else if (min_limit.Dragging) { min_limit.EndDrag (x, y); } else if (max_limit.Dragging) { max_limit.EndDrag (x, y); } return base.OnButtonReleaseEvent (args); } public void UpdateLimits () { if (adaptor != null && has_limits && min_limit != null && max_limit != null) ((ILimitable)adaptor).SetLimits (min_limit.Position, max_limit.Position); } protected override bool OnMotionNotifyEvent (Gdk.EventMotion args) { double x = args.X + action.X; double y = args.Y + action.Y; //Rectangle box = glass.Bounds (); //Console.WriteLine ("please {0} and {1} in box {2}", x, y, box); if (glass == null) return base.OnMotionNotifyEvent (args); if (glass.Dragging) { glass.UpdateDrag (x, y); } else if (min_limit.Dragging) { min_limit.UpdateDrag (x, y); } else if (max_limit.Dragging) { max_limit.UpdateDrag (x, y); } else { glass.State = glass.Contains (x, y) ? StateType.Prelight : StateType.Normal; min_limit.State = min_limit.Contains (x, y) ? StateType.Prelight : StateType.Normal; max_limit.State = max_limit.Contains (x, y) ? StateType.Prelight : StateType.Normal; } return base.OnMotionNotifyEvent (args); } protected override void OnRealized () { SetFlag (WidgetFlags.Realized); GdkWindow = ParentWindow; base.OnRealized (); WindowAttr attr = WindowAttr.Zero; attr.WindowType = Gdk.WindowType.Child; attr.X = action.X; attr.Y = action.Y; attr.Width = action.Width; attr.Height = action.Height; attr.Wclass = WindowClass.InputOnly; attr.EventMask = (int) Events; attr.EventMask |= (int) (EventMask.ButtonPressMask | EventMask.KeyPressMask | EventMask.KeyReleaseMask | EventMask.ButtonReleaseMask | EventMask.PointerMotionMask); event_window = new Gdk.Window (GdkWindow, attr, (int) (WindowAttributesType.X | WindowAttributesType.Y)); event_window.UserData = this.Handle; } protected override void OnUnrealized () { event_window.Dispose (); event_window = null; base.OnUnrealized (); } private Double BoxWidth { get { switch (mode) { case RangeType.All: return Math.Max (1.0, background.Width / (double) box_counts.Length); case RangeType.Fixed: return background.Width / (double) 12; case RangeType.Min: return Math.Max (MIN_BOX_WIDTH, background.Width / (double) box_counts.Length); default: return (double) MIN_BOX_WIDTH; } } } private int BoxX (int item) { return scroll_offset + background.X + (int) Math.Round (BoxWidth * item); } private struct Box { Gdk.Rectangle bounds; Gdk.Rectangle bar; public Box (GroupSelector selector, int item) { bounds.Height = selector.background.Height; bounds.Y = selector.background.Y; bounds.X = selector.BoxX (item); bounds.Width = Math.Max (selector.BoxX (item + 1) - bounds.X, 1); if (item < 0 || item > selector.box_counts.Length - 1) return; double percent = selector.box_counts [item] / (double) Math.Max (selector.box_count_max, 1); bar = bounds; bar.Height = (int) Math.Ceiling ((bounds.Height - selector.box_top_padding) * percent); bar.Y += bounds.Height - bar.Height - 1; bar.Inflate (- selector.box_spacing, 0); } public Gdk.Rectangle Bounds { get { return bounds; } } public Gdk.Rectangle Bar { get { return bar; } } } private void DrawBox (Rectangle area, int item) { Box box = new Box (this, item); Rectangle bar = box.Bar; if (bar.Intersect (area, out area)) { if (item < min_limit.Position || item > max_limit.Position) { GdkWindow.DrawRectangle (Style.BackgroundGC (StateType.Active), true, area); } else { GdkWindow.DrawRectangle (Style.BaseGC (StateType.Selected), true, area); } } } public Rectangle TickBounds (int item) { Rectangle bounds = Rectangle.Zero; bounds.X = BoxX (item); bounds.Y = legend.Y + 3; bounds.Width = 1; bounds.Height = 6; return bounds; } public void DrawTick (Rectangle area, int item) { Rectangle tick = TickBounds (item); Pango.Layout layout = null; if (item < tick_layouts.Length) { layout = tick_layouts [item]; if (layout != null) { int width, height; layout.GetPixelSize (out width, out height); Style.PaintLayout (Style, GdkWindow, State, true, area, this, "GroupSelector:Tick", tick.X + 3, tick.Y + tick.Height, layout); } } if (layout == null) tick.Height /= 2; if (tick.Intersect (area, out area)) { GdkWindow.DrawRectangle (Style.ForegroundGC (State), true, area); } } protected override bool OnPopupMenu () { DrawOrderMenu (null); return true; } private bool DrawOrderMenu (Gdk.EventButton args) { Gtk.Menu order_menu = new Gtk.Menu(); order_menu.Append (App.Instance.Organizer.ReverseOrderAction.CreateMenuItem ()); GtkUtil.MakeMenuItem (order_menu, Catalog.GetString ("_Clear Date Range"), App.Instance.Organizer.HandleClearDateRange); if (args != null) order_menu.Popup (null, null, null, args.Button, args.Time); else order_menu.Popup (null, null, null, 0, Gtk.Global.CurrentEventTime); return true; } public abstract class Manipulator { protected GroupSelector selector; protected DelayedOperation timer; public bool Dragging; public bool UpdateGlass; public bool GlassUpdating; public Point DragStart; public Manipulator (GroupSelector selector) { this.selector = selector; timer = new DelayedOperation (50, new GLib.IdleHandler (DragTimeout)); } protected int drag_offset; public int DragOffset { set { Rectangle then = Bounds (); drag_offset = value; Rectangle now = Bounds (); if (selector.Visible) { selector.GdkWindow.InvalidateRect (then, false); selector.GdkWindow.InvalidateRect (now, false); } } get { if (Dragging) return drag_offset; else return 0; } } public virtual void StartDrag (double x, double y, uint time) { State = StateType.Active; //timer.Start (); Dragging = true; DragStart.X = (int)x; DragStart.Y = (int)y; } private bool DragTimeout () { int x, y; selector.GetPointer (out x, out y); x += selector.Allocation.X; y += selector.Allocation.Y; UpdateDrag ((double) x, (double) y); return true; } protected bool PositionValid (int position) { if (position < 0 || position > selector.box_counts.Length - 1) return false; return true; } public virtual void UpdateDrag (double x, double y) { Rectangle bounds = Bounds (); double drag_lower_limit = (selector.background.Left) - (bounds.Width/2); double drag_upper_limit = (selector.background.Right) - (bounds.Width/2); double calX = DragStart.X + (x - DragStart.X); if (calX >= drag_lower_limit && calX <= drag_upper_limit) { if (selector.right_delay.IsPending) selector.right_delay.Stop(); if (selector.left_delay.IsPending) selector.left_delay.Stop(); DragOffset = (int)x - DragStart.X; } else if (calX >= drag_upper_limit && selector.right.Sensitive && !selector.right_delay.IsPending) { // Ensure selector is at the limit if (bounds.Left != drag_upper_limit) DragOffset = (int)drag_upper_limit - DragStart.X; selector.Offset -= 10; selector.right_delay.Start(); } else if (calX <= drag_lower_limit && selector.left.Sensitive && !selector.left_delay.IsPending) { // Ensure selector is at the limit if (bounds.Left != drag_lower_limit) DragOffset = (int)drag_lower_limit - DragStart.X; selector.Offset += 10; selector.left_delay.Start(); } } public virtual void EndDrag (double x, double y) { timer.Stop (); Rectangle box = Bounds (); double middle = box.X + (box.Width / 2.0); int position; DragOffset = 0; Dragging = false; if (selector.BoxXHit (middle, out position)) { this.SetPosition (position); State = StateType.Prelight; } else { State = selector.State; } } private StateType state; public StateType State { get { return state; } set { if (state != value) { selector.GdkWindow.InvalidateRect (Bounds (), false); } state = value; } } public void SetPosition (int position) { SetPosition (position, true); } public void SetPosition (int position, bool update) { if (! PositionValid (position)) return; Rectangle then = Bounds (); this.position = position; Rectangle now = Bounds (); if (selector.Visible) { then = now.Union (then); selector.GdkWindow.InvalidateRect (then, false); //selector.GdkWindow.InvalidateRect (now, false); } if (update) PositionChanged (); } private int position; public int Position { get { return position; } } public abstract void Draw (Rectangle area); public abstract void PositionChanged (); public abstract Rectangle Bounds (); public virtual bool Contains (double x, double y) { return Bounds ().Contains ((int)x, (int)y); } } private class Glass : Manipulator { Gtk.Window popup_window; Gtk.Label popup_label; int drag_position; public Glass (GroupSelector selector) : base (selector) { popup_window = new ToolTipWindow (); popup_label = new Gtk.Label (String.Empty); popup_label.Show (); popup_window.Add (popup_label); } public int handle_height = 15; private int border { get { return selector.box_spacing * 2; } } private void UpdatePopupPosition () { int x = 0, y = 0; Rectangle bounds = Bounds (); Requisition requisition = popup_window.SizeRequest (); popup_window.Resize (requisition.Width, requisition.Height); selector.GdkWindow.GetOrigin (out x, out y); x += bounds.X + (bounds.Width - requisition.Width) / 2; y += bounds.Y - requisition.Height; x = Math.Max (x, 0); x = Math.Min (x, selector.Screen.Width - requisition.Width); popup_window.Move (x, y); } public void MaintainPosition() { Rectangle box = Bounds (); double middle = box.X + (box.Width / 2.0); int current_position; if (selector.BoxXHit (middle, out current_position)) { if (current_position != drag_position) popup_label.Text = selector.Adaptor.GlassLabel (current_position); drag_position = current_position; } UpdatePopupPosition (); selector.ScrollTo (drag_position); } public override void StartDrag (double x, double y, uint time) { if (!PositionValid (Position)) return; base.StartDrag (x, y, time); popup_label.Text = selector.Adaptor.GlassLabel (this.Position); popup_window.Show (); UpdatePopupPosition (); drag_position = this.Position; } public override void UpdateDrag (double x, double y) { base.UpdateDrag (x, y); MaintainPosition(); } public override void EndDrag (double x, double y) { timer.Stop (); Rectangle box = Bounds (); double middle = box.X + (box.Width / 2.0); int position; DragOffset = 0; Dragging = false; selector.BoxXHitFilled (middle, out position); UpdateGlass = true; this.SetPosition (position); UpdateGlass = false; State = StateType.Prelight; popup_window.Hide (); } private Rectangle InnerBounds () { Rectangle box = new Box (selector, Position).Bounds; if (Dragging) { box.X = DragStart.X + DragOffset; } else { box.X += DragOffset; } return box; } public override Rectangle Bounds () { Rectangle box = InnerBounds (); box.Inflate (border, border); box.Height += handle_height; return box; } public override void Draw (Rectangle area) { if (! PositionValid (Position)) return; Rectangle inner = InnerBounds (); Rectangle bounds = Bounds (); if (! bounds.Intersect (area, out area)) return; int i = 0; Rectangle box = inner; box.Width -= 1; box.Height -= 1; while (i < border) { box.Inflate (1, 1); selector.Style.BackgroundGC (State).ClipRectangle = area; selector.GdkWindow.DrawRectangle (selector.Style.BackgroundGC (State), false, box); i++; } Style.PaintFlatBox (selector.Style, selector.GdkWindow, State, ShadowType.In, area, selector, "glass", bounds.X, inner.Y + inner.Height + border, bounds.Width, handle_height); Style.PaintHandle (selector.Style, selector.GdkWindow, State, ShadowType.In, area, selector, "glass", bounds.X, inner.Y + inner.Height + border, bounds.Width, handle_height, Orientation.Horizontal); Style.PaintShadow (selector.Style, selector.GdkWindow, State, ShadowType.Out, area, selector, null, bounds.X, bounds.Y, bounds.Width, bounds.Height); Style.PaintShadow (selector.Style, selector.GdkWindow, State, ShadowType.In, area, selector, null, inner.X, inner.Y, inner.Width, inner.Height); } public override void PositionChanged () { GlassUpdating = true; if (Dragging || UpdateGlass) selector.adaptor.SetGlass (Position); selector.ScrollTo (Position); GlassUpdating = false; } } public class Limit : Manipulator { int width = 10; int handle_height = 10; public enum LimitType { Min, Max } private LimitType limit_type; public override Rectangle Bounds () { int limit_offset = limit_type == LimitType.Max ? 1 : 0; Rectangle bounds = new Rectangle (0, 0, width, selector.background.Height + handle_height); if (Dragging) { bounds.X = DragStart.X + DragOffset; } else { bounds.X = DragOffset + selector.BoxX (Position + limit_offset) - bounds.Width /2; } bounds.Y = selector.background.Y - handle_height/2; return bounds; } public override void Draw (Rectangle area) { Rectangle bounds = Bounds (); Rectangle top = new Rectangle (bounds.X, bounds.Y, bounds.Width, handle_height); Rectangle bottom = new Rectangle (bounds.X, bounds.Y + bounds.Height - handle_height, bounds.Width, handle_height); Style.PaintBox (selector.Style, selector.GdkWindow, State, ShadowType.Out, area, selector, null, top.X, top.Y, top.Width, top.Height); Style.PaintBox (selector.Style, selector.GdkWindow, State, ShadowType.Out, area, selector, null, bottom.X, bottom.Y, bottom.Width, bottom.Height); } public Limit (GroupSelector selector, LimitType type) : base (selector) { limit_type = type; } public override void PositionChanged () { selector.UpdateLimits (); } } protected override void OnMapped () { base.OnMapped (); if (event_window != null) event_window.Show (); } protected override void OnUnmapped () { base.OnUnmapped (); if (event_window != null) event_window.Hide (); } protected override bool OnExposeEvent (Gdk.EventExpose args) { Rectangle area; //Console.WriteLine ("expose {0}", args.Area); foreach (Rectangle sub in args.Region.GetRectangles ()) { if (sub.Intersect (background, out area)) { Rectangle active = background; int min_x = BoxX (min_limit.Position); int max_x = BoxX (max_limit.Position + 1); active.X = min_x; active.Width = max_x - min_x; if (active.Intersect (area, out active)) GdkWindow.DrawRectangle (Style.BaseGC (State), true, active); int i; BoxXHit (area.X, out i); int end; BoxXHit (area.X + area.Width, out end); while (i <= end) DrawBox (area, i++); } Style.PaintShadow (this.Style, GdkWindow, State, ShadowType.In, area, this, null, background.X, background.Y, background.Width, background.Height); if (sub.Intersect (legend, out area)) { int i = 0; while (i < box_counts.Length) DrawTick (area, i++); } if (has_limits) { if (min_limit != null) { min_limit.Draw (sub); } if (max_limit != null) { max_limit.Draw (sub); } } if (glass != null) { glass.Draw (sub); } } return base.OnExposeEvent (args); } protected override void OnSizeRequested (ref Requisition requisition) { left.SizeRequest (); right.SizeRequest (); requisition.Width = 500; requisition.Height = (int) (LegendHeight () + glass.handle_height + 3 * border); } // FIXME I can't find a c# wrapper for the C PANGO_PIXELS () macro // So this Function is for that. public static int PangoPixels (int val) { return val >= 0 ? (val + 1024 / 2) / 1024 : (val - 1024 / 2) / 1024; } private int LegendHeight () { int max_height = 0; Pango.FontMetrics metrics = this.PangoContext.GetMetrics (this.Style.FontDescription, Pango.Language.FromString ("en_US")); max_height += PangoPixels (metrics.Ascent + metrics.Descent); foreach (Pango.Layout l in tick_layouts) { if (l != null) { int width, height; l.GetPixelSize (out width, out height); max_height = Math.Max (height, max_height); } } return (int) (max_height * 1.5); } private bool HandleScrollRight () { if (glass.Dragging) glass.MaintainPosition (); Offset -= 10; return true; } private bool HandleScrollLeft () { if (glass.Dragging) glass.MaintainPosition (); Offset += 10; return true; } private void HandleLeftPressed (object sender, System.EventArgs ars) { HandleScrollLeft (); left_delay.Start (); } private void HandleRightPressed (object sender, System.EventArgs ars) { HandleScrollRight (); right_delay.Start (); } [GLib.ConnectBefore] private void HandleScrollReleaseEvent (object sender, ButtonReleaseEventArgs args) { right_delay.Stop (); left_delay.Stop (); } protected override void OnSizeAllocated (Gdk.Rectangle alloc) { base.OnSizeAllocated (alloc); int legend_height = LegendHeight (); Gdk.Rectangle bar = new Rectangle (alloc.X + border, alloc.Y + border, alloc.Width - 2 * border, alloc.Height - 2 * border - glass.handle_height); if (left.Allocation.Y != bar.Y || left.Allocation.X != bar.X) { left.SetSizeRequest (-1, bar.Height); this.Move (left, bar.X - Allocation.X, bar.Y - Allocation.Y); } if (right.Allocation.Y != bar.Y || right.Allocation.X != bar.X + bar.Width - right.Allocation.Width) { right.SetSizeRequest (-1, bar.Height); this.Move (right, bar.X - Allocation.X + bar.Width - right.Allocation.Width, bar.Y - Allocation.Y); } background = new Rectangle (bar.X + left.Allocation.Width, bar.Y, bar.Width - left.Allocation.Width - right.Allocation.Width, bar.Height); legend = new Rectangle (background.X, background.Y, background.Width, legend_height); action = background.Union (glass.Bounds ()); if (event_window != null) event_window.MoveResize (action.X, action.Y, action.Width, action.Height); this.Offset = this.Offset; UpdateButtons (); } public void ResetLimits () { min_limit.SetPosition(0,false); max_limit.SetPosition(adaptor.Count () - 1, false); } public void SetLimitsToDates(DateTime start, DateTime stop) { if (((TimeAdaptor)adaptor).OrderAscending) { min_limit.SetPosition(((TimeAdaptor)adaptor).IndexFromDate(start),false); max_limit.SetPosition(((TimeAdaptor)adaptor).IndexFromDate(stop),false); } else { min_limit.SetPosition(((TimeAdaptor)adaptor).IndexFromDate(stop),false); max_limit.SetPosition(((TimeAdaptor)adaptor).IndexFromDate(start),false); } } public GroupSelector () : base () { SetFlag (WidgetFlags.NoWindow); background = Rectangle.Zero; glass = new Glass (this); min_limit = new Limit (this, Limit.LimitType.Min); max_limit = new Limit (this, Limit.LimitType.Max); left = new Gtk.Button (); //left.Add (new Gtk.Image (Gtk.Stock.GoBack, Gtk.IconSize.Button)); left.Add (new Gtk.Arrow (Gtk.ArrowType.Left, Gtk.ShadowType.None)); left.Relief = Gtk.ReliefStyle.None; //left.Clicked += HandleScrollLeft; left.Pressed += HandleLeftPressed; left.ButtonReleaseEvent += HandleScrollReleaseEvent; left_delay = new DelayedOperation (50, new GLib.IdleHandler (HandleScrollLeft)); right = new Gtk.Button (); //right.Add (new Gtk.Image (Gtk.Stock.GoForward, Gtk.IconSize.Button)); right.Add (new Gtk.Arrow (Gtk.ArrowType.Right, Gtk.ShadowType.None)); right.Relief = Gtk.ReliefStyle.None; right.Pressed += HandleRightPressed; right.ButtonReleaseEvent += HandleScrollReleaseEvent; right_delay = new DelayedOperation (50, new GLib.IdleHandler (HandleScrollRight)); //right.Clicked += HandleScrollRight; this.Put (left, 0, 0); this.Put (right, 100, 0); left.Show (); right.Show (); CanFocus = true; Mode = RangeType.Min; UpdateButtons (); } public GroupSelector (IntPtr raw) : base (raw) {} } } f-spot-0.8.2/src/Clients/MainApp/FSpot/UriCollection.cs0000644000175000017500000001012611503404761023114 0ustar00rubenruben00000000000000/* * UriCollection.cs * * Author(s): * Larry Ewing (lewing@novell.com) * Stephane Delcroix (stephane@delcroix.org) * * Copyright (c) 2005-2009 Novell, Inc. * Copyright (c) 2007 Stephane Delcroix * * This is free software. See COPYING for details */ using System; using System.IO; using System.Collections; using System.Collections.Generic; using System.Xml; using Hyena; using GLib; using FSpot.Core; using FSpot.Imaging; namespace FSpot { public class UriCollection : PhotoList { public UriCollection () : base (new IPhoto [0]) { } public UriCollection (System.IO.FileInfo [] files) : this () { LoadItems (files); } public UriCollection (SafeUri [] uri) : this () { LoadItems (uri); } public void Add (SafeUri uri) { if (ImageFile.HasLoader (uri)) { //Console.WriteLine ("using image loader {0}", uri.ToString ()); Add (new FilePhoto (uri)); } else { GLib.FileInfo info = FileFactory.NewForUri (uri).QueryInfo ("standard::type,standard::content-type", FileQueryInfoFlags.None, null); if (info.FileType == FileType.Directory) new DirectoryLoader (this, uri); else { // FIXME ugh... if (info.ContentType == "text/xml" || info.ContentType == "application/xml" || info.ContentType == "application/rss+xml" || info.ContentType == "text/plain") { new RssLoader (this, uri); } } } } public void LoadItems (SafeUri [] uris) { foreach (SafeUri uri in uris) { Add (uri); } } private class RssLoader { public RssLoader (UriCollection collection, SafeUri uri) { XmlDocument doc = new XmlDocument (); doc.Load (uri.ToString ()); XmlNamespaceManager ns = new XmlNamespaceManager (doc.NameTable); ns.AddNamespace ("media", "http://search.yahoo.com/mrss/"); ns.AddNamespace ("pheed", "http://www.pheed.com/pheed/"); ns.AddNamespace ("apple", "http://www.apple.com/ilife/wallpapers"); List items = new List (); XmlNodeList list = doc.SelectNodes ("/rss/channel/item/media:content", ns); foreach (XmlNode item in list) { SafeUri image_uri = new SafeUri (item.Attributes ["url"].Value); Hyena.Log.DebugFormat ("flickr uri = {0}", image_uri.ToString ()); items.Add (new FilePhoto (image_uri)); } if (list.Count < 1) { list = doc.SelectNodes ("/rss/channel/item/pheed:imgsrc", ns); foreach (XmlNode item in list) { SafeUri image_uri = new SafeUri (item.InnerText.Trim ()); Hyena.Log.DebugFormat ("pheed uri = {0}", uri); items.Add (new FilePhoto (image_uri)); } } if (list.Count < 1) { list = doc.SelectNodes ("/rss/channel/item/apple:image", ns); foreach (XmlNode item in list) { SafeUri image_uri = new SafeUri (item.InnerText.Trim ()); Hyena.Log.DebugFormat ("apple uri = {0}", uri); items.Add (new FilePhoto (image_uri)); } } collection.Add (items.ToArray ()); } } private class DirectoryLoader { UriCollection collection; GLib.File file; public DirectoryLoader (UriCollection collection, SafeUri uri) { this.collection = collection; file = FileFactory.NewForUri (uri); file.EnumerateChildrenAsync ("standard::*", FileQueryInfoFlags.None, 500, null, InfoLoaded); } void InfoLoaded (GLib.Object o, GLib.AsyncResult res) { List items = new List (); foreach (GLib.FileInfo info in file.EnumerateChildrenFinish (res)) { SafeUri i = new SafeUri (file.GetChild (info.Name).Uri); Hyena.Log.DebugFormat ("testing uri = {0}", i); if (ImageFile.HasLoader (i)) items.Add (new FilePhoto (i)); } ThreadAssist.ProxyToMain (() => { collection.Add (items.ToArray ()); }); } } protected void LoadItems (System.IO.FileInfo [] files) { List items = new List (); foreach (var f in files) { if (ImageFile.HasLoader (new SafeUri (f.FullName))) { Hyena.Log.Debug (f.FullName); items.Add (new FilePhoto (new SafeUri (f.FullName))); } } list = items; this.Reload (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/XScreenSaverSlide.cs0000644000175000017500000000314611503404761023676 0ustar00rubenruben00000000000000using Gtk; using Gdk; using System; using GLib; using System.Runtime.InteropServices; using FSpot; using FSpot.Utils; using Hyena; namespace FSpot { public class XScreenSaverSlide : Gtk.Window { public const string ScreenSaverEnviroment = "XSCREENSAVER_WINDOW"; public XScreenSaverSlide () : base (String.Empty) { } protected override void OnRealized () { string env = Environment.GetEnvironmentVariable (ScreenSaverEnviroment); if (env != null) { try { env = env.ToLower (); if (env.StartsWith ("0x")) env = env.Substring (2); uint xid = UInt32.Parse (env, System.Globalization.NumberStyles.HexNumber); GdkWindow = Gdk.Window.ForeignNew (xid); Style.Attach (GdkWindow); GdkWindow.Events = EventMask.ExposureMask | EventMask.StructureMask | EventMask.EnterNotifyMask | EventMask.LeaveNotifyMask | EventMask.FocusChangeMask; Style.SetBackground (GdkWindow, Gtk.StateType.Normal); GdkWindow.SetDecorations ((Gdk.WMDecoration) 0); GdkWindow.UserData = this.Handle; SetFlag (WidgetFlags.Realized); SizeRequest (); Gdk.Rectangle geom; int depth; GdkWindow.GetGeometry (out geom.X, out geom.Y, out geom.Width, out geom.Height, out depth); SizeAllocate (new Gdk.Rectangle (geom.X, geom.Y, geom.Width, geom.Height)); Resize (geom.Width, geom.Height); return; } catch (System.Exception e) { Hyena.Log.Exception (e); } } else { Hyena.Log.DebugFormat ("{0} not set, falling back to window", ScreenSaverEnviroment); } SetSizeRequest (640, 480); base.OnRealized (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/Accelerometer.cs0000644000175000017500000000504311503404761023115 0ustar00rubenruben00000000000000// // Support for the ThinkPad accelerometer. // using System; using System.IO; using FSpot.Utils; using Hyena; using TagLib.Image; namespace FSpot { public class Accelerometer { public const string SYSFS_FILE = "/sys/devices/platform/hdaps/position"; public static event EventHandler OrientationChanged; public enum Orient { Normal, TiltClockwise, TiltCounterclockwise, } private static Orient current_orientation; public static Orient CurrentOrientation { get { return current_orientation; } } public Accelerometer () { } public static ImageOrientation GetViewOrientation (ImageOrientation po) { if (timer == 0 && available) SetupAccelerometer (); if (current_orientation == Orient.TiltCounterclockwise) return FSpot.Utils.PixbufUtils.Rotate90 (po); if (current_orientation == Orient.TiltClockwise) return FSpot.Utils.PixbufUtils.Rotate270 (po); return po; } static uint timer = 0; static bool available = true; public static void SetupAccelerometer () { if (!System.IO.File.Exists (SYSFS_FILE)) { available = false; return; } int x, y; // Call once to set a baseline value. // Hopefully the laptop is flat when this is // called. GetHDAPSCoords (out x, out y); timer = GLib.Timeout.Add (500, new GLib.TimeoutHandler (CheckOrientation)); } private static bool CheckOrientation () { Orient new_orient = GetScreenOrientation (); if (new_orient != current_orientation) { current_orientation = new_orient; EventHandler eh = OrientationChanged; if (eh != null) eh (null, EventArgs.Empty); Log.Debug ("Laptop orientation changed..."); } return true; } public static Orient GetScreenOrientation () { int x, y; GetHDAPSCoords (out x, out y); if (x > 40) return Orient.TiltClockwise; if (x < -40) return Orient.TiltCounterclockwise; return Orient.Normal; } static int base_x = -1000; // initial nonsense values static int base_y = -1000; private static void GetHDAPSCoords (out int x, out int y) { try { using (Stream file = System.IO.File.OpenRead (SYSFS_FILE)) { StreamReader sr = new StreamReader (file); string s = sr.ReadLine (); string [] ss = s.Substring (1, s.Length - 2).Split (','); x = int.Parse (ss [0]); y = int.Parse (ss [1]); if (base_x == -1000) base_x = x; if (base_y == -1000) base_y = y; x -= base_x; y -= base_y; return; } } catch (IOException) { x = 0; y = 0; } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/RotateCommand.cs0000644000175000017500000001505611503404761023105 0ustar00rubenruben00000000000000/* * Filters/IFilter.cs * * Author(s) * Larry Ewing * * This is free software. See COPYING for details * */ using System; using System.IO; using Gtk; using Gdk; using FSpot; using FSpot.UI.Dialog; using Hyena; using Hyena.Widgets; using FSpot.Utils; using FSpot.Core; using Mono.Unix; namespace FSpot { public class RotateException : ApplicationException { public string path; public bool ReadOnly = false; public string Path { get { return path; } } public RotateException (string msg, string path) : this (msg, path, false) {} public RotateException (string msg, string path, bool ro) : base (msg) { this.path = path; this.ReadOnly = ro; } } public enum RotateDirection { Clockwise, Counterclockwise, } public class RotateOperation { IPhoto item; RotateDirection direction; bool done; public RotateOperation (IPhoto item, RotateDirection direction) { this.item = item; this.direction = direction; done = false; } private static void RotateOrientation (string original_path, RotateDirection direction) { try { var uri = new SafeUri (original_path); using (var metadata = Metadata.Parse (uri)) { metadata.EnsureAvailableTags (); var tag = metadata.ImageTag; var orientation = direction == RotateDirection.Clockwise ? FSpot.Utils.PixbufUtils.Rotate90 (tag.Orientation) : FSpot.Utils.PixbufUtils.Rotate270 (tag.Orientation); tag.Orientation = orientation; var always_sidecar = Preferences.Get (Preferences.METADATA_ALWAYS_USE_SIDECAR); metadata.SaveSafely (uri, always_sidecar); XdgThumbnailSpec.RemoveThumbnail (uri); } } catch (Exception e) { Log.DebugException (e); throw new RotateException (Catalog.GetString ("Unable to rotate this type of photo"), original_path); } } private void Rotate (string original_path, RotateDirection dir) { RotateOrientation (original_path, dir); } public bool Step () { if (done) return false; GLib.FileInfo info = GLib.FileFactory.NewForUri (item.DefaultVersion.Uri).QueryInfo ("access::can-write", GLib.FileQueryInfoFlags.None, null); if (!info.GetAttributeBoolean("access::can-write")) { throw new RotateException (Catalog.GetString ("Unable to rotate readonly file"), item.DefaultVersion.Uri, true); } Rotate (item.DefaultVersion.Uri, direction); done = true; return !done; } } public class RotateMultiple { RotateDirection direction; IPhoto [] items; int index; RotateOperation op; public int Index { get { return index; } } public IPhoto [] Items { get { return items; } } public RotateMultiple (IPhoto [] items, RotateDirection direction) { this.direction = direction; this.items = items; index = 0; } public bool Step () { if (index >= items.Length) return false; if (op == null) op = new RotateOperation (items [index], direction); if (op.Step ()) return true; else { index++; op = null; } return (index < items.Length); } } } public class RotateCommand { private Gtk.Window parent_window; public RotateCommand (Gtk.Window parent_window) { this.parent_window = parent_window; } public bool Execute (RotateDirection direction, IPhoto [] items) { ProgressDialog progress_dialog = null; if (items.Length > 1) progress_dialog = new ProgressDialog (Catalog.GetString ("Rotating photos"), ProgressDialog.CancelButtonType.Stop, items.Length, parent_window); RotateMultiple op = new RotateMultiple (items, direction); int readonly_count = 0; bool done = false; int index = 0; while (!done) { if (progress_dialog != null && op.Index != -1 && index < items.Length) if (progress_dialog.Update (String.Format (Catalog.GetString ("Rotating photo \"{0}\""), op.Items [op.Index].Name))) break; try { done = !op.Step (); } catch (RotateException re) { if (!re.ReadOnly) RunGenericError (re, re.Path, re.Message); else readonly_count++; } catch (GLib.GException) { readonly_count++; } catch (DirectoryNotFoundException e) { RunGenericError (e, op.Items [op.Index].DefaultVersion.Uri.LocalPath, Catalog.GetString ("Directory not found")); } catch (FileNotFoundException e) { RunGenericError (e, op.Items [op.Index].DefaultVersion.Uri.LocalPath, Catalog.GetString ("File not found")); } catch (Exception e) { RunGenericError (e, op.Items [op.Index].DefaultVersion.Uri.LocalPath); } index ++; } if (progress_dialog != null) progress_dialog.Destroy (); if (readonly_count > 0) RunReadonlyError (readonly_count); return true; } private void RunReadonlyError (int readonly_count) { string notice = Catalog.GetPluralString ("Unable to rotate photo", "Unable to rotate {0} photos", readonly_count); string desc = Catalog.GetPluralString ( "The photo could not be rotated because it is on a read only file system or media such as a CDROM. Please check the permissions and try again.", "{0} photos could not be rotated because they are on a read only file system or media such as a CDROM. Please check the permissions and try again.", readonly_count ); notice = String.Format (notice, readonly_count); desc = String.Format (desc, readonly_count); HigMessageDialog md = new HigMessageDialog (parent_window, DialogFlags.DestroyWithParent, MessageType.Error, ButtonsType.Close, notice, desc); md.Run(); md.Destroy(); } // FIXME shouldn't need this method, should catch all exceptions explicitly // so can present translated error messages. private void RunGenericError (System.Exception e, string path) { RunGenericError (e, path, e.Message); } private void RunGenericError (System.Exception e, string path, string msg) { string longmsg = String.Format (Catalog.GetString ("Received error \"{0}\" while attempting to rotate {1}"), msg, System.IO.Path.GetFileName (path)); HigMessageDialog md = new HigMessageDialog (parent_window, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.Ok, Catalog.GetString ("Error while rotating photo."), longmsg); md.Run (); md.Destroy (); } } f-spot-0.8.2/src/Clients/MainApp/FSpot/PhotoStore.cs0000644000175000017500000006750411503404761022463 0ustar00rubenruben00000000000000/* * PhotoStore.cs * * Author(s): * Ettore Perazzoli * Larry Ewing * Stephane Delcroix * * This is free software. See COPYING for details. */ using Gdk; using Gtk; using Mono.Unix; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; using System; using FSpot; using FSpot.Core; using FSpot.Database; using FSpot.Jobs; using FSpot.Query; using FSpot.Utils; using FSpot.Platform; using Hyena; using Hyena.Data.Sqlite; namespace FSpot { public class PhotoStore : DbStore { public int TotalPhotos { get { IDataReader reader = Database.Query("SELECT COUNT(*) AS photo_count FROM photos"); reader.Read (); int total = Convert.ToInt32 (reader ["photo_count"]); reader.Dispose (); return total; } } // FIXME this is a hack. Since we don't have Gnome.ThumbnailFactory.SaveThumbnail() in // GTK#, and generate them by ourselves directly with Gdk.Pixbuf, we have to make sure here // that the "large" thumbnail directory exists. private static void EnsureThumbnailDirectory () { string large_thumbnail_file_name_template = Gnome.Thumbnail.PathForUri ("file:///boo", Gnome.ThumbnailSize.Large); string large_thumbnail_directory_path = System.IO.Path.GetDirectoryName (large_thumbnail_file_name_template); if (! System.IO.File.Exists (large_thumbnail_directory_path)) System.IO.Directory.CreateDirectory (large_thumbnail_directory_path); } // Constructor public PhotoStore (FSpotDatabaseConnection database, bool is_new) : base (database, false) { EnsureThumbnailDirectory (); if (! is_new) return; Database.Execute ( "CREATE TABLE photos (\n" + " id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \n" + " time INTEGER NOT NULL, \n" + " base_uri STRING NOT NULL, \n" + " filename STRING NOT NULL, \n" + " description TEXT NOT NULL, \n" + " roll_id INTEGER NOT NULL, \n" + " default_version_id INTEGER NOT NULL, \n" + " rating INTEGER NULL \n" + ")"); Database.Execute ( "CREATE TABLE photo_tags (\n" + " photo_id INTEGER, \n" + " tag_id INTEGER, \n" + " UNIQUE (photo_id, tag_id)\n" + ")"); Database.Execute ( "CREATE TABLE photo_versions (\n"+ " photo_id INTEGER, \n" + " version_id INTEGER, \n" + " name STRING, \n" + " base_uri STRING NOT NULL, \n" + " filename STRING NOT NULL, \n" + " import_md5 TEXT NULL, \n" + " protected BOOLEAN, \n" + " UNIQUE (photo_id, version_id)\n" + ")"); Database.Execute ("CREATE INDEX idx_photo_versions_id ON photo_versions(photo_id)"); Database.Execute ("CREATE INDEX idx_photo_versions_import_md5 ON photo_versions(import_md5)"); Database.Execute ("CREATE INDEX idx_photos_roll_id ON photos(roll_id)"); } public bool HasDuplicate (IPhoto item) { var uri = item.DefaultVersion.Uri; // Check if the exact given uri already exists. var query = "SELECT COUNT(*) AS count FROM photo_versions WHERE base_uri = ? AND filename = ?"; var reader = Database.Query (new HyenaSqliteCommand (query, uri.GetBaseUri ().ToString (), uri.GetFilename ())); reader.Read (); int count = Convert.ToInt32 (reader ["count"]); reader.Dispose(); if (count > 0) return true; // Check by MD5. Won't import if there are photos with the same ImportMD5. string hash = item.DefaultVersion.ImportMD5; var condition = new ConditionWrapper (String.Format ("import_md5 = \"{0}\"", hash)); var dupes_by_hash = Count ("photo_versions", condition); if (dupes_by_hash > 0) return true; // This is a very lame check to overcome the lack of duplicate detect data right after transition. // // Does filename matching if there are files with no hash for the original version. condition = new ConditionWrapper ("version_id = 1 AND (import_md5 = \"\" OR import_md5 IS NULL)"); var have_no_hashes = Count ("photo_versions", condition); if (have_no_hashes > 0) { var name = uri.GetFilename (); DateTime? time = null; // Look for a filename match. reader = Database.Query (new HyenaSqliteCommand ("SELECT photos.id, photos.time, pv.filename FROM photos LEFT JOIN photo_versions AS pv ON pv.photo_id = photos.id WHERE pv.filename = ?", name)); while (reader.Read ()) { Log.DebugFormat ("Found one possible duplicate for {0}", reader["filename"].ToString ()); if (!time.HasValue) { // Only read time when needed time = item.Time; } if (reader["time"].ToString () == DateTimeUtil.FromDateTime (time.Value).ToString ()) { Log.Debug ("Skipping duplicate", uri); // Schedule a hash calculation job on the existing file. CalculateHashJob.Create (FSpot.App.Instance.Database.Jobs, Convert.ToUInt32 (reader["id"])); return true; } } reader.Dispose (); } // No matches return false; } public Photo CreateFrom (IPhoto item, uint roll_id) { Photo photo; long unix_time = DateTimeUtil.FromDateTime (item.Time); string description = item.Description ?? String.Empty; uint id = (uint) Database.Execute ( new HyenaSqliteCommand ( "INSERT INTO photos (time, base_uri, filename, description, roll_id, default_version_id, rating) " + "VALUES (?, ?, ?, ?, ?, ?, ?)", unix_time, item.DefaultVersion.BaseUri.ToString (), item.DefaultVersion.Filename, description, roll_id, Photo.OriginalVersionId, "0" ) ); photo = new Photo (id, unix_time); photo.AddVersionUnsafely (Photo.OriginalVersionId, item.DefaultVersion.BaseUri, item.DefaultVersion.Filename, item.DefaultVersion.ImportMD5, Catalog.GetString ("Original"), true); photo.AllVersionsLoaded = true; InsertVersion (photo, photo.DefaultVersion as PhotoVersion); EmitAdded (photo); return photo; } private void InsertVersion (Photo photo, PhotoVersion version) { Database.Execute (new HyenaSqliteCommand ( "INSERT OR IGNORE INTO photo_versions (photo_id, version_id, name, base_uri, filename, protected, import_md5) " + "VALUES (?, ?, ?, ?, ?, ?, ?)", photo.Id, version.VersionId, version.Name, version.BaseUri.ToString (), version.Filename, version.IsProtected, (version.ImportMD5 != String.Empty ? version.ImportMD5 : null))); } private void GetVersions (Photo photo) { IDataReader reader = Database.Query( new HyenaSqliteCommand("SELECT version_id, name, base_uri, filename, import_md5, protected " + "FROM photo_versions " + "WHERE photo_id = ?", photo.Id ) ); while (reader.Read ()) { uint version_id = Convert.ToUInt32 (reader ["version_id"]); string name = reader["name"].ToString (); var base_uri = new SafeUri (reader ["base_uri"].ToString (), true); var filename = reader ["filename"].ToString (); string import_md5 = reader["import_md5"] != null ? reader ["import_md5"].ToString () : null; bool is_protected = Convert.ToBoolean (reader["protected"]); photo.AddVersionUnsafely (version_id, base_uri, filename, import_md5, name, is_protected); } reader.Dispose(); } private void GetTags (Photo photo) { IDataReader reader = Database.Query(new HyenaSqliteCommand("SELECT tag_id FROM photo_tags WHERE photo_id = ?", photo.Id)); while (reader.Read ()) { uint tag_id = Convert.ToUInt32 (reader ["tag_id"]); Tag tag = App.Instance.Database.Tags.Get (tag_id) as Tag; photo.AddTagUnsafely (tag); } reader.Dispose(); } private void GetAllVersions (string ids) { IDataReader reader = Database.Query ("SELECT photo_id, version_id, name, base_uri, filename, import_md5, protected FROM photo_versions WHERE photo_id IN " + ids); while (reader.Read ()) { uint id = Convert.ToUInt32 (reader ["photo_id"]); Photo photo = LookupInCache (id); if (photo == null) { //Console.WriteLine ("Photo {0} not found", id); continue; } if (photo.AllVersionsLoaded) { //Console.WriteLine ("Photo {0} already Loaded", photo); continue; } if (reader ["version_id"] != null) { uint version_id = Convert.ToUInt32 (reader ["version_id"]); string name = reader["name"].ToString (); var base_uri = new SafeUri (reader ["base_uri"].ToString (), true); var filename = reader ["filename"].ToString (); string import_md5 = reader["import_md5"] != null ? reader ["import_md5"].ToString () : null; bool is_protected = Convert.ToBoolean (reader["protected"]); photo.AddVersionUnsafely (version_id, base_uri, filename, import_md5, name, is_protected); } /* string directory_path = null; if (reader [3] != null) directory_path = reader [3].ToString (); System.Console.WriteLine ("directory_path = {0}", directory_path); */ } reader.Dispose(); } private void GetAllTags (string ids) { IDataReader reader = Database.Query ("SELECT photo_id, tag_id FROM photo_tags WHERE photo_id IN " + ids); while (reader.Read ()) { uint id = Convert.ToUInt32 (reader ["photo_id"]); Photo photo = LookupInCache (id); if (photo == null) { //Console.WriteLine ("Photo {0} not found", id); continue; } if (photo.AllVersionsLoaded) { //Console.WriteLine ("Photo {0} already Loaded", photo.Id); continue; } if (reader [1] != null) { uint tag_id = Convert.ToUInt32 (reader ["tag_id"]); Tag tag = App.Instance.Database.Tags.Get (tag_id) as Tag; photo.AddTagUnsafely (tag); } } reader.Dispose(); } public override Photo Get (uint id) { Photo photo = LookupInCache (id); if (photo != null) return photo; IDataReader reader = Database.Query( new HyenaSqliteCommand("SELECT time, description, roll_id, default_version_id, rating " + "FROM photos " + "WHERE id = ?", id ) ); if (reader.Read ()) { photo = new Photo (id, Convert.ToInt64 (reader ["time"])); photo.Description = reader["description"].ToString (); photo.RollId = Convert.ToUInt32 (reader["roll_id"]); photo.DefaultVersionId = Convert.ToUInt32 (reader["default_version_id"]); photo.Rating = Convert.ToUInt32 (reader ["rating"]); AddToCache (photo); } reader.Dispose(); if (photo == null) return null; GetTags (photo); GetVersions (photo); return photo; } public Photo GetByUri (SafeUri uri) { Photo photo = null; var base_uri = uri.GetBaseUri (); var filename = uri.GetFilename (); IDataReader reader = Database.Query (new HyenaSqliteCommand ("SELECT id, time, description, roll_id, default_version_id, rating " + " FROM photos " + " LEFT JOIN photo_versions AS pv ON photos.id = pv.photo_id" + " WHERE (photos.base_uri = ? AND photos.filename = ?)" + " OR (pv.base_uri = ? AND pv.filename = ?)", base_uri.ToString (), filename, base_uri.ToString (), filename)); if (reader.Read ()) { photo = new Photo (Convert.ToUInt32 (reader ["id"]), Convert.ToInt64 (reader ["time"])); photo.Description = reader["description"].ToString (); photo.RollId = Convert.ToUInt32 (reader["roll_id"]); photo.DefaultVersionId = Convert.ToUInt32 (reader["default_version_id"]); photo.Rating = Convert.ToUInt32 (reader ["rating"]); } reader.Dispose(); if (photo == null) return null; Photo cached = LookupInCache (photo.Id); if (cached != null) return cached; AddToCache (photo); GetTags (photo); GetVersions (photo); return photo; } public void Remove (Tag []tags) { Photo [] photos = Query (tags, String.Empty, null, null); foreach (Photo photo in photos) photo.RemoveCategory (tags); Commit (photos); foreach (Tag tag in tags) App.Instance.Database.Tags.Remove (tag); } public void Remove (Photo []items) { EmitRemoved (items); ArrayList query_builder = new ArrayList (items.Length); for (int i = 0; i < items.Length; i++) { query_builder.Add (String.Format ("{0}", items[i].Id)); RemoveFromCache (items[i]); } String id_list = String.Join ("','", ((string []) query_builder.ToArray (typeof (string)))); Database.Execute (String.Format ("DELETE FROM photos WHERE id IN ('{0}')", id_list)); Database.Execute (String.Format ("DELETE FROM photo_tags WHERE photo_id IN ('{0}')", id_list)); Database.Execute (String.Format ("DELETE FROM photo_versions WHERE photo_id IN ('{0}')", id_list)); } public override void Remove (Photo item) { Remove (new Photo [] { (Photo)item }); } public override void Commit (Photo item) { Commit (new Photo [] {item}); } public void Commit (Photo [] items) { uint timer = Log.DebugTimerStart (); // Only use a transaction for multiple saves. Avoids recursive transactions. // TODO. bool use_transactions = true; //!Database.InTransaction && items.Length > 1; //if (use_transactions) // Database.BeginTransaction (); // FIXME: this hack is used, because HyenaSqliteConnection does not support // the InTransaction propery try { Database.BeginTransaction (); } catch { use_transactions = false; } PhotosChanges changes = new PhotosChanges (); foreach (DbItem item in items) changes |= Update ((Photo)item); if (use_transactions) Database.CommitTransaction (); EmitChanged (items, new PhotoEventArgs (items, changes)); Log.DebugTimerPrint (timer, "Commit took {0}"); } private PhotoChanges Update (Photo photo) { PhotoChanges changes = photo.Changes; // Update photo. if (changes.DescriptionChanged || changes.DefaultVersionIdChanged || changes.TimeChanged || changes.UriChanged || changes.RatingChanged || changes.MD5SumChanged ) Database.Execute ( new HyenaSqliteCommand ( "UPDATE photos " + "SET description = ?, " + " default_version_id = ?, " + " time = ?, " + " base_uri = ?, " + " filename = ?, " + " rating = ? " + "WHERE id = ? ", photo.Description, photo.DefaultVersionId, DateTimeUtil.FromDateTime (photo.Time), photo.VersionUri (Photo.OriginalVersionId).GetBaseUri ().ToString (), photo.VersionUri (Photo.OriginalVersionId).GetFilename (), String.Format ("{0}", photo.Rating), photo.Id ) ); // Update tags. if (changes.TagsRemoved != null) foreach (Tag tag in changes.TagsRemoved) Database.Execute (new HyenaSqliteCommand ( "DELETE FROM photo_tags WHERE photo_id = ? AND tag_id = ?", photo.Id, tag.Id)); if (changes.TagsAdded != null) foreach (Tag tag in changes.TagsAdded) Database.Execute (new HyenaSqliteCommand ( "INSERT OR IGNORE INTO photo_tags (photo_id, tag_id) " + "VALUES (?, ?)", photo.Id, tag.Id)); // Update versions. if (changes.VersionsRemoved != null) foreach (uint version_id in changes.VersionsRemoved) Database.Execute (new HyenaSqliteCommand ( "DELETE FROM photo_versions WHERE photo_id = ? AND version_id = ?", photo.Id, version_id)); if (changes.VersionsAdded != null) foreach (uint version_id in changes.VersionsAdded) { PhotoVersion version = photo.GetVersion (version_id) as PhotoVersion; InsertVersion (photo, version); } if (changes.VersionsModified != null) foreach (uint version_id in changes.VersionsModified) { PhotoVersion version = photo.GetVersion (version_id) as PhotoVersion; Database.Execute (new HyenaSqliteCommand ( "UPDATE photo_versions SET name = ?, " + "base_uri = ?, filename = ?, protected = ?, import_md5 = ? " + "WHERE photo_id = ? AND version_id = ?", version.Name, version.BaseUri.ToString (), version.Filename, version.IsProtected, (version.ImportMD5 != String.Empty ? version.ImportMD5 : null), photo.Id, version_id)); } photo.Changes = null; return changes; } public void CalculateMD5Sum (Photo photo) { foreach (uint version_id in photo.VersionIds) { PhotoVersion version = photo.GetVersion (version_id) as PhotoVersion; // Don't overwrite MD5 sums that are already calculated. if (version.ImportMD5 != String.Empty && version.ImportMD5 != null) continue; string version_md5_sum = HashUtils.GenerateMD5 (version.Uri); version.ImportMD5 = version_md5_sum; photo.Changes.ChangeVersion (version_id); } Commit (photo); } public int Count (string table_name, params IQueryCondition [] conditions) { StringBuilder query_builder = new StringBuilder ("SELECT COUNT(*) AS count FROM " + table_name + " "); bool where_added = false; foreach (IQueryCondition condition in conditions) { if (condition == null) continue; if (condition is IOrderCondition) continue; query_builder.Append (where_added ? " AND " : " WHERE "); query_builder.Append (condition.SqlClause ()); where_added = true; } IDataReader reader = Database.Query (query_builder.ToString()); reader.Read (); int count = Convert.ToInt32 (reader ["count"]); reader.Dispose(); return count; } public int [] IndicesOf (string table_name, uint [] items) { StringBuilder query_builder = new StringBuilder ("SELECT ROWID AS row_id FROM "); query_builder.Append (table_name); query_builder.Append (" WHERE id IN ("); for (int i = 0; i < items.Length; i++) { query_builder.Append (items [i]); query_builder.Append ((i != items.Length - 1) ? ", " : ")" ); } return IndicesOf (query_builder.ToString ()); } public int IndexOf (string table_name, Photo photo) { string query = String.Format ("SELECT ROWID AS row_id FROM {0} WHERE id = {1}", table_name, photo.Id); return IndexOf (query); } public int IndexOf (string table_name, DateTime time, bool asc) { string query = String.Format ("SELECT ROWID AS row_id FROM {0} WHERE time {2} {1} ORDER BY time {3} LIMIT 1", table_name, DateTimeUtil.FromDateTime (time), asc ? ">=" : "<=", asc ? "ASC" : "DESC"); return IndexOf (query); } private int IndexOf (string query) { uint timer = Log.DebugTimerStart (); IDataReader reader = Database.Query (query); int index = - 1; if (reader.Read ()) index = Convert.ToInt32 (reader ["row_id"]); reader.Dispose(); Log.DebugTimerPrint (timer, "IndexOf took {0} : " + query); return index - 1; //ROWID starts counting at 1 } int [] IndicesOf (string query) { uint timer = Log.DebugTimerStart (); List list = new List (); IDataReader reader = Database.Query (query); while (reader.Read ()) list.Add (Convert.ToInt32 (reader ["row_id"]) - 1); reader.Dispose (); Log.DebugTimerPrint (timer, "IndicesOf took {0} : " + query); return list.ToArray (); } public Dictionary PhotosPerMonth (params IQueryCondition [] conditions) { uint timer = Log.DebugTimerStart (); Dictionary val = new Dictionary (); //Sqlite is way more efficient querying to a temp then grouping than grouping at once Database.Execute ("DROP TABLE IF EXISTS population"); StringBuilder query_builder = new StringBuilder ("CREATE TEMPORARY TABLE population AS SELECT strftime('%Y%m', datetime(time, 'unixepoch')) AS month FROM photos"); bool where_added = false; foreach (IQueryCondition condition in conditions) { if (condition == null) continue; if (condition is IOrderCondition) continue; query_builder.Append (where_added ? " AND " : " WHERE "); query_builder.Append (condition.SqlClause ()); where_added = true; } Database.Execute (query_builder.ToString ()); int minyear = Int32.MaxValue; int maxyear = Int32.MinValue; IDataReader reader = Database.Query ("SELECT COUNT (*) as count, month from population GROUP BY month"); while (reader.Read ()) { string yyyymm = reader ["month"].ToString (); int count = Convert.ToInt32 (reader ["count"]); int year = Convert.ToInt32 (yyyymm.Substring (0,4)); maxyear = Math.Max (year, maxyear); minyear = Math.Min (year, minyear); int month = Convert.ToInt32 (yyyymm.Substring (4)); if (!val.ContainsKey (year)) val.Add (year, new int[12]); val[year][month-1] = count; } reader.Dispose (); //Fill the blank for (int i = minyear; i <= maxyear; i++) if (!val.ContainsKey (i)) val.Add (i, new int[12]); Log.DebugTimerPrint (timer, "PhotosPerMonth took {0}"); return val; } // Queries. [Obsolete ("drop this, use IQueryCondition correctly instead")] public Photo [] Query (Tag [] tags) { return Query (tags, null, null, null, null); } private string BuildQuery (params IQueryCondition [] conditions) { StringBuilder query_builder = new StringBuilder ("SELECT * FROM photos "); bool where_added = false; bool hidden_contained = false; foreach (IQueryCondition condition in conditions) { if (condition == null) continue; if (condition is HiddenTag) hidden_contained = true; if (condition is IOrderCondition) continue; string sql_clause = condition.SqlClause (); if (sql_clause == null || sql_clause.Trim () == String.Empty) continue; query_builder.Append (where_added ? " AND " : " WHERE "); query_builder.Append (sql_clause); where_added = true; } /* if a HiddenTag condition is not explicitly given, we add one */ if ( ! hidden_contained) { string sql_clause = HiddenTag.HideHiddenTag.SqlClause (); if (sql_clause != null && sql_clause.Trim () != String.Empty) { query_builder.Append (where_added ? " AND " : " WHERE "); query_builder.Append (sql_clause); } } bool order_added = false; foreach (IQueryCondition condition in conditions) { if (condition == null) continue; if (!(condition is IOrderCondition)) continue; string sql_clause = condition.SqlClause (); if (sql_clause == null || sql_clause.Trim () == String.Empty) continue; query_builder.Append (order_added ? " , " : "ORDER BY "); query_builder.Append (sql_clause); order_added = true; } return query_builder.ToString (); } public Photo [] Query (params IQueryCondition [] conditions) { return Query (BuildQuery (conditions)); } public void QueryToTemp (string temp_table, params IQueryCondition [] conditions) { QueryToTemp (temp_table, BuildQuery (conditions)); } public void QueryToTemp(string temp_table, string query) { uint timer = Log.DebugTimerStart (); Log.DebugFormat ("Query Started : {0}", query); Database.BeginTransaction (); Database.Execute (String.Format ("DROP TABLE IF EXISTS {0}", temp_table)); Database.Execute (String.Format ("CREATE TEMPORARY TABLE {0} AS {1}", temp_table, query)); // For Hyena.Data.Sqlite, we need to call Execute. Calling Query here does fail. //Database.Query (String.Format ("CREATE TEMPORARY TABLE {0} AS {1}", temp_table, query)).Close (); Database.CommitTransaction (); Log.DebugTimerPrint (timer, "QueryToTemp took {0} : " + query); } public Photo [] QueryFromTemp (string temp_table) { return QueryFromTemp (temp_table, 0, -1); } public Photo [] QueryFromTemp (string temp_table, int offset, int limit) { return Query (String.Format ("SELECT * FROM {0} LIMIT {1} OFFSET {2}", temp_table, limit, offset)); } public Photo [] Query (string query) { return Query (new HyenaSqliteCommand (query)); } private Photo [] Query (HyenaSqliteCommand query) { uint timer = Log.DebugTimerStart (); IDataReader reader = Database.Query(query); List new_photos = new List (); List query_result = new List (); while (reader.Read ()) { uint id = Convert.ToUInt32 (reader ["id"]); Photo photo = LookupInCache (id); if (photo == null) { photo = new Photo (id, Convert.ToInt64 (reader ["time"])); photo.Description = reader["description"].ToString (); photo.RollId = Convert.ToUInt32 (reader["roll_id"]); photo.DefaultVersionId = Convert.ToUInt32 (reader["default_version_id"]); photo.Rating = Convert.ToUInt32 (reader ["rating"]); new_photos.Add (photo); } query_result.Add (photo); } reader.Dispose(); bool need_load = false; string photo_ids = "("; foreach (Photo photo in new_photos) { AddToCache (photo); photo_ids = photo_ids + Convert.ToString(photo.Id) + ","; need_load |= !photo.AllVersionsLoaded; } photo_ids = photo_ids + "-1)"; if (need_load) { GetAllTags (photo_ids); GetAllVersions (photo_ids); foreach (Photo photo in new_photos) photo.AllVersionsLoaded = true; } else { //Console.WriteLine ("Skipped Loading Data"); } foreach (Photo photo in new_photos) photo.Changes = null; Log.DebugTimerPrint (timer, "Query took {0} : " + query.Text); return query_result.ToArray (); } public Photo [] Query (SafeUri uri) { string filename = uri.GetFilename (); /* query by file */ if ( ! String.IsNullOrEmpty (filename)) { return Query (new HyenaSqliteCommand ( "SELECT id, " + "time, " + "base_uri, " + "filename, " + "description, " + "roll_id, " + "default_version_id, " + "rating " + "FROM photos " + "WHERE base_uri LIKE ?" + "AND filename LIKE ?", uri.GetBaseUri ().ToString (), filename)); } /* query by directory */ return Query (new HyenaSqliteCommand ( "SELECT id, " + "time, " + "base_uri, " + "filename, " + "description, " + "roll_id, " + "default_version_id, " + "rating " + "FROM photos " + "WHERE base_uri LIKE ?" + "AND base_uri NOT LIKE ?", uri.ToString () + "%", uri.ToString () + "/%/%")); } [Obsolete ("drop this, use IQueryCondition correctly instead")] public Photo [] Query (Tag [] tags, string extra_condition, DateRange range, RollSet importidrange) { return Query (FSpot.OrTerm.FromTags(tags), extra_condition, range, importidrange, null); } [Obsolete ("drop this, use IQueryCondition correctly instead")] public Photo [] Query (Tag [] tags, string extra_condition, DateRange range, RollSet importidrange, RatingRange ratingrange) { return Query (FSpot.OrTerm.FromTags(tags), extra_condition, range, importidrange, ratingrange); } [Obsolete ("drop this, use IQueryCondition correctly instead")] public Photo [] Query (Term searchexpression, string extra_condition, DateRange range, RollSet importidrange, RatingRange ratingrange) { bool hide = (extra_condition == null); // The SQL query that we want to construct is: // // SELECT photos.id // photos.time // photos.uri, // photos.description, // photos.roll_id, // photos.default_version_id // photos.rating // FROM photos, photo_tags // WHERE photos.time >= time1 AND photos.time <= time2 // AND photos.rating >= rat1 AND photos.rating <= rat2 // AND photos.id NOT IN (select photo_id FROM photo_tags WHERE tag_id = HIDDEN) // AND photos.id IN (select photo_id FROM photo_tags where tag_id IN (tag1, tag2..) // AND extra_condition_string // GROUP BY photos.id StringBuilder query_builder = new StringBuilder (); ArrayList where_clauses = new ArrayList (); query_builder.Append ("SELECT id, " + "time, " + "base_uri, " + "filename, " + "description, " + "roll_id, " + "default_version_id, " + "rating " + "FROM photos "); if (range != null) { where_clauses.Add (String.Format ("time >= {0} AND time <= {1}", DateTimeUtil.FromDateTime (range.Start), DateTimeUtil.FromDateTime (range.End))); } if (ratingrange != null) { where_clauses.Add (ratingrange.SqlClause ()); } if (importidrange != null) { where_clauses.Add (importidrange.SqlClause ()); } if (hide && App.Instance.Database.Tags.Hidden != null) { where_clauses.Add (String.Format ("id NOT IN (SELECT photo_id FROM photo_tags WHERE tag_id = {0})", App.Instance.Database.Tags.Hidden.Id)); } if (searchexpression != null) { where_clauses.Add (searchexpression.SqlCondition ()); } if (extra_condition != null && extra_condition.Trim () != String.Empty) { where_clauses.Add (extra_condition); } if (where_clauses.Count > 0) { query_builder.Append (" WHERE "); query_builder.Append (String.Join (" AND ", ((String []) where_clauses.ToArray (typeof(String))))); } query_builder.Append (" ORDER BY time"); return Query (query_builder.ToString ()); } } }f-spot-0.8.2/src/Clients/MainApp/FSpot/MainWindow.cs0000644000175000017500000025736411503404761022436 0ustar00rubenruben00000000000000/* * FSpot.MainWindow.cs * * Copyright (c) 2003-2009 Novell, Inc. * * This is open source software. See COPYING for details. */ using System; using System.Text; using System.Linq; using System.IO; using System.Collections; using System.Collections.Generic; using Gdk; using Gtk; using Mono.Addins; using Mono.Unix; using Hyena; using Hyena.Widgets; using Banshee.Kernel; using FSpot; using FSpot.Core; using FSpot.Database; using FSpot.Extensions; using FSpot.Query; using FSpot.Widgets; using FSpot.Utils; using FSpot.UI.Dialog; using FSpot.Platform; using FSpot.Import; namespace FSpot { public class MainWindow { public Sidebar Sidebar { get; private set; } TagSelectionWidget tag_selection_widget; [GtkBeans.Builder.Object] Gtk.Window main_window; public Gtk.Window Window { get { return main_window; } } [GtkBeans.Builder.Object] Gtk.HPaned main_hpaned; [GtkBeans.Builder.Object] Gtk.VBox view_vbox; [GtkBeans.Builder.Object] Gtk.VBox toolbar_vbox; [GtkBeans.Builder.Object] Gtk.ScrolledWindow icon_view_scrolled; [GtkBeans.Builder.Object] Box photo_box; [GtkBeans.Builder.Object] Notebook view_notebook; Gtk.ScrolledWindow tag_selection_scrolled; [GtkBeans.Builder.Object] Label status_label; [GtkBeans.Builder.Object] Gtk.UIManager uimanager; // Photo [GtkBeans.Builder.Object] Gtk.Action create_version_menu_item; [GtkBeans.Builder.Object] Gtk.Action delete_version_menu_item; [GtkBeans.Builder.Object] Gtk.Action detach_version_menu_item; [GtkBeans.Builder.Object] Gtk.Action rename_version_menu_item; [GtkBeans.Builder.Object] Gtk.Action tools; [GtkBeans.Builder.Object] Gtk.Action export; [GtkBeans.Builder.Object] Gtk.Action pagesetup_menu_item; [GtkBeans.Builder.Object] Gtk.Action print; [GtkBeans.Builder.Object] Gtk.Action send_mail; // Edit [GtkBeans.Builder.Object] Gtk.Action copy; [GtkBeans.Builder.Object] Gtk.Action select_none; [GtkBeans.Builder.Object] Gtk.Action rotate_left; [GtkBeans.Builder.Object] Gtk.Action rotate_right; [GtkBeans.Builder.Object] Gtk.Action sharpen; [GtkBeans.Builder.Object] Gtk.Action adjust_time; [GtkBeans.Builder.Object] Gtk.Action update_thumbnail; [GtkBeans.Builder.Object] Gtk.Action delete_from_drive; [GtkBeans.Builder.Object] Gtk.Action remove_from_catalog; [GtkBeans.Builder.Object] Gtk.Action set_as_background; [GtkBeans.Builder.Object] Gtk.Action attach_tag; [GtkBeans.Builder.Object] Gtk.Action remove_tag; // View [GtkBeans.Builder.Object] Gtk.ToggleAction display_toolbar; [GtkBeans.Builder.Object] Gtk.ToggleAction display_sidebar; [GtkBeans.Builder.Object] Gtk.ToggleAction display_timeline; [GtkBeans.Builder.Object] Gtk.ToggleAction display_filmstrip; [GtkBeans.Builder.Object] Gtk.ToggleAction display_dates_menu_item; [GtkBeans.Builder.Object] Gtk.ToggleAction display_tags_menu_item; [GtkBeans.Builder.Object] Gtk.ToggleAction display_ratings_menu_item; [GtkBeans.Builder.Object] Gtk.Action zoom_in; [GtkBeans.Builder.Object] Gtk.Action zoom_out; [GtkBeans.Builder.Object] Gtk.ToggleAction loupe_menu_item; [GtkBeans.Builder.Object] Gtk.RadioAction tag_icon_hidden; [GtkBeans.Builder.Object] Gtk.RadioAction tag_icon_small; [GtkBeans.Builder.Object] Gtk.RadioAction tag_icon_medium; [GtkBeans.Builder.Object] Gtk.RadioAction tag_icon_large; [GtkBeans.Builder.Object] Gtk.ToggleAction reverse_order; public Gtk.ToggleAction ReverseOrderAction { get { return reverse_order; } } // Find [GtkBeans.Builder.Object] Gtk.Action clear_date_range; [GtkBeans.Builder.Object] Gtk.Action clear_rating_filter; [GtkBeans.Builder.Object] Gtk.ToggleAction find_untagged; [GtkBeans.Builder.Object] Gtk.Action clear_roll_filter; // Tags [GtkBeans.Builder.Object] Gtk.Action edit_selected_tag; [GtkBeans.Builder.Object] Gtk.Action delete_selected_tag; [GtkBeans.Builder.Object] Gtk.Action attach_tag_to_selection; [GtkBeans.Builder.Object] Gtk.Action remove_tag_from_selection; // Other Widgets [GtkBeans.Builder.Object] Scale zoom_scale; [GtkBeans.Builder.Object] VBox info_vbox; [GtkBeans.Builder.Object] Gtk.HBox tagbar; [GtkBeans.Builder.Object] Gtk.VBox tag_entry_container; [GtkBeans.Builder.Object] Gtk.VBox sidebar_vbox; TagEntry tag_entry; Gtk.Toolbar toolbar; FindBar find_bar; PhotoVersionMenu versions_submenu; Gtk.ToggleToolButton browse_button; Gtk.ToggleToolButton edit_button; QueryView icon_view; PhotoView photo_view; public PhotoView PhotoView { get { return photo_view; } } FSpot.FullScreenView fsview; FSpot.PhotoQuery query; FSpot.GroupSelector group_selector; FSpot.QueryWidget query_widget; ToolButton rl_button; ToolButton rr_button; Label count_label; Gtk.ToolButton display_next_button; Gtk.ToolButton display_previous_button; bool write_metadata = false; Gdk.Cursor watch = new Gdk.Cursor (Gdk.CursorType.Watch); // Tag Icon Sizes public int TagsIconSize { get { return (int) Tag.TagIconSize; } set { Tag.TagIconSize = (Tag.IconSize) value; } } private static TargetEntry [] icon_source_target_table = new TargetEntry [] { DragDropTargets.PhotoListEntry, DragDropTargets.TagQueryEntry, DragDropTargets.UriListEntry, DragDropTargets.RootWindowEntry }; private static TargetEntry [] icon_dest_target_table = new TargetEntry [] { DragDropTargets.PhotoListEntry, DragDropTargets.TagListEntry, DragDropTargets.UriListEntry }; private static TargetEntry [] tag_target_table = new TargetEntry [] { DragDropTargets.TagListEntry }; const int PHOTO_IDX_NONE = -1; public Db Database { get; private set; } public ModeType ViewMode { get; private set; } public MainSelection Selection { get; private set; } public InfoBox InfoBox { get; private set; } // // Constructor // public MainWindow (Db db) { foreach (ServiceNode service in AddinManager.GetExtensionNodes ("/FSpot/Services")) { try { service.Initialize (); service.Start (); } catch (Exception e) { Log.WarningFormat ("Something went wrong while starting the {0} extension.", service.Id); Log.DebugException (e); } } #if GSD_2_24 Log.Information ("Hack for gnome-settings-daemon engaged"); int max_age, max_size; if (Preferences.TryGet (Preferences.GSD_THUMBS_MAX_AGE, out max_age)) { if (max_age < 0) Log.Debug ("maximum_age check already disabled, good"); else if (max_age == 0) Log.Warning ("maximum_age is 0 (tin-hat mode), not overriding"); else if (max_age < 180) { Log.Debug ("Setting maximum_age to a saner value"); Preferences.Set (Preferences.GSD_THUMBS_MAX_AGE, 180); } } if (Preferences.TryGet (Preferences.GSD_THUMBS_MAX_SIZE, out max_size)) { int count = App.Instance.Database.Photos.Count ("photos"); // average thumbs are taking 70K, so this will push the threshold //if f-spot takes more than 70% of the thumbs space int size = count / 10; if (max_size < 0) Log.Debug ("maximum_size check already disabled, good"); else if (max_size == 0) Log.Warning ("maximum_size is 0 (tin-hat mode), not overriding"); else if (max_size < size) { Log.DebugFormat ("Setting maximum_size to a saner value ({0}MB), according to your db size", size); Preferences.Set (Preferences.GSD_THUMBS_MAX_SIZE, size); } } #endif Database = db; GtkBeans.Builder builder = new GtkBeans.Builder ("main_window.ui"); builder.Autoconnect (this); //Set the global DefaultColormap. Allows transparency according //to the theme (work on murrine engine) Gdk.Colormap colormap = ((Widget)main_window).Screen.RgbaColormap; if (colormap == null) { Log.Debug ("Your screen doesn't support alpha channels!"); colormap = ((Widget)main_window).Screen.RgbColormap; } Gtk.Widget.DefaultColormap = colormap; LoadPreference (Preferences.MAIN_WINDOW_WIDTH); LoadPreference (Preferences.MAIN_WINDOW_X); LoadPreference (Preferences.MAIN_WINDOW_MAXIMIZED); main_window.ShowAll (); LoadPreference (Preferences.SIDEBAR_POSITION); LoadPreference (Preferences.METADATA_EMBED_IN_IMAGE); pagesetup_menu_item.Activated += HandlePageSetupActivated; toolbar = new Gtk.Toolbar (); toolbar_vbox.PackStart (toolbar); ToolButton import_button = GtkUtil.ToolButtonFromTheme ("gtk-add", Catalog.GetString ("Import"), true); import_button.Clicked += (o, args) => StartImport (null); import_button.TooltipText = Catalog.GetString ("Import new images"); toolbar.Insert (import_button, -1); toolbar.Insert (new SeparatorToolItem (), -1); rl_button = GtkUtil.ToolButtonFromTheme ("object-rotate-left", Catalog.GetString ("Rotate Left"), false); rl_button.Clicked += HandleRotate270Command; toolbar.Insert (rl_button, -1); rr_button = GtkUtil.ToolButtonFromTheme ("object-rotate-right", Catalog.GetString ("Rotate Right"), false); rr_button.Clicked += HandleRotate90Command; toolbar.Insert (rr_button, -1); toolbar.Insert (new SeparatorToolItem (), -1); browse_button = new ToggleToolButton (); browse_button.Label = Catalog.GetString ("Browse"); browse_button.IconName = "mode-browse"; browse_button.IsImportant = true; browse_button.Toggled += HandleToggleViewBrowse; browse_button.TooltipText = Catalog.GetString ("Browse many photos simultaneously"); toolbar.Insert (browse_button, -1); edit_button = new ToggleToolButton (); edit_button.Label = Catalog.GetString ("Edit Image"); edit_button.IconName = "mode-image-edit"; edit_button.IsImportant = true; edit_button.Toggled += HandleToggleViewPhoto; edit_button.TooltipText = Catalog.GetString ("View and edit a photo"); toolbar.Insert (edit_button, -1); toolbar.Insert (new SeparatorToolItem (), -1); ToolButton fs_button = GtkUtil.ToolButtonFromTheme ("view-fullscreen", Catalog.GetString ("Fullscreen"), false); fs_button.Clicked += HandleViewFullscreen; fs_button.TooltipText = Catalog.GetString ("View photos fullscreen"); toolbar.Insert (fs_button, -1); ToolButton ss_button = GtkUtil.ToolButtonFromTheme ("media-playback-start", Catalog.GetString ("Slideshow"), false); ss_button.Clicked += HandleViewSlideShow; ss_button.TooltipText = Catalog.GetString ("View photos in a slideshow"); toolbar.Insert (ss_button, -1); SeparatorToolItem white_space = new SeparatorToolItem (); white_space.Draw = false; white_space.Expand = true; toolbar.Insert (white_space, -1); ToolItem label_item = new ToolItem (); count_label = new Label (String.Empty); label_item.Child = count_label; toolbar.Insert (label_item, -1); display_previous_button = new ToolButton (Stock.GoBack); toolbar.Insert (display_previous_button, -1); display_previous_button.TooltipText = Catalog.GetString ("Previous photo"); display_previous_button.Clicked += new EventHandler (HandleDisplayPreviousButtonClicked); display_next_button = new ToolButton (Stock.GoForward); toolbar.Insert (display_next_button, -1); display_next_button.TooltipText = Catalog.GetString ("Next photo"); display_next_button.Clicked += new EventHandler (HandleDisplayNextButtonClicked); Sidebar = new Sidebar (); ViewModeChanged += Sidebar.HandleMainWindowViewModeChanged; sidebar_vbox.Add (Sidebar); tag_selection_scrolled = new Gtk.ScrolledWindow (); tag_selection_scrolled.ShadowType = ShadowType.In; tag_selection_widget = new TagSelectionWidget (Database.Tags); tag_selection_scrolled.Add (tag_selection_widget); Sidebar.AppendPage (tag_selection_scrolled, Catalog.GetString ("Tags"), "tag"); AddinManager.AddExtensionNodeHandler ("/FSpot/Sidebar", OnSidebarExtensionChanged); Sidebar.Context = ViewContext.Library; Sidebar.CloseRequested += HideSidebar; Sidebar.Show (); InfoBox = new InfoBox (); ViewModeChanged += InfoBox.HandleMainWindowViewModeChanged; InfoBox.VersionChanged += delegate (InfoBox box, IPhotoVersion version) { UpdateForVersionChange (version);}; sidebar_vbox.PackEnd (InfoBox, false, false, 0); InfoBox.Context = ViewContext.Library; tag_selection_widget.Selection.Changed += HandleTagSelectionChanged; tag_selection_widget.KeyPressEvent += HandleTagSelectionKeyPress; tag_selection_widget.ButtonPressEvent += HandleTagSelectionButtonPressEvent; tag_selection_widget.PopupMenu += HandleTagSelectionPopupMenu; tag_selection_widget.RowActivated += HandleTagSelectionRowActivated; LoadPreference (Preferences.TAG_ICON_SIZE); try { query = new FSpot.PhotoQuery (Database.Photos); } catch (System.Exception e) { //FIXME assume any exception here is due to a corrupt db and handle that. new RepairDbDialog (e, Database.Repair (), main_window); query = new FSpot.PhotoQuery (Database.Photos); } UpdateStatusLabel (); query.Changed += HandleQueryChanged; Database.Photos.ItemsChanged += HandleDbItemsChanged; Database.Tags.ItemsChanged += HandleTagsChanged; Database.Tags.ItemsAdded += HandleTagsChanged; Database.Tags.ItemsRemoved += HandleTagsChanged; group_selector = new FSpot.GroupSelector (); group_selector.Adaptor = new FSpot.TimeAdaptor (query, Preferences.Get (Preferences.GROUP_ADAPTOR_ORDER_ASC)); group_selector.ShowAll (); if (zoom_scale != null) { zoom_scale.ValueChanged += HandleZoomScaleValueChanged; } view_vbox.PackStart (group_selector, false, false, 0); view_vbox.ReorderChild (group_selector, 0); find_bar = new FindBar (query, tag_selection_widget.Model); view_vbox.PackStart (find_bar, false, false, 0); view_vbox.ReorderChild (find_bar, 1); main_window.KeyPressEvent += HandleKeyPressEvent; query_widget = new FSpot.QueryWidget (query, Database); query_widget.Logic.Changed += HandleQueryLogicChanged; view_vbox.PackStart (query_widget, false, false, 0); view_vbox.ReorderChild (query_widget, 2); MenuItem findByTag = uimanager.GetWidget ("/ui/menubar1/find/find_by_tag") as MenuItem; query_widget.Hidden += delegate (object sender, EventArgs args) { ((Gtk.Label)findByTag.Child).TextWithMnemonic = Catalog.GetString ("Show _Find Bar"); }; query_widget.Shown += delegate (object sender, EventArgs args) { ((Gtk.Label)findByTag.Child).TextWithMnemonic = Catalog.GetString ("Hide _Find Bar"); }; icon_view = new QueryView (query); icon_view.ZoomChanged += HandleZoomChanged; LoadPreference (Preferences.ZOOM); LoadPreference (Preferences.SHOW_TAGS); LoadPreference (Preferences.SHOW_DATES); LoadPreference (Preferences.SHOW_RATINGS); icon_view_scrolled.Add (icon_view); icon_view.DoubleClicked += HandleDoubleClicked; icon_view.Vadjustment.ValueChanged += HandleIconViewScroll; icon_view.GrabFocus (); new FSpot.PreviewPopup (icon_view); icon_view.DragBegin += HandleIconViewDragBegin; icon_view.DragEnd += HandleIconViewDragEnd; icon_view.DragDataGet += HandleIconViewDragDataGet; icon_view.DragMotion += HandleIconViewDragMotion; icon_view.DragDrop += HandleIconViewDragDrop; // StartDrag is fired by IconView icon_view.StartDrag += HandleIconViewStartDrag; TagMenu tag_menu = new TagMenu (null, Database.Tags); tag_menu.NewTagHandler += delegate { HandleCreateTagAndAttach (this, null); }; tag_menu.TagSelected += HandleAttachTagMenuSelected; tag_menu.Populate(); (uimanager.GetWidget("/ui/menubar1/edit2/attach_tag") as MenuItem).Submenu = tag_menu; PhotoTagMenu pmenu = new PhotoTagMenu (); pmenu.TagSelected += HandleRemoveTagMenuSelected; (uimanager.GetWidget("/ui/menubar1/edit2/remove_tag") as MenuItem).Submenu = pmenu; Gtk.Drag.DestSet (icon_view, DestDefaults.All, icon_dest_target_table, DragAction.Copy | DragAction.Move); icon_view.DragDataReceived += HandleIconViewDragDataReceived; icon_view.KeyPressEvent += HandleIconViewKeyPressEvent; photo_view = new PhotoView (query); photo_box.Add (photo_view); photo_view.DoubleClicked += HandleDoubleClicked; photo_view.KeyPressEvent += HandlePhotoViewKeyPressEvent; photo_view.UpdateStarted += HandlePhotoViewUpdateStarted; photo_view.UpdateFinished += HandlePhotoViewUpdateFinished; photo_view.View.ZoomChanged += HandleZoomChanged; // Tag typing: focus the tag entry if the user starts typing a tag icon_view.KeyPressEvent += HandlePossibleTagTyping; photo_view.KeyPressEvent += HandlePossibleTagTyping; tag_entry = new TagEntry (Database.Tags); tag_entry.KeyPressEvent += HandleTagEntryKeyPressEvent; tag_entry.TagsAttached += HandleTagEntryTagsAttached; tag_entry.TagsRemoved += HandleTagEntryRemoveTags; tag_entry.Activated += HandleTagEntryActivate; tag_entry_container.Add (tag_entry); Gtk.Drag.DestSet (photo_view, DestDefaults.All, tag_target_table, DragAction.Copy | DragAction.Move); photo_view.DragMotion += HandlePhotoViewDragMotion; photo_view.DragDrop += HandlePhotoViewDragDrop; photo_view.DragDataReceived += HandlePhotoViewDragDataReceived; view_notebook.SwitchPage += HandleViewNotebookSwitchPage; group_selector.Adaptor.GlassSet += HandleAdaptorGlassSet; group_selector.Adaptor.Changed += HandleAdaptorChanged; LoadPreference (Preferences.GROUP_ADAPTOR_ORDER_ASC); LoadPreference (Preferences.FILMSTRIP_ORIENTATION); Selection = new MainSelection (this); Selection.Changed += HandleSelectionChanged; Selection.ItemsChanged += HandleSelectionItemsChanged; Selection.Changed += Sidebar.HandleSelectionChanged; Selection.ItemsChanged += Sidebar.HandleSelectionItemsChanged; Mono.Addins.AddinManager.ExtensionChanged += PopulateExtendableMenus; PopulateExtendableMenus (null, null); UpdateMenus (); main_window.ShowAll (); tagbar.Hide (); find_bar.Hide (); UpdateFindByTagMenu (); LoadPreference (Preferences.SHOW_TOOLBAR); LoadPreference (Preferences.SHOW_SIDEBAR); LoadPreference (Preferences.SHOW_TIMELINE); LoadPreference (Preferences.SHOW_FILMSTRIP); LoadPreference (Preferences.GNOME_MAILTO_ENABLED); Preferences.SettingChanged += OnPreferencesChanged; main_window.DeleteEvent += HandleDeleteEvent; // When the icon_view is loaded, set it's initial scroll position icon_view.SizeAllocated += HandleIconViewReady; export.Activated += HandleExportActivated; UpdateToolbar (); (uimanager.GetWidget("/ui/menubar1/file1/close1") as MenuItem).Hide (); Banshee.Kernel.Scheduler.Resume (); } private void HandleDisplayNextButtonClicked (object sender, EventArgs args) { PhotoView.View.Item.MoveNext (); } private void HandleDisplayPreviousButtonClicked (object sender, EventArgs args) { PhotoView.View.Item.MovePrevious (); } private void OnSidebarExtensionChanged (object s, ExtensionNodeEventArgs args) { // FIXME: No sidebar page removal yet! if (args.Change == ExtensionChange.Add) Sidebar.AppendPage ((args.ExtensionNode as SidebarPageNode).GetPage ()); } private Photo CurrentPhoto { get { int active = ActiveIndex (); if (active >= 0) return query [active] as Photo; else return null; } } // Index into the PhotoQuery. If -1, no photo is selected or multiple photos are selected. private int ActiveIndex () { if (Selection.Count == 1) return SelectedIds() [0]; else return PHOTO_IDX_NONE; } // Switching mode. public enum ModeType { IconView, PhotoView }; public event EventHandler ViewModeChanged; public void SetViewMode (ModeType value) { if (ViewMode == value) return; ViewMode = value; switch (ViewMode) { case ModeType.IconView: if (view_notebook.CurrentPage != 0) view_notebook.CurrentPage = 0; display_timeline.Sensitive = true; display_filmstrip.Sensitive = false; group_selector.Visible = display_timeline.Active; if (photo_view.View.Loupe != null) loupe_menu_item.Active = false; JumpTo (photo_view.Item.Index); zoom_scale.Value = icon_view.Zoom; break; case ModeType.PhotoView: if (view_notebook.CurrentPage != 1) view_notebook.CurrentPage = 1; display_timeline.Sensitive = false; display_filmstrip.Sensitive = true; group_selector.Visible = false; JumpTo (icon_view.FocusCell); zoom_scale.Value = photo_view.NormalizedZoom; photo_view.View.GrabFocus(); break; } Selection.MarkChanged (); UpdateToolbar (); if (ViewModeChanged != null) ViewModeChanged (this, null); } void UpdateToolbar () { if (browse_button != null) { bool state = ViewMode == ModeType.IconView; if (browse_button.Active != state) browse_button.Active = state; } if (edit_button != null) { bool state = ViewMode == ModeType.PhotoView; if (edit_button.Active != state) edit_button.Active = state; } if (ViewMode == ModeType.PhotoView) { display_previous_button.Visible = true; display_next_button.Visible = true; count_label.Visible = true; bool valid = photo_view.View.Item.IsValid; bool prev = valid && photo_view.View.Item.Index > 0; bool next = valid && photo_view.View.Item.Index < query.Count - 1; display_previous_button.Sensitive = prev; display_next_button.Sensitive = next; if (Query == null) count_label.Text = String.Empty; else // Note for translators: This indicates the current photo is photo {0} of {1} out of photos count_label.Text = String.Format (Catalog.GetString ("{0} of {1}"), Query.Count == 0 ? 0 : photo_view.View.Item.Index + 1, Query.Count == 0 ? 0 : Query.Count); } else { display_previous_button.Visible = false; display_next_button.Visible = false; count_label.Visible = false; } } private void HandleExportActivated (object o, EventArgs e) { FSpot.Extensions.ExportMenuItemNode.SelectedImages = delegate () {return new PhotoList (SelectedPhotos ()); }; } private void HandleDbItemsChanged (object sender, DbItemEventArgs args) { foreach (Photo p in args.Items) { if (p == null) continue; if (write_metadata) FSpot.Jobs.SyncMetadataJob.Create (Database.Jobs, p); } if (args is PhotoEventArgs && (args as PhotoEventArgs).Changes.TimeChanged) query.RequestReload (); } private void HandleTagsChanged (object sender, DbItemEventArgs args) { icon_view.QueueDraw (); UpdateTagEntryFromSelection (); } void HandleViewNotebookSwitchPage (object sender, SwitchPageArgs args) { switch (view_notebook.CurrentPage) { case 0: SetViewMode (ModeType.IconView); break; case 1: SetViewMode (ModeType.PhotoView); break; } } private int [] SelectedIds () { int [] ids = new int [0]; if (fsview != null && fsview.View.Item.IsValid) ids = new int [] { fsview.View.Item.Index }; else { switch (ViewMode) { case ModeType.IconView: ids = icon_view.Selection.Ids; break; default: case ModeType.PhotoView: if (photo_view.Item.IsValid) ids = new int [] { photo_view.Item.Index }; break; } } return ids; } public class MainSelection : IBrowsableCollection { MainWindow win; public MainSelection (MainWindow win) { this.win = win; win.icon_view.Selection.Changed += HandleSelectionChanged; win.icon_view.Selection.ItemsChanged += HandleSelectionItemsChanged; win.photo_view.PhotoChanged += HandlePhotoChanged; win.query.ItemsChanged += HandleQueryItemsChanged; } public int Count { get { switch (win.ViewMode) { case ModeType.PhotoView: return win.photo_view.Item.IsValid ? 1 : 0; case ModeType.IconView: return win.icon_view.Selection.Count; } return 0; } } public int IndexOf (IPhoto item) { switch (win.ViewMode) { case ModeType.PhotoView: return item == win.photo_view.Item.Current ? 0 : -1; case ModeType.IconView: return win.icon_view.Selection.IndexOf (item); } return -1; } public bool Contains (IPhoto item) { switch (win.ViewMode) { case ModeType.PhotoView: return item == win.photo_view.Item.Current ? true : false; case ModeType.IconView: return win.icon_view.Selection.Contains (item); } return false; } public void MarkChanged () { if (Changed != null) Changed (this); } public void MarkChanged (int index, IBrowsableItemChanges changes) { throw new System.NotImplementedException ("I didn't think you'd find me"); } public IPhoto this [int index] { get { switch (win.ViewMode) { case ModeType.PhotoView: if (index == 0) return win.photo_view.Item.Current; break; case ModeType.IconView: return win.icon_view.Selection [index]; } throw new ArgumentOutOfRangeException (); } } public IPhoto [] Items { get { switch (win.ViewMode) { case ModeType.PhotoView: if (win.photo_view.Item.IsValid) return new IPhoto [] {win.photo_view.Item.Current}; break; case ModeType.IconView: return win.icon_view.Selection.Items; } return new IPhoto [0]; } } private void HandleQueryItemsChanged (IBrowsableCollection collection, BrowsableEventArgs args) { // FIXME for now we only listen to changes directly from the query // when we are in PhotoView mode because we presume that we'll get // proper notification from the icon view selection in icon view mode if (win.ViewMode != ModeType.PhotoView || ItemsChanged == null) return; foreach (int item in args.Items) { if (win.photo_view.Item.Index == item ) { ItemsChanged (this, new BrowsableEventArgs (item, args.Changes)); break; } } } private void HandlePhotoChanged (PhotoView sender) { if (win.ViewMode == ModeType.PhotoView && Changed != null) Changed (this); } public void HandleSelectionChanged (IBrowsableCollection collection) { if (win.ViewMode == ModeType.IconView && Changed != null) Changed (this); } private void HandleSelectionItemsChanged (IBrowsableCollection collection, BrowsableEventArgs args) { if (win.ViewMode == ModeType.IconView && ItemsChanged != null) ItemsChanged (this, args); } public event IBrowsableCollectionChangedHandler Changed; public event IBrowsableCollectionItemsChangedHandler ItemsChanged; } private void HandleSelectionChanged (IBrowsableCollection collection) { UpdateMenus (); UpdateTagEntryFromSelection (); UpdateStatusLabel (); UpdateToolbar (); InfoBox.Photos = SelectedPhotos (); } private void HandleSelectionItemsChanged (IBrowsableCollection collection, BrowsableEventArgs args) { UpdateMenus (); UpdateTagEntryFromSelection (); photo_view.UpdateTagView (); InfoBox.Photos = SelectedPhotos (); } // // Selection Interface // private Photo [] SelectedPhotos (int [] selected_ids) { Photo [] photo_list = new Photo [selected_ids.Length]; int i = 0; foreach (int num in selected_ids) photo_list [i ++] = query [num] as Photo; return photo_list; } public Photo [] SelectedPhotos () { return SelectedPhotos (SelectedIds ()); } public PhotoQuery Query { get { return query; } } // // Commands // private void RotateSelectedPictures (Gtk.Window parent, RotateDirection direction) { RotateCommand command = new RotateCommand (parent); int [] selected_ids = SelectedIds (); if (command.Execute (direction, SelectedPhotos (selected_ids))) query.MarkChanged (selected_ids, InvalidateData.Instance); } // // Tag Selection Drag Handlers // public void AddTagExtended (int [] nums, Tag [] tags) { foreach (int num in nums) (query[num] as Photo).AddTag (tags); query.Commit (nums); foreach (Tag t in tags) { if (t.Icon != null || t.IconWasCleared) continue; // FIXME this needs a lot more work. Pixbuf icon = null; try { Pixbuf tmp = FSpot.PhotoLoader.LoadAtMaxSize (query [nums[0]], 128, 128); icon = PixbufUtils.TagIconFromPixbuf (tmp); tmp.Dispose (); } catch { icon = null; } t.Icon = icon; Database.Tags.Commit (t); } } public void SetFolderQuery (IEnumerable uri_list) { ShowQueryWidget (); query_widget.SetFolders (uri_list); } public void RemoveTags (int [] nums, Tag [] tags) { foreach (int num in nums) (query[num] as Photo).RemoveTag (tags); query.Commit (nums); } void HandleTagSelectionButtonPressEvent (object sender, ButtonPressEventArgs args) { if (args.Event.Button == 3) { TagPopup popup = new TagPopup (); popup.Activate (args.Event, tag_selection_widget.TagAtPosition (args.Event.X, args.Event.Y), tag_selection_widget.TagHighlight); args.RetVal = true; } } void HandleTagSelectionPopupMenu (object sender, PopupMenuArgs args) { TagPopup popup = new TagPopup (); popup.Activate (null, null, tag_selection_widget.TagHighlight); args.RetVal = true; } void HandleTagSelectionRowActivated (object sender, RowActivatedArgs args) { ShowQueryWidget (); query_widget.Include (new Tag [] {tag_selection_widget.TagByPath (args.Path)}); } void JumpTo (int index) { switch (ViewMode) { case ModeType.PhotoView: photo_view.Item.Index = index; break; case ModeType.IconView: icon_view.ScrollTo (index); icon_view.Throb (index); break; } } void HandleAdaptorGlassSet (FSpot.GroupAdaptor sender, int index) { JumpTo (index); } void HandleAdaptorChanged (FSpot.GroupAdaptor sender) { UpdateGlass (); } /* * Keep the glass temporal slider in sync with the user's scrolling in the icon_view */ private void UpdateGlass () { // If people cant see the timeline don't update it. if (! display_timeline.Active) return; int cell_num = icon_view.TopLeftVisibleCell(); if (cell_num == -1 /*|| cell_num == lastTopLeftCell*/) return; IPhoto photo = icon_view.Collection [cell_num]; /* * FIXME this is a lame hack to get around a delegate chain. This should * actually operate directly on the adaptor not on the selector but I don't have * time to fix it right now. */ if (!group_selector.GlassUpdating) { group_selector.SetPosition (group_selector.Adaptor.IndexFromPhoto (photo)); } } void HandleIconViewScroll (object sender, EventArgs args) { UpdateGlass (); } void HandleIconViewReady (object sender, EventArgs args) { LoadPreference (Preferences.GLASS_POSITION); // We only want to set the position the first time // the icon_view is ready (eg on startup) icon_view.SizeAllocated -= HandleIconViewReady; } // // IconView Drag Handlers // public void HandleIconViewStartDrag (object sender, StartDragArgs args) { Gtk.Drag.Begin (icon_view, new TargetList (icon_source_target_table), DragAction.Copy | DragAction.Move, (int) args.Button, args.Event); } public void HandleIconViewDragBegin (object sender, DragBeginArgs args) { Photo [] photos = SelectedPhotos (); if (photos.Length > 0) { int len = Math.Min (photos.Length, 4); int size = 48; int border = 2; int csize = size/2 + len * size / 2 + 2 * border ; Pixbuf container = new Pixbuf (Gdk.Colorspace.Rgb, true, 8, csize, csize); container.Fill (0x00000000); bool use_icon = false;; while (len-- > 0) { FSpot.PixbufCache.CacheEntry entry = icon_view.Cache.Lookup (photos [len].DefaultVersion.Uri); Pixbuf thumbnail = null; if (entry != null) { Cms.Profile screen_profile; if (FSpot.ColorManagement.Profiles.TryGetValue (Preferences.Get (Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE), out screen_profile)) { thumbnail = entry.Pixbuf.Copy (); FSpot.ColorManagement.ApplyProfile (thumbnail, screen_profile); } else thumbnail = entry.ShallowCopyPixbuf (); } if (thumbnail != null) { Pixbuf small = PixbufUtils.ScaleToMaxSize (thumbnail, size, size); int x = border + len * (size/2) + (size - small.Width)/2; int y = border + len * (size/2) + (size - small.Height)/2; Pixbuf box = new Pixbuf (container, x - border, y - border, small.Width + 2 * border, small.Height + 2 * border); box.Fill (0x000000ff); small.CopyArea (0, 0, small.Width, small.Height, container, x, y); thumbnail.Dispose (); small.Dispose (); use_icon = true; } } if (use_icon) Gtk.Drag.SetIconPixbuf (args.Context, container, 0, 0); container.Dispose (); } } void HandleIconViewDragEnd (object sender, DragEndArgs args) { } void HandleIconViewDragDataGet (object sender, DragDataGetArgs args) { if (args.Info == DragDropTargets.UriListEntry.Info) { var uris = from p in SelectedPhotos () select p.DefaultVersion.Uri; args.SelectionData.SetUriListData (new UriList (uris), args.Context.Targets[0]); return; } if (args.Info == DragDropTargets.PhotoListEntry.Info) { args.SelectionData.SetPhotosData (SelectedPhotos (), args.Context.Targets[0]); return; } if (args.Info == DragDropTargets.RootWindowEntry.Info) { HandleSetAsBackgroundCommand (null, null); return; } } void HandleIconViewDragDrop (object sender, DragDropArgs args) { args.RetVal = true; } void HandleIconViewDragMotion (object sender, DragMotionArgs args) { Gdk.Drag.Status (args.Context, args.Context.SuggestedAction, args.Time); args.RetVal = true; } public void ImportUriList (UriList list, bool copy) { // Drag'n drop import. var controller = new ImportController (false); controller.StatusEvent += (evnt) => { ThreadAssist.ProxyToMain (() => { if (evnt == ImportEvent.ImportFinished) { if (controller.PhotosImported > 0) { query.RollSet = new RollSet (Database.Rolls.GetRolls (1)); } } }); }; var source = new MultiFileImportSource (list.ToArray ()); controller.ActiveSource = source; controller.CopyFiles = copy; controller.DuplicateDetect = true; controller.RecurseSubdirectories = true; controller.RemoveOriginals = false; var import_window = new ImportDialog (controller, Window); import_window.Show (); controller.StartImport (); } void HandleImportCommand (object obj, EventArgs args) { StartImport (null); } public void ImportFile (SafeUri uri) { StartImport (uri); } void StartImport (SafeUri uri) { var controller = new ImportController (true); controller.StatusEvent += (evnt) => { if (evnt == ImportEvent.ImportFinished) { if (controller.PhotosImported > 0) { query.RollSet = new RollSet (Database.Rolls.GetRolls (1)); } } }; var import_window = new ImportDialog (controller, Window); import_window.Show (); } void HandleIconViewDragDataReceived (object sender, DragDataReceivedArgs args) { Widget source = Gtk.Drag.GetSourceWidget (args.Context); if (args.Info == DragDropTargets.TagListEntry.Info) { // // Translate the event args from viewport space to window space, // drag events use the viewport. Owen sends his regrets. // int item = icon_view.CellAtPosition (args.X + (int) icon_view.Hadjustment.Value, args.Y + (int) icon_view.Vadjustment.Value); //Console.WriteLine ("Drop cell = {0} ({1},{2})", item, args.X, args.Y); if (item >= 0) { if (icon_view.Selection.Contains (item)) AttachTags (tag_selection_widget.TagHighlight, SelectedIds()); else AttachTags (tag_selection_widget.TagHighlight, new int [] {item}); } Gtk.Drag.Finish (args.Context, true, false, args.Time); return; } if (args.Info == DragDropTargets.UriListEntry.Info) { /* * If the drop is coming from inside f-spot then we don't want to import */ if (source != null) return; UriList list = args.SelectionData.GetUriListData (); ImportUriList (list, (args.Context.Action & Gdk.DragAction.Copy) != 0); Gtk.Drag.Finish (args.Context, true, false, args.Time); return; } if (args.Info == DragDropTargets.PhotoListEntry.Info) { int p_item = icon_view.CellAtPosition (args.X + (int) icon_view.Hadjustment.Value, args.Y + (int) icon_view.Vadjustment.Value); if (p_item >= 0) { if (icon_view.Selection.Contains (p_item)) //We don't want to reparent ourselves! return; PhotoVersionCommands.Reparent cmd = new PhotoVersionCommands.Reparent (); Photo[] photos_to_reparent = SelectedPhotos (); // Give feedback to user that something happened, and leave the parent selected after reparenting icon_view.Selection.Add (p_item); cmd.Execute (Database.Photos, photos_to_reparent, query.Photos [p_item], GetToplevel (null)); UpdateQuery (); } Gtk.Drag.Finish (args.Context, true, false, args.Time); return; } } // // IconView event handlers // void HandleDoubleClicked (object sender, BrowsableEventArgs args) { Widget widget = sender as Widget; if (widget == null) return; switch (ViewMode) { case ModeType.IconView: icon_view.FocusCell = args.Items[0]; SetViewMode (ModeType.PhotoView); break; case ModeType.PhotoView: SetViewMode (ModeType.IconView); break; } } public void HandleCommonPhotoCommands (object sender, Gtk.KeyPressEventArgs args) { bool alt = ModifierType.Mod1Mask == (args.Event.State & ModifierType.Mod1Mask); bool shift = ModifierType.ShiftMask == (args.Event.State & ModifierType.ShiftMask); if (args.RetVal == null) args.RetVal = false; switch (args.Event.Key) { case Gdk.Key.Delete: if (shift) HandleDeleteCommand (sender, args); else HandleRemoveCommand (sender, args); break; case Gdk.Key.Key_0: case Gdk.Key.KP_0: if (alt) HandleRatingMenuSelected (0); break; case Gdk.Key.Key_1: case Gdk.Key.KP_1: if (alt) HandleRatingMenuSelected (1); break; case Gdk.Key.Key_2: case Gdk.Key.KP_2: if (alt) HandleRatingMenuSelected (2); break; case Gdk.Key.Key_3: case Gdk.Key.KP_3: if (alt) HandleRatingMenuSelected (3); break; case Gdk.Key.Key_4: case Gdk.Key.KP_4: if (alt) HandleRatingMenuSelected (4); break; case Gdk.Key.Key_5: case Gdk.Key.KP_5: if (alt) HandleRatingMenuSelected (5); break; default: return; //do not set the RetVal to true } args.RetVal = true; } void HandleIconViewKeyPressEvent (object sender, Gtk.KeyPressEventArgs args) { HandleCommonPhotoCommands (sender, args); if ((bool)args.RetVal) return; switch (args.Event.Key) { case Gdk.Key.F: case Gdk.Key.f: HandleViewFullscreen (sender, args); args.RetVal = true; break; } } // // FullScreenView event handlers. // void HandleFullScreenViewKeyPressEvent (object sender, Gtk.KeyPressEventArgs args) { HandleCommonPhotoCommands (sender, args); if ((bool)args.RetVal) // this will hide any panels again that might have appeared above the fullscreen view fsview.Present (); } // // PhotoView event handlers. // void HandlePhotoViewKeyPressEvent (object sender, Gtk.KeyPressEventArgs args) { HandleCommonPhotoCommands (sender, args); if ((bool)args.RetVal) return; switch (args.Event.Key) { case Gdk.Key.F: case Gdk.Key.f: HandleViewFullscreen (sender, args); args.RetVal = true; break; case Gdk.Key.Escape: SetViewMode (ModeType.IconView); args.RetVal = true; break; } } void HandlePhotoViewUpdateStarted (PhotoView sender) { main_window.GdkWindow.Cursor = watch; // FIXME: use gdk_display_flush() when available main_window.GdkWindow.Display.Sync (); } void HandlePhotoViewUpdateFinished (PhotoView sender) { main_window.GdkWindow.Cursor = null; // FIXME: use gdk_display_flush() when available main_window.GdkWindow.Display.Sync (); } // // PhotoView drag handlers. // void HandlePhotoViewDragDrop (object sender, DragDropArgs args) { //Widget source = Gtk.Drag.GetSourceWidget (args.Context); args.RetVal = true; } void HandlePhotoViewDragMotion (object sender, DragMotionArgs args) { //Widget source = Gtk.Drag.GetSourceWidget (args.Context); //Console.WriteLine ("Drag Motion {0}", source == null ? "null" : source.TypeName); Gdk.Drag.Status (args.Context, args.Context.SuggestedAction, args.Time); args.RetVal = true; } void HandlePhotoViewDragDataReceived (object sender, DragDataReceivedArgs args) { //Widget source = Gtk.Drag.GetSourceWidget (args.Context); //Console.WriteLine ("Drag received {0}", source == null ? "null" : source.TypeName); HandleAttachTagCommand (sender, null); Gtk.Drag.Finish (args.Context, true, false, args.Time); photo_view.View.GrabFocus(); } // // RatingMenu commands // public void HandleRatingMenuSelected (int r) { if (ViewMode == ModeType.PhotoView) this.photo_view.UpdateRating(r); Photo p; Database.BeginTransaction (); int [] selected_photos = SelectedIds (); foreach (int num in selected_photos) { p = query [num] as Photo; p.Rating = (uint) r; } query.Commit (selected_photos); Database.CommitTransaction (); } // // TagMenu commands. // public void HandleTagMenuActivate (object sender, EventArgs args) { MenuItem parent = sender as MenuItem; if (parent == null) // We have a Gtk.Action for UI menus, so the "Edit > Remove tag" item needs special treatment parent = uimanager.GetWidget("/ui/menubar1/edit2/remove_tag") as MenuItem; if (parent != null && parent.Submenu is PhotoTagMenu) { PhotoTagMenu menu = (PhotoTagMenu) parent.Submenu; menu.Populate (SelectedPhotos ()); } } public void HandleAttachTagMenuSelected (Tag t) { Database.BeginTransaction (); AddTagExtended (SelectedIds (), new Tag [] {t}); Database.CommitTransaction (); query_widget.PhotoTagsChanged (new Tag[] {t}); } public void HandleRequireTag (object sender, EventArgs args) { ShowQueryWidget (); query_widget.Require (tag_selection_widget.TagHighlight); } public void HandleUnRequireTag (object sender, EventArgs args) { query_widget.UnRequire (tag_selection_widget.TagHighlight); } public void HandleRemoveTagMenuSelected (Tag t) { Database.BeginTransaction (); RemoveTags (SelectedIds (), new Tag [] {t}); Database.CommitTransaction (); query_widget.PhotoTagsChanged (new Tag [] {t}); } // // Main menu commands // void HandlePageSetupActivated (object o, EventArgs e) { FSpot.Core.Global.PageSetup = Print.RunPageSetupDialog (this.Window, FSpot.Core.Global.PageSetup, null); } void HandlePrintCommand (object sender, EventArgs e) { FSpot.PrintOperation print = new FSpot.PrintOperation (SelectedPhotos ()); print.Run (PrintOperationAction.PrintDialog, null); } public void HandlePreferences (object sender, EventArgs args) { var pref = new PreferenceDialog (GetToplevel (sender)); pref.Run (); pref.Destroy (); } public void HandleManageExtensions (object sender, EventArgs args) { Mono.Addins.Gui.AddinManagerWindow.Run (main_window); } void HandleSendMailCommand (object sender, EventArgs args) { //TestDisplay (); new FSpot.SendEmail (new PhotoList (SelectedPhotos ()), Window); } public static void HandleHelp (object sender, EventArgs args) { GtkBeans.Global.ShowUri (App.Instance.Organizer.Window.Screen, "ghelp:f-spot"); } public static void HandleAbout (object sender, EventArgs args) { FSpot.UI.Dialog.AboutDialog.ShowUp (); } void HandleTagSizeChange (object sender, EventArgs args) { RadioAction choice = sender as RadioAction; //Get this callback twice. Once for the active going menuitem, //once for the inactive leaving one. Ignore the inactive. if (!choice.Active) return; int old_size = TagsIconSize; if (choice == tag_icon_hidden) { TagsIconSize = (int) Tag.IconSize.Hidden; } else if (choice == tag_icon_small) { TagsIconSize = (int) Tag.IconSize.Small; } else if (choice == tag_icon_medium) { TagsIconSize = (int) Tag.IconSize.Medium; } else if (choice == tag_icon_large) { TagsIconSize = (int) Tag.IconSize.Large; } else { return; } if (old_size != TagsIconSize) { tag_selection_widget.ColumnsAutosize(); if (photo_view != null) photo_view.UpdateTagView (); Preferences.Set (Preferences.TAG_ICON_SIZE, TagsIconSize); } } public void HandleFilmstripHorizontal (object sender, EventArgs args) { if (photo_view.FilmstripOrientation == Orientation.Horizontal) return; (sender as Gtk.CheckMenuItem).Active = false; photo_view.PlaceFilmstrip (Orientation.Horizontal); } public void HandleFilmstripVertical (object sender, EventArgs args) { if (photo_view.FilmstripOrientation == Orientation.Vertical) return; (sender as Gtk.CheckMenuItem).Active = false; photo_view.PlaceFilmstrip (Orientation.Vertical); } public void HandleReverseOrder (object sender, EventArgs args) { ToggleAction item = sender as ToggleAction; if (group_selector.Adaptor.OrderAscending == item.Active) return; group_selector.Adaptor.OrderAscending = item.Active; query.TimeOrderAsc = item.Active; // FIXME this is blah...we need UIManager love here if (item != reverse_order) reverse_order.Active = item.Active; //update the selection in the timeline if ( query.Range != null && group_selector.Adaptor is TimeAdaptor) { group_selector.SetLimitsToDates(query.Range.Start, query.Range.End); } } // Called when the user clicks the X button void HandleDeleteEvent (object sender, DeleteEventArgs args) { Close(); args.RetVal = true; } void HandleCloseCommand (object sender, EventArgs args) { Close(); } public void Close () { int x, y, width, height; main_window.GetPosition (out x, out y); main_window.GetSize (out width, out height); bool maximized = ((main_window.GdkWindow.State & Gdk.WindowState.Maximized) > 0); Preferences.Set (Preferences.MAIN_WINDOW_MAXIMIZED, maximized); if (!maximized) { Preferences.Set (Preferences.MAIN_WINDOW_X, x); Preferences.Set (Preferences.MAIN_WINDOW_Y, y); Preferences.Set (Preferences.MAIN_WINDOW_WIDTH, width); Preferences.Set (Preferences.MAIN_WINDOW_HEIGHT, height); } Preferences.Set (Preferences.SHOW_TOOLBAR, toolbar.Visible); Preferences.Set (Preferences.SHOW_SIDEBAR, info_vbox.Visible); Preferences.Set (Preferences.SHOW_TIMELINE, display_timeline.Active); Preferences.Set (Preferences.SHOW_FILMSTRIP, display_filmstrip.Active); Preferences.Set (Preferences.SHOW_TAGS, icon_view.DisplayTags); Preferences.Set (Preferences.SHOW_DATES, icon_view.DisplayDates); Preferences.Set (Preferences.SHOW_RATINGS, icon_view.DisplayRatings); Preferences.Set (Preferences.GROUP_ADAPTOR_ORDER_ASC, group_selector.Adaptor.OrderAscending); Preferences.Set (Preferences.GLASS_POSITION, group_selector.GlassPosition); Preferences.Set (Preferences.SIDEBAR_POSITION, main_hpaned.Position); Preferences.Set (Preferences.ZOOM, icon_view.Zoom); tag_selection_widget.SaveExpandDefaults (); this.Window.Destroy (); } void HandleCreateVersionCommand (object obj, EventArgs args) { PhotoVersionCommands.Create cmd = new PhotoVersionCommands.Create (); cmd.Execute (Database.Photos, CurrentPhoto, GetToplevel (null)); } void HandleDeleteVersionCommand (object obj, EventArgs args) { PhotoVersionCommands.Delete cmd = new PhotoVersionCommands.Delete (); cmd.Execute (Database.Photos, CurrentPhoto, GetToplevel (null)); } void HandleDetachVersionCommand (object obj, EventArgs args) { PhotoVersionCommands.Detach cmd = new PhotoVersionCommands.Detach (); cmd.Execute (Database.Photos, CurrentPhoto, GetToplevel (null)); UpdateQuery (); } void HandleRenameVersionCommand (object obj, EventArgs args) { PhotoVersionCommands.Rename cmd = new PhotoVersionCommands.Rename (); cmd.Execute (Database.Photos, CurrentPhoto, main_window); } public void HandleCreateTagAndAttach (object sender, EventArgs args) { Tag new_tag = CreateTag (sender, args); if (new_tag != null) HandleAttachTagMenuSelected (new_tag); } public void HandleCreateNewCategoryCommand (object sender, EventArgs args) { Tag new_tag = CreateTag (sender, args); if (new_tag != null) { tag_selection_widget.ScrollTo (new_tag); tag_selection_widget.TagHighlight = new Tag [] {new_tag}; } } public Tag CreateTag (object sender, EventArgs args) { TagCommands.Create command = new TagCommands.Create (Database.Tags); return command.Execute (TagCommands.TagType.Category, tag_selection_widget.TagHighlight); } public void HandleAttachTagCommand (object obj, EventArgs args) { AttachTags (tag_selection_widget.TagHighlight, SelectedIds ()); } void AttachTags (Tag [] tags, int [] ids) { Database.BeginTransaction (); AddTagExtended (ids, tags); Database.CommitTransaction (); query_widget.PhotoTagsChanged (tags); } public void HandleRemoveTagCommand (object obj, EventArgs args) { Tag [] tags = this.tag_selection_widget.TagHighlight; Database.BeginTransaction (); RemoveTags (SelectedIds (), tags); Database.CommitTransaction (); query_widget.PhotoTagsChanged (tags); } public void HandleEditSelectedTag (object sender, EventArgs ea) { Tag [] tags = this.tag_selection_widget.TagHighlight; if (tags.Length != 1) return; HandleEditSelectedTagWithTag (tags [0]); } public void HandleEditSelectedTagWithTag (Tag tag) { if (tag == null) return; EditTagDialog dialog = new EditTagDialog (Database, tag, main_window); if ((ResponseType)dialog.Run () == ResponseType.Ok) { bool name_changed = false; try { if (tag.Name != dialog.TagName) { tag.Name = dialog.TagName; name_changed = true; } tag.Category = dialog.TagCategory; Database.Tags.Commit (tag, name_changed); } catch (Exception ex) { Log.Exception (ex); } } dialog.Destroy (); } public void HandleMergeTagsCommand (object obj, EventArgs args) { Tag [] tags = this.tag_selection_widget.TagHighlight; if (tags.Length < 2) return; // Translators, The singular case will never happen here. string header = Catalog.GetPluralString ("Merge the selected tag", "Merge the {0} selected tags?", tags.Length); header = String.Format (header, tags.Length); // If a tag with children tags is selected for merging, we // should also merge its children.. List all_tags = new List (tags.Length); foreach (Tag tag in tags) { if (! all_tags.Contains (tag)) all_tags.Add (tag); else continue; if (! (tag is Category)) continue; (tag as Category).AddDescendentsTo (all_tags); } // debug.. tags = all_tags.ToArray (); System.Array.Sort (tags, new TagRemoveComparer ()); foreach (Tag tag in tags) { Log.Debug ("tag: {0}", tag.Name); } string msg = Catalog.GetString("This operation will merge the selected tags and any sub-tags into a single tag."); string ok_caption = Catalog.GetString ("_Merge Tags"); if (ResponseType.Ok != HigMessageDialog.RunHigConfirmation(main_window, DialogFlags.DestroyWithParent, MessageType.Warning, header, msg, ok_caption)) return; // The surviving tag is the last tag, as it is definitely not a child of any other the // other tags. removetags will contain the tags to be merged. Tag survivor = tags[tags.Length - 1]; Tag [] removetags = new Tag [tags.Length - 1]; Array.Copy (tags, 0, removetags, 0, tags.Length - 1); // Add the surviving tag to all the photos with the other tags Photo [] photos = Database.Photos.Query (removetags); foreach (Photo p in photos) { p.AddTag (survivor); } // Remove the defunct tags, which removes them from the photos, commits // the photos, and removes the tags from the TagStore Database.BeginTransaction (); Database.Photos.Remove (removetags); Database.CommitTransaction (); HandleEditSelectedTagWithTag (survivor); } void HandleAdjustTime (object sender, EventArgs args) { PhotoList list = new PhotoList (Selection.Items); list.Sort (new IPhotoComparer.CompareDateName ()); (new AdjustTimeDialog (Database, list)).Run (); } public void HideLoupe () { loupe_menu_item.Active = false; } void HandleLoupe (object sender, EventArgs args) { // Don't steal characters from any text entries if (Window.Focus is Gtk.Entry && Gtk.Global.CurrentEvent is Gdk.EventKey) { Window.Focus.ProcessEvent (Gtk.Global.CurrentEvent); return; } photo_view.View.ShowHideLoupe (); } void HandleSharpen (object sender, EventArgs args) { // Don't steal characters from any text entries if (Window.Focus is Gtk.Entry && Gtk.Global.CurrentEvent is Gdk.EventKey) { Window.Focus.ProcessEvent (Gtk.Global.CurrentEvent); return; } photo_view.View.ShowSharpener (); } void HandleDisplayToolbar (object sender, EventArgs args) { if (display_toolbar.Active) toolbar.Show (); else toolbar.Hide (); } void HandleDisplayTags (object sender, EventArgs args) { icon_view.DisplayTags = !icon_view.DisplayTags; } void HandleDisplayDates (object sender, EventArgs args) { // Peg the icon_view's value to the MenuItem's active state, // as icon_view.DisplayDates's get won't always be equal to it's true value // because of logic to hide dates when zoomed way out. icon_view.DisplayDates = display_dates_menu_item.Active; } void HandleDisplayRatings (object sender, EventArgs args) { icon_view.DisplayRatings = display_ratings_menu_item.Active; } void HandleDisplayGroupSelector (object sender, EventArgs args) { if (group_selector.Visible) group_selector.Hide (); else group_selector.Show (); } void HandleDisplayFilmstrip (object sender, EventArgs args) { photo_view.FilmStripVisibility = display_filmstrip.Active; if (ViewMode == ModeType.PhotoView) photo_view.QueueDraw (); } void HandleDisplayInfoSidebar (object sender, EventArgs args) { if (info_vbox.Visible) info_vbox.Hide (); else info_vbox.Show (); } void HandleViewSlideShow (object sender, EventArgs args) { HandleViewFullscreen (sender, args); fsview.PlayPause (); } void HandleToggleViewBrowse (object sender, EventArgs args) { if (ViewMode == ModeType.IconView) browse_button.Active = true; else if (browse_button.Active) SetViewMode (ModeType.IconView); } void HandleToggleViewPhoto (object sender, EventArgs args) { if (ViewMode == ModeType.PhotoView) edit_button.Active = true; else if (edit_button.Active) SetViewMode (ModeType.PhotoView); } void HandleViewBrowse (object sender, EventArgs args) { SetViewMode (ModeType.IconView); } void HandleViewPhoto (object sender, EventArgs args) { SetViewMode (ModeType.PhotoView); } void HandleViewFullscreen (object sender, EventArgs args) { int active = (Selection.Count > 0 ? SelectedIds() [0] : 0); if (fsview == null) { fsview = new FSpot.FullScreenView (query, main_window); fsview.Destroyed += HandleFullScreenViewDestroy; fsview.KeyPressEvent += HandleFullScreenViewKeyPressEvent; fsview.View.Item.Index = active; } else { // FIXME this needs to be another mode like PhotoView and IconView mode. fsview.View.Item.Index = active; } fsview.Show (); } void HandleFullScreenViewDestroy (object sender, EventArgs args) { JumpTo (fsview.View.Item.Index); fsview = null; } void HandleZoomScaleValueChanged (object sender, System.EventArgs args) { switch (ViewMode) { case ModeType.PhotoView: photo_view.View.ZoomChanged -= HandleZoomChanged; photo_view.NormalizedZoom = zoom_scale.Value; photo_view.View.ZoomChanged += HandleZoomChanged; break; case ModeType.IconView: icon_view.ZoomChanged -= HandleZoomChanged; icon_view.Zoom = zoom_scale.Value; icon_view.ZoomChanged += HandleZoomChanged; break; } zoom_in.Sensitive = (zoom_scale.Value != 1.0); zoom_out.Sensitive = (zoom_scale.Value != 0.0); } void HandleQueryChanged (IBrowsableCollection sender) { if (find_untagged.Active != query.Untagged) find_untagged.Active = query.Untagged; clear_date_range.Sensitive = (query.Range != null); clear_rating_filter.Sensitive = (query.RatingRange != null); update_status_label = true; GLib.Idle.Add (UpdateStatusLabel); } bool update_status_label; private bool UpdateStatusLabel () { update_status_label = false; int total_photos = Database.Photos.TotalPhotos; if (total_photos != query.Count) status_label.Text = String.Format (Catalog.GetPluralString ("{0} Photo out of {1}", "{0} Photos out of {1}", query.Count), query.Count, total_photos); else status_label.Text = String.Format (Catalog.GetPluralString ("{0} Photo", "{0} Photos", query.Count), query.Count); if ((Selection != null) && (Selection.Count > 0)) status_label.Text += String.Format (Catalog.GetPluralString (" ({0} selected)", " ({0} selected)", Selection.Count), Selection.Count); status_label.UseMarkup = true; return update_status_label; } void HandleZoomChanged (object sender, System.EventArgs args) { zoom_scale.ValueChanged -= HandleZoomScaleValueChanged; double zoom = .5; switch (ViewMode) { case ModeType.PhotoView: zoom = photo_view.NormalizedZoom; zoom_scale.Value = zoom; break; case ModeType.IconView: zoom = icon_view.Zoom; if (zoom == 0.0 || zoom == 100.0 || zoom != zoom_scale.Value) zoom_scale.Value = zoom; break; } zoom_in.Sensitive = (zoom != 1.0); zoom_out.Sensitive = (zoom != 0.0); zoom_scale.ValueChanged += HandleZoomScaleValueChanged; } void HandleZoomOut (object sender, ButtonPressEventArgs args) { ZoomOut (); } void HandleZoomOut (object sender, EventArgs args) { ZoomOut (); } void HandleZoomIn (object sender, ButtonPressEventArgs args) { ZoomIn (); } void HandleZoomIn (object sender, EventArgs args) { ZoomIn (); } private void ZoomOut () { switch (ViewMode) { case ModeType.PhotoView: photo_view.ZoomOut (); break; case ModeType.IconView: icon_view.ZoomOut (); break; } } private void ZoomIn () { switch (ViewMode) { case ModeType.PhotoView: double old_zoom = photo_view.Zoom; try { photo_view.ZoomIn (); } catch { photo_view.Zoom = old_zoom; } break; case ModeType.IconView: icon_view.ZoomIn (); break; } } public void DeleteException (Exception e, string fname) { string ok_caption = Catalog.GetString ("_Ok"); string error = Catalog.GetString ("Error Deleting Picture"); string msg; if (e is UnauthorizedAccessException) msg = String.Format ( Catalog.GetString ("No permission to delete the file:{1}{0}"), fname, Environment.NewLine).Replace ("_", "__"); else msg = String.Format ( Catalog.GetString ("An error of type {0} occurred while deleting the file:{2}{1}"), e.GetType (), fname.Replace ("_", "__"), Environment.NewLine); HigMessageDialog.RunHigConfirmation ( main_window, DialogFlags.DestroyWithParent, MessageType.Error, error, msg, ok_caption); } public Gtk.Window GetToplevel (object sender) { Widget wsender = sender as Widget; Gtk.Window toplevel = null; if (wsender != null && !(wsender is MenuItem)) toplevel = (Gtk.Window) wsender.Toplevel; else if (fsview != null) toplevel = fsview; else toplevel = main_window; return toplevel; } public void HandleDeleteCommand (object sender, EventArgs args) { // Don't steal characters from any text entries if (Window.Focus is Gtk.Entry && Gtk.Global.CurrentEvent is Gdk.EventKey) { Window.Focus.ProcessEvent (Gtk.Global.CurrentEvent); return; } Photo[] photos = SelectedPhotos(); string header = Catalog.GetPluralString ("Delete the selected photo permanently?", "Delete the {0} selected photos permanently?", photos.Length); header = String.Format (header, photos.Length); string msg = Catalog.GetPluralString ("This deletes all versions of the selected photo from your drive.", "This deletes all versions of the selected photos from your drive.", photos.Length); string ok_caption = Catalog.GetPluralString ("_Delete photo", "_Delete photos", photos.Length); if (ResponseType.Ok == HigMessageDialog.RunHigConfirmation(GetToplevel (sender), DialogFlags.DestroyWithParent, MessageType.Warning, header, msg, ok_caption)) { uint timer = Log.DebugTimerStart (); foreach (Photo photo in photos) { foreach (uint id in photo.VersionIds) { try { photo.DeleteVersion (id, true); } catch (Exception e) { DeleteException (e, photo.VersionUri (id).ToString ()); } } } Database.Photos.Remove (photos); UpdateQuery (); Log.DebugTimerPrint (timer, "HandleDeleteCommand took {0}"); } } public void HandleRemoveCommand (object sender, EventArgs args) { // Don't steal characters from any text entries if (Window.Focus is Gtk.Entry && Gtk.Global.CurrentEvent is Gdk.EventKey) { Window.Focus.ProcessEvent (Gtk.Global.CurrentEvent); return; } Photo[] photos = SelectedPhotos(); if (photos.Length == 0) return; string header = Catalog.GetPluralString ("Remove the selected photo from F-Spot?", "Remove the {0} selected photos from F-Spot?", photos.Length); header = String.Format (header, photos.Length); string msg = Catalog.GetString("If you remove photos from the F-Spot catalog all tag information will be lost. The photos remain on your computer and can be imported into F-Spot again."); string ok_caption = Catalog.GetString("_Remove from Catalog"); if (ResponseType.Ok == HigMessageDialog.RunHigConfirmation(GetToplevel (sender), DialogFlags.DestroyWithParent, MessageType.Warning, header, msg, ok_caption)) { Database.Photos.Remove (photos); UpdateQuery (); } } void HandleSelectAllCommand (object sender, EventArgs args) { if (Window.Focus is Editable) { (Window.Focus as Editable).SelectRegion (0, -1); // select all in text box return; } icon_view.SelectAllCells (); UpdateStatusLabel (); } void HandleSelectNoneCommand (object sender, EventArgs args) { icon_view.Selection.Clear (); UpdateStatusLabel (); } void HandleSelectInvertCommand (object sender, EventArgs args) { icon_view.Selection.SelectionInvert (); UpdateStatusLabel (); } // This ConnectBefore is needed because otherwise the editability of the name // column will steal returns, spaces, and clicks if the tag name is focused [GLib.ConnectBefore] public void HandleTagSelectionKeyPress (object sender, Gtk.KeyPressEventArgs args) { args.RetVal = true; switch (args.Event.Key) { case Gdk.Key.Delete: HandleDeleteSelectedTagCommand (sender, (EventArgs) args); break; case Gdk.Key.space: case Gdk.Key.Return: case Gdk.Key.KP_Enter: ShowQueryWidget (); query_widget.Include (tag_selection_widget.TagHighlight); break; case Gdk.Key.F2: tag_selection_widget.EditSelectedTagName (); break; default: args.RetVal = false; break; } } public void HandleDeleteSelectedTagCommand (object sender, EventArgs args) { Tag [] tags = this.tag_selection_widget.TagHighlight; System.Array.Sort (tags, new TagRemoveComparer ()); //How many pictures are associated to these tags? Db db = App.Instance.Database; FSpot.PhotoQuery count_query = new FSpot.PhotoQuery(db.Photos); count_query.Terms = FSpot.OrTerm.FromTags(tags); int associated_photos = count_query.Count; string header; if (tags.Length == 1) header = String.Format (Catalog.GetString ("Delete tag \"{0}\"?"), tags [0].Name.Replace ("_", "__")); else header = String.Format (Catalog.GetString ("Delete the {0} selected tags?"), tags.Length); header = String.Format (header, tags.Length); string msg = String.Empty; if (associated_photos > 0) { string photodesc = Catalog.GetPluralString ("photo", "photos", associated_photos); msg = String.Format( Catalog.GetPluralString("If you delete this tag, the association with {0} {1} will be lost.", "If you delete these tags, the association with {0} {1} will be lost.", tags.Length), associated_photos, photodesc); } string ok_caption = Catalog.GetPluralString ("_Delete tag", "_Delete tags", tags.Length); if (ResponseType.Ok == HigMessageDialog.RunHigConfirmation(main_window, DialogFlags.DestroyWithParent, MessageType.Warning, header, msg, ok_caption)) { try { db.Photos.Remove (tags); } catch (InvalidTagOperationException e) { Log.Debug ("this is something or another"); // A Category is not empty. Can not delete it. string error_msg = Catalog.GetString ("Tag is not empty"); string error_desc = String.Format (Catalog.GetString ("Can not delete tags that have tags within them. " + "Please delete tags under \"{0}\" first"), e.Tag.Name.Replace ("_", "__")); HigMessageDialog md = new HigMessageDialog (main_window, DialogFlags.DestroyWithParent, Gtk.MessageType.Error, ButtonsType.Ok, error_msg, error_desc); md.Run (); md.Destroy (); } } } void HandleUpdateThumbnailCommand (object sender, EventArgs args) { ThumbnailCommand command = new ThumbnailCommand (main_window); int [] selected_ids = SelectedIds (); if (command.Execute (SelectedPhotos (selected_ids))) query.MarkChanged (selected_ids, InvalidateData.Instance); } public void HandleRotate90Command (object sender, EventArgs args) { // Don't steal characters from any text entries if (Window.Focus is Gtk.Entry && Gtk.Global.CurrentEvent is Gdk.EventKey) { Window.Focus.ProcessEvent (Gtk.Global.CurrentEvent); return; } RotateSelectedPictures (GetToplevel (sender), RotateDirection.Clockwise); } public void HandleRotate270Command (object sender, EventArgs args) { // Don't steal characters from any text entries if (Window.Focus is Gtk.Entry && Gtk.Global.CurrentEvent is Gdk.EventKey) { Window.Focus.ProcessEvent (Gtk.Global.CurrentEvent); return; } RotateSelectedPictures (GetToplevel (sender), RotateDirection.Counterclockwise); } public void HandleCopy (object sender, EventArgs args) { Clipboard primary = Clipboard.Get (Atom.Intern ("PRIMARY", false)); Clipboard clipboard = Clipboard.Get (Atom.Intern ("CLIPBOARD", false)); if (Window.Focus is Editable) { (Window.Focus as Editable).CopyClipboard (); return; } var target_entries = new TargetEntry[] { DragDropTargets.PlainTextEntry, DragDropTargets.UriListEntry, DragDropTargets.CopyFilesEntry}; // use eager evaluation, because we want to copy the photos which are currently selected ... var uris = new UriList (from p in SelectedPhotos () select p.DefaultVersion.Uri); var paths = String.Join (" ", (from p in SelectedPhotos () select p.DefaultVersion.Uri.LocalPath).ToArray () ); clipboard.SetWithData (target_entries, delegate (Clipboard clip, SelectionData data, uint info) { if (info == DragDropTargets.PlainTextEntry.Info) { data.Text = paths; return; } if (info == DragDropTargets.UriListEntry.Info) { data.SetUriListData (uris); return; } if (info == DragDropTargets.CopyFilesEntry.Info) { data.SetCopyFiles (uris); return; } Log.DebugFormat ("Unknown Selection Data Target (info: {0})", info); }, delegate {}); primary.Text = paths; } void HandleSetAsBackgroundCommand (object sender, EventArgs args) { Photo current = CurrentPhoto; if (current == null) return; Desktop.SetBackgroundImage (current.DefaultVersion.Uri.LocalPath); } void HandleSetDateRange (object sender, EventArgs args) { var date_range_dialog = new DateRangeDialog (query.Range, main_window); if ((ResponseType)date_range_dialog.Run () == ResponseType.Ok) query.Range = date_range_dialog.Range; date_range_dialog.Destroy (); //update the TimeLine if (group_selector.Adaptor is TimeAdaptor && query.Range != null) group_selector.SetLimitsToDates(query.Range.Start, query.Range.End); } public void HandleClearDateRange (object sender, EventArgs args) { if (group_selector.Adaptor is FSpot.TimeAdaptor) { group_selector.ResetLimits(); } query.Range = null; } void HandleSelectLastRoll (object sender, EventArgs args) { query.RollSet = new RollSet (Database.Rolls.GetRolls (1)); } void HandleSelectRolls (object sender, EventArgs args) { new LastRolls (query, Database.Rolls, main_window); } void HandleClearRollFilter (object sender, EventArgs args) { query.RollSet = null; } void HandleSetRatingFilter (object sender, EventArgs args) { new RatingFilterDialog (query, main_window); } public void HandleClearRatingFilter (object sender, EventArgs args) { query.RatingRange = null; } void HandleFindUntagged (object sender, EventArgs args) { if (query.Untagged == find_untagged.Active) return; query.Untagged = !query.Untagged; } void OnPreferencesChanged (object sender, NotifyEventArgs args) { LoadPreference (args.Key); } void LoadPreference (String key) { switch (key) { case Preferences.MAIN_WINDOW_MAXIMIZED: if (Preferences.Get (key)) main_window.Maximize (); else main_window.Unmaximize (); break; case Preferences.MAIN_WINDOW_X: case Preferences.MAIN_WINDOW_Y: main_window.Move(Preferences.Get (Preferences.MAIN_WINDOW_X), Preferences.Get (Preferences.MAIN_WINDOW_Y)); break; case Preferences.MAIN_WINDOW_WIDTH: case Preferences.MAIN_WINDOW_HEIGHT: if (Preferences.Get (Preferences.MAIN_WINDOW_WIDTH) > 0 && Preferences.Get (Preferences.MAIN_WINDOW_HEIGHT) > 0) main_window.Resize(Preferences.Get (Preferences.MAIN_WINDOW_WIDTH), Preferences.Get (Preferences.MAIN_WINDOW_HEIGHT)); break; case Preferences.SHOW_TOOLBAR: if (display_toolbar.Active != Preferences.Get (key)) display_toolbar.Active = Preferences.Get (key); break; case Preferences.SHOW_SIDEBAR: if (display_sidebar.Active != Preferences.Get (key)) display_sidebar.Active = Preferences.Get (key); break; case Preferences.SHOW_TIMELINE: if (display_timeline.Active != Preferences.Get (key)) display_timeline.Active = Preferences.Get (key); break; case Preferences.SHOW_FILMSTRIP: if (display_filmstrip.Active != Preferences.Get (key)) { display_filmstrip.Active = Preferences.Get (key); } break; case Preferences.SHOW_TAGS: if (display_tags_menu_item.Active != Preferences.Get (key)) display_tags_menu_item.Active = Preferences.Get (key); break; case Preferences.SHOW_DATES: if (display_dates_menu_item.Active != Preferences.Get (key)) display_dates_menu_item.Active = Preferences.Get (key); //display_dates_menu_item.Toggle (); break; case Preferences.SHOW_RATINGS: if (display_ratings_menu_item.Active != Preferences.Get (key)) display_ratings_menu_item.Active = Preferences.Get (key); break; case Preferences.GROUP_ADAPTOR_ORDER_ASC: group_selector.Adaptor.OrderAscending = Preferences.Get (key); reverse_order.Active = Preferences.Get (key); query.TimeOrderAsc = group_selector.Adaptor.OrderAscending; break; case Preferences.GLASS_POSITION: if (query.Count > 0) { // If the database has changed since this pref was saved, this could cause // an exception to be thrown. try { IPhoto photo = group_selector.Adaptor.PhotoFromIndex (Preferences.Get (key)); if (photo != null) JumpTo (query.IndexOf (photo)); } catch (Exception) {} } icon_view.GrabFocus (); break; case Preferences.SIDEBAR_POSITION: if (main_hpaned.Position !=Preferences.Get (key) ) main_hpaned.Position = Preferences.Get (key); break; case Preferences.TAG_ICON_SIZE: int s = Preferences.Get (key); tag_icon_hidden.Active = (s == (int) Tag.IconSize.Hidden); tag_icon_small.Active = (s == (int) Tag.IconSize.Small); tag_icon_medium.Active = (s == (int) Tag.IconSize.Medium); tag_icon_large.Active = (s == (int) Tag.IconSize.Large); break; case Preferences.ZOOM: icon_view.Zoom = Preferences.Get (key); break; case Preferences.METADATA_EMBED_IN_IMAGE: write_metadata =Preferences.Get (key) ; break; case Preferences.GNOME_MAILTO_ENABLED: send_mail.Visible = Preferences.Get (key); break; } } // Version Id updates. void UpdateForVersionChange (IPhotoVersion version) { IPhotoVersionable versionable = CurrentPhoto as IPhotoVersionable; if (versionable != null) { versionable.SetDefaultVersion (version); query.Commit (ActiveIndex ()); } } // Queries. public void UpdateQuery () { main_window.GdkWindow.Cursor = watch; main_window.GdkWindow.Display.Sync (); query.RequestReload (); main_window.GdkWindow.Cursor = null; } void HandleTagSelectionChanged (object obj, EventArgs args) { UpdateMenus (); } public bool TagIncluded (Tag tag) { return query_widget.TagIncluded (tag); } public bool TagRequired (Tag tag) { return query_widget.TagRequired (tag); } private void HandleQueryLogicChanged (object sender, EventArgs args) { HandleFindAddTagWith (null, null); } public void HandleIncludeTag (object sender, EventArgs args) { ShowQueryWidget (); query_widget.Include (tag_selection_widget.TagHighlight); } public void HandleUnIncludeTag (object sender, EventArgs args) { query_widget.UnInclude (tag_selection_widget.TagHighlight); } void HandleFindByTag (object sender, EventArgs args) { UpdateFindByTagMenu (); } public void UpdateFindByTagMenu () { if (query_widget.Visible) { query_widget.Close (); } else { ShowQueryWidget (); } } void HandleFindAddTagWith (object sender, EventArgs args) { MenuItem find_add_tag_with = uimanager.GetWidget ("/ui/menubar1/find/find_add_tag_with") as MenuItem; if (find_add_tag_with.Submenu != null) find_add_tag_with.Submenu.Dispose (); Gtk.Menu submenu = FSpot.TermMenuItem.GetSubmenu (tag_selection_widget.TagHighlight); find_add_tag_with.Sensitive = (submenu != null); if (submenu != null) find_add_tag_with.Submenu = submenu; } public void HandleAddTagToTerm (object sender, EventArgs args) { MenuItem item = sender as MenuItem; int item_pos = 0; foreach (MenuItem i in (item.Parent as Menu).Children) { if (item == i) { break; } item_pos++; } // account for All and separator menu items item_pos -= 2; FSpot.Term parent_term = (FSpot.Term) FSpot.LogicWidget.Root.SubTerms [item_pos]; if (FSpot.LogicWidget.Box != null) { FSpot.Literal after = parent_term.Last as FSpot.Literal; FSpot.LogicWidget.Box.InsertTerm (tag_selection_widget.TagHighlight, parent_term, after); } } // // Handle Main Menu void UpdateMenus () { int tags_selected = tag_selection_widget.Selection.CountSelectedRows (); bool tag_sensitive = tags_selected > 0; bool active_selection = Selection.Count > 0; bool single_active = CurrentPhoto != null; MenuItem version_menu_item = uimanager.GetWidget ("/ui/menubar1/file1/version_menu_item") as MenuItem; if (!single_active) { version_menu_item.Sensitive = false; version_menu_item.Submenu = new Menu (); create_version_menu_item.Sensitive = false; delete_version_menu_item.Sensitive = false; detach_version_menu_item.Sensitive = false; rename_version_menu_item.Sensitive = false; sharpen.Sensitive = false; loupe_menu_item.Sensitive = false; } else { version_menu_item.Sensitive = true; create_version_menu_item.Sensitive = true; if (CurrentPhoto.DefaultVersionId == Photo.OriginalVersionId) { delete_version_menu_item.Sensitive = false; detach_version_menu_item.Sensitive = false; rename_version_menu_item.Sensitive = false; } else { delete_version_menu_item.Sensitive = true; detach_version_menu_item.Sensitive = true; rename_version_menu_item.Sensitive = true; } versions_submenu = new PhotoVersionMenu (CurrentPhoto); versions_submenu.VersionChanged += delegate (PhotoVersionMenu menu) { UpdateForVersionChange (menu.Version);}; version_menu_item.Submenu = versions_submenu; sharpen.Sensitive = (ViewMode == ModeType.IconView ? false : true); loupe_menu_item.Sensitive = (ViewMode == ModeType.IconView ? false : true); } set_as_background.Sensitive = single_active; adjust_time.Sensitive = active_selection; attach_tag.Sensitive = active_selection; remove_tag.Sensitive = active_selection; rotate_left.Sensitive = active_selection; rotate_right.Sensitive = active_selection; update_thumbnail.Sensitive = active_selection; delete_from_drive.Sensitive = active_selection; send_mail.Sensitive = active_selection; print.Sensitive = active_selection; select_none.Sensitive = active_selection; copy.Sensitive = active_selection; remove_from_catalog.Sensitive = active_selection; clear_rating_filter.Sensitive = (query.RatingRange != null); clear_roll_filter.Sensitive = (query.RollSet != null); delete_selected_tag.Sensitive = tag_sensitive; edit_selected_tag.Sensitive = tag_sensitive; attach_tag_to_selection.Sensitive = tag_sensitive && active_selection; remove_tag_from_selection.Sensitive = tag_sensitive && active_selection; export.Sensitive = active_selection; MenuItem toolsmenu = uimanager.GetWidget ("/ui/menubar1/tools") as MenuItem; try { tools.Visible = (toolsmenu.Submenu as Menu).Children.Length > 0; } catch { tools.Visible = false; } if (rl_button != null) { if (Selection.Count == 0) { rl_button.Sensitive = false; rl_button.TooltipText = String.Empty; } else { rl_button.Sensitive = true; string msg = Catalog.GetPluralString ("Rotate selected photo left", "Rotate selected photos left", Selection.Count); rl_button.TooltipText = String.Format (msg, Selection.Count); } } if (rr_button != null) { if (Selection.Count == 0) { rr_button.Sensitive = false; rr_button.TooltipText = String.Empty; } else { rr_button.Sensitive = true; string msg = Catalog.GetPluralString ("Rotate selected photo right", "Rotate selected photos right", Selection.Count); rr_button.TooltipText = String.Format (msg, Selection.Count); } } //if (last_tags_selected_count != tags_selected) { MenuItem find_add_tag = uimanager.GetWidget ("/ui/menubar1/find/find_add_tag") as MenuItem; MenuItem find_add_tag_with = uimanager.GetWidget ("/ui/menubar1/find/find_add_tag_with") as MenuItem; ((Gtk.Label)find_add_tag.Child).TextWithMnemonic = String.Format ( Catalog.GetPluralString ("Find _Selected Tag", "Find _Selected Tags", tags_selected), tags_selected ); ((Gtk.Label)find_add_tag_with.Child).TextWithMnemonic = String.Format ( Catalog.GetPluralString ("Find Selected Tag _With", "Find Selected Tags _With", tags_selected), tags_selected ); find_add_tag.Sensitive = tag_sensitive; find_add_tag_with.Sensitive = tag_sensitive && find_add_tag_with.Submenu != null; //last_tags_selected_count = tags_selected; //} } void PopulateExtendableMenus (object o, EventArgs args) { MenuItem exportmenu = uimanager.GetWidget ("/ui/menubar1/file1/export") as MenuItem; MenuItem toolsmenu = uimanager.GetWidget ("/ui/menubar1/tools") as MenuItem; try { if (exportmenu.Submenu != null) exportmenu.Submenu.Dispose (); if (toolsmenu.Submenu != null) toolsmenu.RemoveSubmenu (); exportmenu.Submenu = (Mono.Addins.AddinManager.GetExtensionNode ("/FSpot/Menus/Exports") as FSpot.Extensions.SubmenuNode).GetSubmenu (); exportmenu.Submenu.ShowAll (); toolsmenu.Submenu = (Mono.Addins.AddinManager.GetExtensionNode ("/FSpot/Menus/Tools") as FSpot.Extensions.SubmenuNode).GetSubmenu (); toolsmenu.Submenu.ShowAll (); tools.Visible = (toolsmenu.Submenu as Menu).Children.Length > 0; } catch { Log.Warning ("There's (maybe) something wrong with some of the installed extensions. You can try removing the directory addin-db-000 from ~/.config/f-spot/"); toolsmenu.Visible = false; } } public void HandleOpenWith (object sender, ApplicationActivatedEventArgs e) { GLib.AppInfo application = e.AppInfo; Photo[] selected = SelectedPhotos (); if (selected == null || selected.Length < 1) return; string header = Catalog.GetPluralString ("Create New Version?", "Create New Versions?", selected.Length); string msg = String.Format (Catalog.GetPluralString ( "Before launching {1}, should F-Spot create a new version of the selected photo to preserve the original?", "Before launching {1}, should F-Spot create new versions of the selected photos to preserve the originals?", selected.Length), selected.Length, application.Name); // FIXME add cancel button? add help button? HigMessageDialog hmd = new HigMessageDialog(GetToplevel (sender), DialogFlags.DestroyWithParent, MessageType.Question, Gtk.ButtonsType.None, header, msg); hmd.AddButton (Gtk.Stock.No, Gtk.ResponseType.No, false); //hmd.AddButton (Gtk.Stock.Cancel, Gtk.ResponseType.Cancel, false); hmd.AddButton (Gtk.Stock.Yes, Gtk.ResponseType.Yes, true); bool support_xcf = false;; if (application.Id == "gimp.desktop") foreach (Gdk.PixbufFormat format in Gdk.Pixbuf.Formats) if (format.Name == "xcf") support_xcf = true; //This allows creating a version with a .xcf extension. //There's no need to convert the file to xcf file format, gimp will take care of this if (support_xcf) { CheckButton cb = new CheckButton (Catalog.GetString ("XCF version")); cb.Active = Preferences.Get (Preferences.EDIT_CREATE_XCF_VERSION); hmd.VBox.Add (cb); cb.Toggled += delegate (object s, EventArgs ea) { Preferences.Set (Preferences.EDIT_CREATE_XCF_VERSION, (s as CheckButton).Active); }; cb.Show (); } Gtk.ResponseType response = Gtk.ResponseType.Cancel; try { response = (Gtk.ResponseType) hmd.Run(); } finally { hmd.Destroy (); } bool create_xcf = false; if (support_xcf) create_xcf = Preferences.Get (Preferences.EDIT_CREATE_XCF_VERSION); Log.DebugFormat ("XCF ? {0}", create_xcf); if (response == Gtk.ResponseType.Cancel) return; bool create_new_versions = (response == Gtk.ResponseType.Yes); ArrayList errors = new ArrayList (); GLib.List uri_list = new GLib.List (typeof (string)); foreach (Photo photo in selected) { try { if (create_new_versions) { uint version = photo.CreateNamedVersion (application.Name, create_xcf ? ".xcf" : null, photo.DefaultVersionId, true); photo.DefaultVersionId = version; } } catch (Exception ex) { errors.Add (new EditException (photo, ex)); } uri_list.Append (photo.DefaultVersion.Uri.ToString ()); } // FIXME need to clean up the error dialog here. if (errors.Count > 0) { Dialog md = new EditExceptionDialog (GetToplevel (sender), errors.ToArray (typeof (EditException)) as EditException []); md.Run (); md.Destroy (); } if (create_new_versions) Database.Photos.Commit (selected); try { application.LaunchUris (uri_list, null); } catch (System.Exception) { Log.ErrorFormat ("Failed to lauch {0}", application.Name); } } public void GetWidgetPosition(Widget widget, out int x, out int y) { main_window.GdkWindow.GetOrigin(out x, out y); x += widget.Allocation.X; y += widget.Allocation.Y; } // Tag typing ... private void UpdateTagEntryFromSelection () { if (!tagbar.Visible) return; tag_entry.UpdateFromSelection (SelectedPhotos ()); } public void HandlePossibleTagTyping (object sender, Gtk.KeyPressEventArgs args) { if (Selection.Count == 0 || tagbar.Visible && tag_entry.HasFocus) return; if (args.Event.Key != Gdk.Key.t) return; tagbar.Show (); UpdateTagEntryFromSelection (); tag_entry.GrabFocus (); tag_entry.SelectRegion (-1, -1); } // "Activate" means the user pressed the enter key public void HandleTagEntryActivate (object sender, EventArgs args) { if (ViewMode == ModeType.IconView) { icon_view.GrabFocus (); } else { photo_view.QueueDraw (); photo_view.View.GrabFocus (); } } private void HandleTagEntryTagsAttached (object o, string [] new_tags) { int [] selected_photos = SelectedIds (); if (selected_photos == null || new_tags == null || new_tags.Length == 0) return; Category default_category = null; Tag [] selection = tag_selection_widget.TagHighlight; if (selection.Length > 0) { if (selection [0] is Category) default_category = (Category) selection [0]; else default_category = selection [0].Category; } Tag [] tags = new Tag [new_tags.Length]; int i = 0; Database.BeginTransaction (); foreach (string tagname in new_tags) { Tag t = Database.Tags.GetTagByName (tagname); if (t == null) { t = Database.Tags.CreateCategory (default_category, tagname, true) as Tag; Database.Tags.Commit (t); } tags [i++] = t; } AddTagExtended (selected_photos, tags); Database.CommitTransaction (); } private void HandleTagEntryRemoveTags (object o, Tag [] remove_tags) { int [] selected_photos = SelectedIds (); if (selected_photos == null || remove_tags == null || remove_tags.Length == 0) return; Database.BeginTransaction (); RemoveTags (selected_photos, remove_tags); Database.CommitTransaction (); } private void HideTagbar () { if (! tagbar.Visible) return; UpdateTagEntryFromSelection (); // Cancel any pending edits... tagbar.Hide (); if (ViewMode == ModeType.IconView) icon_view.GrabFocus (); else { photo_view.QueueDraw (); photo_view.View.GrabFocus (); } tag_entry.ClearTagCompletions (); } public void HandleTagBarCloseButtonPressed (object sender, EventArgs args) { HideTagbar (); } public void HandleTagEntryKeyPressEvent (object sender, Gtk.KeyPressEventArgs args) { args.RetVal = false; if (args.Event.Key == Gdk.Key.Escape) { HideTagbar (); args.RetVal = true; } } public List SelectedMimeTypes () { List contents = new List (); foreach (Photo p in SelectedPhotos ()) { string content; try { content = GLib.FileFactory.NewForUri (p.DefaultVersion.Uri).QueryInfo ("standard::content-type", GLib.FileQueryInfoFlags.None, null).ContentType; } catch (GLib.GException) { content = null; } if (! contents.Contains (content)) contents.Add (content); } return contents; } private void ShowQueryWidget () { if (find_bar.Visible) { find_bar.Entry.Text = String.Empty; find_bar.Hide (); } query_widget.ShowBar (); return; } public void HideSidebar (object o, EventArgs args) { display_sidebar.Active = false; } public void HandleKeyPressEvent (object sender, Gtk.KeyPressEventArgs args) { bool ctrl = ModifierType.ControlMask == (args.Event.State & ModifierType.ControlMask); if ((ctrl && args.Event.Key == Gdk.Key.F) || args.Event.Key == Gdk.Key.slash) { if (!find_bar.Visible) { if (query_widget.Visible) { query_widget.Close (); } find_bar.ShowAll(); } // Grab the focus even if it's already shown find_bar.Entry.GrabFocus (); args.RetVal = true; return; } args.RetVal = false; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/InfoOverlay.cs0000644000175000017500000000255511503404761022605 0ustar00rubenruben00000000000000/* * Copyright 2007 Novell Inc. * * Author * Larry Ewing * * See COPYING for license information. * */ using Gtk; using FSpot.Core; using FSpot.Widgets; namespace FSpot { public class InfoItem : InfoBox { BrowsablePointer item; public InfoItem (BrowsablePointer item) { this.item = item; item.Changed += HandleItemChanged; HandleItemChanged (item, null); VersionChanged += HandleVersionChanged; ShowTags = true; ShowRating = true; Context = ViewContext.FullScreen; } private void HandleItemChanged (object sender, BrowsablePointerChangedEventArgs args) { Photo = item.Current; } private void HandleVersionChanged (InfoBox box, IPhotoVersion version) { IPhotoVersionable versionable = item.Current as IPhotoVersionable; PhotoQuery q = item.Collection as PhotoQuery; if (versionable != null && q != null) { versionable.SetDefaultVersion (version); q.Commit (item.Index); } } } public class InfoOverlay : ControlOverlay { InfoItem box; public InfoOverlay (Widget w, BrowsablePointer item) : base (w) { XAlign = 1.0; YAlign = 0.1; DefaultWidth = 250; box = new InfoItem (item); box.BorderWidth = 15; Add (box); box.ShowAll (); Visibility = VisibilityType.Partial; KeepAbove = true; //WindowPosition = WindowPosition.Mouse; AutoHide = false; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/FullScreenView.cs0000644000175000017500000002250511503404761023242 0ustar00rubenruben00000000000000/* * FSpot.FullScreenView * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ using System; using Gtk; using Gdk; using FSpot.Core; using FSpot.Widgets; using FSpot.Gui; using FSpot.Utils; using Hyena; using Mono.Unix; namespace FSpot { [Binding(Gdk.Key.Escape, "Quit")] public class FullScreenView : Gtk.Window { private ScrolledView scroll; private PhotoImageView view; private Notebook notebook; private ControlOverlay controls; private SlideShow display; private ToolButton play_pause_button; private ToggleToolButton info_button; private DelayedOperation hide_cursor_delay; ActionGroup actions; const string ExitFullScreen = "ExitFullScreen"; const string HideToolbar = "HideToolbar"; const string SlideShow = "SlideShow"; const string Info = "Info"; public FullScreenView (IBrowsableCollection collection, Gtk.Window parent) : base ("Full Screen Mode") { //going fullscreen on the same screen the parent window Gdk.Screen screen = Screen; int monitor = screen.GetMonitorAtWindow (parent.GdkWindow); Gdk.Rectangle bounds = screen.GetMonitorGeometry (monitor); Move (bounds.X, bounds.Y); string style = "style \"test\" {\n" + "GtkToolbar::shadow_type = GTK_SHADOW_NONE\n" + "}\n" + "class \"GtkToolbar\" style \"test\""; Gtk.Rc.ParseString (style); Name = "FullscreenContainer"; try { //scroll = new Gtk.ScrolledWindow (null, null); actions = new ActionGroup ("joe"); actions.Add (new ActionEntry [] { new ActionEntry (HideToolbar, Stock.Close, Catalog.GetString ("Hide"), null, Catalog.GetString ("Hide toolbar"), HideToolbarAction)}); actions.Add (new ToggleActionEntry [] { new ToggleActionEntry (Info, Stock.Info, Catalog.GetString ("Info"), null, Catalog.GetString ("Image information"), InfoAction, false)}); Gtk.Action exit_full_screen = new Gtk.Action (ExitFullScreen, Catalog.GetString ("Exit fullscreen"), null, null); exit_full_screen.IconName = "view-restore"; exit_full_screen.Activated += ExitAction; actions.Add (exit_full_screen); Gtk.Action slide_show = new Gtk.Action (SlideShow, Catalog.GetString ("Slideshow"), Catalog.GetString ("Start slideshow"), null); slide_show.IconName = "media-playback-start"; slide_show.Activated += SlideShowAction; actions.Add (slide_show); new WindowOpacityFader (this, 1.0, 600); notebook = new Notebook (); notebook.ShowBorder = false; notebook.ShowTabs = false; notebook.Show (); scroll = new ScrolledView (); scroll.ScrolledWindow.SetPolicy (PolicyType.Never, PolicyType.Never); view = new PhotoImageView (collection); // FIXME this should be handled by the new style setting code view.ModifyBg (Gtk.StateType.Normal, this.Style.Black); this.Add (notebook); view.Show (); view.MotionNotifyEvent += HandleViewMotion; view.PointerMode = PointerMode.Scroll; scroll.ScrolledWindow.Add (view); Toolbar tbar = new Toolbar (); tbar.ToolbarStyle = Gtk.ToolbarStyle.BothHoriz; tbar.ShowArrow = false; tbar.BorderWidth = 15; ToolItem t_item = (actions [ExitFullScreen]).CreateToolItem () as ToolItem; t_item.IsImportant = true; tbar.Insert (t_item, -1); Gtk.Action action = new PreviousPictureAction (view.Item); actions.Add (action); tbar.Insert (action.CreateToolItem () as ToolItem, -1); play_pause_button = (actions [SlideShow]).CreateToolItem () as ToolButton; tbar.Insert (play_pause_button, -1); action = new NextPictureAction (view.Item); actions.Add (action); tbar.Insert (action.CreateToolItem () as ToolItem, -1); t_item = new ToolItem (); t_item.Child = new Label (Catalog.GetString ("Slide transition:")); tbar.Insert (t_item, -1); display = new SlideShow (view.Item); display.AddEvents ((int) (Gdk.EventMask.PointerMotionMask)); display.ModifyBg (Gtk.StateType.Normal, this.Style.Black); display.MotionNotifyEvent += HandleViewMotion; display.Show (); t_item = new ToolItem (); ComboBox combo = ComboBox.NewText (); foreach (var transition in display.Transitions) combo.AppendText (transition.Name); combo.Active = 0; combo.Changed += HandleTransitionChanged; t_item.Child = combo; tbar.Insert (t_item, -1); action = new RotateLeftAction (view.Item); actions.Add (action); tbar.Insert (action.CreateToolItem () as ToolItem, -1); action = new RotateRightAction (view.Item); actions.Add (action); tbar.Insert (action.CreateToolItem () as ToolItem, -1); info_button = (ToggleToolButton) ((actions [Info]).CreateToolItem () as ToolItem); tbar.Insert (info_button, -1); tbar.Insert ((actions [HideToolbar]).CreateToolItem () as ToolItem, -1); notebook.AppendPage (scroll, null); notebook.AppendPage (display, null); tbar.ShowAll (); scroll.Show (); this.Decorated = false; this.Fullscreen (); this.ButtonPressEvent += HandleButtonPressEvent; view.Item.Changed += HandleItemChanged; view.GrabFocus (); hide_cursor_delay = new DelayedOperation (3000, new GLib.IdleHandler (HideCursor)); hide_cursor_delay.Start (); controls = new ControlOverlay (this); controls.Add (tbar); controls.Dismiss (); notebook.CurrentPage = 0; } catch (System.Exception e) { Log.Exception (e); } } private Gdk.Cursor empty_cursor; private bool HideCursor () { if (view.InPanMotion) { return false; } if (empty_cursor == null) empty_cursor = GdkUtils.CreateEmptyCursor (GdkWindow.Display); this.GdkWindow.Cursor = empty_cursor; view.GdkWindow.Cursor = empty_cursor; return false; } private void ShowCursor () { view.PointerMode = PointerMode.Scroll; this.GdkWindow.Cursor = null; } private void HandleItemChanged (object sender, BrowsablePointerChangedEventArgs args) { if (scroll.ControlBox.Visible) scroll.ShowControls (); } void HandleTransitionChanged (object sender, EventArgs e) { ComboBox combo = sender as ComboBox; if (combo == null) return; TreeIter iter; if (combo.GetActiveIter (out iter)) { string name = combo.Model.GetValue (iter, 0) as string; foreach (var transition in display.Transitions) if (transition.Name == name) display.Transition = transition; } } protected override bool OnExposeEvent (Gdk.EventExpose args) { bool ret = base.OnExposeEvent (args); HideCursor (); return ret; } private void ExitAction (object sender, System.EventArgs args) { Quit (); } private void HideToolbarAction (object sender, System.EventArgs args) { scroll.HideControls (true); controls.Dismiss (); } private void SlideShowAction (object sender, System.EventArgs args) { PlayPause (); } InfoOverlay info; private void InfoAction (object sender, System.EventArgs args) { bool active = false; if (sender is ToggleToolButton) { (sender as ToggleToolButton).Active = ! (sender as ToggleToolButton).Active; active = (sender as ToggleToolButton).Active; } else active = (sender as ToggleAction).Active; if (info == null) { info = new InfoOverlay (this, view.Item); } info.Visibility = active ? ControlOverlay.VisibilityType.Partial : ControlOverlay.VisibilityType.None; } [GLib.ConnectBefore] private void HandleViewMotion (object sender, Gtk.MotionNotifyEventArgs args) { ShowCursor (); hide_cursor_delay.Restart (); int x, y; Gdk.ModifierType type; ((Gtk.Widget)sender).GdkWindow.GetPointer (out x, out y, out type); if (y > (Allocation.Height * 0.75)) { controls.Visibility = ControlOverlay.VisibilityType.Partial; scroll.ShowControls (); } } public PhotoImageView View { get { return view; } } private void HandleButtonPressEvent (object sender, Gtk.ButtonPressEventArgs args) { if (args.Event.Type == Gdk.EventType.ButtonPress && args.Event.Button == 3) { PhotoPopup popup = new PhotoPopup (this); popup.Activate (this.Toplevel, args.Event); } } public bool PlayPause () { if (notebook.CurrentPage == 0) { FSpot.Platform.ScreenSaver.Inhibit ("Running slideshow mode"); notebook.CurrentPage = 1; play_pause_button.IconName = "media-playback-pause"; display.Start (); } else { FSpot.Platform.ScreenSaver.UnInhibit (); notebook.CurrentPage = 0; play_pause_button.IconName = "media-playback-start"; display.Stop (); } return true; } public void Quit () { hide_cursor_delay.Stop (); FSpot.Platform.ScreenSaver.UnInhibit (); this.Destroy (); } protected override bool OnKeyPressEvent (Gdk.EventKey key) { switch (key.Key) { // quit only on certain keys case Gdk.Key.F: case Gdk.Key.f: case Gdk.Key.Q: case Gdk.Key.q: case Gdk.Key.F11: case Gdk.Key.Escape: Quit (); return true; // display infobox for 'i' key case Gdk.Key.i: case Gdk.Key.I: InfoAction (info_button, null); return true; case Gdk.Key.bracketleft: new RotateLeftAction (view.Item).Activate (); return true; case Gdk.Key.bracketright: new RotateRightAction (view.Item).Activate (); return true; } return base.OnKeyPressEvent (key); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/TagQueryWidget.cs0000644000175000017500000004133711503404761023256 0ustar00rubenruben00000000000000using System; using System.Collections; using System.Text; using Mono.Unix; using Gtk; using Gdk; using FSpot.Core; using FSpot.Utils; using FSpot.Query; namespace FSpot { public class LiteralPopup { //private Literal literal; public void Activate (Gdk.EventButton eb, Literal literal) { Activate (eb, literal, new Gtk.Menu (), true); } public void Activate (Gdk.EventButton eb, Literal literal, Gtk.Menu popup_menu, bool is_popup) { //this.literal = literal; /*MenuItem attach_item = new MenuItem (Catalog.GetString ("Find With")); TagMenu attach_menu = new TagMenu (attach_item, App.Instance.Database.Tags); attach_menu.TagSelected += literal.HandleAttachTagCommand; attach_item.ShowAll (); popup_menu.Append (attach_item);*/ if (literal.IsNegated) { GtkUtil.MakeMenuItem (popup_menu, String.Format (Catalog.GetString ("Include Photos Tagged \"{0}\""), literal.Tag.Name), new EventHandler (literal.HandleToggleNegatedCommand), true); } else { GtkUtil.MakeMenuItem (popup_menu, String.Format (Catalog.GetString ("Exclude Photos Tagged \"{0}\""), literal.Tag.Name), new EventHandler (literal.HandleToggleNegatedCommand), true); } GtkUtil.MakeMenuItem (popup_menu, Catalog.GetString ("Remove From Search"), "gtk-remove", new EventHandler (literal.HandleRemoveCommand), true); if (is_popup) { if (eb != null) popup_menu.Popup (null, null, null, eb.Button, eb.Time); else popup_menu.Popup (null, null, null, 0, Gtk.Global.CurrentEventTime); } } } public class LiteralMenu : Menu { private LiteralPopup popup; private Literal literal; public LiteralMenu (MenuItem item, Literal literal) { popup = new LiteralPopup (); this.literal = literal; item.Submenu = this; item.Activated += HandlePopulate; } private void HandlePopulate (object obj, EventArgs args) { foreach (Widget child in Children) { Remove (child); child.Destroy (); } popup.Activate (null, literal, this, false); } } public static class TermMenuItem { public static void Create (Tag [] tags, Gtk.Menu menu) { Gtk.MenuItem item = new Gtk.MenuItem (String.Format (Catalog.GetPluralString ("Find _With", "Find _With", tags.Length), tags.Length)); Gtk.Menu submenu = GetSubmenu (tags); if (submenu == null) item.Sensitive = false; else item.Submenu = submenu; menu.Append (item); item.Show (); } public static Gtk.Menu GetSubmenu (Tag [] tags) { Tag single_tag = null; if (tags != null && tags.Length == 1) single_tag = tags[0]; //Console.WriteLine ("creating find with menu item"); if (LogicWidget.Root == null || LogicWidget.Root.SubTerms.Count == 0) { //Console.WriteLine ("root is null or has no terms"); return null; } else { //Console.WriteLine ("root is not null and has terms"); Gtk.Menu m = new Gtk.Menu (); Gtk.MenuItem all_item = GtkUtil.MakeMenuItem (m, Catalog.GetString ("All"), new EventHandler (App.Instance.Organizer.HandleRequireTag)); GtkUtil.MakeMenuSeparator (m); int sensitive_items = 0; foreach (Term term in LogicWidget.Root.SubTerms) { ArrayList term_parts = new ArrayList (); bool contains_tag = AppendTerm (term_parts, term, single_tag); string name = "_" + String.Join (", ", (string []) term_parts.ToArray (typeof(string))); Gtk.MenuItem item = GtkUtil.MakeMenuItem (m, name, new EventHandler (App.Instance.Organizer.HandleAddTagToTerm)); item.Sensitive = !contains_tag; if (!contains_tag) sensitive_items++; } if (sensitive_items == 0) all_item.Sensitive = false; return m; } } private static bool AppendTerm (ArrayList parts, Term term, Tag single_tag) { bool tag_matches = false; if (term != null) { Literal literal = term as Literal; if (literal != null) { if (literal.Tag == single_tag) tag_matches = true; if (literal.IsNegated) parts.Add (String.Format (Catalog.GetString ("Not {0}"), literal.Tag.Name)); else parts.Add (literal.Tag.Name); } else { foreach (Term subterm in term.SubTerms) { tag_matches |= AppendTerm (parts, subterm, single_tag); } } } return tag_matches; } } public class LiteralBox : VBox { private GrabHandle handle; public LiteralBox () : base () { handle = new GrabHandle (24, 8); PackEnd (handle, false, false, 0); Show (); } } public class GrabHandle : DrawingArea { public GrabHandle (int w, int h) : base () { Size (w, h); Orientation = Gtk.Orientation.Horizontal; Show (); } private Gtk.Orientation orientation; public Gtk.Orientation Orientation { get { return orientation; } set { orientation = value; } } protected override bool OnExposeEvent (Gdk.EventExpose evnt) { bool ret = base.OnExposeEvent(evnt); if (evnt.Window != GdkWindow) { return ret; } Gtk.Style.PaintHandle(Style, GdkWindow, State, ShadowType.In, evnt.Area, this, "entry", 0, 0, Allocation.Width, Allocation.Height, Orientation); //(Style, GdkWindow, StateType.Normal, ShadowType.In, //evnt.Area, this, "entry", 0, y_mid - y_offset, Allocation.Width, //Height + (y_offset * 2)); return ret; } } public class LogicWidget : HBox { private PhotoQuery query; private static Term rootTerm; private EventBox rootAdd; private HBox rootBox; private Label help; private HBox sepBox; private bool preventUpdate = false; private bool preview = false; public event EventHandler Changed; public static Term Root { get { return rootTerm; } } private static LogicWidget logic_widget = null; public static LogicWidget Box { get { return logic_widget; } } // Drag and Drop private static TargetEntry [] tag_dest_target_table = new TargetEntry [] { DragDropTargets.TagListEntry, DragDropTargets.TagQueryEntry }; public LogicWidget (PhotoQuery query, TagStore tag_store) : base () { //SetFlag (WidgetFlags.NoWindow); this.query = query; CanFocus = true; Sensitive = true; Init (); tag_store.ItemsChanged += HandleTagChanged; tag_store.ItemsRemoved += HandleTagDeleted; Show (); logic_widget = this; } private void Init () { sepBox = null; preview = false; rootAdd = new Gtk.EventBox (); rootAdd.VisibleWindow = false; rootAdd.CanFocus = true; rootAdd.DragMotion += HandleDragMotion; rootAdd.DragDataReceived += HandleDragDataReceived; rootAdd.DragLeave += HandleDragLeave; help = new Gtk.Label ("" + Catalog.GetString ("Drag tags here to search for them") + ""); help.UseMarkup = true; help.Visible = true; rootBox = new HBox(); rootBox.Add (help); rootBox.Show (); rootAdd.Child = rootBox; rootAdd.Show (); Gtk.Drag.DestSet (rootAdd, DestDefaults.All, tag_dest_target_table, DragAction.Copy | DragAction.Move ); PackEnd (rootAdd, true, true, 0); rootTerm = new OrTerm (null, null); } private void Preview () { if (sepBox == null) { sepBox = new HBox (); Widget sep = rootTerm.SeparatorWidget (); if (sep != null) { sep.Show (); sepBox.PackStart (sep, false, false, 0); } rootBox.Add (sepBox); } help.Hide (); sepBox.Show (); } /** Handlers **/ // When the user edits a tag (it's icon, name, etc) we get called // and update the images/text in the query as needed to reflect the changes. private void HandleTagChanged (object sender, DbItemEventArgs args) { foreach (Tag t in args.Items) foreach (Literal term in rootTerm.FindByTag (t)) term.Update (); } // If the user deletes a tag that is in use in the query, remove it from the query too. private void HandleTagDeleted (object sender, DbItemEventArgs args) { foreach (Tag t in args.Items) foreach (Literal term in rootTerm.FindByTag (t)) term.RemoveSelf (); } private void HandleDragMotion (object o, DragMotionArgs args) { if (!preview && rootTerm.Count > 0 && (Literal.FocusedLiterals.Count == 0 || Children.Length > 2)) { Preview (); preview = true; } } private void HandleDragLeave (object o, EventArgs args) { if (preview && Children.Length > 1) { sepBox.Hide (); preview = false; } else if (preview && Children.Length == 1) { help.Show (); } } private void HandleLiteralsMoved (ArrayList literals, Term parent, Literal after) { preventUpdate = true; foreach (Literal term in literals) { Tag tag = term.Tag; // Don't listen for it to be removed since we are // moving it. We will update when we're done. term.Removed -= HandleRemoved; term.RemoveSelf (); // Add it to where it was dropped ArrayList groups = InsertTerm (new Tag[] {tag}, parent, after); if (term.IsNegated) foreach (Literal group in groups) group.IsNegated = true; } preventUpdate = false; UpdateQuery (); } private void HandleTagsAdded (Tag[] tags, Term parent, Literal after) { InsertTerm (tags, parent, after); } private void HandleAttachTag (Tag tag, Term parent, Literal after) { InsertTerm (new Tag [] {tag}, parent, after); } private void HandleNegated (Literal group) { UpdateQuery (); } private void HandleRemoving (Literal term) { foreach (Widget w in HangersOn (term)) Remove (w); // Remove the term's widget Remove (term.Widget); } public ArrayList HangersOn (Literal term) { ArrayList w = new ArrayList (); // Find separators that only exist because of this term if (term.Parent != null) { if (term.Parent.Count > 1) { if (term == term.Parent.Last) w.Add (Children[WidgetPosition (term.Widget) - 1]); else w.Add (Children[WidgetPosition (term.Widget) + 1]); } else if (term.Parent.Count == 1) { if (term.Parent.Parent != null) { if (term.Parent.Parent.Count > 1) { if (term.Parent == term.Parent.Parent.Last) w.Add (Children[WidgetPosition (term.Widget) - 1]); else w.Add (Children[WidgetPosition (term.Widget) + 1]); } } } } return w; } private void HandleRemoved (Literal group) { UpdateQuery (); } private void HandleDragDataReceived (object o, DragDataReceivedArgs args) { args.RetVal = true; if (args.Info == DragDropTargets.TagListEntry.Info) { InsertTerm (args.SelectionData.GetTagsData (), rootTerm, null); return; } if (args.Info == DragDropTargets.TagQueryEntry.Info) { // FIXME: use drag data HandleLiteralsMoved (Literal.FocusedLiterals, rootTerm, null); // Prevent them from being removed again Literal.FocusedLiterals = null; return; } } /** Helper Functions **/ public void PhotoTagsChanged (Tag [] tags) { bool refresh_required = false; foreach (Tag tag in tags) { if ((rootTerm.FindByTag (tag)).Count > 0) { refresh_required = true; break; } } if (refresh_required) UpdateQuery (); } // Inserts a widget into a Box at a certain index private void InsertWidget (int index, Gtk.Widget widget) { widget.Visible = true; PackStart (widget, false, false, 0); ReorderChild (widget, index); } // Return the index position of a widget in this Box private int WidgetPosition (Gtk.Widget widget) { for (int i = 0; i < Children.Length; i++) if (Children[i] == widget) return i; return Children.Length - 1; } public bool TagIncluded (Tag tag) { return rootTerm.TagIncluded (tag); } public bool TagRequired (Tag tag) { return rootTerm.TagRequired (tag); } // Add a tag or group of tags to the rootTerm, at the end of the Box public void Include (Tag [] tags) { // Filter out any tags that are already included ArrayList new_tags = new ArrayList(tags.Length); foreach (Tag tag in tags) { if (! rootTerm.TagIncluded (tag)) new_tags.Add (tag); } if (new_tags.Count == 0) return; tags = (Tag []) new_tags.ToArray (typeof (Tag)); InsertTerm (tags, rootTerm, null); } public void UnInclude (Tag [] tags) { ArrayList new_tags = new ArrayList(tags.Length); foreach (Tag tag in tags) { if (rootTerm.TagIncluded (tag)) new_tags.Add (tag); } if (new_tags.Count == 0) return; tags = (Tag []) new_tags.ToArray (typeof (Tag)); bool needsUpdate = false; preventUpdate = true; foreach (Term parent in rootTerm.LiteralParents ()) { if (parent.Count == 1) { foreach (Tag tag in tags) { if ((parent.Last as Literal).Tag == tag) { (parent.Last as Literal).RemoveSelf (); needsUpdate = true; break; } } } } preventUpdate = false; if (needsUpdate) UpdateQuery (); } // AND this tag with all terms public void Require (Tag [] tags) { // TODO it would be awesome if this was done by putting parentheses around // OR terms and ANDing the result with this term (eg factored out) // Trim out tags that are already required ArrayList new_tags = new ArrayList(tags.Length); foreach (Tag tag in tags) { if (! rootTerm.TagRequired (tag)) new_tags.Add (tag); } if (new_tags.Count == 0) return; tags = (Tag []) new_tags.ToArray (typeof (Tag)); bool added = false; preventUpdate = true; foreach (Term parent in rootTerm.LiteralParents ()) { // TODO logic could be broken if a term's SubTerms are a mixture // of Literals and non-Literals InsertTerm (tags, parent, parent.Last as Literal); added = true; } // If there were no LiteralParents to add this tag to, then add it to the rootTerm // TODO should add the first tag in the array, // then add the others to the first's parent (so they will be ANDed together) if (!added) InsertTerm (tags, rootTerm, null); preventUpdate = false; UpdateQuery (); } public void UnRequire (Tag [] tags) { // Trim out tags that are not required ArrayList new_tags = new ArrayList(tags.Length); foreach (Tag tag in tags) { if (rootTerm.TagRequired (tag)) new_tags.Add (tag); } if (new_tags.Count == 0) return; tags = (Tag []) new_tags.ToArray (typeof (Tag)); preventUpdate = true; foreach (Term parent in rootTerm.LiteralParents ()) { // Don't remove if this tag is the only child of a term if (parent.Count > 1) { foreach (Tag tag in tags) { ((parent.FindByTag (tag))[0] as Literal).RemoveSelf (); } } } preventUpdate = false; UpdateQuery (); } public ArrayList InsertTerm (Tag [] tags, Term parent, Literal after) { int position; if (after != null) position = WidgetPosition (after.Widget) + 1; else position = Children.Length - 1; ArrayList added = new ArrayList (); foreach (Tag tag in tags) { //Console.WriteLine ("Adding tag {0}", tag.Name); // Don't put a tag into a Term twice if (parent != Root && (parent.FindByTag (tag, true)).Count > 0) continue; if (parent.Count > 0) { Widget sep = parent.SeparatorWidget (); InsertWidget (position, sep); position++; } // Encapsulate new OR terms within a new AND term of which they are the // only member, so later other terms can be AND'd with them // // TODO should really see what type of term the parent is, and // encapsulate this term in a term of the opposite type. This will // allow the query system to be expanded to work for multiple levels much easier. if (parent == rootTerm) { parent = new AndTerm (rootTerm, after); after = null; } Literal term = new Literal (parent, tag, after); term.TagsAdded += HandleTagsAdded; term.LiteralsMoved += HandleLiteralsMoved; term.AttachTag += HandleAttachTag; term.NegatedToggled += HandleNegated; term.Removing += HandleRemoving; term.Removed += HandleRemoved; term.RequireTag += Require; term.UnRequireTag += UnRequire; added.Add (term); // Insert this widget into the appropriate place in the hbox InsertWidget (position, term.Widget); } UpdateQuery (); return added; } // Update the query, which updates the icon_view public void UpdateQuery () { if (preventUpdate) return; if (sepBox != null) sepBox.Hide (); if (rootTerm.Count == 0) { help.Show (); query.TagTerm = null; } else { help.Hide (); query.TagTerm = new ConditionWrapper (rootTerm.SqlCondition ()); } EventHandler handler = Changed; if (handler != null) handler (this, new EventArgs ()); } public bool Clear { get { return rootTerm.Count == 0; } set { // Clear out the query, starting afresh foreach (Widget widget in Children) { Remove (widget); widget.Destroy (); } Init (); } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/ThumbnailGenerator.cs0000644000175000017500000000160311503404761024133 0ustar00rubenruben00000000000000/* * FSpot.ThumbnailGenerator.cs * * Author(s) * Larry Ewing * * This is free software. See COPYING for details. */ using System; using Hyena; using FSpot.Utils; using FSpot.Platform; using Mono.Unix.Native; using GFileInfo = GLib.FileInfo; namespace FSpot { public class ThumbnailLoader : ImageLoaderThread { static public ThumbnailLoader Default = new ThumbnailLoader (); public void Request (SafeUri uri, ThumbnailSize size, int order) { var pixels = size == ThumbnailSize.Normal ? 128 : 256; Request (uri, order, pixels, pixels); } protected override void ProcessRequest (RequestItem request) { var size = request.Width == 128 ? ThumbnailSize.Normal : ThumbnailSize.Large; request.Result = XdgThumbnailSpec.LoadThumbnail (request.Uri, size); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/QueryWidget.cs0000644000175000017500000001256511503404761022623 0ustar00rubenruben00000000000000/* * FSpot.QueryWidget.cs * * Author(s): * Gabriel Burt * * This is free software. See COPYING for details. */ using System; using System.Collections.Generic; using Mono.Unix; using Gtk; using FSpot.Core; using FSpot.Database; using FSpot.Utils; using FSpot.Query; using FSpot.Widgets; using Hyena; namespace FSpot { public class QueryWidget : HighlightedBox { PhotoQuery query; LogicWidget logic_widget; FolderQueryWidget folder_query_widget; Gtk.HBox box; Gtk.Label label; Gtk.Label untagged; Gtk.Label rated; Gtk.Label comma1_label; Gtk.Label comma2_label; Gtk.Label rollfilter; Gtk.HBox warning_box; Gtk.Button clear_button; Gtk.Button refresh_button; public LogicWidget Logic { get { return logic_widget; } } protected QueryWidget (IntPtr raw) : base (raw) {} public QueryWidget (PhotoQuery query, Db db) : base(new HBox()) { box = Child as HBox; box.Spacing = 6; box.BorderWidth = 2; this.query = query; query.Changed += HandleChanged; label = new Gtk.Label (Catalog.GetString ("Find: ")); label.Show (); label.Ypad = 9; box.PackStart (label, false, false, 0); untagged = new Gtk.Label (Catalog.GetString ("Untagged photos")); untagged.Visible = false; box.PackStart (untagged, false, false, 0); comma1_label = new Gtk.Label (", "); comma1_label.Visible = false; box.PackStart (comma1_label, false, false, 0); rated = new Gtk.Label (Catalog.GetString ("Rated photos")); rated.Visible = false; box.PackStart (rated, false, false, 0); comma2_label = new Gtk.Label (", "); comma2_label.Visible = false; box.PackStart (comma2_label, false, false, 0); // Note for translators: 'Import roll' is no command, it means 'Roll that has been imported' rollfilter = new Gtk.Label (Catalog.GetString ("Import roll")); rollfilter.Visible = false; box.PackStart (rollfilter, false, false, 0); folder_query_widget = new FolderQueryWidget (query); folder_query_widget.Visible = false; box.PackStart (folder_query_widget, false, false, 0); logic_widget = new LogicWidget (query, db.Tags); logic_widget.Show (); box.PackStart (logic_widget, true, true, 0); warning_box = new Gtk.HBox (); warning_box.PackStart (new Gtk.Label (System.String.Empty)); Gtk.Image warning_image = new Gtk.Image ("gtk-info", Gtk.IconSize.Button); warning_image.Show (); warning_box.PackStart (warning_image, false, false, 0); clear_button = new Gtk.Button (); clear_button.Add (new Gtk.Image ("gtk-close", Gtk.IconSize.Button)); clear_button.Clicked += HandleClearButtonClicked; clear_button.Relief = Gtk.ReliefStyle.None; clear_button.TooltipText = Catalog.GetString("Clear search"); box.PackEnd (clear_button, false, false, 0); refresh_button = new Gtk.Button (); refresh_button.Add (new Gtk.Image ("gtk-refresh", Gtk.IconSize.Button)); refresh_button.Clicked += HandleRefreshButtonClicked; refresh_button.Relief = Gtk.ReliefStyle.None; refresh_button.TooltipText = Catalog.GetString("Refresh search"); box.PackEnd (refresh_button, false, false, 0); Gtk.Label warning = new Gtk.Label (Catalog.GetString ("No matching photos found")); warning_box.PackStart (warning, false, false, 0); warning_box.ShowAll (); warning_box.Spacing = 6; warning_box.Visible = false; box.PackEnd (warning_box, false, false, 0); warning_box.Visible = false; } public void HandleClearButtonClicked (object sender, System.EventArgs args) { Close (); } public void HandleRefreshButtonClicked (object sender, System.EventArgs args) { query.RequestReload (); } public void Close () { query.Untagged = false; query.RollSet = null; if (query.Untagged) return; query.RatingRange = null; logic_widget.Clear = true; logic_widget.UpdateQuery (); folder_query_widget.Clear (); query.RequestReload (); HideBar (); } public void ShowBar () { Show (); } public void HideBar () { Hide (); } public void HandleChanged (IBrowsableCollection collection) { if (query.TagTerm == null) logic_widget.Clear = true; if ( ! logic_widget.Clear || query.Untagged || (query.RollSet != null) || (query.RatingRange != null) || ! folder_query_widget.Empty) ShowBar (); else HideBar (); untagged.Visible = query.Untagged; rated.Visible = (query.RatingRange != null); warning_box.Visible = (query.Count < 1); rollfilter.Visible = (query.RollSet != null); comma1_label.Visible = (untagged.Visible && rated.Visible); comma2_label.Visible = (!untagged.Visible && rated.Visible && rollfilter.Visible) || (untagged.Visible && rollfilter.Visible); } public void PhotoTagsChanged (Tag[] tags) { logic_widget.PhotoTagsChanged (tags); } public void Include (Tag [] tags) { logic_widget.Include (tags); } public void UnInclude (Tag [] tags) { logic_widget.UnInclude (tags); } public void Require (Tag [] tags) { logic_widget.Require (tags); } public void UnRequire (Tag [] tags) { logic_widget.UnRequire (tags); } public bool TagIncluded (Tag tag) { return logic_widget.TagIncluded (tag); } public bool TagRequired (Tag tag) { return logic_widget.TagRequired (tag); } public void SetFolders (IEnumerable uri_list) { folder_query_widget.SetFolders (uri_list); query.RequestReload (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/RollStore.cs0000644000175000017500000000551011503404761022267 0ustar00rubenruben00000000000000/* * RollStore.cs * * Author(s) * Ettore Perazzoli * Bengt Thuree * Stephane Delcroix * * This is free software. See COPYING for details. */ using System.Collections; using System.IO; using System; using FSpot.Core; using FSpot.Database; using FSpot.Utils; using FSpot; using Hyena; using Hyena.Data.Sqlite; namespace FSpot { public class RollStore : DbStore { public RollStore (FSpotDatabaseConnection database, bool is_new) : base (database, false) { if (!is_new && Database.TableExists("rolls")) return; Database.Execute ( "CREATE TABLE rolls (\n" + " id INTEGER PRIMARY KEY NOT NULL, \n" + " time INTEGER NOT NULL\n" + ")"); } public Roll Create (DateTime time_in_utc) { long unix_time = DateTimeUtil.FromDateTime (time_in_utc); uint id = (uint) Database.Execute (new HyenaSqliteCommand ("INSERT INTO rolls (time) VALUES (?)", unix_time)); Roll roll = new Roll (id, unix_time); AddToCache (roll); return roll; } public Roll Create () { return Create (System.DateTime.UtcNow); } public override Roll Get (uint id) { Roll roll = LookupInCache (id) as Roll; if (roll != null) return roll; IDataReader reader = Database.Query(new HyenaSqliteCommand ("SELECT time FROM rolls WHERE id = ?", id)); if (reader.Read ()) { roll = new Roll (id, Convert.ToUInt32 (reader ["time"])); AddToCache (roll); } reader.Dispose(); return roll; } public override void Remove (Roll item) { RemoveFromCache (item); Database.Execute (new HyenaSqliteCommand ("DELETE FROM rolls WHERE id = ?", item.Id)); } public override void Commit (Roll item) { // Nothing to do here, since all the properties of a roll are immutable. } public uint PhotosInRoll (Roll roll) { uint number_of_photos = 0; using (IDataReader reader = Database.Query (new HyenaSqliteCommand ("SELECT count(*) AS count FROM photos WHERE roll_id = ?", roll.Id))) { if (reader.Read ()) number_of_photos = Convert.ToUInt32 (reader ["count"]); reader.Dispose (); } return number_of_photos; } public Roll [] GetRolls () { return GetRolls (-1); } public Roll [] GetRolls (int limit) { ArrayList list = new ArrayList (); string query = "SELECT DISTINCT rolls.id AS roll_id, rolls.time AS roll_time FROM rolls, photos WHERE photos.roll_id = rolls.id ORDER BY rolls.time DESC"; if (limit >= 0) query += " LIMIT " + limit; using (IDataReader reader = Database.Query(query)) { while (reader.Read ()) { uint id = Convert.ToUInt32 (reader["roll_id"]); Roll roll = LookupInCache (id) as Roll; if (roll == null) { roll = new Roll (id, Convert.ToUInt32 (reader["roll_time"])); AddToCache (roll); } list.Add (roll); } reader.Dispose (); } return (Roll []) list.ToArray (typeof (Roll)); } } }f-spot-0.8.2/src/Clients/MainApp/FSpot/Preferences.cs0000644000175000017500000001762111503404761022611 0ustar00rubenruben00000000000000using System.Net; using System; using System.Collections.Generic; using Mono.Unix; using FSpot.Core; using FSpot.Platform; using Hyena; namespace FSpot { public class Preferences { public const string APP_FSPOT = "/apps/f-spot/"; public const string APP_FSPOT_EXPORT = APP_FSPOT + "export/"; public const string APP_FSPOT_EXPORT_TOKENS = APP_FSPOT_EXPORT + "tokens/"; public const string GTK_RC = APP_FSPOT + "ui/gtkrc"; public const string MAIN_WINDOW_MAXIMIZED = APP_FSPOT + "ui/maximized"; public const string MAIN_WINDOW_X = APP_FSPOT + "ui/main_window_x"; public const string MAIN_WINDOW_Y = APP_FSPOT + "ui/main_window_y"; public const string MAIN_WINDOW_WIDTH = APP_FSPOT + "ui/main_window_width"; public const string MAIN_WINDOW_HEIGHT = APP_FSPOT + "ui/main_window_height"; public const string IMPORT_WINDOW_WIDTH = APP_FSPOT + "ui/import_window_width"; public const string IMPORT_WINDOW_HEIGHT = APP_FSPOT + "ui/import_window_height"; public const string IMPORT_WINDOW_PANE_POSITION = APP_FSPOT + "ui/import_window_pane_position"; public const string IMPORT_COPY_FILES = "/apps/f-spot/import/copy_files"; public const string IMPORT_INCLUDE_SUBFOLDERS = "/apps/f-spot/import/include_subfolders"; public const string IMPORT_CHECK_DUPLICATES = "/apps/f-spot/import/check_duplicates"; public const string IMPORT_REMOVE_ORIGINALS = "/apps/f-spot/import/remove_originals"; public const string VIEWER_WIDTH = APP_FSPOT + "ui/viewer_width"; public const string VIEWER_HEIGHT = APP_FSPOT + "ui/viewer_height"; public const string VIEWER_MAXIMIZED = APP_FSPOT + "ui/viewer_maximized"; public const string VIEWER_SHOW_TOOLBAR = APP_FSPOT + "ui/viewer_show_toolbar"; public const string VIEWER_SHOW_FILENAMES = APP_FSPOT + "ui/viewer_show_filenames"; public const string VIEWER_INTERPOLATION = APP_FSPOT + "viewer/interpolation"; public const string VIEWER_TRANS_COLOR = APP_FSPOT + "viewer/trans_color"; public const string VIEWER_TRANSPARENCY = APP_FSPOT + "viewer/transparency"; public const string CUSTOM_CROP_RATIOS = APP_FSPOT + "viewer/custom_crop_ratios"; public const string COLOR_MANAGEMENT_DISPLAY_PROFILE = APP_FSPOT + "ui/color_management_display_profile"; public const string COLOR_MANAGEMENT_OUTPUT_PROFILE = APP_FSPOT + "ui/color_management_output_profile"; public const string SHOW_TOOLBAR = APP_FSPOT + "ui/show_toolbar"; public const string SHOW_SIDEBAR = APP_FSPOT + "ui/show_sidebar"; public const string SHOW_TIMELINE = APP_FSPOT + "ui/show_timeline"; public const string SHOW_FILMSTRIP = APP_FSPOT + "ui/show_filmstrip"; public const string FILMSTRIP_ORIENTATION = APP_FSPOT + "ui/filmstrip_orientation"; public const string SHOW_TAGS = APP_FSPOT + "ui/show_tags"; public const string SHOW_DATES = APP_FSPOT + "ui/show_dates"; public const string EXPANDED_TAGS = APP_FSPOT + "ui/expanded_tags"; public const string SHOW_RATINGS = APP_FSPOT + "ui/show_ratings"; public const string TAG_ICON_SIZE = APP_FSPOT + "ui/tag_icon_size"; public const string TAG_ICON_AUTOMATIC = APP_FSPOT + "ui/tag_icon_automatic"; public const string GLASS_POSITION = APP_FSPOT + "ui/glass_position"; public const string GROUP_ADAPTOR_ORDER_ASC = APP_FSPOT + "ui/group_adaptor_sort_asc"; public const string SIDEBAR_POSITION = APP_FSPOT + "ui/sidebar_size"; public const string ZOOM = APP_FSPOT + "ui/zoom"; public const string EXPORT_EMAIL_SIZE = APP_FSPOT + "export/email/size"; public const string EXPORT_EMAIL_ROTATE = APP_FSPOT + "export/email/auto_rotate"; public const string IMPORT_GUI_ROLL_HISTORY = APP_FSPOT + "import/gui_roll_history"; public const string SCREENSAVER_TAG = APP_FSPOT + "screensaver/tag_id"; public const string SCREENSAVER_DELAY = APP_FSPOT + "screensaver/delay"; public const string STORAGE_PATH = APP_FSPOT + "import/storage_path"; public const string METADATA_EMBED_IN_IMAGE = APP_FSPOT + "metadata/embed_in_image"; public const string METADATA_ALWAYS_USE_SIDECAR = APP_FSPOT + "metadata/always_use_sidecar"; public const string EDIT_REDEYE_THRESHOLD = APP_FSPOT + "edit/redeye_threshold"; public const string EDIT_CREATE_XCF_VERSION = APP_FSPOT + "edit/create_xcf"; public const string GNOME_MAILTO = "/desktop/gnome/url-handlers/mailto/"; public const string GNOME_MAILTO_COMMAND = GNOME_MAILTO + "command"; public const string GNOME_MAILTO_ENABLED = GNOME_MAILTO + "enabled"; public const string GSD_THUMBS_MAX_AGE = "/desktop/gnome/thumbnail_cache/maximum_age"; public const string GSD_THUMBS_MAX_SIZE = "/desktop/gnome/thumbnail_cache/maximum_size"; private static PreferenceBackend backend; private static EventHandler changed_handler; private static PreferenceBackend Backend { get { if (backend == null) { backend = new PreferenceBackend (); changed_handler = new EventHandler (OnSettingChanged); backend.AddNotify (APP_FSPOT, changed_handler); backend.AddNotify (GNOME_MAILTO, changed_handler); } return backend; } } private static Dictionary cache = new Dictionary(); static object GetDefault (string key) { switch (key) { case MAIN_WINDOW_X: case MAIN_WINDOW_Y: case MAIN_WINDOW_HEIGHT: case MAIN_WINDOW_WIDTH: case IMPORT_WINDOW_HEIGHT: case IMPORT_WINDOW_WIDTH: case IMPORT_WINDOW_PANE_POSITION: case FILMSTRIP_ORIENTATION: return 0; case METADATA_EMBED_IN_IMAGE: case METADATA_ALWAYS_USE_SIDECAR: case MAIN_WINDOW_MAXIMIZED: case GROUP_ADAPTOR_ORDER_ASC: case IMPORT_REMOVE_ORIGINALS: return false; case GLASS_POSITION: return null; case SHOW_TOOLBAR: case SHOW_SIDEBAR: case SHOW_TIMELINE: case SHOW_FILMSTRIP: case SHOW_TAGS: case SHOW_DATES: case SHOW_RATINGS: case VIEWER_SHOW_FILENAMES: return true; case TAG_ICON_SIZE: return (int) Tag.IconSize.Medium; case TAG_ICON_AUTOMATIC: return true; case SIDEBAR_POSITION: return 130; case ZOOM: return null; case IMPORT_GUI_ROLL_HISTORY: return 10; case SCREENSAVER_TAG: return 1; case SCREENSAVER_DELAY: return 4.0; case STORAGE_PATH: return System.IO.Path.Combine (Global.HomeDirectory, Catalog.GetString("Photos")); case EXPORT_EMAIL_SIZE: return 3; // medium size 640px case EXPORT_EMAIL_ROTATE: case VIEWER_INTERPOLATION: return true; case VIEWER_TRANSPARENCY: return "NONE"; case VIEWER_TRANS_COLOR: return "#000000"; case EDIT_REDEYE_THRESHOLD: return -15; case GTK_RC: case COLOR_MANAGEMENT_DISPLAY_PROFILE: case COLOR_MANAGEMENT_OUTPUT_PROFILE: return String.Empty; case IMPORT_CHECK_DUPLICATES: case IMPORT_COPY_FILES: case IMPORT_INCLUDE_SUBFOLDERS: return true; default: return null; } } //return true if the key exists in the backend public static bool TryGet (string key, out T value) { lock (cache) { value = default (T); object o; if (cache.TryGetValue (key, out o)) { value = (T)o; return true; } try { value = (T) Backend.Get (key); } catch { //catching NoSuchKeyException return false; } cache.Add (key, value); return true; } } public static T Get (string key) { T val; if (TryGet (key, out val)) return val; try { return (T) GetDefault (key); } catch { //catching InvalidCastException return default (T); } } public static void Set (string key, object value) { lock (cache) { try { cache [key] = value; Backend.Set (key, value); } catch (Exception e){ Log.Exception ("Unable to set this :"+key, e); } } } public static event EventHandler SettingChanged; static void OnSettingChanged (object sender, NotifyEventArgs args) { lock (cache) { if (cache.ContainsKey (args.Key)) { cache [args.Key] = args.Value; } } if (SettingChanged != null) SettingChanged (sender, args); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/SendEmail.cs0000644000175000017500000002401311503404761022202 0ustar00rubenruben00000000000000/* * FSpot.SendEmail * * Author(s) * Bengt Thuree * Stephane Delcroix * Paul Lange * * This is free software. See COPYING for details. */ using Gtk; using GLib; using System; using FSpot.Core; using FSpot.Widgets; using FSpot.Filters; using FSpot.UI.Dialog; using Hyena; using Hyena.Widgets; using Mono.Unix; namespace FSpot { public class SendEmail : BuilderDialog { Window parent_window; #pragma warning disable 0649 [GtkBeans.Builder.Object] private Gtk.ScrolledWindow tray_scrolled; [GtkBeans.Builder.Object] private Label NumberOfPictures, TotalOriginalSize, ApproxNewSize; [GtkBeans.Builder.Object] private RadioButton tiny_size, small_size, medium_size, large_size, x_large_size, original_size; #pragma warning restore 0649 long Orig_Photo_Size = 0; double scale_percentage = 0.3; // The different sizes we can shrink to foto to. See RadioButton above for labels. static int[] sizes = { 0, 320, 480, 640, 800, 1024 }; // Estimated size relative to original after shrinking down the photo. double[] avg_scale_ref = { 0, 0.0186, 0.0348, 0.0532, 0.0826, 0.1234 }; static int NoOfSizes = sizes.Length; double[] avg_scale = new double [NoOfSizes]; string tmp_mail_dir; // To temporary keep the resized images bool force_original = false; IBrowsableCollection selection; public SendEmail (IBrowsableCollection selection, Window parent_window) : base ("mail_dialog.ui", "mail_dialog") { this.selection = selection; this.parent_window = parent_window; foreach (var p in selection.Items) { if (FileFactory.NewForUri (p.DefaultVersion.Uri).QueryInfo ("standard::content-type", FileQueryInfoFlags.None, null).ContentType != "image/jpeg") force_original = true; } if (force_original) { original_size.Active = true; tiny_size.Sensitive = false; small_size.Sensitive = false; medium_size.Sensitive = false; large_size.Sensitive = false; x_large_size.Sensitive = false; } else switch (Preferences.Get (Preferences.EXPORT_EMAIL_SIZE)) { case 0 : original_size.Active = true; break; case 1 : tiny_size.Active = true; break; case 2 : small_size.Active = true; break; case 3 : medium_size.Active = true; break; case 4 : large_size.Active = true; break; case 5 : x_large_size.Active = true; break; default: break; } tray_scrolled.Add (new TrayView (selection)); Modal = false; // Calculate total original filesize foreach (var photo in selection.Items) { try { Orig_Photo_Size += FileFactory.NewForUri (photo.DefaultVersion.Uri).QueryInfo ("standard::size", FileQueryInfoFlags.None, null).Size; } catch { } } for (int k = 0; k < avg_scale_ref.Length; k++) avg_scale[k] = avg_scale_ref[k]; // Calculate approximate size shrinking, use first photo, and shrink to medium size as base. var scalephoto = selection [0]; if (scalephoto != null && !force_original) { // Get first photos file size long orig_size = FileFactory.NewForUri (scalephoto.DefaultVersion.Uri).QueryInfo ("standard::size", FileQueryInfoFlags.None, null).Size; FilterSet filters = new FilterSet (); filters.Add (new ResizeFilter ((uint)(sizes [3]))); long new_size; using (FilterRequest request = new FilterRequest (scalephoto.DefaultVersion.Uri)) { filters.Convert (request); new_size = FileFactory.NewForUri (request.Current).QueryInfo ("standard::size", FileQueryInfoFlags.None, null).Size; } if (orig_size > 0) { // Get the factor (scale) between original and resized medium size. scale_percentage = 1 - ( (float) (orig_size - new_size) / orig_size); // What is the relation between the estimated medium scale factor, and reality? double scale_scale = scale_percentage / avg_scale_ref[3]; //System.Console.WriteLine ("scale_percentage {0}, ref {1}, relative {2}", // scale_percentage, avg_scale_ref[3], scale_scale ); // Re-Calculate the proper relation per size for (int k = 0; k < avg_scale_ref.Length; k++) { avg_scale[k] = avg_scale_ref[k] * scale_scale; // System.Console.WriteLine ("avg_scale[{0}]={1} (was {2})", // k, avg_scale[k], avg_scale_ref[k] ); } } } NumberOfPictures.Text = selection.Count.ToString(); TotalOriginalSize.Text = GLib.Format.SizeForDisplay (Orig_Photo_Size); UpdateEstimatedSize(); ShowAll (); //LoadHistory (); Response += HandleResponse; } private int GetScaleSize() { // not only convert dialog size to pixel size, but also set preferences se we use same size next time int size_number = 0; // default to original size if (tiny_size.Active) size_number = 1; if (small_size.Active) size_number = 2; if (medium_size.Active) size_number = 3; if (large_size.Active) size_number = 4; if (x_large_size.Active) size_number = 5; if (!force_original) Preferences.Set (Preferences.EXPORT_EMAIL_SIZE, size_number); return sizes [ size_number ]; } private int GetScaleIndex () { int scale = GetScaleSize(); for (int k = 0; k < sizes.Length; k++) if (sizes[k] == scale) return k; return 0; } private void UpdateEstimatedSize() { int new_size_index; long new_approx_total_size; string approxresult; new_size_index = GetScaleIndex(); if (new_size_index == 0) new_approx_total_size = Orig_Photo_Size; else new_approx_total_size = System.Convert.ToInt64(Orig_Photo_Size * avg_scale [new_size_index]); approxresult = GLib.Format.SizeForDisplay (new_approx_total_size); ApproxNewSize.Text = approxresult; } public void on_size_toggled (object o, EventArgs args) { UpdateEstimatedSize(); } private void HandleResponse (object sender, Gtk.ResponseArgs args) { int size = 0; bool UserCancelled = false; // Lets remove the mail "create mail" dialog Destroy(); if (args.ResponseId != Gtk.ResponseType.Ok) { return; } ProgressDialog progress_dialog = null; progress_dialog = new ProgressDialog (Catalog.GetString ("Preparing email"), ProgressDialog.CancelButtonType.Stop, selection.Count, parent_window); size = GetScaleSize(); // Which size should we scale to. 0 --> Original // evaluate mailto command and define attachment args for cli System.Text.StringBuilder attach_arg = new System.Text.StringBuilder (); switch (Preferences.Get (Preferences.GNOME_MAILTO_COMMAND)) { case "thunderbird %s": case "mozilla-thunderbird %s": case "seamonkey -mail -compose %s": case "icedove %s": attach_arg.Append(","); break; case "kmail %s": attach_arg.Append(" --attach "); break; default://evolution falls into default, since it supports mailto uri correctly attach_arg.Append("&attach="); break; } // Create a tmp directory. tmp_mail_dir = System.IO.Path.GetTempFileName (); // Create a tmp file System.IO.File.Delete (tmp_mail_dir); // Delete above tmp file System.IO.Directory.CreateDirectory (tmp_mail_dir); // Create a directory with above tmp name System.Text.StringBuilder mail_attach = new System.Text.StringBuilder (); FilterSet filters = new FilterSet (); if (size != 0) filters.Add (new ResizeFilter ((uint) size)); filters.Add (new UniqueNameFilter (new SafeUri (tmp_mail_dir))); for (int i = 0; i < selection.Count; i++) { var photo = selection [i]; if ( (photo != null) && (!UserCancelled) ) { if (progress_dialog != null) UserCancelled = progress_dialog.Update (String.Format (Catalog.GetString ("Exporting picture \"{0}\""), photo.Name)); if (UserCancelled) break; try { // Prepare a tmp_mail file name FilterRequest request = new FilterRequest (photo.DefaultVersion.Uri); filters.Convert (request); request.Preserve(request.Current); mail_attach.Append(((i == 0 && attach_arg.ToString () == ",") ? "" : attach_arg.ToString()) + request.Current.ToString ()); } catch (Exception e) { Hyena.Log.ErrorFormat ("Error preparing {0}: {1}", selection[i].Name, e.Message); HigMessageDialog md = new HigMessageDialog (parent_window, DialogFlags.DestroyWithParent, MessageType.Error, ButtonsType.Close, Catalog.GetString("Error processing image"), String.Format(Catalog.GetString("An error occured while processing \"{0}\": {1}"), selection[i].Name, e.Message)); md.Run(); md.Destroy(); UserCancelled = true; } } } // foreach if (progress_dialog != null) progress_dialog.Destroy (); // No need to keep this window if (!UserCancelled) { // Send the mail :) string mail_subject = Catalog.GetString("My Photos"); switch (Preferences.Get (Preferences.GNOME_MAILTO_COMMAND)) { // openSuSE case "thunderbird %s": System.Diagnostics.Process.Start("thunderbird", " -compose \"subject=" + mail_subject + ",attachment='" + mail_attach + "'\""); break; case "icedove %s": System.Diagnostics.Process.Start("icedove", " -compose \"subject=" + mail_subject + ",attachment='" + mail_attach + "'\""); break; case "mozilla-thunderbird %s": System.Diagnostics.Process.Start("mozilla-thunderbird", " -compose \"subject=" + mail_subject + ",attachment='" + mail_attach + "'\""); break; case "seamonkey -mail -compose %s": System.Diagnostics.Process.Start("seamonkey", " -mail -compose \"subject=" + mail_subject + ",attachment='" + mail_attach + "'\""); break; case "kmail %s": System.Diagnostics.Process.Start("kmail", " --composer --subject \"" + mail_subject + "\"" + mail_attach); break; case "evolution %s": //evo doesn't urldecode the subject GtkBeans.Global.ShowUri (Screen, "mailto:?subject=" + mail_subject + mail_attach); break; default: GtkBeans.Global.ShowUri (Screen, "mailto:?subject=" + System.Web.HttpUtility.UrlEncode(mail_subject) + mail_attach); break; } } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/TimeAdaptor.cs0000644000175000017500000001140411503404761022552 0ustar00rubenruben00000000000000/* * FSpot.TimeAdaptor.cs * * Author(s): * Larry Ewing * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using System.Threading; using System.Collections.Generic; using FSpot.Core; using FSpot.Query; using Hyena; namespace FSpot { public class TimeAdaptor : GroupAdaptor, FSpot.ILimitable { Dictionary years = new Dictionary (); public override event GlassSetHandler GlassSet; public override void SetGlass (int min) { DateTime date = DateFromIndex (min); if (GlassSet != null) GlassSet (this, query.LookupItem (date)); } public void SetLimits (int min, int max) { DateTime start = DateFromIndex (min); DateTime end = DateFromIndex(max); if (order_ascending) end = end.AddMonths (1); else end = end.AddMonths(-1); SetLimits (start, end); } public void SetLimits (DateTime start, DateTime end) { query.Range = (start > end) ? new DateRange (end, start) : new DateRange (start, end); } public override int Count () { return years.Count * 12; } public override string GlassLabel (int item) { return String.Format ("{0} ({1})", DateFromIndex (item).ToString ("MMMM yyyy"), Value (item)); } public override string TickLabel (int item) { DateTime start = DateFromIndex (item); if ((start.Month == 12 && !order_ascending) || (start.Month == 1 && order_ascending)) return start.Year.ToString (); else return null; } public override int Value (int item) { if (order_ascending) return years [startyear + item/12][item % 12]; else return years [endyear - item/12][11 - item % 12]; } public DateTime DateFromIndex (int item) { item = Math.Max (item, 0); item = Math.Min (years.Count * 12 - 1, item); if (order_ascending) return DateFromIndexAscending (item); return DateFromIndexDescending (item); } private DateTime DateFromIndexAscending (int item) { int year = startyear + item/12; int month = 1 + (item % 12); return new DateTime(year, month, 1); } private DateTime DateFromIndexDescending (int item) { int year = endyear - item/12; int month = 12 - (item % 12); year = Math.Max(1, year); year = Math.Min(year, 9999); month = Math.Max(1, month); month = Math.Min(month, 12); int daysInMonth = DateTime.DaysInMonth(year, month); return new DateTime (year, month, daysInMonth).AddDays (1.0).AddMilliseconds (-.1); } public override int IndexFromPhoto (IPhoto photo) { if (order_ascending) return IndexFromDateAscending (photo.Time); return IndexFromDateDescending (photo.Time); } public int IndexFromDate (DateTime date) { if (order_ascending) return IndexFromDateAscending(date); return IndexFromDateDescending(date); } private int IndexFromDateAscending(DateTime date) { int year = date.Year; int min_year = startyear; int max_year = endyear; if (year < min_year || year > max_year) { Log.DebugFormat ("TimeAdaptor.IndexFromDate year out of range[{1},{2}]: {0}", year, min_year, max_year); return 0; } return (year - startyear) * 12 + date.Month - 1 ; } private int IndexFromDateDescending(DateTime date) { int year = date.Year; int min_year = startyear; int max_year = endyear; if (year < min_year || year > max_year) { Log.DebugFormat ("TimeAdaptor.IndexFromPhoto year out of range[{1},{2}]: {0}", year, min_year, max_year); return 0; } return 12 * (endyear - year) + 12 - date.Month; } public override IPhoto PhotoFromIndex (int item) { DateTime start = DateFromIndex (item); return query [query.LookupItem (start)]; } public override event ChangedHandler Changed; uint timer; protected override void Reload () { timer = Log.DebugTimerStart (); Thread reload = new Thread (new ThreadStart (DoReload)); reload.IsBackground = true; reload.Priority = ThreadPriority.Lowest; reload.Start (); } int startyear = Int32.MaxValue, endyear = Int32.MinValue; void DoReload () { Thread.Sleep (200); Dictionary years_tmp = query.Store.PhotosPerMonth (); int startyear_tmp = Int32.MaxValue; int endyear_tmp = Int32.MinValue; foreach (int year in years_tmp.Keys) { startyear_tmp = Math.Min (year, startyear_tmp); endyear_tmp = Math.Max (year, endyear_tmp); } ThreadAssist.ProxyToMain (() => { years = years_tmp; startyear = startyear_tmp; endyear = endyear_tmp; if (Changed != null) Changed (this); }); Log.DebugTimerPrint (timer, "TimeAdaptor REAL Reload took {0}"); } public TimeAdaptor (PhotoQuery query, bool order_ascending) : base (query, order_ascending) { } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/Term.cs0000644000175000017500000005111611503404761021254 0ustar00rubenruben00000000000000/* * Term.cs * * This is free software. See COPYING for details. */ using System; using System.Collections; using System.Collections.Generic; using System.Text; using Mono.Unix; using Gtk; using Gdk; using Hyena; using FSpot.Core; namespace FSpot { public abstract class Term { private ArrayList sub_terms = new ArrayList (); private Term parent = null; protected bool is_negated = false; protected Tag tag = null; public Term (Term parent, Literal after) { this.parent = parent; if (parent != null) { if (after == null) parent.Add (this); else parent.SubTerms.Insert (parent.SubTerms.IndexOf (after) + 1, this); } } /** Properties **/ public bool HasMultiple { get { return (SubTerms.Count > 1); } } public ArrayList SubTerms { get { return sub_terms; } } public Term Last { get { // Return the last Literal in this term if (SubTerms.Count > 0) return SubTerms[SubTerms.Count - 1] as Term; else return null; } } public int Count { get { return SubTerms.Count; } } public Term Parent { get { return parent; } set { if (parent == value) return; // If our parent was already set, remove ourself from it if (parent != null) parent.Remove(this); // Add ourself to our new parent parent = value; parent.Add(this); } } public virtual bool IsNegated { get { return is_negated; } set { if (is_negated != value) Invert(false); is_negated = value; } } /** Methods **/ public void Add (Term term) { SubTerms.Add (term); } public void Remove (Term term) { SubTerms.Remove (term); // Remove ourselves if we're now empty if (SubTerms.Count == 0) if (Parent != null) Parent.Remove (this); } public void CopyAndInvertSubTermsFrom (Term term, bool recurse) { is_negated = true; ArrayList termsToMove = new ArrayList(term.SubTerms); foreach (Term subterm in termsToMove) { if (recurse) subterm.Invert(true).Parent = this; else subterm.Parent = this; } } public ArrayList FindByTag (Tag t) { return FindByTag (t, true); } public ArrayList FindByTag (Tag t, bool recursive) { ArrayList results = new ArrayList (); if (tag != null && tag == t) results.Add (this); if (recursive) foreach (Term term in SubTerms) results.AddRange (term.FindByTag (t, true)); else foreach (Term term in SubTerms) { foreach (Term literal in SubTerms) { if (literal.tag != null && literal.tag == t) { results.Add (literal); } } if (term.tag != null && term.tag == t) { results.Add (term); } } return results; } public ArrayList LiteralParents () { ArrayList results = new ArrayList (); bool meme = false; foreach (Term term in SubTerms) { if (term is Literal) meme = true; results.AddRange (term.LiteralParents ()); } if (meme) results.Add (this); return results; } public bool TagIncluded(Tag t) { ArrayList parents = LiteralParents (); if (parents.Count == 0) return false; foreach (Term term in parents) { bool termHasTag = false; bool onlyTerm = true; foreach (Term literal in term.SubTerms) { if (literal.tag != null) { if (literal.tag == t) { termHasTag = true; } else { onlyTerm = false; } } } if (termHasTag && onlyTerm) return true; } return false; } public bool TagRequired(Tag t) { int count, grouped_with; return TagRequired(t, out count, out grouped_with); } public bool TagRequired(Tag t, out int num_terms, out int grouped_with) { ArrayList parents = LiteralParents (); num_terms = 0; grouped_with = 100; int min_grouped_with = 100; if (parents.Count == 0) return false; foreach (Term term in parents) { bool termHasTag = false; // Don't count it as required if it's the only subterm..though it is.. // it is more clearly identified as Included at that point. if (term.Count > 1) { foreach (Term literal in term.SubTerms) { if (literal.tag != null) { if (literal.tag == t) { num_terms++; termHasTag = true; grouped_with = term.SubTerms.Count; break; } } } } if (grouped_with < min_grouped_with) min_grouped_with = grouped_with; if (!termHasTag) return false; } grouped_with = min_grouped_with; return true; } public abstract Term Invert(bool recurse); // Recursively generate the SQL condition clause that this // term represents. public virtual string SqlCondition () { StringBuilder condition = new StringBuilder ("("); for (int i = 0; i < SubTerms.Count; i++) { Term term = SubTerms[i] as Term; condition.Append (term.SqlCondition ()); if (i != SubTerms.Count - 1) condition.Append (SQLOperator ()); } condition.Append(")"); return condition.ToString (); } public virtual Gtk.Widget SeparatorWidget () { return null; } public virtual string SQLOperator () { return String.Empty; } protected static Hashtable op_term_lookup = new Hashtable(); public static Term TermFromOperator (string op, Term parent, Literal after) { //Console.WriteLine ("finding type for operator {0}", op); //op = op.Trim (); op = op.ToLower (); if (AndTerm.Operators.Contains (op)) { //Console.WriteLine ("AND!"); return new AndTerm (parent, after); } else if (OrTerm.Operators.Contains (op)) { //Console.WriteLine ("OR!"); return new OrTerm (parent, after); } Log.DebugFormat ("Do not have Term for operator {0}", op); return null; } } public class AndTerm : Term { static ArrayList operators = new ArrayList (); static AndTerm () { operators.Add (Catalog.GetString (" and ")); //operators.Add (Catalog.GetString (" && ")); operators.Add (Catalog.GetString (", ")); } public static ArrayList Operators { get { return operators; } } public AndTerm (Term parent, Literal after) : base (parent, after) {} public override Term Invert (bool recurse) { OrTerm newme = new OrTerm(Parent, null); newme.CopyAndInvertSubTermsFrom(this, recurse); if (Parent != null) Parent.Remove(this); return newme; } public override Widget SeparatorWidget () { Widget sep = new Label (String.Empty); sep.SetSizeRequest (3, 1); sep.Show (); return sep; //return null; } public override string SqlCondition () { StringBuilder condition = new StringBuilder ("("); condition.Append (base.SqlCondition()); Tag hidden = App.Instance.Database.Tags.Hidden; if (hidden != null) { if (FindByTag (hidden, true).Count == 0) { condition.Append (String.Format ( " AND id NOT IN (SELECT photo_id FROM photo_tags WHERE tag_id = {0})", hidden.Id )); } } condition.Append (")"); return condition.ToString (); } public override string SQLOperator () { return " AND "; } } public class OrTerm : Term { static ArrayList operators = new ArrayList (); static OrTerm () { operators.Add (Catalog.GetString (" or ")); //operators.Add (Catalog.GetString (" || ")); } public static OrTerm FromTags(Tag [] from_tags) { if (from_tags == null || from_tags.Length == 0) return null; OrTerm or = new OrTerm(null, null); foreach (Tag t in from_tags) { Literal l = new Literal(t); l.Parent = or; } return or; } public static ArrayList Operators { get { return operators; } } public OrTerm (Term parent, Literal after) : base (parent, after) {} private static string OR = Catalog.GetString ("or"); public override Term Invert (bool recurse) { AndTerm newme = new AndTerm(Parent, null); newme.CopyAndInvertSubTermsFrom(this, recurse); if (Parent != null) Parent.Remove(this); return newme; } public override Gtk.Widget SeparatorWidget () { Widget label = new Label (" " + OR + " "); label.Show (); return label; } public override string SQLOperator () { return " OR "; } } public abstract class AbstractLiteral : Term { public AbstractLiteral(Term parent, Literal after) : base (parent, after) {} public override Term Invert (bool recurse) { is_negated = !is_negated; return this; } } // TODO rename to TagLiteral? public class Literal : AbstractLiteral { public Literal (Tag tag) : this (null, tag, null) { } public Literal (Term parent, Tag tag, Literal after) : base (parent, after) { this.tag = tag; } /** Properties **/ public static ArrayList FocusedLiterals { get { return focusedLiterals; } set { focusedLiterals = value; } } public Tag Tag { get { return tag; } } public override bool IsNegated { get { return is_negated; } set { if (is_negated == value) return; is_negated = value; NormalIcon = null; NegatedIcon = null; Update (); if (NegatedToggled != null) NegatedToggled (this); } } private Pixbuf NegatedIcon { get { if (negated_icon != null) return negated_icon; if (NormalIcon == null) return null; negated_icon = NormalIcon.Copy (); int offset = ICON_SIZE - overlay_size; NegatedOverlay.Composite (negated_icon, offset, 0, overlay_size, overlay_size, offset, 0, 1.0, 1.0, InterpType.Bilinear, 200); return negated_icon; } set { negated_icon = null; } } public Widget Widget { get { if (widget != null) return widget; container = new EventBox (); box = new HBox (); handle_box = new LiteralBox (); handle_box.BorderWidth = 1; label = new Label (System.Web.HttpUtility.HtmlEncode (tag.Name)); label.UseMarkup = true; image = new Gtk.Image (NormalIcon); container.CanFocus = true; container.KeyPressEvent += KeyHandler; container.ButtonPressEvent += HandleButtonPress; container.ButtonReleaseEvent += HandleButtonRelease; container.EnterNotifyEvent += HandleMouseIn; container.LeaveNotifyEvent += HandleMouseOut; //new PopupManager (new LiteralPopup (container, this)); // Setup this widget as a drag source (so tags can be moved after being placed) container.DragDataGet += HandleDragDataGet; container.DragBegin += HandleDragBegin; container.DragEnd += HandleDragEnd; Gtk.Drag.SourceSet (container, Gdk.ModifierType.Button1Mask | Gdk.ModifierType.Button3Mask, tag_target_table, DragAction.Copy | DragAction.Move); // Setup this widget as a drag destination (so tags can be added to our parent's Term) container.DragDataReceived += HandleDragDataReceived; container.DragMotion += HandleDragMotion; container.DragLeave += HandleDragLeave; Gtk.Drag.DestSet (container, DestDefaults.All, tag_dest_target_table, DragAction.Copy | DragAction.Move ); container.TooltipText = tag.Name; label.Show (); image.Show (); if (tag.Icon == null) { handle_box.Add (label); } else { handle_box.Add (image); } handle_box.Show (); box.Add (handle_box); box.Show (); container.Add (box); widget = container; return widget; } } private Pixbuf NormalIcon { get { if (normal_icon != null) return normal_icon; Pixbuf scaled = null; scaled = tag.Icon; for (Category category = tag.Category; category != null && scaled == null; category = category.Category) scaled = category.Icon; if (scaled == null) return null; if (scaled.Width != ICON_SIZE) { scaled = scaled.ScaleSimple (ICON_SIZE, ICON_SIZE, InterpType.Bilinear); } normal_icon = scaled; return normal_icon; } set { normal_icon = null; } } /** Methods **/ public void Update () { // Clear out the old icons normal_icon = null; negated_icon = null; if (IsNegated) { widget.TooltipText = String.Format (Catalog.GetString ("Not {0}"), tag.Name); label.Text = "" + System.Web.HttpUtility.HtmlEncode (tag.Name) + ""; image.Pixbuf = NegatedIcon; } else { widget.TooltipText = tag.Name; label.Text = System.Web.HttpUtility.HtmlEncode (tag.Name); image.Pixbuf = NormalIcon; } label.UseMarkup = true; // Show the icon unless it's null if (tag.Icon == null && container.Children [0] == image) { container.Remove (image); container.Add (label); } else if (tag.Icon != null && container.Children [0] == label) { container.Remove (label); container.Add (image); } if (isHoveredOver && image.Pixbuf != null ) { // Brighten the image slightly Pixbuf brightened = image.Pixbuf.Copy (); image.Pixbuf.SaturateAndPixelate (brightened, 1.85f, false); //Pixbuf brightened = PixbufUtils.Glow (image.Pixbuf, .6f); image.Pixbuf = brightened; } } public void RemoveSelf () { if (Removing != null) Removing (this); if (Parent != null) Parent.Remove (this); if (Removed != null) Removed (this); } public override string SqlCondition () { StringBuilder ids = new StringBuilder (tag.Id.ToString ()); if (tag is Category) { List tags = new List (); (tag as Category).AddDescendentsTo (tags); for (int i = 0; i < tags.Count; i++) ids.Append (", " + (tags [i] as Tag).Id.ToString ()); } return String.Format ( "id {0}IN (SELECT photo_id FROM photo_tags WHERE tag_id IN ({1}))", (IsNegated ? "NOT " : String.Empty), ids.ToString ()); } public override Gtk.Widget SeparatorWidget () { return new Label ("ERR"); } private static Pixbuf NegatedOverlay { get { if (negated_overlay == null) { System.Reflection.Assembly assembly = System.Reflection.Assembly.GetCallingAssembly (); negated_overlay = new Pixbuf (assembly.GetManifestResourceStream ("f-spot-not.png")); negated_overlay = negated_overlay.ScaleSimple (overlay_size, overlay_size, InterpType.Bilinear); } return negated_overlay; } } public static void RemoveFocusedLiterals () { if (focusedLiterals != null) foreach (Literal literal in focusedLiterals) literal.RemoveSelf (); } /** Handlers **/ private void KeyHandler (object o, KeyPressEventArgs args) { args.RetVal = false; switch (args.Event.Key) { case Gdk.Key.Delete: RemoveFocusedLiterals (); args.RetVal = true; return; } } private void HandleButtonPress (object o, ButtonPressEventArgs args) { args.RetVal = true; switch (args.Event.Type) { case EventType.TwoButtonPress: if (args.Event.Button == 1) IsNegated = !IsNegated; else args.RetVal = false; return; case EventType.ButtonPress: Widget.GrabFocus (); if (args.Event.Button == 1) { // TODO allow multiple selection of literals so they can be deleted, modified all at once //if ((args.Event.State & ModifierType.ControlMask) != 0) { //} } else if (args.Event.Button == 3) { LiteralPopup popup = new LiteralPopup (); popup.Activate (args.Event, this); } return; default: args.RetVal = false; return; } } private void HandleButtonRelease (object o, ButtonReleaseEventArgs args) { args.RetVal = true; switch (args.Event.Type) { case EventType.TwoButtonPress: args.RetVal = false; return; case EventType.ButtonPress: if (args.Event.Button == 1) { } return; default: args.RetVal = false; return; } } private void HandleMouseIn (object o, EnterNotifyEventArgs args) { isHoveredOver = true; Update (); } private void HandleMouseOut (object o, LeaveNotifyEventArgs args) { isHoveredOver = false; Update (); } void HandleDragDataGet (object sender, DragDataGetArgs args) { args.RetVal = true; if (args.Info == DragDropTargets.TagListEntry.Info || args.Info == DragDropTargets.TagQueryEntry.Info) { // FIXME: do really write data Byte [] data = Encoding.UTF8.GetBytes (String.Empty); Atom [] targets = args.Context.Targets; args.SelectionData.Set (targets[0], 8, data, data.Length); return; } // Drop cancelled args.RetVal = false; foreach (Widget w in hiddenWidgets) w.Visible = true; focusedLiterals = null; } void HandleDragBegin (object sender, DragBeginArgs args) { Gtk.Drag.SetIconPixbuf (args.Context, image.Pixbuf, 0, 0); focusedLiterals.Add (this); // Hide the tag and any separators that only exist because of it container.Visible = false; hiddenWidgets.Add (container); foreach (Widget w in LogicWidget.Box.HangersOn (this)) { hiddenWidgets.Add (w); w.Visible = false; } } void HandleDragEnd (object sender, DragEndArgs args) { // Remove any literals still marked as focused, because // the user is throwing them away. RemoveFocusedLiterals (); focusedLiterals = new ArrayList(); args.RetVal = true; } private void HandleDragDataReceived (object o, DragDataReceivedArgs args) { args.RetVal = true; if (args.Info == DragDropTargets.TagListEntry.Info) { if (TagsAdded != null) TagsAdded (args.SelectionData.GetTagsData (), Parent, this); return; } if (args.Info == DragDropTargets.TagQueryEntry.Info) { if (! focusedLiterals.Contains(this)) if (LiteralsMoved != null) LiteralsMoved (focusedLiterals, Parent, this); // Unmark the literals as focused so they don't get nixed focusedLiterals = null; } } private bool preview = false; private Gtk.Widget preview_widget; private void HandleDragMotion (object o, DragMotionArgs args) { if (!preview) { if (preview_widget == null) { preview_widget = new Gtk.Label (" | "); box.Add (preview_widget); } preview_widget.Show (); } } private void HandleDragLeave (object o, EventArgs args) { preview = false; preview_widget.Hide (); } public void HandleToggleNegatedCommand (object o, EventArgs args) { IsNegated = !IsNegated; } public void HandleRemoveCommand (object o, EventArgs args) { RemoveSelf (); } public void HandleAttachTagCommand (Tag t) { if (AttachTag != null) AttachTag (t, Parent, this); } public void HandleRequireTag (object sender, EventArgs args) { if (RequireTag != null) RequireTag (new Tag [] {this.Tag}); } public void HandleUnRequireTag (object sender, EventArgs args) { if (UnRequireTag != null) UnRequireTag (new Tag [] {this.Tag}); } private const int ICON_SIZE = 24; private const int overlay_size = (int) (.40 * ICON_SIZE); private static TargetEntry [] tag_target_table = new TargetEntry [] { DragDropTargets.TagQueryEntry }; private static TargetEntry [] tag_dest_target_table = new TargetEntry [] { DragDropTargets.TagListEntry, DragDropTargets.TagQueryEntry }; private static ArrayList focusedLiterals = new ArrayList(); private static ArrayList hiddenWidgets = new ArrayList(); private Gtk.Container container; private LiteralBox handle_box; private Gtk.Box box; private Gtk.Image image; private Gtk.Label label; private Pixbuf normal_icon; //private EventBox widget; private Widget widget; private Pixbuf negated_icon; private static Pixbuf negated_overlay; private bool isHoveredOver = false; public delegate void NegatedToggleHandler (Literal group); public event NegatedToggleHandler NegatedToggled; public delegate void RemovingHandler (Literal group); public event RemovingHandler Removing; public delegate void RemovedHandler (Literal group); public event RemovedHandler Removed; public delegate void TagsAddedHandler (Tag[] tags, Term parent, Literal after); public event TagsAddedHandler TagsAdded; public delegate void AttachTagHandler (Tag tag, Term parent, Literal after); public event AttachTagHandler AttachTag; public delegate void TagRequiredHandler (Tag [] tags); public event TagRequiredHandler RequireTag; public delegate void TagUnRequiredHandler (Tag [] tags); public event TagUnRequiredHandler UnRequireTag; public delegate void LiteralsMovedHandler (ArrayList literals, Term parent, Literal after); public event LiteralsMovedHandler LiteralsMoved; } public class TextLiteral : AbstractLiteral { private string text; public TextLiteral (Term parent, string text) : base (parent, null) { this.text = text; } public override string SqlCondition () { return String.Format ( "id {0}IN (SELECT id FROM photos WHERE base_uri LIKE '%{1}%' OR filename LIKE '%{1}%' OR description LIKE '%{1}%')", (IsNegated ? "NOT " : ""), EscapeQuotes(text) ); } protected static string EscapeQuotes (string v) { return v == null ? String.Empty : v.Replace("'", "''"); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/PhotoVersion.cs0000644000175000017500000000245611503404761023007 0ustar00rubenruben00000000000000/* * PhotoStore.cs * * Author(s): * Ettore Perazzoli * Larry Ewing * Stephane Delcroix * Thomas Van Machelen * * This is free software. See COPYING for details. */ using Hyena; using FSpot.Core; namespace FSpot { public class PhotoVersion : IPhotoVersion { public string Name { get; set; } public IPhoto Photo { get; private set; } public SafeUri BaseUri { get; set; } public string Filename { get; set; } public SafeUri Uri { get { return BaseUri.Append (Filename); } set { BaseUri = value.GetBaseUri (); Filename = value.GetFilename (); } } public string ImportMD5 { get; set; } public uint VersionId { get; private set; } public bool IsProtected { get; private set; } public PhotoVersion (IPhoto photo, uint version_id, SafeUri base_uri, string filename, string md5_sum, string name, bool is_protected) { Photo = photo; VersionId = version_id; BaseUri = base_uri; Filename = filename; ImportMD5 = md5_sum; Name = name; IsProtected = is_protected; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/BitConverter.cs0000644000175000017500000000530011503404761022745 0ustar00rubenruben00000000000000using System; using System.Runtime.InteropServices; namespace FSpot { //[Obsolete ("use Mono.DataConvert instead")] public class BitConverter { public static uint Swap (uint val, bool little) { return (little != System.BitConverter.IsLittleEndian) ? ((uint) ((((uint) (val) & (uint) 0x000000ffU) << 24) | (((uint) (val) & (uint) 0x0000ff00U) << 8) | (((uint) (val) & (uint) 0x00ff0000U) >> 8) | (((uint) (val) & (uint) 0xff000000U) >> 24))) : val; } public static ushort Swap (ushort val, bool little) { return (little != System.BitConverter.IsLittleEndian) ? ((ushort) ((ushort)(val >> 8) | (ushort)(val << 8))) : val; } public static ushort Swap (ushort val) { return ((ushort) ((ushort)(val >> 8) | (ushort)(val << 8))); } public static ulong Swap (ulong val, bool little) { return (little != System.BitConverter.IsLittleEndian) ? ((ulong) ((((ulong) (val) & (ulong) 0x00000000000000ffU) << 56) | (((ulong) (val) & (ulong) 0x000000000000ff00U) << 40) | (((ulong) (val) & (ulong) 0x0000000000ff0000U) << 24) | (((ulong) (val) & (ulong) 0x00000000ff000000U) << 8) | (((ulong) (val) & (ulong) 0x000000ff00000000U) >> 8) | (((ulong) (val) & (ulong) 0x0000ff0000000000U) >> 24) | (((ulong) (val) & (ulong) 0x00ff000000000000U) >> 40) | (((ulong) (val) & (ulong) 0xff00000000000000U) >> 56))) : val; } public static byte [] GetBytes (uint val, bool little) { val = Swap (val, little); return System.BitConverter.GetBytes (val); } public static byte [] GetBytes (ushort val, bool little) { val = Swap (val, little); return System.BitConverter.GetBytes (val); } public static byte [] GetBytes (ulong val, bool little) { val = Swap (val, little); return System.BitConverter.GetBytes (val); } public static ushort ToUInt16 (byte [] data, int position, bool little) { ushort val = System.BitConverter.ToUInt16 (data, position); return Swap (val, little); } public static uint ToUInt32 (byte [] data, int position, bool little) { uint val = System.BitConverter.ToUInt32 (data, position); return Swap (val, little); } public static float ToSingle (byte [] data, int position, bool little) { float retval; unsafe { uint * ptr; ptr = (uint *)&retval; *ptr = ToUInt32 (data, position, little); } return retval; } public static int ToInt32 (byte [] data, int position, bool little) { return unchecked ((int) ToUInt32 (data, position, little)); } public static ulong ToUInt64 (byte [] data, int position, bool little) { ulong val = System.BitConverter.ToUInt64(data, position); return Swap (val, little); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/PhotoLoader.cs0000644000175000017500000000161211503404761022561 0ustar00rubenruben00000000000000using System; using FSpot.Core; using FSpot.Platform; using FSpot.Imaging; using Hyena; namespace FSpot { [Obsolete ("nuke or rename this")] public class PhotoLoader { public PhotoQuery query; public Gdk.Pixbuf Load (int index) { return Load (query, index); } static public Gdk.Pixbuf Load (IBrowsableCollection collection, int index) { IPhoto item = collection [index]; return Load (item); } static public Gdk.Pixbuf Load (IPhoto item) { using (var img = ImageFile.Create (item.DefaultVersion.Uri)) { Gdk.Pixbuf pixbuf = img.Load (); return pixbuf; } } static public Gdk.Pixbuf LoadAtMaxSize (IPhoto item, int width, int height) { using (var img = ImageFile.Create (item.DefaultVersion.Uri)) { Gdk.Pixbuf pixbuf = img.Load (width, height); return pixbuf; } } public PhotoLoader (PhotoQuery query) { this.query = query; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/PhotoQuery.cs0000644000175000017500000002201411503404761022457 0ustar00rubenruben00000000000000/* * FSpot.PhotoQuery.cs * * Author(s): * Larry Ewing * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using System.Collections; using System.Collections.Generic; using FSpot.Core; using FSpot.Query; using Hyena; namespace FSpot { public class PhotoQuery : IBrowsableCollection { class PhotoCache { static int SIZE = 100; public int Size { get { return SIZE; } } Dictionary cache; string temp_table; PhotoStore store; public PhotoCache (PhotoStore store, string temp_table) { this.temp_table = temp_table; this.store = store; cache = new Dictionary (); } public bool TryGetPhoto (int index, out Photo photo) { photo = null; Photo [] val; int offset = index - index % SIZE; if (!cache.TryGetValue (offset, out val)) return false; photo = val [index - offset]; return true; } public Photo Get (int index) { Photo [] val; int offset = index - index % SIZE; if (!cache.TryGetValue (offset, out val)) { val = store.QueryFromTemp (temp_table, offset, SIZE); cache [offset] = val; } return val [index - offset]; } } PhotoCache cache; private PhotoStore store; private Term terms; static int query_count = 0; static int QueryCount { get {return query_count ++;} } Dictionary reverse_lookup; int count = -1; string temp_table = String.Format ("photoquery_temp_{0}", QueryCount); // Constructor public PhotoQuery (PhotoStore store, params IQueryCondition [] conditions) { this.store = store; this.store.ItemsChanged += MarkChanged; cache = new PhotoCache (store, temp_table); reverse_lookup = new Dictionary (); SetCondition (OrderByTime.OrderByTimeDesc); foreach (IQueryCondition condition in conditions) SetCondition (condition); RequestReload (); } public int Count { get { if (count < 0) count = store.Count (temp_table); return count; } } public bool Contains (IPhoto item) { return IndexOf (item) >= 0; } // IPhotoCollection Interface public event IBrowsableCollectionChangedHandler Changed; public event IBrowsableCollectionItemsChangedHandler ItemsChanged; public IPhoto this [int index] { get { return cache.Get (index); } } [Obsolete ("DO NOT USE THIS, IT'S TOO SLOW")] public Photo [] Photos { get { return store.QueryFromTemp (temp_table); } } [Obsolete ("DO NOT USE Items on PhotoQuery")] public IPhoto [] Items { get { throw new NotImplementedException (); } } public PhotoStore Store { get { return store; } } //Query Conditions private Dictionary conditions; private Dictionary Conditions { get { if (conditions == null) conditions = new Dictionary (); return conditions; } } internal bool SetCondition (IQueryCondition condition) { if (condition == null) throw new ArgumentNullException ("condition"); if (Conditions.ContainsKey (condition.GetType ()) && Conditions [condition.GetType ()] == condition) return false; Conditions [condition.GetType ()] = condition; return true; } internal T GetCondition () where T : IQueryCondition { IQueryCondition val; Conditions.TryGetValue (typeof (T), out val); return (T)val; } internal bool UnSetCondition () { if (!Conditions.ContainsKey (typeof(T))) return false; Conditions.Remove (typeof(T)); return true; } public Term Terms { get { return terms; } set { terms = value; untagged = false; RequestReload (); } } public DateRange Range { get { return GetCondition (); } set { if (value == null && UnSetCondition () || value != null && SetCondition (value)) RequestReload (); } } private bool untagged = false; public bool Untagged { get { return untagged; } set { if (untagged != value) { untagged = value; if (untagged) { UnSetCondition (); UnSetCondition (); } RequestReload (); } } } public RollSet RollSet { get { return GetCondition (); } set { if (value == null && UnSetCondition () || value != null && SetCondition (value)) RequestReload (); } } public RatingRange RatingRange { get { return GetCondition (); } set { if (value == null && UnSetCondition() || value != null && SetCondition (value)) RequestReload (); } } public HiddenTag HiddenTag { get { return GetCondition (); } set { if (value == null && UnSetCondition() || value != null && SetCondition (value)) RequestReload (); } } public ConditionWrapper TagTerm { get { return GetCondition (); } set { if (value == null && UnSetCondition() || value != null && SetCondition (value)) { if (value != null) { untagged = false; SetCondition (HiddenTag.ShowHiddenTag); } else { UnSetCondition (); } RequestReload (); } } } public OrderByTime OrderByTime { get { return GetCondition (); } set { if (value != null && SetCondition (value)) RequestReload (); } } public bool TimeOrderAsc { get { return OrderByTime.Asc; } set { if (value != OrderByTime.Asc) OrderByTime = new OrderByTime (value); } } public void RequestReload () { uint timer = Log.DebugTimerStart (); IQueryCondition[] condition_array; int i = 0; if (untagged) { condition_array = new IQueryCondition[conditions.Count + 1]; condition_array[0] = new UntaggedCondition (); i = 1; } else { condition_array = new IQueryCondition[conditions.Count + 2]; // condition_array[0] = new ConditionWrapper (extra_condition); condition_array[1] = new ConditionWrapper (terms != null ? terms.SqlCondition () : null); i = 2; } foreach (IQueryCondition condition in Conditions.Values) { condition_array[i] = condition; i++; } store.QueryToTemp (temp_table, condition_array); count = -1; cache = new PhotoCache (store, temp_table); reverse_lookup = new Dictionary (); if (Changed != null) Changed (this); Log.DebugTimerPrint (timer, "Reloading the query took {0}"); } public int IndexOf (IPhoto photo) { if (photo == null || !(photo is Photo)) return -1; return store.IndexOf (temp_table, photo as Photo); } private int [] IndicesOf (DbItem [] dbitems) { uint timer = Log.DebugTimerStart (); List indices = new List (); List items_to_search = new List (); int cur; foreach (DbItem dbitem in dbitems) { if (reverse_lookup.TryGetValue (dbitem.Id, out cur)) indices.Add (cur); else items_to_search.Add (dbitem.Id); } if (items_to_search.Count > 0) indices.AddRange (store.IndicesOf (temp_table, items_to_search.ToArray ())); Log.DebugTimerPrint (timer, "IndicesOf took {0}"); return indices.ToArray (); } public int LookupItem (System.DateTime date) { return LookupItem (date, TimeOrderAsc); } private int LookupItem (System.DateTime date, bool asc) { if (Count == 0) return -1; uint timer = Log.DebugTimerStart (); int low = 0; int high = Count - 1; int mid = (low + high) / 2; Photo current; while (low <= high) { mid = (low + high) / 2; if (!cache.TryGetPhoto (mid, out current)) //the item we're looking for is not in the cache //a binary search could take up to ln2 (N/cache.SIZE) request //lets reduce that number to 1 return store.IndexOf (temp_table, date, asc); int comp = this [mid].Time.CompareTo (date); if (!asc && comp < 0 || asc && comp > 0) high = mid - 1; else if (!asc && comp > 0 || asc && comp < 0) low = mid + 1; else return mid; } Log.DebugTimerPrint (timer, "LookupItem took {0}"); if (asc) return this[mid].Time < date ? mid + 1 : mid; return this[mid].Time > date ? mid + 1 : mid; } public void Commit (int index) { Commit (new int [] {index}); } public void Commit (int [] indexes) { List to_commit = new List(); foreach (int index in indexes) { to_commit.Add (this [index] as Photo); reverse_lookup [(this [index] as Photo).Id] = index; } store.Commit (to_commit.ToArray ()); } private void MarkChanged (object sender, DbItemEventArgs args) { int [] indexes = IndicesOf (args.Items); if (indexes.Length > 0 && ItemsChanged != null) ItemsChanged (this, new BrowsableEventArgs(indexes, (args as PhotoEventArgs).Changes)); } public void MarkChanged (int index, IBrowsableItemChanges changes) { MarkChanged (new int [] {index}, changes); } public void MarkChanged (int [] indexes, IBrowsableItemChanges changes) { ItemsChanged (this, new BrowsableEventArgs (indexes, changes)); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/PhotoPopup.cs0000644000175000017500000000155611503404761022465 0ustar00rubenruben00000000000000/* * FSpot.PhotoPopup * * Author(s) * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using Gtk; using Mono.Addins; using FSpot.Extensions; namespace FSpot { public class PhotoPopup : Gtk.Menu { protected PhotoPopup (IntPtr handle) : base (handle) { } public PhotoPopup () : this (null) { } public PhotoPopup (Widget parent) : base () { foreach (MenuNode node in AddinManager.GetExtensionNodes ("/FSpot/Menus/PhotoPopup")) Append (node.GetMenuItem (parent)); ShowAll (); } public void Activate (Widget toplevel) { Activate (toplevel, null); } public void Activate (Widget toplevel, Gdk.EventButton eb) { if (eb != null) Popup (null, null, null, eb.Button, eb.Time); else Popup (null, null, null, 0, Gtk.Global.CurrentEventTime); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/TagSelectionWidget.cs0000644000175000017500000005307011503404761024073 0ustar00rubenruben00000000000000/* * TagSelectionWidget.cs * * Author(s) * * This is free software. See COPYING for details. */ using System.Collections; using System.Collections.Generic; using System.IO; using System; using GLib; using Gdk; using Gtk; using Mono.Unix; using FSpot; using FSpot.Core; using FSpot.Database; using FSpot.Utils; using FSpot.Widgets; using FSpot.UI.Dialog; using Hyena.Widgets; namespace FSpot { public class TagSelectionWidget : SaneTreeView { Db database; TagStore tag_store; // FIXME this is a hack. private static Pixbuf empty_pixbuf = new Pixbuf (Colorspace.Rgb, true, 8, 1, 1); // If these are changed, the base () call in the constructor must be updated. private const int IdColumn = 0; private const int NameColumn = 1; // Selection management. public Tag TagAtPosition (double x, double y) { return TagAtPosition((int) x, (int) y); } public Tag TagAtPosition (int x, int y) { TreePath path; // Work out which tag we're dropping onto if (!this.GetPathAtPos (x, y, out path)) return null; return TagByPath (path); } public Tag TagByPath (TreePath path) { TreeIter iter; if (!Model.GetIter (out iter, path)) return null; return TagByIter (iter); } public Tag TagByIter (TreeIter iter) { GLib.Value val = new GLib.Value (); Model.GetValue (iter, IdColumn, ref val); uint tag_id = (uint) val; return tag_store.Get (tag_id) as Tag; } // Loading up the store. private void LoadCategory (Category category, TreeIter parent_iter) { IList tags = category.Children; foreach (Tag t in tags) { TreeIter iter = (Model as TreeStore).AppendValues (parent_iter, t.Id, t.Name); if (t is Category) LoadCategory (t as Category, iter); } } public void ScrollTo (Tag tag) { TreeIter iter; if (! TreeIterForTag (tag, out iter)) return; TreePath path = Model.GetPath (iter); ScrollToCell (path, null, false, 0, 0); } public Tag [] TagHighlight { get { TreeModel model; TreeIter iter; TreePath [] rows = Selection.GetSelectedRows(out model); Tag [] tags = new Tag [rows.Length]; int i = 0; foreach (TreePath path in rows) { GLib.Value value = new GLib.Value (); Model.GetIter (out iter, path); Model.GetValue (iter, IdColumn, ref value); uint tag_id = (uint) value; tags[i] = tag_store.Get (tag_id) as Tag; i++; } return tags; } set { if (value == null) return; Selection.UnselectAll (); TreeIter iter; foreach (Tag tag in value) if (TreeIterForTag (tag, out iter)) Selection.SelectIter (iter); } } public void Update () { (Model as TreeStore).Clear (); // GRRR We have to special case the root because I can't pass null for a // Gtk.TreeIter (since it's a struct, and not a class). // FIXME: This should be fixed in GTK#... It's gross. foreach (Tag t in tag_store.RootCategory.Children) { TreeIter iter = (Model as TreeStore).AppendValues (t.Id, t.Name); if (t is Category) LoadCategory (t as Category, iter); } } // Data functions. private void SetBackground (CellRenderer renderer, Tag tag) { // FIXME this should be themable but Gtk# doesn't give me access to the proper // members in GtkStyle for that. /* if (tag is Category) renderer.CellBackground = ToHashColor (this.Style.MidColors [(int) Gtk.StateType.Normal]); else renderer.CellBackground = ToHashColor (this.Style.LightColors [(int) Gtk.StateType.Normal]); */ } private void IconDataFunc (TreeViewColumn column, CellRenderer renderer, TreeModel model, TreeIter iter) { GLib.Value value = new GLib.Value (); Model.GetValue (iter, IdColumn, ref value); uint tag_id = (uint) value; Tag tag = tag_store.Get (tag_id) as Tag; if (tag == null) return; SetBackground (renderer, tag); if (tag.SizedIcon != null) { Cms.Profile screen_profile; if (FSpot.ColorManagement.Profiles.TryGetValue (Preferences.Get (Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE), out screen_profile)) { //FIXME, we're leaking a pixbuf here Gdk.Pixbuf temp = tag.SizedIcon.Copy(); FSpot.ColorManagement.ApplyProfile (temp, screen_profile); (renderer as CellRendererPixbuf).Pixbuf = temp; } else (renderer as CellRendererPixbuf).Pixbuf = tag.SizedIcon; } else (renderer as CellRendererPixbuf).Pixbuf = empty_pixbuf; } private void NameDataFunc (TreeViewColumn column, CellRenderer renderer, TreeModel model, TreeIter iter) { // FIXME not sure why it happens... if (model == null) return; GLib.Value value = new GLib.Value (); Model.GetValue (iter, IdColumn, ref value); uint tag_id = (uint) value; Tag tag = tag_store.Get (tag_id) as Tag; if (tag == null) return; SetBackground (renderer, tag); (renderer as CellRendererText).Text = tag.Name; } private bool TreeIterForTag(Tag tag, out TreeIter iter) { TreeIter root = TreeIter.Zero; iter = TreeIter.Zero; bool valid = Model.GetIterFirst (out root); while (valid) { if (TreeIterForTagRecurse (tag, root, out iter)) return true; valid = Model.IterNext (ref root); } return false; } // Depth first traversal private bool TreeIterForTagRecurse (Tag tag, TreeIter parent, out TreeIter iter) { bool valid = Model.IterChildren (out iter, parent); while (valid) { if (TreeIterForTagRecurse (tag, iter, out iter)) return true; valid = Model.IterNext (ref iter); } GLib.Value value = new GLib.Value (); Model.GetValue (parent, IdColumn, ref value); iter = parent; if (tag.Id == (uint) value) return true; return false; } // Copy a branch of the tree to a new parent // (note, this doesn't work generically as it only copies the first value of each node) private void CopyBranch (TreeIter src, TreeIter dest, bool is_root, bool is_parent) { TreeIter copy, iter; GLib.Value value = new GLib.Value (); TreeStore store = Model as TreeStore; bool valid; store.GetValue (src, IdColumn, ref value); Tag tag = (Tag) tag_store.Get ((uint)value); if (is_parent) { // we need to figure out where to insert it in the correct order copy = InsertInOrder(dest, is_root, tag); } else { copy = store.AppendValues (dest, (uint)value, tag.Name); } valid = Model.IterChildren (out iter, src); while (valid) { // child nodes are already ordered CopyBranch (iter, copy, false, false); valid = Model.IterNext (ref iter); } } // insert tag into the correct place in the tree, with parent. return the new TagIter in iter. private TreeIter InsertInOrder (TreeIter parent, bool is_root, Tag tag) { TreeStore store = Model as TreeStore; TreeIter iter; Tag compare; bool valid; if (is_root) valid = store.GetIterFirst (out iter); else valid = store.IterChildren (out iter, parent); while (valid) { //I have no desire to figure out a more performant sort over this... GLib.Value value = new GLib.Value (); store.GetValue(iter, IdColumn, ref value); compare = (Tag) tag_store.Get ((uint) value); if (compare.CompareTo (tag) > 0) { iter = store.InsertNodeBefore (iter); store.SetValue (iter, IdColumn, tag.Id); store.SetValue (iter, NameColumn, tag.Name); if (!is_root) ExpandRow (Model.GetPath (parent), false); return iter; } valid = store.IterNext(ref iter); } if (is_root) iter = store.AppendNode (); else { iter = store.AppendNode (parent); ExpandRow (Model.GetPath (parent), false); } store.SetValue (iter, IdColumn, tag.Id); store.SetValue (iter, NameColumn, tag.Name); return iter; } private void HandleTagsRemoved (object sender, DbItemEventArgs args) { TreeIter iter; foreach (Tag tag in args.Items) { if (TreeIterForTag (tag, out iter)) (Model as TreeStore).Remove (ref iter); } } private void HandleTagsAdded (object sender, DbItemEventArgs args) { TreeIter iter = TreeIter.Zero; foreach (Tag tag in args.Items) { if (tag.Category != tag_store.RootCategory) TreeIterForTag (tag.Category, out iter); InsertInOrder (iter, tag.Category.Name == tag_store.RootCategory.Name, tag); } } private void HandleTagsChanged (object sender, DbItemEventArgs args) { TreeStore store = Model as TreeStore; TreeIter iter, category_iter, parent_iter; foreach (Tag tag in args.Items) { TreeIterForTag (tag, out iter); bool category_valid = TreeIterForTag(tag.Category, out category_iter); bool parent_valid = Model.IterParent(out parent_iter, iter); if ((category_valid && (category_iter.Equals (parent_iter))) || (!category_valid && !parent_valid)) { // if we haven't been reparented TreePath path = store.GetPath (iter); store.EmitRowChanged (path, iter); } else { // It is a bit tougher. We need to do an annoying clone of structs... CopyBranch (iter, category_iter, !category_valid, true); store.Remove (ref iter); } } } void ExpandDefaults () { int [] tags = FSpot.Preferences.Get (FSpot.Preferences.EXPANDED_TAGS); if (tags == null) { ExpandAll (); return; } TreeIter [] iters = ModelIters (); if (iters == null || iters.Length == 0 || tags.Length == 0) return; foreach (TreeIter iter in iters) { GLib.Value v = new GLib.Value (); Model.GetValue (iter, IdColumn, ref v); int tag_id = (int)(uint) v; if (Array.IndexOf (tags, tag_id) > -1) { ExpandRow (Model.GetPath (iter), false); } } } // Returns a flattened array of TreeIter's from the Model TreeIter [] ModelIters () { TreeIter root; if (Model.GetIterFirst (out root)) { return ModelIters (root, true).ToArray (typeof (TreeIter)) as TreeIter []; } return null; } // Returns ArrayList containing the root TreeIter and all TreeIters at root's level and // descended from it ArrayList ModelIters (TreeIter root, bool first) { ArrayList model_iters = new ArrayList (Model.IterNChildren ()); model_iters.Add (root); // Append any children TreeIter child; if (Model.IterChildren (out child, root)) model_iters.AddRange (ModelIters (child, true)); // Append any siblings and their children if (first) { while (Model.IterNext (ref root)) { model_iters.AddRange (ModelIters (root, false)); } } return model_iters; } public void SaveExpandDefaults () { ArrayList expanded_tags = new ArrayList (); TreeIter [] iters = ModelIters (); if (iters == null) return; foreach (TreeIter iter in iters) { if (GetRowExpanded (Model.GetPath (iter))) { GLib.Value v = new GLib.Value (); Model.GetValue (iter, IdColumn, ref v); expanded_tags.Add ((int)(uint) v); } } #if GCONF_SHARP_2_18 FSpot.Preferences.Set ( FSpot.Preferences.EXPANDED_TAGS, (int []) expanded_tags.ToArray (typeof (int))); #else if (expanded_tags.Count == 0) expanded_tags.Add (-1); FSpot.Preferences.Set ( FSpot.Preferences.EXPANDED_TAGS, (int []) expanded_tags.ToArray (typeof (int))); #endif } public void EditSelectedTagName () { TreePath [] rows = Selection.GetSelectedRows(); if (rows.Length != 1) return; //SetCursor (rows[0], NameColumn, true); text_render.Editable = true; text_render.Edited += HandleTagNameEdited; SetCursor (rows[0], complete_column, true); text_render.Editable = false; } public void HandleTagNameEdited (object sender, EditedArgs args) { args.RetVal = false; TreeIter iter; if (!Model.GetIterFromString (out iter, args.Path)) return; GLib.Value value = new GLib.Value (); Model.GetValue (iter, IdColumn, ref value); uint tag_id = (uint) value; Tag tag = tag_store.Get (tag_id) as Tag; // Ignore if it hasn't changed if (tag.Name == args.NewText) return; // Check that the tag doesn't already exist if (String.Compare (args.NewText, tag.Name, true) != 0 && tag_store.GetTagByName (args.NewText) != null) { HigMessageDialog md = new HigMessageDialog (App.Instance.Organizer.Window, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.Ok, Catalog.GetString ("Error renaming tag"), Catalog.GetString ("This name is already in use")); md.Run (); md.Destroy (); this.GrabFocus (); return; } tag.Name = args.NewText; tag_store.Commit (tag, true); text_render.Edited -= HandleTagNameEdited; args.RetVal = true; return; } private static TargetEntry [] tag_source_target_table = new TargetEntry [] { DragDropTargets.TagListEntry }; private static TargetEntry [] tag_dest_target_table = new TargetEntry [] { DragDropTargets.PhotoListEntry, DragDropTargets.UriListEntry, DragDropTargets.TagListEntry }; CellRendererPixbuf pix_render; TreeViewColumn complete_column; CellRendererText text_render; protected TagSelectionWidget (IntPtr raw) : base (raw) { } // Constructor. public TagSelectionWidget (TagStore tag_store) : base (new TreeStore (typeof(uint), typeof(string))) { database = App.Instance.Database; HeadersVisible = false; complete_column = new TreeViewColumn (); pix_render = new CellRendererPixbuf (); complete_column.PackStart (pix_render, false); complete_column.SetCellDataFunc (pix_render, new TreeCellDataFunc (IconDataFunc)); //complete_column.AddAttribute (pix_render, "pixbuf", OpenIconColumn); //icon_column = AppendColumn ("icon", //, new TreeCellDataFunc (IconDataFunc)); //icon_column = AppendColumn ("icon", new CellRendererPixbuf (), new TreeCellDataFunc (IconDataFunc)); text_render = new CellRendererText (); complete_column.PackStart (text_render, true); complete_column.SetCellDataFunc (text_render, new TreeCellDataFunc (NameDataFunc)); AppendColumn (complete_column); this.tag_store = tag_store; Update (); ExpandDefaults (); tag_store.ItemsAdded += HandleTagsAdded; tag_store.ItemsRemoved += HandleTagsRemoved; tag_store.ItemsChanged += HandleTagsChanged; // TODO make the search find tags that are not currently expanded EnableSearch = true; SearchColumn = NameColumn; // Transparent white empty_pixbuf.Fill(0xffffff00); /* set up drag and drop */ DragDataGet += HandleDragDataGet; DragDrop += HandleDragDrop; DragBegin += HandleDragBegin; Gtk.Drag.SourceSet (this, Gdk.ModifierType.Button1Mask | Gdk.ModifierType.Button3Mask, tag_source_target_table, DragAction.Copy | DragAction.Move); DragDataReceived += HandleDragDataReceived; DragMotion += HandleDragMotion; Gtk.Drag.DestSet (this, DestDefaults.All, tag_dest_target_table, DragAction.Copy | DragAction.Move); } void HandleDragBegin (object sender, DragBeginArgs args) { Tag [] tags = TagHighlight; int len = tags.Length; int size = 32; int csize = size/2 + len * size / 2 + 2; Pixbuf container = new Pixbuf (Gdk.Colorspace.Rgb, true, 8, csize, csize); container.Fill (0x00000000); bool use_icon = false;; while (len-- > 0) { Pixbuf thumbnail = tags[len].Icon; if (thumbnail != null) { Pixbuf small = PixbufUtils.ScaleToMaxSize (thumbnail, size, size); int x = len * (size/2) + (size - small.Width)/2; int y = len * (size/2) + (size - small.Height)/2; small.Composite (container, x, y, small.Width, small.Height, x, y, 1.0, 1.0, Gdk.InterpType.Nearest, 0xff); small.Dispose (); use_icon = true; } } if (use_icon) Gtk.Drag.SetIconPixbuf (args.Context, container, 0, 0); container.Dispose (); } void HandleDragDataGet (object sender, DragDataGetArgs args) { if (args.Info == DragDropTargets.TagListEntry.Info) { args.SelectionData.SetTagsData (TagHighlight, args.Context.Targets[0]); return; } } void HandleDragDrop (object sender, DragDropArgs args) { args.RetVal = true; } public void HandleDragMotion (object o, DragMotionArgs args) { TreePath path; TreeViewDropPosition position = TreeViewDropPosition.IntoOrAfter; GetPathAtPos (args.X, args.Y, out path); if (path == null) return; // Tags can be dropped before, after, or into another tag if (args.Context.Targets[0].Name == "application/x-fspot-tags") { Gdk.Rectangle rect = GetCellArea(path, Columns[0]); double vpos = Math.Abs(rect.Y - args.Y) / (double)rect.Height; if (vpos < 0.2) { position = TreeViewDropPosition.Before; } else if (vpos > 0.8) { position = TreeViewDropPosition.After; } } SetDragDestRow (path, position); // Scroll if within 20 pixels of the top or bottom of the tag list if (args.Y < 20) Vadjustment.Value -= 30; else if (((o as Gtk.Widget).Allocation.Height - args.Y) < 20) Vadjustment.Value += 30; } public void HandleDragDataReceived (object o, DragDataReceivedArgs args) { TreePath path; TreeViewDropPosition position; if ( ! GetDestRowAtPos ((int)args.X, (int)args.Y, out path, out position)) return; Tag tag = path == null ? null : TagByPath (path); if (tag == null) return; if (args.Info == DragDropTargets.PhotoListEntry.Info) { database.BeginTransaction (); Photo[] photos = args.SelectionData.GetPhotosData (); foreach (Photo photo in photos) { if (photo == null) continue; photo.AddTag (tag); database.Photos.Commit (photo); // FIXME: AddTagExtendes from Mainwindow.cs does some tag-icon handling. // this should be done here or completely located to the Tag-class. } database.CommitTransaction (); // FIXME: this needs to be done somewhere: //query_widget.PhotoTagsChanged (new Tag[] {tag}); return; } if (args.Info == DragDropTargets.UriListEntry.Info) { UriList list = args.SelectionData.GetUriListData (); database.BeginTransaction (); List photos = new List (); foreach (var photo_uri in list) { Photo photo = database.Photos.GetByUri (photo_uri); // FIXME - at this point we should import the photo, and then continue if (photo == null) continue; // FIXME this should really follow the AddTagsExtended path too photo.AddTag (new Tag[] {tag}); photos.Add (photo); } database.Photos.Commit (photos.ToArray ()); database.CommitTransaction (); // FIXME: this need to be done //InvalidateViews (); // but it seems not to be needed. tags are updated through in IconView through PhotoChanged return; } if (args.Info == DragDropTargets.TagListEntry.Info) { Category parent; if (position == TreeViewDropPosition.Before || position == TreeViewDropPosition.After) { parent = tag.Category; } else { parent = tag as Category; } if (parent == null || TagHighlight.Length < 1) { args.RetVal = false; return; } int moved_count = 0; Tag [] highlighted_tags = TagHighlight; foreach (Tag child in TagHighlight) { // FIXME with this reparenting via dnd, you cannot move a tag to root. if (child != parent && child.Category != parent && !child.IsAncestorOf(parent)) { child.Category = parent as Category; // Saving changes will automatically cause the TreeView to be updated database.Tags.Commit (child); moved_count++; } } // Reselect the same tags TagHighlight = highlighted_tags; args.RetVal = moved_count > 0; return; } } #if TEST_TAG_SELECTION_WIDGET class Test { private TagSelectionWidget selection_widget; private void OnSelectionChanged () { Log.Debug ("Selection changed:"); foreach (Tag t in selection_widget.TagSelection) Log.DebugFormat ("\t{0}", t.Name); } private Test () { const string path = "/tmp/TagSelectionTest.db"; try { File.Delete (path); } catch {} Db db = new Db (path, true); Category people_category = db.Tags.CreateCategory (null, "People"); db.Tags.CreateTag (people_category, "Anna"); db.Tags.CreateTag (people_category, "Ettore"); db.Tags.CreateTag (people_category, "Miggy"); db.Tags.CreateTag (people_category, "Nat"); Category places_category = db.Tags.CreateCategory (null, "Places"); db.Tags.CreateTag (places_category, "Milan"); db.Tags.CreateTag (places_category, "Boston"); Category exotic_category = db.Tags.CreateCategory (places_category, "Exotic"); db.Tags.CreateTag (exotic_category, "Bengalore"); db.Tags.CreateTag (exotic_category, "Manila"); db.Tags.CreateTag (exotic_category, "Tokyo"); selection_widget = new TagSelectionWidget (db.Tags); selection_widget.SelectionChanged += new SelectionChangedHandler (OnSelectionChanged); Window window = new Window (WindowType.Toplevel); window.SetDefaultSize (400, 200); ScrolledWindow scrolled = new ScrolledWindow (null, null); scrolled.SetPolicy (PolicyType.Automatic, PolicyType.Automatic); scrolled.Add (selection_widget); window.Add (scrolled); window.ShowAll (); } static private void Main (string [] args) { Program program = new Program ("TagSelectionWidgetTest", "0.0", Modules.UI, args); Test test = new Test (); program.Run (); } } #endif } } f-spot-0.8.2/src/Clients/MainApp/FSpot/App.cs0000644000175000017500000002171611503404761021070 0ustar00rubenruben00000000000000/* * FSpot.Application.cs * * Author(s): * Stephane Delcroix * * Copyright (c) 2009 Stephane Delcroix. * * This is open source software. See COPYING fro details. */ using System; using System.IO; using System.Collections.Generic; using System.Linq; using System.Threading; using Unique; using Mono.Unix; using Hyena; using FSpot.Core; using FSpot.Database; namespace FSpot { public class App : Unique.App { static object sync_handle = new object (); #region public API static App app; public static App Instance { get { lock (sync_handle) { if (app == null) app = new App (); } return app; } } Thread constructing_organizer = null; public MainWindow Organizer { get { lock (sync_handle) { if (organizer == null) { if (constructing_organizer == Thread.CurrentThread) { throw new Exception ("Recursively tried to acquire App.Organizer!"); } constructing_organizer = Thread.CurrentThread; organizer = new MainWindow (Database); Register (organizer.Window); } } return organizer; } } public Db Database { get { lock (sync_handle) { if (db == null) { if (!File.Exists (Global.BaseDirectory)) Directory.CreateDirectory (Global.BaseDirectory); db = new Db (); try { db.Init (Path.Combine (Global.BaseDirectory, "photos.db"), true); } catch (Exception e) { new FSpot.UI.Dialog.RepairDbDialog (e, db.Repair (), null); db.Init (Path.Combine (Global.BaseDirectory, "photos.db"), true); } } } return db; } } public void Import (string path) { if (IsRunning) { var md = new MessageData (); md.Text = path; SendMessage (Command.Import, md); return; } HandleImport (path); } public void Organize () { if (IsRunning) { SendMessage (Command.Organize, null); return; } HandleOrganize (); } public void Shutdown () { if (IsRunning) { SendMessage (Command.Shutdown, null); return; } HandleShutdown (); } public void Slideshow (string tagname) { if (IsRunning) { var md = new MessageData (); md.Text = tagname ?? String.Empty; SendMessage (Command.Slideshow, md); return; } HandleSlideshow (tagname); } public void View (SafeUri uri) { View (new SafeUri[] {uri}); } public void View (IEnumerable uris) { var uri_s = from uri in uris select uri.ToString (); View (uri_s); } public void View (string uri) { View (new string[] {uri}); } public void View (IEnumerable uris) { if (IsRunning) { var md = new MessageData (); md.Uris = uris.ToArray (); SendMessage (Command.View, md); return; } HandleView (uris.ToArray()); } #endregion #region private ctor and stuffs enum Command { Invalid = 0, Import, View, Organize, Shutdown, Version, Slideshow, } List toplevels; MainWindow organizer; Db db; App (): base ("org.gnome.FSpot.Core", null, "Import", Command.Import, "View", Command.View, "Organize", Command.Organize, "Shutdown", Command.Shutdown, "Slideshow", Command.Slideshow) { toplevels = new List (); if (IsRunning) { Log.Information ("Found active FSpot process"); } else { MessageReceived += HandleMessageReceived; } } void SendMessage (Command command, MessageData md) { SendMessage ((Unique.Command)command, md); } #endregion #region Command Handlers void HandleMessageReceived (object sender, MessageReceivedArgs e) { switch ((Command)e.Command) { case Command.Import: HandleImport (e.MessageData.Text); e.RetVal = Response.Ok; break; case Command.Organize: HandleOrganize (); e.RetVal = Response.Ok; break; case Command.Shutdown: HandleShutdown (); e.RetVal = Response.Ok; break; case Command.Slideshow: HandleSlideshow (e.MessageData.Text); e.RetVal = Response.Ok; break; case Command.View: HandleView (e.MessageData.Uris); e.RetVal = Response.Ok; break; case Command.Invalid: default: Log.Debug ("Wrong command received"); break; } } void HandleImport (string path) { // Some users get wonky URIs here, trying to work around below. // https://bugzilla.gnome.org/show_bug.cgi?id=629248 if (path != null && path.StartsWith ("gphoto2:usb:")) { path = String.Format ("gphoto2://[{0}]", path.Substring (8)); } Hyena.Log.DebugFormat ("Importing from {0}", path); Organizer.Window.Present (); Organizer.ImportFile (path == null ? null : new SafeUri(path)); } void HandleOrganize () { if (Database.Empty) HandleImport (null); else Organizer.Window.Present (); } void HandleShutdown () { try { App.Instance.Organizer.Close (); } catch { System.Environment.Exit (0); } } //FIXME move all this in a standalone class void HandleSlideshow (string tagname) { Tag tag; FSpot.Widgets.SlideShow slideshow = null; if (!String.IsNullOrEmpty (tagname)) tag = Database.Tags.GetTagByName (tagname); else tag = Database.Tags.GetTagById (Preferences.Get (Preferences.SCREENSAVER_TAG)); IPhoto[] photos; if (tag != null) photos = Database.Photos.Query (new Tag[] {tag}); else if (Preferences.Get (Preferences.SCREENSAVER_TAG) == 0) photos = Database.Photos.Query (new Tag [] {}); else photos = new IPhoto [0]; // Minimum delay 1 second; default is 4s var delay = Math.Max (1.0, Preferences.Get (Preferences.SCREENSAVER_DELAY)); var window = new XScreenSaverSlide (); window.ModifyFg (Gtk.StateType.Normal, new Gdk.Color (127, 127, 127)); window.ModifyBg (Gtk.StateType.Normal, new Gdk.Color (0, 0, 0)); if (photos.Length > 0) { Array.Sort (photos, new IPhotoComparer.RandomSort ()); slideshow = new FSpot.Widgets.SlideShow (new BrowsablePointer (new PhotoList (photos), 0), (uint)(delay * 1000), true); slideshow.Transition = new FSpot.Transitions.DissolveTransition (); window.Add (slideshow); } else { Gtk.HBox outer = new Gtk.HBox (); Gtk.HBox hbox = new Gtk.HBox (); Gtk.VBox vbox = new Gtk.VBox (); outer.PackStart (new Gtk.Label (String.Empty)); outer.PackStart (vbox, false, false, 0); vbox.PackStart (new Gtk.Label (String.Empty)); vbox.PackStart (hbox, false, false, 0); hbox.PackStart (new Gtk.Image (Gtk.Stock.DialogWarning, Gtk.IconSize.Dialog), false, false, 0); outer.PackStart (new Gtk.Label (String.Empty)); string msg; string long_msg; if (tag != null) { msg = String.Format (Catalog.GetString ("No photos matching {0} found"), tag.Name); long_msg = String.Format (Catalog.GetString ("The tag \"{0}\" is not applied to any photos. Try adding\n" + "the tag to some photos or selecting a different tag in the\n" + "F-Spot preference dialog."), tag.Name); } else { msg = Catalog.GetString ("Search returned no results"); long_msg = Catalog.GetString ("The tag F-Spot is looking for does not exist. Try\n" + "selecting a different tag in the F-Spot preference\n" + "dialog."); } Gtk.Label label = new Gtk.Label (msg); hbox.PackStart (label, false, false, 0); Gtk.Label long_label = new Gtk.Label (long_msg); long_label.Markup = String.Format ("{0}", long_msg); vbox.PackStart (long_label, false, false, 0); vbox.PackStart (new Gtk.Label (String.Empty)); window.Add (outer); label.ModifyFg (Gtk.StateType.Normal, new Gdk.Color (127, 127, 127)); label.ModifyBg (Gtk.StateType.Normal, new Gdk.Color (0, 0, 0)); long_label.ModifyFg (Gtk.StateType.Normal, new Gdk.Color (127, 127, 127)); long_label.ModifyBg (Gtk.StateType.Normal, new Gdk.Color (0, 0, 0)); } window.ShowAll (); Register (window); GLib.Idle.Add (delegate { if (slideshow != null) slideshow.Start (); return false; }); } void HandleView (string[] uris) { List ul = new List (); foreach (var u in uris) ul.Add (new SafeUri (u, true)); try { Register (new FSpot.SingleView (ul.ToArray ()).Window); } catch (System.Exception e) { Log.Exception (e); Log.Debug ("no real valid path to view from"); } } #endregion #region Track toplevel windows void Register (Gtk.Window window) { toplevels.Add (window); window.Destroyed += HandleDestroyed; } void HandleDestroyed (object sender, EventArgs e) { toplevels.Remove (sender as Gtk.Window); if (toplevels.Count == 0) { Log.Information ("Exiting..."); Banshee.Kernel.Scheduler.Dispose (); Database.Dispose (); ImageLoaderThread.CleanAll (); Gtk.Application.Quit (); System.Environment.Exit (0); } if (organizer != null && organizer.Window == sender) organizer = null; } #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot/PhotoEventArgs.cs0000644000175000017500000000110711503404761023250 0ustar00rubenruben00000000000000/* * FSpot.PhotoEventArgs.cs * * Author(s): * Ruben Vermeersch * Stephane Delcroix * * This is free software. See COPYING for details. */ using FSpot.Core; namespace FSpot { public class PhotoEventArgs : DbItemEventArgs { PhotosChanges changes; public PhotosChanges Changes { get { return changes; } } public PhotoEventArgs (Photo photo, PhotosChanges changes) : this (new Photo[] {photo}, changes) { } public PhotoEventArgs (Photo[] photos, PhotosChanges changes) : base (photos) { this.changes = changes; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/SingleView.cs0000644000175000017500000004743411503404761022431 0ustar00rubenruben00000000000000using Gtk; using Gdk; using System; using System.Collections.Generic; using Mono.Addins; using Mono.Unix; using Hyena; using FSpot.Extensions; using FSpot.Utils; using FSpot.UI.Dialog; using FSpot.Widgets; using FSpot.Platform; using FSpot.Core; namespace FSpot { public class SingleView { [GtkBeans.Builder.Object] Gtk.HBox toolbar_hbox; [GtkBeans.Builder.Object] Gtk.VBox info_vbox; [GtkBeans.Builder.Object] Gtk.ScrolledWindow image_scrolled; Gtk.ScrolledWindow directory_scrolled; [GtkBeans.Builder.Object] Gtk.CheckMenuItem side_pane_item; [GtkBeans.Builder.Object] Gtk.CheckMenuItem toolbar_item; [GtkBeans.Builder.Object] Gtk.CheckMenuItem filenames_item; [GtkBeans.Builder.Object] Gtk.MenuItem export; [GtkBeans.Builder.Object] Gtk.Scale zoom_scale; [GtkBeans.Builder.Object] Label status_label; [GtkBeans.Builder.Object] ImageMenuItem rotate_left; [GtkBeans.Builder.Object] ImageMenuItem rotate_right; ToolButton rr_button, rl_button; Sidebar sidebar; [GtkBeans.Builder.Object] private Gtk.Window single_view; public Gtk.Window Window { get { return single_view; } } PhotoImageView image_view; SelectionCollectionGridView directory_view; private SafeUri uri; UriCollection collection; FullScreenView fsview; public SingleView (SafeUri [] uris) { this.uri = uris [0]; Log.Debug ("uri: " + this.uri); GtkBeans.Builder builder = new GtkBeans.Builder ("single_view.ui"); builder.Autoconnect (this); LoadPreference (Preferences.VIEWER_WIDTH); LoadPreference (Preferences.VIEWER_MAXIMIZED); Gtk.Toolbar toolbar = new Gtk.Toolbar (); toolbar_hbox.PackStart (toolbar); rl_button = GtkUtil.ToolButtonFromTheme ("object-rotate-left", Catalog.GetString ("Rotate Left"), true); rl_button.Clicked += HandleRotate270Command; rl_button.TooltipText = Catalog.GetString ("Rotate photo left"); toolbar.Insert (rl_button, -1); rr_button = GtkUtil.ToolButtonFromTheme ("object-rotate-right", Catalog.GetString ("Rotate Right"), true); rr_button.Clicked += HandleRotate90Command; rr_button.TooltipText = Catalog.GetString ("Rotate photo right"); toolbar.Insert (rr_button, -1); toolbar.Insert (new SeparatorToolItem (), -1); ToolButton fs_button = GtkUtil.ToolButtonFromTheme ("view-fullscreen", Catalog.GetString ("Fullscreen"), true); fs_button.Clicked += HandleViewFullscreen; fs_button.TooltipText = Catalog.GetString ("View photos fullscreen"); toolbar.Insert (fs_button, -1); ToolButton ss_button = GtkUtil.ToolButtonFromTheme ("media-playback-start", Catalog.GetString ("Slideshow"), true); ss_button.Clicked += HandleViewSlideshow; ss_button.TooltipText = Catalog.GetString ("View photos in a slideshow"); toolbar.Insert (ss_button, -1); collection = new UriCollection (uris); TargetEntry [] dest_table = { FSpot.DragDropTargets.UriListEntry, FSpot.DragDropTargets.PlainTextEntry }; directory_view = new SelectionCollectionGridView (collection); directory_view.Selection.Changed += HandleSelectionChanged; directory_view.DragDataReceived += HandleDragDataReceived; Gtk.Drag.DestSet (directory_view, DestDefaults.All, dest_table, DragAction.Copy | DragAction.Move); directory_view.DisplayTags = false; directory_view.DisplayDates = false; directory_view.DisplayRatings = false; directory_scrolled = new ScrolledWindow(); directory_scrolled.Add (directory_view); sidebar = new Sidebar (); info_vbox.Add (sidebar); sidebar.AppendPage (directory_scrolled, Catalog.GetString ("Folder"), "gtk-directory"); AddinManager.AddExtensionNodeHandler ("/FSpot/Sidebar", OnSidebarExtensionChanged); sidebar.Context = ViewContext.Single; sidebar.CloseRequested += HandleHideSidePane; sidebar.Show (); ThumbnailLoader.Default.OnPixbufLoaded += delegate { directory_view.QueueDraw (); }; image_view = new PhotoImageView (collection); GtkUtil.ModifyColors (image_view); GtkUtil.ModifyColors (image_scrolled); image_view.ZoomChanged += HandleZoomChanged; image_view.Item.Changed += HandleItemChanged; image_view.ButtonPressEvent += HandleImageViewButtonPressEvent; image_view.DragDataReceived += HandleDragDataReceived; Gtk.Drag.DestSet (image_view, DestDefaults.All, dest_table, DragAction.Copy | DragAction.Move); image_scrolled.Add (image_view); Window.ShowAll (); zoom_scale.ValueChanged += HandleZoomScaleValueChanged; LoadPreference (Preferences.VIEWER_SHOW_TOOLBAR); LoadPreference (Preferences.VIEWER_INTERPOLATION); LoadPreference (Preferences.VIEWER_TRANSPARENCY); LoadPreference (Preferences.VIEWER_TRANS_COLOR); ShowSidebar = collection.Count > 1; LoadPreference (Preferences.VIEWER_SHOW_FILENAMES); Preferences.SettingChanged += OnPreferencesChanged; Window.DeleteEvent += HandleDeleteEvent; collection.Changed += HandleCollectionChanged; // wrap the methods to fit to the delegate image_view.Item.Changed += delegate (object sender, BrowsablePointerChangedEventArgs old) { BrowsablePointer pointer = sender as BrowsablePointer; if (pointer == null) return; IPhoto [] item = {pointer.Current}; sidebar.HandleSelectionChanged (new PhotoList (item)); }; image_view.Item.Collection.ItemsChanged += sidebar.HandleSelectionItemsChanged; UpdateStatusLabel (); if (collection.Count > 0) directory_view.Selection.Add (0); export.Submenu = (Mono.Addins.AddinManager.GetExtensionNode ("/FSpot/Menus/Exports") as FSpot.Extensions.SubmenuNode).GetMenuItem (this).Submenu; export.Submenu.ShowAll (); export.Activated += HandleExportActivated ; } private void OnSidebarExtensionChanged (object s, ExtensionNodeEventArgs args) { // FIXME: No sidebar page removal yet! if (args.Change == ExtensionChange.Add) sidebar.AppendPage ((args.ExtensionNode as SidebarPageNode).GetPage ()); } void HandleExportActivated (object o, EventArgs e) { FSpot.Extensions.ExportMenuItemNode.SelectedImages = delegate () {return new PhotoList (directory_view.Selection.Items); }; } public void HandleCollectionChanged (IBrowsableCollection collection) { if (collection.Count > 0 && directory_view.Selection.Count == 0) { Log.Debug ("Added selection"); directory_view.Selection.Add (0); } if (collection.Count > 1) ShowSidebar = true; rotate_left.Sensitive = rotate_right.Sensitive = rr_button.Sensitive = rl_button.Sensitive = collection.Count != 0; UpdateStatusLabel (); } public bool ShowSidebar { get { return info_vbox.Visible; } set { info_vbox.Visible = value; if (side_pane_item.Active != value) side_pane_item.Active = value; } } public bool ShowToolbar { get { return toolbar_hbox.Visible; } set { toolbar_hbox.Visible = value; if (toolbar_item.Active != value) toolbar_item.Active = value; } } private SafeUri CurrentUri { get { return this.uri; } set { this.uri = value; collection.Clear (); collection.LoadItems (new SafeUri[] { this.uri }); } } void HandleRotate90Command (object sender, System.EventArgs args) { RotateCommand command = new RotateCommand (this.Window); if (command.Execute (RotateDirection.Clockwise, new IPhoto [] { image_view.Item.Current })) collection.MarkChanged (image_view.Item.Index, FullInvalidate.Instance); } void HandleRotate270Command (object sender, System.EventArgs args) { RotateCommand command = new RotateCommand (this.Window); if (command.Execute (RotateDirection.Counterclockwise, new IPhoto [] { image_view.Item.Current })) collection.MarkChanged (image_view.Item.Index, FullInvalidate.Instance); } private void HandleSelectionChanged (IBrowsableCollection selection) { if (selection.Count > 0) { image_view.Item.Index = ((FSpot.Widgets.SelectionCollection)selection).Ids[0]; zoom_scale.Value = image_view.NormalizedZoom; } UpdateStatusLabel (); } private void HandleItemChanged (object sender, BrowsablePointerChangedEventArgs old) { BrowsablePointer pointer = sender as BrowsablePointer; if (pointer == null) return; directory_view.FocusCell = pointer.Index; directory_view.Selection.Clear (); if (collection.Count > 0) { directory_view.Selection.Add (directory_view.FocusCell); directory_view.ScrollTo (directory_view.FocusCell); } } void HandleSetAsBackgroundCommand (object sender, EventArgs args) { IPhoto current = image_view.Item.Current; if (current == null) return; Desktop.SetBackgroundImage (current.DefaultVersion.Uri.LocalPath); } private void HandleViewToolbar (object sender, System.EventArgs args) { ShowToolbar = toolbar_item.Active; } private void HandleHideSidePane (object sender, System.EventArgs args) { ShowSidebar = false; } private void HandleViewSidePane (object sender, System.EventArgs args) { ShowSidebar = side_pane_item.Active; } private void HandleViewSlideshow (object sender, System.EventArgs args) { HandleViewFullscreen (sender, args); fsview.PlayPause (); } private void HandleViewFilenames (object sender, System.EventArgs args) { directory_view.DisplayFilenames = filenames_item.Active; UpdateStatusLabel (); } private void HandleAbout (object sender, System.EventArgs args) { FSpot.UI.Dialog.AboutDialog.ShowUp (); } private void HandleNewWindow (object sender, System.EventArgs args) { /* FIXME this needs to register witth the core */ new SingleView (new SafeUri[] {uri}); } private void HandlePreferences (object sender, System.EventArgs args) { SingleView.PreferenceDialog.Show (); } private void HandleOpenFolder (object sender, System.EventArgs args) { Open (FileChooserAction.SelectFolder); } private void HandleOpen (object sender, System.EventArgs args) { Open (FileChooserAction.Open); } private void Open (FileChooserAction action) { string title = Catalog.GetString ("Open"); if (action == FileChooserAction.SelectFolder) title = Catalog.GetString ("Select Folder"); FileChooserDialog chooser = new FileChooserDialog (title, Window, action); chooser.AddButton (Stock.Cancel, ResponseType.Cancel); chooser.AddButton (Stock.Open, ResponseType.Ok); chooser.SetUri (uri.ToString ()); int response = chooser.Run (); if ((ResponseType) response == ResponseType.Ok) CurrentUri = new SafeUri (chooser.Uri, true); chooser.Destroy (); } private void HandleViewFullscreen (object sender, System.EventArgs args) { if (fsview != null) fsview.Destroy (); fsview = new FSpot.FullScreenView (collection, Window); fsview.Destroyed += HandleFullScreenViewDestroy; fsview.View.Item.Index = image_view.Item.Index; fsview.Show (); } private void HandleFullScreenViewDestroy (object sender, System.EventArgs args) { directory_view.Selection.Clear (); if (fsview.View.Item.IsValid) directory_view.Selection.Add (fsview.View.Item.Index); fsview = null; } public void HandleZoomOut (object sender, System.EventArgs args) { image_view.ZoomOut (); } public void HandleZoomOut (object sender, Gtk.ButtonPressEventArgs args) { image_view.ZoomOut (); } public void HandleZoomIn (object sender, Gtk.ButtonPressEventArgs args) { image_view.ZoomIn (); } public void HandleZoomIn (object sender, System.EventArgs args) { image_view.ZoomIn (); } private void HandleZoomScaleValueChanged (object sender, System.EventArgs args) { image_view.NormalizedZoom = zoom_scale.Value; } private void HandleZoomChanged (object sender, System.EventArgs args) { zoom_scale.Value = image_view.NormalizedZoom; // FIXME something is broken here //zoom_in.Sensitive = (zoom_scale.Value != 1.0); //zoom_out.Sensitive = (zoom_scale.Value != 0.0); } private void HandleImageViewButtonPressEvent (object sender, ButtonPressEventArgs args) { if (args.Event.Type != EventType.ButtonPress || args.Event.Button != 3) return; Gtk.Menu popup_menu = new Gtk.Menu (); bool has_item = image_view.Item.Current != null; GtkUtil.MakeMenuItem (popup_menu, Catalog.GetString ("Rotate _Left"), "object-rotate-left", delegate { HandleRotate270Command(Window, null); }, has_item); GtkUtil.MakeMenuItem (popup_menu, Catalog.GetString ("Rotate _Right"), "object-rotate-right", delegate { HandleRotate90Command (Window, null); }, has_item); GtkUtil.MakeMenuSeparator (popup_menu); GtkUtil.MakeMenuItem (popup_menu, Catalog.GetString ("Set as Background"), HandleSetAsBackgroundCommand, has_item); popup_menu.Popup (null, null, null, 0, Gtk.Global.CurrentEventTime); } void HandleDeleteEvent (object sender, DeleteEventArgs args) { SavePreferences (); this.Window.Destroy (); args.RetVal = true; } void HandleDragDataReceived (object sender, DragDataReceivedArgs args) { if (args.Info == FSpot.DragDropTargets.UriListEntry.Info || args.Info == FSpot.DragDropTargets.PlainTextEntry.Info) { /* * If the drop is coming from inside f-spot then we don't want to import */ if (Gtk.Drag.GetSourceWidget (args.Context) != null) return; UriList list = args.SelectionData.GetUriListData (); collection.LoadItems (list.ToArray()); Gtk.Drag.Finish (args.Context, true, false, args.Time); return; } } private void UpdateStatusLabel () { IPhoto item = image_view.Item.Current; System.Text.StringBuilder sb = new System.Text.StringBuilder(); if (filenames_item.Active && item != null) sb.Append (System.IO.Path.GetFileName (item.DefaultVersion.Uri.LocalPath) + " - "); sb.AppendFormat (Catalog.GetPluralString ("{0} Photo", "{0} Photos", collection.Count), collection.Count); status_label.Text = sb.ToString (); } private void HandleFileClose (object sender, System.EventArgs args) { SavePreferences (); this.Window.Destroy (); } private void SavePreferences () { int width, height; Window.GetSize (out width, out height); bool maximized = ((Window.GdkWindow.State & Gdk.WindowState.Maximized) > 0); Preferences.Set (Preferences.VIEWER_MAXIMIZED, maximized); if (!maximized) { Preferences.Set (Preferences.VIEWER_WIDTH, width); Preferences.Set (Preferences.VIEWER_HEIGHT, height); } Preferences.Set (Preferences.VIEWER_SHOW_TOOLBAR, toolbar_hbox.Visible); Preferences.Set (Preferences.VIEWER_SHOW_FILENAMES, filenames_item.Active); } private void HandleFileOpen (object sender, System.EventArgs args) { FileChooserDialog file_selector = new FileChooserDialog ("Open", this.Window, FileChooserAction.Open); file_selector.SetUri (uri.ToString ()); int response = file_selector.Run (); if ((Gtk.ResponseType) response == Gtk.ResponseType.Ok) { var l = new List (); foreach (var s in file_selector.Uris) l.Add (new SafeUri (s)); new FSpot.SingleView (l.ToArray ()); } file_selector.Destroy (); } void OnPreferencesChanged (object sender, NotifyEventArgs args) { LoadPreference (args.Key); } void LoadPreference (String key) { switch (key) { case Preferences.VIEWER_MAXIMIZED: if (Preferences.Get (key)) Window.Maximize (); else Window.Unmaximize (); break; case Preferences.VIEWER_WIDTH: case Preferences.VIEWER_HEIGHT: int width, height; width = Preferences.Get (Preferences.VIEWER_WIDTH); height = Preferences.Get (Preferences.VIEWER_HEIGHT); if( width == 0 || height == 0 ) break; Window.SetDefaultSize(width, height); Window.ReshowWithInitialSize(); break; case Preferences.VIEWER_SHOW_TOOLBAR: if (toolbar_item.Active != Preferences.Get (key)) toolbar_item.Active = Preferences.Get (key); toolbar_hbox.Visible = Preferences.Get (key); break; case Preferences.VIEWER_INTERPOLATION: if (Preferences.Get (key)) image_view.Interpolation = Gdk.InterpType.Bilinear; else image_view.Interpolation = Gdk.InterpType.Nearest; break; case Preferences.VIEWER_SHOW_FILENAMES: if (filenames_item.Active != Preferences.Get (key)) filenames_item.Active = Preferences.Get (key); break; case Preferences.VIEWER_TRANSPARENCY: if (Preferences.Get (key) == "CHECK_PATTERN") image_view.CheckPattern = CheckPattern.Dark; else if (Preferences.Get (key) == "COLOR") image_view.CheckPattern = new CheckPattern (Preferences.Get (Preferences.VIEWER_TRANS_COLOR)); else // NONE image_view.CheckPattern = new CheckPattern (image_view.Style.BaseColors [(int)Gtk.StateType.Normal]); break; case Preferences.VIEWER_TRANS_COLOR: if (Preferences.Get (Preferences.VIEWER_TRANSPARENCY) == "COLOR") image_view.CheckPattern = new CheckPattern (Preferences.Get (key)); break; } } public class PreferenceDialog : BuilderDialog { [GtkBeans.Builder.Object] private CheckButton interpolation_check; [GtkBeans.Builder.Object] private ColorButton color_button; [GtkBeans.Builder.Object] private RadioButton as_background_radio; [GtkBeans.Builder.Object] private RadioButton as_check_radio; [GtkBeans.Builder.Object] private RadioButton as_color_radio; public PreferenceDialog () : base ("viewer_preferences.ui", "viewer_preferences") { this.LoadPreference (Preferences.VIEWER_INTERPOLATION); this.LoadPreference (Preferences.VIEWER_TRANSPARENCY); this.LoadPreference (Preferences.VIEWER_TRANS_COLOR); Preferences.SettingChanged += OnPreferencesChanged; this.Destroyed += HandleDestroyed; } void InterpolationToggled (object sender, System.EventArgs args) { Preferences.Set (Preferences.VIEWER_INTERPOLATION, interpolation_check.Active); } void HandleTransparentColorSet (object sender, System.EventArgs args) { Preferences.Set (Preferences.VIEWER_TRANS_COLOR, "#" + (color_button.Color.Red / 256 ).ToString("x").PadLeft (2, '0') + (color_button.Color.Green / 256 ).ToString("x").PadLeft (2, '0') + (color_button.Color.Blue / 256 ).ToString("x").PadLeft (2, '0')); } void HandleTransparencyToggled (object sender, System.EventArgs args) { if (as_background_radio.Active) Preferences.Set (Preferences.VIEWER_TRANSPARENCY, "NONE"); else if (as_check_radio.Active) Preferences.Set (Preferences.VIEWER_TRANSPARENCY, "CHECK_PATTERN"); else if (as_color_radio.Active) Preferences.Set (Preferences.VIEWER_TRANSPARENCY, "COLOR"); } static PreferenceDialog prefs; public static void Show () { if (prefs == null) prefs = new PreferenceDialog (); prefs.Present (); } void OnPreferencesChanged (object sender, NotifyEventArgs args) { LoadPreference (args.Key); } void HandleClose (object sender, EventArgs args) { this.Destroy (); } private void HandleDestroyed (object sender, EventArgs args) { prefs = null; } void LoadPreference (string key) { switch (key) { case Preferences.VIEWER_INTERPOLATION: interpolation_check.Active = Preferences.Get (key); break; case Preferences.VIEWER_TRANSPARENCY: switch (Preferences.Get (key)) { case "COLOR": as_color_radio.Active = true; break; case "CHECK_PATTERN": as_check_radio.Active = true; break; default: //NONE as_background_radio.Active = true; break; } break; case Preferences.VIEWER_TRANS_COLOR: color_button.Color = new Gdk.Color ( Byte.Parse (Preferences.Get (key).Substring (1,2), System.Globalization.NumberStyles.AllowHexSpecifier), Byte.Parse (Preferences.Get (key).Substring (3,2), System.Globalization.NumberStyles.AllowHexSpecifier), Byte.Parse (Preferences.Get (key).Substring (5,2), System.Globalization.NumberStyles.AllowHexSpecifier)); break; } } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/ItemAction.cs0000644000175000017500000000571511503404761022405 0ustar00rubenruben00000000000000/* * ItemAction.cs * * Copyright 2007 Novell Inc. * * Author * Larry Ewing * * See COPYING for license information. * */ using Gtk; using Mono.Unix; using FSpot.Core; using FSpot.Filters; using System; using FSpot.UI.Dialog; namespace FSpot { public abstract class ItemAction : Gtk.Action { protected BrowsablePointer item; public ItemAction (BrowsablePointer pointer, string name, string label, string tooltip, string icon_name) : base (name, label) { Tooltip = tooltip; IconName = icon_name; item = pointer; item.Changed += ItemChanged; } protected virtual void ItemChanged (object sender, BrowsablePointerChangedEventArgs args) { Sensitive = item.IsValid; } } public class RotateAction : ItemAction { protected RotateDirection direction; public RotateAction (BrowsablePointer pointer, RotateDirection direction, string name, string label, string tooltip, string stock_id) : base (pointer, name, label, tooltip, stock_id) { this.direction = direction; } protected override void OnActivated () { try { RotateOperation op = new RotateOperation (item.Current, direction); while (op.Step ()); item.Collection.MarkChanged (item.Index, FullInvalidate.Instance); } catch (Exception e) { Dialog d = new EditExceptionDialog (null, e, item.Current); d.Show (); d.Run (); d.Destroy (); } } } public class RotateLeftAction : RotateAction { public RotateLeftAction (BrowsablePointer p) : base (p, RotateDirection.Counterclockwise, "RotateItemLeft", Catalog.GetString ("Rotate Left"), Catalog.GetString ("Rotate picture left"), "object-rotate-left") { } } public class RotateRightAction : RotateAction { public RotateRightAction (BrowsablePointer p) : base (p, RotateDirection.Clockwise, "RotateItemRight", Catalog.GetString ("Rotate Right"), Catalog.GetString ("Rotate picture right"), "object-rotate-right") { } } public class NextPictureAction : ItemAction { public NextPictureAction (BrowsablePointer p) : base (p, "NextPicture", Catalog.GetString ("Next"), Catalog.GetString ("Next picture"), "gtk-go-forward-ltr") { } protected override void ItemChanged (object sender, BrowsablePointerChangedEventArgs args) { Sensitive = item.Index < item.Collection.Count -1; } protected override void OnActivated () { item.MoveNext (); } } public class PreviousPictureAction : ItemAction { public PreviousPictureAction (BrowsablePointer p) : base (p, "PreviousPicture", Catalog.GetString ("Previous"), Catalog.GetString ("Previous picture"), "gtk-go-back-ltr") { } protected override void ItemChanged (object sender, BrowsablePointerChangedEventArgs args) { Sensitive = item.Index > 0; } protected override void OnActivated () { item.MovePrevious (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/ProgressItem.cs0000644000175000017500000000104611503404761022765 0ustar00rubenruben00000000000000/* * FSpot.ProgressItem.cs * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. */ using System; namespace FSpot { public class ProgressItem { public ProgressItem () { } public delegate void ChangedHandler (ProgressItem item); public event ChangedHandler Changed; double value; public double Value { get { lock (this) { return value; } } set { lock (this) { this.value = value; if (Changed != null) Changed (this); } } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/PrintOperation.cs0000644000175000017500000001743011503404761023323 0ustar00rubenruben00000000000000/* * FSpot.PrintOperation.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details. */ using Cairo; using System; using System.Runtime.InteropServices; using Mono.Unix; using FSpot.Core; using FSpot.Widgets; using FSpot.Imaging; using Hyena; namespace FSpot { public class PrintOperation : Gtk.PrintOperation { IPhoto [] selected_photos; int photos_per_page = 1; CustomPrintWidget.FitMode fit = CustomPrintWidget.FitMode.Scaled; bool repeat, white_borders, crop_marks; string print_label_format; string comment; public PrintOperation (IPhoto [] selected_photos) : base () { this.selected_photos = selected_photos; CustomTabLabel = Catalog.GetString ("Image Settings"); NPages = selected_photos.Length; DefaultPageSetup = Global.PageSetup; } protected override void OnBeginPrint (Gtk.PrintContext context) { base.OnBeginPrint (context); } protected override Gtk.Widget OnCreateCustomWidget () { Gtk.Widget widget = new CustomPrintWidget (this); widget.ShowAll (); (widget as CustomPrintWidget).Changed += OnCustomWidgetChanged; OnCustomWidgetChanged (widget); return widget; } protected override void OnCustomWidgetApply (Gtk.Widget widget) { CustomPrintWidget cpw = widget as CustomPrintWidget; UseFullPage = cpw.UseFullPage; photos_per_page = cpw.PhotosPerPage; repeat = cpw.Repeat; NPages = repeat ? selected_photos.Length :(int) Math.Ceiling (1.0 * selected_photos.Length / photos_per_page); fit = cpw.Fitmode; white_borders = cpw.WhiteBorders; crop_marks = cpw.CropMarks; print_label_format = cpw.PrintLabelFormat; comment = cpw.CustomText; } protected void OnCustomWidgetChanged (Gtk.Widget widget) { OnCustomWidgetApply (widget); using (ImageSurface surface = new ImageSurface (Format.ARGB32, 360, 254)) { using (Context gr = new Context (surface)) { gr.Color = new Color (1, 1, 1); gr.Rectangle (0, 0, 360, 254); gr.Fill (); using (Gdk.Pixbuf pixbuf = Gdk.Pixbuf.LoadFromResource ("flower.png")) { DrawImage (gr, pixbuf,0, 0, 360, 254); } } (widget as CustomPrintWidget).PreviewImage.Pixbuf = CreatePixbuf (surface); } } protected override void OnDrawPage (Gtk.PrintContext context, int page_nr) { base.OnDrawPage (context, page_nr); Context cr = context.CairoContext; int ppx, ppy; switch (photos_per_page) { default: case 1: ppx = ppy =1; break; case 2: ppx = 1; ppy = 2; break; case 4: ppx = ppy = 2; break; case 9: ppx = ppy = 3; break; case 12: ppx = 3; ppy = 4; break; case 20: ppx = 4; ppy = 5; break; case 30: ppx = 5; ppy = 6; break; } //FIXME: if paper is landscape, swap ppx with ppy double w = context.Width / ppx; double h = context.Height / ppy; // compute picture size using 4800DPI double mx=(w / 25.4) * 4800, my=(h / 25.4) * 4800; for (int x = 0; x <= ppx; x++) { for (int y = 0; y <= ppy; y++) { int p_index = repeat ? page_nr : page_nr * photos_per_page + y * ppx + x; if (crop_marks) DrawCropMarks (cr, x*w, y*h, w*.1); if (x == ppx || y == ppy || p_index >= selected_photos.Length) continue; using (var img = ImageFile.Create (selected_photos[p_index].DefaultVersion.Uri)) { Gdk.Pixbuf pixbuf; try { pixbuf = img.Load ((int) mx, (int) my); Cms.Profile printer_profile; if (FSpot.ColorManagement.Profiles.TryGetValue (Preferences.Get (Preferences.COLOR_MANAGEMENT_OUTPUT_PROFILE), out printer_profile)) FSpot.ColorManagement.ApplyProfile (pixbuf, img.GetProfile (), printer_profile); } catch (Exception e) { Log.Exception ("Unable to load image " + selected_photos[p_index].DefaultVersion.Uri + "\n", e); // If the image is not found load error pixbuf pixbuf = new Gdk.Pixbuf (PixbufUtils.ErrorPixbuf, 0, 0, PixbufUtils.ErrorPixbuf.Width, PixbufUtils.ErrorPixbuf.Height); } //Gdk.Pixbuf pixbuf = img.Load (100, 100); bool rotated = false; if (Math.Sign ((double)pixbuf.Width/pixbuf.Height - 1.0) != Math.Sign (w/h - 1.0)) { Gdk.Pixbuf d_pixbuf = pixbuf.RotateSimple (Gdk.PixbufRotation.Counterclockwise); pixbuf.Dispose (); pixbuf = d_pixbuf; rotated = true; } DrawImage (cr, pixbuf, x * w, y * h, w, h); string tag_string = ""; foreach (Tag t in selected_photos[p_index].Tags) tag_string = String.Concat (tag_string, t.Name); string label = String.Format (print_label_format, comment, selected_photos[p_index].Name, selected_photos[p_index].Time.ToLocalTime ().ToShortDateString (), selected_photos[p_index].Time.ToLocalTime ().ToShortTimeString (), tag_string, selected_photos[p_index].Description); DrawComment (context, (x + 1) * w, (rotated ? y : y + 1) * h, (rotated ? w : h) * .025, label, rotated); pixbuf.Dispose (); } } } } protected override void OnEndPrint (Gtk.PrintContext context) { base.OnEndPrint (context); context.Dispose (); } protected override void OnRequestPageSetup (Gtk.PrintContext context, int page_nr, Gtk.PageSetup setup) { base.OnRequestPageSetup (context, page_nr, setup); } private void DrawCropMarks (Context cr, double x, double y, double length) { cr.Save (); cr.Color = new Color (0, 0, 0); cr.MoveTo (x - length/2, y); cr.LineTo (x + length/2, y); cr.MoveTo (x, y - length/2); cr.LineTo (x, y + length/2); cr.LineWidth = .2; cr.SetDash (new double[] {length*.4, length*.2}, 0); cr.Stroke (); cr.Restore (); } private static void DrawComment (Gtk.PrintContext context, double x, double y, double h, string comment, bool rotated) { if (comment == null || comment == String.Empty) return; Context cr = context.CairoContext; cr.Save (); Pango.Layout layout = context.CreatePangoLayout (); Pango.FontDescription desc = Pango.FontDescription.FromString ("sans 14"); layout.FontDescription = desc; layout.SetText (comment); int lay_w, lay_h; layout.GetPixelSize (out lay_w, out lay_h); double scale = h/lay_h; if (rotated) { cr.Translate (x - h, y + lay_w * scale); cr.Rotate (- Math.PI / 2); } else cr.Translate (x - lay_w * scale, y - h); cr.Scale (scale, scale); Pango.CairoHelper.ShowLayout (context.CairoContext, layout); cr.Restore (); } private void DrawImage (Context cr, Gdk.Pixbuf pixbuf, double x, double y, double w, double h) { double scalex, scaley; switch (fit) { case CustomPrintWidget.FitMode.Zoom: scalex = scaley = Math.Max (w/pixbuf.Width, h/pixbuf.Height); break; case CustomPrintWidget.FitMode.Fill: scalex = w/pixbuf.Width; scaley = h/pixbuf.Height; break; default: case CustomPrintWidget.FitMode.Scaled: scalex = scaley = Math.Min (w/pixbuf.Width, h/pixbuf.Height); break; } double rectw = w / scalex; double recth = h / scaley; cr.Save (); if (white_borders) cr.Translate (w * .025, h * .025); cr.Translate (x, y); if (white_borders) cr.Scale (.95, .95); cr.Scale (scalex, scaley); cr.Rectangle (0, 0, rectw, recth); Gdk.CairoHelper.SetSourcePixbuf (cr, pixbuf, (rectw - pixbuf.Width) / 2.0, (recth - pixbuf.Height) / 2.0); cr.Fill (); if (white_borders) { cr.Rectangle (0, 0 ,rectw, recth); cr.Color = new Color (0, 0, 0); cr.LineWidth = 1 / scalex; cr.Stroke (); } cr.Restore (); } [DllImport("libfspot")] static extern IntPtr f_pixbuf_from_cairo_surface (IntPtr handle); private static Gdk.Pixbuf CreatePixbuf (Surface s) { IntPtr result = f_pixbuf_from_cairo_surface (s.Handle); return (Gdk.Pixbuf) GLib.Object.GetObject (result, true); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/DragDropTargets.cs0000644000175000017500000000314411503404761023377 0ustar00rubenruben00000000000000/* * FSpot.DragDropTargets.cs * * Author(s) * Mike Gemuende * * This is free software. See COPYING for details. */ using System; using Gtk; namespace FSpot { public static class DragDropTargets { enum TargetType : uint { PlainText = 0, UriList, TagList, TagQueryItem, UriQueryItem, PhotoList, RootWindow, CopyFiles, }; [Obsolete ("better use gtk_target_list_add_text_targets")] public static readonly TargetEntry PlainTextEntry = new TargetEntry ("text/plain", 0, (uint)TargetType.PhotoList); public static readonly TargetEntry PhotoListEntry = new TargetEntry ("application/x-fspot-photos", 0, (uint)TargetType.PhotoList); [Obsolete ("Use gtk_target_list_add_uri_target")] public static readonly TargetEntry UriListEntry = new TargetEntry ("text/uri-list", 0, (uint)TargetType.UriList); public static readonly TargetEntry TagListEntry = new TargetEntry ("application/x-fspot-tags", 0, (uint)TargetType.TagList); /* FIXME: maybe we need just one fspot-query-item */ public static readonly TargetEntry UriQueryEntry = new TargetEntry ("application/x-fspot-uri-query-item", 0, (uint)TargetType.UriQueryItem); public static readonly TargetEntry TagQueryEntry = new TargetEntry ("application/x-fspot-tag-query-item", 0, (uint)TargetType.TagQueryItem); public static readonly TargetEntry RootWindowEntry = new TargetEntry ("application/x-root-window-drop", 0, (uint)TargetType.RootWindow); public static readonly TargetEntry CopyFilesEntry = new TargetEntry ("x-special/gnome-copied-files", 0, (uint)TargetType.CopyFiles); } } f-spot-0.8.2/src/Clients/MainApp/FSpot/JobStore.cs0000644000175000017500000001140411503404761022070 0ustar00rubenruben00000000000000/* * JobStore.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details. * */ using System.Collections; using System.IO; using System; using Banshee.Kernel; using FSpot.Jobs; using FSpot.Database; using FSpot; using FSpot.Core; using Hyena; using Hyena.Data.Sqlite; namespace FSpot { public abstract class Job : DbItem, IJob { public Job (uint id, string job_options, JobPriority job_priority, DateTime run_at, bool persistent) : base (id) { this.job_options = job_options; this.job_priority = job_priority; this.run_at = run_at; this.persistent = persistent; } private string job_options; public string JobOptions { get { return job_options; } set { job_options = value; } } private JobPriority job_priority; internal JobPriority JobPriority { get { return job_priority; } set { job_priority = value; } } //Not in use yet ! private DateTime run_at; public DateTime RunAt { get { return run_at; } // set { run_at = value; } } private bool persistent; public bool Persistent { get { return persistent; } } public event EventHandler Finished; private JobStatus status; public JobStatus Status { get { return status; } set { status = value; switch (value) { case JobStatus.Finished: case JobStatus.Failed: if (Finished != null) Finished (this, new EventArgs ()); break; default: break; } } } public void Run () { Status = JobStatus.Running; if (Execute ()) Status = JobStatus.Finished; else Status = JobStatus.Failed; } protected abstract bool Execute (); } public class JobStore : DbStore { internal static void CreateTable (FSpotDatabaseConnection database) { if (database.TableExists ("jobs")) { return; } database.Execute ( "CREATE TABLE jobs (\n" + " id INTEGER PRIMARY KEY NOT NULL, \n" + " job_type TEXT NOT NULL, \n" + " job_options TEXT NOT NULL, \n" + " run_at INTEGER, \n" + " job_priority INTEGER NOT NULL\n" + ")"); } private Job LoadItem (IDataReader reader) { return (Job) Activator.CreateInstance ( Type.GetType (reader ["job_type"].ToString ()), Convert.ToUInt32 (reader["id"]), reader["job_options"].ToString (), Convert.ToInt32 (reader["run_at"]), (JobPriority) Convert.ToInt32 (reader["job_priority"]), true); } private void LoadAllItems () { IDataReader reader = Database.Query ("SELECT id, job_type, job_options, run_at, job_priority FROM jobs"); Scheduler.Suspend (); while (reader.Read ()) { Job job = LoadItem (reader); AddToCache (job); job.Finished += HandleRemoveJob; Scheduler.Schedule (job, job.JobPriority); job.Status = JobStatus.Scheduled; } reader.Dispose (); } public Job Create (Type job_type, string job_options) { return Create (job_type, job_options, DateTime.Now, JobPriority.Lowest, false); } public Job CreatePersistent (Type job_type, string job_options) { return Create (job_type, job_options, DateTime.Now, JobPriority.Lowest, true); } internal Job Create (Type job_type, string job_options, DateTime run_at, JobPriority job_priority, bool persistent) { int id = 0; if (persistent) id = Database.Execute (new HyenaSqliteCommand ("INSERT INTO jobs (job_type, job_options, run_at, job_priority) VALUES (?, ?, ?, ?)", job_type.ToString (), job_options, DateTimeUtil.FromDateTime (run_at), Convert.ToInt32 (job_priority))); Job job = (Job) Activator.CreateInstance (job_type, (uint)id, job_options, run_at, job_priority, true); AddToCache (job); job.Finished += HandleRemoveJob; Scheduler.Schedule (job, job.JobPriority); job.Status = JobStatus.Scheduled; EmitAdded (job); return job; } public override void Commit (Job item) { if (item.Persistent) Database.Execute(new HyenaSqliteCommand("UPDATE jobs " + "SET job_type = ? " + "SET job_options = ? " + "SET run_at = ? " + "SET job_priority = ? " + "WHERE id = ?", "Empty", //FIXME item.JobOptions, DateTimeUtil.FromDateTime (item.RunAt), item.JobPriority, item.Id)); EmitChanged (item); } public override Job Get (uint id) { // we never use this return null; } public override void Remove (Job item) { RemoveFromCache (item); if ((item as Job).Persistent) Database.Execute (new HyenaSqliteCommand ("DELETE FROM jobs WHERE id = ?", item.Id)); EmitRemoved (item); } public void HandleRemoveJob (Object o, EventArgs e) { Remove (o as Job); } public JobStore (FSpotDatabaseConnection database, bool is_new) : base (database, true) { if (is_new || !Database.TableExists ("jobs")) { CreateTable (database); } else { LoadAllItems (); } } } }f-spot-0.8.2/src/Clients/MainApp/FSpot/ControlOverlay.cs0000644000175000017500000001441611503404761023331 0ustar00rubenruben00000000000000/* * ControlOverlay.cs * * Copyright 2007 Novell Inc. * * Author * Larry Ewing * * See COPYING for license information. */ using Cairo; using System; using Gtk; using FSpot.Widgets; using FSpot.Utils; using FSpot.Core; using FSpot.Gui; namespace FSpot { public class ControlOverlay : Window { Widget host; Window host_toplevel; bool composited; VisibilityType visibility; int round = 12; DelayedOperation hide; DelayedOperation fade; DelayedOperation dismiss; bool auto_hide = true; double x_align = 0.5; double y_align = 1.0; public enum VisibilityType { None, Partial, Full } public double XAlign { get { return x_align; } set { x_align = value; Relocate (); } } public double YAlign { get { return y_align; } set { y_align = value; Relocate (); } } public bool AutoHide { get { return auto_hide; } set { auto_hide = value; } } public VisibilityType Visibility { get { return visibility; } set { if (dismiss.IsPending && value != VisibilityType.None) return; switch (value) { case VisibilityType.None: FadeToTarget (0.0); break; case VisibilityType.Partial: FadeToTarget (0.4); break; case VisibilityType.Full: FadeToTarget (0.8); break; } visibility = value; } } public ControlOverlay (Gtk.Widget host) : base (WindowType.Popup) { this.host = host; Decorated = false; DestroyWithParent = true; Name = "FullscreenContainer"; AllowGrow = true; //AllowShrink = true; KeepAbove = true; host_toplevel = (Gtk.Window) host.Toplevel; TransientFor = host_toplevel; host_toplevel.ConfigureEvent += HandleHostConfigure; host_toplevel.SizeAllocated += HandleHostSizeAllocated; AddEvents ((int) (Gdk.EventMask.PointerMotionMask)); hide = new DelayedOperation (2000, HideControls); fade = new DelayedOperation (40, FadeToTarget); dismiss = new DelayedOperation (2000, delegate { /* do nothing */ return false; }); } protected override void OnDestroyed () { hide.Stop (); fade.Stop (); base.OnDestroyed (); } public bool HideControls () { int x, y; Gdk.ModifierType type; if (!auto_hide) return false; if (IsRealized) { GdkWindow.GetPointer (out x, out y, out type); if (Allocation.Contains (x, y)) { hide.Start (); return true; } } hide.Stop (); Visibility = VisibilityType.None; return false; } protected virtual void ShapeSurface (Context cr, Cairo.Color color) { cr.Operator = Operator.Source; Cairo.Pattern p = new Cairo.SolidPattern (new Cairo.Color (0, 0, 0, 0)); cr.Source = p; p.Destroy (); cr.Paint (); cr.Operator = Operator.Over; Cairo.Pattern r = new SolidPattern (color); cr.Source = r; r.Destroy (); cr.MoveTo (round, 0); if (x_align == 1.0) cr.LineTo (Allocation.Width, 0); else cr.Arc (Allocation.Width - round, round, round, - Math.PI * 0.5, 0); if (x_align == 1.0 || y_align == 1.0) cr.LineTo (Allocation.Width, Allocation.Height); else cr.Arc (Allocation.Width - round, Allocation.Height - round, round, 0, Math.PI * 0.5); if (y_align == 1.0) cr.LineTo (0, Allocation.Height); else cr.Arc (round, Allocation.Height - round, round, Math.PI * 0.5, Math.PI); cr.Arc (round, round, round, Math.PI, Math.PI * 1.5); cr.ClosePath (); cr.Fill (); } double target; double opacity = 0; bool FadeToTarget () { //Log.Debug ("op {0}\ttarget{1}", opacity, target); Visible = (opacity > 0.05); if (Math.Abs (target - opacity) < .05) return false; if (target > opacity) opacity += .04; else opacity -= .04; if (Visible) CompositeUtils.SetWinOpacity (this, opacity); else Hide (); return true; } bool FadeToTarget (double target) { //Log.Debug ("FadeToTarget {0}", target); Realize (); this.target = target; fade.Start (); if (target > 0.0) hide.Restart (); return false; } private void ShapeWindow () { if (composited) return; Gdk.Pixmap bitmap = new Gdk.Pixmap (GdkWindow, Allocation.Width, Allocation.Height, 1); Context cr = Gdk.CairoHelper.Create (bitmap); ShapeCombineMask (bitmap, 0, 0); ShapeSurface (cr, new Color (1, 1, 1)); ShapeCombineMask (bitmap, 0, 0); ((IDisposable)cr).Dispose (); bitmap.Dispose (); } protected override bool OnExposeEvent (Gdk.EventExpose args) { Gdk.Color c = Style.Background (State); Context cr = Gdk.CairoHelper.Create (GdkWindow); ShapeSurface (cr, new Cairo.Color (c.Red / (double) ushort.MaxValue, c.Blue / (double) ushort.MaxValue, c.Green / (double) ushort.MaxValue, 0.8)); ((IDisposable)cr).Dispose (); return base.OnExposeEvent (args); } protected override bool OnMotionNotifyEvent (Gdk.EventMotion args) { this.Visibility = VisibilityType.Full; base.OnMotionNotifyEvent (args); return false; } protected override void OnSizeAllocated (Gdk.Rectangle rec) { base.OnSizeAllocated (rec); Relocate (); ShapeWindow (); QueueDraw (); } private void HandleHostSizeAllocated (object o, SizeAllocatedArgs args) { Relocate (); } private void HandleHostConfigure (object o, ConfigureEventArgs args) { Relocate (); } private void Relocate () { int x, y; if (!IsRealized || !host_toplevel.IsRealized) return; host.GdkWindow.GetOrigin (out x, out y); int xOrigin = x; int yOrigin = y; x += (int) (host.Allocation.Width * x_align); y += (int) (host.Allocation.Height * y_align); x -= (int) (Allocation.Width * 0.5); y -= (int) (Allocation.Height * 0.5); x = Math.Max (0, Math.Min (x, xOrigin + host.Allocation.Width - Allocation.Width)); y = Math.Max (0, Math.Min (y, yOrigin + host.Allocation.Height - Allocation.Height)); Move (x, y); } protected override void OnRealized () { composited = CompositeUtils.IsComposited (Screen) && CompositeUtils.SetRgbaColormap (this); AppPaintable = composited; base.OnRealized (); ShapeWindow (); Relocate (); } public void Dismiss () { Visibility = VisibilityType.None; dismiss.Start (); } protected override void OnMapped () { base.OnMapped (); Relocate (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/MetaStore.cs0000644000175000017500000000673411503404761022256 0ustar00rubenruben00000000000000using Gdk; using Gtk; using System.Collections; using System.IO; using System; using FSpot; using FSpot.Core; using FSpot.Database; using Hyena.Data.Sqlite; namespace FSpot { public class MetaItem : DbItem { private string name; public string Name { get { return name; } set { name = value; } } private string data; public string Value { get { return data; } set { data = value; } } public int ValueAsInt { get { return System.Int32.Parse (Value); } set { Value = value.ToString (); } } public MetaItem (uint id, string name, string data) : base (id) { this.name = name; this.data = data; } } public class MetaStore : DbStore { private const string version = "F-Spot Version"; private const string db_version = "F-Spot Database Version"; private const string hidden = "Hidden Tag Id"; public MetaItem FSpotVersion { get { return GetByName (version); } } public MetaItem DatabaseVersion { get { return GetByName (db_version); } } public MetaItem HiddenTagId { get { return GetByName (hidden); } } private MetaItem GetByName (string name) { foreach (MetaItem i in this.item_cache.Values) if (i.Name == name) return i; // Otherwise make it and return it return Create (name, null); } private void CreateTable () { Database.Execute ( "CREATE TABLE meta (\n" + " id INTEGER PRIMARY KEY NOT NULL, \n" + " name TEXT UNIQUE NOT NULL, \n" + " data TEXT\n" + ")"); } private void CreateDefaultItems (bool is_new) { Create (version, Defines.VERSION); Create (db_version, (is_new) ? FSpot.Database.Updater.LatestVersion.ToString () : "0"); // Get the hidden tag id, if it exists try { string id = Database.Query ("SELECT id FROM tags WHERE name = 'Hidden'"); Create (hidden, id); } catch (Exception) {} } private void LoadAllItems () { IDataReader reader = Database.Query("SELECT id, name, data FROM meta"); while (reader.Read ()) { uint id = Convert.ToUInt32 (reader ["id"]); string name = reader ["name"].ToString (); string data = null; if (reader ["data"] != null) data = reader ["data"].ToString (); MetaItem item = new MetaItem (id, name, data); AddToCache (item); } reader.Dispose (); if (FSpotVersion.Value != Defines.VERSION) { FSpotVersion.Value = Defines.VERSION; Commit (FSpotVersion); } } private MetaItem Create (string name, string data) { uint id = (uint)Database.Execute(new HyenaSqliteCommand("INSERT INTO meta (name, data) VALUES (?, ?)", name, (data == null) ? "NULL" : data )); //FIXME This smells bad. This line used to be *before* the //Command.executeNonQuery. It smells of a bug, but there might //have been a reason for this MetaItem item = new MetaItem (id, name, data); AddToCache (item); EmitAdded (item); return item; } public override void Commit (MetaItem item) { Database.Execute(new HyenaSqliteCommand("UPDATE meta SET data = ? WHERE name = ?", item.Value, item.Name)); EmitChanged (item); } public override MetaItem Get (uint id) { return LookupInCache (id); } public override void Remove (MetaItem item) { RemoveFromCache (item); Database.Execute (new HyenaSqliteCommand ("DELETE FROM meta WHERE id = ?", item.Id)); EmitRemoved (item); } // Constructor public MetaStore (FSpotDatabaseConnection database, bool is_new) : base (database, true) { if (is_new || !Database.TableExists ("meta")) { CreateTable (); CreateDefaultItems (is_new); } else LoadAllItems (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/ColorManagement.cs0000644000175000017500000000664311503404761023425 0ustar00rubenruben00000000000000/* * FSpot.Core.ColorManagement.cs * * Author(s): * Vasiliy Kirilichev * Stephane Delcroix * * Copyright (c) 2008-2009 Novell, Inc. * * This is free software. See COPYING for details. * */ using System; using System.IO; using System.Collections.Generic; using FSpot.Core; namespace FSpot { public static class ColorManagement { static string [] search_dir = { "/usr/share/color/icc", Path.Combine (Global.HomeDirectory, ".color/icc"), "/usr/local/share/color/icc " }; static Dictionary profiles; public static IDictionary Profiles { get { if (profiles == null) { profiles = new Dictionary (); Cms.Profile p = Cms.Profile.CreateStandardRgb (); if (!profiles.ContainsKey (p.ProductDescription)) profiles.Add (p.ProductDescription, p); p = Cms.Profile.CreateAlternateRgb (); if (!profiles.ContainsKey (p.ProductDescription)) profiles.Add (p.ProductDescription, p); foreach (var path in search_dir) if (!profiles.ContainsKey (path)) AddProfiles (path, profiles); if (XProfile != null) if (!profiles.ContainsKey ("_x_profile_")) profiles.Add ("_x_profile_", XProfile); } return profiles; } } static Cms.Profile x_profile; public static Cms.Profile XProfile { get { if (x_profile == null) x_profile = Cms.Profile.GetScreenProfile (Gdk.Screen.Default); return x_profile; } } private static void AddProfiles (string path, IDictionary profs) { //recursive search, only RGB color profiles would be added if (Directory.Exists (path)) { string[] IccColorProfilList = System.IO.Directory.GetFiles (path, "*.icc"); foreach (string ColorProfilePath in IccColorProfilList) { Cms.Profile profile = new Cms.Profile (ColorProfilePath); if ((Cms.IccColorSpace)profile.ColorSpace == Cms.IccColorSpace.Rgb && profile.ProductDescription != null && !profs.ContainsKey (profile.ProductDescription)) profs.Add(profile.ProductDescription, profile); } string[] IcmColorProfilList = System.IO.Directory.GetFiles (path, "*.icm"); foreach (string ColorProfilePath in IcmColorProfilList) { Cms.Profile profile = new Cms.Profile (ColorProfilePath); if ((Cms.IccColorSpace)profile.ColorSpace == Cms.IccColorSpace.Rgb && profile.ProductDescription != null && !profs.ContainsKey (profile.ProductDescription)) profs.Add(profile.ProductDescription, profile); } string[] DirList = System.IO.Directory.GetDirectories (path); foreach (string dir in DirList) AddProfiles (dir, profs); } } public static void ApplyProfile (Gdk.Pixbuf pixbuf, Cms.Profile destination_profile) { ApplyProfile (pixbuf, Cms.Profile.CreateStandardRgb (), destination_profile); } public static void ApplyProfile (Gdk.Pixbuf pixbuf, Cms.Profile image_profile, Cms.Profile destination_profile) { if (pixbuf == null || pixbuf.HasAlpha) return; image_profile = image_profile ?? Cms.Profile.CreateStandardRgb (); Cms.Profile [] list = new Cms.Profile [] { image_profile, destination_profile }; Cms.Transform transform = new Cms.Transform (list, PixbufUtils.PixbufCmsFormat (pixbuf), PixbufUtils.PixbufCmsFormat (pixbuf), Cms.Intent.Perceptual, 0x0000); PixbufUtils.ColorAdjust (pixbuf, pixbuf, transform); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/SelectionDataExtensions.cs0000644000175000017500000000632111503404761025142 0ustar00rubenruben00000000000000/* * FSpot.SelectionDataExtensions.cs * * Author(s) * Mike Gemuende * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using System.Text; using System.Linq; using Gtk; using Gdk; using FSpot; using FSpot.Core; using FSpot.Utils; namespace FSpot { public static class SelectionDataExtensions { public static void SetPhotosData (this SelectionData selection_data, Photo [] photos, Atom target) { byte [] data = new byte [photos.Length * sizeof (uint)]; int i = 0; foreach (Photo photo in photos) { byte [] bytes = System.BitConverter.GetBytes (photo.Id); foreach (byte b in bytes) { data[i] = b; i++; } } selection_data.Set (target, 8, data, data.Length); } public static Photo [] GetPhotosData (this SelectionData selection_data) { int size = sizeof (uint); int length = selection_data.Length / size; PhotoStore photo_store = App.Instance.Database.Photos; Photo [] photos = new Photo [length]; for (int i = 0; i < length; i ++) { uint id = System.BitConverter.ToUInt32 (selection_data.Data, i * size); photos[i] = photo_store.Get (id); } return photos; } public static void SetTagsData (this SelectionData selection_data, Tag [] tags, Atom target) { byte [] data = new byte [tags.Length * sizeof (uint)]; int i = 0; foreach (Tag tag in tags) { byte [] bytes = System.BitConverter.GetBytes (tag.Id); foreach (byte b in bytes) { data[i] = b; i++; } } selection_data.Set (target, 8, data, data.Length); } public static Tag [] GetTagsData (this SelectionData selection_data) { int size = sizeof (uint); int length = selection_data.Length / size; TagStore tag_store = App.Instance.Database.Tags; Tag [] tags = new Tag [length]; for (int i = 0; i < length; i ++) { uint id = System.BitConverter.ToUInt32 (selection_data.Data, i * size); tags[i] = tag_store.Get (id); } return tags; } public static string GetStringData (this SelectionData selection_data) { if (selection_data.Length <= 0) return String.Empty; try { return Encoding.UTF8.GetString (selection_data.Data); } catch (Exception) { return String.Empty; } } public static void SetUriListData (this SelectionData selection_data, UriList uri_list, Atom target) { Byte [] data = Encoding.UTF8.GetBytes (uri_list.ToString ()); selection_data.Set (target, 8, data, data.Length); } public static void SetUriListData (this SelectionData selection_data, UriList uri_list) { selection_data.SetUriListData (uri_list, Atom.Intern ("text/uri-list", true)); } public static UriList GetUriListData (this SelectionData selection_data) { return new UriList (GetStringData (selection_data)); } public static void SetCopyFiles (this SelectionData selection_data, UriList uri_list) { var uris = (from p in uri_list select p.ToString ()).ToArray (); var data = Encoding.UTF8.GetBytes ("copy\n" + String.Join ("\n", uris)); selection_data.Set (Atom.Intern ("x-special/gnome-copied-files", true), 8, data, data.Length); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/TagStore.cs0000644000175000017500000002356711503404761022106 0ustar00rubenruben00000000000000using Gdk; using Gtk; using Mono.Unix; using System.Collections.Generic; using System.Collections; using System.IO; using System; using FSpot; using FSpot.Core; using FSpot.Database; using FSpot.Jobs; using FSpot.Query; using FSpot.Utils; using Hyena; using Hyena.Data.Sqlite; namespace FSpot { public class InvalidTagOperationException : InvalidOperationException { public Tag tag; public InvalidTagOperationException (Tag t, string message) : base (message) { tag = t; } public Tag Tag { get { return tag; } } } // Sorts tags into an order that it will be safe to delete // them in (eg children first). public class TagRemoveComparer : IComparer { public int Compare (object obj1, object obj2) { Tag t1 = obj1 as Tag; Tag t2 = obj2 as Tag; return Compare (t1, t2); } public int Compare (Tag t1, Tag t2) { if (t1.IsAncestorOf (t2)) return 1; else if (t2.IsAncestorOf (t1)) return -1; else return 0; } } public class TagStore : DbStore { Category root_category; public Category RootCategory { get { return root_category; } } private const string STOCK_ICON_DB_PREFIX = "stock_icon:"; static void SetIconFromString (Tag tag, string icon_string) { if (icon_string == null) { tag.Icon = null; // IconWasCleared automatically set already, override // it in this case since it was NULL in the db. tag.IconWasCleared = false; } else if (icon_string == String.Empty) tag.Icon = null; else if (icon_string.StartsWith (STOCK_ICON_DB_PREFIX)) tag.ThemeIconName = icon_string.Substring (STOCK_ICON_DB_PREFIX.Length); else tag.Icon = GdkUtils.Deserialize (Convert.FromBase64String (icon_string)); } private Tag hidden; public Tag Hidden { get { return hidden; } } public Tag GetTagByName (string name) { foreach (Tag t in this.item_cache.Values) if (t.Name.ToLower () == name.ToLower ()) return t; return null; } public Tag GetTagById (int id) { foreach (Tag t in this.item_cache.Values) if (t.Id == id) return t; return null; } public Tag [] GetTagsByNameStart (string s) { List l = new List (); foreach (Tag t in this.item_cache.Values) { if (t.Name.ToLower ().StartsWith (s.ToLower ())) l.Add (t); } if (l.Count == 0) return null; l.Sort (delegate (Tag t1, Tag t2) {return t2.Popularity.CompareTo (t1.Popularity); }); return l.ToArray (); } // In this store we keep all the items (i.e. the tags) in memory at all times. This is // mostly to simplify handling of the parent relationship between tags, but it also makes it // a little bit faster. We achieve this by passing "true" as the cache_is_immortal to our // base class. private void LoadAllTags () { // Pass 1, get all the tags. IDataReader reader = Database.Query ("SELECT id, name, is_category, sort_priority, icon FROM tags"); while (reader.Read ()) { uint id = Convert.ToUInt32 (reader ["id"]); string name = reader ["name"].ToString (); bool is_category = (Convert.ToUInt32 (reader ["is_category"]) != 0); Tag tag; if (is_category) tag = new Category (null, id, name); else tag = new Tag (null, id, name); if (reader ["icon"] != null) try { SetIconFromString (tag, reader ["icon"].ToString ()); } catch (Exception ex) { Log.Exception ("Unable to load icon for tag " + name, ex); } tag.SortPriority = Convert.ToInt32 (reader["sort_priority"]); AddToCache (tag); } reader.Dispose (); // Pass 2, set the parents. reader = Database.Query ("SELECT id, category_id FROM tags"); while (reader.Read ()) { uint id = Convert.ToUInt32 (reader ["id"]); uint category_id = Convert.ToUInt32 (reader ["category_id"]); Tag tag = Get (id) as Tag; if (tag == null) throw new Exception (String.Format ("Cannot find tag {0}", id)); if (category_id == 0) tag.Category = RootCategory; else { tag.Category = Get (category_id) as Category; if (tag.Category == null) Log.Warning ("Tag Without category found"); } } reader.Dispose (); //Pass 3, set popularity reader = Database.Query ("SELECT tag_id, COUNT (*) AS popularity FROM photo_tags GROUP BY tag_id"); while (reader.Read ()) { Tag t = Get (Convert.ToUInt32 (reader ["tag_id"])) as Tag; if (t != null) t.Popularity = Convert.ToInt32 (reader ["popularity"]); } reader.Dispose (); if (FSpot.App.Instance.Database.Meta.HiddenTagId.Value != null) hidden = LookupInCache ((uint) FSpot.App.Instance.Database.Meta.HiddenTagId.ValueAsInt) as Tag; } private void CreateTable () { Database.Execute ( "CREATE TABLE tags (\n" + " id INTEGER PRIMARY KEY NOT NULL, \n" + " name TEXT UNIQUE, \n" + " category_id INTEGER, \n" + " is_category BOOLEAN, \n" + " sort_priority INTEGER, \n" + " icon TEXT\n" + ")"); } private void CreateDefaultTags () { Category favorites_category = CreateCategory (RootCategory, Catalog.GetString ("Favorites"), false); favorites_category.ThemeIconName = "emblem-favorite"; favorites_category.SortPriority = -10; Commit (favorites_category); Tag hidden_tag = CreateTag (RootCategory, Catalog.GetString ("Hidden"), false); hidden_tag.ThemeIconName = "emblem-readonly"; hidden_tag.SortPriority = -9; this.hidden = hidden_tag; Commit (hidden_tag); FSpot.App.Instance.Database.Meta.HiddenTagId.ValueAsInt = (int) hidden_tag.Id; FSpot.App.Instance.Database.Meta.Commit (FSpot.App.Instance.Database.Meta.HiddenTagId); Tag people_category = CreateCategory (RootCategory, Catalog.GetString ("People"), false); people_category.ThemeIconName = "emblem-people"; people_category.SortPriority = -8; Commit (people_category); Tag places_category = CreateCategory (RootCategory, Catalog.GetString ("Places"), false); places_category.ThemeIconName = "emblem-places"; places_category.SortPriority = -8; Commit (places_category); Tag events_category = CreateCategory (RootCategory, Catalog.GetString ("Events"), false); events_category.ThemeIconName = "emblem-event"; events_category.SortPriority = -7; Commit (events_category); } // Constructor public TagStore (FSpotDatabaseConnection database, bool is_new) : base (database, true) { // The label for the root category is used in new and edit tag dialogs root_category = new Category (null, 0, Catalog.GetString ("(None)")); if (! is_new) { LoadAllTags (); } else { CreateTable (); CreateDefaultTags (); } } private uint InsertTagIntoTable (Category parent_category, string name, bool is_category, bool autoicon) { uint parent_category_id = parent_category.Id; String default_tag_icon_value = autoicon ? null : String.Empty; int id = Database.Execute (new HyenaSqliteCommand ("INSERT INTO tags (name, category_id, is_category, sort_priority, icon)" + "VALUES (?, ?, ?, 0, ?)", name, parent_category_id, is_category ? 1 : 0, default_tag_icon_value)); return (uint) id; } public Tag CreateTag (Category category, string name, bool autoicon) { if (category == null) category = RootCategory; uint id = InsertTagIntoTable (category, name, false, autoicon); Tag tag = new Tag (category, id, name); tag.IconWasCleared = !autoicon; AddToCache (tag); EmitAdded (tag); return tag; } public Category CreateCategory (Category parent_category, string name, bool autoicon) { if (parent_category == null) parent_category = RootCategory; uint id = InsertTagIntoTable (parent_category, name, true, autoicon); Category new_category = new Category (parent_category, id, name); new_category.IconWasCleared = !autoicon; AddToCache (new_category); EmitAdded (new_category); return new_category; } public override Tag Get (uint id) { if (id == 0) return RootCategory; else return LookupInCache (id); } public override void Remove (Tag tag) { Category category = tag as Category; if (category != null && category.Children != null && category.Children.Count > 0) throw new InvalidTagOperationException (category, "Cannot remove category that contains children"); RemoveFromCache (tag); tag.Category = null; Database.Execute (new HyenaSqliteCommand ("DELETE FROM tags WHERE id = ?", tag.Id)); EmitRemoved (tag); } private string GetIconString (Tag tag) { if (tag.ThemeIconName != null) return STOCK_ICON_DB_PREFIX + tag.ThemeIconName; if (tag.Icon == null) { if (tag.IconWasCleared) return String.Empty; return null; } byte [] data = GdkUtils.Serialize (tag.Icon); return Convert.ToBase64String (data); } public override void Commit (Tag tag) { Commit (tag, false); } public void Commit (Tag tag, bool update_xmp) { Commit (new Tag[] {tag}, update_xmp); } public void Commit (Tag [] tags, bool update_xmp) { // TODO. bool use_transactions = update_xmp;//!Database.InTransaction && update_xmp; //if (use_transactions) // Database.BeginTransaction (); // FIXME: this hack is used, because HyenaSqliteConnection does not support // the InTransaction propery if (use_transactions) { try { Database.BeginTransaction (); } catch { use_transactions = false; } } foreach (Tag tag in tags) { Database.Execute (new HyenaSqliteCommand ("UPDATE tags SET name = ?, category_id = ?, " + "is_category = ?, sort_priority = ?, icon = ? WHERE id = ?", tag.Name, tag.Category.Id, tag is Category ? 1 : 0, tag.SortPriority, GetIconString (tag), tag.Id)); if (update_xmp && Preferences.Get (Preferences.METADATA_EMBED_IN_IMAGE)) { Photo [] photos = App.Instance.Database.Photos.Query (new Tag [] { tag }); foreach (Photo p in photos) if (p.HasTag (tag)) // the query returns all the pics of the tag and all its child. this avoids updating child tags SyncMetadataJob.Create (App.Instance.Database.Jobs, p); } } if (use_transactions) Database.CommitTransaction (); EmitChanged (tags); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/ExportStore.cs0000644000175000017500000001015111503404761022635 0ustar00rubenruben00000000000000using Gdk; using Gtk; using System.Collections; using System.IO; using System; using FSpot; using FSpot.Core; using FSpot.Database; using Hyena.Data.Sqlite; namespace FSpot { public class ExportItem : DbItem { private uint image_id; public uint ImageId { get { return image_id; } set { image_id = value; } } private uint image_version_id; public uint ImageVersionId { get { return image_version_id; } set { image_version_id = value; } } private string export_type; public string ExportType { get { return export_type; } set { export_type = value; } } private string export_token; public string ExportToken { get { return export_token; } set { export_token = value; } } public ExportItem (uint id, uint image_id, uint image_version_id, string export_type, string export_token) : base (id) { this.image_id = image_id; this.image_version_id = image_version_id; this.export_type = export_type; this.export_token = export_token; } } public class ExportStore : DbStore { public const string FlickrExportType = "fspot:Flickr"; public const string OldFolderExportType = "fspot:Folder"; //This is obsolete and meant to be remove once db reach rev4 public const string FolderExportType = "fspot:FolderUri"; public const string PicasaExportType = "fspot:Picasa"; public const string SmugMugExportType = "fspot:SmugMug"; public const string Gallery2ExportType = "fspot:Gallery2"; private void CreateTable () { Database.Execute ( "CREATE TABLE exports (\n" + " id INTEGER PRIMARY KEY NOT NULL, \n" + " image_id INTEGER NOT NULL, \n" + " image_version_id INTEGER NOT NULL, \n" + " export_type TEXT NOT NULL, \n" + " export_token TEXT NOT NULL\n" + ")"); } private ExportItem LoadItem (IDataReader reader) { return new ExportItem (Convert.ToUInt32 (reader["id"]), Convert.ToUInt32 (reader["image_id"]), Convert.ToUInt32 (reader["image_version_id"]), reader["export_type"].ToString (), reader["export_token"].ToString ()); } private void LoadAllItems () { IDataReader reader = Database.Query("SELECT id, image_id, image_version_id, export_type, export_token FROM exports"); while (reader.Read ()) { AddToCache (LoadItem (reader)); } reader.Dispose (); } public ExportItem Create (uint image_id, uint image_version_id, string export_type, string export_token) { int id = Database.Execute(new HyenaSqliteCommand("INSERT INTO exports (image_id, image_version_id, export_type, export_token) VALUES (?, ?, ?, ?)", image_id, image_version_id, export_type, export_token)); ExportItem item = new ExportItem ((uint)id, image_id, image_version_id, export_type, export_token); AddToCache (item); EmitAdded (item); return item; } public override void Commit (ExportItem item) { Database.Execute(new HyenaSqliteCommand("UPDATE exports SET image_id = ?, image_version_id = ?, export_type = ? SET export_token = ? WHERE id = ?", item.ImageId, item.ImageVersionId, item.ExportType, item.ExportToken, item.Id)); EmitChanged (item); } public override ExportItem Get (uint id) { // we never use this return null; } public ArrayList GetByImageId (uint image_id, uint image_version_id) { IDataReader reader = Database.Query(new HyenaSqliteCommand("SELECT id, image_id, image_version_id, export_type, export_token FROM exports WHERE image_id = ? AND image_version_id = ?", image_id, image_version_id)); ArrayList list = new ArrayList (); while (reader.Read ()) { list.Add (LoadItem (reader)); } reader.Dispose (); return list; } public override void Remove (ExportItem item) { RemoveFromCache (item); Database.Execute(new HyenaSqliteCommand("DELETE FROM exports WHERE id = ?", item.Id)); EmitRemoved (item); } // Constructor public ExportStore (FSpotDatabaseConnection database, bool is_new) : base (database, true) { if (is_new || !Database.TableExists ("exports")) CreateTable (); else LoadAllItems (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/GroupAdaptor.cs0000644000175000017500000000264611503404761022760 0ustar00rubenruben00000000000000using FSpot.Core; using FSpot.Utils; namespace FSpot { public interface ILimitable { void SetLimits (int min, int max); } public abstract class GroupAdaptor { protected PhotoQuery query; public PhotoQuery Query { get { return query; } } protected bool order_ascending = false; public bool OrderAscending { get { return order_ascending; } set { if (order_ascending != value) { order_ascending = value; Reload(); } } } public abstract int Value (int item) ; public abstract int Count (); public abstract string TickLabel (int item); public abstract string GlassLabel (int item); protected abstract void Reload (); public abstract void SetGlass (int item); public abstract int IndexFromPhoto (IPhoto photo); public abstract IPhoto PhotoFromIndex (int item); public delegate void GlassSetHandler (GroupAdaptor adaptor, int index); public virtual event GlassSetHandler GlassSet; public delegate void ChangedHandler (GroupAdaptor adaptor); public virtual event ChangedHandler Changed; protected void HandleQueryChanged (IBrowsableCollection sender) { Reload (); } public void Dispose () { this.query.Changed -= HandleQueryChanged; } protected GroupAdaptor (PhotoQuery query, bool order_ascending) { this.order_ascending = order_ascending; this.query = query; this.query.Changed += HandleQueryChanged; Reload (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/PhotoView.cs0000644000175000017500000002316411503404761022273 0ustar00rubenruben00000000000000/* * FSpot.PhotoView.cs * * Author(s) * Ettore Perazzoli * Larry Ewing * Stephane Delcroix * * This is free software. See COPYING for details. */ using Gdk; using GLib; using Gtk; using System; using System.IO; using System.Collections.Generic; using System.Xml.Serialization; using Mono.Unix; using FSpot.Core; using FSpot.Widgets; using FSpot.Utils; using Hyena; using FSpot.UI.Dialog; namespace FSpot { public class PhotoView : EventBox { DelayedOperation commit_delay; private PhotoImageView photo_view; private ScrolledWindow photo_view_scrolled; private EventBox background; private Filmstrip filmstrip; VBox inner_vbox; HBox inner_hbox; private Widgets.TagView tag_view; private Entry description_entry; private RatingEntry rating; // Public events. public delegate void PhotoChangedHandler (PhotoView me); public event PhotoChangedHandler PhotoChanged; public delegate void UpdateStartedHandler (PhotoView view); public event UpdateStartedHandler UpdateStarted; public delegate void UpdateFinishedHandler (PhotoView view); public event UpdateFinishedHandler UpdateFinished; public event EventHandler DoubleClicked; public Orientation FilmstripOrientation { get { return filmstrip.Orientation; } } public PhotoImageView View { get { return photo_view; } } public BrowsablePointer Item { get { return photo_view.Item; } } private IBrowsableCollection query; public IBrowsableCollection Query { get { return query; } set { query = value; } } public double Zoom { get { return photo_view.Zoom; } set { photo_view.Zoom = value; } } public double NormalizedZoom { get { return photo_view.NormalizedZoom; } set { photo_view.NormalizedZoom = value; } } public void Reload () { photo_view.Reload (); } private void UpdateDescriptionEntry () { description_entry.Changed -= HandleDescriptionChanged; if (Item.IsValid) { if (description_entry.Sensitive == false) description_entry.Sensitive = true; string desc = Item.Current.Description; if (description_entry.Text != desc) { description_entry.Text = desc == null ? String.Empty : desc; } } else { description_entry.Sensitive = false; description_entry.Text = String.Empty; } description_entry.Changed += HandleDescriptionChanged; } public void UpdateRating () { if (Item.IsValid) UpdateRating ((int)Item.Current.Rating); } public void UpdateRating (int r) { rating.Changed -= HandleRatingChanged; rating.Value = r; rating.Changed += HandleRatingChanged; } private void Update () { if (UpdateStarted != null) UpdateStarted (this); UpdateDescriptionEntry (); UpdateRating (); if (UpdateFinished != null) UpdateFinished (this); } public void ZoomIn () { photo_view.ZoomIn (); } public void ZoomOut () { photo_view.ZoomOut (); } // Event handlers. private void HandleButtonPressEvent (object sender, ButtonPressEventArgs args) { if (args.Event.Type == EventType.TwoButtonPress && args.Event.Button == 1 && DoubleClicked != null) DoubleClicked (this, null); if (args.Event.Type == EventType.ButtonPress && args.Event.Button == 3) { PhotoPopup popup = new PhotoPopup (); popup.Activate (this.Toplevel, args.Event); } } protected override bool OnPopupMenu () { PhotoPopup popup = new PhotoPopup (); popup.Activate (this.Toplevel); return true; } int changed_photo; private bool CommitPendingChanges () { if (commit_delay.IsPending) { commit_delay.Stop (); ((PhotoQuery)query).Commit (changed_photo); } return true; } private void HandleDescriptionChanged (object sender, EventArgs args) { if (!Item.IsValid) return; ((Photo)Item.Current).Description = description_entry.Text; if (commit_delay.IsPending) if (changed_photo == Item.Index) commit_delay.Stop (); else CommitPendingChanges (); changed_photo = Item.Index; commit_delay.Start (); } private void HandleRatingChanged (object o, EventArgs e) { if (!Item.IsValid) return; ((Photo)Item.Current).Rating = (uint)(o as Widgets.RatingEntry).Value; if (commit_delay.IsPending) if (changed_photo == Item.Index) commit_delay.Stop(); else CommitPendingChanges (); changed_photo = Item.Index; commit_delay.Start (); } public void UpdateTagView () { tag_view.DrawTags (); tag_view.QueueDraw (); } void HandlePhotoChanged (object sender, EventArgs e) { if (query is PhotoQuery) { CommitPendingChanges (); } tag_view.Current = Item.Current; Update (); if (this.PhotoChanged != null) PhotoChanged (this); } private void HandleDestroy (object sender, System.EventArgs args) { CommitPendingChanges (); Dispose (); } private void OnPreferencesChanged (object sender, NotifyEventArgs args) { LoadPreference (args.Key); } private void LoadPreference (String key) { switch (key) { case Preferences.FILMSTRIP_ORIENTATION: PlaceFilmstrip ((Orientation) Preferences.Get (key)); break; } } public void PlaceFilmstrip (Orientation pos) { PlaceFilmstrip (pos, false); } public void PlaceFilmstrip (Orientation pos, bool force) { if (!force && filmstrip.Orientation == pos) return; filmstrip.Orientation = pos; System.Collections.IEnumerator widgets; switch (pos) { case Orientation.Horizontal: widgets = inner_hbox.AllChildren.GetEnumerator (); while (widgets.MoveNext ()) if (widgets.Current == filmstrip) { inner_hbox.Remove (filmstrip); break; } inner_vbox.PackStart (filmstrip, false, false, 0); inner_vbox.ReorderChild (filmstrip, 0); break; case Orientation.Vertical: widgets = inner_vbox.AllChildren.GetEnumerator (); while (widgets.MoveNext ()) if (widgets.Current == filmstrip) { inner_vbox.Remove (filmstrip); break; } inner_hbox.PackEnd (filmstrip, false, false, 0); break; } Preferences.Set (Preferences.FILMSTRIP_ORIENTATION, (int) pos); } public bool FilmStripVisibility { get { return filmstrip.Visible; } set { filmstrip.Visible = value; } } public PhotoView (IBrowsableCollection query) : base () { this.query = query; commit_delay = new DelayedOperation (1000, new GLib.IdleHandler (CommitPendingChanges)); this.Destroyed += HandleDestroy; Name = "ImageContainer"; Box vbox = new VBox (false, 6); Add (vbox); background = new EventBox (); Frame frame = new Frame (); background.Add (frame); frame.ShadowType = ShadowType.In; vbox.PackStart (background, true, true, 0); inner_vbox = new VBox (false , 2); inner_hbox = new HBox (false , 2); frame.Add (inner_hbox); BrowsablePointer bp = new BrowsablePointer (query, -1); photo_view = new PhotoImageView (bp); filmstrip = new Filmstrip (bp); filmstrip.ThumbOffset = 1; filmstrip.Spacing = 4; filmstrip.ThumbSize = 75; PlaceFilmstrip ((Orientation) Preferences.Get (Preferences.FILMSTRIP_ORIENTATION), true); photo_view.PhotoChanged += HandlePhotoChanged; photo_view_scrolled = new ScrolledWindow (null, null); photo_view_scrolled.SetPolicy (PolicyType.Automatic, PolicyType.Automatic); photo_view_scrolled.ShadowType = ShadowType.None; photo_view_scrolled.Add (photo_view); photo_view_scrolled.Child.ButtonPressEvent += HandleButtonPressEvent; photo_view.AddEvents ((int) EventMask.KeyPressMask); inner_vbox.PackStart (photo_view_scrolled, true, true, 0); inner_hbox.PackStart (inner_vbox, true, true, 0); HBox lower_hbox = new HBox (false, 2); //inner_hbox.BorderWidth = 6; tag_view = new Widgets.TagView (); lower_hbox.PackStart (tag_view, false, true, 0); Label comment = new Label (Catalog.GetString ("Description:")); lower_hbox.PackStart (comment, false, false, 0); description_entry = new Entry (); lower_hbox.PackStart (description_entry, true, true, 0); description_entry.Changed += HandleDescriptionChanged; rating = new RatingEntry () { HasFrame = false, AlwaysShowEmptyStars = true }; lower_hbox.PackStart (rating, false, false, 0); rating.Changed += HandleRatingChanged; SetColors (); inner_vbox.PackStart (lower_hbox, false, true, 0); vbox.ShowAll (); Realized += delegate (object o, EventArgs e) {SetColors ();}; Preferences.SettingChanged += OnPreferencesChanged; } ~PhotoView () { Hyena.Log.DebugFormat ("Finalizer called on {0}. Should be Disposed", GetType ()); Dispose (false); } public override void Dispose () { Dispose (true); base.Dispose (); System.GC.SuppressFinalize (this); } bool is_disposed = false; protected virtual void Dispose (bool disposing) { if (is_disposed) return; if (disposing) { //Free managed resources filmstrip.Dispose (); } is_disposed = true; } private void SetColors () { GtkUtil.ModifyColors (filmstrip); GtkUtil.ModifyColors (tag_view); GtkUtil.ModifyColors (photo_view); GtkUtil.ModifyColors (background); GtkUtil.ModifyColors (photo_view_scrolled); GtkUtil.ModifyColors (rating); Gdk.Color dark = Style.Dark (Gtk.StateType.Normal); filmstrip.ModifyBg (Gtk.StateType.Normal, dark); tag_view.ModifyBg (Gtk.StateType.Normal, dark); photo_view.ModifyBg (Gtk.StateType.Normal, dark); background.ModifyBg (Gtk.StateType.Normal, dark); photo_view_scrolled.ModifyBg (Gtk.StateType.Normal, dark); rating.ModifyBg (Gtk.StateType.Normal, dark); } protected override void OnStyleSet (Style previous) { SetColors (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/main.cs0000644000175000017500000002621411503404761021272 0ustar00rubenruben00000000000000using Gtk; using System; using System.Reflection; using System.IO; using System.Runtime.InteropServices; using System.Text; using System.Collections; using System.Collections.Generic; using Mono.Unix; using Mono.Addins; using Mono.Addins.Setup; using FSpot.Core; using FSpot.Utils; using FSpot.UI.Dialog; using FSpot.Extensions; using FSpot.Imaging; using Hyena; using Hyena.CommandLine; using Hyena.Gui; namespace FSpot { public static class Driver { private static void ShowVersion () { Console.WriteLine ("F-Spot {0}", Defines.VERSION); Console.WriteLine ("http://f-spot.org"); Console.WriteLine ("\t(c)2003-2009, Novell Inc"); Console.WriteLine ("\t(c)2009 Stephane Delcroix"); Console.WriteLine("Personal photo management for the GNOME Desktop"); } private static void ShowAssemblyVersions () { ShowVersion (); Console.WriteLine (); Console.WriteLine ("Mono/.NET Version: " + Environment.Version.ToString ()); Console.WriteLine (String.Format ("{0}Assembly Version Information:", Environment.NewLine)); foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies ()) { AssemblyName name = asm.GetName (); Console.WriteLine ("\t" + name.Name + " (" + name.Version.ToString () + ")"); } } private static void ShowHelp () { Console.WriteLine ("Usage: f-spot [options...] [files|URIs...]"); Console.WriteLine (); Hyena.CommandLine.Layout commands = new Hyena.CommandLine.Layout ( new LayoutGroup ("help", "Help Options", new LayoutOption ("help", "Show this help"), new LayoutOption ("help-options", "Show command line options"), new LayoutOption ("help-all", "Show all options"), new LayoutOption ("version", "Show version information"), new LayoutOption ("versions", "Show detailed version information")), new LayoutGroup ("options", "General options", new LayoutOption ("basedir=DIR", "Path to the photo database folder"), new LayoutOption ("import=URI", "Import from the given uri"), new LayoutOption ("photodir=DIR", "Default import folder"), new LayoutOption ("view ITEM", "View file(s) or directories"), new LayoutOption ("shutdown", "Shut down a running instance of F-Spot"), new LayoutOption ("slideshow", "Display a slideshow"), new LayoutOption ("debug", "Run in debug mode"))); if (ApplicationContext.CommandLine.Contains ("help-all")) { Console.WriteLine (commands); return; } List errors = null; foreach (KeyValuePair argument in ApplicationContext.CommandLine.Arguments) { switch (argument.Key) { case "help": Console.WriteLine (commands.ToString ("help")); break; case "help-options": Console.WriteLine (commands.ToString ("options")); break; default: if (argument.Key.StartsWith ("help")) { (errors ?? (errors = new List ())).Add (argument.Key); } break; } } if (errors != null) { Console.WriteLine (commands.LayoutLine (String.Format ( "The following help arguments are invalid: {0}", Hyena.Collections.CollectionExtensions.Join (errors, "--", null, ", ")))); } } static string [] FixArgs (string [] args) { // Makes sure command line arguments are parsed backwards compatible. var outargs = new List (); for (int i = 0; i < args.Length; i++) { switch (args [i]) { case "-h": case "-help": case "-usage": outargs.Add ("--help"); break; case "-V": case "-version": outargs.Add ("--version"); break; case "-versions": outargs.Add ("--versions"); break; case "-shutdown": outargs.Add ("--shutdown"); break; case "-b": case "-basedir": case "--basedir": outargs.Add ("--basedir=" + (i + 1 == args.Length ? String.Empty : args [++i])); break; case "-p": case "-photodir": case "--photodir": outargs.Add ("--photodir=" + (i + 1 == args.Length ? String.Empty : args [++i])); break; case "-i": case "-import": case "--import": outargs.Add ("--import=" + (i + 1 == args.Length ? String.Empty : args [++i])); break; case "-v": case "-view": outargs.Add ("--view"); break; case "-slideshow": outargs.Add ("--slideshow"); break; default: outargs.Add (args [i]); break; } } return outargs.ToArray (); } static int Main (string [] args) { args = FixArgs (args); ApplicationContext.ApplicationName = "F-Spot"; ApplicationContext.TrySetProcessName (Defines.PACKAGE); Paths.ApplicationName = "f-spot"; ThreadAssist.InitializeMainThread (); ThreadAssist.ProxyToMainHandler = RunIdle; XdgThumbnailSpec.DefaultLoader = (uri) => { using (var file = ImageFile.Create (uri)) return file.Load (); }; // Options and Option parsing bool shutdown = false; bool view = false; bool slideshow = false; bool import = false; GLib.GType.Init (); Catalog.Init ("f-spot", Defines.LOCALE_DIR); FSpot.Core.Global.PhotoUri = new SafeUri (Preferences.Get (Preferences.STORAGE_PATH)); ApplicationContext.CommandLine = new CommandLineParser (args, 0); if (ApplicationContext.CommandLine.ContainsStart ("help")) { ShowHelp (); return 0; } if (ApplicationContext.CommandLine.Contains ("version")) { ShowVersion (); return 0; } if (ApplicationContext.CommandLine.Contains ("versions")) { ShowAssemblyVersions (); return 0; } if (ApplicationContext.CommandLine.Contains ("shutdown")) { Log.Information ("Shutting down existing F-Spot server..."); shutdown = true; } if (ApplicationContext.CommandLine.Contains ("slideshow")) { Log.Information ("Running F-Spot in slideshow mode."); slideshow = true; } if (ApplicationContext.CommandLine.Contains ("basedir")) { string dir = ApplicationContext.CommandLine ["basedir"]; if (!string.IsNullOrEmpty (dir)) { FSpot.Core.Global.BaseDirectory = dir; Log.InformationFormat ("BaseDirectory is now {0}", dir); } else { Log.Error ("f-spot: -basedir option takes one argument"); return 1; } } if (ApplicationContext.CommandLine.Contains ("photodir")) { string dir = ApplicationContext.CommandLine ["photodir"]; if (!string.IsNullOrEmpty (dir)) { FSpot.Core.Global.PhotoUri = new SafeUri (dir); Log.InformationFormat ("PhotoDirectory is now {0}", dir); } else { Log.Error ("f-spot: -photodir option takes one argument"); return 1; } } if (ApplicationContext.CommandLine.Contains ("import")) import = true; if (ApplicationContext.CommandLine.Contains ("view")) view = true; if (ApplicationContext.CommandLine.Contains ("debug")) { Log.Debugging = true; // Debug GdkPixbuf critical warnings GLib.LogFunc logFunc = new GLib.LogFunc (GLib.Log.PrintTraceLogFunction); GLib.Log.SetLogHandler ("GdkPixbuf", GLib.LogLevelFlags.Critical, logFunc); // Debug Gtk critical warnings GLib.Log.SetLogHandler ("Gtk", GLib.LogLevelFlags.Critical, logFunc); // Debug GLib critical warnings GLib.Log.SetLogHandler ("GLib", GLib.LogLevelFlags.Critical, logFunc); //Debug GLib-GObject critical warnings GLib.Log.SetLogHandler ("GLib-GObject", GLib.LogLevelFlags.Critical, logFunc); GLib.Log.SetLogHandler ("GLib-GIO", GLib.LogLevelFlags.Critical, logFunc); } // Validate command line options if ((import && (view || shutdown || slideshow)) || (view && (shutdown || slideshow)) || (shutdown && slideshow)) { Log.Error ("Can't mix -import, -view, -shutdown or -slideshow"); return 1; } InitializeAddins (); // Gtk initialization Gtk.Application.Init (Defines.PACKAGE, ref args); // init web proxy globally Platform.WebProxy.Init (); if (File.Exists (Preferences.Get (Preferences.GTK_RC))) { if (File.Exists (Path.Combine (FSpot.Core.Global.BaseDirectory, "gtkrc"))) Gtk.Rc.AddDefaultFile (Path.Combine (FSpot.Core.Global.BaseDirectory, "gtkrc")); FSpot.Core.Global.DefaultRcFiles = Gtk.Rc.DefaultFiles; Gtk.Rc.AddDefaultFile (Preferences.Get (Preferences.GTK_RC)); Gtk.Rc.ReparseAllForSettings (Gtk.Settings.Default, true); } try { Gtk.Window.DefaultIconList = new Gdk.Pixbuf [] { GtkUtil.TryLoadIcon (FSpot.Core.Global.IconTheme, "f-spot", 16, (Gtk.IconLookupFlags)0), GtkUtil.TryLoadIcon (FSpot.Core.Global.IconTheme, "f-spot", 22, (Gtk.IconLookupFlags)0), GtkUtil.TryLoadIcon (FSpot.Core.Global.IconTheme, "f-spot", 32, (Gtk.IconLookupFlags)0), GtkUtil.TryLoadIcon (FSpot.Core.Global.IconTheme, "f-spot", 48, (Gtk.IconLookupFlags)0) }; } catch {} CleanRoomStartup.Startup (Startup); return 0; } static void InitializeAddins () { uint timer = Log.InformationTimerStart ("Initializing Mono.Addins"); try { UpdatePlugins (); } catch (Exception e) { Log.Debug ("Failed to initialize plugins, will remove addin-db and try again."); ResetPluginDb (); } SetupService setupService = new SetupService (AddinManager.Registry); foreach (AddinRepository repo in setupService.Repositories.GetRepositories ()) { if (repo.Url.StartsWith ("http://addins.f-spot.org/")) { Log.InformationFormat ("Unregistering {0}", repo.Url); setupService.Repositories.RemoveRepository (repo.Url); } } Log.DebugTimerPrint (timer, "Mono.Addins Initialization took {0}"); } static void UpdatePlugins () { AddinManager.Initialize (FSpot.Core.Global.BaseDirectory); AddinManager.Registry.Update (null); } static void ResetPluginDb () { // Nuke addin-db var directory = GLib.FileFactory.NewForUri (new SafeUri (FSpot.Core.Global.BaseDirectory)); var list = directory.EnumerateChildren ("standard::name", GLib.FileQueryInfoFlags.None, null); foreach (GLib.FileInfo info in list) { if (info.Name.StartsWith ("addin-db-")) { var file = GLib.FileFactory.NewForPath (Path.Combine (directory.Path, info.Name)); file.DeleteRecursive (); } } // Try again UpdatePlugins (); } static void Startup () { if (ApplicationContext.CommandLine.Contains ("slideshow")) App.Instance.Slideshow (null); else if (ApplicationContext.CommandLine.Contains ("shutdown")) App.Instance.Shutdown (); else if (ApplicationContext.CommandLine.Contains ("view")) { if (ApplicationContext.CommandLine.Files.Count == 0) { Log.Error ("f-spot: -view option takes at least one argument"); System.Environment.Exit (1); } var list = new UriList (); foreach (var f in ApplicationContext.CommandLine.Files) list.AddUnknown (f); if (list.Count == 0) { ShowHelp (); System.Environment.Exit (1); } App.Instance.View (list); } else if (ApplicationContext.CommandLine.Contains ("import")) { string dir = ApplicationContext.CommandLine ["import"]; if (string.IsNullOrEmpty (dir)) { Log.Error ("f-spot: -import option takes one argument"); System.Environment.Exit (1); } App.Instance.Import (dir); } else App.Instance.Organize (); if (!App.Instance.IsRunning) Gtk.Application.Run (); } public static void RunIdle (InvokeHandler handler) { GLib.Idle.Add (delegate { handler (); return false; }); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot/ThumbnailCache.cs0000644000175000017500000000515411503404761023215 0ustar00rubenruben00000000000000/* * FSpot.ThumbnailCache.cs * * Author(s): * Ettore Perazzoli * Larry Ewing * Staphen Delcroix * * This is free software. See COPYING for details. */ using System; using System.Collections; using Gdk; using Hyena; using FSpot.Utils; namespace FSpot { public class ThumbnailCache : IDisposable { // Types. private class Thumbnail { // Uri of the image source public SafeUri uri; // The uncompressed thumbnail. public Pixbuf pixbuf; } // Private members and constants private const int DEFAULT_CACHE_SIZE = 2; private int max_count; private ArrayList pixbuf_mru; private Hashtable pixbuf_hash = new Hashtable (); static private ThumbnailCache defaultcache = new ThumbnailCache (DEFAULT_CACHE_SIZE); // Public API public ThumbnailCache (int max_count) { this.max_count = max_count; pixbuf_mru = new ArrayList (max_count); } static public ThumbnailCache Default { get { return defaultcache; } } public void AddThumbnail (SafeUri uri, Pixbuf pixbuf) { Thumbnail thumbnail = new Thumbnail (); thumbnail.uri = uri; thumbnail.pixbuf = pixbuf; RemoveThumbnailForUri (uri); pixbuf_mru.Insert (0, thumbnail); pixbuf_hash.Add (uri, thumbnail); MaybeExpunge (); } public Pixbuf GetThumbnailForUri (SafeUri uri) { if (! pixbuf_hash.ContainsKey (uri)) return null; Thumbnail item = pixbuf_hash [uri] as Thumbnail; pixbuf_mru.Remove (item); pixbuf_mru.Insert (0, item); if (item.pixbuf == null) return null; return item.pixbuf.ShallowCopy (); } public void RemoveThumbnailForUri (SafeUri uri) { if (! pixbuf_hash.ContainsKey (uri)) return; Thumbnail item = pixbuf_hash [uri] as Thumbnail; pixbuf_hash.Remove (uri); pixbuf_mru.Remove (item); item.pixbuf.Dispose (); } public void Dispose () { foreach (object item in pixbuf_mru) { Thumbnail thumb = item as Thumbnail; pixbuf_hash.Remove (thumb.uri); thumb.pixbuf.Dispose (); } pixbuf_mru.Clear (); System.GC.SuppressFinalize (this); } ~ThumbnailCache () { Log.DebugFormat ("Finalizer called on {0}. Should be Disposed", GetType ()); foreach (object item in pixbuf_mru) { Thumbnail thumb = item as Thumbnail; pixbuf_hash.Remove (thumb.uri); thumb.pixbuf.Dispose (); } pixbuf_mru.Clear (); } // Private utility methods. private void MaybeExpunge () { while (pixbuf_mru.Count > max_count) { Thumbnail thumbnail = pixbuf_mru [pixbuf_mru.Count - 1] as Thumbnail; pixbuf_hash.Remove (thumbnail.uri); pixbuf_mru.RemoveAt (pixbuf_mru.Count - 1); thumbnail.pixbuf.Dispose (); } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/0000777000175000017500000000000011503407446021533 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/EditExceptionDialog.cs0000644000175000017500000000303711503404760025741 0ustar00rubenruben00000000000000/* * FSpot.UI.Dialog.EditExceptionDialog.cs * * Author(s) * Larry Ewing * * This is free software. See COPYING for details. */ using System; using Mono.Unix; using Gtk; using Hyena; using Hyena.Widgets; using FSpot.Core; namespace FSpot.UI.Dialog { public class EditException : Exception { IPhoto item; public IPhoto Item { get { return item; } } public EditException (IPhoto item, Exception e) : base ( String.Format (Catalog.GetString ("Received exception \"{0}\". Unable to save photo {1}"), e.Message, item.Name), e) { this.item = item; } } public class EditExceptionDialog : HigMessageDialog { private const int MaxErrors = 10; public EditExceptionDialog (Gtk.Window parent, Exception [] errors) : base (parent, DialogFlags.DestroyWithParent, Gtk.MessageType.Error, ButtonsType.Ok, Catalog.GetString ("Error editing photo"), GenerateMessage (errors)) { foreach (Exception e in errors) Log.Exception (e); } public EditExceptionDialog (Gtk.Window parent, Exception e, IPhoto item) : this (parent, new EditException (item, e)) { } public EditExceptionDialog (Gtk.Window parent, Exception e) : this (parent, new Exception [] { e }) { } private static string GenerateMessage (Exception [] errors) { string desc = String.Empty; for (int i = 0; i < errors.Length && i < MaxErrors; i++) { Exception e = errors [i]; desc += e.Message + Environment.NewLine; } return desc; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/ImportFailureDialog.cs0000644000175000017500000001126111503404760025755 0ustar00rubenruben00000000000000using System; using System.Collections.Generic; using Gtk; using Mono.Unix; using Hyena; namespace FSpot.UI.Dialog { public class ImportFailureDialog : Gtk.Dialog { // FIXME: Replace with ErrorListDialog from Banshee when possible private VBox inner_vbox; private Label header_label; private Hyena.Widgets.WrapLabel message_label; private TreeView list_view; private Expander details_expander; private AccelGroup accel_group; protected AccelGroup AccelGroup { get { return accel_group; } } public ImportFailureDialog (List files) : base () { BuildUI (); ListView.Model = new ListStore (typeof (string), typeof (string)); ListView.AppendColumn ("Filename", new CellRendererText (), "text", 0); ListView.AppendColumn ("Path", new CellRendererText (), "text", 1); ListView.HeadersVisible = false; Title = Catalog.GetString ("Import failures"); Header = Catalog.GetString ("Some files failed to import"); Message = Catalog.GetString ("Some files could not be imported, they might be corrupt " + "or there might be something wrong with the storage on which they reside."); foreach (SafeUri uri in files) { (ListView.Model as ListStore).AppendValues (uri.GetFilename (), uri.GetBaseUri ().ToString ()); } } private void BuildUI () { // The BorderWidth situation here is a bit nuts b/c the // ActionArea's is set to 5. So we work everything else out // so it all totals to 12. // // WIDGET BorderWidth // Dialog 5 // VBox 2 // inner_vbox 5 => total = 12 // ActionArea 5 => total = 12 BorderWidth = 5; base.VBox.BorderWidth = 0; // This spacing is 2 b/c the inner_vbox and ActionArea should be // 12 apart, and they already have BorderWidth 5 each base.VBox.Spacing = 2; inner_vbox = new VBox () { Spacing = 12, BorderWidth = 5, Visible = true }; base.VBox.PackStart (inner_vbox, true, true, 0); Visible = false; HasSeparator = false; var table = new Table (3, 2, false) { RowSpacing = 12, ColumnSpacing = 16 }; table.Attach (new Image () { IconName = "dialog-error", IconSize = (int)IconSize.Dialog, Yalign = 0.0f }, 0, 1, 0, 3, AttachOptions.Shrink, AttachOptions.Fill | AttachOptions.Expand, 0, 0); table.Attach (header_label = new Label () { Xalign = 0.0f }, 1, 2, 0, 1, AttachOptions.Fill | AttachOptions.Expand, AttachOptions.Shrink, 0, 0); table.Attach (message_label = new Hyena.Widgets.WrapLabel (), 1, 2, 1, 2, AttachOptions.Fill | AttachOptions.Expand, AttachOptions.Shrink, 0, 0); var scrolled_window = new ScrolledWindow () { HscrollbarPolicy = PolicyType.Automatic, VscrollbarPolicy = PolicyType.Automatic, ShadowType = ShadowType.In }; list_view = new TreeView () { HeightRequest = 120, WidthRequest = 200 }; scrolled_window.Add (list_view); table.Attach (details_expander = new Expander (Catalog.GetString ("Details")), 1, 2, 2, 3, AttachOptions.Fill | AttachOptions.Expand, AttachOptions.Fill | AttachOptions.Expand, 0, 0); details_expander.Add (scrolled_window); VBox.PackStart (table, true, true, 0); VBox.Spacing = 12; VBox.ShowAll (); accel_group = new AccelGroup (); AddAccelGroup (accel_group); Button button = new Button (Stock.Close); button.CanDefault = true; button.UseStock = true; button.Show (); button.Clicked += (o, a) => { Destroy (); }; AddActionWidget (button, ResponseType.Close); DefaultResponse = ResponseType.Close; button.AddAccelerator ("activate", accel_group, (uint)Gdk.Key.Return, 0, AccelFlags.Visible); } public string Header { set { header_label.Markup = String.Format("{0}", GLib.Markup.EscapeText(value)); } } public string Message { set { message_label.Text = value; } } public TreeView ListView { get { return list_view; } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/ImportDialog.cs0000644000175000017500000003273211503404760024453 0ustar00rubenruben00000000000000using FSpot.Core; using FSpot.UI.Dialog; using FSpot.Widgets; using FSpot.Utils; using FSpot.Import; using Gtk; using Hyena; using System; using System.Collections.Generic; using Mono.Unix; namespace FSpot.UI.Dialog { public class ImportDialog : BuilderDialog { static readonly string select_folder_label = Catalog.GetString ("Choose Folder..."); private ImportController Controller { get; set; } private TreeStore Sources { get; set; } private static Dictionary history_sources = new Dictionary (); [GtkBeans.Builder.Object] Button cancel_button; [GtkBeans.Builder.Object] Button import_button; [GtkBeans.Builder.Object] CheckButton copy_check; [GtkBeans.Builder.Object] CheckButton duplicate_check; [GtkBeans.Builder.Object] CheckButton recurse_check; [GtkBeans.Builder.Object] CheckButton remove_check; [GtkBeans.Builder.Object] Button remove_warning_button; [GtkBeans.Builder.Object] ComboBox sources_combo; [GtkBeans.Builder.Object] HBox tagentry_box; [GtkBeans.Builder.Object] HPaned import_hpaned; [GtkBeans.Builder.Object] ProgressBar progress_bar; [GtkBeans.Builder.Object] ScrolledWindow icon_scrolled; [GtkBeans.Builder.Object] ScrolledWindow photo_scrolled; [GtkBeans.Builder.Object] Label attachtags_label; private PhotoImageView photo_view; private TagEntry tag_entry; public ImportDialog (ImportController controller, Window parent) : base ("import.ui", "import_dialog") { Controller = controller; BuildUI (parent); ResetPreview (); LoadPreferences (); ScanSources (); ConnectEvents (); } void BuildUI (Window parent) { TransientFor = parent; WindowPosition = WindowPosition.CenterOnParent; photo_view = new PhotoImageView (Controller.Photos); photo_scrolled.Add (photo_view); photo_scrolled.SetSizeRequest (200, 200); photo_view.Show (); GtkUtil.ModifyColors (photo_scrolled); GtkUtil.ModifyColors (photo_view); var tray = new BrowseablePointerGridView (photo_view.Item) { DisplayTags = false }; icon_scrolled.Add (tray); tray.Show (); progress_bar.Hide (); import_button.Sensitive = false; tag_entry = new TagEntry (App.Instance.Database.Tags, false); tag_entry.UpdateFromTagNames (new string []{}); tagentry_box.Add (tag_entry); tag_entry.Show (); attachtags_label.MnemonicWidget = tag_entry; } void ResetPreview () { photo_view.Pixbuf = GtkUtil.TryLoadIcon (FSpot.Core.Global.IconTheme, "f-spot", 128, (Gtk.IconLookupFlags)0); photo_view.ZoomFit (false); } void LoadPreferences () { if (Preferences.Get (Preferences.IMPORT_WINDOW_WIDTH) > 0) { Resize (Preferences.Get (Preferences.IMPORT_WINDOW_WIDTH), Preferences.Get (Preferences.IMPORT_WINDOW_HEIGHT)); } if (FSpot.Preferences.Get (Preferences.IMPORT_WINDOW_PANE_POSITION) > 0) { import_hpaned.Position = Preferences.Get (Preferences.IMPORT_WINDOW_PANE_POSITION); } copy_check.Active = Controller.CopyFiles; recurse_check.Active = Controller.RecurseSubdirectories; duplicate_check.Active = Controller.DuplicateDetect; remove_check.Active = Controller.RemoveOriginals; remove_check.Sensitive = copy_check.Active; remove_warning_button.Sensitive = copy_check.Active && remove_check.Active; } void ScanSources () { // Populates the source combo box Sources = new TreeStore (typeof(ImportSource), typeof(string), typeof(string), typeof(bool)); sources_combo.Model = Sources; sources_combo.RowSeparatorFunc = (m, i) => (m.GetValue (i, 1) as string) == String.Empty; var render = new CellRendererPixbuf (); sources_combo.PackStart (render, false); sources_combo.SetAttributes (render, "icon-name", 2, "sensitive", 3); var render2 = new CellRendererText (); sources_combo.PackStart (render2, true); sources_combo.SetAttributes (render2, "text", 1, "sensitive", 3); GLib.Idle.Add (() => { try { PopulateSourceCombo (null); QueueDraw (); } catch (Exception e) { // Swallow the exception if the import was cancelled / dialog was closed. if (Controller != null) throw e; } return false; }); } void PopulateSourceCombo (ImportSource source_to_activate) { int activate_index = 0; sources_combo.Changed -= OnSourceComboChanged; Sources.Clear (); Sources.AppendValues (null, Catalog.GetString ("Choose Import source..."), String.Empty, true); Sources.AppendValues (null, select_folder_label, "folder", true); Sources.AppendValues (null, String.Empty, String.Empty); bool mount_added = false; foreach (var source in Controller.Sources) { if (source == source_to_activate) { activate_index = Sources.IterNChildren (); } Sources.AppendValues (source, source.Name, source.IconName, true); mount_added = true; } if (!mount_added) { Sources.AppendValues (null, Catalog.GetString ("(No Cameras Detected)"), String.Empty, false); } if (history_sources.Count > 0) { Sources.AppendValues (null, String.Empty, String.Empty); foreach (var source in history_sources.Values) { if (source == source_to_activate) { activate_index = Sources.IterNChildren (); } Sources.AppendValues (source, source.Name, source.IconName, true); } } sources_combo.Changed += OnSourceComboChanged; sources_combo.Active = activate_index; } void ConnectEvents () { Controller.StatusEvent += OnControllerStatusEvent; Controller.ProgressUpdated += OnControllerProgressUpdated; copy_check.Toggled += (o, args) => { Controller.CopyFiles = copy_check.Active; remove_check.Sensitive = copy_check.Active; remove_warning_button.Sensitive = copy_check.Active && remove_check.Active; }; recurse_check.Toggled += (o, args) => { Controller.RecurseSubdirectories = recurse_check.Active; }; duplicate_check.Toggled += (o, args) => { Controller.DuplicateDetect = duplicate_check.Active; }; remove_check.Toggled += (o, args) => { Controller.RemoveOriginals = remove_check.Active; remove_warning_button.Sensitive = copy_check.Active && remove_check.Active; }; import_button.Clicked += (o, args) => StartImport (); cancel_button.Clicked += (o, args) => CancelImport (); remove_warning_button.Clicked += (o, args) => { var dialog = new MessageDialog (this, DialogFlags.Modal, MessageType.Warning, ButtonsType.Ok, true, Catalog.GetString ("Checking this box will remove the imported photos from the camera after the import finished successfully.\n\nIt is generally recommended to backup your photos before removing them from the camera. Use this option at your own risk!")); dialog.Title = Catalog.GetString ("Warning"); dialog.Response += (s, arg) => { dialog.Destroy (); Controller = null; }; dialog.Run (); }; Response += (o, args) => { if (args.ResponseId == ResponseType.DeleteEvent) { CancelImport (); } }; } void ShowFolderSelector () { var file_chooser = new FileChooserDialog ( Catalog.GetString ("Import"), this, FileChooserAction.SelectFolder, Stock.Cancel, ResponseType.Cancel, Stock.Open, ResponseType.Ok); file_chooser.SelectMultiple = false; file_chooser.LocalOnly = false; int response = file_chooser.Run (); if ((ResponseType) response == ResponseType.Ok) { var uri = new SafeUri (file_chooser.Uri, true); SwitchToFolderSource (uri); } file_chooser.Destroy (); } public void SwitchToFolderSource (SafeUri uri) { ImportSource source = null; if (!history_sources.TryGetValue (uri, out source)) { var name = uri.GetFilename (); source = new FileImportSource (uri, name, "folder"); history_sources[uri] = source; } PopulateSourceCombo (source); Controller.ActiveSource = source; } int current_index = -1; void OnSourceComboChanged (object sender, EventArgs args) { // Prevent double firing. if (sources_combo.Active == current_index) { Log.Debug ("Skipping double fire!"); return; } else { current_index = sources_combo.Active; } TreeIter iter; sources_combo.GetActiveIter (out iter); var source = Sources.GetValue (iter, 0) as ImportSource; if (source == null) { var label = (string) Sources.GetValue (iter, 1); if (label == select_folder_label) { ShowFolderSelector (); return; } else { sources_combo.Active = 0; return; } } Controller.ActiveSource = source; } void OnControllerStatusEvent (ImportEvent evnt) { Log.DebugFormat ("Received controller event: {0}", evnt); switch (evnt) { case ImportEvent.SourceChanged: HideScanSpinner (); ResetPreview (); import_button.Sensitive = true; break; case ImportEvent.PhotoScanStarted: ShowScanSpinner (); break; case ImportEvent.PhotoScanFinished: HideScanSpinner (); break; case ImportEvent.ImportStarted: ShowImportProgress (); break; case ImportEvent.ImportFinished: ShowFailuresIfNeeded (Controller.FailedImports); Controller = null; Destroy (); break; case ImportEvent.ImportError: // TODO break; } } void ShowFailuresIfNeeded (List files) { if (Controller.FailedImports.Count == 0) return; new ImportFailureDialog (files).Show (); } void OnControllerProgressUpdated (int current, int total) { var importing_label = Catalog.GetString ("Importing Photos: {0} of {1}..."); progress_bar.Text = String.Format (importing_label, current, total); progress_bar.Fraction = (double) current / Math.Max (total, 1); } void StartImport () { Controller.AttachTags (tag_entry.GetTypedTagNames ()); Controller.StartImport (); import_button.Sensitive = false; OptionsSensitive = false; } void CancelImport () { Controller.CancelImport (); Controller = null; Destroy (); } bool pulse_timeout_running = false; void ShowImportProgress () { progress_bar.Text = Catalog.GetString ("Importing photos..."); progress_bar.Show (); } void ShowScanSpinner () { // TODO: Using a GtkSpinner would be nicer here. progress_bar.Text = Catalog.GetString ("Searching for photos... (You can already click Import to continue)"); progress_bar.Show (); pulse_timeout_running = true; GLib.Timeout.Add (40, () => { if (!pulse_timeout_running) { return false; } progress_bar.Pulse (); return pulse_timeout_running; }); } void HideScanSpinner () { pulse_timeout_running = false; progress_bar.Hide (); } public bool OptionsSensitive { set { sources_combo.Sensitive = value; copy_check.Sensitive = value; recurse_check.Sensitive = value; duplicate_check.Sensitive = value; tagentry_box.Sensitive = value; } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/EditTagIconDialog.cs0000644000175000017500000001705311503404760025332 0ustar00rubenruben00000000000000/* * FSpot.UI.Dialog.EditTagIconDialog.cs * * Author(s): * Larry Ewing * Stephane Delcroix * * Copyright (c) 2003-2009 Novell, Inc, * Copyright (c) 2007 Stephane Delcroix * * This is free software. See COPYING for details */ using System; using Mono.Unix; using Gtk; using FSpot.Core; using FSpot.Database; using FSpot.Widgets; using FSpot.Utils; using FSpot.Imaging; using Hyena; using Hyena.Widgets; namespace FSpot.UI.Dialog { public class EditTagIconDialog : BuilderDialog { FSpot.PhotoQuery query; PhotoImageView image_view; Gtk.IconView icon_view; ListStore icon_store; string icon_name = null; Gtk.FileChooserButton external_photo_chooser; [GtkBeans.Builder.Object] Gtk.Image preview_image; [GtkBeans.Builder.Object] Gtk.ScrolledWindow photo_scrolled_window; [GtkBeans.Builder.Object] Gtk.ScrolledWindow icon_scrolled_window; [GtkBeans.Builder.Object] Label photo_label; [GtkBeans.Builder.Object] Label from_photo_label; [GtkBeans.Builder.Object] SpinButton photo_spin_button; [GtkBeans.Builder.Object] HBox external_photo_chooser_hbox; public EditTagIconDialog (Db db, Tag t, Gtk.Window parent_window) : base ("EditTagIconDialog.ui", "edit_tag_icon_dialog") { TransientFor = parent_window; Title = String.Format (Catalog.GetString ("Edit Icon for Tag {0}"), t.Name); preview_pixbuf = t.Icon; Cms.Profile screen_profile; if (preview_pixbuf != null && FSpot.ColorManagement.Profiles.TryGetValue (Preferences.Get (Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE), out screen_profile)) { preview_image.Pixbuf = preview_pixbuf.Copy (); ColorManagement.ApplyProfile (preview_image.Pixbuf, screen_profile); } else preview_image.Pixbuf = preview_pixbuf; query = new FSpot.PhotoQuery (db.Photos); if (db.Tags.Hidden != null) query.Terms = FSpot.OrTerm.FromTags (new Tag [] {t}); else query.Terms = new FSpot.Literal (t); image_view = new PhotoImageView (query) {CropHelpers = false}; image_view.SelectionXyRatio = 1.0; image_view.SelectionChanged += HandleSelectionChanged; image_view.PhotoChanged += HandlePhotoChanged; external_photo_chooser = new Gtk.FileChooserButton (Catalog.GetString ("Select Photo from file"), Gtk.FileChooserAction.Open); external_photo_chooser.Filter = new FileFilter(); external_photo_chooser.Filter.AddPixbufFormats(); external_photo_chooser.LocalOnly = false; external_photo_chooser_hbox.PackStart (external_photo_chooser); external_photo_chooser.Show (); external_photo_chooser.SelectionChanged += HandleExternalFileSelectionChanged; photo_scrolled_window.Add (image_view); if (query.Count > 0) { photo_spin_button.Wrap = true; photo_spin_button.Adjustment.Lower = 1.0; photo_spin_button.Adjustment.Upper = (double) query.Count; photo_spin_button.Adjustment.StepIncrement = 1.0; photo_spin_button.ValueChanged += HandleSpinButtonChanged; image_view.Item.Index = 0; } else { from_photo_label.Markup = String.Format (Catalog.GetString ( "\nFrom Photo\n" + " You can use one of your library photos as an icon for this tag.\n" + " However, first you must have at least one photo associated\n" + " with this tag. Please tag a photo as '{0}' and return here\n" + " to use it as an icon."), t.Name); photo_scrolled_window.Visible = false; photo_label.Visible = false; photo_spin_button.Visible = false; } icon_store = new ListStore (typeof (string), typeof (Gdk.Pixbuf)); icon_view = new Gtk.IconView (icon_store); icon_view.PixbufColumn = 1; icon_view.SelectionMode = SelectionMode.Single; icon_view.SelectionChanged += HandleIconSelectionChanged; icon_scrolled_window.Add (icon_view); icon_view.Show(); image_view.Show (); DelayedOperation fill_delay = new DelayedOperation (FillIconView); fill_delay.Start (); } public BrowsablePointer Item { get { return image_view.Item; } } Gdk.Pixbuf preview_pixbuf; public Gdk.Pixbuf PreviewPixbuf { get { return preview_pixbuf; } set { icon_name = null; preview_pixbuf = value; Cms.Profile screen_profile; if (value!= null && FSpot.ColorManagement.Profiles.TryGetValue (Preferences.Get (Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE), out screen_profile)) { preview_image.Pixbuf = value.Copy (); ColorManagement.ApplyProfile (preview_image.Pixbuf, screen_profile); } else preview_image.Pixbuf = value; } } public string ThemeIconName { get { return icon_name; } set { icon_name = value; PreviewPixbuf = GtkUtil.TryLoadIcon (FSpot.Core.Global.IconTheme, value, 48, (IconLookupFlags) 0); } } void HandleSpinButtonChanged (object sender, EventArgs args) { int value = photo_spin_button.ValueAsInt - 1; image_view.Item.Index = value; } void HandleExternalFileSelectionChanged (object sender, EventArgs args) { //Note: The filter on the FileChooserButton's dialog means that we will have a Pixbuf compatible uri here CreateTagIconFromExternalPhoto (); } void CreateTagIconFromExternalPhoto () { try { using (var img = ImageFile.Create (new SafeUri(external_photo_chooser.Uri, true))) { using (Gdk.Pixbuf external_image = img.Load ()) { PreviewPixbuf = PixbufUtils.TagIconFromPixbuf (external_image); } } } catch (Exception) { string caption = Catalog.GetString ("Unable to load image"); string message = String.Format (Catalog.GetString ("Unable to load \"{0}\" as icon for the tag"), external_photo_chooser.Uri.ToString ()); HigMessageDialog md = new HigMessageDialog (this, DialogFlags.DestroyWithParent, MessageType.Error, ButtonsType.Close, caption, message); md.Run(); md.Destroy(); } } void HandleSelectionChanged (object sender, EventArgs e) { int x = image_view.Selection.X; int y = image_view.Selection.Y; int width = image_view.Selection.Width; int height = image_view.Selection.Height; if (image_view.Pixbuf != null) { if (image_view.Selection != Gdk.Rectangle.Zero) { using (var tmp = new Gdk.Pixbuf (image_view.Pixbuf, x, y, width, height)) { Gdk.Pixbuf transformed = FSpot.Utils.PixbufUtils.TransformOrientation (tmp, image_view.PixbufOrientation); PreviewPixbuf = PixbufUtils.TagIconFromPixbuf (transformed); transformed.Dispose (); } } else { Gdk.Pixbuf transformed = FSpot.Utils.PixbufUtils.TransformOrientation (image_view.Pixbuf, image_view.PixbufOrientation); PreviewPixbuf = PixbufUtils.TagIconFromPixbuf (transformed); transformed.Dispose (); } } } public void HandlePhotoChanged (object sender, EventArgs e) { int item = image_view.Item.Index; photo_label.Text = String.Format (Catalog.GetString ("Photo {0} of {1}"), item + 1, query.Count); photo_spin_button.Value = item + 1; HandleSelectionChanged (null, null); } public void HandleIconSelectionChanged (object o, EventArgs args) { if (icon_view.SelectedItems.Length == 0) return; TreeIter iter; icon_store.GetIter (out iter, icon_view.SelectedItems [0]); ThemeIconName = (string) icon_store.GetValue (iter, 0); } public bool FillIconView () { icon_store.Clear (); string [] icon_list = FSpot.Core.Global.IconTheme.ListIcons ("Emblems"); foreach (string item_name in icon_list) icon_store.AppendValues (item_name, GtkUtil.TryLoadIcon (FSpot.Core.Global.IconTheme, item_name, 32, (IconLookupFlags) 0)); return false; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/EditTagDialog.cs0000644000175000017500000001214111503404760024512 0ustar00rubenruben00000000000000/* * FSpot.UI.Dialog.EditTagDialog.cs * * Author(s): * Larry Ewing * Stephane Delcroix * * Copyright (c) 2003-2009 Novell, Inc, * Copyright (c) 2007 Stephane Delcroix * * This is free software. See COPYING for details */ using System; using System.Collections; using Mono.Unix; using Gtk; using FSpot.Core; using FSpot.Database; namespace FSpot.UI.Dialog { public class EditTagDialog : BuilderDialog { Db db; Tag tag; [GtkBeans.Builder.Object] Button ok_button; [GtkBeans.Builder.Object] Entry tag_name_entry; [GtkBeans.Builder.Object] Label already_in_use_label; [GtkBeans.Builder.Object] Gtk.Image icon_image; [GtkBeans.Builder.Object] Gtk.ComboBox category_option_menu; public EditTagDialog (Db db, Tag t, Gtk.Window parent_window) : base ("EditTagDialog.ui", "edit_tag_dialog") { this.db = db; tag = t; TransientFor = parent_window; orig_name = last_valid_name = t.Name; tag_name_entry.Text = t.Name; icon_image.Pixbuf = t.Icon; Cms.Profile screen_profile; if (icon_image.Pixbuf != null && FSpot.ColorManagement.Profiles.TryGetValue (Preferences.Get (Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE), out screen_profile)) { icon_image.Pixbuf = icon_image.Pixbuf.Copy(); FSpot.ColorManagement.ApplyProfile (icon_image.Pixbuf, screen_profile); } PopulateCategoryOptionMenu (t); tag_name_entry.GrabFocus (); category_option_menu.Changed += HandleTagNameEntryChanged; } string orig_name; string last_valid_name; public string TagName { get { return last_valid_name; } } public Category TagCategory { get { return categories [category_option_menu.Active] as Category;} } ArrayList categories; void HandleTagNameEntryChanged (object sender, EventArgs args) { string name = tag_name_entry.Text; if (name == String.Empty) { ok_button.Sensitive = false; already_in_use_label.Markup = String.Empty; } else if (TagNameExistsInCategory (name, db.Tags.RootCategory) && String.Compare(name, orig_name, true) != 0) { ok_button.Sensitive = false; already_in_use_label.Markup = "" + Catalog.GetString ("This name is already in use") + ""; } else { ok_button.Sensitive = true; already_in_use_label.Markup = String.Empty; last_valid_name = tag_name_entry.Text; } } bool TagNameExistsInCategory (string name, Category category) { foreach (Tag tag in category.Children) { if (String.Compare(tag.Name, name, true) == 0) return true; if (tag is Category && TagNameExistsInCategory (name, tag as Category)) return true; } return false; } void PopulateCategories (ArrayList categories, Category parent) { foreach (Tag tag in parent.Children) { if (tag is Category && tag != this.tag && !this.tag.IsAncestorOf (tag)) { categories.Add (tag); PopulateCategories (categories, tag as Category); } } } void HandleIconButtonClicked (object sender, EventArgs args) { EditTagIconDialog dialog = new EditTagIconDialog (db, tag, this); ResponseType response = (ResponseType) dialog.Run (); if (response == ResponseType.Ok) { if (dialog.ThemeIconName != null) { tag.ThemeIconName = dialog.ThemeIconName; } else { tag.ThemeIconName = null; tag.Icon = dialog.PreviewPixbuf; } } else if (response == (ResponseType)1) tag.Icon = null; Cms.Profile screen_profile; if (tag.Icon != null && FSpot.ColorManagement.Profiles.TryGetValue (Preferences.Get (Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE), out screen_profile)) { icon_image.Pixbuf = tag.Icon.Copy(); FSpot.ColorManagement.ApplyProfile(icon_image.Pixbuf, screen_profile); } else icon_image.Pixbuf = tag.Icon; dialog.Destroy (); } void PopulateCategoryOptionMenu (Tag t) { int history = 0; int i = 0; categories = new ArrayList (); Category root = db.Tags.RootCategory; categories.Add (root); PopulateCategories (categories, root); category_option_menu.Clear(); CellRendererPixbuf cell2 = new CellRendererPixbuf(); category_option_menu.PackStart(cell2, false); category_option_menu.AddAttribute(cell2, "pixbuf", 0); CellRendererText cell = new CellRendererText(); category_option_menu.PackStart(cell, true); category_option_menu.AddAttribute(cell, "text", 1); ListStore store = new ListStore(new[] {typeof (Gdk.Pixbuf), typeof(string)}); category_option_menu.Model = store; foreach (Category category in categories) { if (t.Category == category) history = i; i++; string categoryName = category.Name; Gdk.Pixbuf categoryImage = category.Icon; store.AppendValues( new object[] { categoryImage, categoryName }); } category_option_menu.Sensitive = true; category_option_menu.Active = history; //category_option_menu.SetHistory ((uint)history); //category_option_menu.Active = (uint)history; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/BuilderDialog.cs0000644000175000017500000000136011503404760024560 0ustar00rubenruben00000000000000// // FSpot.UI.Dialog.BuilderDialog.cs // // Author(s): // Stephane Delcroix // // Copyright (c)2009 Novell, Inc. // // This is free software. See COPYING fro details. // using System; using GtkBeans; namespace FSpot.UI.Dialog { public abstract class BuilderDialog : Gtk.Dialog { protected BuilderDialog (string resourceName, string dialogName) : this (null, resourceName, dialogName) { } protected BuilderDialog (System.Reflection.Assembly assembly, string resourceName, string dialogName) : this (new Builder (assembly, resourceName, null), dialogName) { } protected BuilderDialog (Builder builder, string dialogName) : base (builder.GetRawObject (dialogName)) { builder.Autoconnect (this); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/SelectionRatioDialog.cs0000644000175000017500000001321211503404760026115 0ustar00rubenruben00000000000000/* * FSpot.UI.Dialog.SelectionRatioDialog.cs * * Author(s): * Stephane Delcroix * * This is free software. See COPYING fro details. */ using System; using System.IO; using System.Xml.Serialization; using System.Collections.Generic; using Gtk; using Mono.Unix; using Hyena; namespace FSpot.UI.Dialog { public class SelectionRatioDialog : BuilderDialog { [Serializable] public struct SelectionConstraint { private string label; public string Label { get { return label; } set { label = value; } } private double ratio; public double XyRatio { get { return ratio; } set { ratio = value; } } public SelectionConstraint (string label, double ratio) { this.label = label; this.ratio = ratio; } } [GtkBeans.Builder.Object] Button close_button; [GtkBeans.Builder.Object] Button add_button; [GtkBeans.Builder.Object] Button delete_button; [GtkBeans.Builder.Object] Button up_button; [GtkBeans.Builder.Object] Button down_button; [GtkBeans.Builder.Object] TreeView content_treeview; private ListStore constraints_store; public SelectionRatioDialog () : base ("SelectionRatioDialog.ui", "customratio_dialog") { close_button.Clicked += delegate (object o, EventArgs e) {SavePrefs (); this.Destroy (); }; add_button.Clicked += delegate (object o, EventArgs e) {constraints_store.AppendValues ("New Selection", 1.0);}; delete_button.Clicked += DeleteSelectedRows; up_button.Clicked += MoveUp; down_button.Clicked += MoveDown; CellRendererText text_renderer = new CellRendererText (); text_renderer.Editable = true; text_renderer.Edited += HandleLabelEdited; content_treeview.AppendColumn (Catalog.GetString ("Label"), text_renderer, "text", 0); text_renderer = new CellRendererText (); text_renderer.Editable = true; text_renderer.Edited += HandleRatioEdited; content_treeview.AppendColumn (Catalog.GetString ("Ratio"), text_renderer, "text", 1); LoadPreference (Preferences.CUSTOM_CROP_RATIOS); Preferences.SettingChanged += OnPreferencesChanged; } private void Populate () { constraints_store = new ListStore (typeof (string), typeof (double)); content_treeview.Model = constraints_store; XmlSerializer serializer = new XmlSerializer (typeof(SelectionConstraint)); string [] vals = Preferences.Get (Preferences.CUSTOM_CROP_RATIOS); if (vals != null) foreach (string xml in vals) { SelectionConstraint constraint = (SelectionConstraint)serializer.Deserialize (new StringReader (xml)); constraints_store.AppendValues (constraint.Label, constraint.XyRatio); } } private void OnPreferencesChanged (object sender, NotifyEventArgs args) { LoadPreference (args.Key); } private void LoadPreference (String key) { switch (key) { case Preferences.CUSTOM_CROP_RATIOS: Populate (); break; } } private void SavePrefs () { List prefs = new List (); XmlSerializer serializer = new XmlSerializer (typeof (SelectionConstraint)); foreach (object[] row in constraints_store) { StringWriter sw = new StringWriter (); serializer.Serialize (sw, new SelectionConstraint ((string)row[0], (double)row[1])); sw.Close (); prefs.Add (sw.ToString ()); } #if !GCONF_SHARP_2_18 if (prefs.Count != 0) #endif Preferences.Set (Preferences.CUSTOM_CROP_RATIOS, prefs.ToArray()); #if !GCONF_SHARP_2_18 else Preferences.Set (Preferences.CUSTOM_CROP_RATIOS, -1); #endif } public void HandleLabelEdited (object sender, EditedArgs args) { args.RetVal = false; TreeIter iter; if (!constraints_store.GetIterFromString (out iter, args.Path)) return; using (GLib.Value val = new GLib.Value (args.NewText)) constraints_store.SetValue (iter, 0, val); args.RetVal = true; } public void HandleRatioEdited (object sender, EditedArgs args) { args.RetVal = false; TreeIter iter; if (!constraints_store.GetIterFromString (out iter, args.Path)) return; double ratio; try { ratio = ParseRatio (args.NewText); } catch (FormatException fe) { Log.Exception (fe); return; } if (ratio < 1.0) ratio = 1.0 / ratio; using (GLib.Value val = new GLib.Value (ratio)) constraints_store.SetValue (iter, 1, val); args.RetVal = true; } private double ParseRatio (string text) { try { return Convert.ToDouble (text); } catch (FormatException) { char [] separators = {'/', ':'}; foreach (char c in separators) { if (text.IndexOf (c) != -1) { double ratio = Convert.ToDouble (text.Substring (0, text.IndexOf (c))); ratio /= Convert.ToDouble (text.Substring (text.IndexOf (c) + 1)); return ratio; } } throw new FormatException (String.Format ("unable to parse {0}", text)); } } private void DeleteSelectedRows (object o, EventArgs e) { TreeIter iter; TreeModel model; if (content_treeview.Selection.GetSelected (out model, out iter)) (model as ListStore).Remove (ref iter); } private void MoveUp (object o, EventArgs e) { TreeIter selected; TreeModel model; if (content_treeview.Selection.GetSelected (out model, out selected)) { //no IterPrev :( TreeIter prev; TreePath path = model.GetPath (selected); if (path.Prev ()) if (model.GetIter (out prev, path)) (model as ListStore).Swap (prev, selected); } } private void MoveDown (object o, EventArgs e) { TreeIter current; TreeModel model; if (content_treeview.Selection.GetSelected (out model, out current)) { TreeIter next = current; if ((model as ListStore).IterNext (ref next)) (model as ListStore).Swap (current, next); } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/RepairDbDialog.cs0000644000175000017500000000143411503404760024664 0ustar00rubenruben00000000000000/* * FSpot.UI.Dialog.RepairDbDialog * * Author(s): * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using Gtk; using Mono.Unix; using Hyena; using Hyena.Widgets; namespace FSpot.UI.Dialog { public class RepairDbDialog : HigMessageDialog { public RepairDbDialog (System.Exception e, string backup_path, Window parent) : base (parent, DialogFlags.DestroyWithParent, MessageType.Error, ButtonsType.Ok, Catalog.GetString ("Error loading database."), String.Format (Catalog.GetString ("F-Spot encountered an error while loading the photo database. " + "The old database has be moved to {0} and a new database has been created."), backup_path)) { Log.Exception (e); Run (); Destroy (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/RatingFilterDialog.cs0000644000175000017500000000442611503404760025572 0ustar00rubenruben00000000000000/* * FSpot.UI.Dialog.RatingFilterDialog.cs * * Author(s): * Bengt Thuree * Stephane Delcroix * * This is free software. See COPYING for details. */ using Gtk; using FSpot; using FSpot.Query; using FSpot.Widgets; using FSpot.UI.Dialog; namespace FSpot.UI.Dialog { public class RatingFilterDialog : BuilderDialog { [GtkBeans.Builder.Object] Button ok_button; [GtkBeans.Builder.Object] HBox minrating_hbox; [GtkBeans.Builder.Object] HBox maxrating_hbox; private int minrating_value = 4; private int maxrating_value = 5; private RatingEntry minrating; private RatingEntry maxrating; public RatingFilterDialog (FSpot.PhotoQuery query, Gtk.Window parent_window) : base ("RatingFilterDialog.ui", "rating_filter_dialog") { TransientFor = parent_window; DefaultResponse = ResponseType.Ok; ok_button.GrabFocus (); if (query.RatingRange != null) { minrating_value = (int) query.RatingRange.MinRating; maxrating_value = (int) query.RatingRange.MaxRating; } minrating = new RatingEntry (minrating_value); maxrating = new RatingEntry (maxrating_value); minrating_hbox.PackStart (minrating, false, false, 0); maxrating_hbox.PackStart (maxrating, false, false, 0); minrating.Show (); maxrating.Show (); minrating.Changed += HandleMinratingChanged; maxrating.Changed += HandleMaxratingChanged; ResponseType response = (ResponseType) Run (); if (response == ResponseType.Ok) { query.RatingRange = new RatingRange ((uint) minrating.Value, (uint) maxrating.Value); } Destroy (); } void HandleMinratingChanged (object sender, System.EventArgs e) { if (minrating.Value > maxrating.Value) { maxrating.Changed -= HandleMaxratingChanged; maxrating.Value = minrating.Value; maxrating.Changed += HandleMaxratingChanged; } } void HandleMaxratingChanged (object sender, System.EventArgs e) { if (maxrating.Value < minrating.Value) { minrating.Changed -= HandleMinratingChanged; minrating.Value = maxrating.Value; minrating.Changed += HandleMinratingChanged; } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/RepairDialog.cs0000644000175000017500000000173711503404760024424 0ustar00rubenruben00000000000000/* * FSpot.UI.Dialog.RepairDialog * * Author(s): * Larry Ewing * * This is free software. See COPYING for details. * */ using Gtk; using System; using System.IO; using FSpot.Widgets; using FSpot.Core; namespace FSpot. UI.Dialog { public class RepairDialog : BuilderDialog { [GtkBeans.Builder.Object] ScrolledWindow view_scrolled; IBrowsableCollection source; PhotoList missing; public RepairDialog (IBrowsableCollection collection) : base ("RepairDialog.ui", "repair_dialog") { source = collection; missing = new PhotoList (); FindMissing (); TrayView view = new TrayView (missing); view_scrolled.Add (view); this.ShowAll (); } public void FindMissing () { int i; missing.Clear (); for (i = 0; i < source.Count; i++) { IPhoto item = source [i]; string path = item.DefaultVersion.Uri.LocalPath; if (! File.Exists (path) || (new FileInfo (path).Length == 0)) missing.Add (item); } } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/ui/0000777000175000017500000000000011503407450022143 5ustar00rubenruben00000000000000f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/ui/LastImportRollFilterDialog.ui0000644000175000017500000002205511430555234027722 0ustar00rubenruben00000000000000 True Filter on selected rolls dialog True vertical 450 True vertical 5 True 0 <b>View all pictures imported</b> True False False 0 True 4 True liststore3 0 False False 0 True liststore2 0 1 True and False False 2 True liststore1 0 3 False 1 True True Number of photos in selected rolls: False False 0 True 3 False False 1 5 2 3 2 True end gtk-cancel True True True False Show all photos. True False False 0 gtk-ok True True True False Display only those photos that were imported in specified Rolls. True False False 1 False end 0 cancelbutton1 okbutton1 at after between f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/ui/PreferenceDialog.ui0000644000175000017500000002753311430555234025711 0ustar00rubenruben00000000000000 5 F-Spot Preferences True normal False True vertical 2 True 6 6 5 True 14 2 12 6 True 1 When importing photos, copy them to: True 1 Color profile for display: 8 9 True 1 Color profile for printing: 10 11 True 1 2 8 9 True 1 2 10 11 True 1 2 13 14 True 1 F-Spot appearance: 13 14 True select-folder Select A Folder 1 2 True True False True True Inside the image files when possible <small>Makes them accessible to other image-editing programs.</small> True 1 2 3 4 True 1 Store tags and descriptions for photos: 3 4 True True False True True Never modify image files. <small>Write XMP files next to the images instead.</small> True 1 2 5 6 Separately from the image files True True False True writemetadata_radio 1 2 4 5 False False 1 True end gtk-close True True True True False False 0 False end 0 button1 f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/ui/EditTagDialog.ui0000644000175000017500000002077711472676165025174 0ustar00rubenruben00000000000000 6 Edit Tag True True dialog False True 2 True 3 2 6 6 True True True 1 2 2 3 True 0 _Tag Name: True tag_name_entry 2 3 GTK_FILL True 0 P_arent Tag: True category_option_menu 1 2 GTK_FILL 150 True True False 1 2 1 2 GTK_FILL True 0 _Icon: True icon_button GTK_FILL 48 48 True True False Edit icon True gtk-missing-image 1 2 1 True 0 0 True <small></small> True False 2 True end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False 2 end 0 cancel_button ok_button f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/ui/CreateTagDialog.ui0000644000175000017500000001642711430555234025472 0ustar00rubenruben00000000000000 6 True True dialog False True 2 True 2 2 6 6 True 0 P_arent Tag: True GTK_FILL True 0 _Tag Name: True tag_name_entry 1 2 GTK_FILL True True True 1 2 1 2 150 True 1 2 GTK_FILL 1 True 0 0 True <small></small> True False 2 True 0 0 Create _icon for this tag when first used True True False True True False 3 True end gtk-cancel True True True False True False False 0 C_reate True True True False True False False 1 False 2 end 0 cancel_button create_button f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/ui/RepairDialog.ui0000644000175000017500000000634511430555234025053 0ustar00rubenruben00000000000000 True Repair dialog True True True True 0 2 True end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False end 0 cancelbutton8 okbutton9 f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/ui/AdjustTimeDialog.ui0000644000175000017500000006053111430555234025677 0ustar00rubenruben00000000000000 100 0 10 1 10 0 True Adjust Time GDK_WINDOW_TYPE_HINT_DIALOG False True True 6 6 True True True 0 GTK_SHADOW_NONE True 12 True 6 True img_000.jpg True False False 320 200 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC 1 True 60 True False False True 30 1 of 1 GTK_JUSTIFY_CENTER 1 True True adjustment1 1 False False 2 2 True 6 True 2 2 6 6 True GNOME_DATE_EDIT_SHOW_TIME | GNOME_DATE_EDIT_24_HR 0 23 1 2 1 2 True 0 Adjusted date: 1 2 GTK_FILL True 0 Current date: True GTK_FILL True 0 0000:00:00 00:00:00 1 2 GTK_FILL False True 6 True 1 difference: GTK_JUSTIFY_RIGHT 1 True True * 16 00:00:00 False 2 False False 1 False 3 True <b>Reference Photo</b> True 0 GTK_SHADOW_NONE True 12 True 6 True True Shift all photos by {0} True True False False True 6 True True Space all photos by True True difference_check False False True True * 5 5 False 1 min. Starting at {0} False False 2 False False 1 True <b>Action</b> True 1 True 0 GTK_SHADOW_NONE True 12 200 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN True <b>Photos</b> True False 1 1 True GTK_BUTTONBOX_END True True True gtk-cancel True True True True gtk-ok True 1 False GTK_PACK_END difference_check interval_check cancel_button ok_button f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/ui/EditTagIconDialog.ui0000644000175000017500000003604011430555234025756 0ustar00rubenruben00000000000000 1 100 1 10 True Edit Tag Icon dialog False True True 0.5 none 60 True 12 True gtk-missing-image True <b>Preview</b> True False False 1 True Design icon from 2 True True 6 vertical 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True 6 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>From External Photo</b> True False 0 True 0 none True 12 240 249 True True automatic automatic in True <b>Predefined icons</b> True False False 1 0 True 6 vertical 6 True 0 none True 12 True vertical 6 400 300 True True automatic automatic 0 True True Photo 0 of 0 0 True True adjustment1 1 False False 1 1 True <b>From Photo</b> True 0 1 3 True end No _image True True True False True False False 0 gtk-cancel True True True False True False False 2 gtk-ok True True True False True False False 3 False end 0 noicon_button cancel_button ok_button f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/ui/SelectionRatioDialog.ui0000644000175000017500000001655111431562107026553 0ustar00rubenruben00000000000000 5 Selection Constraints normal False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 2 True vertical True 0 6 Manage your custom selection ratios False False 6 0 True True 6 0 True vertical 6 start gtk-add True False False True False False 0 gtk-delete True False False True False False 1 gtk-go-up True False False True False False 2 gtk-go-down True False False True False False 3 False False 6 1 1 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end gtk-close True False False True False False 0 False end 0 close_button f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/ui/DateRangeDialog.ui0000644000175000017500000002022411430555234025453 0ustar00rubenruben00000000000000 True 6 Set date range dialog False True 12 True 12 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Select period</b> True False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK or 6 1 True 0 none True 12 True <b>Start Date</b> True word-char False False 2 True 0 none True 12 True <b>End Date</b> True False False 3 False 1 True end gtk-cancel True True True False Cancel, do not change the current timeline. True False False 0 gtk-ok True True True False Only photos taken within these dates will be displayed. True False False 1 False end 0 cancelbutton3 ok_button f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/ui/RatingFilterDialog.ui0000644000175000017500000001255111430555234026217 0ustar00rubenruben00000000000000 True Set Rating Filter GDK_WINDOW_TYPE_HINT_DIALOG False True True True 0 GTK_SHADOW_NONE True 12 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True <b>Min Rating</b> True True 0 GTK_SHADOW_NONE True 12 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True <b>Max Rating</b> True 1 False 1 True GTK_BUTTONBOX_END gtk-cancel True True True False True gtk-ok True True True False True 1 False GTK_PACK_END cancel_button ok_button f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/PreferenceDialog.cs0000644000175000017500000002403111503404760025250 0ustar00rubenruben00000000000000/* * FSpot.UI.Dialog.PreferenceDialog.cs * * Authors(s): * Larry Ewing * Stephane Delcroix * * Copyright (c) 2005-2009 Novell, Inc. * Copyright (c) 2007,2010 Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using System.IO; using System.Collections.Generic; using System.Linq; using Gtk; using Mono.Unix; using Hyena; using FSpot.Widgets; namespace FSpot.UI.Dialog { public class PreferenceDialog : BuilderDialog { [GtkBeans.Builder.Object] FileChooserButton photosdir_chooser; [GtkBeans.Builder.Object] RadioButton writemetadata_radio; [GtkBeans.Builder.Object] RadioButton dontwrite_radio; [GtkBeans.Builder.Object] CheckButton always_sidecar_check; [GtkBeans.Builder.Object] ComboBox theme_combo; [GtkBeans.Builder.Object] ComboBox screenprofile_combo; [GtkBeans.Builder.Object] ComboBox printprofile_combo; #region public API (ctor) public PreferenceDialog (Window parent) : base ("PreferenceDialog.ui", "preference_dialog") { TransientFor = parent; //Photos Folder photosdir_chooser.SetCurrentFolderUri (FSpot.Core.Global.PhotoUri); SafeUri storage_path = new SafeUri (Preferences.Get (Preferences.STORAGE_PATH)); //If the user has set a photo directory on the commandline then don't let it be changed in Preferences if (storage_path.Equals(FSpot.Core.Global.PhotoUri)) photosdir_chooser.CurrentFolderChanged += HandlePhotosdirChanged; else photosdir_chooser.Sensitive = false; //Write Metadata LoadPreference (Preferences.METADATA_EMBED_IN_IMAGE); LoadPreference (Preferences.METADATA_ALWAYS_USE_SIDECAR); //Screen profile ListStore sprofiles = new ListStore (typeof (string), typeof (int)); sprofiles.AppendValues (Catalog.GetString ("None"), 0); if (FSpot.ColorManagement.XProfile != null) sprofiles.AppendValues (Catalog.GetString ("System profile"), -1); sprofiles.AppendValues (null, 0); //Pick the display profiles from the full list, avoid _x_profile_ var dprofs = from profile in FSpot.ColorManagement.Profiles where (profile.Value.DeviceClass == Cms.IccProfileClass.Display && profile.Key != "_x_profile_") select profile; foreach (var p in dprofs) sprofiles.AppendValues (p.Key, 1); CellRendererText profilecellrenderer = new CellRendererText (); profilecellrenderer.Ellipsize = Pango.EllipsizeMode.End; screenprofile_combo.Model = sprofiles; screenprofile_combo.PackStart (profilecellrenderer, true); screenprofile_combo.RowSeparatorFunc = ProfileSeparatorFunc; screenprofile_combo.SetCellDataFunc (profilecellrenderer, ProfileCellFunc); LoadPreference (Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE); //Print profile ListStore pprofiles = new ListStore (typeof (string), typeof (int)); pprofiles.AppendValues (Catalog.GetString ("None"), 0); pprofiles.AppendValues (null, 0); var pprofs = from profile in FSpot.ColorManagement.Profiles where (profile.Value.DeviceClass == Cms.IccProfileClass.Output && profile.Key != "_x_profile_") select profile; foreach (var p in pprofs) pprofiles.AppendValues (p.Key, 1); printprofile_combo.Model = pprofiles; printprofile_combo.PackStart (profilecellrenderer, true); printprofile_combo.RowSeparatorFunc = ProfileSeparatorFunc; printprofile_combo.SetCellDataFunc (profilecellrenderer, ProfileCellFunc); LoadPreference (Preferences.COLOR_MANAGEMENT_OUTPUT_PROFILE); //Theme chooser ListStore themes = new ListStore (typeof (string), typeof (string)); themes.AppendValues (Catalog.GetString ("Standard theme"), null); themes.AppendValues (null, null); //Separator string gtkrc = System.IO.Path.Combine ("gtk-2.0", "gtkrc"); string [] search = {System.IO.Path.Combine (FSpot.Core.Global.HomeDirectory, ".themes"), "/usr/share/themes"}; foreach (string path in search) if (System.IO.Directory.Exists (path)) foreach (string dir in System.IO.Directory.GetDirectories (path)) if (File.Exists (System.IO.Path.Combine (dir, gtkrc))) themes.AppendValues (System.IO.Path.GetFileName (dir), System.IO.Path.Combine (dir, gtkrc)); CellRenderer themecellrenderer = new CellRendererText (); theme_combo.Model = themes; theme_combo.PackStart (themecellrenderer, true); theme_combo.RowSeparatorFunc = ThemeSeparatorFunc; theme_combo.SetCellDataFunc (themecellrenderer, ThemeCellFunc); LoadPreference (Preferences.GTK_RC); ConnectEvents (); } #endregion #region preferences void OnPreferencesChanged (object sender, NotifyEventArgs args) { LoadPreference (args.Key); } void LoadPreference (string key) { string pref; int i; switch (key) { case Preferences.STORAGE_PATH: photosdir_chooser.SetCurrentFolder (Preferences.Get (key)); break; case Preferences.METADATA_EMBED_IN_IMAGE: bool embed_active = Preferences.Get (key); if (writemetadata_radio.Active != embed_active) { if (embed_active) { writemetadata_radio.Active = true; } else { dontwrite_radio.Active = true; } } always_sidecar_check.Sensitive = embed_active; break; case Preferences.METADATA_ALWAYS_USE_SIDECAR: bool always_use_sidecar = Preferences.Get (key); always_sidecar_check.Active = always_use_sidecar; break; case Preferences.GTK_RC: pref = Preferences.Get (key); if (String.IsNullOrEmpty (pref)) { theme_combo.Active = 0; break; } i = 0; foreach (object [] row in theme_combo.Model as ListStore) { if (pref == (string)row [1]) { theme_combo.Active = i; break; } i++; } break; case Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE: pref = Preferences.Get (key); if (String.IsNullOrEmpty (pref)) { screenprofile_combo.Active = 0; break; } if (pref == "_x_profile_" && FSpot.ColorManagement.XProfile != null) { screenprofile_combo.Active = 1; break; } i = 0; foreach (object [] row in screenprofile_combo.Model as ListStore) { if (pref == (string)row [0]) { screenprofile_combo.Active = i; break; } i++; } break; case Preferences.COLOR_MANAGEMENT_OUTPUT_PROFILE: pref = Preferences.Get (key); if (String.IsNullOrEmpty (pref)) { printprofile_combo.Active = 0; break; } i = 0; foreach (object [] row in printprofile_combo.Model as ListStore) { if (pref == (string)row [0]) { printprofile_combo.Active = i; break; } i++; } break; } } #endregion #region event handlers void ConnectEvents () { Preferences.SettingChanged += OnPreferencesChanged; screenprofile_combo.Changed += HandleScreenProfileComboChanged; printprofile_combo.Changed += HandlePrintProfileComboChanged; theme_combo.Changed += HandleThemeComboChanged; writemetadata_radio.Toggled += HandleWritemetadataGroupChanged; always_sidecar_check.Toggled += HandleAlwaysSidecareCheckToggled; } void HandlePhotosdirChanged (object sender, System.EventArgs args) { photosdir_chooser.CurrentFolderChanged -= HandlePhotosdirChanged; Preferences.Set (Preferences.STORAGE_PATH, photosdir_chooser.Filename); photosdir_chooser.CurrentFolderChanged += HandlePhotosdirChanged; FSpot.Core.Global.PhotoUri = new SafeUri (photosdir_chooser.Uri, true); } void HandleWritemetadataGroupChanged (object sender, System.EventArgs args) { Preferences.Set (Preferences.METADATA_EMBED_IN_IMAGE, writemetadata_radio.Active); } void HandleAlwaysSidecareCheckToggled (object sender, EventArgs args) { Preferences.Set (Preferences.METADATA_ALWAYS_USE_SIDECAR, always_sidecar_check.Active); } void HandleThemeComboChanged (object sender, EventArgs e) { ComboBox combo = sender as ComboBox; if (combo == null) return; TreeIter iter; if (combo.GetActiveIter (out iter)) { string gtkrc = (string)combo.Model.GetValue (iter, 1); if (!String.IsNullOrEmpty (gtkrc)) Preferences.Set (Preferences.GTK_RC, gtkrc); else Preferences.Set (Preferences.GTK_RC, String.Empty); } Gtk.Rc.DefaultFiles = FSpot.Core.Global.DefaultRcFiles; Gtk.Rc.AddDefaultFile (Preferences.Get (Preferences.GTK_RC)); Gtk.Rc.ReparseAllForSettings (Gtk.Settings.Default, true); } void HandleScreenProfileComboChanged (object sender, EventArgs e) { ComboBox combo = sender as ComboBox; if (combo == null) return; TreeIter iter; if (combo.GetActiveIter (out iter)) { switch ((int)combo.Model.GetValue (iter, 1)) { case 0: Preferences.Set (Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE, String.Empty); break; case -1: Preferences.Set (Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE, "_x_profile_"); break; case 1: Preferences.Set (Preferences.COLOR_MANAGEMENT_DISPLAY_PROFILE, (string)combo.Model.GetValue (iter, 0)); break; } } } void HandlePrintProfileComboChanged (object sender, EventArgs e) { ComboBox combo = sender as ComboBox; if (combo == null) return; TreeIter iter; if (combo.GetActiveIter (out iter)) { switch ((int)combo.Model.GetValue (iter, 1)) { case 0: Preferences.Set (Preferences.COLOR_MANAGEMENT_OUTPUT_PROFILE, String.Empty); break; case 1: Preferences.Set (Preferences.COLOR_MANAGEMENT_OUTPUT_PROFILE, (string)combo.Model.GetValue (iter, 0)); break; } } } #endregion #region Gtk widgetry void ThemeCellFunc (CellLayout cell_layout, CellRenderer cell, TreeModel tree_model, TreeIter iter) { string name = (string)tree_model.GetValue (iter, 0); (cell as CellRendererText).Text = name; } bool ThemeSeparatorFunc (TreeModel tree_model, TreeIter iter) { return tree_model.GetValue (iter, 0) == null; } void ProfileCellFunc (CellLayout cell_layout, CellRenderer cell, TreeModel tree_model, TreeIter iter) { string name = (string)tree_model.GetValue (iter, 0); (cell as CellRendererText).Text = name; } bool ProfileSeparatorFunc (TreeModel tree_model, TreeIter iter) { return tree_model.GetValue (iter, 0) == null; } #endregion } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/ThreadProgressDialog.cs0000644000175000017500000001045011503404760026126 0ustar00rubenruben00000000000000/* * FSpot.UI.Dialog.ThreadProgressDialog.cs * * Author(s): * Larry Ewing * Stephane Delcroix * * Copyright (c) 2004-2009 Novell, Inc. * * This is open source software. See COPYING for details. */ using System; using System.Threading; using System.Collections.Generic; using Gtk; using FSpot.Utils; namespace FSpot.UI.Dialog { public class ThreadProgressDialog : Gtk.Dialog { DelayedOperation delay; Gtk.ProgressBar progress_bar; Gtk.Label message_label; Gtk.Button button; Gtk.Button retry_button; Gtk.Button skip_button; Gtk.ResponseType error_response; AutoResetEvent error_response_event; object syncHandle = new object (); Thread thread; public ThreadProgressDialog (Thread thread, int total) { /* if (parent_window) this.TransientFor = parent_window; */ this.Title = thread.Name; this.thread = thread; HasSeparator = false; BorderWidth = 6; SetDefaultSize (300, -1); message_label = new Gtk.Label (String.Empty); VBox.PackStart (message_label, true, true, 12); progress_bar = new Gtk.ProgressBar (); VBox.PackStart (progress_bar, true, true, 6); retry_button = new Gtk.Button (Mono.Unix.Catalog.GetString ("Retry")); retry_button.Clicked += new EventHandler (HandleRetryClicked); skip_button = new Gtk.Button (Mono.Unix.Catalog.GetString ("Skip")); skip_button.Clicked += new EventHandler (HandleSkipClicked); ActionArea.Add (retry_button); ActionArea.Add (skip_button); button_label = Gtk.Stock.Cancel; button = (Gtk.Button) AddButton (button_label, (int)Gtk.ResponseType.Cancel); delay = new DelayedOperation (new GLib.IdleHandler (HandleUpdate)); Response += HandleResponse; Destroyed += HandleDestroy; } string progress_text; public string ProgressText { get { return progress_text; } set { lock (syncHandle) { progress_text = value; delay.Start (); } } } string button_label; public string ButtonLabel { get { return button_label; } set { lock (syncHandle) { button_label = value; delay.Start (); } } } string message; public string Message { get { return message; } set { lock (syncHandle) { message = value; delay.Start (); } } } double fraction; public double Fraction { get { return Fraction; } set { lock (syncHandle) { fraction = value; delay.Start (); } } } List widgets; public void VBoxPackEnd (Widget w) { if (widgets == null) widgets = new List (); lock (syncHandle) { widgets.Add (w); delay.Start (); } } internal void SetProperties (string progress_text, string button_label, string message, double fraction) { lock (syncHandle) { this.progress_text = progress_text; this.button_label = button_label; this.message = message; this.fraction = fraction; delay.Start (); } } bool retry_skip; bool RetrySkipVisible { set { retry_skip = value; delay.Start (); } } public bool PerformRetrySkip () { error_response = Gtk.ResponseType.None; RetrySkipVisible = true; error_response_event = new AutoResetEvent (false); error_response_event.WaitOne (); RetrySkipVisible = false; return (error_response == Gtk.ResponseType.Yes); } void HandleResponse (object obj, Gtk.ResponseArgs args) { this.Destroy (); } bool HandleUpdate () { message_label.Text = message; progress_bar.Text = progress_text; progress_bar.Fraction = System.Math.Min (1.0, System.Math.Max (0.0, fraction)); button.Label = button_label; retry_button.Visible = skip_button.Visible = retry_skip; if (widgets != null && widgets.Count > 0) { foreach (var w in widgets) VBox.PackEnd (w); widgets.Clear (); } return false; } void HandleDestroy (object sender, EventArgs args) { delay.Stop (); if (thread.IsAlive) { thread.Abort (); } } void HandleRetryClicked (object obj, EventArgs args) { error_response = Gtk.ResponseType.Yes; error_response_event.Set (); } void HandleSkipClicked (object obj, EventArgs args) { error_response = Gtk.ResponseType.No; error_response_event.Set (); } public void Start () { ShowAll (); RetrySkipVisible = false; thread.Start (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/ProgressDialog.cs0000644000175000017500000000412411503404760024777 0ustar00rubenruben00000000000000/* * FSpot.UI.Dialog.ProgressDialog.cs * * Author(s): * Ettore Perazzoli * Larry Ewing * * This is free software. See COPYING for details. */ using GLib; using Gtk; using System; using Mono.Unix; namespace FSpot.UI.Dialog { public class ProgressDialog : Gtk.Dialog { private bool cancelled; private void HandleResponse (object me, ResponseArgs args) { cancelled = true; } public enum CancelButtonType { Cancel, Stop, None }; private int total_count; private ProgressBar progress_bar; public ProgressBar Bar { get { return progress_bar; } } private Label message_label; public Label Message { get { return message_label; } } private Gtk.Button button; public Gtk.Button Button { get { return button; } } public ProgressDialog (string title, CancelButtonType cancel_button_type, int total_count, Gtk.Window parent_window) { Title = title; this.total_count = total_count; if (parent_window != null) this.TransientFor = parent_window; HasSeparator = false; BorderWidth = 6; SetDefaultSize (300, -1); message_label = new Label (String.Empty); VBox.PackStart (message_label, true, true, 12); progress_bar = new ProgressBar (); VBox.PackStart (progress_bar, true, true, 6); switch (cancel_button_type) { case CancelButtonType.Cancel: button = (Gtk.Button)AddButton (Gtk.Stock.Cancel, (int) ResponseType.Cancel); break; case CancelButtonType.Stop: button = (Gtk.Button)AddButton (Gtk.Stock.Stop, (int) ResponseType.Cancel); break; } Response += new ResponseHandler (HandleResponse); } private int current_count; // Return true if the operation was cancelled by the user. public bool Update (string message) { current_count ++; message_label.Text = message; progress_bar.Text = String.Format (Catalog.GetString ("{0} of {1}"), current_count, total_count); progress_bar.Fraction = (double) current_count / total_count; ShowAll (); while (Application.EventsPending ()) Application.RunIteration (); return cancelled; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/DateRangeDialog.cs0000644000175000017500000001724711503404760025037 0ustar00rubenruben00000000000000/* * FSpot.UI.Dialog.DateRangeDialog.cs * * Author(s): * Larry Ewing * Bengt Thuree * Stephane Delcroix * * This is free software. See COPYING for details. * */ using Gtk; using System; using Mono.Unix; using FSpot.Query; using FSpot.Widgets; namespace FSpot.UI.Dialog { public class DateRangeDialog : BuilderDialog { [GtkBeans.Builder.Object] Frame startframe; [GtkBeans.Builder.Object] Frame endframe; [GtkBeans.Builder.Object] ComboBox period_combobox; DateEdit start_dateedit; DateEdit end_dateedit; TreeStore rangestore; static string [] ranges = { "today", "yesterday", "last7days", "last30days", "last90days", "last360days", "currentweek", "previousweek", "thismonth", "previousmonth", "thisyear", "previousyear", "alldates", "customizedrange" }; public DateRangeDialog (DateRange query_range, Gtk.Window parent_window) : base ("DateRangeDialog.ui", "date_range_dialog") { TransientFor = parent_window; DefaultResponse = ResponseType.Ok; (startframe.Child as Bin).Child = start_dateedit = new DateEdit (); start_dateedit.Show (); (endframe.Child as Bin).Child = end_dateedit = new DateEdit (); end_dateedit.Show (); var cell_renderer = new CellRendererText (); // Build the combo box with years and month names period_combobox.Model = rangestore = new TreeStore (typeof (string)); period_combobox.PackStart (cell_renderer, true); period_combobox.SetCellDataFunc (cell_renderer, new CellLayoutDataFunc (RangeCellFunc)); foreach (string range in ranges) rangestore.AppendValues (GetString(range)); period_combobox.Changed += HandlePeriodComboboxChanged; period_combobox.Active = System.Array.IndexOf(ranges, "last7days"); // Default to Last 7 days if (query_range != null) { start_dateedit.DateTimeOffset = query_range.Start; end_dateedit.DateTimeOffset = query_range.End; } } void RangeCellFunc (CellLayout cell_layout, CellRenderer cell, TreeModel tree_model, TreeIter iter) { string name = (string)tree_model.GetValue (iter, 0); (cell as CellRendererText).Text = name; } private string GetString(string rangename) { System.DateTime today = System.DateTime.Today; switch (rangename) { case "today": return Catalog.GetString("Today"); case "yesterday": return Catalog.GetString("Yesterday"); case "last7days": return Catalog.GetString("Last 7 days"); case "last30days": return Catalog.GetString("Last 30 days"); case "last90days": return Catalog.GetString("Last 90 days"); case "last360days": return Catalog.GetString("Last 360 days"); case "currentweek": return Catalog.GetString("Current Week (Mon-Sun)"); case "previousweek": return Catalog.GetString("Previous Week (Mon-Sun)"); case "thismonth": if (today.Year == (today.AddMonths(-1)).Year) // Same year for current and previous month. Present only MONTH return today.ToString("MMMM"); else // Different year for current and previous month. Present both MONTH, and YEAR return today.ToString("MMMM, yyyy"); case "previousmonth": if (today.Year == (today.AddMonths(-1)).Year) // Same year for current and previous month. Present only MONTH return (today.AddMonths(-1)).ToString("MMMM"); else // Different year for current and previous month. Present both MONTH, and YEAR return (today.AddMonths(-1)).ToString("MMMM, yyyy"); case "thisyear": return today.ToString("yyyy"); case "previousyear": return today.AddYears(-1).ToString("yyyy"); case "alldates": return Catalog.GetString("All Images"); case "customizedrange": return Catalog.GetString("Customized Range"); default: return rangename; } } public DateRange Range { get { return QueryRange (period_combobox.Active); } } private DateRange QueryRange (int index) { return QueryRange ( ranges [index]); } private DateRange QueryRange (string rangename) { System.DateTime today = System.DateTime.Today; System.DateTime startdate = today; System.DateTime enddate = today; bool clear = false; switch (rangename) { case "today": startdate = today; enddate = today; break; case "yesterday": startdate = today.AddDays (-1); enddate = today.AddDays (-1); break; case "last7days": startdate = today.AddDays (-6); enddate = today; break; case "last30days": startdate = today.AddDays (-29); enddate = today; break; case "last90days": startdate = today.AddDays (-89); enddate = today; break; case "last360days": startdate = today.AddDays (-359); enddate = today; break; case "currentweek": startdate = today.AddDays (System.DayOfWeek.Sunday - today.DayOfWeek); // Gets to Sunday startdate = startdate.AddDays (1); // Advance to Monday according to ISO 8601 enddate = today; break; case "previousweek": startdate = today.AddDays (System.DayOfWeek.Sunday - today.DayOfWeek); // Gets to Sunday startdate = startdate.AddDays (1); // Advance to Monday according to ISO 8601 startdate = startdate.AddDays(-7); // Back 7 days enddate = startdate.AddDays (6); break; case "thismonth": startdate = new System.DateTime(today.Year, today.Month, 1); // the first of the month enddate = today; // we don't have pictures in the future break; case "previousmonth": startdate = new System.DateTime((today.AddMonths(-1)).Year, (today.AddMonths(-1)).Month, 1); enddate = new System.DateTime((today.AddMonths(-1)).Year, (today.AddMonths(-1)).Month, System.DateTime.DaysInMonth((today.AddMonths(-1)).Year,(today.AddMonths(-1)).Month)); break; case "thisyear": startdate = new System.DateTime(today.Year, 1, 1); // Jan 1st of this year enddate = today; break; case "previousyear": startdate = new System.DateTime((today.AddYears(-1)).Year, 1, 1); // Jan 1st of prev year enddate = new System.DateTime((today.AddYears(-1)).Year, 12, 31); // Dec, 31 of prev year break; case "alldates": clear = true; break; case "customizedrange": startdate = start_dateedit.DateTimeOffset.Date; enddate = end_dateedit.DateTimeOffset.Date; break; default: clear = true; break; } if (!clear) return new DateRange (startdate, enddate.Add (new System.TimeSpan(23,59,59))); else return null; } void HandleDateEditChanged (object o, EventArgs args) { period_combobox.Changed -= HandlePeriodComboboxChanged; period_combobox.Active = System.Array.IndexOf (ranges, "customizedrange"); period_combobox.Changed += HandlePeriodComboboxChanged; } void HandlePeriodComboboxChanged (object o, EventArgs args) { start_dateedit.DateChanged -= HandleDateEditChanged; ((Gtk.Entry) start_dateedit.Children [0] as Gtk.Entry).Changed -= HandleDateEditChanged; end_dateedit.DateChanged -= HandleDateEditChanged; ((Gtk.Entry) end_dateedit.Children [0] as Gtk.Entry).Changed -= HandleDateEditChanged; ComboBox combo = o as ComboBox; if (o == null) return; start_dateedit.Sensitive = (combo.Active != System.Array.IndexOf (ranges, "alldates")); end_dateedit.Sensitive = (combo.Active != System.Array.IndexOf (ranges, "alldates")); DateRange range = QueryRange (period_combobox.Active); if (range != null) { start_dateedit.DateTimeOffset = range.Start; end_dateedit.DateTimeOffset = range.End; } start_dateedit.DateChanged += HandleDateEditChanged; ((Gtk.Entry) start_dateedit.Children [0] as Gtk.Entry).Changed += HandleDateEditChanged; end_dateedit.DateChanged += HandleDateEditChanged; ((Gtk.Entry) end_dateedit.Children [0] as Gtk.Entry).Changed += HandleDateEditChanged; } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/AdjustTimeDialog.cs0000644000175000017500000001617711503404760025257 0ustar00rubenruben00000000000000/* * FSpot.UI.Dialogs.AdjstTimeDialog.cs * * Author(s): * Larry Ewing * Stephane Delcroix * * * Copyright (c) 2006-2009 Novell, Inc. * * This is free software. See COPYING for details. */ using System; using Gtk; using System.Collections; using Mono.Unix; using FSpot.Core; using FSpot.Database; using FSpot.Widgets; using Hyena; namespace FSpot.UI.Dialog { public class AdjustTimeDialog : BuilderDialog { [GtkBeans.Builder.Object] ScrolledWindow view_scrolled; [GtkBeans.Builder.Object] ScrolledWindow tray_scrolled; [GtkBeans.Builder.Object] Button ok_button; [GtkBeans.Builder.Object] Button cancel_button; [GtkBeans.Builder.Object] SpinButton photo_spin; [GtkBeans.Builder.Object] Label name_label; [GtkBeans.Builder.Object] Label old_label; [GtkBeans.Builder.Object] Label count_label; [GtkBeans.Builder.Object] Gnome.DateEdit date_edit; [GtkBeans.Builder.Object] Frame tray_frame; [GtkBeans.Builder.Object] Gtk.Entry offset_entry; [GtkBeans.Builder.Object] Gtk.CheckButton difference_check; [GtkBeans.Builder.Object] Gtk.Frame action_frame; [GtkBeans.Builder.Object] Gtk.Entry spacing_entry; [GtkBeans.Builder.Object] Gtk.Label starting_label; IBrowsableCollection collection; BrowsablePointer item; CollectionGridView tray; PhotoImageView view; Db db; TimeSpan gnome_dateedit_sucks; public AdjustTimeDialog (Db db, IBrowsableCollection collection) : base ("AdjustTimeDialog.ui", "time_dialog") { this.db = db; this.collection = collection; view = new PhotoImageView (collection); view_scrolled.Add (view); item = view.Item; item.Changed += HandleItemChanged; item.MoveFirst (); tray = new BrowseablePointerGridView (view.Item) { MaxColumns = 1, DisplayRatings = false, DisplayTags = false, DisplayDates = true }; tray_scrolled.Add (tray); //forward_button.Clicked += HandleForwardClicked; //back_button.Clicked += HandleBackClicked; ok_button.Clicked += HandleOkClicked; cancel_button.Clicked += HandleCancelClicked; photo_spin.ValueChanged += HandleSpinChanged; photo_spin.SetIncrements (1.0, 1.0); photo_spin.Adjustment.StepIncrement = 1.0; photo_spin.Wrap = true; date_edit.TimeChanged += HandleTimeChanged; date_edit.DateChanged += HandleTimeChanged; Gtk.Entry entry = (Gtk.Entry) date_edit.Children [0]; entry.Changed += HandleTimeChanged; entry = (Gtk.Entry) date_edit.Children [2]; entry.Changed += HandleTimeChanged; offset_entry.Changed += HandleOffsetChanged; ShowAll (); HandleCollectionChanged (collection); spacing_entry.Changed += HandleSpacingChanged; spacing_entry.Sensitive = ! difference_check.Active; difference_check.Toggled += HandleActionToggled; } DateTime EditTime { get { return date_edit.Time - gnome_dateedit_sucks; } } TimeSpan Offset { get { Log.DebugFormat ("{0} - {1} = {2}", date_edit.Time, item.Current.Time, date_edit.Time - item.Current.Time); return EditTime - item.Current.Time; } set { date_edit.Time = item.Current.Time - gnome_dateedit_sucks + value; } } void HandleTimeChanged (object sender, EventArgs args) { TimeSpan span = Offset; Log.DebugFormat ("time changed {0}", span); if (! offset_entry.HasFocus) offset_entry.Text = span.ToString (); starting_label.Text = "min."; difference_check.Label = String.Format (Catalog.GetString ("Shift all photos by {0}"), Offset); } void HandleItemChanged (object sender, BrowsablePointerChangedEventArgs args) { //back_button.Sensitive = (Item.Index > 0 && collection.Count > 0); //forward_button.Sensitive = (Item.Index < collection.Count - 1); if (item.IsValid) { IPhoto curr_item = item.Current; name_label.Text = System.Uri.UnescapeDataString(curr_item.Name); old_label.Text = (curr_item.Time).ToString (); int i = collection.Count > 0 ? item.Index + 1: 0; // Note for translators: This indicates the current photo is photo {0} of {1} out of photos count_label.Text = System.String.Format (Catalog.GetString ("{0} of {1}"), i, collection.Count); DateTime actual = curr_item.Time; date_edit.Time = actual; gnome_dateedit_sucks = date_edit.Time - actual; } HandleTimeChanged (this, System.EventArgs.Empty); photo_spin.Value = item.Index + 1; } private void ShiftByDifference () { TimeSpan span = Offset; Photo [] photos = new Photo [collection.Count]; for (int i = 0; i < collection.Count; i++) { Photo p = (Photo) collection [i]; DateTime time = p.Time; p.Time = time + span; photos [i] = p; Log.DebugFormat ("XXXXX old: {0} new: {1} span: {2}", time, p.Time, span); } db.Photos.Commit (photos); } private void SpaceByInterval () { DateTime date = EditTime; long ticks = (long) (double.Parse (spacing_entry.Text) * TimeSpan.TicksPerMinute); TimeSpan span = new TimeSpan (ticks); Photo [] photos = new Photo [collection.Count]; for (int i = 0; i < collection.Count; i++) { photos [i] = (Photo) collection [i]; } TimeSpan accum = new TimeSpan (0); for (int j = item.Index; j > 0; j--) { date -= span; } for (int i = 0; i < photos.Length; i++) { photos [i].Time = date + accum; accum += span; } db.Photos.Commit (photos); } void HandleSpinChanged (object sender, EventArgs args) { item.Index = photo_spin.ValueAsInt - 1; } void HandleOkClicked (object sender, EventArgs args) { if (! item.IsValid) throw new ApplicationException ("invalid item selected"); Sensitive = false; if (difference_check.Active) ShiftByDifference (); else SpaceByInterval (); Destroy (); } void HandleOffsetChanged (object sender, EventArgs args) { Log.DebugFormat ("offset = {0}", Offset); TimeSpan current = Offset; try { TimeSpan span = TimeSpan.Parse (offset_entry.Text); if (span != current) Offset = span; } catch (System.Exception) { Log.WarningFormat ("unparsable span {0}", offset_entry.Text); } } void HandleSpacingChanged (object sender, EventArgs args) { if (! spacing_entry.Sensitive) return; try { double.Parse (spacing_entry.Text); ok_button.Sensitive = true; } catch { ok_button.Sensitive = false; } } void HandleActionToggled (object sender, EventArgs args) { spacing_entry.Sensitive = ! difference_check.Active; HandleSpacingChanged (sender, args); } void HandleCancelClicked (object sender, EventArgs args) { Destroy (); } void HandleForwardClicked (object sender, EventArgs args) { view.Item.MoveNext (); } void HandleBackClicked (object sender, EventArgs args) { view.Item.MovePrevious (); } void HandleCollectionChanged (IBrowsableCollection collection) { bool multiple = collection.Count > 1; tray_frame.Visible = multiple; //forward_button.Visible = multiple; //back_button.Visible = multiple; count_label.Visible = multiple; photo_spin.Visible = multiple; action_frame.Visible = multiple; photo_spin.SetRange (1.0, (double) collection.Count); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/LastRollDialog.cs0000644000175000017500000000701511503404760024731 0ustar00rubenruben00000000000000/* * LastRollDialog.cs: * * Author(s): * Bengt Thuree (bengt@thuree.com) * Stephane Delcroix * * This is free software. See COPYING for details. */ using System; using Gtk; using FSpot.Core; using FSpot.Query; using FSpot.UI.Dialog; namespace FSpot.UI.Dialog { public class LastRolls : BuilderDialog { FSpot.PhotoQuery query; RollStore rollstore; Roll [] rolls; [GtkBeans.Builder.Object] private ComboBox combo_filter; // at, after, or between [GtkBeans.Builder.Object] private ComboBox combo_roll_1; [GtkBeans.Builder.Object] private ComboBox combo_roll_2; [GtkBeans.Builder.Object] private Label and_label; // and label between two comboboxes. [GtkBeans.Builder.Object] private Label photos_in_selected_rolls; public LastRolls (FSpot.PhotoQuery query, RollStore rollstore, Window parent) : base ("LastImportRollFilterDialog.ui", "last_import_rolls_filter") { this.query = query; this.rollstore = rollstore; rolls = rollstore.GetRolls (FSpot.Preferences.Get (FSpot.Preferences.IMPORT_GUI_ROLL_HISTORY)); TransientFor = parent; PopulateCombos (); combo_filter.Active = 0; combo_roll_1.Active = 0; combo_roll_2.Active = 0; DefaultResponse = ResponseType.Ok; Response += HandleResponse; Show (); } [GLib.ConnectBefore] protected void HandleResponse (object o, Gtk.ResponseArgs args) { if (args.ResponseId == ResponseType.Ok) { Roll [] selected_rolls = SelectedRolls (); if (selected_rolls != null && selected_rolls.Length > 0 ) query.RollSet = new RollSet (selected_rolls); } Destroy (); } void HandleComboFilterChanged (object o, EventArgs args) { combo_roll_2.Visible = (combo_filter.Active == 2); and_label.Visible = combo_roll_2.Visible; UpdateNumberOfPhotos (); } void HandleComboRollChanged (object o, EventArgs args) { UpdateNumberOfPhotos (); } private void UpdateNumberOfPhotos() { Roll [] selected_rolls = SelectedRolls (); uint sum = 0; if (selected_rolls != null) foreach (Roll roll in selected_rolls) sum = sum + rollstore.PhotosInRoll (roll); photos_in_selected_rolls.Text = sum.ToString(); } private void PopulateCombos () { for (uint k = 0; k < rolls.Length; k++) { uint numphotos = rollstore.PhotosInRoll (rolls [k]); // Roll time is in UTC always DateTime date = rolls [k].Time.ToLocalTime (); string header = String.Format ("{0} ({1})", date.ToString("%dd %MMM, %HH:%mm"), numphotos); combo_roll_1.AppendText (header); combo_roll_2.AppendText (header); } } private Roll [] SelectedRolls () { if ((combo_roll_1.Active < 0) || ((combo_filter.Active == 2) && (combo_roll_2.Active < 0))) return null; System.Collections.ArrayList result = new System.Collections.ArrayList (); switch (combo_filter.Active) { case 0 : // at - Return the roll the user selected result.Add (rolls [combo_roll_1.Active]); break; case 1 : // after - Return all rolls from latest to the one the user selected for (uint k = 0; k <= combo_roll_1.Active; k++) result.Add (rolls [k]); break; case 2 : // between - Return all rolls between the two import rolls the user selected uint k1 = (uint) combo_roll_1.Active; uint k2 = (uint) combo_roll_2.Active; if (k1 > k2) { k1 = (uint) combo_roll_2.Active; k2 = (uint) combo_roll_1.Active; } for (uint k = k1; k <= k2; k++) result.Add (rolls[k]); break; } return (Roll []) result.ToArray (typeof(Roll)); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/TagSelectionDialog.cs0000644000175000017500000000133711503404760025557 0ustar00rubenruben00000000000000using System; using Gdk; using Gtk; using FSpot.Core; namespace FSpot.UI.Dialog { public class TagSelectionDialog : BuilderDialog { [GtkBeans.Builder.Object] Gtk.ScrolledWindow tag_selection_scrolled; TagSelectionWidget tag_selection_widget; public TagSelectionDialog (TagStore tags) : base ("tag_selection_dialog.ui", "tag_selection_dialog") { tag_selection_widget = new TagSelectionWidget (tags); tag_selection_scrolled.Add (tag_selection_widget); tag_selection_widget.Show (); } public Tag[] Run () { int response = base.Run (); if ((ResponseType) response == ResponseType.Ok) return tag_selection_widget.TagHighlight; return null; } public void Hide () { base.Hide (); } } } f-spot-0.8.2/src/Clients/MainApp/FSpot.UI.Dialog/AboutDialog.cs0000644000175000017500000001277011503404760024253 0ustar00rubenruben00000000000000/* * FSpot.UI.Dialog.AboutDialog.cs * * Author(s): * Stephane Delcroix * * Copyright (c) 2008-2009 Novell, Inc. * * This is open source software. See COPYING for details. */ using System; using System.IO; using Mono.Unix; using Hyena; namespace FSpot.UI.Dialog { public class AboutDialog : Gtk.AboutDialog { private static AboutDialog about = null; private AboutDialog () { Artists = new string [] { "Jakub Steiner", "Matthew Paul Thomas", }; Authors = new string [] { "Primary Development", "\tLawrence Ewing", "\tStephane Delcroix", "\tRuben Vermeersch", "", "Active Contributors to this release", "\tAdemir Mendoza", "\tAlex Launi", "\tAnton Keks", "\tBertrand Lorentz", "\tChristian Krause", "\tChristopher Halse Rogers", "\tDaniel Köb", "\tEric Faehnrich", "\tEvan Briones", "\tGabriel Burt", "\tIain Churcher", "\tIain Lane", "\tLorenzo Milesi", "\tÅukasz JernaÅ›", "\tMartin Slota", "\tMike Gem\x00fcnde", "\tMike Wallick", "\tNick Van Eeckhout", "\tNuno Ferreira", "\tPaul Lange", "\tPaul Wellner Bou", "\tPeter Goetz", "\tRuben Vermeersch", "\tTim Howard", "\tTim Retout", "\tTomas Kovacik", "\tTrevor Buchanan", "\tVincent Pomey", "\tWojciech Dzierżanowski", "", "Contributors", "\tAaron Bockover", "\tAlessandro Gervaso", "\tAlex Graveley", "\tAlvaro del Castillo", "\tBengt Thuree", "\tBen Monnahan", "\tChad Files", "\tEttore Perazzoli", "\tEwen Cheslack-Postava", "\tGrahm Orr", "\tJeffrey Finkelstein", "\tJeffrey Stedfast", "\tJoerg Buesse", "\tJoe Shaw", "\tJon Trowbridge", "\tJoshua Tauberer", "\tKarl Mikaelsson", "\tLaurence Hygate", "\tLee Willis", "\tMartin Willemoes Hansen", "\tMatt Jones", "\tMatt Perry", "\tMichal Nánási", "\tMiguel de Icaza", "\tNat Friedman", "\tPascal de Bruijn", "\tPatanjali Somayaji", "\tPeter Johanson", "\tTambet Ingo", "\tThomas Van Machelen", "\tTodd Berman", "\tVasily Kirilichev", "\tVincent Moreau", "\tVladimir Vukicevic", "\tXavier Bouchoux", "\tYann Leprince", "\tYves Kurz", "", "In memory Of", "\tEttore Perazzoli", }; Comments = Catalog.GetString ("Photo management for GNOME"); Copyright = Catalog.GetString ("Copyright \x00a9 2003-2010 Novell Inc."); Documenters = new string[] { "Aaron Bockover", "Alexandre Prokoudine", "Bengt Thuree", "Gabriel Burt", "Harold Schreckengost", "Miguel de Icaza", "Stephane Delcroix", }; //Read license from COPYING try { System.Reflection.Assembly assembly = System.Reflection.Assembly.GetCallingAssembly (); using (Stream s = assembly.GetManifestResourceStream ("COPYING")) { StreamReader reader = new StreamReader (s); License = reader.ReadToEnd (); s.Close (); } } catch (Exception e) { Log.DebugException (e); License = "GPL v2"; } Logo = new Gdk.Pixbuf (System.Reflection.Assembly.GetEntryAssembly (), "f-spot-128.png"); ProgramName = "F-Spot"; TranslatorCredits = Catalog.GetString ("translator-credits"); if (System.String.Compare (TranslatorCredits, "translator-credits") == 0) TranslatorCredits = null; Version = FSpot.Core.Defines.VERSION; Website = "http://f-spot.org"; WebsiteLabel = Catalog.GetString ("F-Spot Website"); WrapLicense = true; } public static void ShowUp () { if (about == null) { about = new AboutDialog (); about.Destroyed += delegate (object o, EventArgs e) {about = null;}; about.Response += delegate (object o, Gtk.ResponseArgs e) {if (about != null) about.Destroy ();}; } about.Show (); } } } f-spot-0.8.2/src/Clients/Makefile.am0000644000175000017500000000002511430555234017464 0ustar00rubenruben00000000000000SUBDIRS = \ MainApp f-spot-0.8.2/icons/0000777000175000017500000000000011503407436014363 5ustar00rubenruben00000000000000f-spot-0.8.2/icons/tag-new-22.png0000644000175000017500000000211011417267577016660 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÅIDAT8µ•Mh\U€¿sïÍd:Ifâ´IóßšÚÔtjš©(".Š ®TÜ(¨ ¸w­?àF!¦hTÄ.tãJ]X„n\**j$- ‰Ú‰¤gÚ´±I›7“¼yï¸x/±“™¸ó¬Þ}÷òïÜ{Þ}¢ªüá¶šxó­7îk2î¤_ öož³Î.tegÞyø®/&Ó»¿=¶<{ïG.—€©lN礑ñØÛc‡œÈ÷££SÝ=ݨ*"€Õ培R8½v÷=ηu>3XY|ÿ¯øÂwÀ$ðU6§çëÀÛüéÑÑ;ú{z{Å+{ÌLýæ•J—\gg‡ ×ÞÒ½L*™$Ýñ$ˆ]ûüjÅ¿ñåOAåÜ)àc³Ù¶ªþ{;;;;zûú$ Cf¦f*Å¿ Ÿû«Áp±Xü°#Ût qèðè¶0 (•.áÃØñãÇóU§ã¿üx’êÚ\Ãs VgX)>_ºkÀ‰„yeäÐhÊ:Ëúuuwaáåññׇ­oŽe2-ե⻠Á7 O£Áâ°\Óa ¹ÛwÁÆ»‘‘‘dºµí± ùÙLJ†ö†ƒ{û›C~o×.\ À\ Xk­%Ôj<š›ÜyäHòèÑ)WÊ,/åQªUü•oÊgH¤Á6#&uF¾æëúXŒ@Ƭ±`Ï[¡\öPÍP®ö3ŸŸ@Ö~¥ÉüÍÅÉO¸}ßÐghp 8ÍiýbDE¸²p•žÞ¬±c™¿8GÿÀ.T•0ì!°6åÀ^ãlþ»?x(esÑÙÔ‹ÁZËêjgÖF`¯ìÑäùÙ<»‚VBö ‰$ K’Íi©Fp3ØZƒ16~¶\œ›ÃÙ(¿sMxÞ ÎZ …y¬±XS‡hllÄ€‰Ê±Æ±â­à\ ŽXëðIEND®B`‚f-spot-0.8.2/icons/view-far-22.png0000644000175000017500000000120311417267577017040 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<IDAT8ÕUÁjÔP=ïMÆ´ÿAÇÏÐ"\ˆø\tÓ(¤[¡þC]ŠÌàÐé›B­à´µ]‹"´ Áä奼ëbšd’‰ãL¡ / image/svg+xml Emblem Urgent Andreas Nilsson Jakub Steiner f-spot-0.8.2/icons/adjust-colors-16.svg0000644000175000017500000002272311417267576020140 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/emblem-event-24.png0000644000175000017500000000246111417267577017711 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× ma9Ó¾IDATHǽ•ÛO›eÀýí×œÊqld˜8èX&Û8nènƘ!¢Þ ÉôðÖ¿Àį½Ñ¸MD’yÁÜæ)n0Å£PpfÚ…B[z|í÷Õ :¶Ž¹lú&oòž÷ùå9¾ðËÓ.{z»Ý@—(ŠÇ€Ó4kA£†a\~èô<7 §·[Eñ3›ÍÖ×ÑÞ!×ÖÖZ5MÃfSÈf³øýóLÏLoNOOg2™Ì—†a|<Ð?¸ñL€žÞîUU;;:KÛÚÚmáp˜yÿº®£ë:†aàr¹¨¬¨BQF® oŽŽŽ®†ñÖ@ÿàèS=½Ýšª]<}úC-Öñz§X¯oß ‚€išÛ{UÕ8Øt¿ßÏÐ…¡d&“yu pø‰€žÞnU–å»ï÷}P•NëLxîP]]Ãáæ#ãp8¹ŸJ±ZâæÍë‚$I¢±ÁM,ãü÷ç Ãxa 0õ@¯ø`q Éýùɯwˆ·ÇǰX,t{™×^=IYi_ŸýŠÛãctv§´´Œî&dÙŠon–Ph‰šêôtZ^] »&=SCÛV?ȇÃÑW_¿Ï:vûG´ÐÚڎŲed4%>4Ýb¡åh+m­íd³Yææ|nnVAèËeßCÐÕÐÐ(„B!LÓ¤¸¨˜ÎŽãÏ”çm­”•–OÄÑuú}õЕE±³®®Î¶¸´€Û}I’ž Š"nwáð •U•Š(ŠyI’Ú4U%ÛrAyyÅsUkEN>IcWì­y]׫AØöw‘³ø_•%“ÉgEE[ò™ŒÍfÃ4Íš<€ D"±í–Htm‡»ÝÀ¹þ3¤RùHdKÞ4 6õMrí$/È£ëëëÛ€Phi ÷í÷P…ÕÕ0çúÏ’Jm§:K9yUUY ‡Fó†a\ ›%%¥x<d2™<@¹«œÞžw±ÙÂá.^º@î-ž\QjZ ‹‹¹F˜gÁ•ÉÉICÓ4dYf-²ÆðÈ•Á¬¨¤·çJJJq¹\üþÇ+ádÙJÖ̲¸¸hWò*yjÒ»Üи¿h¬ªª–âñ8 ADA¤ººf;ø………¼t¨™Ý»kùóú(#×®b±X¨(/gÂãÙˆÅbg¾ýæ»/v´Šý /þ‰D>Ú]SSàt8I$øæ|øæ|X­V$IBQìD£|s>._þ;ã¸\å„–—ñz½aÓ4OLMzÓOì¦ožzã»Ý>ÔÞÞnw8,/‡òbñx7µÛUví*$^åÆ÷c±õS/\ú0vXˆÓÞ™„ªÚgb±Øñl6+ïݳWд,È"IVÙŠM±át!Š"ÏDÚëõÆg¦ÿúddøÚ-@ÏÍìP .¤|³sâ$T‚ÁÊd2™•e« ª*Šb#I'¸wïž1qg˜õýüÓ¯Ÿ  ö(ÀòØß`ŠP¶·nÏ!W¹«¹Èéܯh{DQÜeF<Oø×Ö"w—CËãóóþ `XV€Ô£.²<ᇠ{nÚrp 04° l÷sëtNq–ÿsüçÐþÉC¹'÷IEND®B`‚f-spot-0.8.2/icons/rating-rated-gray-16.png0000644000175000017500000000060011417267577020644 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆtEXtSoftwarewww.inkscape.org›î<IDAT8Ó¿.DQÇñÏøSHØ $šUÙ ¡ˆ‚J«÷…^"*áT^@á”B'Z‚D²‘Qì%w/{ý™d’9çÌ|Ïïü™©—cºœ>õ¶†Õº„ž€ˆh`ëÑ3¯NÁú1ŽÅÿVJñf¯¤ò "F0†IL—–f"bx-ùK` ëÅ`¢ªµqÒk4ÐúCñ+Ž3ó*Š÷ËØý…Šgeæ-| È4ötŽó=à03ï>&º^!3opQ³ûS¹ø  °f `*"ºÔu""*€6î+Ù:*â[`§:7så‚®¤óyÞp†³Ì|+æÏ#â;UÕöÝ@ó‡oaøcü¬¦‰/`˜‚šIEND®B`‚f-spot-0.8.2/icons/mode-image-edit-32.png0000644000175000017500000000237311417267577020261 0ustar00rubenruben00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<xIDATX…Å—KlTUÇß™WçΣ" œ‚%D¯ RK]Ù’ˆ÷ÆÝ  qOŒ&&ìea\!1!M\B@&E”>„A Ì Îtîy¸¸ódfhQ¾ÍäÞsîùÿÎ÷ÿî7÷ˆsŽgꙪáÖ‹#?ùHYuÈZ›Y.A™¾Ü½{÷!iµàèÑ£7ß}o$›N¥—KŸ…꿜øµ|ùòåälø‘ñL2™brf_ûËðÒð6œsÑl6*`ŒFkŸªoŸšp$¬é¼ß {¿:ùÔ¾Û·ƒÕ™¾%ˆ " ö{„B–ìšy6o¨òÇõ·ïxhÛe;‰HH!]RÐ`­é+úãlݘ糷1˜ÜÂ9øý “÷?@¨ÀÚ¦µmFQˆ(Ó"Ží¯æY•ÞŽRý<ŸQ¼ýÊssqœëž¿8E$½hއB!DT Àô0Á€P-¸{ßc~á^ß0¥Êuî=H3˜öºŠ—f'0åvá.+‡G÷#J¡”Ôtzd@ €P³ &’Ïg9vò*k×\búV‚ùÒ:V¤;ËGWËLÞ8Íš¯3}õ4k³[I­Xd Ü´@kÝÀÈ×-¨e _LQxhqN1êºy.:Ž®–I&ðê\ŽÁ›‚¬ª¦õLwÔD%ªL÷4w‹‰kWÈMýI4Ú‡ ÖØöòk ÔÖP-EhŒA)Õ àû~@Dqâ· K·¦JiöñÌ"ŠKçOM®æìŨÐ4ö¼‰ ú€Öšh4Ú P= „B¡°Äý[J•0åÒ<‡ =‡)úTÃÿÐç~9\[êÑi€H…|!¿D@úxˆùÂ,Õ…^¢Ÿ©‰q’+ñ’œ[@½:ƒPOPP‰(òÅ<ºêc‹ªFpÖ5ŠPkÍääd'€µ”(¬²ÿ  I‚‘(VC¥Ç¹ ·:KÈÀ“ÕÀâÑjÖ‹PëcǾ .»´´Mè=·9Ò³‚·@}`±…ŽŸ½É·?œ§T©¶ÍHôEù|Ï[|°cC×-B%àD¸páwr·ïôÜÓ×ÇîóáûoПöP"·g®Táàá3˜{WÈdعsGÃß÷»7¢zq}À‹ÅÈf_è PY˜ÅŠâ¯ém÷ׯJQ©††šÏjmͧg'¬ÿKÕ‹pxx¿ÚšÞv³½øfryúÓ^Ã6˜Éåñâ²Ù¡@$"‹57ƉD:šN„dƒD¢sëµ…F?y‡ƒ‡Ïð°´Ð6œJÄÝ»“Lf +»Öšb±( Ì‰ŽŽî“àZ¡zY¤ù³kd»F6õ˜Ø;Œ1ŒÅE¤ñU6û¾öËåy–í\‚ïûXkí¹sç¶ç[-ˆÿ¸ÿŸ:çûµü?Ãær¹Ÿ´Ö1@¤Ö¡0¼‡±X,²\êÆ]©TÊÀ$p»q4«A„Y¬ñ=p€qÎyÖÇóÝ1Ó±‡VsXIEND®B`‚f-spot-0.8.2/icons/view-restore-32.png0000644000175000017500000000216011417267577017757 0ustar00rubenruben00000000000000‰PNG  IHDR szzôsBIT|dˆtEXtSoftwarewww.inkscape.org›î<IDATX…Å–mh[eÇÿÏ“{“6MÓd-®l6kKa¢ÖMlqβÝdÁV‡ˆ²¡BJ‹%ZÚ1J‡-~éú!ZD&Â:#"sŸjÝX™ 52ûr™¥o+Ëlóvïs¶téKÒ›¥Öó%pïó?ÿß=çܓˈÿgð6t{|rÍÉ>óޏ=¾=UeMo6Õ6mýÒÒ›-yæ—ëV¿pô¹êØà÷£#“ÊlhGÜ_¥ÕšßþbýeuO¹Cýßþ29©ÌŽ(o ئ¸=¾†Í®W¼ôÙûÅΟÞ}½¾îÐÁJ«ÿâÕ‚‰©Ù JÀ;Ÿ<³-`œ V6võO }øñ} G$ÉôMUyé³'OÒmù–ðàÐÕ¢›3_L^úh4U›3€ÛãsÙ¬y6×®Â¶ÊÆ.!~–$~áø‘[í*Ù,›ô¡Ë¿©¿o]TUÍ¿^¿-xzßc%ñwÞ8b-/+n+v\jyû˜sÿþ}r\#ŒŒþ%†¯ßœRUí´ðnX:ÛÑ‚š½e.kD%œzµÞ*™fîÆ! ·çièò¡‰cJÀ›ØLœ3€,K‡w—:Í·Ãq„–ïy”Y Å¢øê»á°ÐD½ð†Òésn”ºŠ°ÓV¯9mf _ &4¡ÿ¨¼S™ô9¸=>«Yâ.k¾qM‡EâpÈÐuÂ‰ãµæÊòÒÆª¦®·ÇÇÒåȵOîÙ]3™¸å™ V"1Ü -c||^Ÿ[XŠ®¬D¹¦‰·ÜÐñ_Ô,Þ ç~þ‡ÈbèYæcAUծр €q%à§K+À¡päµP80¥¼"Û,Ó÷@GG‡ät:Ï!vM(Ëòß---gžßªfι½µµÕP2!úúú5jnœs¡ãLÿ•Œç òdœ>õ|6Þkz{{ljÄã©7 ‹Åpî\ìë„Äåå_§_ Èn†¦iÐuýáTU­nkkƒÉd2$ìéé)8ÿi#·X,«ƒ÷0ß—Zp¶ÿ Zæaîx¯Œ1! i6 çÙïµ5º®ãOe 5=@ÒTUc–œ$eÿVoèÿä•-EÉ>§pη§ɧËIS!Äêy"2?ºq¢áÓ a³ßO‹?€ÖéIGEC`¸cëÒŠè|Ð#àmŸÿW`Ga ÝÒIä¸tYÃ9 ÊweýýÝŸ‡˜¡àê¾ËÃX©A!ƒ¿aYØH0ªÂûÆZ둉!aÚà †=÷ 2zñp0:÷­~K³soáô¥äå‰ô€óuH«‘»Ú¸ ×MZÍŽëñk‡æªí¦%Áx VY £çvÔì¸vFîh5;®';N…«í®¶RŒhUö“©Ž“a=ÿEÏ<¿î ÖØ#=¥¤,Ç,úLý•¤ é~•±»fÕÔã¦iBó¾Û|üo€Þr6 Å`üº–ÓO=ÖçŠ ÐmIEND®B`‚f-spot-0.8.2/icons/f-spot-16.png0000644000175000017500000000203611417267577016540 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< tEXtTitlePidginÆÐ¾LtEXtAuthorJakub Steineræû÷/!tEXtSourcehttp://jimmac.musichall.czifã^6IDAT8ÒËO\uÅñï} 0̃3¼f†hl‰˜ÕZ1Öˆ$cÚU7j“êÆ˜ê•t£‹ÚF7Jb¢¡Fcmª‰–@«iC¬`Z @QœjÛáYf ̃ùݹ¿{]YIŒÑó|’sr”ŽÍy3èrÚa|h›ÊѨqn…ÿíò_|0:=¯¿ûJ§ãÁûÂmcÓñ#+Ô„n¼RnÝJý äDÎîû)Æxlž7ïE’Ÿcù£½ƒr5µqÊÈšo×sáú¿éLÊNeMž}ís~è9„ª(hªŠÈK†bæû'.š©ŒÈfro5؃ÿ¨°½i_·¯ÌÅÔõ%‰4Í•X¶X4l ¨;›õP™·ajvù…%;òÔ‚]3°nÜÛH{õà‘î¤È­ñsîÂ5ò«ÉT–Êr7¶macÑ (¾§ch<^] «A¯1sò/@Õëw²´î1_Æ'È[‚ïOÿÊÅáäD)->ùv„OßÙ¯(Ð9åípnTªK¼,.­ÑÒTÅ•¹e¤e³æmƒ_Fâ MÆ RÇØÜ2RZ˜ÒbElÐÒ⣓—xîé!x¦½©Øë.|é 94"GÉîæ¿/'IçRZ”E¼Ü\\#4DJ1ò‚†Hàá):JT£$Où6'×–ê>C¡¦³¸žaÍ0¸¿%DÏ×—x,bl|)%¶§«½Ñrèâ€vÇùÀ›ŸUÝ®bïo¥ë¡z2‰þˆ›"O!_™à‰ºjÖ„ ~›˶ñ{]޳Ã3Õ^c¶GÛìš4My|1‘®™‰'k÷´Ö²{Oáp Çz‡¨+öPê,"•£^tͦÂïáËþ«[6‚½Ú®¨>°oÎyÄ̉٪ÇWîf#Ÿ}7Š®«ô ÆØ cÙ6TVeŽpЃ¬góæÕ?’ uó-³Yq¼Âïʾ÷ò“ô÷ÿF[U–e!¥Ä0%ó 4UÚvT:´õÍ€Ëmô>?%^þQ­£¥q×`Ý6ו²5ê#ò22½À7çcéቸ®*Êå?eÃyßtÏŠIEND®B`‚f-spot-0.8.2/icons/mode-browse.svg0000644000175000017500000003235111417267577017345 0ustar00rubenruben00000000000000 image/svg+xml Browse Mode June 2007 Andreas Nilsson Jakub Steine f-spot-0.8.2/icons/f-spot-view-restore.png0000644000175000017500000000132711417267577020747 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  šœtIMEÖ ;5õ[)ßdIDATHÇíUMhA}“n’m²¶æ‡ˆ¶F-ˆ”j UA4Ò»ôО„$—šƒzLñ$ÁƒÁè±Oš¢E-Ûj(R° “¨‰M‘¦M²›wwÖCÍ_›U ‚øÁÀî7o¾7ïÛ7³Àÿø§‚÷øÙîó·vVæZ¶ª¸ëìè~ÇÛi»Ýâ0óÇ——ÞŽ‹ÀlÁ®M£aÈá°¶Ù-‰x,ñ:›ÒåyÝoêæ=~R“ë1 y¾ã‚“ï4Çc 6³š›Œ‡|rC´ì¸1NR²¬ €NGFˆNw­·ï`žÛf^ŒÌÌ­f³ÂÅxÈ«\§½E½FÖÈ¡XÒpš9SÏ‘£‡ZAûbò•œ õÅë¨$I®ZPQRq÷¥Œ3'1ŽÀf· ëÀ>( ų‰)¡P(^>¹Ùh_U $Iry½Þ:ÐôÜ'„ž@¯gpìD?! ”b*<+K¥ûß°E×oOT½Ï\‚ÑdZ“LÖDxÃJ:“¥”^Þ¬³u.RoÞ%«F4™ÆvK{Î½× «µ½aZð¿^³J)ÆFÏUåN ß!_>/BÈ (æóH/¯ +”XBH€Kš dù—Qú.#õ-I’±»ÃŠ~· ]¼³ÓO1QÛc®ˆ›µ¨!$Ië UEøÎ ôÌú­Â²,óÏùÄfînª ìåÊ¥Tóña}äZ‚F˜?&h¤ ægp­­åÅÇi%pX j!0¨ªú5 îÒ"]Q”€¶f&©yî,{G  ùW£?(ÇS ‘þZIEND®B`‚f-spot-0.8.2/icons/view-near-16.png0000644000175000017500000000104211417267577017221 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ŸIDAT8•’Ín’A†Ÿ33| ÄE¥¬Ú›è†Ø‚ãÆ•‹º°1±VbãF÷lL½cü© ù·ŠeUð¨Á² _†à70.màà ïjΙ÷<óNräé³')¹•H$îzïÓ,ˆô£(zá½yç5Zé{ÙìÝ|îf`ŒY4snµR-?o4j`߈’íÜV>-ÎE Æò¹|ðù¸¾ ì+ç\Zks.fn~kÎK€Rç\@]¶}ÌØív9|uÈh4ŠÝyåW³?úT*a­¥\)ÿ/àªEŽz£ÀÑÇ£Ø œ´š„a@¯×ã¤ÕZP*•¦ê÷Þ-è÷ûSõ³³ÀäïÙÌ<ÜÝc0Px\ °÷ˆ••ëÿL0™LH§W™ÝЩ/h­Ck-J]®Äd2áçù9Ç_¾²±‘åõ›·´;xïQJa­Ek)V«å;››¹ •J°žL²¾¶F>·Å¬¬R«W~‰HÀ8çÚßÛœvNoÇãk±‰i­C):çdÞ.£ß°£ÕvOÂIEND®B`‚f-spot-0.8.2/icons/view-restore.svg0000644000175000017500000004326611417267577017564 0ustar00rubenruben00000000000000 image/svg+xml Restore View http://jimmac.musichall.cz Jakub Steiner window fullscreen view. restore f-spot-0.8.2/icons/f-spot.svg0000644000175000017500000117131011417267577016332 0ustar00rubenruben00000000000000 Pidgin image/svg+xml Jakub Steiner http://jimmac.musichall.cz Pidgin pidgin im instant messaging Hylke Bons, Lapo Calamandrei image/svg+xml f-spot-0.8.2/icons/f-spot-logo.svg0000644000175000017500000005321311417267577017270 0ustar00rubenruben00000000000000 image/svg+xmlf-spot-0.8.2/icons/emblem-places-22.png0000644000175000017500000000255111417267577020035 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆtEXtSoftwarewww.inkscape.org›î<ûIDAT8…ÕMl\ÕÆñÿ¹ó=öŒOB°aœˆBœ¸¥±hJU@ ™,¤b•„ØDUÉ,ªvSÉ›‚ØU•­TE P\TD£("È‚„¤qíD‰ÍØØ̌Ǟñxî½çžsXxbF%R¯ô,ïOÏy_aŒánßÀÈ˜Ž !sû ¥ô#`\Û¶§”Rçµ6ÀÙâøhp·ÿÅÝà‘±ûmÛ~¿pŸúÉÐz¼·§%z³k$S}LÏ>Ç핚ž™[j}½PYQJ½X½òᑱ“½YïícO†‰]¹„Ø’ibÖÇdºÊ´Ìq–ªÇˆ8‚|÷åJÙüýæWoŠ?i­ÿPUwëÐ {Ô;'OT“±ÔE­ k?¥˜Yy›åê0Aè‹|ŽØÛwVœ~m:~ð‘ß !~×iYho<¼÷òsâ–½H"ò  gÉ$KÔü×NŽ›#»ˆe¹„&EÄ­^çÄÓŸÆ»RúôÀÈØ¿[–õ·—ž-&#n‰TlŽ]ÙIþ;ÿK¶¼îí™ °ÒD gèÏM ®]âÕã7–e}002æîÀ#c{sÿ©ûz/[JÛ|yë5ʇ‘*‰R)ž/¼ÿ _\?ÅôüqÖ6 l¯ÈMý‡½}Ñ{£‡ –"D†Q®Ÿgu}ß6¨4Aâß÷(oôqpà¯@Àüò¾)·qÅ#—âÀ£Nûœ‡ûò«Ñ›¥_skù\'Šëjd¨0ekþE¾û Jiêûˆ P¬¬íB†ËëCdÒÒ²,ë;…?wÜÉÈUlÑ 6R*âË?ñüÞîË„¡" J´Öt%JÜ®’K]%ägc~ô]chÜZ|'r“¾žK(²ØvŒòÆü ²5–%¤!ê(´6(¥PJc´"î®29wŒH$Ìní46ZŸ¯ÔêÊ“û™œ?Â`ÿ' ï{ŸCûþ”-<»ñù+/2³8ȵ¯ %(¥ÑZ“M-ê,«Õ €/;—w©Zk´’Q‡T´„k5ÐZ³;{ƒ'‡þLOjÏ—,Usüû«ãLL=E½™@)Ršù•Ùô‡¨T1úB'|y¥¼î&bƤÐZ†š0Ôt'ypÏ<_Òò%^ ñ|Éb¹^Yï§·;ÎÂR%&vàâøhY*óÖåk³­=ûùlúŒÙžc*fJ{w@¯ËP¶©É¤òÌÎ-Éú¦w®8>:ÑÙŒùýÜbåvm½n°ŽRßÊ µa©šgf±ðÚN}3ŠRšµÆ>6š‡¹2=×4Ƽú½+]•²µñÒç—n´TàËÊ0Y<ÄZ#ƒ ÕNB¥Y¨<@µñ8ç.NnÉ­7æþùfãŽ'Œ1!l Dóï 'òÿåù£Ó}{òq§X>ÁƦ¢ÞôѺ“º’Ò ÃÍ™™àêõõf«2û›•/ÞýððîÀ±6bv¬+½ûðÉS±tîW¹ž´ì½§;rO¶Ë±-‹j­®ËÕ ¯RÛt[µs«_ù£¿þMõ´:aˆwàQ æ¦wgÒýEºî=è&s‡„°¢A³rMÖ—§6KW§üÚ\¹ù°lî¼ B«´ã¶ã´÷!h@² 7ßcîúæµgît v;¢U@؆CcŒî4¾ ºÍß{~ IEND®B`‚f-spot-0.8.2/icons/adjust-colors-22.svg0000644000175000017500000002427011417267576020134 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/mode-browse-32.svg0000644000175000017500000002457411417267577017577 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/adjust-colors-16.png0000644000175000017500000000152611417267576020123 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÓIDAT8¥“ÿK”Ç_ÏóÜsÝuæ2²¹H%›L+­µ~Ð\¹ß"d£¿ KBbwæ,È~˜2‚ÚÌ~YDˆ”)ͱÃÖmÓJÓÊ™Y:ã<ïžç¾<Ÿ~oþÖÞðÏ÷7Ÿ"",EK«¯{ÜKRÛ€–$¦7ž®?ÓËJ‘Ï_jòu\m‹ŒÎÞ##–ÑÙ{Òqµ-rþR“oiì"•Å ZZ}å™Ùé7®uö‡ÚŠt¿ºŠ½é'øé磳S!Ï»“¨)Ë÷VxJý¡váNLkÓš'î¤?ÔN…§Ô‰=î}wƒÿ $µ›×æ¦:/ÅP¤‹ÍksIé²bÐVÔèeÆí¾kû±tWóÅ =-­>÷¢_.x›Ô56ïÁÚê¸r›@¸ómò`«_SV^ÖìLD`lò¿õ\,„ç›NžúZsºì»Ö¹Ò.{öyì}}wñì¬#.³“aV¸ùòðWüõ4̵ß'ðÌðAš‹êýn}h8XÚÛ{«G«rïé¨ùlgžöëu¦îôp?¶@an3þõ—Tòçxˆþ æ#1B 1†Ÿ½&Í¡³5'G}mU-ÊÚ^À£ºã|21Á܃1nÿanSŸW¯çJ_ÃŒ-ÓåÎà$õ_R¬*BR »€ŒÇãûšÃÁ4ãÆršf‚¤e!‚¨ þéà Yuu˺¤ý;Å£'SìÉ߀aÆ–±¬`##Ož#0 í;P|6÷ß±½µGu[F‰éil™™l*Ù…nšC•e8tW¯#¤;ujÜSñé‡tßü%* ó˜""´6Ÿ;îr:Û<Û¶;6äå)h3ÃC\ þg•“¢Ò*}ëGÙˆÇ' üÑF#M§¾Yú ù6Ã8‹°H8^À·T¯‚– Ü×U«ñtý™Ô!½Þ‰-o1$m²IEND®B`‚f-spot-0.8.2/icons/emblem-event-32.png0000644000175000017500000000364411417267577017714 0ustar00rubenruben00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<!IDATX…Å—ßS×Ç¿wwµBÒê'è‚ 0?lSOÀ;nÂL=à⦑í¨8aœØíL§Agúš—v¦}éC'˜)‰ã鸶KãvHk°Óƒ Æ`’€%$Ò‚@?WZíö±’øÛíLÏÌ™¹{ï¹ç|î¹wÏÞ%²,ãÿ)Ì‹Lêíí5ˆb²*Gh3É‘e¯×›z_äY2àñxhйS Åœ—düYcÐÓÇɱxœZ[‹–šDr%—“>¾ÒeäÐÓsæ hæS»ÕöR[Ûnÿþ¤¢¢¢(B°, £B$ÆôÌ´4:6šŒD"w*ûÞÀGË/ àñxhBË¿ iú—]]]Ú–—[I0@0ÏG I’bKQ,–rTVV¢ÊYññ1q𯃠9'ý¬¿ßûÉsôô¸ë ¥ú“ÓYUç~Ë­s"ÆŒCÒß¶ °,‹–—[ÁÐ ’ËᥡT2óîµk×¢ÏÐÝÝ­6šôÓ5ÇŽ½B=™Á‚¿ÄÆd2Áa¯„ÙlF$Ah1ˆx<^bãtVaӌܿø×½Ïúû¼Ý;l{ &ý¯jëjmííG©»÷†‘Jmnš¦ñÚ«hmiƒF£Ùæ(cäÞ0ÆÆFÁ`<Ïãø±ãŒßïÿÞùóžwúû½Ü3ç»j óÙ¥‹?Õù|óX\ZØí¼ÑuV«M±ýtÀ žçñæé¡²Ò©ô?õÍãæ­X__X­6¸j\øð®§dáÀÕËWCÅTQp ­‚÷õ×;uÉd¢$ø…Þ÷K‚‡BA|ýõWˆFW1þ`¬dE®šZ¼át: ^F"‘À‰'´lŽîÛš€bðóêê‹«Æ…™'ÓJÚßè: Š¢J&eÅl¡Íb«h4œ:YØòÙ¯ž`_Ý>Æîpó¼sæû;‚ÞææƒÚ@0 8}íÕŽ’•?444â;͇¢("X@óÁƒZ"Ó=ÛÜn·I’äæ*gxžW[[Ú^(ø¦n-ÌçWxTWUSM¹·¨ÕÔ£Q/@*• ÆOûóˆÝîP¶OŠ«bMGqL€,“*Ç‘tºPhdžAEE…òœN§¡ÓêŠÊ*¯ !v­F§A16LÏd=¶¾ç¸ÉdVÚ™LmY.G{ %Ë«B:%QŒy>¼»ScÁi0ÀääÄ®¶ápÁ!€ÎZέ–r I S(Œ›u`'1 ¨uÕmÌ”eÜüËŸñèÑä6;AHcuuEy¦i‰d¢Œa´‘Ål,c7Œh@2™Ü3½çÎzP¿¯^¸që:¦¦J!B¡BÑÛ8Œ2AúúúÇ\½|5$Ë„—–ÁqzeÒÈÈ]hš†û­s¨«-dâÖàM¤Ó…‹ÑÈÝa¥Íq‚¡EY’åÁb?J!’$éã¹§óƒÁ  >x8޹¹oö„8ã~.Wí¶±Ñû_¿àSž #æææ¹œTòARh’ùíÜÜ7B"‘€Ù\8d·o ‘Hì Á0 <çzpÖý6.¾÷”•iŽ„ñù?†£Ñ„ÕÕ¨´ -FËõâù¥_ÃógÌéô¿ïììÔ-.†ÉdZ­?èìBSÓþ]A +ÿ7†>ÿ;DQ¨T*Xm6ܾ};™Š ǽ^oÉ+³íBÒó®çzScÓÉÆÆF6 ”Œ57ÂáÖ6Ømv¨T*¥?Ncii#÷†áó=-™SYéÄäÄÃÄSŸÿןô_ù`[·vHY\š±UXY›ÍŽ•^YÍÔÔ$¦¦&AÅlÉd¿A4ºý¶EÓ4,–r,-…%ŸÁwwø‹ßB(Y–¥b»’ B¶óTçÉr‹ùrCCƒ®±±‘Y__Ûól­V=§ÇãéÇ™ùùyþñ£™ ÄÅ[‹Óé¬?úJÛ‹¥¥ýH{«V#¡¸\o5«†ŽãL&0:z? …†þ9tçw™LfŸ×5¢œ¼@@ @€ò#Gw×××_t¹jUÕUU´Á GV‘Ëå KE¦(0 ƒèZ~Ÿ?çó/¤F¿¼ÿÑüüüX>h$¯ak²,+·˜­€2f–òrSmó¡CoZ­Öv–UqÇå4eJ­VS©tZJ§Rr"™ “ÉÔj(0öðo™LfÀjÑÊWD÷Ü‚"M~; ù¬pt‡­Úd2½¤Ñh+V¥„T,K­ð<ˆF£ɼÆòé^ÝóAl):Ã`óª*êÛ,d1¯™"Íæ5@–wö­ÿ†y䃑¼n¶‹E çu³‚Ë’¶#HüÖÓ’IEND®B`‚f-spot-0.8.2/icons/autocolor-24.png0000644000175000017500000000222711417267576017337 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× 4¦`Ð$IDATHÇÍ–MlTUÇ÷¾÷æÍ¼ùh;™¶P™i¡”ÒR$•UA*Q„*1bB@".ð#Ó  ÝtÇ W,Lܨр @-”¨Žb)¶%¥|´–â´¥ôãÍô}¸™Ò”vX˜x’“wïÍ»÷wï=9ÿsáÿl‰¦Öðbÿ¨sRD€0à2@ª°†Ô<‹¯ö- äœÅË€5À: .û­Mu’˜;QÓ”×4U9”hjÕr¤:)Ê=y{¶è¥¿ê‹_ÿüžûÞÀ*`yª“¼'*Rî[SQâžËõ XïóçÕø ¥´âHMg_]‹ãRĸžõkãÁ£¯oñèí\:`ØvÆøw—ŠÀ>vîò¶Ozo.[:;îÑÔý;7×ê–+ ô'M­ËPfï¿IˆI÷ŽcQ^#Üi1•úŒPЇ9Ñ;ºk_-¯|¼m8¼k@Uå‰ý»6ê7†'ÑUátõ ¥G{NŸ]ì£À]kòT‡9ðÔñdÛŽ»—Û˜Jç3c‡°ÜˆjeìïãÞGž¬Ëvðúýo$šZåb€ è¸¿­(íþøÞøôÉ ¿ÞáÊ5…ªêµlÚTï-õO|Qnù3–ƒe;X®ÄoèðÌ‚€Âà*Бõ‹ë«/龯î®îÔèùsíf$¡ù¥”ÑÁ?ùú‹ã˜¦‰m;ä„„”ó[ä’±ÍÍÍyšW~ å×okÚªëö ?38ø7ÁÊíôü•æjW¯éºnYÿÉ–¡yƒ¼uuu¥w½Ø|"Ùo¼}íÐ’%ÅTU­B‘ÐÓqšŒ’Ç=S±-kr¬÷tÛ#úÆè´,<ÚØ°Q½ðÃI ÃKeåJJŠ‹¸rEÓ´ÑiÏêüŠÍÇÆzÏÌ/‹ØËuÕqê×o`çÞwI&¯ÐÞþ Ñh„ÝÍ;ˆÑ‡_K†‡jÑ‚)å¡X4ß{±g˜`A¯lahdšo¾=Ejd!%ºá7„”o=2 ÑÔº\÷¨q¯Ï‡‚%A„¢³²~Sžg~êà.eà‹ \÷éxãG‘GH\{¼4¦Ù.4¬+%^ ¶ï3i[ÓûožÅ‘¶È#DÛÎc -„äD~éÞb„È“L™ÄoèÞw.蚊¡kL}ÈÊZ¤3&©ÌBöÔ©¬I:c‘Ê,ä…útÓ!tMå7@Kks˜¶6\\#ðºÒ7ÉøDbó]7€XXKÓ~ímW.ó|hdSÐÙÑõ-läˆ_³³®Š'oq½=ΫáÑ |…@ÀÏ™S'IÎãî½G¼ìaäY1•уTÕÔnàÊÐ ZNa¾q?ú˜ëcf,À–Ê}””Wm°8@Ó8~¸LCŒþÁ7$¦ž2?ó%Ã)ß8`ñÈ+ öÔ±»®‚—£ fgGÈ~Å,ÚF)yÇù3@J‰”rMX¬¶Œší!Ʀ?óõkÌI„¬ “Í!Wûм¿UuiˆhuÁ`1å#Cï°MýDKk³¾"@J‰³‚͵T„Ò B4º‹r}`¼¥µyká©ëuP¨p‘BÀ'0³âhOwïœ×ˆx÷@Q”CUÕCÓ4LÓDJIOwoÒ¼ë Ô;ŽC2™D!l¤tÐ4ÃЉª*†Žß_D(IJ,r¹–eaY©Ôw‰ë·ÀœÏã ,‘‰óΕº. óòž³¬v²-ì/@ؼâqPTÁÂ?Ý:$ ð˜ÒŠgƒý@`=‡o ˜€Ã¿ÖO:Ar…É^IEND®B`‚f-spot-0.8.2/icons/object-rotate-left-24.png0000644000175000017500000000176211417267577021026 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  šœtIMEÖ 9'4ßéIDATHǽ•khUÇwfvf™m7ecL»ÙU¢_ÚnllRÐFŒOèPimRŸDQ¬"(˜/Bü ùàƒJ«5M ¾@)DKjCAyl|ÐTYDé¦ImVI7ÙMvf®vÒ<ÚݬŠ^80gæœó¿÷ÿgüÇKüà“Íhþ÷hšç!pn•¶pé]Wß³XW+¶xlw zÈcS Ø´Ã4ª£BõA[^?öä Ëü¢FÚ”v½lÝsµt˜z „ïGþôN& vÆåBCi>xE6å$z üèë&ã}8‡AÚKHVAÑ@hWe¼ ÀÈ^¶åU/†÷wúø¹™üáê…-ç ¥x â{Ýs¨v_û'‹ Ø€X;økAõ‚y5“`twø¯ßò”Wã u_ޱ݅ 61ùùé©Á^™Nš…XÈ ¼žÖŠ­÷­‘@ñäŠû#¼™±Ž]³VêëÝúÿ[n3 BÆåhP4Døn&{ßœµ.ýùÒ¦.«³æ¿éT_Ž•ÕE„‹C'@f?,¶ò8¶ãE÷Ž  f’ž2W£å €Á‡Ù¢H¾^úA1|9U¨ÞEI"P Ã{gä²Í7wóMÁÑÈ>veë߯{ù¤W¨*?<ß¿¨ ªmˆŠP4¤ms¶ý–ÌÜTbwô¨ýi¾¨ oröñºÔô¥3_ÞVÞ°]#þqNûªžS‘ªÃì¤_ˆx烙Ìdüùh—u´EêRçà¨Ø_› ZâKšŸöÈÔ9(:¨:¼Q}/纟M'Ǿ:|Ó{ó. N1  sNí¬ø­^Øéÿ–ÇT™ú5Ç¥QЍÙÎùãó‰þúZºæž™Ïå,˜t-ï\ÐPº1Àºo[ádï+YçâwÒyM:Éeò‹W³mF,âç:  ¥nž^h¾(€X ”•÷×±a°Õ3‘ê¶åÌ„L ³[=“-54 TºñkÝ|e5ŠLœ™b®Dwú®ýåøºÏÔãGÌßýÁ ÀZbö Ë;2ÀãöÆe{«…Í•|vzœOõ1ìòl¯±€l¡Ë^Ù|`ºG/y"J(sù.qß›nœöo†¾piËGv!Åü¯ë/Pû-Їt«IEND®B`‚f-spot-0.8.2/icons/emblem-event-16.png0000644000175000017500000000153311417267577017711 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ØIDAT8•“ßoSeÆ?ïûžvµÝi»ºÑ®×,¬ºÜ…s$l÷‚crR‹1\yELü'øŒñÆ Qk­ Þ(B"L‚ìGa®?Ôa±kœëF†Òõ¼Ç ²†Mo|.¿yòÉ“ožG¸®ËÓJg,K)5 ÒZ(¥~×Z_×ZËæÏ±KbÎX1¥ÔgÃÃɃG&ü}}}x½^lÛ¦Z­pë§[v­V»â8Ω\6¿ºÎX±®®®Å“™“¡h4&Ë•ÆÊƒÄûã P,Û…Ë… ÇqFrÙü_€ÇãùüøÔtÈ0 Y¸üG&9öúJIGóóÒ"7f®1òbÊB„..} éŒe¥FRz"=²xgwÞ>ÅØ+ã!øð£BðêØ8Ö‰·X(Î344ä‰ôD&Óë(€TJM§R/ùûõ8D4 ÝnÓjµh·ÛÄûãŒS_©3::R>ø|¾×L³›µæÃû’»Ÿ¼CÃû’4›kƒA!¥< ÇyNk뺄ÃáŽÙ0 ””Ü»·Ü¹õ„Ã8Žƒ×ëEkýü6 ¶µµÀúz³cìÝ;Èù ß²Pœ Ùl¢¤Â¶m¤”ËRk}ýÏÕUB¡0¥òÒŽÈÖ‰4Éä \¹Z T.aš&+º«µ¾¶ ?;;ûwoo/?Þœ¡^ÿ£PJqü7yïôûÜ¿_cnþ6þ@€r¹bk­¿Pwï,.}òéÙIÓ4ûcq9sóBHº»M|>ÌÍÝæû‹çÙ³'J©´Ôj4¿üâ«3;š¨”º»ÿËf"1èÙÜÜäáÃM„€gü~Ê¥r«R­<ÐZ§¶›øôz•RgƒÁàD"‘ðG"Ï aðèñ#šÍu·Z­Ø­Vë‚ã8ïæ²ùηŬñ¨”rJqXk=(¥\v]÷ªÖú\.›ÿnw7þø¿úÒÌ:G©­t IEND®B`‚f-spot-0.8.2/icons/emblem-readonly-32.png0000644000175000017500000000213611417267577020403 0ustar00rubenruben00000000000000‰PNG  IHDR szzôsBIT|dˆIDATX…åVMh\Uþî}?óœJlűhM0.\¸¨´ ºPTª ]ˆ«º/%àb,ÚI¡ ØÐ"¢R]¹„nª"ØhÓÄ¥¢hš ‚D›fšy÷½{ï9.Þ{Éü¼—™i^.Ì»÷~ßù¾sνÀÿ}ˆAÕëõ}Ž'Ž—JþÑXëÖ˜rÞ:G:Ê÷ý5mâÏbEóSSSîšÀÌÌô Žç|òäOù<èA!ò·13”RømåWýåWcmô±×OT?íaÑxëܛϟÿà½Í(Š˜ˆØÃZÇÇ1GqÄQ¤XEŠ• 9T-V*ä(Rl¬á(Žø£?lΜ›~y'ŒBj󵑽Y9~lò.×uALp¤„²ð0ƒˆ ãÒq ðîûï¬o6É";Ü¢Ãn7åWŸ>ò̮炬…”¯\VKËWD«Õ*åí)—ËÑ#ñáC‡¥<ÏóGž¹pዀɡ¸®st|lÜ#k! —Z—¿Ÿ·šÏV«§®çí©×ëû.-|ûZ¬£W{ôñr…¸ïÞÒ½TD PO­Í¨ï—`‰ …ÄÒò¢ïJÿLµZÍ€jµzÝ•þ™åå%_JÖxžc̵Z-7ØBÖšÛ„˜ Ì ­µ[©T¢õÙ¨T*¡1Æ’ªB@Ji‚ Ø3ä€ä[4ÀÞ Ñ­`¦ÝÀ.àÈ÷%ÀØýèÈÌz½>ìñ?£è!Çq „€% !<ÏÃôÙ7bãy’f03Ç)Y¯ÏÎÍü«ðÅ“'Oÿ˜»qîíÙïk ""ffV‘â¿×ÿâP…<è "&"nÞlò×~çæ ¶Ö°1šWWyvnæçB´ŽÞÏ~Ѽ¹kM">36[Mln6Áà4%x«:Úg#ù1À‰yÍuÜh®CÑ»G¡µž($Nîb›–PÀŽÿ:×fä·f!Ò¸ãþÉíNLœ”PMx˜5R5¶ %·^^Iç`÷FØ Ô˜dĺHl!rûB˜¶G#sWÔíÖÑ(%¢äíò=û–æX'„Èí ½ ƒ‰Úd/J®^KúU¢@&?1 ó€¼¥Iz«‰A,`P ¾í—Ì=ÉUTŠÖ‰ô¹¶#nS€»r`ØÔ“+HÚz_ ˆÄÔÖˆ†i@ùý ‘`0Qê}ªD7ø° ( B k „Ý(#„?­6®»\ˆ´ufUPÜ€¶ûÅv®ð–5YYY4«R¬Ø @P.€ øúâ7'¬5çÄ83÷¬ 7˜k?,-M¦›] >€R:{éGç_&`‘<€4€@”ÎÿíøŽëøØØÛþIEND®B`‚f-spot-0.8.2/icons/color-sepia-22.png0000644000175000017500000000173011417267577017542 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<UIDAT8µ•Mh\UÇç¾7ïeÒN'/IbMŠÁª µ"( ÒDE+¸é& ˆT1ˆY$vÓ…¢™h²‰ ÁÖbV\ĽI“´"¥¡ÚÐPM;3™fÞË̼ãb&µI¦©Z¼«sî}üÞÿü9÷\QUþe ¿W*•>PUçn`"²bÛöû===ƒ¨*éÁô²øz·Ë|M¦—Uµ¢XCºŽËÙó?nT¬·ÓyóhWûn4Ô(€=Ó-]±ÞÀˆáÕþÿɆo>ê\“Û@[Çåc\<|šðÑ—IÆb”°qÝO,£"œ8UX›‚˜µà=_éÑÁ¼ÑÙΕoÓ|žeÚyëñÇxóµ·Q-uóÝ”·9جõªâ±â{_!êµsò“C4—~㾩O¹œ¤q_7®íЋþ;Å·&"†˜]D­m̹Oá]ϳðE~Ç{ž ]V¬&XÌ&`c ®cc…eÀ"ï{äë<¬ˆÏΠ{þüš_½'™æa2Þ^¶56ÿ3ÅF uŽ…)¯Ù†ÈVŠu[YܲƒúÂUžË!·pŒÌ#ù½¥‹Ð¸˜;)v"6Æ”k– \+cGbùêEîÿå8þô‹© BëÎÚ`©*–RíÖZÎç(ä³x‰{Èi”b²¥H image/svg+xml Restore View http://jimmac.musichall.cz Jakub Steiner window fullscreen view. restore f-spot-0.8.2/icons/view-fullscreen-16.svg0000644000175000017500000001752711417267577020470 0ustar00rubenruben00000000000000 image/svg+xml View Fullscreen http://jimmac.musichall.cz Jakub Steiner window maximize fullscreen view f-spot-0.8.2/icons/crop-22.png0000644000175000017500000000215411417267577016271 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  šœtIMEÕ 2&ÂÙùIDAT8Ë­”mh[UÇÿçÜ›››&iš¦íÚ¢Ýâ@º±²Ž‚6Ðá7­/æi†Ö$¬?( "Š£R ‚_™ÎM+’¦)N³-Õ½›nVZú¢4«K“Øä†6/÷&¹÷¿¤Úú²†êçËy8¿óãá°ÃÕ×ßKn×§Øùªºxé» IJÿ¸¯¿·9šzvÿ¾ý6’”ÿ3¸¯¿·-šz)à.Bl,Ì’”0í|â9ï¡ÐÔÇPN¥’6%¯4°0%)!JR‚W.ôñîãG2™Ì7PI¥’úôOÓÊèØˆ¶òÎ=N™RZ _¾r[[XYÆ]m…BáRÀ4¤RÉÚÅÅ…¦……yg§ËÝèpز’«P¾6>ÔþÈ_ÀdÀ„$%TI’LW'®5{ô˜œI§u³ÅÂ[ÌVQVdõPk[½ÛãR†‡æËîøƒH&WSªªÚ¿½ÀŽÞwÔÆQι‹Íwï³î¨v{\€/ °(¥ö¹ù945í& üìüLÕ]ν‚ ÕÕ5un+ àå¡ÁaiÛTôø¼{4€¢( „`˜›! »ê VK¥µºº¦Éíqí%„œ^ÞV³ÇçŸz¦;12záFgWcŒ±x<Æff§ÙRø&I Æc]Ú“O?qoÙ$ŸÏ¿úÊköZ¶·?·Ç…ºº]X_O³l&«Ûí¸=.8÷§g?û¾¬Ìú^<ñüé3§Ôt:Í–n.²ÉëרÀçgÙ†yÉ”õõ÷>üo ò#¸‡îbß;ýÂj2Šœœ…ªje«ñUœûò2™,***îÿäÌÀ8¶í'ÔãóÖ‹êÈÛoV“q$¥Òé 2™ *­6BÑÚzH·VZÖx—*ß(²©þŒ[ÏË Å«o¼þ¦9'ç‹Ga6™áÜÝEV‡Y‰èkëk*Ïñ#ËËË¿0”Œ7—¾Ìóü»]®ãÎÚšZʘ0 ›Ëá£Ó§ ‘•[Z>ŸÿUQòc‘[‘÷ÆFÆc¥cÂ_€: €Î—lÓ5ý…ÇÐ&'ô¡àP!'gsL×odsòÀÜìÜ•ëS?J%+ mž­@-í”ôø¼ÍéõÌ´QŠ<ÏOéºîEc_u> €Z­Ñ  ”RÊû¦Õ‚ªªšªª „h”ãr¢Ñ¨QJX¡PÔxõÖJKËï8¿q[ivÔ(9£QТ‘UÕ4Ž£ „0•ç5MUuè<ÏQžç5Aôb±¨#·‰àßzUv1™D"Šâ–ˆ)ŠÂ¢+ñ-{¿m‡ãÛdñIEND®B`‚f-spot-0.8.2/icons/emblem-places.svg0000644000175000017500000012276311417267577017637 0ustar00rubenruben00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Web Browser f-spot-0.8.2/icons/film-roll-22.png0000644000175000017500000000177011417267577017226 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<uIDAT8µ•]OW€Ÿsfº‹Ë‡+Æ¢ ‚n["¥Û˜6±1&&¤ý öº?¡½jšô¦×M/šöʦÖ6©øAÔ‘€ -”¯…ˆJ7Ë,ì.ìÎìÌÛ‹]ºŠ1&¾ÉÉÌdæ<ç9ïœó%"¼ŠÐ¯„ ˜¥J)ÝÕÝÝå+£G‹7vllBDü—+¡ë½Þ7€>Së/´a *™JƒÚ0$>¾/RH„îŽdwëî9cƅη"ÖÔô¬9ÚFxo3sQb1›O>þÏóp\×uð<ŸáÑ{ò÷ÝÑñQ µÃ0MƒŸúÎÙcÓ3ó,,.35¥ºÚBkMt!ZfÒÑÑaªïÓs”(¥Š–…ûþK¿oëNö†;ßîdêŸIššê1´­0µ¦¥y/5{jÙרBcS3Ji”R˜ÚÓW®G”R\¹|-¢”bàÏ«‘ ”ºqsP–––‡![Ã^_Gu¡::Ž¡q_ǾI]`™úÐ*ý,I¿™,¸¹ÒÍ:`yw0 JV‘ïC¸>o å?P(_nR1ZYu£Â¤çd3àd àTñݯ~{Öâ(‚ÅwÉ:Y‚)3.†A((ÜôÛãx€å‹¼û.f"½roÂ;ÝÞAk6¨®=‰²2Õàlh¦Òþ£'׬py3ͰãrñyP(Ôãøú;Ó ~¾íZÁôæc©cÐMØ6 #´½+™‘!~N¦‰"’x!0€RJ½ÿÁ‰ý‡Ï>Š^Äl¶®ßLcq`°_ôDQ»¦;µõeÛÿ©¹°ó·–éªIEND®B`‚f-spot-0.8.2/icons/emblem-places-32.png0000644000175000017500000000447711417267577020047 0ustar00rubenruben00000000000000‰PNG  IHDR szzôbKGDÿÿÿ ½§“tIMEÖ("\æTáIDATX…Í—YŒÕ†¿{«ª«{º§gÏ/³ÙŒM0†8ÆKÇQ€@@Y^""eyˆ±äÅ QPxŒˆ‚,%2q,³8F– 6ñ`Çg<›=Ó³w§—êª{oå¡{Ú³dQ¤äHGURߪÿ¯ÿüçܾð?ñ¯.\ºmGUDGï´mù òLج©µ¤Ì ÅdhÌi¥Ìë¾å½3¶gGþ¿F cÛó+,äó†ð›]m­Á†/µU·6%EM"FU,B¾à3—-šºöœšïJ9±[cžØóÄÈNàÁ]VGaàY)åO¶Þ¼Î¹ýÆÕŽm[L¦{Èû-ØV?Q÷"y¯mÚ‰G-šk¢(¥9ðÁÙàíC'cÌË±Ž§xýÛúß"°âÞçê)ÿ|u[ë nßT¥Ô>æ³ï(„CÒ=B}}µµq²ùGÎ<ƒÒ!JiâQ›ÕË’ˆÐðÚGò½C©c1ßÙûdú³°¬OI¾åù+b}xëÆ5kºgut|æ3é12ÞM@-óÁVâ‘ã$ª|ìH©©.æ½ë 8VÎÖßcñ™lš[6ÜêøÊi¹06ûpÝŠ;^Mì/~±î²:½¡¿Þ²±{óÖÍ2¢ÕËœ}ß´ MÇÆu|–W?†oý˜ùâMh#¦/XÁµm¿a>Ƕ&1ÚÇ‘Ó~Î;‡¥¨§÷ð¹hÛW–c‘Ÿîjo¹ÿþ-Í1<ÍѾŸâ©&n_÷!1r^ÒŠp#¾Yc;X b‰óHRu ÙBµñ3ÄÝ1‹ÁaÚ—ßeŸ ›Äô˜›>ûλŸ©@çÖš­½?¶¥VŸ$GZ1¼`µ£(Sω¡Ìr"Ž…m[XR¢Áè4qw„ÂYo ³s þLÆ;éÛÀ.kýHwÇÒ¸V$´!çÕ!­Gz¿¡)€0 1&DHÜÈmKâXi”24$Ž£u@:Û@ut˜0¥ ˆVÇé\ùP¼dò`×%a¸¶±6FÌähÿÃLÌ]G¢*O lÛ\rj¡U& BÀWºwâXiŒ1cˆGÇQJ±Rœ»Æê“ä¼(}c7Q—˜¤>‡0\»Ø„!M±h‰búâUÔTÍ×”äÕ¥ê® ¯¾RH‘¡>ÑW^W"V"Rºo©;É…éu$¢S¬oßÍ©áÛp]Bš”0 Û®§§ÿ>¶¬û-s]ôœk¿TóLbdˆ–)Bê“ÐÚTʲ†¥´eœ— èWÑÓ¿LÎEZB“XL@Ïåýä¹ÔFÎŽmàºöƒ,©9E÷ò£äŠ­Ìd»˜H¯ÅȰdÐ2‰éeä¼®%,ÒS¾–Hµ5&_¬&•^‰ ù+ˆÉ¹¬—tl ¯`81pËi®9‹ec…:ÍQe19·º.øäÀ±ï°¾ëM2óM¸ÎEZë>^¤FÔ™#çŘ/TQå æsEbñ ¡èÉä¨r­JÍ›kÎV^ä:i6¯ÙÉUõÇ t@ TÉJ3>Ûʾ~Àû§ïá½S÷U̸P c$‡ÏlCkM,b33—C„¢wmÌÎÁ “¹%õq”*¯19²HRKäÙ¼fwùe,9‡¨ËRãšù|”ÉLË¢çFg:ŸmE)C}2ÊèøtV³s±nqïÐ蔨»H)”áÜø€²»M¥#¤È“÷¬Ò¬/wÅ‚ÒL¥›Êãº4Š‹A”@¤TÇFÇg¥p‹{Ú½#£{zSºci aò÷Áë™\]6WyâiÃ`ª“‚'K­XnÉ P¥ö 4ˆb¥3Ja²¼¹š‘I­5{†vïÈ,ž ò™Á§>úd(ÛR§*ê Å›~‹œW]q¸Ö†‹¹8~åËËÀªLD)0~|lv%NÞK̵iHFù¤$›Ï >Åe»ðwâÐ+i?Ÿ}­çd¿wêflK¢E1ˆ.¬åЩ-üíì&‚@•@ËàA *åšh¯¬ŸÍ6¢MŒ5+ë9ùñ r¯Mz% ¸—°pƾôâùó©¾þ¡q½®³‘ˆ-IgËÃH02ÕÖ Í%EJ›Q©çC`xr?Îé¡Ít¯¬gxdR§R}ã_zq‹òFh•I8€£uÑ.Îϼ›w–m¹‘hwÇ™Œ~@²*Í[Çî'5»‚rÉyIN ÜÅòævÆÆ¦toÿù™‰c»õæFæPå4¥ÝuˆT¹‰@egßš·›oöŠA"ž¼ÓNÍ´Ñ7ºmÂÏG.GÄ–D£«h®­ç“Þ¡âàð…Á™ú^~⣠ øeþ‚š’1úÙñB~ìÄïhNÍuD"-rÕÊfQ …¼´0Ç–¸›š¸ËÒÆ­qf¦gÍñ“ýþìTjoê½—楇¦B™€WÎ>}.ˆR2ˆ[¾Ô­Þºªºí«¿Œ¸Ñ M 5¦©©>–ˆÇp#6¶m(M±0Ÿó˜šš)ÌÌ^”~Ñë™zÿWé³o÷•¿Ô+ƒ/¨ÄgL%O¸åkpâW­o¨i»yK$ÞxŸ°#í êBD• ÌC˜•?èç¦ÿ27thnôÄÌe2eà€Ëÿ(~+ÃâR§T¼rų!`Ê©¹d´Ï=’ýßÄ?½¿#Ýi”àIEND®B`‚f-spot-0.8.2/icons/emblem-readonly-22.png0000644000175000017500000000134311417267577020401 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆšIDAT8µ”ÏOQÇ¿oPJ©”_‘p#^=yò¢œÄ»õbŒ ‘xVIMŒ‰R(1QñfÂÅ›‘€ñ¢½xò°$–Ê´@ßnKwg.ú9Šÿ@SµÌ’Ù!H|÷ÇDDõŸ`­I`ÄD"MV6…-¤’6SãÃ{d'ç¼Kwp/ " % ÷ö³.ÿýÊî×j_ÌnñÅà ®Þ_èéúaþT¯ÁÍËY.Œ òdîíFh"ƒEÞM‘Tßñ#i”q Ç¬»D'zŒÅªÃùá!œÎ7Næ,D„|6ALÖqEÁMQpS»ðjáí¦hn¬ñyy‘‰±£ñ²|ZOrØ"Oþ{‰Õ¥ê–ª5Zêˆ(¼A‡'¦qwt°,ËZmµZ™¥wÏ{Š'ŽÃôä¹mšø˜¦¹ `i­g*•ʬRj_¿Qk=`ôsïÿÃ/6ñ §©ÙIEND®B`‚f-spot-0.8.2/icons/object-rotate-right-32.png0000644000175000017500000000274611417267577021213 0ustar00rubenruben00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<cIDATX…Å–klUÇÿgûlK—Ú–GyôF ”‡ ‚„b "h ¡1¢Ñ„XäC%`ÄJ¢ $B ¨!J¡ih+­iéBK·ÙÝy]?ìÌî°Ý¶‹`¸ÉÉ=;¹sÿ¿{î9g–cxœƒ{¬êÓ©\!œ!+Ö""®‹-L×TY;ÁdœÌ;È|€Ì+¨\)ÜÊÝ%¥·õXÄ÷ z«!7W¢³¦\j«<+¨í7Ok’ºjÂÖôH´ù€&ß¿Êñ(9HÎ%gÉÙ6U±ú+¤ ·qÝ„½ú·øÉ$Ä~Lq†ñ€&µU÷ªÀˆ8l#ÐØâËnï±âmWÄm…úRZ2~«{PKX  àí€èD—aN@p‚ $8A‚ ÄÛ€›¿€U– eöjûØâò<Ñ“^qq å<À‚¾žb¦o2}ùØÕíõVÊ\wØ%Øm?W/¦žILî PXÄœ@Êir€5‚-9…Òe( âÖÿLî4„\–H¸@bHŒ¢#`®åí`?aðKkmÎô±«+ èÅx"UPè¸5®èÇ4Ñ•pB(ù8 `* vƒIÍ€¯Æx•L`ÌÉ9P]9¨þxš77CIÅF¦÷®¦©rÕgóc.Ãr””–¸Ü39x_HÔ q·bæ3H=Þy©¦|ÚD ,îô5*V’‡ddq{QÒS³fxm·Ë¦E Ì(x¦À÷÷u­ñÀæ]¹»åwâŽ@_cÂwì€;ò¯¬²ñ›š? eÀºoE"`Bt6ÀáÆ“À=ÏÞü1Rù‹ö«g%Ђ¡®©#~ ¼@€¦¥þ/ðãj×?uèrOq-ÛÁ‘ ]ÓƳ]\W`nÅ@7¹PƒôÐg€é!ãt@nÓY\‡ëàÐbâ3í8Ä€Öç@ul ØZŽL˜ &y0¡bõÌp†‹.;ff—²N Ÿ*¨^L6%A8–ÿÞTÏü "(¼  ù¡{Ðüq üÌR@tß¹ ¥zýîõ7Ô 69o?»k>ï· /¾M.QÎX¾õé“ Zù&@í ݹÜaiD: 5/û €w‚ÜÄõܸÄê¾|³E ¨yÑÿâê (Éi.d,/ÉL3ž×/—j4€C>o—³¶Ô}UÐ*ä)“ö±úè½û " ©€+ ÏÄ4ñQË7 M>ŠÓë~ˆœ8 `Š‹ áó wt¡vû[¾öÿó3¡ŠÅ뀈xSÜ´-Ó‘6{´½lÔ²ž„ÔTŽ5Ÿ7NÍGNNhÈd(’Œk_v5zý/¿z†î :cLëÀrj>Ö¼y:FÌËtœYðé@wÊ“ÄÚkNQ ¤1J jv¬‘þºÝ½èõc(3Ä5s¶BÄ0Åø(ñ°ÿù4dÎÍv]ðI’;u(h Þ5Ф fÇZ©¶©£pÑqüjk͉XÍ‚ ‹þ¶¢ßÐp²6ðÆõï‹»¥–Û@B:àNƒâWP³ó}ýîÇ™¨÷bí€fõZ‹øGÕ¹ÿÒº½›$ÉÛÙ¯àÚÎüÞŽ ŽhG£ÖGïþŸ3 ŒÎXF{æâ¹Ü4×Îî¦æ»¾-sÊßXDÌÐ[}•1Ö7€Ñ›8Yf€Ã¯`ΠD[îŒýrIT´tÜ E—b¿(ª*LQ Ö°†Ùf±z@\½E'Uô£7Á‡xÔã_ø<™oeÌæ}IEND®B`‚f-spot-0.8.2/icons/f-spot-48.png0000644000175000017500000001270611417267577016552 0ustar00rubenruben00000000000000‰PNG  IHDR00Wù‡sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< tEXtTitlePidginÆÐ¾LtEXtAuthorJakub Steineræû÷/!tEXtSourcehttp://jimmac.musichall.czifã^ÞIDAThÕšyxTçuÆw›EÒhß%„B! ˆE`cœÀÄÛÄ6\Û$Øqb·i¤iì¸mšÖIÛÉc»^¨ƒcãzƒx!Œ1`v0  !оÏH³Ï½_ÿ˜‘1NS'ý£÷yÎ3Ï3ÒÜû¾ß9ß9ç{Ï•ìv;ÿŸ/õ/u#‡Ã¡ò“lÅ_°&gÏ™%”˜œK§ŸßN__€èv»ÝøsŸ+ý9ˆ‚Vˆ,D„€-[Ë©X»Ì–˜v·²B–¤`R‚Õìñ º‡Ÿ®yãõÑQgÐ'Xøó’ù\‡=n™ 7UƧLZ/©æ[ç—N’î¹e^LeIŽ´úÛ[yêïV‘•ÏS¯ðí°f¾¹jÖdÅkÂ0" úš£ŽËÝ.~°ñ$I¦wp”çÞ8â{û£úp`tèù¾Æ›G:j‡ÐDûS=ò'p8`J)[3)6³øÎ„ø¤{’㲿yÇõ†Ê©jr‚ÃÐÑu!®<{ÀåçŽïnããÍ›$ Y–öòëíÕþ×vž6^÷–ž¦½/Œ^:Ü%‚v»=ü!PÛŸ¦¥LÿJRbâ&‹ÅTrÿíó%{U‘)3Õ†0 tÝÀÏ ‘} B4UcÃcoòÐÚ…,,„@Dþ,I(²Ì ÛÏÖ÷O·¾{Rø½¯÷µùåðyG;ˆ’þYÎÊgËq)Ç¿qÇBcÍ¥–¼¬Dº®£ÑpD€E/¯?D}C#ý~²òqvñᑞùÁ*Iÿ_!’$!K2nO€m¿¯ ýjÇ Ývô·üY_íÛN `·ÛŸ…O),,üLð‡Ã’3÷¶÷Lšš±tîÓâòh¼€7FVdEBVdä ŸŠ*3Øã¡jV.ýx!t!0 ƒ“­Ï`ÏïšÙó±“!—I–ù蘓™S2˜;#‹¾R©Å&¬Ì€ÙápH”‘oJÍúÃïݳÔ,!0D$5žkígï»Mœ:q™µ+ÊØõ÷’_’Æ£ïàÕš3 ûƒQàW“IQcp¹|T•åròr/†aDC&B$Y3£õ ;›^x«†{W—ø¹~nb‰[K¤þŒÙµ D+¬–>ï«%fͲhùÂB9’×#$Î7ö—`#ѯÐr¬‹ÇÛXUUÄG/ndþÂÉüã»Ù|¨–ÞQßU$b¬*=]V^_È'ÝàQ/D¼¹ÿôi©½DJ¢…’)iC!’mV¦ä¦ÆfÌ»§2 ^‹Ôkz@´´Ü™ßäž%&EŽl,Ã0¸ÔîÂ4 H É6³‰dÝDGm?ÕÇÚ¸nV>{ý5nZ>Ÿì:Ê/w×ÐåöŒ{Äï2¿4‡¶A._`‚"D†ôe¥™<÷_Õ,š9 õz àžÕsÌñé“׎á›è…qcýMjÙ­ªfY¾rq‘‡ÇoÔt¦›d«I’$e I†“Fšdfàœ‹š£mÌ-Îa÷ó÷ÑéöÐ;â÷BzL,Ýn®Ÿ“ÏÉötÈz!â¼éÉ4¶öáóIQÍãi: P5k’¬šãVaI0G ¨c{a¢@M+˜÷È#µXUÐ CºûGG.ËR´IHrÄÌ&•4ÍʈËGGŸ YTf1è÷Óö°…ÉΈcÆ”Nwõ]Y}aàÒC”–eóìëÕ,œÃhŸ/ˆ‚p8L\ŒFù´t%³|Í®4Ê8(5yæMYªÙzÛêëK”P(ˆ0 „aPW×MªÕ+EMŽ„’@Hrƒ~©<·í(+*¦2j 2¥,‘”+×^â®ï¿ÃovÔ1%)=:†!È+Nær·‹În7E©É$©&NÖvMðBµörkB$ŒÆ˜àÊF”Ô‚ªo?|çMSÁçÔŒ!·cØ@Šå*àC^?Ç/tñVMßZQIUq.É9q ¹}œ<ßÉ·_;š6þuëA:û=Ü0·€»ªJ°ùe,ªŠà5Â,-ËæÑg?bI^6F´ìïò^! P93[’Ë2³-Ûé ŠÃáÆBHN,þR²Élݰfy™øÇc¿¶¶‡¬˜X$Y q°¥¿Ù¶›÷[ZYqÓLöüêÞ¬ndÐçcÊ”T^xë8šªnþë×ýϼ^ýQóe×>É¿´"ßøÚÝU¬\WŽmr Þp8²ú3’r{©?ßCIzòø¾ ö „cÖ$ÍÊ1’ÊV '¿1È©S=ôàóU³&ãñFºØQoÑÞ £nvÔ9IOã¯n©àÁo,EÓÙKBœ…Ò¢LÔD _ Ìö}M!ŸGßäò;³»=gôër~ðìžÇqÏ7Ù°˜ÕKgœ¤¦¦²òlþ}ë!ªr3A iòlŠFý™>®[˜õB/ßPS]×¶®Þ½Š@\áM6“9ækí³4¿ßG0æôù^þã¿Néܽª‚mw¯'.ÖLss{¸:ÝÄ(*V«‰ «æqþR·_ †Búw‹Øû êåÌÐÁBJ*&ÑÝçâÔ¹î_L÷îÞu-ð©F[û9WÆ÷6Þ:×’lÕ(Tb  ʳR‘%)žx*É ‡üL΋GQdI&Æ¢jGúÒûÎ~ô[ $ô7½3bQ¥®¿¿w©4¯$IŠöé0 ²IwâJÕÔ +äðY¤~‹ªpÁÙ˺•s°š•ÑÏ?vI±ÿ“ L+Î@P‘†‚ô©þh8@NS)(HÅj‰¥­ÛÃsožâ‡/!C¤'fUÅãYˆ€gèÇŽÃçõ±†0 2'Å6ôñO¬ž¯U7ÊCf‘øì±zÿ¿?ÝŸ›VUù› üYuÙÍ3&'Y_x«š¬ŒfcB_$ð†Ã(i*…U¬Û8—ªë&sª¥‡»ÝÁ?¿t˜ôäD^|ôËRH—2´ô¬dÀP ЄîêÓ3ذrŽ&ŒH—•ϱOÚ0!_å^w`¸Ïe6Å?ùÈ-Ú}·Vª†*›zb»¾ ,¯ó@G|mšÞzùZ‚±EÛ¿·®ÞÐþQçèŠ=ÞÐcÓô}õÀ"õbŒù‹f³úƒ™“Sf–å‘Èv8ËWV”RR’‰Åj¢æL¿°—š†rbf¤¦°ü eÜy{ITQyi_°ÇùÉω*|cuÀÄèàÅŸ:Ÿßºñ¶¹Ú˜®3)?‘ÆV7š"#tôu^²¤$eçe&²åÅ#!^­ë"gzK®/’nyÐÒÐÒµú›?Ùa¿ì^1`Ä„W-(âÂ¥ž˜Ç7ÝÈÐp˜l^~ÿ4sgæðÖîGZHÖY&¸kZ.¶¸xºÎ¬Š¬qÏ›-ŽÖ¶‰a—ëxývgóUô¾úǶ~PÞxÛ¼qåÅ™œ<܆ŠäãÃí=ÒÓ?úªÚÚ6@Ø‚Φ^ž9ÑÆå³=ƒR~v¢ùŸî¿1{AY‡kšxº­—éùilyé I(Ã|çß¶“LëM¤'g—„$À0æT3Ó&'Ž+šjâÇ¿þ8ØÓzêçcàÿ€áîöޏ÷·\îÿR~VFT6Iϱá¾0€kàrÀ“Y\Áæ—`DÊ&Ãþ ï5_Äkbã­sùñü©$Ø,´]À±«ž§ßØÏ¿}÷Ë4_èÁ?è'>.…rk𢑒”ƒÍ–Œ„„0"):dæ•§«f“™š3íb`p¸¾¿ö­3DôTÃn·ZÚÏ>ûÁ¡s7>|×BS8`Ê´4Ž5sôrwðçß¿]½x¹ŸÀ LÅ"VÓ „ØñÌ|¾ ÕÇœœoèE A[_X,TÌÈá•—"¨ª‰¬ô|⬠1|,\´•E)‘ûKšfâ‰-ûÝm OMÀ„h;m·ÛQµ»ñíºm¿¯Ó…ˆP†0(œœÈ¨äiïE™4§8WÚíhDŒ§V 0%#µmôöŽà<ÙƒŒüöxGåÓ2ñB¬XYBfQ!akMÀ@0ñxiAH7(š™:ÞBhªÆ©³]tõ·öŸÚVÃÕbðUãóC~÷¶s{‘e%Z` º{]?ý››ÔöÎA¼ÝžO¨¦%ÄóÊuL)HÁ'"ÇÐ`0@¶psâÈ',ýú¯Ø±¿‰n,â+ç‘U’L z`+ކ!“攤W|M5ñäoûúÛÏ>ID7 ‘ãõ«D…Ô0ê¾pjóö›üª©Â®‘ÑÎsÝiKfÈ~x&Ò5WWæôX+Ûp{üä%£ ,kT–.Æ^4ƒE±:Ûßþûƒ/óʧXTUÀº¯W’=3JXºAqiêx8©ªF}K­íƒ=='~³ àÃ}•°åt:d_ï9OŸyÖ›n›o ëA¶l¯9¿þæy9éI1Òî›0‰¨5¡¸ !ðud‹Dqa­M}ãßkª…¤øò“RÉTB|Òx‘_íl¤ßåaÕÅÌ™? w8H¿ÏÇÍ˧FÀˆÈæýáóû}ÍMµÿ<Úqò,Á×?Q+½J•ˆz!Œàè³õ-Ý(ª©gûþ¶Rû¢r8ìåÞsH›™€W3O8׆`J¢Ww5PXB@¾òý˜t"+*iI™\?µ˜•¹i\¬»Ìúx‹'6 xF:Ý¿MUB ( M­ýœoëî>þÊ®è¦ N\ýOy ê…há³¶ù´ŒMÕõ­ w¬˜5©hr²<2êFQ$¦ä%R>+ƒa=Dÿ°0"+¦È4öqݼÉÃ!†º½Ÿò”íõUÍDZZ"Ue™è’ÎKïžæh];“³’ÈNK@’e~¼ùˆ¯ùܹ¹tättõ}v»=ôG  §Ó‰w Å?3{Öùv÷’'¶›LšJ($Éûäç&0kN&>EÐçö¢{u‚a3§$›–†>àJ/„ R'ÇQ\‘Îê›§SVšMÕìÞØ]|ù½Ó" T_8ôÔc„B¾(økÎÌþè„&ª™ÇÌ–:=)eÖ--¶Ôïûr…ù5‹LV‹Æ°kQÏȸfôþ¡V.w{øöúJA_äAHŒ“UEÅd2cÒÌô yÙ{âBø7ïÖ‡]ÞžQWÿëžÞ¦·μß:aå?srù'Íȇ™ˆdLf[N\Úœ»ÖÇ%g<|ÇKc^¿Øœh‹aØ5ÈȨ·'Ä}?ÚÍïžZƒ¡"YEVP5 “fÆå rðÔ%ãÕµön·/à~ÛÕuæÁ3ï6q%Ûïÿ4­ü_O)™0f5›,i ïYcKÌùÛåU…‰ï –ôäx\#C|ç{¹yq>‹Ê²dÀàXC‡xsw“·éB?zpôWWó;}µ¯• ;6¡Ë÷ŸŠùÏM Jb,¤ÆTâˆÌg±˜²+6®L̘ü½¥y™Ý¿ÌüÞsâðéVcͲéÊ{Ï{N4v)’üx¨ë›=õo&0d¬}¹¼ÿ3ìþ¼“ú‰ï1¡U”¬ªo}!9#ï<c†"ãµ(âÔp_Ç«ýõ;öF:ü\éåÇ_3ˆšÿO™ ÿEL "E hŒ½+ù”²*¿6sø‚Ãéh›ó ®¼è1fA&4fŸçú³L¼¢dä?0)jþ/ñ¦ ÀØKé³§Ýv IEND®B`‚f-spot-0.8.2/icons/tag-16.svg0000644000175000017500000002215311417267577016120 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/film-roll-24.png0000644000175000017500000000174211417267577017227 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× 22<76oIDATHÇí•ÝkUÆçœÉÄlºùè6¥¦-iÒ®Ri—„(E¡R¤B!èŸ`¯ýôF¼ñZ/½ªXKP°éGh i›&µ&ækºM“6.›ÙÍî&»3;s¼Ø|ì—Dí•à‡Ιó>ïó¼ï™ÿcˆ sòd(tÒªGjwì×±± À{a‚îPÏQ ßò#©ÔaŸ¯F$SiЩ”ÎÃÃó´ÖZ³Eê4öKvO‚îPÏyC©K]¯Í©éY3x¢ÀþFfæÂD£ï¾ó®ëb;Žcãº#÷êßÜßfÛzˆ’ÄO†â›þ ç÷J1=3ÏÂâSÓaª«M¤”„ÂEYuvv¢”ýï_ ´»No¿\ùqÓ¶m$ÀÛgz]¯u1õû$ÍÍ ()@ )imÙ@í¾:4µÒÔÜ‚!†tåõÁ›A!×®Þ !üùzpK‘Ø‘rëöŽD"MŒŒŽ®b­­!•¢Þ_Oç‰ã4`[·©¯Y¢Á¿ÂÀOË}äaº•¼¿ryÀÎår}ÆöÄá¶bÑ¡×ÐqüZ[[,.NóüÉ=9#jÓ4·€Ï/rB—ÖZ33=뺮›·{áÔ©>ž¯¶377ÎèÝï8×õ9zÓæ`<L¬uhÞ„F—ty.—cdø^&[›ÓZäk ¥¤íå6z{Ï‚0ÑÚ`xîŒA2»©–ÛrkèÎF,¶vÃqœÙ"‚¢`wU¼ÒuÜøësº²üŒT*sç`§.²<¾.:ßU$’ÚÈ;™Ìχ7Çù²T[ºHë‚YþZX/¶Hf’ˆÇ0YöߩԅIH Y;ï& N®ð»]d³v °´7 ºÏó ÐWÅ…Ö”µiYéJ¢§²°3[©Ýµï/ýP©™Ê ´çµ³øj ´ÖE v¡ðû4&=ûî8.`j8Íß!ˆÇÂ×N¸ç::‚H)‘ª‘êº33ƒª;!™ZH{Oÿ˜\}¼ÌÕõ4#¶Ãåt|ýÕ§_¦ïâ¦cúÒëÏt=CNܲH$â*´ÜÇË™ÑÁa¾M¦ @üßÜhâ7û;â{ïiøfMÔbóÉ ±õ4–ëEn¸ÿþ„ŽX¨[!CIEND®B`‚f-spot-0.8.2/icons/f-spot-32.png0000644000175000017500000000610511417267577016537 0ustar00rubenruben00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< tEXtTitlePidginÆÐ¾LtEXtAuthorJakub Steineræû÷/!tEXtSourcehttp://jimmac.musichall.czifã^ ]IDATX…¥—ypTו‡¿·ô*©[R ­j@ Aa…3 †ÛÁ!ŒƒÇÁ©qìq »jâ§b§Ra€ØãàÂIÆ€ÁdXLPð‚Œ!„„@,BHhß—nzï¾ùÃf†Ø„J2çï{Ïï»çÜ{î9’ÇãáÿcµòÌÜÜ~Ûb9£ý=ûÕ¿e±×ëU5­`m†-#w•Ãÿ=‡ndûœ¦`_ß´×z¯”þÞßZ4ÇóW)n·û¯6šÝ©® «¾“3eÙdåŒ|å‡Ížÿ⺹i‡O]7½ÿ‹Çí®$Ǽæ`ò3ö¡S-„7.W•‰úúzÜn·þ ßÒƒRPÓc¶«I–:Ž 6«}öã‹'ŠÅ³ÆXsÒ“0HÀ¶½gHL°óÝeEôûCì>VÝu°B øßé¼~z›ïÖñv äñxî r_€ÛÒÜáŠ]Ýb6™–¯,™ ýÓü|ÛÈ¡ÉH’:ºþ¥/ ‰›-lÞñû__HÈ’Ä€?žҪخÃz0ØÝ×TýFoÍÇùºÖ}S೻ߑeÕö6¯ö˜œñft]C!=~**›9w¶‰ñùéüןªÉv9–é@Ù$Q4.SYY2AµÚ¬ê{Õ§’ÝsÇ7 ˜ÊÓ,}ƒ¸72>)që+KÔïŸåÀÉ\N+‰ ÎW¶p¹ªÞz?‰ÂŒËb£O‹àpÚ(ÿâ6Q_Œˆ¡‘’dG×uLªÄÔ±™²µêF×XE1«å¥;OÞ{/ä{Ž^¯jw¥¼üÔ#Ó”E3F±ïõ5üø‰Ù¼w´†GŸÿ€+ÚIWm ‰·£šT“‚¯;È‚©#¨léÀSèªîçÃW¸XÓŠ.tB}ÞËìymd²Úâ¼^¯r_€´‚UÙv{Üš• òUMӈƢô¶ûÙò/%lÛ¼ŒfäåÃeœ¾ÕŠ$K¨&§lÁnU°ZLÔw #‘Sé«õq®²ãçnQ4.ƒÑ9.ÆLµ§M_?°ÀëõZœÙù?^¿¼H³©èB§òR+ŸDmY3MüëÚ™ìÚ²ŠP¼Ä >åøÕFqzÚ,žíæ|Sº.ÐuA,Ba~:o¨àÉ¥D¢Ö><Ñ’èÊ^ X½^¯éÏ\£—¦ÄÅ;×­,¯Æ´Bºý¨ŠL¢ÝŠ3ªÒ\ÕMë­>6­™ÎO6ÌáJ[ƒ±01¡1ÿ¡áT¶vÕt4]=&™‹×;°+ 9é D¢¦ŽË’%“m±ÕšXÿÀëõªI¹S¸~ùÕnUÑuªšvR$ ’"!+2²,a3™ ¤£¨2ïªdyÉRGÅq½£——¶‚]þýÑ™¼¹¿œYÙ™ÔÜèBÓbØ- “ó2åĉ«æf¯×+« y œñŽ„gV}{‚) #„ ãö C- D…ÁÅÆvŽÖÔ£J?ßômZ: „#|ði­øéÎnyVÑž^]Œ%¬Ó|­—áãS¸ÙÒŒ‘팧µq€¼‘ID¢V–Œ³VÖ6<Ö¥€I2|Άï-Ÿj²[e‚!Ë׺èê ±çÚU²²“x|éd6üó,¶ìü˜´t'Ïÿº”†öþªPÈx]’¢ÚéªÛ¯™UÅýÌêiL,†,æ7ŽR<4MôµEÐ4!Âå¥K’lm22!Ò}˯¶8ŠÍ6ÃþÂÊ’ñæKuì:\Iï`”'–Læwë‹Ñ5Aã­^®Ô¶³ÚS@éé:.Ô¶^vçĤÿ«\ì?~®ävG˜Íjbaq.m>J 2ÐuAœP¨¾ÚIáØ!˜Í*Sò3Ä`ïÞ¶î­Pœ9 “%Y^ûaÙõ¤Œ!6¬˜ÎŠã ù#\8ÛÀÕsÍøÚ|tt 2gÎ6ýòCÑ3|2E4Ößû„»¥uÝ?-œ6.‹ßî>ÇäôT­f„0Ð…À§Å;:Y’À0Lêú“»¯Ü­ôÝ<NË››ðËç–Í[>/Ÿx›™C‡«ñß„°ŽŒ„a6"ýZLÏš¤Ú,*eÕÏá{ÔÜù׺ç¿üÔ>’Í褺ä¥óÐäl*®u°ó`5»KkÁ㵈¾ëËŠ$ÙÛ¤ø¬õžâQ&a|Á0-w0 !¼Tgl\?Ǽ}ß™FèjC·óœmÞqwä¢ÐÓ³ÂDJì`F²Å:5?›”´8†MfÎ<7B…#§®ñïoŸ¢½kÅ3DzqÕt>8Q}»åìo£x<.=¦ûã'­~rÙ—,¤ IàÜ…FT!ÑÚÓÝ;jJŽuañ¹dšÛ4%?Û‹j;o^ºK϶ö[GüƒæŒí[¿¼(1Ù¢s­ÙGñ¤a|r¡Ÿl;IégWÑ#¼´q/Oᘡüô??_¾TµÙßRqùnG¤k¡¾­åWZ¶Ï(Ì–$ÉÀ•™@ )@YsýÀKËÕòò[T}ÞÀðÂt\‰qÖIéŠ,½úýSyõí|gñdöïýŒ­G«8x¢†tÕà[©CÈHr?ÔÎèɨŠÊíöA¾¨¾ÝÝvæ­ín%Ô[ª{ÿ£‹AI’Ð…NÖðDÚûûº‹‹sUU‘©8u“Ž/¼}]±ýŇy÷••\©mbæ¤D#Q]0Û%³$;…y£óHsº Á„‰©†ÅlaÛÞ3¡®Æ_»X¸óºï‹ ·.ñ™²$?j¿èì±¼÷oKLçÎ7 kb3cVdV•äSvºžº mì¹t…-?ZŠÕ¢2nZ&šªf t$dÙÈÎt È2Í>>­h´_xïóx<_Fà«2ð5m­¨m1E¡»o ;//Óg7sú“ëèB „ÁpG<_Tß&!Þ ºAŽcó¯±é#¤d:ùî¦1jZ&!YÖu&¤b“jæ­çC¾î¦mD|! ôõï8ÚS~àô>¼8hRM¼{¤F~~Ý\KÍÕfˆhº@Ó# ì>v‰\w AMcú¨ <2f jG??zõ|ÿg‡°8ͬ{jSJrÈÍID–dZºü|\Þí¹´wù€Ç㉃=wÎ_i(mjèéˆÄ IŒ'#ÕLÉŠQسíÜ1R¬n4ö  ABšMÈŒJÊ¢‘¹¤Gáµ·N²öåƒô¢HŠŠªšØy°2tg ãͨ¿×ø=_kÉêëëEBJ^óþ²¦¿zni²Ëi# c·ÊŒí"ÛLO0DWwŪ2,+‘¶ú~bB Ù$2r”,ÍÖL¡ 7…çn°ãý‹øÃãÈguÑÖŠ÷6êÁþ~Ǹ«ùgn·[\¨û¼71¥ õðçu…»‰¢üŠÝn'‹a6Œq»šåäCÕ¬[>‰›ý>”Î’E£Éí•hCQ†¦»X6w<…£3øù®2Âþ½——ƒ÷j~£)u§¦jçKß9è}÷Lc,¶ëHM¡$ÁCFªÎx1-F’CåpÙ-Š ³˜Q”AZŠI‹É‚ÍG lðqy£¾yljØîc•mAß›7Ïü&<ÐØy7ôwí/&^¯× ÄY‡;S y"!9íÙG=ö§WËš`7óÖsôûülX^ˆ$IB‚35­âÀ‰ÚH]So0àëùoçý}—^€ïëâø Bâ‹Õšïšòä# )éÏ-š16é±E…Ö ?;ȳN1Žžª ^©ï!ñÿi°ýæÝÕ{*€(îx<žð_Òx À= *`Ì`7gÌÚ°4É•ù¢§!båƒÝÍ{;.î-#<t ðýNý7Ü"ñåDm{öŒ„`óé ¾Öø²Â=p ½×þ¾¶!ÆXûùIEND®B`‚f-spot-0.8.2/icons/align-horizon-16.svg0000644000175000017500000001511011417267576020117 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/film-roll-16.png0000644000175000017500000000143311417267577017225 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<˜IDAT8e’ËK”aÅÏ7_ãe.:v1*Р "+²‚"¡Et¡ED›6A Ûõ´hQ‹èh]Ô¢]eYèt1ʴ‰l²Ô´±otÐùfæ»<-FDZ¼‹—Ã9œsÞWT•{÷µ†Âá³ñ–]çCáH(·°à&G+ýÛtñ8ªºùÃÀë,}m-¾D®íjm­mˆÅx6S3s„ck‘œE>ŸÇ¶mÞèçÁwƒ®ëz€,éMÏ7¯;Úüôå¡hŒUZ¢kjø‘%èÙˆ@sS3ƒ“?yL C ¡»óAÁ8Ò~8Çqí,/Ÿ>æM¢ŸW½=ÌÏLaLBá(‚ªJ×½îáޮݪ*ò¬·G'&açl††‡˜žž"ZWGSS3›64Âü#"5_éy2¢–ß>äô–úwÞívM¡>ZM0åÌéSlÙ'92ÌØh‚õî%êÖe©‹A"h@¾$TUúû^æE$c´µä[ê+}ýÏÙè¢a¦ç@«ÁqVlÀÀë·…t:ô<ï‚ V±}ÛŽò´ß' 5žŲ¨eYLLL.¸ŽÛ¡ªŽQ¦U˳º"!Çe¾§ÆŠ¾ïßVU`Ù-'˜É€€Uær‚Òo,+Sô}ÿÃ’®l€‚ˆи¦$È+*”(r 9øõŸª"‹¬YúoÄRRÀ_º›+6XDÓFh¬‡ù,œe¾«ó®Km¥¡¡êá8N©¡h%GÁ06IñÖ}²€ßq†ýªºGU'Ëù\úáÀ@‚ññqDª5^ 9AÖ;@ßPý'ÕÌGU‰Þ¸©þô>j¤’/®úRun6›_ýsð2f€Y1+¹xã¦&þUâ/ÇcEAÞ'VÖIEND®B`‚f-spot-0.8.2/icons/emblem-people-32.png0000644000175000017500000000403711417267577020054 0ustar00rubenruben00000000000000‰PNG  IHDR szzôbKGDÿÿÿ ½§“tIMEÖ 9-Ah4³ÁIDATX…åW[l×þfÎÜvvwöâµñ…‹±×æZH ¢6UABi¸¸J)yëRJP*‹aר~¨úÐVJÕ‡´UR,¨¢€J(—1iìâ ˆØb+¶³ëõÎå\ú0»cc¹ªö©Gú5»gŽÎùÎ÷çûÏÿïMúºmmmqç÷(Šº™RZŠ¢ŒPêSåÐ80ñ?ÐÒrt“¢«o®}n­Z_·D±¬ ›ÍàÎÛôjÇ:Þ[¯¿~øüÀñãÍÍHäÈŽm;Cáp² ȲY–Á9À‘ÍNâÏíïå§&'öÚk?½üŸ su655™º©ÿªqû®ˆi‚ƒEQ¡ª*„ð<Š¢ ][§öÜì^·~݆ö .xO @™«3Õw¯ùÆÓ0T8ŽUÕÀ¹c BŸžç‚1¦&ã%K—~üXTU¢Ô{×sDÛ¡C‡F`Îok}¯q{ã|Uõ)WUŠ¢€€!88§èééM~rýZzí7×!]['?¢‘þÛÞÕkW\æ±ý¾qâßçêäÔ›gš&óÀ¥(¥ð<·nÞ¼•èîí®ÝóÊ^yÕÊÕr$ñ'”eD£Ö¬^£îÛ»?¶"¿omm~é©€”RpNA)+,ìÀó\ärYÒñéµÚ—¶~èºÏs„¨ª I’@)ƒaع­1¬hòïZZZ¢O @"ÊH6›¸®ìÚu<ÏCWWgÅÊ+e]×àº„àœƒ1ÿ=ç<Ј®ëX½ú¹(!âÀ°s“çïPM3À˜ J=¸®Ï€ë:~p?µhaì868çàœ1 J}°”ú©cŒÁuÔT×h²Bö=1€{÷œéìê’<êB×Cð<Œ¹r¹I-6 ý”Ò@#>P_3>#.L3 Jé‚'p´õèòú%é_Ï++“NŸ9 !€X,YÖ »åP œ"è´P‹â‚ϵ6€Y>ÐÜ|d•¦ém»vîI’„ŽŽ´ŸjÇÊå«°¸ºÉd `¦79™Õ% AÎ9ç$’„@~Ÿ„l6 ™áÇh:Þ”Ò£uWãžeY`ÌÅÒ¥ ˆÇcìGo_ÇñwÏø—ƒ K¤ÉÉlÁ$©H¨çœ3˜f}·ú\g*ÿ§Çˆ©á#/~wKز"pœ<EAyy9LÓDII ù|Œ1ÀÄÄØè?ntU¤Óu0Œ¦¦re’äûšþ1…LxÔCW×gÒÈÈØoæ @K[KC,–¬[° ZÎçóÁ.X,ŽÚÚÔ×§Q[[#dDoß¹µ¬,U™!D h'„À²b8}æ4JKJ¥…‹ª.;v¬fNä=ë×­Ï´ã¸àÜ߉…B‹^þøâ’;v)›7o–*Ë«Ð~òzûú ËÉd Éd ²LÐw³í'O`áüEزe«òòËÛç¦rµµõ­Å3Hð‹¶–öÿèÕ„ëúN'I¦i€¥@-ÁäTV=qâÝU;¶}_±, žçbtt|Á~d'³Ft]‡!][ªªJ$ ¨ª†‘чâÔ©ö¡¯&r MMMS<Ê,MÓ`Ûy }ŽtºB 8r’|xölݦ6“h4Û΃åå0Íp J)@ÓT˜¦‰D"p8 Æ'ÒT©ôüó/”_¼tþ—^ R@dÙeŒ"“™€ªUOÇðý¡ÀËVK³5û©«K#®E:F:FuõbX–P-`Ûyi:`iAÀÀ`Ÿ¼©²,/ʲ2f63]½=ýñ­gÓí­çuM¿\Ss‚üù¨„FdQÒ!H²@øQÏ·Ý!š[šd³…QhšþL’äSáÞ‡ýspäX¥€iã­Œ-N ÐçDrîIEND®B`‚f-spot-0.8.2/icons/emblem-people.svg0000644000175000017500000007133411417267577017651 0ustar00rubenruben00000000000000 image/svg+xml Person Jakub Steiner http://jimmac.musichall.cz user person f-spot-0.8.2/icons/view-far-16.svg0000644000175000017500000002442711417267577017073 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/view-fullscreen-32.png0000644000175000017500000000164111417267577020441 0ustar00rubenruben00000000000000‰PNG  IHDR szzôsBIT|dˆtEXtSoftwarewww.inkscape.org›î<3IDATX…Å–]HQÇÿwîÝlwmí!0”ÂY¿6+Ö$+èIˆÖ1‚詇À‡|Œ‰ RHGLƒ|Èzò1 Š G3¢ÐJ-”Ô ,"Èõ£Íu™{{qAÇMwvM܇¹sîÿü¸çœ™C„ØN“ÒðW·do€ÿlëe ö‚œB· ¿ªm?!ì®Ûã äG¿^ÛRB@¨D—”äg?Y¶D\/¨l9´er¨ýŠ7Ós°0 3¯×ƒÃÁ„íè=zô¡Ë©qÚ§ÕÎ0$Ü ^7éšrë¿l¶¥Ý†éÛÈ¡««ëƒaÁTÄ].×ÇúúúÒ´ Ã644¤‚o·›Ý/oª«HÊ/)!Þ~wlq'Cj®)ÝñgÎ9zÛ/:àœ¯Ñð@×”Ud’Íi_aõ~÷íb–e9Zv÷coåš—À_©^¢Tú\ÙO !ØS@HQ@>B©4â¯l«‹ï39¤îaŒ>r{Üåå'Êíý6õ#€gå¡x œX¢.xýj Ïý´,«V×”A`E èš2dšVI8<Û`U´Í¸!`„§çº-Ó Äƒ¶6Ô5Å È!µ×à´¤àÔø³ÆwöÍ„ß]SV9Æo »æº@!|BÀçó9ˆ×!$À"€y!„‘47€LÎùXOOO±£èËfYÖ€l³LsvŸ$„ `7€L±T¸–×<€°bMal8B¤D“±å4B¬ÄñH&‡Ô„Ø¿nëšÒäDÏñH¦kʸ$IÍYY¾XUM«ª©`ÁÒÊÐêT/¥™sÞ‰,ŒMNLY±Å% ÅLÓªÕ5eÉ©VÊS±Rý”JÃÞLù½Ð>ñüêTtRžŠuM™ä\4þ‰,ŒsΛSÕ"­•w¦uo:çÿÔ&Qê}º%½IEND®B`‚f-spot-0.8.2/icons/tag-new-16.png0000644000175000017500000000135311417267577016673 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<hIDAT8}’Mh”W†Ÿsν_2™™Ä& “©BJBµš]¡ºÉB³pÑ …þp!þ€ѸÜj¡u¯‹nºq%¸ÒØ4‹hAJ©±LœdFü¾ï^!ÓÔœåùyîûÞs$ÆH{\›ðÞͧi6Öž7³USûþçŸfþÛyi\›­˜ÙòøÄØgCÕ¡pýõczK…ìójÿb㟩_‡}£ñ©korÎý¶wßÞž¡j•µW¯xúda#ÄÀѯ†»¿.I¹ÿ¤CÜDì¿pù]ýþƒÿå¬n_»~å»B¡pldt¤+†ÀŸÏëFc&}—žܳ?–¾ñ€P¸ØSšÿFl÷×-€™]:ôåÁ"D"U(åy^Zzr=‹¡ù¿Ô˜RyÂbþ:iYÈó|°Ré%ËSOéYZü뼈È`Õ'Zó!¯Ò—/€…Ž?0S²T•¾¾>NŸ.&É.ÖkËlÔ‘®ßÆé&!9N–»[ÎÒÇEUqÎCŒ¬×kˆ1–X{#OãÙä÷ûKyšþxóôsAÛªŠ3Ç¿««xçYYYÁû„Ä{œ/C2 »¦¨m PoöF€N jD‹4›Mœó4›$>!†ˆh¶µjë¡Sf¶}x—ðâïç8ó˜¹V½u;(¡ã%ï=õ783B°íõ~B*¢B±»ˆªR.UH|B¹TAÕDvˆ ï„ñ±¨cÙª«ÈÇ-ˆHš¥™ëé.áœmùU#Ä€ª’$]¨oß6‘äU½{ïιBÂ!"™sîÆÌ/gR€÷Û1Í,cÖä.IEND®B`‚f-spot-0.8.2/icons/align-horizon-16.png0000644000175000017500000000144511417267576020112 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<¢IDAT8ÐÍKaðï3óÌ««³ëîúÂjÔš¥¢½ADAÝz¡îPBEeA§èP—¼XAJt¼E%*î’ED©Ë˜/£®ÚÎêîÌììÌ<ÒÓêßË÷áû9<äfχi[äºíI=¸vx˜ˆŽ5Œ7†å|Œ¦Z®Êe‹±ÒäJ²øà8€_À©½£Íµ¡å=Š`Ç8ÂTÇ“U´,žøk_—›×v·žŽ×Жøäˆ’߯•¾\QOú¾éÉ"$J£a—3¼ž_1킜¦¢•¼¹–šúó­5ÉN2£WÛTÕfŠ`ËUòºh:š³ p‘2(˜¥¢ÆcãGBX%€`£*m{ž§ÌÍ.¤–«T*šJ Ó¯Lg}*\¶uР`—j—e¹èVxB$ßdc~©z满¬,¯ª‚ ¤éª‘BR‘çC‡t«0Äïø1ä¬0ùaG¤œUÅ-Ùˆ‘™V>i—gFì—Mçî/Uïëžê¿‘£ËŘ"ðWö)ËKU%Þ D×xÝ ¡7c¦Ž=©¾¤¿w;²ßE–(­#ÝîQÆr@Dµ:É´5®l-¨‹Æ‚ѳ•Ù<ͺnÐó<ýâd\â/Ä›’O©`‹ÈF'€‡@Ms-¡gfùù¹ÅˆçùNÏ®O¸óÒäÞÙ2UψííUDÓ ÖÛ›Øüpúöõp”1Ö OèÅŸ÷Îó<·\WAÓ˜&˜ç…~Œ±z} +Øaˆ4!'@HàºÑÕÁAD::8˜ï«iŽsÁØ#ÂÛi»i#âûwÁûgR@"MHæ“¢8iBŠ)àöæÛˆ–&d(\ßÚÿÎ×z4 gŒÎIEND®B`‚f-spot-0.8.2/icons/filter-soft-focus-22.png0000644000175000017500000000242611417267577020703 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  šœtIME×{–;ˆHtEXtComment(c) 2006 Jakub Steiner created with the GIMP :: http://gimp.org#ÿX@OIDAT8Ë}•ÏŽæFÅ÷V•ËþþtÏôd@U¤ ñ @‚&‘²à¡x^ˆER€V,&aÃ&$ÈLO÷ןíúsonZ,PJ²,ÛU·Î=çÔ±,ËòikÕnn_÷W¯¾e^fŸÆ_^>bGç9¼¾¹öe™ušvýââ"¦4HkMN§[i­ãÐÇãùx¸øwò?4è‹X[}ì?ATpsÜ wßî"lï]PÌ wÃÌŒÖ*Aéúëxss}é­7‚FvûªÚ*æâ„ ä<¢XוÞ;‚ ªôÞ9Ïgj­˜õ¿}õÍàîäadœ&R¼ ÔÂéö†R ªÊÞü1CʬeåÅW_л1 WWOPQJ-”ue™gb ¬e%žç3‚b"ÅÄ4íp`-+§»ÛmÃqb¿;Ö…eY˜—3ûÝ!½IÎ#r>1Ïw,óBL‘RŠÆÝ´GDÕ­ý»ˆ#"¤”'ÆHmUÝЦŒˆPÊBm †œ˜ÆÄG—qœÖ*w§[æuAExë­·sF5ðñ'an¨(ïüâ8”Zxþéß@„iœ8/Z«Œy$NÓ„™1›QjaYÎä!3æí[ëmS#h@U7´µPkAUx¯ÒÀº*9—e~°L [AëFPÅÌŠüw¨*îNÞ;CÊ´Zi­²®bñúõ5*B‘'OÞ`·ÛTùä/¤¶ Àïÿê¡ð‡¿ÿ-"Â{¿ü€ÞçùÌ‹¯¾ÀÝQ ÌóÙã<Ÿ¦qÇ0 ì¦=½wÌŒïB¦Öúp i µêqš¦mRPj­ÌËL Qï¯cÔÒ7߯HŒ‰ cO®žâæ´^yùŸ—,Ë甲òÎÏžcDDÚÿ_ZÜþô;‚F‡?xúCT­WBˆÄãሹq{º¡Ô•ó|GŠÃàÿíF•P[yyš&ÖEÉã¨ñöt @-›ÿÜœRWîó@8ÝÂÇ©­n>œGJ­ô~¢ÖÈ_¿üªJJÇã%WŸ" Ÿýý9¥nhÞýù3DÇùøÏÀqòùÉÛ?¥wc- 绥Üe]ƒžN'N§[®Fv»‰Þ:›ÊÃ@©…­U4(½7Dwc¿ß“b¢¶Æº®´Ö˜çsŒ‡Ã%ÅD)垆Â8î¶pJ§»­5–uáxØÒ/§e]©µQjaHªŠ ˜[’/_üs5÷¡÷N)ð‡“%¢Û³"B7cHÃ&Ü}GfF ‘˜"*ŠjÀÝ~£——¾¼8^0¤n,ˌٖ )n“Ý6±‚ä^wÇz§÷†¹mù’'¦ib¿;Üé0ä¿Æ°™[ïQšÙ¶À:ã¾YÌÍ0ëX7ºõ-rE!Ò–5CÎßD}."Ÿmÿ¬»51kÎYcL¡µªµV1ëÒEÈš !‚vëbf tÇÏÀµ}4¼þcw©¦_šð‰IEND®B`‚f-spot-0.8.2/icons/red-eye-remove-24.png0000644000175000017500000000217511417267577020160 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  šœtIME×Á²è5tEXtComment(c) 2004 Jakub Steiner Created with The GIMPÙ‹oÉIDATHÇí”mL›UÇOécG)ï]åE鬌 ¾]d.Ùš¸ˆ1Ù†/Kg\B‘l(aN—! ™ŒaJ"ê 1~pޱÈ? qÎèJg€-°œ¼  -<ÏõƒÏŽŽ,~1&žä&÷žsïùßû¿ÿsàû·Mº=êM>æÆþ)À}@NùÁW²Ö[Öï$)ïF@ñƒ¢(ÝU•ÕM€g-¨[øœÕG«6çoqî|æZmSWú…îqfe…@XoMN·d–•ì-IJ4gºÛ/õ£· 8€ì#oT|ø¼ë…霜ÜukšÓ+÷ïäÉ­yœ:y‚˜äü“J´Ãñ06«9Ûn·g}wî¼G£l—7lððleUEËEÅ!£1&^–e:zûɵÝÅ[ヌ1&_ÿx‡—°¦¦!ÅÛˆOµ8«Vž^ `ˆÝ_Zb6$&&B T…ìÇ÷ÑÙwû³¬ÌÏ ú ¡… sjFóFdYÞd™Bˆ‘úúêŽ<55}òbÛ&&ýèt:Ò,É(á 1±ñ|ë€uI8ì¹Hz)qÑ ú†PU¯×‹¢lM !ì@acccåNó–Œ +&S,®Ãõ˜âtÌEÅ“v‡žò=vjO{ØýÔvjŽ7~Ó~â˜Gc¡^’¤eUéWéV’z€!Dè:öÎÛ¶ðbx{Áƒ ­¾DéÓ|ùu;,lÜp7)ly@‹$Iï¯õ¸¡Î ~7ø/I’]’¤ÒC¯þÅYðXs«ÏL‘«€!Ù~e"Î>¥—™[RðOÍ&EJþ·¸¡(]+ueoînnÿ}Ó‘"W!}Þ!:/ûl/¹vÐ3<ƒ¬¡t‹ˆ€+Â\]£ù¥¯?ÇEO?Îm[ÿ¢éž,qÑ|~æ+Õd˜›d@ÑZˆXE‘ˆôá …ü³¡eßÕñ,&=Ãþij›äÊÐuª ˆ 7ïò æá´ŠWg¡Å¤ùìÔÙŠò½»hëõáíþ•«5,e4œùy¡÷‹úß:“vl)b«øÚvAº2TBËP9àþéܽ»áûŽ¡|ç£ytö\fa¸«Æ?Ð}¶¯õÓ3þ‘ÀŒ–4¬%ªUu$±u!`QÛö½\½ ·hûèõÍ×!->¯à U2 `R+˜Ià:°„Î7ÔUG+ƒuÚÞ1`Dë ãÚ¹ë r«J–4Êdm®‹š"ôZL¿BŠª–lI[‹H2ýïÛŸ1 pÀ¬J«;IEND®B`‚f-spot-0.8.2/icons/color-desaturate-16.png0000644000175000017500000000106111417267576020601 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<®IDAT8¥“ÏKTQÇ?ï¾÷f¸ÌØÀ€¿QP7‚aAîÝE2ˆ»vFØ¢?À}„(þ) b›ZU¡‚hâ4eQ#ÂÌ}oz1ï§ uHfÔ/\Î9·ï¹Ü£EQÄUdܸÿ4p\M\¨QøaþÕ´n8®&Ö—žàû5ÏÇu=j®OÍ;‰îÉwœ–mfŸ¯ c|"+`]häY¨ê_”íP±TÕAÙǵú§ž»Sw"€í>Y¤P,^ú †czh/Ì?Ã׸uw”ÎLwÓ±œ[©&µ ³3s´wvóñõ/(|ÝmÚ çñƒ{Ž{ùžÂ§·õ-×o’Hw5œJÆM²£·)—x³ú™Ÿß·Pû[„-ý ÛÂè@†gɆ`d°«¿o” ÖºÈP¶þ4œJzÒt¥Mò?*Öo6ß-Òj¦ŸÈÆë€f¾tGJ'!b´fz©~Ù®‚ @JIE!0M)%Éd’T*…ã8õ£”".j,çV>¦a–M=loháÌhZ @»ê6^hÏÓÍô¼!g°šIEND®B`‚f-spot-0.8.2/icons/emblem-event-22.svg0000644000175000017500000001751711417267577017732 0ustar00rubenruben00000000000000 image/svg+xml Emblem Urgent Andreas Nilsson Jakub Steiner f-spot-0.8.2/icons/view-near-22.svg0000644000175000017500000001370711417267577017244 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/view-fullscreen-16.png0000644000175000017500000000076711417267577020453 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆtEXtSoftwarewww.inkscape.org›î<‰IDAT8“Ï+„AÇ¿3Ï»»N"íÞ_ÊRnJ.ŠËëWIRÎö"ÆðrÛ‹“rRÎÚQJäàâ \%sSˆ’y™™ÇÅ®]öÕN=5=ó™ÏóÔ3#˜i+ŒbÐb´zMcdêmRÊ5"Úúi„QÜKDgA@H’Y£U¹iAÅ€3ýß©[=F«Ç¦;hv5UÉhåJ¥Òs.ß&¢ûb±X£8c´ú¬ Â(î° `Â9—ïš„÷;»8Ý«ˆWÃ(>7Zíawѱ÷¾½ÞÜ?a÷à¢îòÌH_u/¥hóžËcë‹€)f.[¦‡{06ØU'Èårؼ<ù‘„–¤Ñjƒ™˜ñ\9´Ö"I’º°¶ê‡÷ì¤GÎù ×åÕf©d³Ùº¨صÖ­^ÿŒ±™)ÔæÒ’Ðú+ýb´²¿Ù´¿ xð Îd F+`žzÏd‚wfÌ­ÞVúï)wo¬ Ž«½•å4æ ﻵ..aöûIEND®B`‚f-spot-0.8.2/icons/rating-rated-16.svg0000644000175000017500000001433311417267577017727 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/view-fullscreen-22.png0000644000175000017500000000127611417267577020444 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆtEXtSoftwarewww.inkscape.org›î<PIDAT8­•AHQ†ÿsï}Â{¼Mn*(uR\QDQ¶H¢p¢VA —Ñη0©‘L"§z ½ pE‹ˆbH(‚(h!eP‹ɤÑ&ìUŠÍ½÷´È'ãkôÕgsï>~Îp‘¦š:UZ/3C ¥„ ÛŽëw¤õ3×49®"S—¹iýjŒi ¯\3H èZ)åÈÞöu6®Ë+%oü—ÄŽëßp¬ê¸3 ¼‡ÿþ[©¤ÃR©4¥µnHPjºP(4¦k­zzzR%N °ì¸~KxïÀZ‹ #— " œêˆ÷fÃÀ›[v\Ÿ„ n>€\<ñîãò`A°ÖÆ^;®ßÞ8(Çõ•RwòùÜæ™™r¶â2ÆàÖ¥ãË‚+ž˜Z•’O›^¹fD4*¥hÛ³oG>î²Ö"Š¢« Œƒ‡Û³¥NÑÁÌ"­‡=›‹›Œ15ÁU£À‹ç¯¾c'˜¹K…ès\ÿ.€Ñjð*F1W.;g-_WzaèÛ‰HUF‘ËåV¬Jb"ª7ÑlÛ䃳¥0ðHØ<"ª/‹o‰hýŠqÄÌŸz{{;|fæ/‹œðõÒîº@¦™yñ;% @€€†C»…Ì\]’ÒêâÔØùþ8bæŸqÏÏ&ÿÖ,3Ï3ó¼™!¥äø–­­z×îm¬”ü@BõWî™ùG541q’×o’R¾!"¡µÞÞËZ=©ŸÍMG.Ÿ$AÍ“÷Ïô¥jXͲ©sP¦õþI㽦°ìuIEND®B`‚f-spot-0.8.2/icons/flower.png0000644000175000017500000030154311417267577016407 0ustar00rubenruben00000000000000‰PNG  IHDRhñæû-êsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ wèã IDATxÚĽٳ$Éuæ÷;Ç="2óîUÕ]½݈‚‹8ÃEÄàP6ÒÐlÌ´>H2“™d¦I2Ó“ô0ÒØ 5\f8 È·A…zï®îÚï–î~ô‘™‘™‘˽U –YTÕÍ›éáËçÇ¿ósäýyLšK1D@Ûkú;Uß+Ìß'"оNçõéÿ”ÅŸ¡¹Ÿ—ÿ`í÷öþÞÀ„ö]=¿ßpozî;}&ko.K·Õ¥ç“é=Ôp² ŠŠ…R{Å!ƒb@ž Š‚<ËfW–ex¯8§8ÑN¿)`˜€a€¶Ý$þ²µÏÝÿŒÒéìö³"Ký/Óí¼’f/ɶ}ÚDzŸp{+¦}#íO»´[fý9w“Ùö‘=ºô<•õ/@Zš==hiö{Y^½m^3³ÅbÄÀ¦¿jŸÃ¬çùlÚ aú÷ü½[Z°ãûÖO£.`¥ÞѰù—í~ëÎ{¥;ç/Ó>êî8Ï@·3àkÁy (ÎÀYæcuÕþ‘Íóp'Úœ»},b ·±0•UL£ÛÎ…ï°Îæ'3@WD¥mƒ´›—- ¹uþ/ml{glx¾ÅIo"+ã!=]ùtÁY®4^×ç9Ø•gÛâ3÷vÈSáu?Ë–§¶­½af³ù5å.Xo¾‡ˆv@D:kcË÷Ê|ÍØÔ¦©‰çšK&®¹¿€˜!)‚%HõR´m¡}û\l7åZ móMdyþ®ŸÅÒi·m“ÅvÍ÷CLðÒ±-V¦Ð¸ÕÐéž%Ó½k 8w@~Ù‚Véo®ì¾Ú6ô¡m2¾¶.—+-|YßæµÏ7X™m~:Ûìš O¥»v-Œ¾Ñ±`ÛæÓ]˜Ò ̲ö”-gÛÐk«€1?!]œí VóGg۲Ÿ2v}–í¦±•žo°-3¸û{íçé=t ¸µÀ´iˆÌ¦9ùøˆ5'¹!Éç$W\N]X„”"É%ˆŠ7ÃÇK²É®ž q €¦³ 15ù¨Azº(Ô Iïž:ÛBL,š íÔŽÕv5÷ñÒšÁ}Öó pšÐÎs¾»–u ø¯ Î;‚âÂÛmýç6Ný>ãeipM:´ÏÊ1§ èÒöo—"’9„ÌçöBƒÓ `tɾ¶-§†õ`j«`©mÁšþ'g»¬®¼¯¥7d+ÌÛF TÖl ×=É–ÏÉt®,X¯kŽí=w—µF‡uNÑÛcÿ¸­ëÑ4»¯Èâ“.Rd«÷±…Gt˜f$¿Gð7HDÉI'á2ÇÆ EF*ᡲ 3%>ŽPLÐBð·ÙE`pöW?FSÝ>xê¡Cv?1_¤miïìÒ`ËDšu9ÒíëÓÌÖ´GðÚZŸ½ÔF;Ifÿv-ã¬ç.È­]Û;®Y1®le?©ÝÔCé)¬}SÕ m{uIÊ*·d%¯ö‘MI•ãF‡øØ´5ÉÖ·•oØØùò$@¼?¹v•5–hßOÒ{Ÿ]Zc[¶zÙÀ¯z鱈·o/ËïYÀ÷•×åè²îuëérÛi Mºô›b"$Í ù>a°Oí¨@ÊI{Žôê·„â“# 8C_¤ ]"“»J<¨ !â³HySÉêc²jBVãÇêÅ^”†~Üe§½2H˯³BwH»"W¨°,û.P/ÿñ¦¶vŠˆÎA:Ô†¬‚³´‹xéXÏW¥lÊU¯žËy-j£‡`‰—ïnRÒ¶YD:y¶Mš^]8¾·—µÎIíôbÃQ¥­ÝnéÎ]:ã$¯¾¼Ÿî–(lpôÿ×1ºòßnkYÅÍKL—™ëæx?s,ÊÐ. V¬láå[ Ô‹§°u§ a»sYvà˜›ñ<ÉLâa0ÂŽ±bÄøŒñ[žáçräGù}%»)èóáAE¸É¿˜SŒå@önõ$’&î9BU’žP)ʈì¢`O”üò!b¡ÃÛœë6:¯ËSéNJÿÙËÖ}ÎvwâwÛä§Ÿ×uŽÁožûSï:¯‰«³y½nz­~·}$à,Òz¶ÈC/[3®¾Y·ó“H{u,æù?6s~4Γù7©,={ë=n¸®t p^>le1äïŠÂ]¡6lÅò3xª ³¬Ì¦mÎL]ï™N‚µíg (ËÆï6YÖÓ=mS»Ó½+0ÛüÙÐö;ÓœJ÷¹¨OŸ0x¡ÀíÔ—BõÈ¡Ïþã1 ÙP¼ª˜õ‡žìî5Ýg ;TRe”„û‚ÝWüó#RaRcN`xÈ%ŠK?¹VÍÒ錙•—æÜõÓ ;Xïk²ufÍŒÝÍ©?m“׎,nEn×u Êzëy ÊÚižZÓ'×a6t¾!Îß§;ð©×´¡dÇûN4³?DVõÓ“„v$Š"H;¡»@ݼuzOk²Ý³Gê©Iš/ñÀyýÁ|W ·Vÿôw!«Û…‚X$5®¯õ¸ê,·$õXö²ÅjîíPÛè…eBT6œH—¯Úé>+P7N].ºæè)‡7WC&w >5Â?ã1Q¤læÎè%ÇèdÄåe…*A ìíK\ñÏC¦Ž$ÃH!Q> T¯МÁg tß *I–!>b““r#cÿ¾áË{­1-´Ul»ýºÓ¦';[ì_Y§Úæ°Xctû©ÓoY.¶üZœ·íæ"‹<ùUødi[&v½5&Oøûm½ØujΖáTu1í7kÇUIéV1Ô¨£ÅãccéLmÅ~}‘Ÿcgp–ôwf9oæ—~mÆàLõ»²xú[c鮲{·íÀ,]½ùÔù'šÂ¶ðöºÃl·5àÞ÷ó@êZw(ÉïSïÝ¢Þ¤)ï)õXÝt˜zâD¿Ig†{.#hÀ „p"¤¿3þ01úJÂ9G²š JÃ&J|$ÈÞƒOg¸ALPzä #hB¢BmŒ] ·nsp\yFå‘V»Ú¤µ¢…§zÞšZì Ä.HïbEoöx·p!ËŽÁUoò÷<[(ËZé5´Á¶Ä®bÙöw]SšÕï°ÛÄI/=»Ni#ATž]²’ÖsX·¥ãðTFØëû¬ÛÙâÓæ6³Ù²Pþ:VД^HíG;£ÈZºKþØ•¶î]‚…lÃKii,¯ &¶…¼[§yî#WU4³Õ.žSî=K8ºIïQ=ôŒåh˜Æ£ú¡zoHñ†?hÀ%ÕP}¯$^Âè„ð–!qŒÅ§•ñëPß«©cdrÇØÿ5!?QÌ%4&ÆïãwknþVÆø¬¢|§†Û†\Tç¸Lq„ г€¨!ê pˆ‹˜54H}ã7?x¡"Û?`ïñä|6¾3 ÒhùÖÔÜO‰ëqÊÌq¹Ò½A/ýã®ÒëÓs†¸å[­c¯LyçµÔÆUÁYåJý´l1Ë΀µ–þ\áeë¢ý"‚³€Šµ@ "UEe™‡nwoÙ&‹» U!O\Ü~AkÓz€jA± ð¦2«ë* ÂÓð|öÛáÓñJl ‘‘MénÂfÕÅ4ôª¿eËñ²®òH…¤&z“ÉÞ-Êò€ó¿N<ú²çƒˆŸÉIÎQ}è9ø…ŒÁs4Vðù;‰ðú„ãßT8ˆ—Ø>Tï–LþlL¨Væ>ão¹ø£S‡(R8%EÃ’¡'†¾¢$ññŒGÂèÄ/ÑØ:êOV×ÒŸDEXåf»sv°ë§àâxébÔßRÄà”â`Õ18–±Îü™…?Ë–vwy\ûhüNv²ZV»NÖÐS5ŒSP7k‡¨C¥¹Zt6ÚmÏBHõ&p¶ÝÀÜúžw³õlW嬟`r›èNÖÄvÛ¿.³ÎN$­í‰E–Ûv ,¦€œ˜PlžQÆ.ZõM3pñšF°™¤5`-;¸uŒœ’܈Ky–ÒÝD'”g§+Ès#lßCe˜5ï­ïù'îyGT#¦DýÎþ¨"û EO"Ñ&$WRïùð÷.׉TD’&bJ\<4.¾[’ýÔîØ#, R•ä† w-±,QKÆdtzаÀ²ø<ÍtÕ2”4SF=5ä‘Õ“Ë ¤MvB#ËVÖ92W>&ÚÐnjð•¿R½íÉŽ”Ñ wÕý„‰P~h„*1üd†äMr­xþÕÙí@þRÂI@0R+&䟊Ÿô0PÌ– «ÅÇ ’MH“ŠôÁ¸‰2Tg¤˜ãHœD’÷„qΤ΃=õdSã±'Šsj]v€ûÉý9ð’c{nÌOD²1á™ sjcjÚÀ^ Jéb]ζ²+¯³Èå|sÿqæêYð„EZH§–³k8h§Š›³ÎÀ¹¡;æ´u¬.Ù2Qv³f§†£t’äl–Řpýï{’élènë6ïÁKÒ:»"˜Ú2·2£êÖÛ2Û‰ƒ]Z±:÷æZéH§W‡7›-®ùkÓ8˜ùûii z@zná›LÎÚ^²àDz–†C„äTÙó”Å-Ä`oÛ4Ç[F¸øF‰º©“ï•ÏERQb”åÛË¿ 2!~‚P!ñ„p·B˚ÿùm‡8Ãb œO¨^0úB†ä1”\¾WòøkÒ##³Øäõ ÷‚`Ü„˜2êƒ#Ða럑¥‰FOFºÕ0WQDõO1]а³•|õ„ÚŸqPgVòLÒ¥6¬7bPmI^×Þ=S‰Ùªm#èÚîüôu°ãº¿¸¤lÁ:ÑÖàÐÎå8'¨ºöjónL-h•–‘6½èflýï¥wãØÅbÞècxœÜN§Ÿ¹Ŭ«éµÚ¿ÄÕÚ¶€Åü° ·—ì…nn¼'açóh4 Û¸‹=""¢H:h.rD|«r Ê ™Ë‡:X¤kªZ¦cš¢«qû/S^"Ln¤@ P‹„q‚›A»9ÄÂÅ÷.ÈŸ3’FRJT—‘ñß”œüg†œÔD«˜T5ãû¯óðß“âN2Ì%Ì"¡‚ÉkB¸ÐÛ(‰ºL”?4R„XTT§%œ=ÆBÀN2ޤº±ˆk—‘Ç­ï¥U+k¬‘žä\Ëy?¯]!ë(»eõ¨wÚ@i#žæI|6…3Û,2nš¿c¶Éw³ÏI|0Ýœw¤6¶Ž\QDm ¡±žç¬fAÕÏ,h§:êé%"8‘ {v Ûž9,W`¯Ãš/l޶։òãJ‘nX'äv©›l§Xº“ÈzBä§*³Åô•K”Ь,ö'ç%Õ†8DdGXq^0Ÿˆ I†9×€´¡DÂbu‰¤1 g`+J“E«Ð¬ßª›Yœ"M’£Ámê£Û„Ç#Æßý_vP’„£WÅKËS*`.rñAdüÖ˜˜(©ŠÔw ùg"PBMõ8rúÝ1é@Ð{¢Ö8T*ÊÏ}µÀ$"ÞcA¨î¯a!Dâ$Ï Þüˉzá©Ì£±¦8<¡˜<»¤?1kœ­9žI›[$mÝÄ×ÛÖóÙÄ’ÝÎÐ"ÔÕwwä8ᆆóŠ«=ñ‘޹+4^Ñ8ÛŽõm⋯‰éÌà¹2wyFæ÷fZ·9HJ›­r!tzV)¤I7*ëòru7yµsçùNûOký®ÌO•cÖç°VéÒ­­àœÃ¹ç^]Ë=3sª.R"²)§ÛÖ؉{ïèCûR§n¦>¢Îg}¶¹YB m²Yݧ îÉskýNBa5ÒêÊ¡2Ò§Ðn¨ŒfÒ °½ÒTû7Hz‚T9P4Ö¾D’kÒ¥"$HBt†‘PÒ~4“b“ˆT|yŽœÝƒ0n)‹ I„  lî?‹Vn´Ü&ޔߠ”gé͇h!ìÿL†?t &ÂYÄ«'>¨™üé9Ù?Ú#¿ ·~ È…ÉÄûÿÛcný—YÞôq 29 ÜÿFÅà%Ãø&ä6–‘òn¤~P‘^L0…T&ê"ÙÍ }F1 ñ"R>0Ž>›“íeøÁ!íJM<ÙB¶^“k.–'F“Y>gk6§0\ŽÌh ‡sS.ºUs,óµi 3×-l÷Ô%"W€Ïã»Âv%ýÁÚó?k¤|ò¤Áÿ›­æ•ÓHù!éèeÂÉ qèAÍ‘:Ys°ÍÁˆÍ÷zÅL°³Æÿ%T51H™!E³ÀS©”?TòOäpt„߆*4yˆWOóÈäKH"±éžâˆêà9ª·÷ð/{@H ”0S`ÀÅ_OˆŒ—ïÖ\¼ G™`èA¤z(\|³bô¹‚â³B’’ußI„{ù×Ë*,u鈧ž‹×.É?‘pǦ‰PÒ£DýC#{%¡¹QÇšz’¨ƒd†?04k¸58ª× "qœaûGpñ>Ö[efë†K'ÌцS£Àd½9'ËÆÄ¢bi–èéž~õˆßMŠÔQm°˜7z]žgYýîU’x[ÎÖ¾{Bøè_ìWδgÇè”jI3ý³sŠj†w]þ¹¹œhGrרl"mtj8É­>ˆ¤Î’Æ|D—\%aº]ôw±bWrm¤ž7ô½¶fA-ºØwçž²aÝp~Áƒ`£gHGÏo eÀöS‡ÅæÈk’\#+ÃaE"](Tàn8ê{ä~°ÄD8.îdø—q $?$ž¶W!cE %íÃÁ3¸É‹h¨ÐGïAuÔG/ì&ç?Ž?îñyNGÒyFeò¨æüÛ‰Ã_5ª‹ZÈ?¦)Á"ñ"1ù«€ÇÿÐ!£Š#U˜< L~P2ø²CO\$%%^$âëÊäÍ Š/ ›da1&Êä{FùÚ%'?•5îƒ* åJV¾È§»)(åDñyÅFBm‚¿ ¬gIbg™ðºÁym¶·Çá6V ÉrÅœîœ[N°5¯iK>/t+ªôTqÅôš}Nðu ]º»‹¬’@Öw<½Bæ´'·ílw@fµzG78¥¡:¦Ös†s¾¥9´ì”gÄezcݱ¼§½"[Áy¾Ëšhªë€óÀŠ\i3Ø^Ód7Ðßš$éZc¿z$µZÏw¾Ú·2Kω+Hû/S¿‚ûPP;,yÈÀ u¨0'HÐ&ˆ$,h#â8QÄ59“Ým%<,¨>Üs†M ÉÁ'8¨” æ…ø(Ãî ²/P)Ù‹Ž¨Gp$øÃôrŒLN‰Å>ñáW”èQŽån¨ˆ*ÔžÉw&| ~ÒcYÂÝô \›‰®ŽTïá²âàWzXbRQ(OkýÛ1õ›Žþk‚™BÆå»‰ÿìCÕãŽÀH„:ÀdÈù_Ž)F‚ŒÑŒhƒOxò}GÚÛC]$ÕŽtƒg•á§2b娮@ê ú3^.²ú ÀN‚%“ Ì€,¿Í›9 7¤z]Zþ~j .;Ìd) i¤—¹ç½t§öËJµŸÖcn6Íi¼dê_+ÃÒßÅŸ® ±S ]A:V³su®ÕDOµÐŠ“¹’£K—¬Î¶Š°èà<=6Y¯¾yQÒs¥Ãû"wv0ƒ-à|…­Õú&Û »æëº´× mgکͬJ*ö©F·‰ò,2ido–©®á=à¦. $‹02 ™Â^“xËè‰Ãçpþ¡q8¨ N ï'²çKd¤Ä Á. )e\Ü5†ܾcüzB"WâÍ‚8ØCêc™0y3r‚ÇÂðóiÕûP½Gÿ(ÃïEjÑg"14¦JýN¿Y²ÿÑH´šú~k̽ö˜gÿ‡Üa 1&ì2rùCÅß0Ÿк¡rê&o\ ãÈèk7„@$:Y¿ph°4ÁêŒôP‘;BþI„x–+ÅT;@Ü5›[Ò[çìÔ¬µÝbJgÙ™úc Ù¥»H×ä±ïLt•¥(¨u5ù–“úO'bw2Îh´©`­KÚ`×Q¤“ò!&J“ƎT&È÷ŒƒC%{ä@HUË=;Áíä‰x±1ßè‘ÍÙÇÀp¸\ÑBû6_³PB*AŠˆ7Qƒµ3üÃä„à©îzB©ÄKG¬wœsô›{¤áDPg”÷p™ÈžK˜T$JŒDbeŒß¼ó<Ä߬‘a‘H1.ß­p¹0ü²á‡#’Ôc¸üó#"/ âÛç-…úaEùú%ù«5Ù(â2e±³2!1G¤‡‘ò¯î{ð¹ †Š¸!6öXˆk3ì ×|H›l0r68ujÐôÅ:ÙìÖQ}•¾-g[pZ§™Ú œï¥hßFع¹5Ý„&¶—ÚâÏOêR ~yÙp k㬳¦A¢Y óžô²ö™yò£¾@ûH2¯±¥¤ºlv Ò$ÛóÿYçôÑ6ãÈ—¹ÏzÝl9¯‡Ïn€ŽtJ®O“ õx]vâØÖ¶LH+šg,²:VÄ%ä*–ÙKø„ì9ÁÝpäÏ8ÜPPkË =6êÇB|ØÜ;h0ògŒ˜”x`1—+îÅrª;4ÚhŸš„F´96Jƒ=!•‚UB¼„dJ:Ïp…G¼C†ÕJýzÍÞ+ ‘Dhý%‘Œòaàô.qG9£_),5çpYãwÊœÃ.•³oVý’’ÝÌïšÑJŽò‘ö~zH1jêx6)HÁL‘èØ{vÄàå#t À¢N01Ò£œñŸᎃÉõ»Sª±¿ðÈ“¤Abm…]__ÒË@­Ý´|ÒÃ=oç†k–ŽCÐ9Á;#óÒXÊí•çµ–tÖ¹Nzê<´YðÆôØ©¶dÁ/i®ÒOß“h­d0¶"Ä”°ØdôJi9ÕŸ¯Ï»ÑÿlË`mW|¬HË5Ï"½•OèÉñ&k©ùÈFÆ®ù™Ýk‰ë¦¢ºµ¡ÚKÎÅNËiž ÁA¶G:ù“ã— z‚ÕÂCG}7`R \8L!F] õýF#lšpÏ1“ï6nÖ§Û‡üUåò ÏýßÔïLÙ3‘£¯9ìFÎ韔ÔkÀÈoFF_RÎ~$Täx.¢>árÃßTÔI³ ‡½q·„ô06”ÇCâCax"ž.Öýª {$¢)«ÈäíÈùŸMØû’C‡-p”ãH¼+x5²ç2ÜÐ#N°°Ò˜üP(ߘ 'c¢Ô$‹XŒXl“ÊÁÏð7Jœ$ê”ñ_õ›ž³qA8øûûØ+·`™gàzŠgðæºRVPl±zÉ‚£J®=‹ç%¯Z$\Vmô‚³Îé m¥? 8ƒ÷ÖXÈÎZšCȽ4 Až5ÿÏü¤•‡5–twcŤPÒ“œéiSÏ›ßz•­“0N­h#ÆDŒqÒ¶<9]ĶÃôÕnµ^ß„\ÝAhO&eÇ»nåÝA}Sé§+µtÔKN‘Y![ ¹¦ÝŽ_¤ºùÈ^hžP)§ß‡êAF¼gXh×Wav·R45Nu=ÊGåß(V7ߟDF_UÜLJœ½¦È8€ Å ØÿYåü~ƃm¤I…¸Dö¬b/C›g‰jŒßˆŒºLTgá¼&=¬›Ì¦*à•É{;êH¥a1G(0SÊljñkº_bZ­±žã…qú‡ÙK9Å2D¨’’' ÎþÚp{ÃkÔ•Xª µqþVɽÿëÜËŠzâEUF †O¸ç©¿=¡¸mèÈ¡¹G÷v<¤ºÌÁ±÷%ÇàeO>ú9ˆ³”£&[ô7×(» c*ÃxJ•Yº±:µ‚aÑa§k8çæ=6¯¿×QiL©‹)0{/x¯8/dÞ‘eŽ,òLÈsæ¶Ÿ[Òêƒc–-æë‚ì®U{wfsg¥ï:MÎÚ!!Ö¤HÑH©½,ua‘ŸZmß&س…k¾³÷GÚ²#uVÙ·>òd°¶¾íÖÍÄ»âºÊ”(™“iÛ·K[Šôy¨[êjxH}p›ö0d è¡âŸòW„úA ÔoÉ%ôVÄœî9ê÷#~?Q|ÊQÞˈ÷UG’DvÛ8þ% Æ?Lh¤x.rð÷„ñcOõzÝ„4g‘á+Šdᬂªäâûú¬*ÃaTï)ÐpÔ¥.þy%žø®FL„d#ªÇ£qF=“²0Ë‘jaüžpþç—ýâìQ§MF¸(LîDξñ€Ñ—†±&§s0Ž‹ï)>ròÉF2A’GÈIuÁÙNÿÍ9îh@Vx$7ü ¼’¡GŠœWè¨á¬¥¬q£„HØ‘»^D­õòÇ=&‡\Ý£2½§Š,æâ˜Z©½Á6 —SPßðÌ™Ÿ:­ù×ÏA7s‚wàÝç÷p~„÷>køè)ÝáóENÚu ÏÚóÉG·N×o¶­’,¥†âÑZ ºj<Ú1’R$™ÍHÖû®Qq½NoĦ!ÓÒGýåè)ù$.¹õÓ|zØ7dÅ%s•”÷Ošòó‰Ç\Ò¬Öß¼_§šJ­›.ͱ½›DˆUÉ#^H>¡‰ÁÇî† ‡> ?TÒ{MÀHĈ.P÷ÿµÞOd7 ÿJÒÔÑ€;Jä¯Àý?ÒýF÷-.0|IÈ?‘xøç5±L ü@¸ü ª³„íz"¸Jý(P½5¦xˆŽðfÂî ù³yEx·$åËD¤àòGCÊ÷2ŠŸÏÀ5#”¤R¸|Ã(ï^’ß*qyßÈ÷êsãüÏ'äÇÂð39®ÈI*ÄÚ(éÝÀ¯¾20Ü Uœ$O}.ÿtÂèÕƒgq†ZÄi³¹¤{ EÖôûeB.#î¸ ‚³m*ƒëåö–•…¹Ë&põoZPq¨vT"-8wÓiºi®c?§2Š|é* ˤ± 3ð.Çû&7…w9™eC2¯-Ý!­ünÐ ôÊU¥mXÔöä§›µvbjznE'B¬±nA:cj¤Q-ÞB®ÚMù'¬î0R{ÙŽ:ˆ§žŒß¬Ç-hôU”§¬kA{G¾o%“à•"«‰tæ+Êa{'„£°Ÿán€;Ô)‚HÂ%¾q7"ù‹Š áÑ7œ6ZÃ?Ñ[Ž{”o”øƒÉ„úmA“Í"vó”üãCNÿ£4YD%!>2xÆïepÞöKdB8 Æþg3|PsÿßLˆ#þ¦`I¨Ïúœ5Zè³½CTâ¹ÁĈ¶ÇÍ_0x.GeJñ õcÏãß=çàkûè QEÄcµ1yS¸øÓKnþƒ²“H “×ã?3x üÈá½!™Cœ†<þ–P¿_rðË#ÈScÀ¹P`!güÝÄþî93eÈ™€UM¬,ön´©Í¾¯Ã…ÚŒ¨”§?³ÍÚJgÒä)ž©8Úr9ÚÍÒæi©ŠÆê-Šó”‹B(B‘ y.ä™#óC¼/Zpv ÝÑuž ȼ›ô4ÚP´Š‡þm»XRöô:l»{®æè‚tˆF qС±¢SÄRÂ,=Qô£X[hÕÁzSbñEY>5Œî‹ ´ ¯=­¾ïŽÁü3²8?•M«ãœ…tû Û¿A‘Šø„fuêÉ5ãä¶_µ„¢"{E¨Îaüf€Ôɇ‰Ã¿¯dŸÉ¹ûïå;wl„Òc¥#HDd˜8øŠ£ºÈ¿šC5Šç{_(HZÇf¨'âEÂÝ4ŒŠ&ÏÇèg ´ðX–Á¡¢‡J}ðÎÈ?á©ßª¨ßmªä|~@öê¨LÕÁ.¾W’Þpók'û9ª 2 ž)g0aø²gð%ø&·t)ïÿî%þF"{^(†MZÕ¬)– WÇÍß8¦ø”gŠGðTï ú 2x>Ã[€I¢~Òû$Õkœè²à»Y,b ;yC)²Hšn1v ˆéRe: »ÆZ £QSÌ,e7§2²ÌÈŠ) C1 åB)r¡È•¢È(ò!y¾G– Ȳï}“ÝM› oÞg¨Ëñ-HO£ u&·›;cŒûk×?@vrÚ”mmA:&±)óB ´TGcEw4³Ë f›:·¤ç“©k]ÛZúãé‘ëB±wï]]‚¶Óç')Aµù·Û‡ÖTV‡‡Ôî€xÞäȰҰ²qRm” ‰Hl#òŒ@qüóßNؽÆ1db¸ƒÀè§÷jÁùky£ºiÔ*b ¥FˆøccðÏÙë½F7íö”Áç”Ë %úŒãòDýn‘DÂyÅßÈÈŸõ é¾’?«$ç¨^QSÊ÷Až0•vš@#šzå½ÈÃÿç1G¿8dð²Ã´Ñc§IÉäýÄäíš½Ÿ’D„Ríˆ ü±+8·¦Q… ºèTRh¹èHˆ‰ IàÔP³Vé`ôU¾JÓ‚ª]™—ux׎(ZfÒmw“—V˜V‚hcÖŸ•ËD:T‰´‰EV“ÉÈëù*äÊzmóú^—ÎÈtà®ió¥B×¼/çŽß”±b„ßè™K 2R$RëRH|³'M/{&oyÿ»’›‡/4ÀŠîÈ3üªòð_yÆßÏ"7nÈ­¶V!B62öR(¿—/K´~ŠKƒC N¾ê¨ý“·/UIH …ˈAö3,Ϙ|4‡z\2þö%7~1#Jv£@F‘&ˆ:'¤ ÊÓŒÓ?ü€“¯gø4FJ¤sö­’úQ‰ÿ¬k‹‰$Rb)”o å{—䯡…CµåàM gÊý^"¥ròõ}ÜЈ©Â©óXHÄÇ5ÏüöƒW?’# å{5C íªÚaF-éx»ë`ò® ¨“yª_k”KOXû?,ƒiÎ]µ†Ê  ][ÊɹïòÖÎZ ömBúÅÚ{Ý”š‰&h#F›"¦?ÏÃÑy íT,ÙÕØ‘ ÖeGÑ˺”ž€ &ïBW·Ð×T£SÀZ zê$L1S¢)Κ„(†-‚ðræ9’5“Bn­š [íF§5%§|[êlG²ÓN(ÑžüÅÓHA“ÕÚ—S`¾8Ë• ZØ$û“Ž n}Å:W*Ó\¥jùŽÏ#ŠbÊ_fâp”7‚ÉÁTP6Áí7ù­Ûviwò6¤ßòDþ1ãÑ7ÿÀÉîIÃÖ,5Ù-ÇÉo()òá¿|„A9úõ–7eÒ"wS)>­T?rdÏG¨þvcíe'Êá¯z.¿YPŽñ4ƒ0ç'þ´'‰GÊ ÿ™ŒêÄqBž/°SÁ./1õ@Bl@+áGáÍŠá§ hF(EGç\~û'¿y€v„æ ¢„IÎäNŃÿû.7¾ž1úÜ禇¤¤;YRnþÏ{Œ>=@÷8©‘¤Pe”¯Gò=8øI‡Ë#X žFÊ¿ ¤p£†z𹏶K2ÛPA¥”b:K‚oÖ|Gj« ‰ÉôÏ=hÔ~Þ†s¨Ì’ê;^¥å¦§­µ¼`1{T›ªÕÞ-ZÎ:Ë{<…GL‘ ©€”ШmñÔæˆÕÍ d3T¼e³6ú}§ú}¶Á±¸“Öf©GãLÑÑÐ1…NdaÄÌÏ([rí‰M»¹Rûž&"1a©ym^z¡f¬Ö&gÒYŽEf[š~mú|Zygnn6süôÖé“ENú*SOvðfoÒFËDw+V4A‘ÓrCºØ}›ê“€ôjP ªÅI†bNqC…Q»a¦®oÅæ–¤¦Ê·5ã3|Y8þzÁù7•áwÅOyðÓ“LÄŸÀñ/;$;àÑ_Wì}ôUmÕ Ñ£7ç¯åœÿÅ9Ù'&TrnüD$eÞ1ø¸£~3CMÐÇ¢™nAF8Ék´È $¿<‚"ãâ[|¨ð¯ 2t¤ä —ÊýÊá/dŸÜÃr%eüÝ’ú3nÿ77És „”°è8ýã@ù×c^ü_ 8*0&M‡;&?ŠÛû_ •B"1ä\¾—pÊ3ÿÝ!’D”T*—¯%ÿËÀá—=ÏO:ÇûT>l½‰—‹RËÜHZð9-UZØ SCÒ“Öúlþñû{M̺´y0´•vh[øÔ©o«‚´ÿºlV¥Ú·ª 7åUpžêøÌ M¨!EbTÂôý3d.Û‘»ÛU²ñzeHÛä­¸ScEO9¥fs¢•ÚörÜÖêö’5ˆÍççÎÅiøx8‹:ÂÚ¼(N:u[[Û@MÊS×R! Àtó{Ϲ–¥çkÙ6õ³\uLe^ Ff|aj)À5Áà=¦Ðzþy‹fĤW€:Òp$6ñÔE/—Ã&·†¨‘Î ÍLý M:ÚùQ9b|)#•÷~ÂM_3øÂ€ä¶9I$»å8ú•Æatÿw+nþv¡˜¦©5}ÍèK9ï}+G^S¼dØ8C²ü¡røŸ(NÀ½ñ®%£‚Ô¤»½ä›¥úAÅè—õEEø &{)#UÉ cDõ6LþöÏÿO7ˆÕSâXyü&ØeEv›òTbÄÒ(Æï$¿6døêÓHJ51Õhå¹ü~D*ãä· ¸ Ô•Õ!ÕcáÁö Ü–1yC¨¿Srã)nåè;õÜh±Õ“Uó²­l¸ó’S¶…¦–aܺÒ`¹*r­¡8F£½Ù¤›ÒÓ¼Å2Û9@OëìùÙkó|ÇÒè)8O¥-)¥ö(±)¨‹›YЂ-dÔƒ&QRb× gëm´©}ª»äZ^¢3dàt‹Éά2™sÄ6Ú˜SëäK RjA´°’Éí{æÖ÷ô5›½˜MÏÚj'›vêI×NýÃfl}ëgp(ÚH›u…Êi ž>¥,€»¼Þ„2M•*³Ÿff=Ÿšn.²Jqlv®çžJÉñá$m¹g'HõeBO®h&²$#Üu”`ô.`µÔ³™¬ƒÈÁÿ"ãÃzÆK·2´à&±‘ Ç?+ÜyÇqÿ_ŒyöŸ(œhë2ü <û_<úÓŒó¿<çèG5Å—r’Äæ”µç~/¼6üí;`‡aào9Æï$Âãd¤÷.Fx!#Õ‰îþ΄¬(~êDî9VÊøÄù7/Øÿ¹=ò8%#ÔÂùJο}—Ûÿ­'È}âYI(&5õƒÄƒ?Ìч%îKäw ç¼ØÇg‡„»{œ¾^që¿?F²ºñ‘=á~dðE8ü´#_"T­"jv¾\!œûæÂbÔ¾-ªeͼ°HO©&êôIWø½ÑÑ‚Ócš™n ÔÍÏ®]ðUYkU7³ÖTµšZέ"`:·-‘dÑÂq÷/ùæwÜ€¦Üsbµ ]šYå×Öôœ.9h¯!à]©²Ò$ñOþuf C´„o)Ž”RË[Äb-Ç8Ç”H1Rך¦µ¨§ÖøœêhÆÐu6ÝNù-ðΑy·F—žpM`À ¤û„rrÍNÙyÛ®pÒ ÒuN,µkÍø^ŸÚžÿ¶ý# nH¬ "Šå`•Bp„dž‚ …(À@ˆcAbjC¤­Ñ"ãÚ¶ÇÖmèÈŽ…›¿åyô¯÷¸ÿÿFŽÿ±4ááÒºEð'Ž›¿éùðŸæœþqÍáoѵ‡nI Ÿwd_sÜ©2ÿñ˜g?ã‘¡6¶{¦T÷#b ù„Ç"Œ?¨Éë­"æ!܇áOå¤è8ýÆ){ŸÍQsM–; øCãòoŒã_àF ´ÑD§ÚQ¾ á^ÍÁÏ@Þæ-ŠJù(ñèÏ¿s—±TØ[è„6q”Žxô¶pô*\ž^Q²lZj,œröݧ—Ü*G„×OpÙ ê¿ÊÉÌsøùêÓ>x©š“fÓ|ë¶°Ò—6ìeÕ½ÎN9 ézb²`EÏSû?¹ÏÚïöˆÒ±e«³dóÝJ ób¨ àÝVS¡“xšéÉH$m< åžtšr³S u)“ÝUA]Þ]É:5mÝg¯RYdÁ’nœƒB'ªÐ%†¥9wœRC]K¨¥†sn§Éâ‚Å<ÕOÇ”Z©Þôõ0qkï7ç°§c¨m…›v#uŠªÇ{÷Ž˜yò”afxßxÇÁµ m:ˆlu¾]—Å]¶’gl…Éî׿–s¯3f±3_Èu­çß 3Òà€8,šßdà†bX éq b™ànÁÈ)¢i~" ¢ÉãT³ùHTþÞÞìY–ì:ïû­=dÖpæ;w÷íÝ@7`@‚’HIe‚Ž "(Qr„Ãa[þ'üà?ÀÏŽp(Âöƒ-Š6!Ú´i…†-q‡A4Fv=Üî;ž¡¦Ì=,?쬪¬3ܱáî¨>çž¾§*++óÛkë[ßÇÖ«¡âÎÿ<߉ìþíî’-S¾-9¸!\ùåÓ# ¿Ûbßn¼9‘E1[Âî÷þ7ÏâíHõ_ŽÓebkp‹„_ÑÈ’¢à÷˵kkð/;æï&-öÕhn)î¹¢ï¾`ÙúéêK¨±fCšfNþ`ÂîW<Ã7*Ä–0‚0Oþù”÷þ×o3øê}èÔ`-[8= ÝàÊ/n1º¨.êÁ¹ ñ[hðì}ѳýнLKždîߟ2Ü#üà.>Œ8¸Ô‚íߘg«ã ík£ßÇ8'íý\¿ˆÇÎ0ÖÏpŸ,›„ÃÁ`%ç^…¸v kVàÙñÄ«êØvßwÛç ;AÁZU€tÃ$²îÀuÏWžw™¹µ”ÇéCëNoIäÔ¥g¨ í™E–‰½Põûx@r!¸,iŽå|-V)´Žê |³5‹1™ÔË/+À¸®š;pŽi Îq=ü’S÷Ýßkºc©.‘%8;ÄøBKY‡sï)úø]%ïÜò’´+ÚEÏ8u=›®ó žòëU"rïqÐkn9Ÿ£aå\Ð'×>÷¬$ÏkŠ7@ë-2EpÛ` bˆs¡¹%T©X~J ²MÇs«Oœdâ¥J&#NÜê/ÕÜù­Sö¾>Ä\²ÝÎPQ›¼è‘Ÿ0¶›‰! IDATûŽe÷f$o% ’(âÑ‹†ø‹#Ú[ÊàS–ì2"‰í/zŒq¤ÎÚ¾ª þeÐJH­ÁdÔ á֌јÄc01BíH!QÕ‘êF±Ð¬Ä…pò£ß¹Å+ÿÍMê½1؆¶U&&üðw¿Ë½Çöçvè©ü•¿D5x_ïaí+S)¶²D0®‚á—«†4oº›¹þ×Çh¸‚¤M‰¹ øÅU\œar‹äÑÔ»VXMÿmNåêfÜK­—GmµPOÚ{®Ç§9Îò7]]Õ…—ZëZ°ªf D~sU]—ÈúU!Z’ ŠT`SÓ»¬è–dĪʖ5EÑ{½ÕÊ#ç×7v¼çL’ÉêÒßTxäÇ”àéVÏ›’`íY‘®Á[;p._#9[r–2]Ø $Í+¾:¦DŒq˜ËŸ (—á—Й1r …Qʘ,k‘âo`­í «j¼¯‰Õ ûRÕW UÉîkNúÕóéFOuÆ/ºò—Ü‘ÙüÙ…¿§ëªF6ƒ§!SWw*0TV+»V#‚Ö,>ªÈ­G*ƒ:ÁT3(4Äâ]G<Ákå5Ûw¡º)„A¢´í]Ù²òS1$234ìÅ Í÷wJX̸úëCd·ê®g©_vHS1{31ü)È#ºgð™­Ÿ€ø¶'¾› ÆëbÇ™±hVšÃÈÀ Á8H ³«Äûm3Õ«EïÀàÕŠ"ÍIKÞn¡.*,Í–Üxÿõ þ9{Ä•kv> ÜúÓïqç_|‹ƒŸsŒn°µáÖ \5ÆJ±5z¯ÂŽ,vÐݼKžY@®,ùÄ!óH2@*°>cÃx)qTy‰*6¸fRÀ:5¬sD4£7@TÄ\°ˆ/•Cúp Véôcð´kùÖ‡s»šŽZ¨œiÀõuÍ+ ]™èJD9‡žèPlÝ8ìgšž$ls©=õöT‹O<ížÏaó0…î“Z4¨ntou¥È(Us>Õô3ïœu]á­ïâ Ë×âç— [bjI1³–LÄn8F«Á#`MÂØØéÛç8g©ª1ŽW<·êz!ö«ÞtU´éñrÏÚòc±½‹iÃÝ<¶>䂿›s®þƒ}üÕ 4ÒLO8zç]îýù‡ä…°÷ù›ì]ŽÁÞe*?ê¦!•ÅŒ3"žÜ*á#Å¿à˜|ÏRµ êÏVˆÒ´B3ÈÈ^I7×i‚ä`HöB+c\½qRRÐÛ).6ØÅ ¦9B´AI@ZQƒk;9µq“Õ=.ç0©¬ÕgºúÏUsn1º,^œ·–¼ô–õtÖj"O–+ÃÚ÷vYYI¯¢x˜AO¯èï¬Lé=Wð7KÚû±Qíh¯ù'qxX[ë‰|§äq -ÙtèZ‘ µÐ}QÞWáõ—@Þ÷ïˆ1®Œ– 0·ÄH±!ƶsÌëb¶¢v±[Å›wYŪªL†Óùs»HˆÓò:+9µYñÖˆà;Õö<Áâ³&GœC ^È˦ÄFŸ YÙõ?žºrîÝrÞT‹:Å^NXÈ­!–º˜-ƒ©<ÃÀïÂü–Úgêç#br èéš “7¿—ðo@’ÕŒ!"B½{?cYÜqë7p×&lÿìõË!0»™ñ_1ÜûMGýZƼfWS†1ãDªàäæì|}«“塟Jƒ¢7j‰÷ÁÕê’§ùØ14?ŒøW”tkAz!b$âŸsøJŠ5hk‰·2ùv`ðÚ¦í‚ãosòá¸fÄÿõ§9øô%üÈcdÓ ´B†1»çÀBn":w¤YħB¿‰÷0säIĽhÉÒÜŽ³¯è±!üÈ@P†ŸPª+ RïVؽD:²­i±õ.á ×cÂr‹;•–žÐþTíéFõÚÄLÎØ—>ª ¹øÿ;Áh鋹×UŠô†6“¨{2a#q¢OÛõGŒÙäþŸMGsh/%ülœªöœ/”¾ëÅô„œ'µz›*çWÏúd㱓Ь$ͤHÙ“ÅDÓÑ!¶‹†_ËðŠ^ب˜ClI±%„†S ˆJŒ“ãr8F»tñ>®ÉÊŒÊZÅÛêšTʹ7K={¡C\²¨˜.5¨¿½ÿ8b}°Ùiý6¸c}Öá}rpæ!‰3ºô'QHÅUN"p–´(ê»1•E¶ò¬(4fd¨º%Ä€»awƒH•®€5# ɰûóÚdîüóÜK†úÅQIŠ'£&R¿äÙùÅ1íÝÀðFBÆÒUÙœ2|ÙÑüÅDPO1R ’ RG ñ‘ÁUÁÜæv²¶C‰ðʳ?å!#¤YâèßQ݈øËQfӖѰ2æ…_ü$õþÞ{Œ¯Ñ‰Ð¾e¼îÐX¡ï‚{½¨_Ò3mÖâ×S{üeL3ŠÅl±Í‘pÔ2z±(³ÒqÆ8¤ÞÛ²!=ôvd¸o0sÈ â `G¶‡¸ñ.ÕbŽkޱí$ÎËu¾L@ÖžK´¬ *gJDéÕÒë+ûat‡972ˈ“SÔEÿ{íQýÂa}óXd캄D]óÒóÔXV¼Ëç0½×\–ËË‘oY)Hºµ¬£¶Dοô<ÙÜ9A}<˜x¢ z©y>o§’‘¢´È‰SÜÔb åk‘!´åmlh¶Ú)M3§mM«4 4­Ð´Ð6J í)®1 1*mè 4-4²h`Ñ4,š)M»  m¯jO«aš'ñ'ZÆÎçÍÝÙ³;Î=•=ÖÆ¶S.ì²Zb#ä(à nÏá.{Xæ·‹ïCn2j2îzÆ\šŽ{ÿ6±øaXÝ;*P_·äyEó®Ã¨éíK‹O\dûeÃÕ_Ò.jîýæ1áÝ)¥…TZìÙGFŸS²¯XüØÙrO\ô“ãOyìóÛ¸J¢(L 2Ú.þ¤HŠØ)ºîCz7SݰÄ;-þyKœ R7ÅCKj2‹‡ÿòˆí¯m!#!Ìç,î½Gްµû ꌭ0qqH¾oq{;tV'®Ð|'Âü–R=¯ø,šÌþÅífÜ®NÍ[ î@a¿h³-´Et`i߈‘úuKvŽì…˜ ÜrtàÈZ¹Ùavù:‹ƒ—‰Ã먖쾵æ™K©ÓÁŸë¤›ït9oÑ?[tƒ~ºQÓ5EÌœ°\Ó V–Òùœœ¡Ïš£oÐbz`Ýýêr9_ðÒŽóîsA¥,OƒÝK’µr©©.ZèÒÈËGt‘1„˜ËÏÛÐÒvàÚm;£mg4M m•¶]sù>´Ä1vi.uʲ9_¦ŽGJzt€6(!@hçÄvÑòY”'¥á¸2xåÇóœÂEy:Ÿæ %ru©>éñµõT+ÜR#{8Ö¢Aˆ)cëâ¿Ì%h/+‹·3þŠÂ¨«ˆ–êºãî_ö¹"+ݲ¿áð'ŽæGPÛsUQkºCŠ(à¶„ƒ¯8ˆ{Üû''´“C.ÿÚÿZÕU&·—ÙýÅŠð]÷#ö ‘’IÔ×3qQar"ÛŒìG*kÐÎeÒ“1× ÉDz°hĽnÐi$Þ¿g±L1{E3ŸÕ"ÑoÃÎWÇŒ^4ÒNîR¹Køêb‡h‚´ðÄ“‚7ὄûéQJÀ\2ä“Ìâ­Û?kËÉ4TƒÄî/Q+´ ÿeÃü»söÿŽCªŠ8è$Q½ìÐÃÄð¦`¬âžÀ3'¿í„ÛÏ ^- ÌT‘ EYY4h |h±cO»=Ä¢ f'øù‡H:)øs¯a}„2㼸 ìI{‰ÐÙlµ-›§G"OA²ÎkÁÛ)X?³EÜT‡˜P›•/´Ö&þ]sËØž™ÿ)Ó~}¬²i¦ô±P¦ýëÒ£=:NÒoC¥ÉW¨Œå÷ mliCGk„iWAú¢_1ÇVVÕrZUËÚ“õÉêÑÿ5w —,äÜ}¦Re§ŽÚH§ÆÊ—ÝFyhuðÔ§jƒœz(8‹>þR zJÊ÷„G&ýÅít%/+N^Å‘±ë\Ȩ¤{™éŸ/hn5äØbÇÊñw³ï…Bðb ƒÃçG„ܪwcHD¼žð/{Žÿ_OøS$‹Åv”DI¸íÄÁÏ{þË=îÛpû“n5ë]›düÕ£Ïg&oôƒµ'úDõrÆvûRu9ˆ]S²Lª‰` ¹)’;{³o¶T»î/{‚:‹(E—l—ÿÁ%[B3‡ñƒX³C¾g)úæK†ùwÀo ÕØ“§YtÍÝL8jÊ(ú‘0{·¡z]ðûã„$™ÉÛ-96¸}H3eúïÒí€{ì®!Ì¡}·6ÇCåøÍÀü(b îK¶Žöž ²c1–Ô ‹÷ í}CÞb퉳©°lÓl]#ûƒâÁzZn©§ƒ,Ì™ëEÏ¥3ä‘€c–X¼¦7.šà2}–ù¹šœyÈêÖͪH/«hzÓnR¦£J²KÉ?t]Ê‹±¬û¡²æ \/õ™äñ¹ÏK/ “bÎÄ” iNˆ Bh!ІBk”Ÿ-aN¦…êè8åÐæJÕ›b¡0rZ.}P>«XX6k—¾Kç½´üïn-Îì?£è83ø”%ÍìÊ\É$ײx×`‚‰´2ÅçYs†Ý®øÒ„l•Dïù‡3ÒVæèû˜­‹ÃžæÌì}Cüàÿ¼›ÍëG˜j<¹±ä»Bš(ó·#é–žÊaCX$*iÃOŒa…ÃÞׯ >Y#6“s 7‘ö£)ƒÏre9úÓ–ÙwgØÐN"é¨eúfÃäÏæ,þxA¾Ùú’°÷õšú?¨ÀXÚ–À>§°£µ4ï+‹wê3æŠA}Y|ãPh+Ï|{‹ùåÄ훨Ûã×´‡ôŠU9(ñšCûƒPè ÍjÅ=ÂN_è˹íñŽ–Òs |5c#›šêòþÌÊ?ÂöÔBù¾oß™’ ©‹Ìáì¨õ#•k>ÃM½’ö,Gu9ê ÉzÆ]¬´Ñ¢eT-Ž^EJ— •ÑñÄK~9F]iaIi<áAwÛ ]Ôd%gA—~ÕšVj’%m4³Üi­±úÙiˆÇóÆÐ‡k£ÏÍhY.TùuÛŽÄ™…¹cpÓb·-»_õÈP±•Av {W L”Ù÷3ƒ&àžwH¥Ô7½ Y,kò®øq$ ƒO{f÷üÆ!Wþ®£~£F¼éì ©æÆ†½Ÿ¬';|ôßNp£C.ÿçîÀ­(M¹q— g¨$”Lƒ=°+e§)¢»::¦ó;Î6¿ß²õC› ¹½‹lGH0ĉåþÿyDž.ðãËà”Ô4ˆ!b‰­#gC<Êèw•Áç̯Eª3¦¨”ú²ƒ,ÈT©_óH†ðƒ†Ñ;®ˆM 'šo·ÔŸ°Œ¿0&Í„æ;_«±×<“oÚ74ïê+w©¦~EðcJêu›˜½gIï&êOfdBá¬ÛHšDìÅ\–Bw$ƒºD²ÉšT´UE4j_㧇˜ö²ôüXÎ@¨öü8NmÈTzJS>æz>%┾dä¼V¥žz±¢õâô é¥]\DªË™†¡¬'ßl§1k°sË­|§ýM©{¯y=µ×wÁ»HÙñ1÷/íü¼s.šVI¬tæå=µ¨†,å¦+ D%Æ%ç¼VaÄX舥ÍhaáÎ'çøJ°L#ïlK󆓞ª uC÷þdgìÉŒóû Ž §»D7­ûAžKYÙÇ]1Ÿº±D3bÕs-d‹±[%w/¦Æ*Ö›nE9>JþáŒÝŸµl}ºF*OÅÀ/5ÒQ ÀÖO G\óÑ?pã9üs5=ÇnQª]ÇÎ*g[ÿãmüs‡ì~}³S §(¡£†(TI;óînÏ«ªÏP Ãd#kô(§%~jø*·ÿÝ!õ¥ jdIhTÚ‰åä[3®ÿ©-Q$F¬Ý+½£˜Ë´a¨p×õ5‹€«#â vä™þ4Lpûÿܘö^æøÏæ ?]·¿™2û‹Dóƒ)WþÞ6Æ[¯¥ª3õ *™ù‘ü ±ÿË#¶~¢Æ_¤*ÍÕ<‹ÄC8þ–Â{-á~­`ð2ØË ÿ|ÂŽXJÊLTrgÍ›r4è‰bÂbk›ÖL†øÅ}$M õ¤K#ÿÓCqKÇ;Ó“Óõ¦rRd¹3]Ä 6Ï¿å ò| ØzºÛ(ë?/yhÓ¥– í^/ŒµT1 !j9/¹—â§›5•ža:/x—ÏP=/“UVI½ðX)ÅÍ,®u‘Æä•_vNJè”11°Ž©ìŠ“¬÷—Þ9•N¥lúV¯Œk¯¬ëðÚÕIýtÈO²Ð­<Âûcô ý)¾oÎÛÞÃÁ¼TF2ŠHPâEg-*Bj”<3ŽÈH°Þ0~#3yÓñáo4ì~^°Ã„ÙÝ2þôÒin9X¾úKžË¿:àðŸÁGÿÂË·¢z­"»Ôýâ>ºâ¹üõ-šûÊ­|ŒÝwlÿuƒŒ\—ÞÒ}îSƒ ѤeXS§)®zª†´È°Ñ`ˆ3%Mÿ––Äÿë×~-ãsÂfª%ÜQ¤ÉTŸ¬q•e1hl @Ú–Ä¥Á¾gm¡~Þ3ü”ÃØ„T‘ù­†ööœÿE•‰ÄÑ'=nב#„„ÉŸEv¾6Â_÷,>È„[-ÿñã”p’ðjØùOF _ôر”qy#¤I yÇpø/&,Þ‰lyÈÖÏXÜ®"ÄqZŒÛ´à‹Î} رÂv ÝÍ„|"ÈÍXÒÛ0Ô%{q‚mî"yjºÂHOágOF±é é‹ú1˜Ù~î[qÝX¿´yÊŠsÊ}-4kíµ5Ú©ý–Ö™kº F%Å„Re¦XÞoÊkM©nâûC±,Ë#ÎÀ“ºÛuœpθÄîdÙžfÚ*IgèRŽ }Q¦ 8‡•ZC: 6Äïè#ªx=oñìgö¦¡–Žx=éÔôjyS=%7Ògçó„»Òm¾ŸžD}D-üì€}&‚qµ²¤ñäÖ1Ï0¸2V²ò‘%¾k±ã&ïÃöOÑXZÉÌ”æ­DzвõÕ 32ëT›l"ÛŸ0TÌG¿]qÿŸÍ¹ò+û)A]gòO‹õ†OÔÔÿ•p÷•!÷~ë3š°ýÕ]´¶ð'ÜÐ`WžÚ±k<²zEPdœºyBv‹šªÚQî½3!Na0ÂøÎÿ8ò]‹ßITÏ{°‘Ôrö¥ê<ô¨5˜‘E+‡¿ñca÷¯8üŽÊfÚ’ {?Wa¯²”)Û­/ Z+íÄÉïÍØz-³ýS1–ðA`ë+žú…Š2ó÷"õ~dð¢–QñÎ10Ì3í; ÷7âÊÕÿl›úEÁïHID×\v¯ ¹|bÈ÷L碬Ò(ehk_‰s‹Å=vdÈ£!©Þ£ž póÛH:A4uC|«ú¹œgyŒôÚ%pw·…{ ‰<œä–g­¡úæLØ•îZ:£lÛ©7¬k<`ɹ}Š Ð6¤C(@¸Q>Æ1êÇ$[}"+ÛÑóvÙKœ.ïOɦ€Œv^©7!˜¢ÎY×¼óE´µß„âÃÿiJúç'\þµ]ô2¨ätRιîFhK6¢º„ÁŽæ’’RÃâè¹^`¶Ù:²1ä&îZ†Ÿd» k„&²¸?¡®)Ó ‡ !Z µ!FüóÀŽ#eú£ˆßWª›#…îXÜ‚ãßn˜¿=çÊßÛÂìZ?ŠÄÃÌöaôzÙÍ¥‰~'ƒF²Ufošo4ìü K=êÆŸŽ63ÿKÃÉïÍ™Áögj¶¿2À_·˜Áw*lêvI͓͎æG½_̦ÒûŠÔ`®†²‹ª"y[ISGœŒ0[Ò`ÀQö‚P‡£Îxi=´"z¬µWI¯ïS÷8ÛNíš§Iy,½èi DÖæýgìF×Ϙ{}©òŸB‡Ø.KÏȹ¢®,ü€ÆMpþï[¾˜…Vˆmó&Ç*½>ÏY­ž»˜=&ÅÁ©Ä`…,%q¹˜µ"g£ß¤kß r×{VÚW/®:eƒ¸¢·ƒYSZÒ£däcnÀ Û}téß“1>$醴e\öÎöSú×coçнOí{D™ÇÌ$$š6“+K2†ìm˜"ó†ØÖ¸%Í)î’"µ£½˜¼%4ï*³·#¿$Ô—*LUú.IºÁR1ŠCö¶'~³Ý§Q”å½d¨À]3 >ï˜þyfon´t¯3à•ÁM¸ô«CîÿïÉ[-õ—vP¤|É(ñ#ÅúT‚4pJ ÛñÑ0ŸÌ˜üpJø ax5PEO\8âIMzà©?2HEI­ÂüöŒú;¤dÈãñ !3ÿã@õœà¼%[ôAfü“¿S®ƒæ$sô‡sÿà—þ£-üK–ð®%Þ Œ¿Ã›©J#±½§<ø— v?9ÖH“ÙúÛþ¦biÅ«çìhïîý¶â<\úµ=¶_uØÝ2$W½’¥)’“®é˜hÐ(¸k÷B±ŒŒGŠ$’év#&YdÛ#>a<$?¦±¯ ûcâ5K.ú…¸j$–ÖÉJ'¨Àd]ÝŠœ›}ºBÓÞVÏžËÝæÃ¬€{9å–;þ¶?n+Þ:œ+r–ä•Ê×,üïTþ˜ÚÏhªXß–&Bq Ô)ëJ¡=KW}Rêô!ÔÆiÖô–ª>õFÖé´.]õÊá)Ëç3o¥/qìQ9gG¸õ'äq«]}ªóøÜ ²’–æ3é>/·½…i)B†…FŽcf6Q¦· ½c0[Ù$Û Õ}ªýk¸k]à®ñØ¡Å:……¡ý ÂÿWÓoenÿ/sv>›½ZQ_QÜ–!Jê‰÷”pJPh²%¼Óù§¼ê×$“M ?£ŒÞ°£äCõ™8.MAñ†­O;Ìx‹QyOí=󪢪f4Í„¶™Ó´‰¦íŒ†B©¨—fC¹C]ß“oî™Ò÷N´HoúQzÃ4¦ënúÈ~¬ ÞUŪ½F­¬h޵½¦öþ,Õ–÷x^TÂÓrÑúðƧʙ‚@7Bd½+P/gé$e *–&¦ÍŒiiBd>7´‡nÜA¦=Ì}Ó0ûžÐüµ ;ŸÌä*# à^…Ùv¤¡#Í2õ‹†ág 1zD3‡$¾ ów`ø¼b¯üKнì1’WåRñ÷( ‹œ„ã·3ÚDönì°Š%‘ÒÌ“Bi(†ÜÔp f¬$R1ìw‘Á+™Ød˜gâQ$CÑR_Êäy"·¡L¶É UÙç óÉ=B³`ørKÎÚ%øÌþ¥ˆŒ”2mk™}˜ˆ\$`v©-$°aëÓ~Ä'¤Ê ¿(¸’rž rßpðµ!£ÏÕØËçÁU¹ P—"ÍÅk»ºRø{gcs|‘Ë´q–’tŸŠ›_µ#8 pO3a‹¾‰gÚ“ˆ¶-‹÷ ®‰Œ^w°«¤‰êRÄì¤ÄšRi»îÊkc­MyMcÐP“ı¨”ª]àš9"¹w¿p¾È¢wݺ‹‡P6ÇPÖBk9£æØT lÚë÷=8–V’ëÔð¾í¨¬¶r«¶U—v]b™Ò*P5w;k ÆZ¼³8[’ª½w4UÅÂ×´ÕœªQµÅG¹m¡m¥€µ¥›Î+:cÓ¨’'w>Ÿ‹> Ò…W_ež.9q´§Ôø¸”»_u®B~ûMZNÇ?DÒǸg­öÏç‡ûÆG=;×STÌÙêã ^ÈX°5y°ÅÂyŽsÿÎŒf‹Ëü‡ÿŠ0ºžÁfÜvÃxËžåøvbq²Àïl£'eͰ¸¡)© SCº#Ô[‰ëÿp€ˆ!/ápï÷§ø9øe»Ü‰ëDÖvwOìý\‘]¶³Hx3Q]1T/YR•—cªE×{-#êIгŒÏd HI1³¸•1ÃDÚkÉ.]"ÏÑ%¤IHr`K·zî1›CÌ08L$'˜Ï‘=h2ØXæ–ãoÏ£*X µá@¼îEƒú&0x¹K·º>Úð³³ç±ƒ„­Kp¬t’ÏAƒ¢Ù j!t Z7e›TÑ&¢­!uÔ„±9„p»!'À0ýÞã32¬¬uÈØ‘&`·,v×Q?g‹#á~F\¡´š{}W¨¶ö2ìðå^Èð;q]9k-27乡†Ö-°á~9o~œz¶‰Ýósvç „ÞôdUËqÅGÜT›‰yó&íIëú‰*f "+¯ˆ¤K»Î†”"9'4§•µ§µeKaâœÁ;Kå-•¯hÚU3*ÝLhüœÖgšVŠ·òR?mŠz‚Ü[ ô髿‡Êï–]|Ýô´Ðž6òãTl<šÙ´‚=M?mš÷½•uU=‹èý(×2œG´BÏi ^(Ã[z ¸-Z·Ec·Ðj€Œ¶q;žfp­O@¾-¸ç3nXîRbk;Ã|J3½îbdŒ „0±¤Æâª¢t-¼&d—F2if$Ô7kæ?PŽ¿ ·„û¿í¾8¤zÑ`ör u®ÁTÇŽ“ogÜ7„Á«0üi‹ì¯¬‘ Ëúþ39‘L7î,ÜùlÄI"ÕäAq‘I45˜àÀÖ@ÅtqL³˜²˜¨SƆDÒÉclK®Š#·ÐÜI´Çv_OúƯóJ–Äà“3²+ÅV±ÝVÍÅÞÌX_<µÅ–]‘â¾HÒ4ïeÂû-â3p˜Qɋ̷3ù0`þv&Ÿ4˜ßã#õuÁß4l¿0F“b¬#.”áAÄ]lå±ÅãÚ”»!·T× qšL S¨3â@l™ß0#‹T*-jI¬€¡B²%²GŽ{˜¦¡¯é’ IèÙ ÜöJ6+W1Y¥›¬+âuÛH.FgÎnYŽ¥JoÔ[úŽvb¥t—´«K£¡Ä*½:¦´ ^í‡Z'8õ8S@ÛZ‡wëëÆÕ87ÃÚ¬mV}Ö YKÛÎÃǧÅÌM3§å ËRùxÀùaZè%Ðåž{»›Í|œ‡èª{zxýxÌüÏ;v‘'ÑSŸc€Þ—àIWpëÐjLc÷YÄ]š;#Ò‘A.m3¾9bñaDh©?Õ2ýž!ÏP?ñ[Z~ŸŒú ó鶯ãÛX—QÉØ’5c·Š8?EbÚûŠ©,Õ5ƒŒ”/Z¶¿<$-³·,mRìÐ’¡Zm<óŠ–r—„Ë¿R„|\8ÞuDÅÒÍ#­Ú‹Y´WG'’ è^$UJj±‰2MhˆÇ-ɶk†äì˜5÷H´øSñ ‰5¡‰Øy '% Ô­ÒL,þ0ÜÆ`¡P²‡¤®Dj Á8‹éüËqE7ŒKIší"ø–EZÙ1Ç)L¿'¿wg„êyÅ@*Ãñ.^7 >7`üÏ`/¢µ¥2Œ+&˜nöÂÐI¼k,زhSš… ä˜É)i¥l]E¢©Hðl¡]ÄXŒ-x™å3Aqh¥eÊ9x²BÓ3Æê2IEûEÅæ÷n“˜èõõeÍ,›{rý$b‚MOéuêôÚ~t Ô©ëÔ—7Q ’© M1v¼tG ÊJ,`Ä!Œ1åök b­/ܵ=Á˜Æhç3]¶¥1²Êö[’|,¡=@<3ñ§ëm˽r>wªútÓbÉIŸJáÜäg>G§Aù,Hwt×£šˆ}íÒé)ré»iYÔyr½EØÞ%·ñƒmLr„©n ³?H¼^´®ú²Ûpü-GuW¨ö;àB®ñæ!ƒ« ŒWL.¯ ~zl4]å¬rÊþÿ?¹ ùík¬évçÕˆ÷yU÷Ç)±»zZ2{¥Yìm Œœ¢ÛŠ]½'÷hwöI£ªª€G×õ÷Z¦¡¸ËT»>úZ&|Ì%!·BžZT†ä¸âK`okÑÖbF‚(Ö+:Pä’PípBj3ó·ALÆ]Lå°[ŠX‹!K·è©MHîjhÓåj‰Ð¹Ú‰òax± ‰¸r¨-”à,B&¸@dNÌV"‹™5L¦‡Ü}ÿûÝþ>Ø9u5b´õ~'á·-ZmQECÔP‹•÷ÌN2²Œì6Ä(hj©¼`‘¬‚­ ÒzÌ‘C s]È®®JŒˆí¬jÄ¢©Ø®'9ƒEÆ™­/™’—¸Ñ»*qÑ®òíKë_Ñ\r;ëT1¦Ð7±-JŸØ0¾kÔwqo)¯u±ÒÉñLW”t‘2S‘‹.¸øz[ÒÂ3ýcÏøFĽ\Ô=êkšÑ.Õt7Ÿ±“®>üZ?W­Ò7?ç{DªF‡fY2¢½$îNÓ¶¤ u#—»d‘þÀJY•B(Úº€sbB…÷ŸªæÌ¬)k ÉíeVßmÇ—”Í!uꑎ¨%­uɪÏÞ ËË×T9eñúc(–ÏT¡rª9Ñ£/'.3äPäîíïtVý‹%°?›#þ¦2¾·`œ'zç›Ü¾õ6Í4aL}Äöô»lÅ-Fn€1ÖîbÅw`(äPI8¤i„í;ÔZЏ! zl±{…N2*ƒ]o0Z¼ÝE‹æ:  «b+w¡©êÀ›N~›ÍZ¡/ ±€©P»nÊ« 9—v–xµpÛ¦…œ6ã߬A¬#…DVƒh&'[táVV`dœë¦Ì²-áIqƒgaÄ*»_±åœB“ h®‰~ »pˆÆstÐgïwÞcNw˜Uòèêùáf=¥2XnÀ´³¸Ô^¼ùFC‘µïshlÂûâbM#Ñy\Êä’ÞU„é+oãòÜÊzÕ]RÖUøœI*Q„‹ÝE­ýø¨¾ÃÇÁ2ho BÎþ\~\€½ær—>Ðy•ø"QSCŒ”Jô•æîóÊŠ5E+*fsiÖg:g›¢çßóß8_?ÝH‘s<ŒëˆÕ6‹­²ŒÀ;ÒÜ0ýž —•ñžñëBý¢ÅAI¹~ý2Õ«PÝ4~û>³[‰k3dÁ&²LÉqZv ‹X/q˜±Å]1%hKqÛ¾¯PE¦ïÃì–AmnÛާdÃW(]±ÿXªèÕä¤n$}—´ïÐÅn 1bÆÚˆXƒäek7ŠÓGoÒxŒFòc4„<,dBWŸu`ÌÉÉ6:ôÈUƒ© n×’Z%°CWL–û;g©¬cÿÅ+ˆO¸a~÷.Y-Q´-)Þæþ–{Ð "UH` Ðh“Ñ\Æ¡«O¤2Ô¦T¹ù~•ï)þ¡~ÉawrS¨Wøj…Bž(v_ˆ*¤™@SdZº³ÞñjÎ$M„60ŸL™Þ½G»8d¶¸ƒV3vPY!s|çü€Y“‹=B š„¬Š™)ÕqÄ|° †0‚xôò‚úZ…Õ˜\£!£¡Å¤K·K&% Ö#¶ã M±7M]e ™UA%ÎÝðR%V:xeúcЬI†Ô$$´h“÷ ddKá;ÅÛ ¥ºl1;¬‹äãLœdPÀÞ]©±8æïFç3ª Öüul[™’ÔîS;â$cïÌB`hÐ X`Køÿ¸{³'MÒë¼ïwÞ%3¿¥–®êîéîÌŽÀ$”M‰¢HQ–eùB7ö…/þ¿ì+ßX7VØTÈÔ…I9HÑ$Mrb›}éé½ÖoÉÌw9¾xó[ª—é™Á¢=Ó]ÑÑU•yò¼ÏyÎïÑ:KèBi— ‰<·8Ÿ±;¹ÌôL.VÜpx,éaÛɵ,«.y«Ó“'¥w?aÒ/[Ú«2°†/r®>wÏfP—SA*›¡WB· ¯FT¡&8‡3å¨Xôür䜋ã#¥u‘Ž)מêð<¯µ,3HKe2»µ¬q!üË“%ôBÜîC¥Kå11d_F½z•ƒpJbIõ°V°ýçjœ«pÆn®‚£Ds±Œ˜rÌü…¯ÊC7èãOaŸ[¿ýÅÍÃÙ…åxª sÝcvw„tÍÃÖÖùr¬} äE±²‰Y¥šlœUݰã:®sì,³{·èÏ[âyO:O÷Ø¿1ÇM'ôÇ çBhÁOZ¨®2H•éo%âI ¾Qcž‘’Kx¥ð„L>Uï'Ò]˜~ÛQM(EâŠ0þÊÔ8Œr6„c“±>ÃÂ’(ÎŒ¶]0_>`vÿ&§n2Ÿ½OÛŒ©`|ýyêýgiƒãìî1óÓSb©/Ldú!‰'‚èW?‡‡ø~ÛMó ãG4õ7vØæùïMÃY{Ʋ»Ev ĉ"¥¢÷¦!MžZP jíV翪%v–Dí é$“N”î^¦'à&Bß*³Ÿ$h3¾’Ï4ÏVìþ®Á à#7QRR˜ Æ9´qEšª¨a'V8)ÿv1à ®L ³)h«bê°˜\ä$º"›´?5¤;BõŒâ¯@ê‹ÛÃP|ìD$+Œ3jd%FK¶ 6s ¹†%é§hÐòônç±aãOH—Çxn¹À^Ùhtð7oŽ«$•?8«’2CT$†ŽÐ÷燡`Æ;lìåu:õª{Ž)•ábФÈ)SDS„Êz«~ЧN?Oü¼Ýôã/½| EúQ‡Äæ×)Kº¡—¢÷Y±æcJˆ/¤u6a•2Ö¬- ¬EL^ËGOÃò?õ"h}Lwý¤$àáX”mÅÒOiCCÂc/yìGû¡!½o³Hó‚§¾êˆ}Íé_ƒ‘Í7ÁŒ2MñÝŸB{;²|·cñŽÇ._`4ÝÅüÆ-ÜÕüÕsÎNŽ?¸‚wûä$èÒÐßè3þšÇ]VÆßîÏ®G[˜¿-ôw ´ wÍ1~Õƒ<éžÒþ43zÑ 7 {‹&‹í2!*ršÈ6!#!UB»ì8¿w—ûïý„“?`>»C×͉aFÈ=Q†€ˆE$›#’Ñ'… 4*\¾ñ cÿ›<ø‹¿¥ö{Œš)ãɈÉå Óƒ]vžÙcr8 Öeœœ5TÎઊª™âÇûXßp½q<ÿ€¼|—d21Ž,Qƒ‰eCcJtkй#‹Ejƒ8‡4‚±EâO†‚WåÃ6†œŠ%Ot°Çù!ô#–…¶L‘=…’FmL`‹e]Y´´¼«Z”3F\}ß ÿ/þ_D ~ßÂNY¢Ñ˜¡3è© •uëçÉÎGY2%K…‹æ^OV‘§\ÜkÞ컙Ƕƒ"œ+¬nãì0!7kï蓺Üíâ¼û(f ~¤òtéãaß¶1_±`D{s‚Ÿ:CqÏ)Ù("3ñåÍæ™Å{'Þ±øùy9Ÿ×žj\av }ôŒ¿Uqé»»³ûÑ.>¦Ÿß§›ˆÝñàF丬`<Ù*©…þ=Ãò£ãÓo(ºo=[ÑXËD÷n„PS]t$¸WÑBº™ˆgBÿQ¤yÖan@ê)étÁüÁ ÷Þþ€ã›?gvó!,Ð9‰91ÌËýŸ…8Ä­e‘r*µ»£ùÝúß0¿ý?z?ãlG=ªï4L÷w˜^šÒì5øÚÄBNˆô˜ä09–Ï™ ++ãÚ0ž^á¼ûiibÑE,¢–Ü[¬·à=F<¦öW•yGåç† I1uá ®Ÿ/£Xç¶f9ŠØŒæ„š¼ž©ØÁؼROd?¥YŠ!LV ;ç8´¦CÒ̪qÍ‚¦2O(ô:m i`™ãJhðÄ£=Ø8¤C5†¶SÈ ¨2)YÊ›¦ãian.Õ½¡¦ÉÚöª8“É×:-ÆaŒ+6}S~–8Öšb8×2 L©d˜åœWÃÞa 1“r‘5V .¥8/ ¡[²nŠs¡Þ­¢§r–‡^ðËÚ%ù´]ô µÝ.ŠÈ„«Uí¬k 䪦¬Ã‰ã„зÔõˆÎ7x_Sy_¶4‡ŽÚûHå«¡»¶Åµ`̧¿¥ž4iݶê6\ës}C” IDATÌ×ݳ§k<:é…xßã®xÜe[ôOѲJ<°_UËи'œEØÒÜpLÞs%C¥ì‡ù‚“˜ä«Lnìq~÷Ó[os~ösT„ªyü.Œ¦K¤äIªäÊQ¿&äebv³§næDÂŒ^öL¾š ËL¼ÝÓŸC^Xü=Å¿!Èn$õÊò~Ëüö‚ãoqtç',ú›¤ê„Ø´äñ •–;bJô3¥?’݃<Ö‚Qà:Ï÷ÿÑïpØ\%¾ÓòÌõY¶RM*FÓ1Íd„¹‚ Å ¦*Ï|X’c‡Tã2l0©/›uFiœãÌ+¢äaè‡ÅÔÛÔˆ¬ñˆ©°®BÔ!زt–V¨Ý:CÚ½Ј¦²D"ƒì (&•N7'Ї&SP¢(f€,mh%²ô£eÉH“ 5« ,%ÛaÙ'!IH%C¾“iïAÿ‰âÆ0z¹Â6¶Ä™ÕŠŽ‹[=rÅùÒÂBÖ'XyRÐÇl^t¢>n]ø!oì"Á6¬Ÿý‹ÞT]]ëœY7® #Å·hl)ÌÞ •*ïq¶ŽÊy] K„kK\!oEòº‹î±%ÄŽ•>R ß‰5án“h"ëaÚöRÇ™ãËÑ£¹à„Þrt Õ?ë6èý) 1dªzI×·øª qw Þ—ßWUOUÕTUMã+\vW|¥<®›Þì= ÝR]Á›~éê+ìÑ?+–d+BåÑÊÂ~¢ÿ ÆwŠ˜DñՕ¨œýûÐÝ´Ôßr\zê]ۣΠ'À\îÕÑØõdŒ½ñüxÂùÇo3»ÿ£ñ;/@?!'\ÌHí˜ ÷„p¢X«œ}Ò2þ†Å^34_iˆmÇùO•þL±»÷øiÂZ!ÅLö†® ,î&Î?¼Ï¬û„“ø#ã÷HÍqy©ÆDZ!43D„è„<jÐFÈf)®\¿Â+/¿ÆÉݦÿSeòkB]á-ÍÕ²±×—Õn;ªÓ ÚãlOÝìRÙ/Šä%’"’!ž Öa*®„½b8‹JF±h?ð¯c™ïâcI¹°fØ3–,JÃÌÉÛA®HƒÏ¹Hb,©Óµ1X‰ˆR2`"bŒE’BB†®C—]ùþ"ÅßÛ!az%Ì3ÚQжªkŽêå’îÆñ«¥©TŽü®èÜæ0¡!ñ ·P~ò©xíçÏ¥@ëTãÓü¸G =­¥Ù¢Ó±uœxL‡·NRañ1F°VqÞPyƒwžÊ°®hZ+·äŠÍQtP¼ÐZºèuÝÓPœÃ€ l¥g—œ×]¼~áÎùË”9¾L=úB‘–•&¼±®ºêÕ 3ŲÅi½â»ï:¼›á¼§ò5•o¨ª1UÕÐÔ ±®iêï=ίŒýö!`¶Û³"åŽþA‡†H¾óããoL‘ÇíìÈ‘sCê”,Ë7[\­L^4Ô7j¸TlºÆU4Ï ²cÑh“Ùý¶bF·'¸Z*#α¥RŒ 1·Ž §* f¥óŽGP÷`®€©¥4ÖV©L™·‰>)C¶xÐëZcélŸdõY6a.°4_°Îm˜›ºå–Øw…á”`¥tÎÕp´v…-Æ+éÃL‹TR6©tU sÜBˆ™ _7ús!Ùéf ø$§ÝvôÓ_Ür§O½ž_†ý¤áºHçò§:–²bD#«ë“³Šw‰¶JÔuO×,èÃ!ìb`T7䔨«5$n˜ö>‚(W>5†þ1—zU8NñA,j¡w<Õe±‚ãÍðòMT/£TâȰ¥3 Ú$g‚<“1&£jFªâj{b¿ ÜkÉÏ gײøIKŽŠ}v—g~oóbdtµD>å¤Ã K+‰úÕÒ¸¤œ0Ò#¾aœú!?S0¦"§DXF÷nsrç-ægKR§k.Þb ÃÏÏ Ö—·¬F¶Èm‚«ÀNAÅÌà`2â׿þ:'qóŠÑo}•³Û æÝêáe”‘,sl3Âë²½OÁQ?¦—¬OÖszzÌéâ5qÙ)Ö¤RdZ IÖ;¬¦ß²ì¼VA¶µXWcìjAEÉaLNåÔm#¥DNгk!gRבû²½ç*ƒß›”:ãoÍž”! ËZóPRV¼+É3y`Ì']ɯMc‡B$u#–¨yñ‰Ã½é ÇÛ]9ôÌ KY$ÅF°9cc_!2H²²­Z\¼ŸÝfˆ§†ÏÙ¹<q©[«q¹¼1†üf)åÑ唵ÖmJR·µ‚³#¬mp¾Â:W~@ƒ¿ù{65¿€òöŸRÁ#†П’·‚ªÅkÍ«y;DvýkÝl~¦ØÜÏQ¤õ3öŒ¢›ðÉ/ß#­¶B]'á¨)­š¬SÅfŒí î”®_Ò÷ýhAˆ{„0%¤DL™&eªªÂx[4ÄsüÂ÷ <íÝ·ýùMhÀ–Îa ¹ÑN&ôÑ“–CÝ*jrÑ)[m¦2ˆó[)Ûå‡%*àAÇ…¤H6ä˜Zb»dùN¢û(Ó/”óŸGæÇsÜŒnŒ¹ô_í2z­ÆLK$–ŠEMe±HÌ%\5n€\Ìý¡KpzNX*)¥ ‘Èm$,÷þâCnÿõº%à…Ü–™›ì=»û°è§£WKšµFÐcÁ샙*Ö)õ®PïÖ({T~—ï>÷ áÇpú¿ßƒ£çÿö¹OèYÀjüx‚m&A’Çú 3#®Á4cR¶Ä¤ˆõhˆÌï.XœŸÓ·G4Põ{`bÁ+TMá`8E*S\@Þa²C²Áš ±U ò€aÛØ¬#© ‚¦ ¥ÎØ‚ÍÑ£)µÂ0lJ!Y*ɹLë2¸P¤*#csÁ›Õš¹ (Ë$•u) ì2H±yPj5Ĩ‹¸ŒqåehQ¨ÊRK^ö<“ëˆËÓ/Y3¡å!ùò¡e·2ióäfûÂgå3—ší‚›‘¬DÍ$ÍÆ“ó€EÌÂ\·}ÙF­kÞz¼õ¸Á‡»±hmØ)¥¡À(i%qä0¸9 ¥nU”WšóºãÞªe¸Ë/×ý9ü_¾ý¸¿W=6)CyhgbÙðŒ¡èú±Ï„~Fì!¬œ3‰Ø$Æ9Si…õ `yÊBÔ–wZ?åleviÝÐ\"ŒÒ­šÅÏQ,;¯;d7ÁnÂþÚµåGd¸tM‘“hÈñA¦=Mô÷2¶Ýfï©bôŠaô›®,ùŒ#¶Î1UiHœ«ˆÝ¼\ÑlÉ1—r"Ì‹õ,,íÍ9y™IïN~x 1à'½T³xçœ`:>úáîßN´F‡à/ƒ{¦ß$௃îBíU±;PM„jªÆ#ì!iăkö|ô?D3ŽÉñuìΔúò‚±Û§ÚqøÉëëa¡Ã[K<‰  Œ3¤H1°œÏ–îÁÝùŒ³ù}¦i‡*^ƒèÐe yrT¢ýF2àGV Î83®6§xµÅûLRŒ)d9ñ‚Sm&³µÊ²[ù3:Xô†.u€)‰ )”wú:&«|]Á šX² sD5­áfêtp= Œã"#-Ñbƒ2PüÒ‚H&Wê1.ÖÛƒŸ–,…%éST?yja¸·ÙtEeý^7£T¼†9åë™×µ•³C†#÷:³ÐZ0e) ŒgcVÂÕ†bÞZx(Ff͉œ{rRbR’u‘.^ç.?¦lIô[1UŸ£ÜýÊ û/I÷^ƒ¢ô"uT6küfp}Ä)(!!´ô1–Áìà?O)2Ncê:ã*ñÅåñØÓ—ê–ÛC.tÏú8[ZVº§cºÝ†ìš—Fø¯xò¥ÖÞ èý{Y°‡ãLag‡v™¾ä3!>ˆ_Ï3³.ÁUŒ_o°/)æ2~]ˆ9‚FRnq)•ûNš…~Ö–{Òd4&R/eã´w{òYËüÝ–îÞê &/•öh‰?ªJýMO\Â|I}E1»Ékg´§J³Ó7†õ…'m.ƒOZ"šýÒa4zü¤¸MBì9Âêž?8àþÿz„þÈb¾ý Íמ!ûybqÇŽ-ê\|y9»Òbè±9Òw=‹w?‚XÜ»‡« ê-ùö§?¤óâ2{?0dí1•CŸ3¨+ù}š+¥£-ÏW^ŸàD!w]¬^ÂqÐÙ‡>'H`ƒÀ”Æ/$¤reÙdè¸d²ºò`¡ÝLU%ÇŒö%^)u Hˆ5XÍåÈbÌ槃Oº’Ö> -]¸ŠbúÂϺS$”y‹¥ÿ4YÓ}êîi9ߟe°³b §uqN'£lù¥u.§À¿µe¦l ÃQŒºj³.ÐkJ^Þé*h6 ]t‘5Ò*ˆ6Cd åé3¿UaرY•÷W[Ñ?=}åS$šáÞ_ Òdù]#¥s§„´Z *ï˜M®©s]Š´}R7­­È²]”·;c •'DPë/ÈDñ¶@ïÍžÎ!-2餄¨š1„E¦ý8ÒÞjQõ¤$T»ÑwToÀîW-f§X¾²š"©ëéf´X–ª•SZ¿¤{; óŒÞ¡A™½9gù“Äüûg©w=Y3Í7+šïDê}¡oÁì)2²¨d퉡ƒjÄüÔ1ÙQºO [”÷ê:ä Ri±‚%ÁTНa´k˜î ÌHZ¼1dR \¿ä˜¸ëÜûø&ãß~‘Ýßû5ÜþÉ Åy!˜*¢¾#¹ŒÑ\Pžª#-×¶¶œÞ¹O{rŸ“ûŸG·Ùñ;Œä%Nþ(0ÿ³sâÇ“oWè®rú'\ùŒ;¸Šî8ˆ ~p@ˆ-Vs‰ÃZáp{¡ý‘ôØZ mÀŒ"î’)ź;vˆÏ¤X\'~bo†f­tÔˆ-˜âx[š5c¥”ˆ=ÄóD:Kh›¨ö,ì ê¸Â•Ù¢¹L`Åù®^–./'¨Ä{–tK&ÌåL–Ò‘£i]·ÕïòÃúÑ¥Ü5§ô1ëÁŸU{Ýþû²nv›í¾•»¢_ñr.SéÕŸ—•£`ËOm¥¤¥l`Ýeè±ϯ ô ¾¿úH«Ôö¼ ¬ÿñÖ±'Tö_f÷üe”D>‹Žþ8³\Y)ºÜ U¯®ñàIiA ¡XS ÄHˆcRÎ4¹ÆV¾œåd£¿mœ9’èö|Äl}q-be1r„ ô·ÆZÜ+–l$”ŽkGß“†ùÏ,ƳSÃè{5þ’’Mus@¬IeuW£Ž¡ýY`övOø¤`+Ý¥„i"þÃéÿ wì]ªcho î9áÊ¿ÜÇïG¤*á³fb0U@l¢–~ —¥Àß:Rø±arí+,άcÙVM†P¡U’—ÍB5‚f ºè‰.“"Äœˆ©È7Ï?ó Ò|ÌüÍžæ«5þ`Œ{ìÄÒäf.¤ª«¨$Œ‰Xud,Yr‘%l¢}pÌé'ro’¯Qëe\<àüƒçÿÏ9ê#æš'îXîþO'Çì~mí t®àHñdqˆx ©8pV& vG©¿£Äcž Ë÷…³?='Ÿ-p»­ñ^dô¡ºáY~pÓÈä×üeƒV[)vì‹m´ícIB1ž4‹HŸ°.á­ÒÎàþÿÑÓÿ옽ßjð0ÅWÅ Bî‡íÀ\p©Ær&$ú›†|'ãîŠEAFÅ`;R¼(6‡uzû… ¢Ç¨î‹n¤­ã‘žR(J¹<Ée.¥DÊqØT‹¤Ü £An<#Û…Ó<4Ê|”K¼Iºg]%±Y+ŸsÒµÏù©–•Ϥyzð¯Zù´˜­'A–Dó6[-Òè*2l»P3°PNÖià%hJÔ¹ÁWâ}­÷õå‘Ë+Í8¶/Z²BUäÖ²ø(!;ãçRqhPd¶ØQ–TƑ껥‹ÚÓT؃v© ”„‰šO_HwÖ iéßÎtï&ªç*šW+­Œ™dš—-æ@h¾íÈš0“òî~ö"3ÄõƒZHj“0õ.ÄS2UÅØ†˜bvÉí1b2ÕtÂî×9ûä}–§'¥k‰…<—æ‚$°ãB$ô#¨;‘’ú•2?è—°œAm=ÏÜx|÷ñµKh/„ÛK=æµ1¶6ÅO¬ %LÀZ!‰ƒ,Hßâ|âèƒ9·~úsÒõûŒ_iðãCê³CB+œýøœîƒSÜÕwPÓ½èߊ„9ýÓv¿µOsµ&z®äŒHRK¶¤Q1…Ô·“pÐd©_1Œ~°‹Î*D‡¹Çƒ„œj |=w´Ÿæÿ:¡,ñÞ‘%1}Å£ÆÑeâ¦6h¶eu{!HJìþæ˜æëcF/ n| w˜‘z4:ƒv™Ø'K>rëQš+Bj-ñ¤Ü'$ƒßÕòÂ~-a j1K¥™/¼`³_­[žf}œÄñE¿«tgÙzhSn4op¢Ûzð&ÇØ“†Í¾ËbDŽºNSIyÕ çõ q£™-"Þ Y:|ä¢s§œ/È)é:ea{›ñÚyÂ\ïóÚìäWÜ=Qùã±?sÙJkYŸ‚¤œˆÖEZ‰q6èÑep»’¼J¦LV_ܱ:ªõàê)}ì ¶ #±5Ù4Hš£1T{ Å=BÈ8,F÷NÈ­;˜ýÚ¡zö~ ü>~ËQ§ä…óŒ¾tKè{Xž+‡W<#[3;>BÎ3v·¦ýÛ9Íp5ÎÊ` ›Ÿ MFÌ’Ü+ñ4sÿ­¸ûÁMÆo´¼zˆÔ3t™Å'sf~U„¶ÆîÔ˜©#Þ„§œýiÇù~Ÿé×÷ÑTÖ²í€i0¶l–\[¢0X«¨5ÅBHÆ3\öä,Ôªð²BÀ8¦ÿÀ—] ±Íh—ˆg7¨·´G“3õW,þÀ=¨®)v Õ×-9N c¾*s­œíGJûN :Œ¸=pc©™*ö S=gÑ>¡1—{âŽÃî(rÄ%Œv¸n9®‚OeËëè /þ·-°?®PëV!’ÌÑb¼Àˆqópº¤ƒvÙ‘rCÊ–œ ª†œW <¬µæ5jU ·ƒ«ãaÖ_°0³Pøeö¼ò÷¦8VïôFÊy4˜¡ÐÁ åš§áL©%¥{¤Üâ¬U©Ãx_†Âl­~ëSÎ3¢(BUŽÆÓ7r8oQkÖL«y8®ú2Q⛌¬ˆŽi(ß¡&÷#; +=vR áCJ4®h’¶Œ°Ž˜ú²ÄâÊZo¬c1/AKÒ‡hÂÚ†,&.ÉRo2Á¨G;EO<]²|ëœåß9îÿ/Pßû ¸ ìüc¨®C³+ì{»/`º–Õéc&,„þ¾çJㄽÚ?äø{€É5RªoxÌsY#³çôw;ÄÙ¢85ÕlO?ëXÞž±¼{—Ñ·3»¯ïá\ÂùˆY¬åäߟпuB}}‡êEOýÚˆ¼¬éþ¦ÇN€L8îÈçst^¡ÞÍz«7§á…™ÙkÙD*šHFÍ¡5ˆmZ,›Cµç”ðp²ÃæG–*2ˠѬg]P¶\K± ÿ|•©ê^0d¤Ë7Je™®²XWfb¹öä6÷ÈaÂOŠ"ó%ÍìÛôfd »àbR¶}ПáüÄ?xQ3¼èäÐr›¯\Y×®RœÃð°êXšÜêÁ/ŸË¸ØBƒ³ŽàʱÈÝMÙþ˃Unã Yèí]}ð¸ÅÊ¿ç=ô?AÖ§êÔcÁ6)Çë]Ñ\:éÕµ/ŽDÊÇÀx(Òd”UGKÔjùh}øÕ-;Í`Z0Bªj–‡H3ÆÞJL/]ÆÖ|I÷(œ– PÂÖ€Æ"Þ÷ÊsÚ£šŠÖ: ;”và—ɽ˜0N ÿb€ìX)ü1åšßóÀ<6É–kÑGT ©/Gúœ ¹ ÈB8û? ‹{çt§çw:äê;¿²:‚ñ eý××¥@ï\®{BgÞƒË-ýL8}WIQ©<4 ìO.ÓŸï³|瘜”îÞ1þ“#ÂÉ%bîþøcÒi.^;¸|$JËüÞ1ýì.Õ¯õLŸ†q½‹•€,{âiOûÎ'ÿñ}h“Ã=ª—FW'¤¶F?²¼¹äü/OY¼{N\&â1íaO ÙΚÇ1H¢KH÷w%£#°6£fŤ)ÞæŒ))W>K)ÚÆú²¶­º¾oDÀ¨$¬/ÅE’ÒÊíQn*£¦¬÷§< y;d,Ô×J†¡Ô©¼Ä­\ ¹=µ°LèL¡J%‰g~N5?Br;Ü%z1”û ý¢{š~ºÎ±c;Ùz#lú¨nÉP4óF†HkwEZo÷…¸‰]Z-¬}¶VpBßÑÛÖV˜Ô8„<øY;BJaC½z1\ćþBä£Ï±Î÷å29¾\ïóEùeN³±1­¼É+i0ö+ aè¦ój~¶&®…k V)9ov{cUšèz¨vr0Fž»ŒKfϱNDé°C7,Zº*•RŒ\cP ÃËeèÜÅ _±"Ql8Ñ—GK„a¡¸‹JMÒÙO¶ä¾CS)$ 3¹¯Ñ…'-軞|¢°Ô’ø½Tºc–ÌÞÿ”ßOxéÞŸ1¹ }Ðu³1Ðx‹ìrèq϶HÞåîpú~hFP9˜8˜ä穟}‘ßÍÜùߣ»7Ǿ´dl·Þ~Àü½»%–ª‚T·¤xN^žãíü.õË÷_žbÓˆBùâós«çäo²<þˆºÞÇ]sÔׯT—'„™‡~ÉüÿšñÔNTã@lämãpµ\‹×9K‚ÊwW21e`K“ÊÏK‹YÔ!2äÔ‰îñ¼¾×Eì`{I¥±C†FϬo=±e`c=Ŧ ¥Dì"7§‚ÖÍ–<ä…"Ù¦ì~&DŽў*´˜t>4 + ‚<¦sŸöÀ—(½p(H'­½±º~×jµ8  yð¯ õz©$¬‡w+¢Üj…u埖~µZœ1fŽWl8¢dW,9Y‡ÜÁ\TÖö:]iØÛéܲð ·Ð¿Ò"½µç÷¥;7…èYÿÖ!„w •©ZÏÆ¢ª¨ž_0ïËpxõF Vv`x<úm—O´™Ye*…bÆæ&n€v†ÑŠÜC’L~›òð\³è8!#_®íàbï² E !;Ü;›4Žd<¹#ÇLê{rŸ‰ËžvV¸á4Ðßîð#C{+±x3;Åkb׺–ý²O5á_ªñŒÞÂh‰6òIÀº2 Ô$Ä3%Ÿ6³¯ jjº®åäÃÛÌogªQQŠ* F}Eüd—ü†£wc–ê¸ñß•½ö*]|üGïÐßš“­š@gЇ÷Ðéì,‘=âÍIz‹àÇx©!_by³ãôÍ÷‰Ú2™îÑ<7¦:˜`fRÜUÏèùú“%~pcÁÈá ò‡£=õ 75ˆ®ÿÞfPŠp)ªy(¾"™„E['euZ'q}aHû‘Œ•’Ž’SÉ8ÌI‰}ÂÄDkì  +¦J`)9‹=EÑ!+ù?x IDAT1+¹d!k†S¥Þ$àüªË Ž3VÁÚˆsêÙmÐnHoÑ©Sš½M—ц‚ÓÏs¤V¶:ç²’º¢žmOÙK6«z Å¥õÚõjè·– ÖÚäÃË#B º^-F"ÂIñ£êÞWXkYÑìRŠƒï9ÅzKwºç¼}”Ð_.Bôïëú˜ÓÎ“Š´|7ËÚ–gô±_;ça˜ØoX,Âù€Š,¢fˆÕòR C½ ž¾ պʂ_¶än‰5¥«›Ä²eÉ­Ùß³vm Ç~†¶ñ·jªgM)ìRHhškcrŠeB xW4;+'ÓäÐP"]VŒ¸’¤}3röÃá4Òß5,ßYП÷…é7÷iï,érËεÂ]©Ñ?5¨ÕªÔ ©¦ëz4§YÐÂÌ&T/‚½³{™îü~)*K¨jÁJñ€× æì€Ñ3ût§‘ó¿9ãÙÿáÛüÁ×é€þø-ºÛŸûžÐgº“9óó þ6æ+-öU¥nJqK1—«tBè 2k8ù“wÈœbÄ3~iŸÑ³»¸ÑíM}Ѻ¯ Ó7v9øƒŠúÐ`jÈΑÏ3ñ–?JTïöL¾^á¯+25_Nç)%è­Ø[¬/›ˆäò½h€þ–£ýÛ€ø æ2ÍË{É’LqèR (!G–ï%ô´-÷—±˜.1ú*Ø}K^:úû™t‰óL^Dl2TÏ‚¿ê°;×”á¶1[Ø·Eï9TL+˜©gÇH:ÝcËÓ»¶µýy´Vº¡’X†|y=+ƒºõvŒÈÚp^ä‡PPVÓûœÈY.®]¯4ÊÂO'£ÄðÐèIYφ|;$/¨ yøÅ[×–½Õÿóp¬Þ,Ð|Q-ø!õùKÜýªaIOÓ—åhû?ÍÝ“‡ vJB‡Ârè†ÌƺÂm°›Qk âì00ÔMêûªËȆƒyàìl^¬ 9†îC8ÆÿÐ#.Dq^qßÌ ýmC¼£t?â\è‰1±ü £y>1ýfF¼ÂX±M&Ï-³q9GBßËNM¾SŽÎ¡ëY¾Órô`.Yvû2Ó?؇&`ÆŠîxÂéU¼EÚý˜|p ™îã'c´ã~8~# š[¬âÂÒÝ´wi`ç{‚™–{"œ€6ErÎ)n«8ׯ¡<ÃîKWeÏõß¿Êø»¯¡Î2ûÙ'œþåßbêR"ö‘åÑ]–nÂÕÿ’¨¨*eµ<ÍZ¬Â´cñãȃ?¿Y†nÌ¥¼Lsåg+"5=ù¬#¾}Âô…Dsm±†Ô:Ì8cA^HÈŽŽ„Ó7#͇‰æ{~¿Ä©eµÄY$þÜÕžê+¿S0¶*ŠCýÕ„½äÉg–x‹zÎÿ.²óRKý1ô†ö=06"ûÂéŸg–?š±÷FÍèõ}dbÉ Þî°¼ß3ÿI„e±t7£+™Ñw*Üe[^.Æ€ËeÈ esqH-7F1M¢~pŽ_Þ*Ö‡ˆžÛÍÐûo«gü‰´^ØhÙò&²µ²óàk]u¯C¡fK÷|Ÿª%×.ÄÁ^—¸µ42$˜¬æ7š‹Œ©q K: 5ÏH)âühàB+ª‘”ÚakmËûœ× ½M×üykªüÿ»›Þètò™ƒŸ»›~èí¦ ‰_꘎’sçÏq®.‰-V¶1`šÿýÐkR•ºÏìõ„ä'@Mî*Ä8ŒT„:d¤˜ƒUF½2¾n]ƒ<Ý2“¢"II½e|{D\dú Ý»=îÀÑ¿}Fj“ý‰AÇŽ³Ÿ> ~ ož3yÃa+š¯M¹ñí=ÌsKªle Dª[3ú?ãôÁÛ襾S3Þ»ÌøðyÆW_ÆFàŠÞ-¶B[CwÒröVÏÑ_ÎŽ yY°»/]Aï€L_ƒ·Š+5ÊÂÈBc-NǘÆæÊ%FÍ>æ•+¨­XΖýðMlsWY"l$ŸÞF'sÜu=_6ÜŒd!FèÉT=Ä£=îÿë{ÈXñWŸáÅò\ùÁ¯ãë]òÒ€”ž,s¦ÿe?LˆUÚã æ¾¥~u‹æŠ;sÅ`žúŸZÒh™ü ) 8Fˆ‹Yfñ‡ ÿkËø›35XÆ :†ê9EÔ ÑR½ 󟘂uì+“+¥)DáÚç§—ñuÂPÆV×3~]i^‚Cœ'.ÇÄ{Jº“ÀC®M±àMLYè)J:" Cƨ êóOt~aX¹šÙégxÆ[ ×1èÙâØö§”!B¿ãä¡;ÞúMaiPV±cê‰qI˲°´,¬ÒTVb¹n– Öî¼处¸Äû7Äíè'’Vœç‡–_V2Çç-Ðúô>ú)ƒÖÿïJ_j‘^5†fc˜ÛÄ}ïèüù¯åq¾§r“ £·„ô HJÔ§§¸ „ý+ô;»ß0~¥"å†ùßõ4_k¨_OPç‚¿4µŽª ÃL¥ð¢ã•NÈ¡cú½ ²#WH-dã1ŒH±çpy…L$þ«K˜+‚×EÝË=ÆP?¡Ôݧ?»Ãìä˜v~›¾+ÍCh{–gŸ0»÷ þæi.Ý`zø5ªñ%º÷–Ìïvt§GÔÏwì¿4œJ0üÈ ðUqj8S>*FÖ°ã&hÚ¡›dêé.~¼‡ˆ!ô‘³> ?úkêA‰a].7 ¼°_¬’2€Ÿ¤‰'‡ ;ñŒ¾_á¿1&WZ¬Pzd0;­¤tÚx´äˆP9!k ;?¸7*tbÈ$ŠZÐŒqcBʤÊÏÄ  ?T2¢-’#9F–'w9¿ýw,ÏgĶܛQKK²ˆÅÑâªS¬¾…[¼ƒªV¬?DA:o ¶ÂØ9.Õ{¼²û"öÁûì]ãGc\U¡9º3îýÝŸ‚¾…íPbW”îä6¾‹Ø0¯v\^võ¾Á()(GÿN1ou\þg8üÁ7¹ñÆ7ðnDLeï‡ó_‘ ùWÊ6ýwèC÷·¢³Š• /[1úØcOˆ5!E|ö¸ Á·‘ë/f9£z]H»BN;ˆü%O®Ê}Á®cþ×KÂíLý†â_pgIZº&cKd§I”•L*LbzŒøãÒ—Ì=4wt.ÛbI!OJ´Äe ?›ÓÏ•~a9¦Z˜ýµ–°ó-¡:H¸Ñ{ìýþMF/ß 5‡t÷n“Ï!Ý”²Î}U©Á ³5¶±(^ 6žÝãõƒ¯’ã½ó#¾óR…­*LzÎn}ÂÑÛFe:.½ÖaÇ{´G oŸq6®€9T¼/ú³É`O”ÆL9ù«ùoàú¿z‘éó/°3º³#ÒÙ’Ü)q± ÷-ýÍ»ô?z“ƒï>à™q 9L<øa`çwņpÔc÷µ,Í QCÂŽ3öE˃£ s¦ÿ™¡ÚwHíðW»Psöï2‹73Õèe°5Pel¥Er@q ¸•ãhÞL{„Lë±²¯¹<àóÛpúÇ3.ÿã½*ƨ4ÎeÌ!ß±0ë©w,ùrH…Š,š³{¸ùò’þ¹{³'˲óºï÷íéœs‡œ+kê®êêh €(aIES  Sf8‚¢l?8ìWGøÑ/úüâ¿:Âa>ÈRˆ4iÊ †)C7Ðz¨îš‡œît¦½·ιcfÖÐ(eDFeUeÞ<÷ k{}ë[+®RÄrŒg>.ߘÿŒ9ɧõ‡kÀue2l±Ô|Ýš[·Þe “"«J&Å„*ݤ.Ö‘³)ÒWhj¼Ž$Ï(|(n€¹©‹šú&T{%êLD´k‚ ºžZ{TÚäcúØNFt5†è[kÝèhËÐxI”5Ô aœPv)ï%äƒ ƒWàè­¦êµ[ Õ³ö%0ë•‚X˜”õ»ï¢ä]ª£Èøg µ^›6@%sZC«&ÚFaƒŸÙ¾ÂfÒçß_ýwŠÀØç(ªH*î¿ñ3”cd¨÷Gìž©(a°áÉ&¸@ÙÆâ3æ r!ÿnEø+Ó¿¿K½Ÿ¡ö-Ù¥ŠÛÊÃ}êýŠPލ]äðOŒ¨¿eë?Iè¾ïß}“2Ž0W-ªçˆ÷#ùkCÖ¾âP¶CõJ {NPg›ážî³ ÿ;›Œ¾;BðÈË`žh@5}Âcþ°±­c€÷Å;z³ ûrŠê”ÕÉÎGä?ËýH3ø«H,GdWæ¼F'm#‚¡÷’0ò]ò÷õ}Й »‘ä"HGa,ø³žp¨ ‡­A?µ1IÄq‡ïµ¼óTó,+E|ÄfWÄ,Ê£Ì;g ©¸¢nŠSdœiXÛ* èó­ž¹(c›½(¿‹-¶Ló‚OCôÓFÞ‚ ;‹ÅѼ{ÛÑàz¡Z^Ì%5Sý<•;„ÇÓjS(}…¿íIž³ØDˆ4ÃŒØûæó=ìŽeüþ„ Ãù_ ã8ÞÆ­©}sßÖcðW#¤Bv¡=î¢ñxV&bL£ÐPÝ&âI)AIœ³Q‚ÕšÄôXã Ooeg½Káîð£ e€÷ïÝ$–w×ÅïÑݽN<„ ³Ý¥»óE”ϨÿêÇ$Õ5:Ö’Mª·"ݳž[·j{9ä†ôBŸµÏ?ÇæsŸ#éíàrŠïÿŒô©{ص’î s¥‹»òiôfEEÂ88z—¾Èà­Ë$}yEÑý•>a×qøã€ÝVØË)G߮ؼæIG!ª"ý´!·–ÑO+º è]A;‹·´Tdzñëwn ·bï;ž´3¦ÿk vWc2…êÔeMòŸgä×R(<þndô½W½! ­ ºçQ;‚Z‡úµÖ¦*Ôz[Ãþœt|@zð>ª:šMÃJ+ "mÿ„Ùÿ=ôÙ˜JHW næòÒVóLc>äCœ™Õ¾¦òM”Ñ´ºib¬Êø™/3þ¹sœE'-åÆ>L¼½²õžVÛÓ‘×(+lú8èâT> ÀûˆAúc ý8éŽÕxº‰2/Blü¦S§s·Â0»¯–Žg¡¡¼"¸nþô+6ªÑ7Ø»ºMmcÎg:ü ÆW¡®ðd»=Ècñ…0ø›ÀÑÿ|ÄÙ?HIŸOQ´ÔºÆt#4a Ƀ;`7#zKþî{ÔnÀl \ôp°;±qA¬Ú¤_Žd‡W‘jÀO++õò£à´!ÓA•¸R=/UOmLÕt„º®}ëQÎ|}gò:xÞù+…Õ*”åŠzi›{Š'êƒ*»™¯†œVñƒV§œ‘‹þ»ìÍñI€ôÉ/O|_a–U[ÛÚ0;S¡¼:åCÃ×nè fí.GÁã÷7(ŽÖ¸÷ÇcP)ªç±=ˆŸžà^¶LþÖR\­ðuŽ=¯)K”d/Wèsû¼P×iÓ ®<ý/6±_ï¡ëI}#µM]çT>°¶³Í0ù,·çÿ‡ól_þwªœ`¯’ïiD•ס.Élòl‡òÍŠü¨Ä¤ þÆw 9[¢/u°—jöÿuÀ팈Ÿ3Hšõãó%…ÊLÓëêF²—ãW-ÄI†Š}E0[¿·XÐ=M|ªB™ÓiË¡¥¾p6`Ö þ0¢b‰JolפGwHï#õh>)Øš!-6ý–L{fÛp¢ ÿ§þÌ¿XUqÈ,(t®w®ë6 £*Ñ}YR”cÊrHY ©Ê’¢‚ªêVÅ1K|ˆÙåʯPçÉ2ÛÈãCð«ç¨N¦ø @þm´ð˜‰ê¿úÃõêJkÒ®dnŒe`­¸Î&$Îá¬Å‹Ö¦õË™€œx>V3sbÈ0’Sùšª4€ÐÿŠ¡ûH?§ÐgJ¢ Ø…»ä°çRÜSŠì3¼P£ÓØL16A”Áþ¦ÂžU$ÝÓQk@9$D¨ ÊûþH¨o8|éÙù aã©-ºýu\°L~–0ün`㋞Î.$I3]n¦:¥°Ê`•Áh‹ÕŽD÷8“îr¥{† ›¢DfÕÚÃ#þŸ›ï0åÌ Ik{‡lܽ‡FãξԜ¿pˆTv ºã·#A•B²&•Æ”^÷Ù|áWè]ø éæy\w“vÐNcú}ÂÚyÆéÏ(²µÎS¡×»ÐéP½¦›Ô–K)f}›*¿N4ŽPFª»9éYÙL‰ÚR¾_5þ'½„É›)¦ ö¬A:}Õä§9îIÁ­gè¾aü˜fÊ2VByl?b6TP¸‹ £×£¿É w+´¶HÚ>sF“_SJÜŽÂ8Õ”GTâQL¢0k Ä“Ý!9|ñÃe ‹‹ÑË­¼Lâã?®—9è)@a>#¢ª®)«’²,©ª¢Õª6'eå)+¡,›Ñl¿0¹' á.‹Åqƒ«ñ#«ì–©Õâ6®`<±ú|Tpþ;£´ø%©G>ZÊ#εOCòÙpQK-ü²¸À‡Vÿ™oGkQ žN]cê1%òÌ¢<¡Nð£ˆÒ5º6(×O0ý’ ^ꆫŸ×øý’—caòj…’HöbŠhƒF0ºÇd4!ß÷L~ZR_…ô%ÇÅߨaçW•Éþ‚‹ªz@ÏÞeüÂM’s×3ßôy„€x‹ò£-Ú(œŠl'k\î¥cÒ–¼f¶ó}ãþ-öBä(Œñ٬ˮšººe Ûx’Beu ÂㄽŸBö”«H‚òÀ†#T çíËØµç0éÊ­é€X‘aQpõ»¯r÷¯¿ÏÙ?Lq®‡M(‹É*Ö_R˜kk¯Ž)ÏI>·MuöST7ß#HEØqþÀ`ϯ£¤«ý¬Bv êTU@§O½Ñ[†ä™š{ îß H¿ÞÁmjÔ?´Ô·=¢=z½yšUÜšòN@:ݯu˜üpügCTU`nY’ˆ~2ÒyZ7g:jÕ$Õ$†ñ»)H]bÇ$G·0ÃH(–ú"M;­åØq¹€~xcËœ¶ÉlM¦æú„®ª ʲ (ÇŨýº™Ú«êœ«J¨ëÖ'¬HçŽÑòÕVüÐUÝ|à&θzáaQ] Õõ!‰ßÿ)Žò8þºH¸Å…ñ™&ž6ý9®†Í.D³Ç•s´øÀDÀ Nà R[2Ö9£÷úä÷ÄjªAñŠô|EqP#®0[†¢ŠT‡žz©ª‚䉔õ¯ZÒ³›­Qe©GÆïä|ç€8ñìü7gI.‚÷ s/C½×G-ݯt°ç,g^ܧ¼[RÅMÊÁa2€0iÞE¥ °I¤kàlb9“­ãTrìZ>ðúþmr`b"¯#¼¼•³™\& úسGÀQÓe”„ühB}îÿ Ò¹ åûðÄ7wF›gYï=Ùx•žAÌQRa†op8z…pIPo8âÀÆUÛu˜~ÓëÓùÃ’£W6s‚Èì¥MâFE½·>W2~ãüõ#ìYÝÉ>ݧ¸Sb2M\‡`"ãïWd_Vè$¾¬ØûvIº; û÷5v'£ 0y#Òy>|† +̦0®¡¾‘“½˜‘ýºfr¾‡ªsô9ðu­Ä„Ê"ÁEtâ›Ü¥°ý€Ö7¸‰;¼*À|EbaüZEw;’lkä²&9ùù÷´¥ó’!Þέø•„0©é|F¡ŒFÕ†p?¢v+ôeÃfàHŸÑÔwÀ¬Õ¨L#k¶é3Ä’î­k¸£÷P¾li²ÕÐbY®&#+EFxð¦÷sµÃ±pš’íCM]—±M e)”%ÔåBBÆ’ÒB>‚ɽÇ߯"ên©b•E xÈ1}ÌüohAúQ+i–FHã±æã<Ú¥—ž&gN¥—‹Ÿ³„–“§‹ÉW'®„òX'h©è†šŽL(Õ€¼È(èÒ.r¸A¸˜¼w—jßãµ¥ÑkŠ ª;fíëwÖ¢m†TŠPÐEŠ%ÔoåToçd_JÈ.XŒ$Œ¿îÓªßf®ˆF°y‰yÆb;38ÄÞÃÜDUyû¶Ô‰û­H3U÷ÎÞy*‰”± 'ÿù®ôÇÄjŸâ–C÷7¡ûY||î¥ÉsðýùÕÿÞ’É„èï2ì¯õ©¯PëæY·OêïÊ '61¦@¬Â‡ˆ„’óÿeŸÑŸdL¾½û§ )TðD]"2"½‘¶ÅþMPßþFÎù‹Œãx{‹˜ õx†ŠP¥0TpW0[–hjÆW ’OôŽnÌ‘†5ÒõWz³Æí*ª2Rß­IÎYª=Ðe@ÖAjGøE½Ádn…{Ê€ö¨XCO0Ã!ÛoaóÛí¤è)û³ÙÝ¢ÌxÆ} }&åD-ˆ|"ŠûKÇåjAZËLZO Ö6Ÿ‰38×%±)Î9¬3XkfFþKË×LTÿ¸'ùØ„ËRÞÄš4ä¤qBR`<c¶Jܳ ÷d‚TÏvé¾½´†Ûm Õ0ùVNš®S¾-èÜ¡²Šäň» pVÃÄa¢FŸ¥ E5FOµG¹ˆµcz·ß¤sçÜà>Êû&Qä‚Dä?û5nDO`R ùD(ªÈùTXO…X‚·ˆÛ&Ú'‰Ivw~j±n?~/·‘´¦–§)²P5»»4¥|¯Cñ£{l|q“ÎöÚ6Ûqe…l£‡^_còCéU¸‹]´´3hÕÇZÄ^ØfðÍ1ÕÉsŽt{…¯o"ID† ª =Ò‰¨Q=ÑmjÍR…p½$¹Ñ:A€ªš4ïw=î\“moOP›sží629ºPÖ£“ mKt9ÂÖÒý[t)îÏýŽ[ZLN•$µÿ7MÀ•SxÛc „S®ç4Õ;rr iŒ Îu1bÝ$M#ª<+2û™+ÇZ>9ÑøýƒÔâKâ"VÈò´ã‰ÄOÛ%t#Qeà'„ÊJ…Í,éoe˜u¡cÖñ£@DÆMÀé>ÄIÞdÖ|…Ô‘äð{ïz°‡j]óš·¬ª2ÕJ»–K«Ü ¹WÔ¼jÖÄ:FF¼±ÏlC1òÄúân Ê&ÈgÙØµtþɘ½{Cê|óî zA™-ìA‡IØÆç‡dgSÎüšæÞŸ$0²H-$iJØ€\3¼œ2üÎmº/]„4Áh¨œ=¬Ö^¨É¿šqôÿVt®CòÒ6¦›1YÛ º}`ßEË.Úö‘Ø%z!„1*K`=PÝHQ™nF³]ćƻñ¹¢¾9Æœ?€pâOØðÄõÝꣂt³ÆMrlq7>ÂNÑuÞìcgò9Õ€óBꂹı¹FñÁQrò€û¶U)˜S·ÀQ-ŒL7º¹Æi1ãoÊ3ËÒV÷ï‡<äßiÛ¨æÜ´ÈÉË,Åë„…PäãΊ'@µ<òyhoO¤Úؕ՞€4SrZPºõ˜Ð‚V¥L^KÛ•9YlМÐFy$€^ٖΰ!šhº8…HÝø}ùG$+ ù}|šRM:ÔY‡ 2ÂÙõƸÝqå“Bh –B@m¤ë%ŒJL>Á ï öP£Ñܺ1®H–$[²@oŶï#¼u÷.‡¡Õpis¿ø*ÒUð™‹ÏñóR¸þ77Å„üðîùmÒmÒ'ÖIŸÙ¥>ÉÑõg©*C/9ƒÖ»Hq‰ñkw9÷%ËögÖȾþiû nsŒÉvP64ㇾB:/yößI9úó;lüÎ.ÉPÖ"ºñ×®“‚µ_O“-ªïâvǰٸÄiw? ¨@ ü8kvQýHŒŠè&Ô®%Ö µ[o”bêq/T„DÇóRŠ”ž8ñx3&âQ’~‰+Kú÷¯cË;s=sl„s. ÙŽÓí¸´°_iTŸŽ‰²,‹²ÂU7¿ë™]Ûª™NnÍ<˜#1øÖ/y óŒÖ89Ën±òý0͇UÑoVÅS›¨'óâ×Jš\˜e¥‡,OFÊòÄñ1Í÷G Øñ±êéO¤Oz¯']7iÇ•¥]ÖªgZ+´±¨i-5M{Yà¥ç[šE.6œÒ ~ØÌÿâ”ÓJUæbÃr3Sbxªrìp@´šh,ÁZbÚC$!šŒE´4®`ÔÄÉ*¯Q“ #RUH(—ž+áA æêi  ‘·îÝeTE e€² Ô5ØžZ³\\Û¢úÜ:E¹ÉèÚuT–S‡½™ÜœÐ}rSò72ØÈXû{×]§³ÑgëÅ'°©§¿“±þ„æê_*&?þLz@²¥‘4#jíg¸s#¸”qð×Ùå ¶'¸­>„ P"Î`ºcú_vŒSüßÖÈKް5Á&žtg“°ÓÅï—ø«jDÕè­€5–ØwÄC…Þ˜ ª&° ^ 0$«R7¦û¦ÄP@W!ÁÆ‘ÉO+º[CÜÓ¦Iæ6B,šBTÍž™eã¶Ùùž½óëšçeÆ“(ÆS›Öǹê)`™Ýj‹7dã>Û?NSTbœ¥’Ì(Öô¤Äéƒ9«@VO~‹}²¤c•Ö˜ÿ9¿*͘më!Òž¼¸`î³ÒŸåû¸ÞMŸ„¹Òƒ©•þ]ûÙ$¶7ÀlŒ` ã0Úµ™„­U[I«öæßOã³°@­q6S—Ô2sµ?vf›Xç€ø $GöÛ†­n“œC›Øâ—†$.øäN ›È¯×ñ$èæúNÊÀ;{#FJ……zyýžß]GkÍn×Rþ/rxó Go^erÿ€z\ã‹ ±&9½‹ ٚŬE:O%˜î:n«‹K5ÆhŸ\ûË;üÑwé~&ÐýüÔv@ é:6¿Ù» ßcÏtˆ&Çd¡Ù‰˜€JêðÛ–á+êuÈÚl#É1§=q[;;Ôïöˆï”$/y’ˆM½ "Z<&D)ñÁ{$5¸5‹í*´ þx§Âž×¨°†u’bÆjÖH[Ô Í$u­RHf±míßg4†Ìá%®Ö ‹¡}ßÜf6Þ-sg¹&%»5­™©8ZŠcž‹8óÜX hÁM"+^ÕšøpU´œÌžâ2c5¯ô”Zx Z÷=™†Ü†9HRÓéÌÇé9‰eõÜŸª²˜´jlb­¡f0ValÖ‚t «”jr'Eæ9— ‹å²,ðz R;uÂ}p0¯9r,>®äÓl¹…{k¶SõíË„9”KͪL3N§ÏÚ*k9À<.$-ç²:«9 ýшýQM¥…J5w‰L€íD¸²½BèÔÖ¢B=‰lw—áO®’oQ‡ÔÕ„XWPå¨: ôz½Âm(’®ÁØvœ¡­°yVc¾ú5®ý;Çè¯Hþã{¤Ï‘}¾‹¹¸IïKõ[‘É¿,)Þòè-A«ˆ¸&b «Ñ:ÐyRp¿·ÆÿcBxkˆê(tª›Æ© DS#Ï )nô˜üÙo$t^LˆÚ7Ó1‚×ÔASß©8ü¿¡ºQ°þûŠÎ™.’h‚¯ñU“è”<ÑCAB!„õ@‹Ÿ°ãŠ ·Kƒ1ó·¸ bš®±íýä8HŸH^Ê ›·Øª8þàé1mά?Clb£Z޲Ê[ǘ¢„ªdžù˜mø¦V¢3µ„,Q†Kwþj…ð¨ ÅÇUt°ÊSrÜMm^Ñ5j¥i¹Ð4¦2ý7¥§Ûó Û”…–O ¨Y˜ïx’¯´_<ïQ˜ÑB«ÔÆ´r6-8; ÎK„$ÉH’.©KI\Šs–Ä:œ5h£Ãþ¥]ÎÉÜßòNiÅ,=žÖ_¦dµÂ^õH—ÅŠC¨“è”Åû"Îy¥à—•¦p\8·'ñ™‹z¥á{|û›é&`Ú#ølOøO?ÿ iÒE!xcÉmŸH]::O¯a’>¶N0=vcŒ›`2E²y†dc ·Öǹ ]fØ®Æm$ÐËp»ÛtŸºŒé\FŽv0÷×Ðv½ º7Æœë0üNEuãˆô¬‚®iÀUbcZ$éG’§;Ôo§(_`·3BÈQ‰i\þ¨Ñ½„âMÍè/H®xÜv‚í¤è$Á8pY)zÏ&p¦Çø[%ÚEÜnB,,ÕÏ„ð†àïט€îiTå‘ÚãÊ!*–+‰=¾ßeuA_ÂŽÉ/Vi«Ðdõ€IPQÍ&§÷†‰­)RÓ(޳ñîÚ7“ƒMú¶'øªu¬“¥”lYº¥ŽOãÍ™i“ûÑšgáC*:VŽ‹……E¦–Žzùs ÈSkž èf Í+šäiw¹œìò±‚´Ì¼GZè#fqròAÕ÷‰‹â)Ô†¢UlL@Û‚´µ¸Ö ɇ1k Fk”Òmq{3I9qÊ(>¸jnÏœTaÏ|q[à\¨¢æeO<ìW+ì4²» ñD|ñÚ„…aóyýþ!ã ÔDBë­€Ž^ØqtÒõv›éäG$u‰'AlkÆláuº\ã‡÷È÷‡¨É5T<±[ØLÄ£Âë¦H3>ÝÎs¬=!„¼ÆOr|ï…~Ö-ê9A©>ù«–Á_ÐùÆÉV­ m↵%î‚&ùªcòêõ­¿©ÂÚ:´ŠØÝ æ÷6þ¹§¸ Ù“ Ò†'‹JPªÄt5^ܳ0ù©åÖÿ~Ÿ'v4f·VPW,Œ"ÕÛs±‚‹5á0ÀDƒ?œO±³bÖR:²à t\¤Z ñžR±æëFÎ'a~­#˜Æóyª{nÌÑçà\RWU3œâ j?åa*÷;Ù¥iÆyÆãOÍ¢L%>H/Y­Ê£âq<±Z>*¢Z×0mcbû5ͤ”nw+êФÅ(Õ€:€ø¦k|\xh~I ýð1›G^áþð¼óTó¬#Z7çØZÁºˆmuÏΦ8ã°Ö6©ÞZ74‡VM3§MÕµÒ'ͼϚ6rj“øxÕ¬–|!Èxõd-S Ì@ò4êmu!{¸â)<Ø}Åø]ê¸~0 Z¸÷¥I·¢¯á… }ŒÒ³cvUAg|„ï­Qe=¢°ÝÕ5„µs˜Íœr\#Ã1Õä*æÈ¡ L‘f¥ -µ£ˆZÁúúïc²û(á>Éù£oÕø«}b¿Bèü á£“M”¡.h¨ö¿5Âïæè§ÆÄµÕYC2»c²ß¨ü• “!ý¯ZìFÀêH€Ò²„,FÔï&²M~-§sÞ 64¦çá)¡¾“R½Uc×=²­‰Gš¦œ'÷'NêHϪ†Q þö3:&1RjKîúLj‡« vB…•êÄú„Y\UÀ‡º5ä¯fÎu ½1¦¨JªªI"Sýóñ^ʳœgÊ8/¦Ü>ö–[椩äN«dda‹:•w݆КƇ×è¶i¥êczA´´j ¢¦úéénÛÓÒ>á—Ò,^hRÇUsòèÔÆ‰»›B©fá›UΜU$®3³µ.ÁZ‡1cj%³•‡¶L—¶q'Ð q%z(® 1²âÔÄñùÒGI‚8Á1ñ‘oˆ†—Ž¢ñy•pí`H=•‚0Òd’o$‘'·×ÛûµY¸Tt'÷™t¶ˆYÁׂ[ÜZ—Ò¨‚Fò~+àó÷ {M´”énƒ6øª&Ô“¦9çþ `²wûüM\: u†ªª¡“bBFêS›~ó>’&ðìÓKP¦@‰GŒBKM¸à0Oô~gD–(´‹x3•@•7ñ鄽ï9?†Ï:èj,‰%5&³˜‹ ñê7ÆøQ‰ÙL hÔÖ5¡TÈ0'h½|O»V+âHÏxé0{.BŒ”¥¢ÈºÔÙ“øIŸp?g;¹Gâê¹iÚ`l_ÞÔÑSû¦jö¾nLøë¢±- ŠrDQ)Ë0ãk>B=ÊÄ@KqD à,«÷¾,@ííð@Z¬žeqœxÐWOUíVÛØ¹'±Ñ£DMMäk|]¡TÝQÄeN»­º||´ëü8Üú#S8üqYýó1(6¦Ó‚ 8·ü¾c#ÎJË?§3jùgÛ ºèéôàLá°HL'ž—n"Vºå§]‹¸ÀöNÿœÄþ¹ð.Ëóß=œ”Ü;Ê©¥U(9H¬CIàBRsf}my1czåGgÎË1qhÈP ¾&D—R\-)^Ý'ûmW5ã7®Q•¤çw‘´^CAm"y^±÷7‡ü6çþ[‡ûÚ%b=@”ÅÄsŒ ¤ç okîÿ/{ìüÁúWûˆ¶`kDƒ±š•ô¾`Qq—0)‰“!Ñ ðaAuy¡Æmô½:Ae žV赈j=ÃQ¢·½e©QÀg áëæD_ádž4Þè¥.ÁtÑŽSŸ–ûqiG´ê.0e‘#…îKI½~‘à®KAlê#z&Ÿó:ÌU꺢ò~˜«Öï¹i 刢¨) («ys04„'߀-ßO¢Lâé4'H™>šÖðJµ £1e fªÙùTU‰­"¶4½l}TZGéî§D¡²ˆg°¿&L~î(nd¨§I+B˜ ¢‘ ìe»Åý?;`ë ýUƒ$©j ±¦é †ñÏ=éÕ#êû3,ó)Åû—Nè|1À=»P·ÈB7>ôJOwËQæN‹ž@.A?¡î~†pÐ'æ’ ý:g+½‹RÕr»ò LY-$¥TU•S–9E5¤( Ê"PL‘ŠHY Þ·Yƒ(h%Ê|+ãƒßÝ 8?¬Š^ªÔdµƒ œ¨Úˆ3‡ ‘ˆj“‘ï‡Øn·çTSÉÙ¬Ýf[TË}6Iá5Jé¶¢Ó’Vô.4siClÝ7ÿÑ~,ïÕªtæm2g£¥Ù¥8p.’8C’ôH\¶T=;g°Vcl«ÚÐz¶Õ—Uç¤{kuân5XXn2ÆãÀé?†¥JûÁUóéc½ñ°F’Îõ2¬J8îAqEÎÚáuŽÖÎS&ë˜ó5q_Ãf¤+Ô™ãP* Y Q#Õ˜˜$4ÊxTÒ#Š¡÷Ôÿû›ýËèôNM²å0i$¥ÐF“|º¦xÂ1ùÞ„Á¿º_ëc_Ä6ö›¢,Úy\/Â3ï+tº×C|¢´mz@2Á>å±_é2¹;"9ªˆ}ª#Ü©0O€N É“à«ÿÖ˜ôï{\·!àÖzÄ×RÔ Uk³&Ëàƒ®Ñ¢|¸ 1RJÍHåTÍ©o¦øp„Î<Ù°f=ÞÆèbœã|2v  ‹Š¢.(gfHãÖó¹¢,ckˆ$”Ul*èº1Gjªr9щ?.ÊOS˜—d…²d-¹BpHˉ„÷B%wФn‘+Ö¦Õß¶Æ<ÖAâgU»ÕnÀÙš¤ä«FÚb (…RÓmM ¶c»AC­#µŸJð¾þ˜`ó±ë¯"£{ JA-œï)8›v!t @'Nã’..é´ <¯ž±kPºè(ÍTÕì÷G9ýÍ,‚ó¢7ÌÊÇš MÁ(Ëv»•}¤tÅ Õ‡qc ÐýANŽTD  #±'°»ÖEµ‹\£„Zô˜‰dãê¤G0)Þ%„ÒÊ1Õ}OÜ.Q¡"FßÔû%ýÏu ŠˆÄH7£óBMùÙ‚ñO Ü®`¾œ"ªB§)RM6M¦^ -Gz€ÛÜ@™“& AÄc…Ú‰$_êºCUzÄlãý„(¯„èoa.g·Sò·jÔK '"ÁiŒ•Æ6`» xÍãJÐ;€¾\SGõþ°YÏe:˜e!m§­%6ž'RrhFè3/†Ÿ"ܬðj²‘g#ìáâð³¦wœ ,-?Kf’Èë’²S•CŠ*§(Cc'ZL5Ï‘jÊ=¯VÏSIɃháUuÓ,ádùVØ6ÿ4yÝ£€³DÉ\ßleÖ¤Jf•sÖ* f¦"h+h DOЊª’vº²"M­üL‡<^U²~b­ÂGéŸR³Ä’,t|§á¦2õØ0s—ºæ\C’¨Fïì¦ÔÆ*÷ìšNü4¾ZX6¥h§”™ÌòM¸bB»ÎËêyÄ3«–k^Y6 û$á©™Ù݃U“ê…v‚s]B‘ÆÈ™N6;Ôùó2ŸHÔµ§{t›*[g’­¡LN=ª[s&AŒÇêÉÎÃ_dø#HÖR( aOaÎ[´É„ÎÖõõ>ã}oŒ>oéörŸ*Ö”?(¯qW,ÊXט´ N,à þt€ùg]Ò§ ’h´Ò ¸!’™û÷jÊ_Dò È~¥ƒìDl§±n]ƒhLe{„# JªNBK¼/‰* w-zÃR=±Êñ›ºU­ Ú@ú”0þN Y/Ð/¥-MµŽE¼9!Ýäô'LõçÀ$ÖÜáuבí~•roƒú`@mkl°8'¬Uwè„{(ê¶õøðÝ®™LöÈ«Šª ”Õ‚ ÿtRÐO;ç5–3g„83³‰ ?3íxž¸ß—Ç—nÉ1—’¸dv&'|6`›&•›N¯ Îé–ÖHq6ÅÚ,Z1­þ:ÓŽëYÃe:æš…'*¼âãíf?Žúùq€y¶3YŠš‰³s>LœªY¦ÞF Ú‚mµÎÎE’D“¸iË;Ï«çœ5ØœEËJB÷I+#Þ‘²É©œóô•å‘ZzSè}ж8À0å(ªÚnï}"µ ò’šØèñ+ð¾Æy¡Ÿ@×&°"™Î’á!ÝýkŒÎ}Ö ò‚ÇwK0–ΖL’@ñ³œê+9Ê d–ñ¿¯°g®“¡2ƒHMï9~†£?Ùcòýˆ>“a‰hkQ¾ÆÚNsüÖ A\ÉDõ9ø—9ý/ôK)ª‘T!º‰63± Ýp½M2Æ“{”~ ‘¨1[£Ü¯ýºÏ–ô®ôð. ´ N0öW2F?ɉ~ŒÝŠØ,BY7ñVñwœí=VÇÈQp—»¨µ]º¾F1èSÆ0Úá:†þÑ5zêZÊÇ2;3£qIQGêjÎ3×¾ñ|žòº-‹³ ™ñqjž4,\0Yª[þl IDATFä„&N<^m?ŠÚlJ§EâÕ†á20OG·#¶Ù¶nZ9 Ι–ÖÈ`¶ ÛlÛõ˜Ö¨'¡®‰Jµkm3a¡k,Xã‚FüQw5Éqú pòx}\â‘g6Š‹ ýYøyi½œgà<ö‰3Ù¢³¸fJ0Iº àìH‡ké$m b4¢ÛI½™Ç낼ä‰ü6 qu'0…¸)à.Oü…‡ˆÛté2ÛŸVÿF™óŽ‹•v|¨3ãòëÖud”Í œi>u-‘Ž£íS&f[íéî߆´Ï¨{žèP» tM"Áím¢¢`#{¶ÃÁ«#ê·ÇØ¥£ bÁ}*E«„Ñw†ý›œÎ4éY7Í1x"¦›^‘¿âý°":d_$;‚$‹(Kš|Ò…Ü­ ã„jrñyCwtjüz‡ý¿ØÇü“ˆ¹èšèJ-$—#²a‰û†Ãïæô¶r:_¨`¬ç4én¯Ð.ÑEŒÜöw¹Þ§»õizç|Ч8œPOj4ºûwYSw°” á²&Û2ãI¤ª…ªn€m·D ÊDD7vS{ÈÅE$LéöÏiôUmVÞLUæ§Ê¼NPc<”s–xr3PVdt-8;·àûà,Îv°6k+8·DmX«³Õøû©«_m¬ÝäL¥u!}ctÖÈ ãìXh9ÎC®^6Õ°°¬ ] 2Ú…zj:s¤›û˜ù ŠuBbÓfÅu–ªfçÎ:›`L“'ºÙY­œW›bš‡ñï³EþØU:É#îxuü¨kªZ±BXýMaáTiŸN×4G8(<y3ú­M$I ªŽ˜Hµ˜”UÇ¼Õ ¾iî ºòtî¾ßøZoœEªÑDbå±JPûè@j×ÑV£ÏY’ßË`ÔÆ×˜ ±‘º’îøç…ü‡š£ÿ3G~Ó¢¾œTÙ¸jMqµÝcëÅUþ#P‚þBJr®‹ŠÓ°/Ò’%(«P.e¢-õd_ˆ¡$yZ‘×ã›žŽŽøP¡{ :‚IöpìŽCßÕèì5 íÎdzìl3—cÆV¥‘GÏ5•ýxƒµÍÏ“í|Éõ>¥áGå,Ê+Òò5s#%­¡Èc}˜IÞŽ.ûùµÓªYØ´nŒÔu tÓq¶Äð^šŠ»n4ÒUÍ,Ý[ÚJ’ÖPi Ò"¨HV)‹S¶âËà¼<0¢„p–VF'³† µŽÄõfUsS1· k[jC7:OÕdžKðÕŒpJK0Ï8C“ä0­ gi¿$‹Ï‡UÑÓÕbºpÎäŲP¶ -‘¹*§=çªUg4>΋UsÌÎLµåçp¶.%Y œ³-­a¥ŒÑ(­[p^ô~s™O|,æôeIVš‚³ÐY$|8,>øûâ‰ñƒ~æ´*û¡ÙJg4ÉMè4Ft3™WGl[Ñ>ø<ÉÌ/G$`&#z·ÞÄ×BéÖ¨k‹ä%þMõžÎË;èÒ`”Áê}!Üoü—u7!JްÈú—7È®ãŒþxBìI_N±Á#Ö·×tŒIôÅ-ÌZŽ$Žá¿Ý#Þ9@ýŽBohL×Ö¨0J“XƒˆAB ùhBˆG`÷¢Ãج) ï ñÝ€s%úeEÜ0èX#»D¤átO ½‹3Þ¹ˆžëþ]Üa}ãs¸µßbøVBÝàßÛL¢I*ÖÍ]R†hBËY÷ÍhªªõiûVµ¾¼v^yj-ÍV¿ÕÿŠè–åðM˜l¨«HYEò²É)¬Ê9‡ÒPqžôÂb#o^=ˆ=¹jž»ç)µ\9;gÚÛœS×Åšç’™çÃìsÊ=ëÆ¤§iâ61´ª5ëA©ymÛ!•vd>®Ds«ïÿDeçhÈ¿ÿK&QQ#Dµ¸ž§L¤Q"=-î8U¤Øº¦»ý)ÚS¹Wpׯãr+,ã±Rþ$à6sÜš!ÛÂÈS¢d—zˆmÃÈïá랬% Ýo[Ú ~„>±´¿ÕÂ^©0=‹PI†þ®e±WjŠÍ)a+£þH©>ÒþÆÙUÉ VÑv›¨–øúà'”å ¼¸‚ég¸ofÄINõÓŠürFÌÛØzˆ¹\c ßÅæa™&JM4°±¯ÛØü-ŠK?`pÇZHPìºÅõ[äJÏïÒÏž`©Xz¹Xß¹¬©œ$giëÙˆrÐ8nf~îæàRõ¼Bí¡Oç‘ÿÿù'©†~þÅc>}\S¨T)‚ ± D°a„AÔ^œFiL\­¬Å{”vLÙË@{)•䲡ÚÌ™||@þ+m\;Òÿ>£ÿgÓÚ#ûF59¸ WSd=äjEñßö¨žüÞˆò§¬ýN÷¶Aú-Ćä)oÍSÚ9EÀ®AÜÈ8úƒ ‡µßº„»ÖE3ƒÓ@‘[Lÿ:“²K5Þc2Þƒzˆ±ë©qZH2iºá%`óH8(Õõaœ#3W”R=÷ë{è6Eû6ÙÚo1ú4#nNàZ/·‘a×tÚ%}ÙÂi5;™ÓéêxÁæ¶k·_˜gB^dÍ]»èd–î\ÃËZṲ̂*: ©DB _Smò¢M>>$ώȳ £L)K°“¤«‚Lý¤8:™7«–$sÓo›åàÌ"Tt…Áþ¼rNÕr§©–ó ³™rÀ9G–¥X¥ÜeX“ÀÙ˜³O(1išÍL+’EG+æ~×Ïžûåyrãì™WÎÖN ¢¦”Vê?Ì£…ÖHZ ­5X›7€\4 (Sþ~~nÓÂç0Û©Æ93&5ÆdªêQ9)kÑcïç87³Œ¹CÛõк|\ÂééÏrŠôK|Œ|ú`Q%ø¨X¬dÓ#h‰˜øWwa¦&&D:Û¸úÇŒ¯¼FÐ pÅ7Ö(?8“­µé½epÙU8,‘í ›Õ˜Û–¬Q›£“Hvl× ÿ¥?îR=6L><¤÷›`®8la0™6–¾M9Sô¬ÿƒ ª‡0zw@¶1&§KTGÌåŒ,ó˜ü&ë¢jñÃCÊÝ!YÞÅl8\î1¨VØ~@sÐ0†XØÓ$s便Ï^ý˜"•Ö0y®ÔÈ0'­Ÿ !´×Jºã»d:LÓˆú|7˜ëumzÈò"¹Š5œ,Ë)27«x¬KÑCÖ˜ ÓÅ›…‡èÉó—»[dùy6d”yÊ,QÕDð>5cÂþa¬Biž-2g-j ã‰R‡š6ÅÅœ"ßkö%¢R qÕ/(7o2¹zSù5‡5ÖlÖ¡sÅ^¾ÌÁîÇGtÿ¾Á4ÅŽ:Åt‹”ìí­›sÍPíÆ?jSþ¤Änv)^ÈuƒÉ ÆútÿÙ€Ísì¦'ëçø—2E$(R)þƒˆuC²¯YòË×v^aPßaòøˆò“ æolúf¤Ä]ÅoíÓùJNA{ê·0¨x<ñ[ìV÷h»Û¸ËßbrÐÇoTÄ–Îí $XdwB¾éí?¡¥Gâ ÎVaôœ‡>Á]¯s;k’9ò¼ h¸Ã̹ÄÅZÓÓœÞXRPUœšg6KoÙ"Ï:äÅ!ã|L9 ”å<2k¤§3ðºÐ¤’EáÅŒÀiꉙsŠO28kq á\Ö$säǶڋ@’Ì[Ü4AºIf3;ª±¡ ÎÆHPf&ÛÊ.zQ/ªûòªh•UR»æ6•s‘ E«Õ(\òT%Ï4ßfž (¶¹lCÍ¿2ëšë‘5U¶™»Ñ5Ñ4‹¾•r¹e§ç&lWŸzŒÞ˜³€_n½|"7@OÓœýùŸÎÓ£ñÔe$z ${”µ|ƒÚt(ïq0QÖ%kôžéÞZ2*ŒŠ­*ºOî‘oÞ‚N—˜w¨¶'h0øGcì«5íïæ”?´˜£€Ù삤v»P‚‹˜Í"~9tÚ–üwzÔ‡Bùû#ô‰½Uã^^'d‘¼k %IúKÄd·ÑuÓ4ðsz}KµÕÆÕuJJwZ6_blñ—L€zhϺpå 6qõÆOš^R³;Qت÷Ù®ïÐÎ_%¿ömüð*¡ë Û\;‚‰Ø]Áå9ÝÝ{´eC`îi÷|…€ëv7°Îà2Û4yrò¦²Æ¦ªÒÒót»?ý»Ñ%štgZ1 ˆÙ†—Lû¼l‘çCZå²SM"Õ¤ñ÷h@:r2´S¦Ój2f1`§“Vš Ð4`›šÎeÍ¿çUÝ|2pþ•YÛ¨SLãý0~1ËM*iŽÍÚtN¬›&NÛY%/²<ì~ÂÍn‰ŸÖ¿²½µÊbH,5WÓd*C,hk´ZÝfšÒε؅s!úÃ̾\s¯¤ô™-vÒlQ1f6eúÔ†æâêfäÄJ÷L»Æã¾<çÞóÔÆìqýpÝ.zÞ‚`1ˆ†“FÓ\ ¦ô8c‘Ö5Fñ=v‡ÊÎàˆ«k—☞áØuáóÅ@~x€ ¨»kŒ×/SÖ}˜a7Z°ŸÓ¹nÉþî:qP¶=v3C}MEÊŸ ­ïBÜ4èn\2dkBÖud¿ÛcòÀ3øñ!æ‡{Øë‘ΫŽö;kÐò©Gb"’5*«(`*è·0­ ªL1´Z-lÈZŽÚ”O¾ ŒˆDÌdŸ^§$×io?Á?[,£Fvê÷Ë_RtnP\ù&¾¾…ïDì0'¿‘a7[èý4+ÒíÐÕ‡8#g”ËrâãÕô €ît:+ä)m÷ð¸õÔTŽFæ " "¢¸X9ÒÔä3KÀŸô°“¼Ck2fR%ÅGUy¼³—¨ójzjxc𡉤»•¹ö¶Kk§`œÍ>wâB£•œ§ÿž}oöó `æàl—yÐæä¥¦…ÌÚ5¿'ñ¯CÜ¢V\ϾÒiMå\[õSbОòÐ…E¡Ù‘¤Ýˆ4´P›¢hÓjµhå-²,Q@VÒna BéKÛV1‰ú±f*Ü‚ò\“§§Ð.*'«ÌE-DVž„g=%³$tÕ†xòBÀÙœò)õ‚’Õ3Œ'8ê£ &ÃḞ #¥¬ë“W9´m‡#>}ø„·nÜÆZóbޏ ê0ÞSîᆊN²Õcâú„½’¨{ý2õQÀÿØ“}Åã^3¸›- -¨?­pëå]àãŠü7 lÏânnÍb;}&Ÿ•ÄA ü¨Ä?6ä73ÌÈ7-¶ë+ˆ±¨`Æ«¨ÔeD'®×Jý$q¦ x=~‚—Gù!ký_£¿)†‡©1F$ª²ï'Ü/?!ËÖ)6ߢæ6Á8ÜzFv«ƒ¿§°7¤èFÚòÇQ”¬³{mv³šƒ²<­IX`Œ4Àµ äÄÉQ^% Wî6iSÉÏù L¸W¾dZWÞ!¿Ju8Û¦ç´nw‰ÛsTÑê =¿O‹ìS&Ÿ/¾éS\‘g §ÅÚiµÜ eMÜ#‹Fé²ÝcºòÊÏ?Þâýãwù÷¿¨xXè-d%tú0ôÂýû÷ö?Ðßø:ãÏßc¿¦šÔÐZôÊ™Wq³Ä£g©&šc’q±ÄúŠbb¨Ýeæ¨jCmsôvAÌÚ„;]F9!»ÑÆÇ íÔä_éâKA÷#ƆTì”ðÐc/;LæÉn{ÜK†ÉƒDü£ †žêhŒ´kt#C÷kÌe Ú¶ ?…øÓaá“O¨û;xvPb‡­½wùjûd/¡À0Œ?Ç[GÑ{Ø›0®®Á>Žäßi¡Gö#­¶¥Žhë¨A4Îv˜ið>®4ß:÷ Jæ²Æí-Ms™[zðâòÍ,ºÀ³N»x -˜™>Ø`š'BÄbâ¬#¸:›Ïð>§ö!øY­ #¹º ¢˜5©LRP˜¦±gí\a2ûwC]X3ç9Gn¦dv3I7—SüYU1•˜™DåY–8öªCžÈóº1›jë$<—<¦–Óܲq6Ix‡±“ œÿõ±±ƒ_x¼Rã½ è!D>þâÿõÿôËŠG5T\_{ènÀþ¥ÊGOÞ¥ã>¡[z6^mÑju¶Óí]DWnYôÜ Ï¢OK:Ј …@‹ãÔƒŒI¯ƒýN—°Q뙣?ßE+OöF9pÐ T#eðûûd—s²w,´”ˆO_YIu øñ?Âá}d(?SÆ·h¿]’]…XußUFcÊG{ä_"·Ž9àJžÑê´PU&0f¼õ²ö |; _ä´ßhA r˜ü¨Zyt/ý2>Dª£…™”83â’S º§¨8œ³ èÍy>Ù·ø&fîo»¤…[ìù¥nêî™\ÍJâæ8Éœ#†Œ:†ÄCǰPAÇÙЇ› ŸÊ¾LC9˜¥fÕüß3……± 07ÇglƒTÓJ_X«œm)6Ip$YºhRã1Ï’D1k‘çž¼Öùˆ»*dÞ,<‡(òyÁÙœjý=ÿ®™ª7f Û‰Þ˜6=gçÓÊŒSn:Á§®1«øå³&Ÿº©7°>+(Ÿñ9¤Õ¿`½üÙå,Æû¹hY/BSÂË“ý ÿäŸý„ÿ÷£ŠGµ0Òä‰cªô™ZEŽë;¶–ôzãà¯üøý’?zå¾ûöWØè¶pƦcæEÄì\4“7Ø¢ËÒ†mZ»9X”F²K°~ o:Dç‰srlß=y§À®w±Î¢ù&qPNÈv“ÉGĬ©&Øj°€šO‹ÎÒÃÐM#G¦KVQó;[šÆYÓ³œúLqš7Øl2-¬5†h-N#>SBˆszcöµhzgcÖ3·ºYEÀÙNµÉS°–©$pj]9Œ˜)5.4ÿ¢YDúÄ9r—7àÜ%ÏK²Êã²Ò1L#Ø/ÚÇ–zùœbÊ?•+Î ŽëòÔlu®éAnªÜX 6t´zöqè ÝE¨VÂJ£$…3<Î@ýùr¦_Ž•6ún÷»—V`QÓTÑú”ó™Æoí*þå¿}?üñˆ½šÎÍi¨Ç0*uU³ñò ½ÿµ ´;­Km>­,ÿÛ¿ºÏ¯þì1ß~û _{í×7/cŒÁû@Y{ŠÜÑ/ 2;Õ½3ÛÉ^”G]éé—h ©µªÁëš(c¼@ Œz%CwÄht@µ½Kxx@Þ+‘\ ¥Pü¡ÆP\OÖÁµô¡bniËlѵkG‚ì*ÒOAÐnB#»Ïn·3.å/ö'%IE»#GVŽ1›ÖFŠ·,¹©É¯\Çe—1ÑBTBåÑ: ¥".ǯ]ÃçWɇûäòWR\ØR˜²¬¼'uE™àŒÈÒ@Æqï™ñÙͧUÿ–%zdþÞÓæ’1iÐŪ­6fC à+ð½K„Pxð¡$RU©}§&H Þ¬¨ƒ'H…׈æŠo •O|e@ˆªDuŠ×´›¿š¾²ö&™m3ò;‡3òCp—°Ù-T.CO‘¤ÈÔR¬Ýƺ«PB©)h¶Ô+2´³N”Z' 5ö­ñY¹ƒhx*=7­´ï'rR¼?õÉЩyѪ'A§®9…·]1R»ÂsAD1ªÄY÷83š¦+§Oi¦UøLòg*럌D’ž| œe™œ9YN‘Y”O齌˜f‚Î6Í´¢è1yåñµ\ã­O§PÏ Îg[^êÊ&ÜRü×’w³4ôF±4Î?ÚAÌ )ÊjTÔ/IÓ½äE}" øä«… œZ?íñ©?7ÏðÔ¥¨¸•çUÁ‡È{ïðÿé]îì¾×i–üüuêìÞ‰÷pÂX˜ ÒÔnP"ìzxâa» lŒ ˜ž’ÂIägwvù½û{üÆ;üÃï}W6®¥±>›a9wuÑ0hqJç#ƒZ¡0¸ÖÌS›f[:_&­”H$R¥%U¬:¡ CªPQGùCª8¤Žó0Š®u¼Ú•õâQ-‡O8*L)nc»/ä@û‘z°€¹Ö&Ë.ãws¨BkAöjL× >ékƒëÂØC š„~:ñ2ðLfZn ’Ç`ód±¢Ç4ªg¸3‰œ¯TœùÄ‹$êDdi+°XEØ™¤kùƒM©‹iQ—2«š–‡Ož¢äš}3®,gU»1ÍH³KÉÔY«Qt pµ`ë䀧1YB.ñq»Õ3ؼ/|Ú¦|â C>ÓÆ mFã33õ––y¸ IDATožö$¯ gH'3å‡Ê²‹Üyù¬[aYUqVvÞÞi\ò4†MŸ]Mr`¯ÒqÏß<.i_—žæOs ž¾6Då³Ç‡ü_ÿì]Þ{Ù®`|ʹ4M“ßïp£oñÆQ¼4¶ÂVw„Ã:-%+„¬äŠ5)bså?ŽÆ¸Æÿøíï³Q¬?SsDW±¤"9¹ÀÎÚÅIåÄ-6³ª#U¹€º¢Yµ‘Ë¥„í*”T¡J;uQœdä6'³¨á¨l ¾À‡ /7hå·pnD©"”‚…ÊQíXÂcHD½E£ƒIĪ@aщA+!fÎ!ÞáiQg›HáB}YOLžžèSÀù¼ª§ç¼/ÌFϫÓZÌ¥Õ[NVå* N®"K[†•&ÜrñõlI¶fæ¦A  Óx{‘·©²1uæ©]Š"’˜R&ô)U³.«.sV‹Ùu"+€eÑPHç;ŒÞÙZÈlcŠ” Yf’yÔ¬zv3 ¼»¢bº`ÌÔ³ßâ<²ž´†^ºmöÒ.…c['ƨï 9…è¾x¯‹ º(gi™å”À"uâCäÎãÿèÿ”ÿnÉvGººF·z9\)”_¹)|÷MG‘µ¹swȽ#ϽCåñ&Vø\gàji,†Ûàr°9<)»“m6ZëÏ Î+¨+ÀyÆÁSTÍïC³°³]ĈéBnš&xò‡·…ÉP§³¶6œ>*L=`à©ãu²îMÜÕ—¡ž ãôþE7#Œsª¨˜¶›c†@¬Ð\Q›¡¾1‹œM,•[Ãè%ìd‰¡9¾¸š©Ó4ç„Û©3îB5s<%øYÉÁSE«·T²¤&XeYI§/~¦ZfæõÎ&ïhßøçY; äTªlš0“lVE—ýŽû"–ʪ¹c³ ¨Î(9– ?«[ŸíeyÕW棴…ûÛcþòçüë?r:×Xju ´¼º©üÖ¯ ÿÕß¾ÁwÞy‡VÖ¡¬+ö%vöy÷£'üÁ϶øÉ$¤I8"íô¦÷Sú€N.|ãRÁõÎÕêÆ¾pž?Ÿ'+ì“{dzŠÁá Š„¥¨ÒÙ›BPå ¬ØÜ¡ò-¤‰ÎÍב¢O½W&Ä6K•| ‡¦\Ô¤TÈ@œEs ²0)Qk05Dc@[TÒÅÚ˸8Aê£D×,~öés¶â¼¹§ßG J>5Ïv3>K×~‡§²¼{\QËy½…OÙœgï=«pÁh3Ybš¾«+ê¼C•§Qöº‚`!Di¢²VÓ©‹Ù€ó/YƒÎ¶é³Fé1ÕÞÌ»áê¼K¦~S·¿<‡VžL‘RšyHÉ›AŸäñìPæ(å´K£‹'g¨2t~2†S–U'Ç~qû|…²¸ôM9cy.þ]tõ†D56MñÔÔÚ>òüÓõSþõŸ¸?^ Î8^!¼} þ‹þë¿ýUÞ|åDS‰à²ýv‹—/÷ùµ7_æ·0äÿþó÷øwŸï²U µ×dWí4Q`k¹òzkŽëŸk$ùù+lÓ,qvÍäi]{Î(/en–¥+~÷Äã/ûŠ Wé]»‰)Ö©Fz0"ŒËæÙ¤•÷ û×b–a£Gªˆ®å Ž=Z$š L–ôÅ2¼éPçØXB¨+büNƒ»ÐÃt6¬­Ü¡>70OûCKw·9¦Ñ^õ~ÏqS=ͬ¦íÕF¯æ¬¹ˆÏ|ÒªbLU ð3]´¢±©’VŸ…bo9Œu^ ˱á½E‰à<À i6QViJPßÜ4SxA‡VÑ¡U¤@†¼™œ,ýUš$Ÿi#§ÓagTgÓÈ®„¹f®¨X¡qŸ7 uù!^èUÈ1úc¥mäÓ¨š…µfö.g¸4 0U¨5RÕºVŽÊŠó‡ðÏûe7®gB ß†o¿ÿÝß-øÝ¿ù-®n\™«oHv1§ðê•>ÿóo}ïß¿Ã>yÀûl•‘IaÝnw…ß¾¾Á·.¿Ýèÿϯ×ç$2çoN¬<ûº(—9 çÍ‚ì£ðd¸ÇÞè•´Ézë¸Þuêa :áGcbU"™`£Ãº6bs¢Í°¶&Ô3˜3• ò‚xH…v)çuJuÈ1­5¬Ôdå.âËÕ÷ÿ1Øqç+6‡¦ê޹õ¢³ç½àKà<»1§P\Þ §€óY¿KξQÎÜ–>…ÜeÄÌ‹¢I˜Y£®+j?¡ª“OoŒ !¥*3¿‘iŠúbÊI“hÒÿŸa•çi&ãÌPJš)Áäïì\‹Ì6Áyæ¢È)št;õkn–«Ã秭ΫŒ8óž:ÇǘæH¦7K×2ú Š%j@â<%™[Li•E2OÎìÏœêk¡:§›E †QY±;<`0âEˆeçÉ/îï±·?âþ£Èßó|v;a5­á \ëÃ÷^þûßYç·¾ÿmÖº½™´t‰˜œŽ—7ª§NîøÞk¯ó­W^çp4b{pÄp<Æ×v!\ßìr¥wk³ UÏççÓ_7ÕK› àȱï-äN¯ .,˜…Aíyxð cÑ¢…P=ª²ÄÇøj ÔXµ¸,qÙb2ÌÞ¹âˆÛ °›|/‡G5â"¬ ±JϹAÛÉ2´B]á[]*Û¸·‘P­éåãrgmø—Ã,õØiy^G¬§¸¹¹uŒËõB´Æ‹¢cšã7ièÀZK–eMˆ®ÇûÞ÷ñ¾qìkäv5Iÿº¸]Ö)•!ó¼?ç¦_‚s:ó¿žðÌúbªùfî,—^“ìW­ÍÇ?× £d³ÐçÅ4šªù¾Líø¦íJŽG¹ ²úsoÃRÈõän*F˜”žý£ãØÂöo!:!”#ð#r©hå†"³änH±°¼KÒ!ÏÇÄeYúw¤u‘I¶•“J–ãIàÎÎöÑçü|{ÄNP6Ú3p<üyÅ`ê»GpX ‡Q©W5+-á·¾ ÿÃï^ç?ûÕoÐnµá„럻”ç˜@PמI”žÇ;[|ðñ]~òî€Ú+¿ö½-®nQä]Ž‚e§t|¼3擇<ØÚæÚ%Ç×_ëò××øÊ­\¹Ô§×Îh9ÁiÒeŽË e>§zë@”‡;þàGïó/þx›û£c…`Û‚<ÀÑØz#5O7ÑZkÁo¼£üOÿÍKüÚ;_Ã:Ø¥í±L%\K¦H‹×Ó,Mùª§ ¿

›Þx±¿Wm”:F>`¤%5–ªÎéX¡št©Fc|a¨Rä[æ1x|5 V—0Õ÷•.þ〸€}­»,Œ·+üÖr) ÝŒ0‰Ä½1ñ`ˆ½á‘5!ª(h«O;LðØƒ âéUã””‹³àîù „g‹ ?mñX^ Îñžò—žã®b+ÇÁežB®I²it:×&¤SçR.Å  f|ñ„”&“ÆÚeféº8é—9!ÏEѧÈ;MÊÉ‚gÆÔ6uê7ÒlÏmÓh³àøg+vf*%Ó\ÀYâÉ|úrù!Õ%zãÜý›À<ïñ®XìˆQ >âCć@å+ª: ‰3¶gkrêÚ3N8²}´Çþþ˜ƒ’Á b0òlï>QÆ#øöwrÖo¼í¡s…ñþˆñx6§r#¾8P><üå“#®¿{È+—òæ‚W¯w¹v¥Ãå~ŸN»E·ÈhçEîÈœ!k »dšÑI¤ ‘/íòoÿèçüÞ‡|ÍY\°X•©…*Kcï4Ÿ™Èb@ÁÜ[e¾-?îóý¬œòñM‡Ê±qQEÑÜUå¨fko‡{;ì F Ê1ƒÉ˜aUˆ¸ Š–¡Ý¶ä®ÅѾçóÏÆÜ}èy¸»ÃLì"´mª¼ƒ®^^þ•pã¿FÞëPÅ@u´Ëðh›I©<ŒÆPZŇ¥òÑ®çO> ¬·†¬õ„KEÒo®®ôW×[¬÷ýµýV'ůIº†þèúóŠOvaÁåJž -Q¬‚‰ÂÎ#eè=¹à듫ׇ͡[×…¯¼vV»“Ày¢XðNZ0”§öŽdij&žÙ(_Éx!µÔ™àª/¨R?6­‰(Qa"÷îqä‡T’Qù3p›øÑïGD8ScœÃä€dÄè©Ã­÷É.?BzW ŸÉn×ZŒ?¯åÉJ¤k ÷jˆ{ÌuÅ`P¯P)FÚ*P!Ôd¶•î›SÏM%㥻ótOÏ\EÏ:¹Ë†JËÍŠó_(ÕgãÂÏ\ôœŠ5³4™©ÖÍŠ£5Ãp3D#9ˆ2˜Lš\Æf›?«¤g¾"¶ g5¸l:±˜~íÔ7CÌ’¯õÜËÛ̧ðf EÓòÑ1:±ñÝ]uQΧtÒÙœžœŸ—£~®ŸW!jdw8`{øˆIT&’(±î¥Mê¡£ö‡†ÀÁ4Ö¨|•£ê8¤¼¿… }ä+}Ê-ÏàÏv±›Ú¯äY†}ÝbZ’Z†JœÔH¤kÜi&¥Á–â'ód÷ÓúÜ £ÈsÝE^»zÄöéUôyŒÅÍ3\ÕgE%AˆIÙ%‹£5Y± å0¥±Æc ”“4>ÝýÏQÚ˜ÄLõÍfÖØËK‰ÈÖ5¾Ö²ü¼,F¢3w*Ô©GÇÊ…õ˜Ê3zUˆžå­³Åƒ ^ÙÝ?ä/?ü%¿ÿçø£O#\£ÛvJ&B–)&‚ñ×жÐ6Ji„ ìM„PTJÓØòÄ -§X«|ò¹g÷ÿü·Üûk?åûó7Y¿´ÉhRqXy¼]qÿ‘2©A !FÐÐ4†j%D(}2Ù Q‘I¢³b-H¥ä$»8X·ÂF L„ª„q­Œ#)S£T*4WœƒÉ>+õs¸üzŸÑî˜/êtŸ;Áäp„po¢üŃ!ÿùÁ½öˑѪ|»ùîîÔ9âg¢õ þâˆÏˆìD`TGîîÞaT˜8¡¬¹ÜÆuªƒ!‰:ÄÈS¾Eœ(Ñ4÷`&SB¬ðã!­7Öñcaô‹BÜ¥Ø4¸{ÍaLDë@<²„½€´<6´•¡dèD‰¥Çp£Ç˜ê`iìû@¯ªõT^Ȭ\uõ4Þñ\|Ø•ö,¥é<2/y~¾ˆ¼ëŒ®Ä츭Á"´¤Éw4’¸`c°&Ú}Œ`mSI‡ù0­Æi} ¾óò”vbÓ0,ê(SI‹x'yV;ÏvPz>uÍñ×ÊYýÛ†Ò™”Ê£í-~úËøÃ¿ØãO>QD({JV$o#PD°\€N­!Šp4€ƒaΙ3­ÂDZÉ¢Y»î=‰ìþ‡Çhö#¾öÍ·mqp°ÏgwàÉx’W±i,b5&9dPÅI> Óf¦¡yQªr5‚©¡Tå`ÑC {z&Œ ¡®¡*Iv¹øxú1Ø£’˯¯19Øåh_Q£xl²+Žmïyïî]^º|ƒVž3·²]˜\ZL`Ö…¢ë™S) ^<8¿haìô®ŽªìŒŒ¶¨¬2|€\ºøIŸºôÕCL+¢¡@}@r¸d‚$â1-d{¹Æ–x0!»<¢õÕùeƒ[+ãˆeD«´«6—AŠ˜.ð(õ'Šñ%yù¼Ü‚XŸ¹vº“¼”žrÒÎîìŸø/G °úŸ/ ïK^®——¶¡²‘H±`õ™2SØ­±{8;Æ:¥š$؆~ˆch‰q¶ÐjÃ'ÏR³ÍªópÚöõ´­œ¹wQ9Œ/´è’ìàpÈgð¿ü˜?ûÙ„_܇'cà-ø j+˜˜ªØ<$÷=ƒ0)aoÆeC+Ùæk!ä!7ÂZ¡tŠTÙî à‡r‡z2fcÃ28ðTc¥e eÒ©"ÔQ‘Ʀ7ò¾ ^˜ž%??]qv¡¬ÓÿÒ…Ó’ä{¨ –Ju(˜6Œ©Rª0nÎS`w«âÆå1ë7…q ¬CïºåòË—éôúl}Ì¿ùÅ®®}Èwßx›"wKtáÔ´•›gxà _Få|¦¢Uä*ñôúÒÜcä=cµŒ#.Ùõ›„q$Æ#¼µõ ½LRµì:ªwñl!ÔX,&SÄED%M‹à$¹Uf­y¯ƒÉ3Bæñ#2‡¡CÇŠß ¸µˆ½êºÀt|J/ Z¤r¸a™ŒÉêCLŒs¿ù3v7îâÍ@=êôœúæsé)"ŠysðÓ"‡vÑó½R˜MéYV3Ø’² -®±*ä&õïkЈ±+4¤ iœ<\´hœKãTNë(,.Š/Þpi ¢QµLUtªÊxìy¼½Ë/>ÿœ?ÿ1?z?òùz¨‚àUñ(Á‚ˆ%8Ÿ†uÔ¦ÝfWà’ƒ5 ®„«"¼s;5% U€r¢©áZCËAÇ)…6Ö”¯¾jxë«Wxùú ºNöiò+‹<ÇÚœ<“ªb<²{xÄÃÇÛÜ}´Ïƒ­šÇ;Êãxr(Œ*ePÁN¥‰Ž1‰Ú°M¹ã«&êL WÀÛ/+¿ñíŒ_ÿæM^½ñëk—(Š4ý÷õ7ßà¯ϳ³·Çç÷ðhk@4ÊúZ‹»Gü‡Ïá±(.²¼C¯{›Ê²½ÿs~ø0rÿñ>wþ)¿ûƒwxó¥WhånÁC[Ÿnþu®jøË2K:_žúEß7DØ Ù=fìRÒ¹é‚;ìÆ&¾>"ÈÐ16Wl–|3\ha5Çš¬‰‚ëu7)Ö®`Š5¢æÄ±>ñè¸$ëGìUKö’ -“Nq0.=ß ÄÚ"À™L(ê#Œ?£i¯àôcv«˜%išrgÇ…/ô#.ÌöŸ®ÇT$™T<æ½ñe™ö\œ{ÑÓ2ßk,í*Ä4[r¡i$t–Ì5~Òy‹¢.©ë !$²s:98»Q›¯#&DÜlPæì]ÈY~'SY§JŒ33oåÆÝ/*ÞG|˜T5Ã!Ÿ?~Ä»Ýå/~^ñÞ}x<Æ^*Q0‚µJf¡cÓR’E%ó`Ö+x½oµ„›W,—»9½n›v;#wœà£1Gƒ_GòÌ`%©?Öú9·o½Â«¯¼F§Ój ëtÁ›¢™%Ú(}nߺÁ¯|õ«ŒË ûGûlíðhk{ö¸s¯æ‹‡Ê'pX ã Œ½QœѤ…¢­ðê%øÍïäü½¿þ¯¿òjjì.T"B«È¹uã*·n\]hè+ÛG´ò¢aÄš~R=Ø£ŒÆuÁÈgMØÀöNÅûwÞåw¾—ïýn]Ú¤•ÙsͬþWx]èŠ{HžC­±Q¡§ãƒ.IqŸþž¥Š‡G[ÏþF;Jïš {ò‚Zwñ²‡±›Œ58Ÿ§ª¹lî°Y‡¢w…îåÛhv•ɽ4¼âò‰‚»í°× ¶hLUÐS¦ŒX:b­HYÁh‚õ\½‡ ~¹YrƧ 3ÿʨ¬r…“S|ËÅÔ³¼Ïß76eçùLzGn_ûuЉûbÈÚªÏ6:Ô7‰3c‘TÁå¶¹9l20ʲœºn¥`L_£1ùÆZÛL6!£ªs°^̸{Z³ïéô‘ÎèEþyyL{Eã/ÂdRs8ódo‡íÝv<Üñá ï_ì)‡^FeB¢Œi<ªm2ïdÐË…n¦\*„K=¸±¡¼y#çí×oðê­—¸Ôï“-œMéìBâm½Op uú~¬¥Õê·ZXg8>¹¸”HÐTœÓ¨%ç ý^›~¿ÅË7nÞ ŒÊ’­Ý>»w>ÜáŸ>¾{C¨6:J¯-Œö•L…ï½ _¿Ý£ç´QÛÈÉ!Uæ>²À"\ÝXçüúo°Öù ííðç[ÊÎpÀùˆáØ0Þ­™–ðq;¿„·öøþ{?äo}ë2ßyó+\ÛXO¾"ǽgï^W'žœöô,î†/ÔF…(Çk‹Ó‰2ÜNEé~Y±_?á(ÀÑ®b;é>k]ê³’¨Û [H*¤…s-lžc[9YÖ¡h­Ó½ò ®}“Ñ]ÃøûôÞÌM‡{)ÇäcS…ªªD:Šh™£#‡ #¢5ÑÕ˜ºÆ†O§ IDAT1ÖO½7N§Ï¡›:Ö`…g¶¢Ç/ÆÉ"s9 üYm)Oþœ¼(c9þÅTѧêÈ䜕¬$ßecq"XcC$G]çx_B˜5Eh|4ÜB3èd%r~}ÊëõôÃ]x`‚ŒÊÀîÑÛøèÞ>ølÀÝû‘Œ•ý!ìW0¬/ IÉ8¡å )]ý®uá•KÊ«W…—®dܸÒãÆæ%n^¾ÎÕÍ ŠÜ¥îÙ¸x“S'†,3tZys*¦ʽªi–’EÓà¥ÀàôZ±é­¹ý^‡W_¾É·¿6äÓ/¾àýòéc†GÐïÂõBô‚V‘×^²Ü¼ÜgcóV¢¸fYO1ðj¦B7ú=þÞwÿ¯l~Â?ÿãOø½Ÿ>?ŠT0iбèa§T·„;‘?½³Å¯¿ºÃßøæ%¾ûÕ׸yé2ÂÍ  Îj„ŸlÌr&æñó‚ób¸ùêßÂïÑ‹5•Ôd~pø€?âh LžëPt ÕY§ û„0Ngc°b±YÍr\ÞÁÙ™[£Õ¹è&~`‰ã Ý_7ä·„l­ñÔ©(ÇÊ c‹Ž˜¹»¹»ù™YÕ­fdD¸›ÛrÞyçÞ{ÙÀ£A‡½´èYŠdLd1 ›1ßóÈHœá\š/¨¬ÎsEBa3^dòF3‹Ò¶«ÇʧIî›ÇñTu¡,µ ]»àX6šÑ‹*މb|ØF ûOŸ¥…#žæ-;…fiÄ6¢¥ Â¥šÕó"ù|Ñ?øL‰ã”‹Ë!/OŽøöÅs¾xrʧOb*è­li"¹A–wH5PL×c:M»‘aGzÃüì]¡«ÆÍ‹ÓÂã"§;Yk=\x+4]ÑÁ}e';¹Bsó'½Â†`Ý…ÃdЗ¼™óè$-Y—2ö$Îo<•ª}­c=€dJœzº½!‡ç<=xÅ?¼à³ïû|þRùñT8Nòa¯àŽ"?s}Y&Þõbó¯äír;í ¿þØð—Ýâ£wÞg{c#oS]@w™æ«îhª€@VìJàRuëèè|•UgÞ·C D'@3¼÷×w®ñÑÃ?ð¿þÝSþïß{¾½º™2˜¢>9xHbè{å4†§]á7/{Üøê>¼þßlðþ]nïì²ßØ¥¸bêu’_öêVñK%)IE²V¼“ºÔ{†}ž\p><%ÕbbúéhÊÆmœ5xoH¼2ÔF2j¦Æá æéÅ!ý^.ÿˆÛPkI’˜¥ä1rNBÝ$ÐF.sÔ<¦A¯AÛ“ÆŽì²—¾Tlì}E¶,.È@Q >¤§HWØ Qˆ4›õ°É“ J±òëµ#/íƒÖʘ.Ö*/Ùå5·ùï­è²`Ëþvž„ÑC72‡§*Z®ίq …68’[á;Z±}.ƒËâ©À|;í3e0L9¿ìóüä˜^½â?žðù“˜Ï^*‡=ò©º †EÎÞ¸qE‹ª+¶ænò^F!T¡®Ê½¦ðëŸþæÏÞçÑ»ïѨ‡ãÞvU™LŽ‚©Ôe=¤¯¥®+û¼åŸ_%u̱þâÁÙhÖø›?û„ïÞâ_~úÿûoOøÍ·Â—Ê¥JaÌ—·ÿùây˼0H”Dr ïxxÃïŽ{ì~×ãþÖSÞß­ñþµ=îlí³ÓØ¢:“nHqA¥¸èfÔ'“skIJÖó©c ÈãÁâLyÒ=ợéÆ'Ä}H|B°iñuö5V ûÛ¤>£“véd'DÖ’šk<>{ÂññØçŸUˆÀãf¹¿K`!ÀÐĘ:&´ùÄŸÉ-ƒUÙJIÓ ’ï•ôES‡ÚÏ"‚=ƒ‰@|JæS|’ÁP LìÑ¡"Âf€­pcûC´‹M{%/] »–D^ù5Yq¹Õf] œ½xó]ëxW}ÈǰâÐtö«q"ëtøèjš#oI~æ­"ge“õÇÛË -:[É]åúƒÇK~|uÈ×Ï_òÙ“Ÿ¿È‡JzB?•|üUtœ£èÇ–¥9Cö¥NÈ­87T ÿSY±”º/ÞÆ*] ÔóVÖYîìíóßüz—?ÿàÿéÓ¯ùÿxÉo„ã\ze¨BR\Æú4ͧ<ã¾pšÁ³¾òÙñ€í§?r«ù#ïl‡¼³Ýæöæ.»ÍÚQDä¡q…½nd¬SÓ­¨Å";;,8JÅòt¡n–ñÕ鯺O9¿¼$~ɦÒýBï*ñ !q ßò5mÖ8>eÀ mr˜&|ÿò½K% ò{ѹÓà ¸wB—›à;b]9ÄI9â±6ÿ=Ÿ zl^LøÐáö ¦æq²Ì“ =Ú ÚÍ0lC0­1¹ÏަŠÓ„ ëá’ L6k¥+ï'·þ.3uÛYà©ò°Ð+èÅÓ =Nä]Sz¥Ê Ý›5ZéªÌDûQø¡Y¾»ÑÂ_D‹_¢0Èò/²$ÿzè•‹^t…ÏN‡l…Cö¢#v[†›í€›í7Z[l5[´¢õ $4.·/ÜLÆ¥D?fÔ^G‹ù„-äÁº¹ÞüõÅ/:/¸xÖÁo§$qˆ´Ümè=-ÎÀ6¼$&°_ÐrÛœ¥ÏðÆ“™Ç‡\\xR…$²X‰6 %o‰kÖòÍ]`-AÐÀažÖMlóiB2‡?³“ÁG‰²,Oú€ï*ÒÉýž% °‘b·Ú ‘4B: Ö#„Àw Ó lÚ-¹¬;¹ uˆµT/½z±nE×€–d^}}vz…P©”A ÉCük¼A9UVh"³‰‹¢ˆÖaa£N>å—yO’xسË.ÏøþÕ!_tøúEÊWÇÊËŽÐÕÜ (%Où *É„I“Iµe¬/&Ei:áÞüôŽpgËñÞÍ ~úð¶¶ZyÛ\yPä-JUo60õ§‘3Ö}ÍòuœÜ2×XbÄЈB>ºóï^¿É_|Àùòkþî÷~÷ ^ô…ËÂG$µÅ¦P&E¹$“©ÍJb”a–øI aÏž ‰‚![á1;5a·fØkFì6Zl×[´Ã&Í $ "Qk‘ èFÑI£ ÔóåÅ!¯:Ï9þCŠÝÌ ³ŸŸ»Q|â ÊóÞM›_x±*H!I”a z!D;$Ø|Xʱõ¢8bcçrÀ¶ujè–E£8w•=í¦h*˜aŠö F-n/Än4´“Hb›¢­ †‚ì£ÉÌLÉzÊ…›”t¤v^©V.®?)­̰JV©¢YdŸ9‡^¸õ_çÉâÈð¼RþÐ2‡Vž|ѤÕ,Ûy,Óê×[(Us†œfI¬ b¥Çtû—œt¼:;áûWG<~ÚãËÊ—Âe } CÉ;ärv<ÞTÅ–ºlѪòYU\F¡ ìEÊG7…_>Úåáí»\ßÚ`ssc¤²¨ö6ÿˆþq¸êVúã3x]LZаc1žZòþ­»Ü¿~“_ýô%Ÿÿ¿}|Êïže|w.\¤pisŒŠln‰:öOñ£E87íÊÒ³œWl —1¼ì)Æe4\Èô©¹šlB#šÎÒ g l-—Flˆ³C.+ÔK?xqð”~Ú…†#måiÚÒŽIm¾xІ,H S¬ ¼WÂBºéyè'gJ’åƒ;*Þ2´+ä g1`ҋøIr‘H€ jØF“dz–¡%;HÑa‚«[ì¦!Ø ±Û[7¨wÈÀ"iñ:õ iƒ SÂ~—(íà²KÄû5‰Õ4v¸ÙËîÇ€;ë ] <²€¯ ÜÓ¯ëeq¼Õb–å ­ëÈ«d„Å‹˜Œ“»¥ò¡ÒbT[< @zÕª¨ËE!K”^?æ¤Óçø¢ÃñE—“ËKŽ;=Î.y~žòòÌóâB9@/äÁ¦£–8->Ë8=›¢"nó›ÆIÞËÜ ´6QêNQ#¢´"áÖ¶ðñ;Û|òà·öw±™ K—ÂÐe`,+êÁ³š¾ÊŸ‚µWì6ʉã4¤|R52÷oÜæîþþú§ç|ýò9Ÿ~÷#Ÿ=éóÍœÃ.™É8²­ëF›>Ÿ®¬”}¨Zx›knkbRp1VqFqÆØgËe¾›¢AOaÃñÉO?¤ßI¸èörï ’‚!U%éIOæèr#$Ÿ·ØãMž.•d0Œaxœû‰{Q\-?%¡…z@ž™0hc¢&2ETÞj$&˜:ñ+!=Ž‘bë5\#ÄݲØmKж˜Zˆf rnáB1›¶õô” Û't“ ŒOKûß«ÝìnÊ“_÷Ó†ÿtå–dw‘”"K€ü*oΕVºe Ô|isaÖ\¹ªr§²‹tx˜rÚ‰yzxÈWO¾æ³¯º|wà9N”n&tÒ¼h«2ôyïrf5¿ñ €x¼ޚœ´¸V‡ºp»×6„kma§éhÖCBgq& 0õ(bg£ÅÍí=¶76 /Œ~Ýc‹:^ô ¼gÊ÷ãÕ:LÖik­µŒÞÓàœ²½±É¿loòÉý¼:;⻃ùþèŒç.”—}è¥B/SâQ1±XtLÑ®#L§×x_ «êŸ/‚FAñÎ*Îæ÷u‚ÓÜÃòW¿þ%~ø€ƒOÿŽî!ZK|@”"Å}é஬¸(þ©2*©™’f98K.Èwxz˜Ë¦ßÀú6AÓbÛÆˆqˆ„ù€Ši Ýéeˆk îŽ`wbXŒËÓ‹²a€^x8ôpHÐÝs˜¾Gº³sÂä “\ÌÈëês3 ÚWêúf"îJ”[m,_žStÍ×Ô¹¢ÛRžcÑUÃ:sÓ%³|]|Š*G+Íx9”UÚQ¹ì(eSªù ì3ÍÝܺ1GC.RžœX¾|åøÃsÏgO•~¦V° “ëv™Ë²I2RÞbdŠôŸ'~D"\+|2îoÃ;{­ˆë›-ö66Ømo²ÙlQk›§½1#8gÉ]«M‚þ9ñëþÞ\gL‰J/}tßL †Æ{Æ+ìè ziipFÊ;·É¿GQĽë7¹»ƒ_ùŒîà’㋞òüì‚gç^vàt \&°áŒ"¾S½sRŸ{•'# #ËYºIòl7…¿ýËOhí|ÄÁ÷Cξ‹<ÙRØ´ôŸgxŸÝÏw¤@WIûyâPj!‹r‘’×KÔB¸SÈ&èzafƒ:A­Ft'#¨9Œ òÿL„55¢ EPÛÀm¶ ß«!ΣFñ êÒ® C‹žfÐñyàʇÙ6¹lÙõho@¤Âô„ 9ÁhV¤¦¬ö]¯º¶.E±³ßXÉ e¼$‘¼ÉèZéå=ÂÖi~ ^IŠuUnÁƒ«¬ÇOX”êšc<‰a6(W5÷ĸ¸rz™pxÚåà¬K' IM“½Û¸Ñý=OOÏ8íJ#`s€N¬ .·äÔ|Ê£yPkÍÂf¨\¯ ÷6•ûÛ½»{ÜݹÁíZõQàÜÈ£´s(wèâ†?…¼ñÇZ –ÅËŠÅhöÎT¨Y¥‘ u ~=¥ÖNqáb#Œ°6ÂÙ.hÔ·÷wq›d©’ ”44¶è%H/CRÁÆùädx;ÄÞP±ªdC Âp@­F˜œb5O›–ágõ¥/´›b¨E¼uÈákøú;ßlóÆb„õ¬åÓ1Å¢«Ò^o1Ñ¢ËïÃ5ÝÈ$#.MR^Ÿóì¸ÏI/àâ¢O·×!Õ¦Roܤµ{NÔ¸@Jf„Ì ZLöeVóÞX“kÊ5[¶åV îí ÷÷ÞÙkqggŸëÛûì´[4¢0/® 呱ivP•/ª“{î®{ÓþÿooÑ•Ç/Zuç̪-¬*¥û¼¢;ª`ôQh ƒ:»­=ÞÛ÷¤YÆ0ís18ã²ßå|ÐåbÐ¥Óïs§ R¥›ä…¹Øç‘_™N&,Ë#Î õW÷¸wç¯é}Ó¤×K9ü/Çè½йÇd¸©ˆK3ðqm¦.÷xñ©’…9s·E4™-RIœÍ¿TÙŽ`s jMCà"œÝD\=g“³gg›„áAk©mv-ñqLò2&íx|f ã"vîF“èz ·æ-‚1dAú A¯G}pJ”à´7¾7Ê5<Õ+!núA™1—_Ö¤P©¯±&•¬¬e(®rU­N×(,®¢DU¢ªÖ™Ï8'Èâõj V/cŸž»WUÎ;¾|ò˜'gm\ý.Ö$HPØ Ò`‹ž7t=:©Û\[N]¾'µHÞ¯œAd„w›Ê»pgCØo[nl5¸µ³ÍíÝ›\ÛÜÊÍ‹¬ÉRuÖ̪¬yʤX5ªeè m¨ÊÉÓ*­~ÄÀ_ìdúxÊ„¾•qÏõ)HUgǪ[zTp”Š.MOŸê4’%ÅäY-¼4@¢2} ErÝØ aЦµaÃçÅ9ÍȲ”$‹f ôOœ^{CœÆ¤>?ß™f¹ÿ±±øí]¶}L´ÙF®Õyù§ÿþ%µ-Oš v+ï£O}Þ“v…ä†/€pï ƒ—¹.<L]±2“Ó,¹Ö°Ñ„v j!°u¬l`\„qVBŒ4L“Àµpµ-ŒÝÀŸ´›’þ˜‘^d ÜVà¶#Ø ±›Ž žëÖi_‘žÂ°TôÍQ|@à»]•v.ÓdFdÙN*ÿM§+ŒÛä-0€ê†‰ H¯Ò£¯vToBÅäu?â•Ïš.)ÄVå¯É¸…ºHSISNùÝW¯xÚO¹{gŸÝaÔ"Å’hÈåå1ç3úX«dj ×3[ŒUoYåACùÕCÇÏßÝçÞÞ.ÛÍ›­F(Ì­M'`!Õ-:C•ËP--vº¦D6þú¥¿æ—·S¨¼Å½ÝÛcÛË4îéïWx7——›*[‚…öì=7ôš¼v1aWôÁ«æ²…Ñ<`"Òˆ¦Ž˜½“B¼ ŠÇ‹rYkplöÈžøÍ—áâø;hô8û{Ëà2cçׂì(ÃKˆŸ ½/A/Áí)ÁMA¶—Bz&d%9Ì–âê9¨;a#æfMˆ¬`%gëê98a¥I´ Ím\´‰!€tS©m„XŒ­aêqù"&Þ¢=Á÷=œL쑆`â!‘?§æü%V§-¦Êí¿ÓÒ¥_ù8L Ê‚ÝþüPuù‚Ê\‹Þb¢8ÝÏ[íˆ÷'xbÖ’PY¢w¼Î¢ kó”gô«4Ë8:;â›'ÊïÏNèó%ïßÿýÝmŒäñØi–³Ÿ*Æ >ɰ Î ín·”® ?»ðgîóñ;÷ÙÞˆ°ÆäÓ_%½[tU·€Tÿ»¬‚+l*G½Öås.T$®ÏºÏŒã— roGzx;#ÜWeܲhQS?ñë.ç“Qj¿{(KÕ¾rêÞ-ïhG…K-]¥œš2zîÇé>ùûŽR[Œ‚× §ŸÂ°0¸±‡OÚ ? 9l9ß=¢wú{ÌÝjYFPË[åß ƒOÁEÝ· fKР8¦ ÿ·4…ôB±hZtŽÔ¡Þ„Fjκ&6ha\cëX­c¥I¶s͹½ƒÛÞC\”›BÙb6?µ8¢FȆJ6pÐÓ³Èt"M´ ‘ïÒHŽ ³SìÈǺDJr ~­Tq‹\F×y™[É«†u—ÙŽ.¶ªÑò×ç÷•2GEeI‡ó’ãŸY§äž+2u™•6f·µù×™Wzƒ!Kx|è9q'œË—<È`ksl„†u6¶Û¼{wÀ‹£ŒónÑâÔ‚ŸÞ„OÞ xtg‡‡7îr{oŸV#š L-¢òzˆ£º` Ó…wÑXÓžÓTg=™u©¬QçeòÖjÙAþ¨€¼ÔwK+ž2-Ó!--L%·Ãñ¹˜® 亰T,ü²à©*Y/Œ5ðI0BÙp’q ¤ªô8\rN—Í{¿À'{ ÿ #§ Oþ¯ï>8 ¼—¡Fö…ΧàÏ¡õ`·óA ùÐT–̤>·ðî†bÁX¨5`{3OBo„Ž0hamksP¶DXmºQ¸‹ ·‘p—,©AšaŠ¡Sxqh ‰üÀà/=·H?ƒmÙ1ÐSLê Ï»Ôú„é1V“©–:"zEB§…íµUâÊÚñ,ÏFyT¿±È²4ðòó\¡IË2 x;ºÊÏ.xº®j€t¥˜E•óš¾È4H{¯$YFb„$U¾9„c9á»Îo¹±y½íë´[;lÝø„{î°ñ5½ã7ZÊOÞ øé;Û|xçw÷÷Øh†XkX5v®ë™¯!Uõ‡— ù¥Ê«¤“©¬Îe½¤ÿX]$ºâÕ+Ÿ8ê)Ól¥²â*#©i¶ž"SÏ›jÕ=_¡}‹”˜{±øÀ_¯0Ì”“~ΟÒ1î>úkâƒmŒ5;5Ü_gÏ<ÃÇ/ÇD›J–ýïó!¨_uH½âó0{ÒXˆJ:€´ Ù¸7!¬+µPhÔ•fÂ@0A¦†ÐÀjkk8i`iá¢Lpƒät‚‹1“E62¤ ÁÇ‚¿Tdà¡+h?E$ÅíGh˜¡ƒ8¯ß »Ôû‡„ò çûLL2ò{mºîqUö\ «CÁŠiù¢ŸÓ“•1ìr”ìÕT¾«JWyÝ·è©Ë€kQ!qFôòkÖI¥2 IDAT˜™O8ÏÎGž%ê•a<¤7HÈ2p I¬žÁyÚç›ãh?r­ÖäææuZõˆÛ[5n\yts›Gwopÿú.Ûí:.°W¾ W)v­¼”e}zeåM§íGËmŒª¥bêbB?fŸD9mùx¸y­IœQ_Qœ­:‹eÎDT•åïUuߊ)Éüø[Þ+Ý4ãÙE‡oN¿bh.øàÏÿ–ÚÎ]zý5îAH¬C:§Øw¿Ãô”aOHžCÐ÷AÞ©‘e òBav!$JÒÉ{›³®DÐhå(µ4êJ A !º‰·¡Ð]P'°-œlcƒ[øÞMðM¼$󸏇?‰ÑZ Brœ<"&ÂíÔ°í ÷&øÓCL´åiøcêÙ œ\NXsinA ™i$›,»\‹˜ž[4¸]m]4¹H>/!Ì®ñW(²Äf¢"KäÍ|YôuÊVÞ"¨Uÿ^˜yz8½¼àä4á²›?Í@ œ2ŒsßáéîÔáßüÄð¯>|ÀÇïÞãúv“00y¾, • ©þí@Xe JКk§ÖùÚ†¾Õ×ßY­¥!Ï'¶äçÔ_yQÓò¢¤ei£üϾ´“–yf&™æµR^0ÎTéÄ)ßžòäôúÙ ~ñ+ÂÖ#’n »ÛäòwŠïvI÷tN¾ÀGç Î ~ õÀlæ/ŸÄ08â•ôTðp;B´«Ø-Á4 ˆ„Zè©5%o¡+â߬«ã¤ñHÜÆ…ÖÂQ¸ƒ“[øþMÐ LQüÆ4jXŸ"f€w}ÌVn‡'<;PŽ/!ñùC¨^Ç¡”¹ÉŒuðþuáÏìñgï½Ã½&Ö” I‹¯T,^Gz¬(NÀr^žÈªRYSxkæÈ_VüÖ|gÍŠ(8¹šæ\–a¦ßÊ—~Wgô}K,Oj¹¸bJ^…ᨎîUYÙöYŸÑµ÷^¹$|}ü”'gßÒËb~ðç4¿ óMô2@#;èÓÿmî/èžüÀðDñ'Pû@0mE3%M ÷Lèþ\K®Aø!¸ F€ ê„Ù P†!ªƒqµ<í^ Ö´0RÇšãÆäÒFìâìm²þœM˜§›Œ#÷á&ÈWïâ´G÷p[=ñ¤@=ìÒ0ÇÔüDÖ˜fÎLв’KFe\TÕq˜btR_×÷µ›Ïë‘i™cV“žÚYªÃùA¨ÌËU[èÊÆhðu!_çE%Võ¦èLÁúRW‘â×ý4£‹æ•N·ÏóÃS¾©œÄ0ô vĉòm‘ÅZáý]å—jüì½wØß®¡›“„fU­ÜHÌöž/;Wér»V7î—»8¤T8,÷5¯¢«(€Ìt5¨Î-ª+ÛæW°pÑõÎÑ$‚K¦zÞ§–z­ê^ÑÅš~Y:ƒ´/m‹˜¡X#ð] Ô³šµW¥3Hy|ô#ß>¦ïSÞ}ø ;[Ãà›–ö,$}6þM€|±ËÓ¯¿åð7Ü&Dïåì{x¡ù8u¤[ÿ‚6§X'X'ˆ¬UÂZ“ ¢Ä…8bMˆÑK˜¡hˆõu"·Én0ì_ßÄ F0Ö`¬Í=6µ‘7pKô¶Eë)âcŒ&4“KšÙ¡œàŒÎQÁu’(#PªÓiAæD‹ïˆŽ–Ü|Ú²4UìgðÎ]DdI þõ1IÞ>¢½îöu Úf](^ømA¯0±Ø»¬úÌs|vÄÓ—}žžæ‘EƒQËÓ(ä[À‹p» ¿z`ùùƒ÷¸·¿G˜¢@UõQVŸûuAx1éL‘J«ï)½U® Äk®x€½èøôï¯JÛ–ñ|©_|6N¦j¤ÛϾÆÏJ©!fÑ61ñZÔ{­¥…ý¼Ÿðåážœ>¦—&¼óðc®ßù×à_*>Ê=*ÒWZ÷t›1ßþ// î^`nÁp—_M…Æ-ZÐØœ(2F,&p¸ ‰ #l͸ւ ’d 6°¾Ž¤Ö:jDõ6­Ö&˜ëÿ`‚Kjœ`5ÏñÌ=  6rØÐ`ÂÜÐ(dÍÚ¯¡Ý¬œÕÏ©É1!gXMæô¶Q2ŒŒ/¶º²B¬\öÚ?;cš£²èõ”Ù–§…Û_¥`Ïç|ÿ¬Ã·Ï•‹Lè‰æÒ¢Éý¥½ä '÷7…Ÿ¿ðÑwÙn7–ö/—åÀ\¶N•%mtºÙ-µÃU‚Ô!œ6 šZhuÑÕÖùퟟ_!Ê’‚ÊU26—É ÕNtË?çŒÄ¦UËÙï™îj‘-­À–Q¾dõÓïKdPOgñíñ9/:G âíV‹{þ’¬¿Kv¨˜6$I@ÄtÎ<Ùù9ñþ§Ð?gpª˜¡°÷›EGwbÌ‚qXç°a Ö Â·ÙÄ[ŒU„ã‹`°0¾F„Ôj-í-âþ./~rò¿uéÿ¾CpדüuÊæ')r-!¨¢HIî#ù×Fó"¡´Bý g¸ã˜X°ê¤·Yt?ü¸kòçväO7–ƒ4>gÌZ…«kô:Tj›´>¬³a¾‚¤ñGtҩܬq,Kr+g2Ö!7Sñ_Ì ‡ž>ãë§OΡ‹’Ù<鄤À~þò]á“ûw¸µ»Cà&Zü,H¿QƒN3ïu$E2ÔÜQ19§2 h²”×cú3•³˜ÍêBaz]­–W–.Z²¼ÍSfÏU™È*“×^qâD§/ºÃ„ïNNxÖ9àbð‚(ªñáÏÿÍ­$}KðSECÿt¿„ËÇ}l³Çå½Sþýç ^(í<ŠJŒ!M,š4sˆ qA€ê¹¤ä_‹ òÌP1X$3˜Ìc½)˜t g›Ô jõ-.OÚœ§t>ï¼êãOz¯zdýKŒK±qLô0¢Öhä¦×ž1É4äI2Ö*bAM@fBú7Exñfx\p‘›ªfºçL'Œ9+Œ¼>—ÿŽ7jðâ'¾› j<®Z4œ•&€‘ot·Ôaâ³j¬¼%à^‡ÅÌ2ŒÜY\D–,8²ÀÆT°à -:u“ëœc^u[.n5 Ó½äéá ß=ƒN" kG5ù”˜<ðg»ÊÏïoñðæÝ<5û-·üª®;kºàJètŒ.ì)®E!yIÉ» üwóz³G•/³pë/3Ç>‘Hüê³° ”Îp-y¤*8sYŒVü®–JU«OZœd<99âéÅ7œÇgHdyøçÁæíG¤Î‘ÚŒÁ+!=ò\~Ö#x7¦õ˘‹$æñÿô†ON¸ö@pu‹÷ŽtèÐ~ˆ×±ŠB\­«GØÐasf+A ˆØ<ª ÁhRë´N½µAØØäì›§ObÒ3OÒOРΣ¯CÒ#ÃÉÿy„t.i^¯ã7÷Ȇ9“Åz1XR„Až·iÞø "mìâí>FŽÇjÓˆ8Œz-I…“q}Ç”@:¿¼hÁ¤Kcš3ì)€V]Ä—;(ÉRF-kþëUªæo ef{·åJµ¿É‡Ñ+ªøQáUŸœÁ¤©çèâg¯b~¾cùèήm¶‹–ºj}¶ZŠÐ•H•gÈÊS0ß 6>²Lb“’Ð%UõföFdXÊ5Ë'"uº 6Î [^c-`n°Fª~`þŒšån‘KšMYg¢·êOšy^œŸñýé7\$'çx÷Ñ/ؾû zßoÒ¦Ä'Bÿûµ1­—";ÊÉ ÏçÿýïH`ÿÝ ¢xïð‰A@,.´¸0"ˆšØZž¶íÄ ÖåáÆ F1ãvXÇsB½ÑÄD;¼| _tr ОͰû†ì…`/-$†ìå€ô2%K໤ƒz’âdC±5ÅÄgx+ÕÐ0À«ÁŸ"ñÁ¸Ø7{F}ŵ›üKÒ9{ö–ñøŸjÜR)‰ºE[¶åVÜD¬ @²&ˆþ±eEÃ!£w×ùÀ••ý¢JeäÕúõô‡C^óã 8ïC,#p–¼Øa”ÀÂ;ÂOooswoŸZdK}µUŬÕ`¬ªKús—\½¹cÎ"sÅ)Q)ïäJ…L©Ò\uf:\¦æZÇ}ü3 ˨خ€±è–ZÆZ¥‰3[P®¨K]HÊz¹VÖyÖÓ÷çJ†^9ºìòíñèôOÀÁõÛؽ÷1ýãúÇ}²ÔÜI‰>|@Ãðã~üÿ/íOë x™{‰ªZrCg!p¸ Ÿø³6ÂX—'ó`ó0—gZk0&À¤6p„͈¨]'î59øtH÷ùIõbŸG_íd{íÕÁ¤¸ë`vêdiÆ0Sü‚Óa‚3ùû§)&’)à#L7¦ùì?#ÙÙXsÖ髸¸~§Š‘é–岞 ÈÔþk–¸åþÓUÊÑj`Ôäo'¹ Ìi°²Î¦o 5X׊¨]üÄ,°œ\sUr›’:d»Zt" íj“oš)çÝ žœóä¥r¡BbŠáŠBÞ°¶Bøè¦áá»lµWÒšGŸs3V]‚VÛw- Ô§Z™W}ÚYk—5(ª=·¥òZTž‡Ù§B™_duŵ«T}fŽfIÎ"ÉL'çCeúþƒÒÀIÉPlîs™ÅÄGÌÜs=W2/m;ƒ„o޾å¸Ö°{ý&7üŒôl—4éçôø3Ÿåª3µ*YÊs½XF«˜ô\ó+Ëe—iDŸV‘ê{@HG2ècýqʸ}`ëòûpÎP¬ª³cÙTíè£ÆÃ (Kœ*OÎ^q48¸:­ÍkÜýÙ/°õô^z¸“]*YjH^²Æ —›/觯ðþ€‹/.¦¸ÞkS¶"Ø,D$ˆ°MÁuÄ0¦ê°X±ç ¬„> xõmÂñW/H}LQ [ØÀ!Þ baÃBêHŸ§È³Õ%¨5h¿! éÄd§1þæÒ í»ø´IÐ9¦qú96}…ñÃ"=W§zt- +?Ç":³fOW£—Ý·îõÀs2ÊXþº"Û¨â·Ö)­{jQñT–×Y–’r•î*Žyö¡0 eÕëÞåßõ¬„½wÆewÀóW‡|÷ N’\ÞHKB+°Àׄw¯_c»Ýœ± ]¯ Fµúç—ƒòôö]u½@¯±¼PÊkœÙé¢ï¨UiÖOzÉí/‹À¢Ï9ñAÖÂü†JÉO´òÄŒ?kþ?s,Ø©ŽmW«Æñ'¯¯s…ìÅ‹rµ;â2k8îö9¸<Ì3­eÿÝ÷¨íݦ7° b%ù­E‡ öý”äæ}÷ŠÁÅKz?rñäáYB3®?ºÃ;þßpzqBÒ|‹ò^db­kP ¨Ád!®nóÿšu¼oqülÀ«Ï^2¼<ÀA½M…„QnÆïû"˜~†Ù Ц%¼Û@1ÙVŒmxjwB¢kmˆöƒo±ñ9m½FëÕ?иüë/Š ?°æ©vt]ÐÅî«„Ž…ªÙª&bÇ•áMJúÊh¾|ZWYr¥²Ú­¬ª`#kNK-X©¤k ‡%›W•ÚýÒ­æ:ˆ™¥Çç'] áVI8#äñ=¢¹˜7bÜ:ƒ¤•qµF«Í•æN¾¬´&› ²Y¾¡Ð.9ïˆ!N^uŽè3$z47ëÔ÷ïÒ;‰_dX›"÷S’¤G¼Ó#NSúÏÏé>ýžÎ«#ÒKe§á¸þè!7?ú+öMÈÆÅ q-ãé ¡“xá ð™ÁA¬%•¼;Æ1q ¯¾;åð»ß“õj–ÚfläS†A+uü¡ÿý9r2 ü›=ì~ jðxÇ=¸žá"ƒ •Áó.áÆ ×?P®G§ÔŽÿ=N» éÄÍsªØW¦šL‡#,X´uª&2!²"ë‘H·ÚÖxžQVǘ.«‰ÜY®Þó,Wzp_ŸK¿V!sU7%T „«œÞ0æùÑsž>Wú«¢®ý¬ ì ïÝØc¯Ý.Øó4XèÂ'ß/Õ’g¥ ]’z¾tª®Ô¡3à¬W¾®Õç~L6õÍŒµª¨ç¬6;ê‹*;͉ÈJ¿+w”¤ªŠœ:Ñ%OÌï’¦7$3æF:ï‹S]&ÉG´ÏãGÙ+.Ý1d4wn’$5Ò˳`o+™´? 9Oè¿|J÷ùWÄÇç4€½½-öïĵ>f3 Ùê^ÐvЫ׏V‹è¦Ðõ޵$Y¾X q¼8pqœÐ=9#Ž$ñ%I÷‚Æ6ac‹0jâ\Ô±¦ -þI{Ñ¡öë=‚Û¤YHò¼GòïOQ{‰´b¤×!¶ÈΆÿñ’Ý;ß²»¹AÝÇE‹]) eN¢Ìó'««ïSaÉ2]^È´2*žL¦ÇË['SÒÔJ.2C@eòs*WL_``t•î™ýð‹~_ƽѳì¬zÈ}ÚPjH U=Ðk€…*>SÎ/ÎùñÕß>‡“TH‹©AŒâ ì5àÛ!ïìߢÕp3á 2gô>±ja-éBgõÔ×ðÀ(OšŠH5[• ¯~–´ÅÆígfD]0:®Sž²ò³•‹q“t¦ ‰£=°Èœ±Xå3 |—ù0™Ò"ª ?›/bç·Ø¢ Šæ³á¥#ög奙ò}ç)§¼‚ÐÓhDÔ[ï1xáõv,Y“õb²£—‡¯8ÿþ Hºlï4i5îÓnßeûÎ;l8ÇF|I+qä½ÌN<l (ižø uú|ýùÿÃÑÑ%©Q¤‰puƒ± \- ˆjب† "œ ͺۤn‚ |/¤OΈ¿/2N`Õ=åyü=y¢@hlÜǰÙQäZ8‹%Úк~‡öÞ»´Ý.í ÉF–Ðêõhø.K'Ç[t§¨úRSmžÁglŠ c@̱)b›¸ÀaÈ ˆ°A„µHCa&øÔÿcLüéÉÁ)aËa>iÜFHØê²û³-Ú{Û´z—ÜúY—F]"--¥eX–9’éÔÅ«%Œ)&°¸B)MNªÌ‹uçéj~©øQ^£+F½UV—ÄVØ·¥s8rÅ·œ.h1¶¹°uoÄÄ—ôT„VUÏݰÔgtû=^òý+8I”Ì©ÑñöÚØ­Ãû7 w÷öب…EÔÎLZÕ"YêSÖ¹žå«u~,+HÍ‚³”‹{2ßÄð†F ½œ,¶]Ø~X² ‹ªK4î¹ó*¬%$v¼Zº¯ªý?ÊF`U…Îü¼$IÎh_~O—!Qh‰Z·iì<"ÚÛCÃ&I'cðôŒ~rÆéWO¸üþS›)íÍûlì¾OÛ´h56MF;ëÆ–dÆ6EJ¤P'?†Üa.T0‚Xësç°‹˜°†Ø°øXˆO2â¿?Ãzv†Ø[Í¿mc®9Òþ’˜ ±ónÀî£{ƒûï ¨ÕÌtèîT@²0UR fjçLÙvTf3[eeâªGKEB4óOØì"p\ÇÀhv|]h­hÖŸëŽ+û?!ЄÆmÌÍ ˆÁl'°í0aнbûQkïïr#ŠÙc\)Á»¼sa!™)Éc5†M_;?–9J|zAbSÙÚ錖¶<žê Œ£ß¨8Wýb‹Ó½´.ÙÏZ›UHµzáR³RµÎËU3LJU鞾⇧žç0ÐÜ&´h;x¸-ÜÛÙc«ÞÈe<­žRÓ*¯aFC$ÓÇ=ºy–ïÊÒ…V0gYX2·¯¿J·ÎÛaÓ«#ÓϬ£Y¿Î]ÖS ƒ/NöŒ‡Ž¨Ní\HÙ=QgŒLúê1aJmó!µð6µlø‡ËOÏð[gt޾øGLvBÛ í]¶·Þe³±Ã†³´COC®Öħ‚†hÒGµCS»ù‚›r§³¡é¤uîù•äî*©QU³Öe¹T8—‡a\iŸ4w`ó`­ëKs ø*C'ó‰ZYäXþ Í}¯ì«»Ž]–.ƯØ&¤¥ʹóUþòžY³ÖüoùëøL9¹8燗G<~§i®=§’‹ ÅXe¿¯ÜÜÚ£º\†™ê¶˜4ù]ÔI2Ds#"¥¢´,dÈUŒP«ªÖ²$šåOôgµWøzìãuzjgQÙþ¨ãúj–ŠÔ™i r æØšŸ$¨”…<ÇÃõpŸfmŸˆ TúènŸóoŸ“^ü†Z8 ¬…´6öÙÚ½ÎÆæ¡¡å2BWŽõÏåèÖ ¢ZKH½E}›4Þ$>íuàø$lýìÑýA«…qaj¥‘tˆÏz„AL«Uc³yŸÝ45ƪáj4`úñ³…ï˜E¹ÉRf—§ÅÄw.Q¥l. Ìlâàò®„)?½‹–±½ßbïŒ7â-Lç·ùi€®%®\Æ]ìfA^áü0ŒŒômxV † /Ž^ðý)OŽ Gî\—‘OnŠ@Ýæìùþµ-ö6Û6/2NŒÉZ=^¯gsîfw!c®h‘“%ºª.¤?ÿñþèÚ@]%‡Lƒ³VÔyJ>"Rͦu”-8.ìU—‹¦}°uü2y¿N’q¨ç­û´‚k4÷·À4<î<þaö{663šÑ­Ö.Ûûl´·iŽPü8ÕG¥Œ†j{²ù;%ó‚Jz+ÀË>>k“ DÞ`ïí`[»¸Z› ¬cÆ’š! —ÒpJÍFØâ\ù⩘²‘­J­©86_Adª;dd¦ß`–^JÅ+ÉÜЋèxPEÇyh£>ÌI5›i³šÒÏϧ:LnÀ¹iÔ9ý:ÈÕ·¿ó,záö`Á:ágÖ$™ÚqÌ‘è|AP©tCLJɔ³N‡'Ïùæ‰r–@Œ’ÉÀ†â›<Øîíî³YËíç#¤OÔi œ½¬–1¦{݉¿«líß¾æüGàÝËw3÷ZY3^¦ßOä'³p§šŸ­}îvÑ™ Ø)°˜ŒêWiÕqª<ž’ÖšÜ%L6‘¡ÅwةߩMÂÔ×o† ëøG¯ê~ìz± ¤êúÞÚ‹¾7)F–å)™’<Ê]02–>­xÒ›”­J¯£ªtRáØ ›ûDn›F"lIŸvkÕB7*,7Egƒtf›/Óì½jt±´°V©$é€ìàStx„©‡¸œìƒ8D[HêJaÉPeì5>Ùáë˜ä鮦…Œ¢.™hÊ*º “C§Cc¶m®¯”Y¹²³bÙµ´Ìd§ƒL-2]VªÇUD£.†e! Žâb®*w¨Ähõê­Àë– †¦z œê¬Ò¶t<¦Êáé)_|ó ¿ý|È—Ï•® C›K#,7šnn»¹k‘UæK£‘"™Ô•f úò›óºÁULÿ9²éE1bË­[¯76yçÙôXnÔÙñî’ÜV¤HW) ‰W^e1YP'6h ,×Ü€¦Kò¨©±ßˆ™|aÛ«KÃ>¤ÄMzL=ɱ´Â½º/Àá_ý'¢pðÿUwæÝqɵÿEVuõ‚XH\´Y¶¶ñI#¿ÂûïÓÚÇòøIÏ3£ÑxF¢µQ”¸ˆX½dø®%³*«º„žæAÒ€®®®ÊŠŒ¸qã^F¬#ñ*ØuôhD÷ôºü›#Ňʽª&—¢¦ÍV+Ã(éA¹2¤QNt÷iqÛÅm曚HЮ* 7d©É uNE_߬ì?ùŽhÔ¤;X ¾W©W¶››ìºöA¡h¸^Pà( gãùn>ÃÝžžðõ½ùã{üþ¿•ÇC8‹fZj4}Pf7½—ÀÖrÂÊ`@Ë<‰ªtPHœ ºÈnrU7ªô Œ"“ó…ûunf؆3ìgÈ.æ­PÝF/bò´-tÆ<ÏÇÇ&×ÿÐLãÚàá úÔèô¹µª<qv6$9[c=1l- éfç¦EêzîÃjõµdbÉMå ;Œ–;—èØ}N‡–ƒ¿ ¹úá²vŠ}öD˜žzC|¥›ºl'EF«nœºJÛî• §ØèJÃ{RÈaˆ¨…EzîWp_mawŠo•N"ØÕ翚çñÆAÜqɬáX¼¿´ MI]R S –)G—€ïbWÛʃ]˜u[NÏÆÜ{ò/¾}ħ·”{G0¦fÆ}v7q,G°ÒíÒët1 ÷ZX(œ¥À¡=¼ßÊσÂ|¦B]Ƽý¬ÈPò6ç…`ðÜ\p‘7<Ð/c¼{Þl:iòÊ\ c §–`Z¼÷Ô*‡LXŠlD°Òa¢ìu:sp Q4EhEê¯QƒàËl^Æám§qdÐéÒ7]LG°åþ§'lÝ„~ÑP1%Zï­¾ÉtÐA:væ ‰Eá5!pŽõ¦ü| u‚­3U(278gŽ-%V-5ÃıeQ<«#‘9à`é®ò·ò¤²Á-+Úƒ¬º!¶€;¤ÕB×<»ppV‡/*Îð‰4í|YÆ­"Ð,÷jU™N”ÝýC¾¹{—?}=á»8¦)|ÙÀç: vvM’8¦cÌŒÿY ­Hž9糤 ¨B”™oåFj+Ìtamk‹n·CÔD@P³HJ]Ãoöa"J8wµº24„mßuÇf1"Ÿ$¬•Õ芖¬°²eÝ@<6‡ TdåÏ,€Ôî¯i–„~Gg®¸­²!·qã ÝÔ–ÌÁh|ˆ‡ÐtT98[\†ˆU889åû‡?ò—;Ç|ùN L:‚M¡'c× ñ¢)tDÒòË:µ|Z¥‡ÄˆýK9Œ[K»Œ¯M¹Þ> ëaÔNM_±ýÖbÕÿ7“‹ó2iyYÌ_œÆ{›5ë1hÞ|Ê~ßQa]@W6ù â(6ñØ¢ê)?fƽ¾ÆKî"ã9zizK$(­*Àj…¥dç3¢ea2U^Û:ö: ^ƒ+óÓÒRG¹À%¸äb Mæ×5i¹K®îKJýh„,¸ÐCõ2Ë¿Å$”’ºõ¶ÔQP«œ ÇÜ}ü¿ÞyÄçß+»S˜F³«–™“qj ÛµL”ÈÂN«I”+×y,@?ö`’8¾Ôì=cX\hÞäæyéfó1êó¼(€7{\vu>¶ü"Aú¼×§zÌP±(åE56e`¨ãøÓT5ù)®ºð€Syj9°‰ å9}õ!¾ËKºqÌúà2:»Ðï SEíˆÃÇ §S6/‘Í#öï2>³ùÊ6+—út⨂ç.·¹qÇf×R(2¤È£“äTqgæg<˜64ØÏÅ–=Ç G}Êu¨u‰ðnžœïšškD—m^êhw’'7…†jHŸÙäYt™ìßîVÚÕÙ°NòrMJu©ùâÁ!eŒMªYu*²?žLy´·Ïw~à_Møú…0D™ÉM&£Žbz†n¬\ŠàRbØ(¿¹su}A7Áˆ«ât‰]͈Ü{ÕÎR#S©9@k¦Þæ‹ùzXð79:g¬üÜš1_Þè·S Dg0B4OœÄaF!aÍì:U<70W™ ¾_û® ¸åÆ)J„°¹¼ÉR‰¡í1XÔ¡öŒÃ0}8dÃŒXê¦ñ€g&œîï²óÞ—׈"Ó b¶„¯r%¤ŠÝÔCo«Îmêêy‹L¨jÞ;bIu9‚A¯†šÌ k¯k%û­óàjR\GeÏo7Ö- ÐÃLun€„²™\Èße¬ømKï¸NiY碘}M­²xÌw÷~àOßœòù8šÎ¬ylz¨N,˜Èr¾1l ,ol®òÆ•¿ÞYâÕíË,÷"‡ó"^ÖPizÁ¹ŠÛûÜÝÀÄ`‹fVÛLûƒ”Ö7tÚT?¿DPýyƒ´)A–2'Wµ­ÅJ>q§¥¿õpÖÀ\„/Âu¾Ï=F†› Âr7aky‡ÃÉ1“i„NÇØÁk•ƒC…g‰º§Êä¹á@Nè­Ÿ0XM ̳ÓsüÆUà(Æ( Õ©j©" 5ÇS Ëy–n ;ke'¤Á¤•Î\Ƶ¡Ó,âWàYUÁqÑjâ/Xçâ¹<êVžD¥¦@ÖqKâÇTç¡ÏõqF®uö`œ GÜ{üˆÿº½Ë¾UvÇ0I€*J+QO¡/$A"Ëp4a¹cyóêþþÆ5._ê“D™÷`‘Ákz«“û,àˆ”YÙ±_–©{>o¶Ü2–¿©  ÿü|A¿FG *¦ò÷’3yÄ1Mú-ÁDJI·U¼!ÙTͧjúöÖ„ÍûIâ Â(tŒ°½ºÅRW‰ºËÐ`“ˆi&ËpÁÁé–'t¯él)#qrvŒµm$Ne¡ð,ÌŒ_Œ&L£v}ÛÍÉÖ$’‚QÕ|šH²&ÿÿÒ³ê•=)a[2ߊ!uezȯqıFÓ×.¦ESPkþëuNjT}Ê–V¦€2òÕeª´-±^®áU)Ç\Fã ÷öùòÎ]>ûÊrç˜Üç âD}`’˜ÈŒ™ÊÓñˆññ.«ÑsV{–nÇí[üWòN¾ m4-ù3½<\ ­¿hüýÛd~ø|Û@Â%Q•·, f¶¾%eøH¾n "Q´3lT+&P…ÓµªÅä”i÷[¼JgI•è ¢Ì}6~®65È€Ký%¶—ÖIŒb:k˜î&1hFF9:¶œrBçHŸ“'v§ŒÆÓô]-õãÖä6„î¶A »*)~¦stlæk­éÍ’¹XsmXj ÏÖЬ{[g «3÷¨jW‰•&Áã5×ší«»‰Ó\ÈE—š?xþ¹üöEP€JK€Dx“(IÖ\lõv´b3˜N-Ï^ñõÝÛ|öí¿ZªüµÕ~ñÖxæÎSRJÑJ-g)g)âíÀñì^øîÁ=þôõ>ø^ÙŸÎ\R¬0ckô¦×!I IgJ)›áWW ïÞ¸Æ-]ƒhä)óeìlŒ»p7’Vá,þÏI»ßîÏ~N˜¢išr¼ÑtÌ‹¼?Õþ‹T‚„bf47j?ãdÑ™uñ-(DÓÁ"?‘@N¯µŸ]JYÒMaµóÆÕ-VÌ=Nˆû¯­l0™ÀÓÏàù!<½õnÄ$o&fÊñþ“©uÑòÊ Bh­¸W+r²æv§­%£7ç0_æK€ÌÞ/£µ¨3 ê_8ÇBQÁ7€‰VÊzÉ™Ìêà³Ä®Ƚ|r:'j3jÛ¶2ÕRÃ(«Ñ4µëÑ´{׌z楅ù&jSJ݈»ò—oðÉ–Çis2é*Úzipî@'š20ÊN"üãüêÚ·½Ãæò ±‰<þeÞ€õ°D¿­,s³áTKzñì‹Í¢ÃUI[ìºM`~,<˜U«[ôsË=½ñœ¤4ÄÔk®d™qoäºh†EAÜ:¤ŒºÏZöÅÌ«Ô|KÌÕµ%Þþ»=eüÓ„dùMoïmö¾„çÇŽˆn\fxÚçÙ'Œ†³¤3룵­IL 0—!:“©âö}0¼öÚ€õsÖqÞ¼s‚“zU§”ÒT)è¥Z¸Ëõã“K±«DÇ2-*¿ã°T`Žö:I 2*NWVËÚ§qV^pZÍæ8ÒÙÈòpwŸ¿Þ¾Ã'ðßÏ„ÓHÑÔ™›.Ð3ÄIL)±ôåFÞÝ„÷®-ñÖµ›\¹Ô£ÛÑ`°õ²²Që/ I´Åâ\ÜÉV3«sŒD×:YhUJp×€ö<ç´¨ÊÝËÝ‹2ý´¦Ü®xjÍíq` äû„†øÙaj]™^Vâ«¥jrÝÈpss•³·"¾ùÞr²¾NopŒ¬ xq{ŸäêGèvSû„³á„þRäOŸg×m|†™ž0Ö»tÿám"¹ÌIù L°ñ sÖž IŒÄ#–5QÞ\V~s½Ç¯o\ãí«l¯­Ò þ%w²9 \ŠXL󃬕 :Y @èBÑÍDëƒt»a˜6ú"ašº÷ êPI|±çÓ†ÖeÜ$4Q×MVKÛœS¯©_£iÏ&µy«Ñ[®fÏYp.O"çB=)“£8qÄë}Œ9cxñp€˜u¦ÝeF{?`{1v­ÏÙ(fïlJ”ĬħôÌc,blI-ÃWƒ¬XºÕÝñ›…m³çêð_á”méWïYî” JDm¸ãàÆË2›úÈZ—¹Ò”h8ó«TFó< µ Á_§­X쪹p¾N98sçÁ}>ûê1¿û îÌäC%Q:=°ƒíuèESb±¬ŠåÖàŸoôxÿ櫼½³ÍÖê`Æw®”…îéH1°"MÙóE‡PãÉ?¯ÅÍTÛÉ1–«A¨óf¢ÍÐCÓøú¼Løâ`6A€Rp–9lÝ3V ®uAÚ)ƒE׊ðÏk!D$¯Bó>VZ¬FK‘áµõ±™ò]/b÷¾Åž­2í¿ÊhoBcD|ý5†cÃÃÑ)Ï^¼`eø„õSú}ŘB}³~+&£e,Úóò‹j²ŒÃ›Úç,ּԘ鲊ÓÞ3µ7GVü]QJ#¢®®Ff£¶… aå èæä"3¯°R5°€2A'w™“¯AÙòÊRš› £L¸ûø1úæ>ÿvkÊíã™|(L´+H/¡×±ô²)o­À?ßðáÍ›¼³sÍ•>‘q×®ë‚ V ¬¨÷æOy…7³ú9$[5¿L aÊrAN-çiÒ—®Î˜_&873B„j,•9xC"R²y’À8øLÊGÓj^«•RM5ZÉž)\O¼ ×##s97Ê@"^]‹èuFü°ÖãÉ“˜ñQÂX”ÑÐÛ:=¬3ílrðûýž+;ûlí½ŽÁdq)›$RÙÒôéi± ×g[õIíš áòñ¬Éis*M¦¡Ôè8gY¢„ŒâðT%­€JYµÔeÌàcöA£ ŽcóCƒ¾¢Å¤>›+ÄI]‘F'+7úµ‰r:špw?ßþŽOn¸µg4šgzuMÚTFy}Iùèú€_yw®m³¹Ü'6RLPºÉ‹3¦ù` )QÊbH¡RC˜ù„×]·vúÚ‹fÀçÏ ý€Ød-µXð{9&Å< ÝÏÿ%AHòåßzNÓR·auLª÷£6sçÚ„0‹šc»‚Ì8ÒK ½xÂò²áÙÙ†‡–£ŸN9Ýý‰d’°òîuº[—1¿ÅÑÙ&ûÿç NÞzÁw¡ß!2ÍÏÚÊéÉ™ºû{n¥¥:Ú­ÁßÅ®’Õ”ç§QNCY‹D¤Òá+TÓ–“ø»±A<#Æ"\—¹›%wlgádÐW¢k›Õ¡·XÔ‚D%W•浡¥²îllyºwÈ—?|ǧ·NùÃCáØ*š€$ = /DC'šÒËÍžòO×ú|pó&oíl³¹< 6ͱX@!}’2`®ì¹Ð7©‡„š¾l+<ÚŸ’— Îå€XO{›®»ÁØôw-à_¦rð!—RkuÎÒz“’¬Ùú}–9«†!'§J®cäT›fRÁƼ’˜4¶lö„~úepR`’¾Îxp¯ã§¹âf:lá¯ZiÔó¾´³çÚR“±>ãÔZyÄÚÖg‹ËϵÀá³WL¦–½ƒc¾úñŸ~ñ”ß}¥< “HgÁ9M"LÜ¡‹Ò¸œ(\1|ðÊUÞ¹¶Ã•µeâ8J¯¡-õ>]Å,çL3,Zšh‡ó˜¡@^Л.ž™×Áç‡Údm¸ØOÔ Ã/ŒÅ:ÝÍ× ¬ŽÖœSø é³Û49Ó4wL'òlF¯k˜KÙ³š”Z<ñH¡ú&iâäˆH¹"ÊÀ²tvÀÓÁeÎ,œÞ»ÃÙ“Ëœþç z¯÷é_»Œ}Øaô»ýí›\ß3ˆž#Øœr\^û/Ó3¨~™ëtöYãBêÏ%­k -IŽki÷’Œ êÚ’;”4‹Æ³.ÒœŸ©N|Ò,Š ¥2Çik*Ž£ -8¶uö1PO=ŠR']¸ês«Î¦•N†Ü~pßßzÈ¿~a¹sÓŽ¢‘ E;BÅ™«²Áû— ÞÜæ½k7ع´LgNáŽÏ ºúÌ t(9O@Ò t¢Ú~ˆ£é=Ë nçm¨]NÛŽ¿­ ûúæš”½Õ.´55iÛ]'sŽÍÌÖ?%éD^o¦d¹€- ¨¨:N?vΩ˜ è†¹|n!Ê®›1ÊJGHŒœÞç§“2|úÓ{/ЇkDÿ«ÇÄNÙû÷gœ>‚ø¿Ã+kŸ#fH$S§?ÖÎìUÑÖs5>ùW¦²ª.Ê>ÿËLPß••b HÓlÀzõ~Ê_ÌÛÓuóJÞb †­8–â©«n†u‹Ï’q¶­³¡45_ªCµ©yè.+X+œœ)÷Ÿîóçï¾æãÏùø»™m]ˆ;³ÌYº†$b£¬ ¼·¿}e‰_}7·¯°Üë Æ/…‹àœ5 ¬sŽ’;^h¥C/Á"`1Ý&¸CKG*øªH]Ô9™³x@µã¿ˆC»Ì)í¥áµ}vߤUkðRYüºÏñò–&5˜åvݤ¤£2™AYùtàÜÍ×=muï\Íæ™‡äɵw· qÚ@ó-;v$°–X–â1Ç2f­Ð¿@ôÆ<@Ì”X&D2Jïcȼ¤´yI›µr>È*ûyœe¤EÐ+™8†”Y³*£¼‰'¡ìˆ$•Ûqȶ*~ò:7°J…29V­T®E­Šïb¹ÌŸý~2Uކ<Ýåóo¿åãÿ:äãÛÊ;›Œ"D˜ö„žŒZújysYøèf¯ÜäÍ«;¬ö{³nBšg×~]sþ¸kì[nš\cF\%ñ‹Íν÷q{-]')Á m¡•"ð«ÊÂxíb†Y¼avnÈC›ÖË4!¥6ÈV¯ß"HCpÐbPl}úC(¡àâÙ.Øópðd÷k.+®¸Ëht™Sá&F I¤D'Hì=gk1¬ŠaٰܼÞÄy{.ÿpdª:ëIEND®B`‚f-spot-0.8.2/icons/object-rotate-left-32.svg0000644000175000017500000002112611417267577021034 0ustar00rubenruben00000000000000 image/svg+xml Lapo Calamandrei Rotate Right 2006-10-02 Object rotate f-spot-0.8.2/icons/object-rotate-left.svg0000644000175000017500000002066411417267577020620 0ustar00rubenruben00000000000000 image/svg+xml Lapo Calamandrei Rotate Left 2006-10-02 object rotate f-spot-0.8.2/icons/camera-photo-24.png0000644000175000017500000000172611417267576017712 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× #ÆG.ŸëP‚ÆÌ]3Øv˜ÂvžÆ2,Êå¿o^â–Ô­D£ëë±,ëæ7ÒZ(¢T¾B³ÊPD"6~às†È¶iª&}Nß5¡f·j¶,“Ò%zl›/ùus Mš image/svg+xml f-spot-0.8.2/icons/align-horizon-22.svg0000644000175000017500000001504411417267576020122 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/view-fullscreen-22.svg0000644000175000017500000002670611417267577020464 0ustar00rubenruben00000000000000 image/svg+xml View Fullscreen http://jimmac.musichall.cz Jakub Steiner window maximize fullscreen view f-spot-0.8.2/icons/adjust-colors-24.png0000644000175000017500000000234411417267576020121 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× 4,g©<qIDATHÇÕU]L›U~¾~ý§Ðv„Ÿ2`ü ,³2Ø1B\Q™Ã©›‹&N½Y 7Mt,251YæÔdf²d]¸1À5Ý „P@ضÀ(ÐÚ–þ|-߯ƒ hA/Œ'ynÎyÏóœ÷¼ÏyðÄßœùâŒNÌâu^B?IÄ#!Lˆi/+ÆåÚµÖ%ÐØøÉQR!½Wœ¥ˆ‹'5ʸ¨EÌ/Ìq}£ŸóÓÇ««O5mÅAn¶pö³úãÛ“£Î~å°Ò¯šÒ×1è½a†.2AôTN¹Ôj»_¶7w¿£»Ó0ðP46žN–©ä£o½ý¦²Ãù1̾ ˜$yJµáÒ·ßQ+ÞÀ®êꓦP\¢P“¼ˆ«),Ó+ƨ¶ä`ôaŒjCa™^Á‹¸šÍ2) ˆQFŒQm[pŒjCbt!ˆQðP$/KUËbà`,ÁâN-¸;y`[ËḪÇÕË7!°òô†s úP\â §Ÿæyš p^„‘‘ðr¶Õ{#ÀwA½”ƒý…Ï"A…¥ nj³V›èNOÇ/õŸžý’¦µuuulHÕŸ«t›Dþ“.6J¾]^Ba‰¹û€$ id*+aÈâÃßæq½Æ7drž/)»}§Ëfèêîhnn&=Öùž— ŠâÈa ;8 ?†q_;h‡ê{Åx¡â>ÿáw ›ðúp¯ŸÁ”Õ£Ù…#¥9äÔ½ }~Qþ†Nƒu€>wwaf\ü™‰Éû«G°(•‚JÑ tç ŒÝZÄ>}ú§Üš²ƒãø ,ûh¹S<59ª6t®­«Àú¤pÔÕÚ ãq­ F• %KàÿŒDb\4š~Ͱ›ºªbÅ»³!DnP‘%4­U«É•ÉÉ 4=__Áâ¯#˜yí(4*9æm^[ØvÞæ…F%‡DLÄÙ”‘JGœËËœ,#cݦ˜a#H›N•4Ãn J§Çšæ‚‘0hö¸hMEr}‹ÒÌÎÀ4»€œô(Ð4»)rÒ£0=»B@Jbú­I‹Åâñz[³þå'÷ôb°§ R£•ƒf˜ Ähå8X‚ÁÛR„Æ ›¶´´ûŠ‹zçì¶7ž¨|Q¢))m2µÛ¡¬èt˜‚ï½T–ãawRXö­ F£À½;ðaÕttóôݯNÕœü¿±›J¨Þy÷Ø3é ;Η¤e¨SË"U)Éމ Üè»Í¤RâñÜ"u‡Û"”p¸)üa±b¨ß@›LÓMß\¸Xïv»]–°Ä†¿!@xjjjtåsåïkåÒ|I„:‰gÆçrÍLÎÝš6[fóòó‹5jmrx˜Lë¥h»?à7Ž^j¿Ù>ÀÀ À @ 6éO aTä«ÙIV! à0èU2 @`ízþÑŸ¼³†5S!ðߌ¿ì c/j?éIEND®B`‚f-spot-0.8.2/icons/emblem-people-22.png0000644000175000017500000000170711417267577020054 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÖ 59÷¯ÂtEXtCommentCreated with The GIMPïd%n+IDAT8˵•OhuÇ?³ÉÌd;;É®MRhbþ´"C•BI^¬âQ(Å^,K ˆ ,l–ƒGZbõ“£»›‹7+”*%@^TÜ&›dg7óûÍü~=dWÆuóGÁ3‡yóøÎ{Ÿ÷æ=øŸŽÑʘÍeÞ®—ê¦ à›¹ôü·ÿY8›Ëܽ191…ã$ð¼ …bž­íÍå¹ôü'gnkŽtdxôöÌô, QJ‹µqùòK”J¥—Ç^{å×B~ýçÓ„Û›ž¯ONLáU=Ð˶Á€P…‡ÝÝÝç·¶7ïfs™®ºÿàÓ¹ôü—§ _rœOvJ˜¦I Äb„aHq½ÐÖ=·n¾Et­PÌ_Ëæ2ãséù;Q¡X«4Â0@J‰/Â÷yôèáy´î™™žÅ4M¤”„aˆeÙÌLÏ22<úA6—yë$á Ï«`™6B |á㠟ͭ爤”G%¯#ªÖ˜œ˜xïXaÃ0~)ó$“)lË&ÊårÂqÖŽx ‚ ð}¿æJKáÅ¥…Wãñø›Žã°º¶‚mÙ\èíãBOß±ˆ¤ð‘<µ+ÞyûÆ»TöØÞÞâþ×Ë”Ë寻ŠçU:-Ó¦æ×ˆ…1 ´VØvÏ«4:¤¥ðX*™bw÷ ƒƒ \D£Aþ¯ŠùΙéYÔ®¢V«‚ç:’]IV×V0 ãñ‰]áº.‰„‹ëºtºì¸¥RéùVˆ,ËbumÇqˆÇã·—®¶Š¸@1i~zücïqˆ’]Iúúûb|ü wï}–¾‹ ›ašAÕjUh ÍÎÎŽ{"ÍÑ//¥ •L¼¸ H !ôïüïíyA5µà_ˆþvôé³BR)µqÿ«å±Œ?ȵBT¿šÏ¹¨°ö?úðã›õbêHaíÅ¥…?|ß'Š(Š­£Ó²ŒC Öôõ॔··_N \|ñÄÔ÷öË(¥<àY Ô~‚oø*T?ÿâÞÕ³ w)å:`íÆæµÝpnZª~‡ô#YûƿܺÅ:kÙOŠ“F(Ï^IEND®B`‚f-spot-0.8.2/icons/color-desaturate-16.svg0000644000175000017500000001465411417267576020630 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/red-eye-remove-16.png0000644000175000017500000000141411417267577020154 0ustar00rubenruben00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  šœtIME×Fâ HtEXtComment(c) 2006 Jakub Steiner created with the GIMP :: http://gimp.org#ÿX@EIDAT8Ë…OHÓqÆ?ß5ÿŒÄì¢fJ ¢Ÿù¯@é’RàeF&X^ÊCCŠ^ê°Z¤ÄÊS˜bYá!¤¢Ôœ¸$,¢áÚLqj s¾]¶1uÖ/|ßïÃó¼ïó*"Àf·FÇ€o'ßXßü1øVÿk@7‘‘ÛXßìÐE CâL-Î!ݶššóLØìÖœ½ 4 »¨°ó}'ƒ]ffHMMfÌDVfnÈ$’A÷ES9š¦q(.D¤IaÓ/hšFrâa€‰] –¦²¾g=ø|>ŠÏå“^b#½ÄÀÒâ2†Ø|>.÷O,M]»Æ‹HŽˆôØìVq»=r²¢C.YßÈ…Ú§¢™Údèý¨ØìV‘‡"’¥ßi ”rŠÈËK“çnËíjÓ $Á'‹kÓÀäï˜y V)5©ÐÙÀMÀxÇ•z—ÚÚÚÛ?] 0ÜY׊,®;šÆµß ”º   ˆ‡b€xÀhœö÷U–•·ªQJ]Û§bmÓgi5!¸±>09!<†¹ª…ʲR¦ç~PPÕ"åçO35¿B”NÖƒ‰õ@Q¸¸ÖÜJÝÃ_f8[x€¼Œdã ô¾ØŠ‹Y[ Þ|××}~V×Cý¬g…üôƒÌ/,Ó38Ž×åâmû­”ÐÑð",?5×Û¸Qadäëw>ŒŒ!²µ!~ÿ¯?+£ÎÞ;¦mí€%HxTµHÇà7 æß ºSð(ú^ ÿÞKÎãç¯ùþ“P耂*(IEND®B`‚f-spot-0.8.2/icons/object-rotate-right-22.png0000644000175000017500000000173711417267577021211 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“tIMEÖ ,5ÐùÈîIDAT8”]h[eÇï{ÎIÒĶ6acm7«nPÛš”9U‡ ‚nz!XÛY˜‡Ì‚‚S/¼P†LÁì¨cuaƒ"”²Í2Ù‡¡©ÃÍVl5¶]»vͺ´M“æœóz‘צ Žð\œó<ÿß9Ï×+zëQä)ERhr di¦OƇù±îfn\¡#²ààçýK=fkn’Ô?5yél"þû¥)•¶OÐõ¿Áö…×îy4xüÿ&DÅã,L 3t¬%‘º3öI¨Í<¼XôXI˜»‰î¾ú>ÆB”êC§½¥Bo÷í×[î¼8)!Q£?ÁÐiªšŽúÜòw#õì\AU ÆVâ¡FΣîþB©#Êwaêå |Ötcskj“`yã—€sFqY"°uXýô›Eb*ŒºÙR¡#77ówû;3ñk_,ÔLQ(•¾*‘²I в±å/Ñ3¨ÄQ¾“ù»¦l}ëdMëÂËùôklg4ØfdÎL¿7ÑõEB¬}¤Ò@͎ப(±»~åæ©ô©Ûán(y$Ö 0çѼ”eîlg4Ÿò¢æé^lËòÒé¹/¯°]*./ùºÛBd B©éöÑ[?·¤ñ¶`ÇÖã\ÉÛ¼HϹËÖvTÐãZ¢&~Aݺro2ÖlGj@hØ–ÅÀáÇ’©Û#/…Ú­3Z>ð׿2p`ãl|æú¹:ÿ¶çu¢¨éÌKB3`~•Š¡ŠÊ<²/™ÿóPè;³=ËÈ ô¯úT¤ñÑXÀšÚRºû C%ÆÊüo2(Z…¨¬cäøÁùéþŸ¿©m[øp1 ,WÖ:úì‹{WGƒÒž¯*ÙÖ¨1; (p•"Öía¬óÈÂXÏ©îgڒ͉ÌN(òl¢p€>àA`P±¾„ WÜ}±®Óv솲~ûRÙwúU¬ûÓtøÕ¢Þš•N¼ÏÑ/ë›<@1àÖë€õO=ÌŽp£qk¶÷„¥j6Òa…÷»Ç_¨f‹çwt‡“·YYš&iûüCÑν.¯Ï5xìàÜ÷×Sû¾½Æ`VŽ-ûm dæ{±i€8úµ»*8{yœg_ï&ì@[°sK±øè€ð:)–:u,kQå<;~7y­àí–£åÄ*'å¼w1À¿tXV Û ‰IEND®B`‚f-spot-0.8.2/icons/mode-browse-22.svg0000644000175000017500000007272711417267577017601 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/color-sepia-22.svg0000644000175000017500000006167611417267577017574 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/object-rotate-right-16.svg0000644000175000017500000007701611417267577021232 0ustar00rubenruben00000000000000 image/svg+xml Lapo Calamandrei f-spot-0.8.2/icons/mode-browse-24.png0000644000175000017500000000117611417267577017556 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× /ö8 IDATHÇÝ”±kQÇ?/é]°V­ Ò’r6+\‚Z,"ˆâè E—:X+t³à?pKÒ ŠÖ‚“âf]\„êæRЕ H©½¼wï9ÔB.1‡¦ƒßéÞ﾿÷}ïw÷ýB!r¹\Áó¼Ù­uŒmÛw2™Ì\n£âº®_¯{¦¤”Æu]?, À‰Fû¨V¿£µÀ÷}”/Q¾ÂIaŒ‰„å6¶póúe´Öx^XÌ&‰ áþç-sX)\œ3_jZ7 L¥6¨Ö”ÆšØMšÛfog³»gçÌŒM´ÆÝ@£Å‡ÿügf¾o¾ÜáA¶2)žHëÌ["wúøþZ#­v¦ €À·ÁÜ\ó¹¾%@<‘ÞhÖÐÚ @šmÁ‰ÁOº)áí,àÔüXt¶U¿Ÿ>Th0\<}|ÿrÓÄiº.~æ‘Ý«õŒw@‘€nqɈrÜ9±r)3¸Ü°ÀXC@<‘­ îß¡³Ú™Ÿ{Vé÷Kéݬ]ìZÔÎ/v†­Åm¼ÁJ6е§ jPÑ·xo8zx°gབރ‰6Z×èZ}§©Õ·‡ÍB׺vCÜO¤{šm‘·&2]¥Ç¸P1¦…þJª+E«\¬ÉY0ÓPÐÀ*»¶]õw׳ ß,rw©]¸7 Øj¡ÂÛH…[f©¶6pöV€ñóïËCO¾Ð`; øt7Â,»Âåœã4_A¬”¯DëKå6ï·\' ®E@P¹ÕÈìÜÒ./Ò?ì{´³05úãÆ:˜0¸PŽ™¦æJ×3Ü .1æù¸gÐB-$§²}’K­eý‹õRÁŽŒžëÜ}éBÐ.­°—{}Bp1¬I÷Ü?ê žHû¼½và¦__ D|N1á«Ôý4_ R©4ƒ¹+˜³¢Wï./ž±C!?¥°,Û†¯µ• ›½BlzýäËíÓÓ#s}>\çž’B}M ÿþÅk)x@JÓŽ9ŒkÝ·Ûñû)‰‰Ð¦—ÝçŸ}}RvòS Ouꀨ“¤ç}¸Z,‰íÝTœCqR©@y^`S“xwGµöÆØØ›ÞÍ7¯þMœ!¡”U›ŸWn&BçœM „8Pê‘àçÛn8I`ˆêúHûÐ_þ4Wœ£žË!›LV•ßm¹£% yŠjÚÙh¿ŸiçðÊeä®\©(!žFþu¯Mr"¥iåk½½ê×®.•b¬œ$äùÿ´¡' y%Ei9E©3IÈ[wä¯a’w& 9ƒÿküF@—ac8¸IEND®B`‚f-spot-0.8.2/icons/emblem-event-32.svg0000644000175000017500000001734511417267577017732 0ustar00rubenruben00000000000000 image/svg+xml Emblem Urgent Andreas Nilsson Jakub Steiner f-spot-0.8.2/icons/camera-photo-32.png0000644000175000017500000000315711417267576017711 0ustar00rubenruben00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ìIDATX…í—]ˆ]WÇ{Ÿsî9÷ÜϹs§™N¦Mk›Œ¦§"&j¡Œ6¬/¾ú  ˆŠà»`)Ň Ø!`B‘¦¡‰m‚&±q¨ó‘Læ#!óqgî½çÌùÜÛ‡;™Þib3ƒh|p=í½9g­ßù¯½Ö>[h­y&hôÿü/˜w/ÿä¥o+•þXkíþ;3›( ×Ç¢(À²2Äqk, é ä¿ÿÝœØp³Ù!kæ=ÜnÍ’$Á÷}\×emm )%Žã033C__–e!¥$ C÷ç'_yx@FöÚä5ªÕ*§NB)E6›¥¿¿Ÿ|hà8ް¬ÌƼÙl¦)qS©Tð}!‹‹‹$±ÎB[ <Ï£ÚÕÉü­yz{{9zô(¶msòäIòù­~Ñr€¸3¼~ö ³³ÓärŽ}å•JçÈèè(ccc(¥6ÖÇaß¾“¦1›’$¡Ùh244„ïûœ>}˲8tè—._â­·ÿD…<ñØ)˜š¾Î#»˜˜çW¿>Ëðð~ž|ò4ýÓD&‹‹ ŒŒŒ`ÛöÀÔÔ7¦§Ãp3hþ6z•±ñ÷ØÙ?À‘#‡¹yë&øãŒOŒS騠5Ü^XÀ<&¯Í0¼ÿÓ¬®ÖJÅ;ºb¥¾„ã8Øv–îîæææ6¤ˆ¢ˆb¡¸1¿kÇ5 æçoqùÊ%VVVX©¯ÒÞ­ðÙÏäù‘¯‘±rù<¿9óÅR™›·¦±Ì õF“pá6…B‰|~Ç&ÿ¶mS[]Þ˜ßÕÃ0>¸¼é‰®j•$M±m‹ý'×§&(äJ”Šª]tU{ˆã˜¿\¹Àj}¥‚ÈçÒ•‹ø~ó_Üׄ@JIWµJ>_ÀÎ8Ôj5 ¹"KKK„aˆF³²ZC§‚Gv²°´@Ók ¥¤ÒYEˆ÷Ãn`ó‰)¥eYÓ³7p³9<ßã¡ÝÌÎÿƒ÷&oDšrG Ïóè(v²R[Å÷›T+È6€mw!À4M¢(B)Eš(‚µÅb™½ô2 ¤£ÒÉÒâ]åß|á8~ÓÃq²xž‡ã8H¹M€þ3(Åq£R…”?ýÙ+¼ú‹S|õ['øí›¿G 0k(å\ž9F’¦x~¥Ô¦²ÜöкÕ3¢($MS4 Ò”‰±1bYàwo¾…qûýÖ¹Žn&''H’­4Ž%ƒMe¹ýƯ5q!¥XOAB’$8®KX›# VøÆ××x÷úN–—käóE”R)Èår˜¦IÄ›íH÷‹"Ž¢("Š#2¶ÒŠ#‡óô3ϰ·k…«7Rí饧¿Ÿ/|þs!q³YrnÇq@µR*„R´jâCàö= ”"Ž#‚0 Š"Jå–iñÑ òÜs#ìz|…j•fóÔSà ììÃ4 zûúp݆ç{H –eR©TÜ=ˆ”©J©¯zd2ÖoÝwJ–eÁ=ã†eZT*e\×m)¡bÒ4Aeâ8!‰Ü\Ó4)—Êäóy’$AE³ÞX/ÁŒ—M@­k¢úú–ã›»®Ë³_~–b±„F¡•Fk ¥…FcY6†”d³.¦”Hi ¥a(•†)žç!„ R©P«-cÛ™ˆM êi¢¦‚ Øý©ýÃbyy‰ ©vUÙýè f]¿væ •$‰jcÛú…B´Î˜¶oæÆÜ `Á"`ùü;ï|ÏÌ¿Ü5h <šÙ»wˆz£ÎÌìŒ~÷ê_×ξ~ö;çÏ_ÂõwB`m]Á­X;°Z÷±&Zr <øØž¡Ç¿ÔÓÛóEÛÊ )­n/--½ýç‹—_=wîÜß`]±ð¶¥ÂÝÏj­µí%&„0,à­Ý’¶Xk½Õ¯¾¯‰{Ý Û“þ_ï ðß´~3zàÿ4þ”äÌIEND®B`‚f-spot-0.8.2/icons/view-restore-16.png0000644000175000017500000000107411417267577017764 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆtEXtSoftwarewww.inkscape.org›î<ÎIDAT8¥“ÏKaÇ¿ó¾³3;«»¬&H„Émó`Ê$xކB:w«þcºÖeͽ,]ŒˆEYˆNA0Ç#D$((#D4%Zgm™yŸÞê¤îl¾§—çù~?ÏÞW‘Râ8G=ŠÉ²Kº®Aó¬àæb.×ùX×µA"ª'<·ìR÷!c¦0Z.g³/E)ÔëÁ”ï¹a"@Uy‘s¾`Ù¥ž½ªœó/晓wÔ”jÁvÙ÷ÜHH ½7ßsŠs>ß{ýѸªò™¡bÿÙ”–2ÁöÌ×Wc/ãbP©TÖ‰ÈÜ r&qþ‚…tZ3¿¯®ßº| ››?±²¼öCº{ [ "Óqœ8øäí8gÈ,ä ‚ Å… !èªï¹[-#‡O_ïÞ ŒýnéÓ7H)ç|ÏýxxÜX%"÷KkXü¼º“ظ8Ð#c\Éߘ˜lYxLb@íÁM4~…¾ý ïÞÌ¢Fh6#DB@QØo×,»tË÷ÜZ €ˆE˜"1yßF.£!Û¡ãt× Ô¦«p'ñq„a¸Óò¹®XÖx’/`F‹€ˆþ`ŒmT«U³ˆ1¶Ñ.§÷;ÿ¤¥¬‡Ë% IEND®B`‚f-spot-0.8.2/icons/emblem-places-24.png0000644000175000017500000000255711417267577020045 0ustar00rubenruben00000000000000‰PNG  IHDRàw=ø pHYs  šœtIMEÖ)2.ê IDATHǽ•OL×Ç?oþí–Å ¶1Äk¨›†˜Ä²e#ú/mZ¤%7‘•SÛ¨‰åМzàÔSÅ­‡žªžÚ‹UEê¥ZÕ®e‘„:&vLM-c‡%``Y–]vvfÞ¼79xìl NÕCû¤¯žfžôùè÷~3ïÁÿxˆ/[,ŒO `LñuË2¿£”> ¡mšæ-¥Ôe­Ãà½âÔ„ÿ_ ã“O˜¦ùnáˆ>;\KtwµDwn‹Tºù{/q¿TÕw‹k­O—7KJ©W‹S×÷㘿Ùsÿtþ…VaäÃq]"a}H2Q¤)‡iú'ÈÈŠÑ“5ghÐï¼³(”<6Ï~å{Wj Ã/Æ'_)ôªßüø\9£¢%+¬Õž#é)ÕÆ®›Ç:’W‰;W9Øõwqö™–]®öÙ¨(«¶ð×ËÆ'»1ÿÒ[ç§SÂl!Ä:_ퟦÚ|–` ËNaÛ)ë},;‰iÖéH,`ˆ Ž-Ù³óýgG¿ÿ^mábé!Óh†ñ»×^\L9ö*éx‘ƒ¹9þ±tž]7û aB Œ N²ÀPáýù„!À6WyýÜí¤a(ŒOÚ{…ñÉ|§÷ü‘îY@i“~Âry©R(¥‘Ráz’¡'.põŸï0¿tŽ­f0É¥?a /vÛ¯‚Ó§†Ê ƒ7ÀFmðXiü Àó%žçRÞîãıß>Kë£|V>I'¿¶šÎ<„Z_|°b¤¯g#vgõ Öb[1l[#…@¢LÍÓ…?Ó“½ŽRš'ûþˆï+J[‘Åzm˜ÎŒ4 ÃxnOBˆoYv’”sS4𥉔 _x2Àó\/ ;;K(‚@¡TˆÖšŽä*÷+CäÓ7øa>»·h,¬¼‚åÜ¡¯ëЦ§¼ý4žŸA™Ãø2$f)´QJ¡”&ÔŠ„½Á\ñe'ÜÛÝSA¨õåÍj]¹ò)æ–Fêÿ §ßåÔà…ë=¨àòõW¹»2ÄÍOG‘”Òh­É¥— tŽÊ6ÀGû5ùZ¥Úh¥béØ*¶Ñ@kÍ¡Üm¾;ükºÒó¸žd­’çâÇ瘹õ<õ$Ji”Ò,•ŽÓô†Ù¬4ü0ÔWöÌ–Ê5;·Ã4Z ‚@šlj…ã½Wp=IË“¸¾Äõ$+åþG‚R­Ÿîl‚åµÍ˜Ù#(NM”¥ 9{ó^ëXïSLÏ¿@>Øç PÜ]xv#‰ dÔpMgº‡{Å5Yoº—ŠS3ûþÉ„áÏ‹+›÷«µzˆ1F}·­CÖ*=Ü])|RoÆPJ³Õd{g„ëóÅ0 _ÿ—Ó¡ý¡85!ekûµ®Ýn)ß £€¹ÅSl5:‘z”@i–7Ÿ Òø&—ÞŸÛ•»Ûo§&;ìL Y_œnXéÃWÖjá·{{¶Ó¶=`´ÔËdqË •p8’O3ЛåÐÃ|xã¸ñƒV½¾~ç§kÓ¿ú[Ä1 èö 'Þ3Þ‘94òæ;ñLþ‡ù®Œì>uä:,Ó0¨Tëº\Ùv7«M»Õغ´ññ…_xµÏ*€¥õpnØ@¢MâvæPg¦ÿ̰Óqø„ÊŸˆù;›7e}ýVsõÆ-¯Z,G0¯MàM@ýû•i´Iœ(v+Z@md?’ìDsøŸ.}3‚>„›QD\A$¢÷ÿßñ9žç| ÓÁ½IEND®B`‚f-spot-0.8.2/icons/color-desaturate-22.png0000644000175000017500000000142511417267576020602 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<’IDAT8µ”ËKTaÆß¹97ÍDCñ’ C‰Š¡¨U»2qÕ®VýQ´©ÜÒÊE-ŠD$‹hSH¸²ì"]MPGLºY£3çÌùæ|-œQÇ$tÌÞóžç{áá}¾ïJ)¶Ú–¨Fö§áT[ÊNk&™!Tö«–Ž2•ÇV˜ÂuG_¶r„\Ýì»}Oy¸2”i\7+%®ôR’’éåÚRH¤L‹Û´ßí7ÿêØÔ5,SgòK‚xÒa!aOdò OÚ,$â‰LÎð³'aêËÎ-­Ía`nÚוЀ&à}¥1ÁØxôÿ wuvß"!}ŽW¸Öv•׃C›èêìþ²R´_ogW]/žÞáfG;ï> ç-l¬$~¿sgš‰ÍãþÃg|èaèU!•áTÕÔæ/œ…eZœ>q„ù¦}<éíg|´—éQ?E• ””Wå/¼TÔuŽn$Ñ¡oà#ÑÉ—ÌO¿AGð—ç/œ…‚ý{ëØSWÁÛá(33C$ cì«€´ç­-¬”b= )R[FÍŽ £Sß™‚=T$’©œgž³„6²éªKƒ„«Ë )_|~íÚ7ZZ›Ía¥ÞªqÖƒ’”áðnÊÍ€±–Öæm€BÛhÇ«*ø ‰tåÑ®Îî9CaE+=B¬š¦­º®cÛ6J)z<Š ! õžç‹ÅÒEJ¥ image/svg+xml f-spot-0.8.2/icons/f-spot-loading.png0000644000175000017500000000446311417267577017735 0ustar00rubenruben00000000000000‰PNG  IHDR00Wù‡sBIT|dˆtEXtSoftwarewww.inkscape.org›î<ÅIDAThÕš[lÕÇsÙËxÖÞ›½·zw„DŠˆ“È$–ÑHÁ´*ïä‰7Ôžª>R•'ÈcZñÒúEôÁ”"ò’Š*B@Ðà$Š7NL²ÞÙx×ÞYÏL¢™î®w׻ޡå“F{ÎÌ™ïüÿ络ó-ضÍOYÄÿ5€‡•Ÿ<¹Óƒ7ß|óײ,Ÿôx<Š(Š8€mÛØ¶išX–…eYëúNÛ4MlÛnº×Únw¯áýj­VûÝéÓ§OõE8yâÄ ÅëõvÐ-~ú‰­vc{õz]™žž~C„?Ù¶mµŽëHÀ¶mÅëõ2??ï*¡íok»—~/"ÃÃØ¦éB@±®’|>¿t:^laaa€ÑÑÑMic•D_ÚMÚ«ºY¦Þv Ah}ÞVQOèx³`{ÓË; X–Õ¤¤W­6 ½& -Ð8iãïfÜ©Q:Ýogùnd6mÖ€Ýxc?ŸÏ¯{·]Rx(r6«vàÛ)Z­†¦ihšF¡P@Ó4DQ$“J¥H$$“ÉŽï·A~ 4N`YW¯^%—ËF ‡ÃŒ1>>ŽmÛÜ¿Ÿb±È7ß|C±Xd×®]ìÙ³ÇÝÙ[õ¶.\7Ù@+ØÖ~©TâÓO?%päÈjµ•JMÓ\WQU•¶mÛÆÎ;¹qãçÎãСC„ÃáŽólI 8ŠÚÏår\¹r…ññqÂá0sss¬¬¬àõzñûýÄb1$Ir ݾ}¿ßÏŽ;Ð4óçϳÿ~vîÜÙuµ·Ä…ZÁû|>®^½Ê“O>I©TâòåË(ŠB&“!“L& R©P*•XYY%—Ëñõ×_‹ÅØ»w/—/_fÏž=ܺuk`'°»IÏhl[–Å|À£>J©Tb~~žX,F*•drò ÎðÝwÿÎÈÈ““‰ÇcèºA(¤P(ðÕW³D£Q²Ù,ï½÷ÇŽscbK]¨®]»†Ïç# 1;;K,ãàÁlÛ6†(Š®Ë=zŸÏ‡(ŠØ¶×ë!“I ‘eŸþ9™L†¥¥%fggÙ·o_[,Ýt,hœ3~£8©2—˱{÷nr¹Š¢L&˺5ƒ,ËH’D4EQ—s*££?#‘Hðý÷ß3::Êõë×Ñu½í>°ií”išF$¡V«±²²Âðð0LüWaCñÓ.ø]€ÊáÇÑuÓ4QU•B¡à>ßòØikšF0t³M<Çãñ¸cœêËiw›Üã‘ ‡Ã躎ªª˜¦I6›mÒµ®hîH¡P@UU*• Äã1hc9xóæMžyæç<÷Ü/) î˜FR‡D"®ëx<ž¦º£qÞ‡&ШLÓ4TUeuu•`0ˆªª¼óÎß(‹.xÓ4yûí¿ò 'xê©§xýõ7šÀùå¿yë­Ód³Y ÃÀç󱸸èÎå\YqS;±£T’$FFFðù|nàôÑÇœ?ÿOÊåw1 ƒ[·nññÇÿâ•W^æÙgFH§Óˆ¢Ðd½Æ9œyû&ÐîL‰DX^^FQ*• Õê*?~QÑ4W_ý= ·9}ú/ auªÕUNú#ÓÓ/“Ífxÿýpôè$I&ŸÏãñx¨V«ŒŒŒ4ÞœyÛ-¦#]È4M·N§Éd2¤Ói¶oßN¥RAQVWW)—+X–Źs瘚ú“““œ={†T*…ªª„BA‰¯½ö.^ü„—^z Y–±mQ¹sç²,S«ÕPU•ùùyòù|Ó‘û¡³PãŠÄãqæææ…Bܽ{]70Œ:««UΞ=C,cmm­É‰DÂ<ÿü¯°, I’b±H0¤Z­F›ÜtKsޤR)–——E¯×ËÜ܃ƒƒLM=‹ M–s&oÍR–eG™™™A–eLÓD×u‰„K¼×} ï,¤ª*ûöí#—ËÇYZZbii‰jµæf çúì³Ïøî»ïÖÝbnî:‹‹‹ P(Èf³w®^kçž 4’xâ‰'¨×ëî®üÅ_°°pè7¥ÒO>¹È•+Wܾ(J ÇøöÛoùðà øý~–——‘e™Ý»w78óu“ž²³Á4ž?ÎÌÌ »víbhhˆ‹/’J¥xúé§‘eI’˜žþ ‚ðàl$Š¢(033Ãââ"~¿˲(•JLMM1>>ŽßïzKŸp|¹SqžÍf™œœäÒ¥K$“Ib±÷îÝãÌ™3D"R©™LÓ4Éçóܹs‡b±ˆ,˨ªJ¹\æþýûLLLðÈ# (Š º16M [î…Ç€F¹pá¥R‰d2‰mÛ†ÁÍ›7¹ví’$!Ë2@Ó4¹{÷.²,sìØ1¶oßÞTV6‚( tÊB}UU#‰péÒ%nܸßïÇï÷ãóùPÛ¶Ñur¹L­V£^¯³cÇ{ì1Âá0###M¾ßøž t“ÁÁA<‡&S,Y^^¦\.S­V¡¡!†‡‡‰F£$“IB¡‘H„p8Üü–qãG'çrvJ§oY躎aÔëuwDñAP{<E¡\.S.—©T*.ÈL&Ó×Ê÷D E‘P(äþ¥¦^¯S¯×ðz½x½^dYF–e Ãè9Ïo$f¡~ÅYm¯×»®”„æíVèk#{itÖv?y¿U~ý€ï4¶“l*lÛ&N·u çy7WqêÞÖû›±Ä†ŸUº}‘n'ý®vkÜ/‰ŽE±Z­V•`0Ø“¢Jt]G’$Xk÷¼#I’~ûâ‹/ž\[[S~0t=ˆ$IÆÒÒÒŸ{íž ™Jˆ뿃ÿ8²Æð%Û¶×åö ü¿ËOþŸ=þ’¢ú¸F÷•IEND®B`‚f-spot-0.8.2/icons/camera-photo-16.png0000644000175000017500000000110111417267576017676 0ustar00rubenruben00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× ±Õ{ÙÎIDAT8ËÍ’=haÇïåB…ØP±‘;µb­J\%˜I©"((Õø…ƒƒ“CQ„º¨!i­ˆƒJ ˆCQE[µè X+âÇÄUîR<›{/ ¥÷8õ¤V,Nú_žgxþ?ž/ø×Rý— g”âÊ_•:uîl_ €Á‚ÔëSR¯OI¹\–Z­&Zk ‚@šÍ¦ˆˆŒŒ>Žb¥Z‘Á‚sÄÚä$7‡®cÛ6·n—hL7øøé#OŸàyÛ¶n'4k»ð@p)ÀB8£y3ªªî²€l!ÄáHá á½úSÎÌÌž¹Ò~™É)?:Ž K*Z(@\|"_»aC {ŠÞ@ZB,C¾aÂá0^¯!DyTW!ì@QSSS¡åvóö¬,+&S<®c ˜t,Ä$’q›žŠývêÎyØ÷Ä.jO5}Õqú¤G¾uƒ¢(ãú5ÞS”^ W1 tŸ|ëM[h9´«ð~6_2ŽÌY>ÿ²ƒi,lÞt'i›lù@«¢(ïFcŒêÝàwƒÿª¢ØE);úò±Ÿœ…´´ùÌ»ŠVí×'ì£1z•… ÿÌ|ÊzÑÕ'vC=PÑ/så¯ïkéøuëñbWýÞaº®ùl/¸vÓ;2‡ªÁ¤b0àŠW÷XAÙ+%ÏpÅ3€sçŽ?pÜ•†%!–OÏ6¦ÐdÔÅ* %Ú”ಆ>¸Ú»11‡Å¤gÄ?K]Ë÷\ÅžiâCdàô‹pÎ%‘ÂóÐjÒ~röBeŽ´÷ùðöüÌ O8$4m,˜ûq©ï³†_:‡“ܶ²&ÒAû^È4@V‚cÐúT º¸x·Ãnø¶s¸Àùp>]½×Xé®õö\èoûø¼tzNŠ…äZ‘HV$)@¼Äf³óà‹5Kzëa€ö^Ý&Yå|Q®@„øªÝÀ40%>Ü–€à¥ÆúšXm¨^^;ŒÊ?Ú„ÜwKÞH[Ÿ image/svg+xml Lapo Calamandrei f-spot-0.8.2/icons/object-rotate-left-32.png0000644000175000017500000000271711417267577021026 0ustar00rubenruben00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<LIDATX…Å—klUÇÿçÎ̾úXh(¥6ä‘” ŠX(EAÐ4ˆ M jT‚¯øE1±bˆ¢ ¢Á` øH€ª41$~€€`c)ÑÚ·•Òmi Ý÷ÎÜã‡Ýmg—]èCÃMnfv³sþ¿ó?÷ž½CÌŒÛ9ÄmU þWjJÈâ·£P±L1U#CŽbÅþ–™ƒ$eA^9·àØ3dÍâ=%#㥌飦8¬òH;"e|ÜgšÞ/ôõ5œÐ€:Pµš Ó’S¾ÍZ½mŒóþ5*®7½õàÞ3à–}0\D¯1±`@Ôÿå°N¯¡T›ªìpÎ\¼*{ý¹š!y\ØX†¦j¸—† fjÈ5%d±§ZÏæl(ÏIšöІ½à«Õ H@³2$Èfó}Ð Áá;LѶO,Ù’œ;[åêÀºPÑ"l€ÌâR‚#÷ºlèÃs j-J¾kîói 7X¸f' ff–a>°:À™u”n³¦Èyy¿/þH? Úo°™b,ï/EJ ‡ã€U±ìÌ^[–¢øÛÁWÏ@ ãA)9€– (V4Ö©‡’: ¡­ÆWÉÊR[–2}Â-=0 ÞÕ€Ìø¯»qåÀv·»å¼ðwµÛc·ax$‘:W9gÎ3àï{;@Ñâ } zªO.VlûÇðùJÁ8›?­ØÄòf±W!îM49 ½u€#’u‚^BÛá{ðåçïg÷ â@(j®êp{;Ø€kN¸š~cÝãú,ïàÅ AYЦ¾«1õÛÏžÖ:³¬ŠøàXjºÁ`Ȉõ$ è‚á镌 j-}`}\o7 ‘ @ ¬…@8Ðgaàûªµ1ÿ¾„&ɘ?k_Š—¢ND›IT·¨‡Òï[ºtÂÓ_Ù 3äé·À½õQõÄ=¥ ´A€¿ù8×~ød—nè³g•ó…DPì‘ìØBRÓ²µ#™l˜?fù‹üý°» AÀÛp0ÔÙÌHsŠ 1ãEèlÅ_›ìå€kN^9×'âÉŠŽ²Þ`ñå#»ª:+7iÊS€ÅJÍ:°¦…>«v@¨!ÿ5Às4¾ºÏºÍ‹û|>WÑ­Äã:5%”¬§XNÝñØkSÓç<®Ê¦C@°/ÔR¥r$Òb¥7FR.j?zÖ}©³çÑ%8 @F&'Š» (´¼ý;‹üðÉIEQ³œyKTn?èÞp_CHäÌ…a›ˆºÏyš/÷¬Zþ#ÎÐÌDdĹÁ"R*@”ÍCæÒ\ë‰I+^Ï5mŽàî?BÝ0œ=Ù2 +é¨ýâ oCkÇ +ãˆY€{5CDPÿƆbšâݹÈ*¾ÛrôÎ’ÒÑ©Sf ¸ZCÙ+vèlCÝî7½u-W6®¬DE image/svg+xml Lapo Calamandrei Rotate Right 2006-10-02 Object rotate f-spot-0.8.2/icons/view-near-22.png0000644000175000017500000000123011417267577017215 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<IDAT8Õ•ÁOQÆ¿÷öµBÁ›rÀ›$›—êE®†ø?ñ‚„D‘ãAo=›`úo@´¥ê¡íö€aK³5˜"§fÁÄn\Únûž‡²Kwû–¤&œÛ¾™ùÍ7_¦)Bà&‚Þ€dòíБÍH$ú‚R:6,„sþÇqÚ[àÍ÷oÎ<0èÈæÂ“§kªgÿ(pìèH_û”Þ€×XQزªÆ™eýç\ÚyüãS÷§¤9J)T5Î2Ùô² v=¿\IÚhT«H¥Rèt:Ò|_߸7ì*~™Ìgœÿ:Gîk.´&ØO@ ììêõ:u°½³ ÇqäX!РsÎòÞÐF£M+†€ýªéUBNÖJšï{/·ª¸?(¼AƒàÚÉ LÓô¿Õjøyz*Cû=!¤ŠKµnär{RÅBnÅ ààÛ\(Ñív`͵VÄbò_w4z Š¢5û¬÷$·âùÒv³Y˜g& ÃÀôƒiLLÜÅüãùÚ ¬?ŒÉÉ{X|¶XY]Áú«ué²þk­.$W˶mBÊÇA¹RA"ñéÝ/8ÔËhµZ¾BlÛ,÷]®ñ±PÈ¿L$FGGc¾&Æ"˜›™ÅÜÌl¨Ö‹ ¥’ÖæœoùÀ i¾+Wôfõ»±Ê…¸=Äþ½µ ±œŽóÑvÒÛâ¿ûÏû …Zø¦0ç=IEND®B`‚f-spot-0.8.2/icons/emblem-people-24.png0000644000175000017500000000171211417267577020052 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÖ 6ž˜dmtEXtCommentCreated with The GIMPïd%n.IDATHÇÕ•OhUÇ?³ÉÌt;;É®MRhbþ´"C•BI^¬âQ(Å^,K ˆ ,l–ƒGZbõ“£»›‹7+”*%@^TÜ&›dg7óÞÌ{=dWÖ0›.zÌ\~oæ}ç÷ù}ç÷àÿF«…l.óp ¸XOmß̧¾ý×Ù\æÖèÈØõ©Éi'€çU(ólïl­Ì§>iW #êËGGÆnÍÎÌ¥4±X—.½D©TzyüµW~-ä7~nG 3"wmjr¯êÖX¶ „*$8 èéé9·½³u'›Ëtן¿|:Ÿ^ø²]‹Ž“àñn Ó4 „€XŒ0 )nк÷æ÷›Ñ]-óW³¹ÌÄ|záöÉÍb­J Ã)%¾ßçáÃçкwvfÓ4‘R†!–e3;3ÇèÈØÙ\æ­v6=¯‚eÚ)ð…/|¶¶7Ÿk “RÛ£Ž®vTcjrཧ †ñK¡˜'™La[6”È@P.—Ž“àè¨vÜ!B¾ï7]>U`iyñÕx<þ¦ã8¬­¯b[6çûú9ßÛß>2m»è·¯¿ËaeŸmî}½B¹\n¬U<¯Òe™65¿F,Œa` µÂ¶ãx^¥á¨SÆSÉ{{bð îÿð}­PÌwÍÎÌ¡öµZ 8{Æ!Ùdm}Ã0µå"×uI$\\×¥ËíâðàÐ-•JÏG¡³,‹µõUÇ!ß\Z^¼rZg„M)ÍO~ìk….Ù¤`€ááa&&.sçîgià»(3 C3£Z­jíA£ÙÝÝu[¡Ó)©d àõ¨ :€”BÿþÇoñ¾ÞÔ ëþ…îo¡ÛŸEJ©Í{_­ŒGü±(tõëdœPÀÁG~|£ÞxÝd{iyñOß÷iF׌­›'t'œìAÔ"šþŒRÊÛ?('/¼x*Žýƒ2J)x(AçS€¯Bõàó/î^igþK)7«Q…Ñæ™a7½ÔŒBÕï° Kƒ‚hãœá:â¨ÕüWñ&b‚Š:‡ø°IEND®B`‚f-spot-0.8.2/icons/tag-new-22.svg0000644000175000017500000003156111417267577016707 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/f-spot-22.png0000644000175000017500000000320611417267577016535 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< tEXtTitlePidginÆÐ¾LtEXtAuthorJakub Steineræû÷/!tEXtSourcehttp://jimmac.musichall.czifã^žIDAT8µ•yLÓÇ¿¿£ýµ´…ÒƒK„j+Ä*ÂD˜ò›“Ícžèð˜sG¦3‹Ñd1S·Ågœ[6]B42u‚ӀТ\Šž-…ÚÒBR®¿vÿ(ÑM—ý³÷÷{Ÿ—÷Þ7ßG°,‹ÿ#èÿšØD¾­ÒÈ'(b­Çëû6Ø"-P(Î{Þ”OþLÏd„xY_ZÙæ”¸ÐÇ{?]°[,ä©¿X3û'ÄŒu·ñ³·µºÞ¼®–xÝ*ZÈÌMÒ@fK¨pº=áÃa•ëºóƒÒh4¯@[ùó´4E•dÍTO<°m!53>œâÓ€ñiî?2cr´¿Õcqf Ò“UTn†–q¹¹Ù-=;mþI”ÜßqóµàQ&æÇ­«fLJÉÅľ_ÊPy÷ ì¦!ø{8\$d‘bœ¼Øñ0 ³ÝÉ*)b£tQE+MQH¬.>vP£)x¬§æF‡ÈÅG¿ß¶€7yB0Í…,X„Ó7ÁØÓh¥< sß 0`ÃõÆ'HŸ¦M‘D·ïDm(m3¾r<†GïÝž7›âQnß逾êBŽïYŠÍy©Øsáì#ÈNU¡ÁdƒÃí‚Z-CQy3–djðAv¼@"‘~TZZÊ—›žÉU)¥kæÏÒÐ=½øú8Èä" XFÐÅ¡1CŽjC®Ý1"Rˆ Z*ïubŠLŠÑÑ$M !xa®H¤”ƒùýõŽü9Ap¨¬íD›¹— O¦Sa°8{í!š¶?@-ÎÐʶ,ŸŸÂÞåÈÓÆ þ¾YéjèbC‰^Ór–—Ä#É;ÌtÁåûHMˆB~~’DPPv+As»õÆ„á«Ùp¾œ«}`°¦$0Q~Xž9áñz°0]#¬üt- S¨ŽN.ó\D¸î侸UÓŽê+­r&Lóç¤Å—n¶ì~1ËëoLKŽL‰‹RÂaq".>2…eµOqúJáñÑóÆçxÒ°ß>0äüè±9§ú>»[ÈWkôÞsÜÀŸ—k ³—ÉD̆âòfÌÑ© M Ùk°j×YÜ~ü ësg€O“Æq¹Ý«.æ†$ÉK×-š¡tŽŽ¢«­×3$!É¥óIqŸôr>eßÀhžN¾òÝ91ôذ‡ jQUÝŠ­ëgaÃ’üz¾ÞÝPW³ûe¹q6‹© ³{I a¨·ZǶågÐl?ps’£P|8úN+±8+lŠï¨äX¨VC;%Éña0šPÕÐfµÖž(ì6?,¹PVkp‘ ½J•BÀð(4V+ ‚—óâV¥ÜÐ>ÿî(#ØôY&NS .I š¢ñé—ÍÔr€{|†k¾WC 0 ™²`‰x›,6[ìhÒwCÀ(kϼ \^ü^vÅÕ혞Ô¤HM?_××Qv䀳þÝ‡Ìæî‹G ïî_™£C ˆÆÆM:ܼóå…uààÈÀH¹ ©™“!AÑ Žž©ƒ¡¹^³á(àvp¾âÆÛiqt{a@áµ–„èp)cT¤:J†‘±1´™ú‘¿<ºäÄi –B!“øMÝoS»µ¯«æçàÜ&–e¹øqii)@&R&L”%ä|µ~Çú :-IÅ[½ëNîËÅãv»ÿR…ÞUßdñ9{®;,-çì/TèfYvxƒÑ?‡KHyÒyØ´eÊC&möú 1çã¼>×`•ÝÔZÜÛôg%<#CØX–U¯¿Ô€÷¼A#Qˆ‚§®~¯ïAá÷°m €À€–eý/×þ?¼K¸øå´IEND®B`‚f-spot-0.8.2/icons/mode-image-edit-22.png0000644000175000017500000000140011417267577020246 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<}IDAT8­•OHQÇ?ïÍì®Kí†ë¤î"¸)TTbjA‡ ÒµÐ!oE³[`xÛAëBxPÁŽŠ@È4шEaÙêºæŸuÿ8;¯Ãªë°ÿ¤í{˜™7ï½Ïïû¾ó#”Rôõ=¾—N[½J)'eH‘Ò4y¿«ën¥¡Ph#‘L¨r•H&T(ÚPJ¡X–åv9]Ì|ž*Ç0'ŽžÄ²,7ïÖµo¶–¥Ð˜–Øtðá9[Û–Bâ7<8t“—LŽÔ×ðltމOž’`!ea°’€á¡>°JÇ™œŽW;ù½èD)»s3¾„™*âXà7ï ?æ“ÔV¶IÉØ2Ë‘ïèé%Œ`[f®´¶ƒe& €‘×)*œ?‰Åã7²n”R|ø8Leu=¿¾Ms¼å,RÓ‹;B¬Ý·ÕÊܰgzâ-«Ñy‚ ¬y½ xBÏXJÉðØ8¥,Ö#_qx‚ÌÎ~A¯¨däÕ8 hºs¾XH‹áÂ`À²<ÄV#l&M„ŒâˆÆÙÀ@–r^(ÎÐIm¬c¥Wˆ%ÓˆRï¼[k‰p‰]!ïFe åňŽbg2' `ûIÀó±žM¢TöÝÍ‹-\¿Ð”·@ÎÇ›œœb)ºœ3p`hŽÓ­Çp:¤R› MQçŠàóùhmk) RÒÐØ@]]*×ù‹¹¼KnnnÆår–:Ò_¥ÏžØºÞºÜÆ“—ïmQܾr ¿¿†|i뚦ÅMÓtFu^WÝítw¶ì0MMÓâ;`)eO¯eYeýš¤”)MÓz„Ú^Û–,=äßôÊ´ uF½±IEND®B`‚f-spot-0.8.2/icons/mode-browse-16.svg0000644000175000017500000007272711417267577017604 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/color-desaturate-22.svg0000644000175000017500000001615311417267576020621 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/view-far-22.svg0000644000175000017500000002052611417267577017064 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/view-far-24.png0000644000175000017500000000115211417267577017045 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× !W¬¹œ÷IDATHÇíUMkÔP=ïMÆ´ÿC5Ž?C‹Tp!â/hÁE7ÒUWÝè¢tºê¨K‘:`S¨œ¶ÖÙY¡Íh&//å]:1™$Ó¤ë^x$9¹ç~œ¼û\Ú9Ɔ7««Ë7ÀkKÕê•yÎùdÙ@J©ßa(סċÅÅåÓ!®E¼¶4s÷þ‚aÔµ ;ypÐ[xÛ|ÏR *mÎ0êšë:PJ•ŽÎ9‡aÔµÖ»æ\<ùLýkõBåÇxS‰ÄI7J7;›™³ñ4?J@%úý>6^oÀ÷ýB8a$D¼ƒôˮم]³[ÿË'äJïÀ÷}ì~Ø´ÛíHã<|”ŸN0’ÝÚÙA†{`cïãÞX< ’'˜æV±ÙjÅ£o0^¢ø¶ûÿÀƒRgcñQ~Êk+$„OƒÁi´lû„?yD¶}R§ÆÚ ’hXaüz^@"ЦÒq~>Â샇Ø2ßãÛ÷A€Ÿ¿|êíãÞÌ,Ú¾#‚Ü]¤eí"Î9t]‡®ë¸us:A¨MLàú5wê·³'9wÐ\ÏóRm>÷ƒçyƒ›sTÐ+ËÚ–RJhZµô’R²¶¥Rj=S¢ Ï÷{âKÿè©"ºZú¸fÌ Ï——Ëÿx)û±VÉ{ÂIEND®B`‚f-spot-0.8.2/icons/emblem-event-16.svg0000644000175000017500000001614411417267577017730 0ustar00rubenruben00000000000000 image/svg+xml Emblem Urgent Andreas Nilsson Jakub Steiner f-spot-0.8.2/icons/color-sepia-16.png0000644000175000017500000000113111417267576017537 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÖIDAT8¥“½kSaÆç~äÞÆ´& I0­"~€ 8I‘N µƒn.Å©ƒ NJGÁK à EÑ¥‹‹Ð¿@‡‚"¥£õAEk Thn“ë½÷8h?®X‰ô³¼p~ç9/çUe/²Æ´ªÞŒûb™©×ë·QU<Ï‹ºÝŽö*ßo«çy‘ªb-NʵcùÓF´rŽÑ›ÏøÞþ9:“N±ð`ŠM·0ÿÃJßyÛ8Ï qxž=ÃÄ•1üXñFı$i×FØ~3jsúáÝÐYN4ߦrŒÅOHÏ^¥òržjv•R>“¨Bn;ú}"€&š)²èÐÆ]zÃEÿ)ëÎËùq–*vÛ2wöoúR6Q¬@–ÀÉÒê?„Û]åøçGTƒ»´†'ø2rÙàXÄÜE ƒ|m­G×_Q~q×+³”;'¥/(ä”ÄŠ|úøýÙü ›ÁÃ'1Ì¥ÑKïO,$Ç4ËLÓØªÊðÊ¥"#• Óªã,¼LmNO%©4¨‚Èo+ ¹b†( £Ëq7q†Æ‘©{$¥ü-*aÄ[Ó”™f³ù?YÀuÝDz×4ö image/svg+xml f-spot-0.8.2/icons/filter-soft-focus-24.png0000644000175000017500000000251411417267577020703 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  šœtIME×,×*ÂÈHtEXtComment(c) 2006 Jakub Steiner created with the GIMP :: http://gimp.org#ÿX@…IDATHǽ•ÍŽ$G…¿{#2#3«ªk¦{dXY2¯6hlÉ нßÈ ’V,ÆfÃÆ2cÌ`OOWVþÄße‘ãjwR*¥L)¾çž{þÇK–eù4çTïO¯ÊË—ß0/³õÝ`Çã#º®ÓyžÝ«û;[–Yû~(WWW¾iZÉ9Ë8ž$ç„÷m9ÓaõUhÃ_ÕéóÆ7x€”Ó“ZË-¢‚Uì`f`Û[„í» *B­³ŠÙVm­•œN)úKpw4ƒ\2N=Ãn@Õ‘r¢Z1œSBèPu¬ëJ)APu8UJ)LóDJ‰Z‹¿¾yùukf„¶£ë{EL‘ñtOLUåoü¶ ¬qåù—_PJ¥m[®¯oPQbŠÄue™g¼w¬qå˜æ Ah|Cãú~À€5®ŒçÓîzvÞf]X–…y™Ø {Úæ BèidžÏ,ó‚o<1F½†~‡ˆ ª›,çÄš&†÷ž”ªºUßD€R΀І@ß r<:>Æ0rNœÇóº "¼ùæ[t! êøø“¨VQQÞyû)ÄyöéŸA„¾ë9®rNt¡{¨ï{j­ÌµSdY&œzBèÂö/—¼9…ŠS‡ªnÕ§HJU᱿¦mZÖU ¡³ `Yæ‹Õ¼Û6®¥âT©µ^6ûv©*f†sŽR mpêÈ)‘sb]¥^w¯îPœóÜÜùãïH9ðþ{¿¸~õ›·)áÝŸ¿O)™ižxþå˜*ŽyžN0Ï"Bß ´mËÐï(¥PkýÎ03Tç)¥ËÓ6-9'û˜ê””ó2ãCT໕ k\ñÞã}ƒS‡÷¾\7×·X5rI¼øç –åsb\yç'OñÞ#"Yþ].3ã£ßÿ§žý~Ï÷n¿Š#—„sþÁE‡ýj•ÓxOL+Ó|¦ñíEg°ÿZý&¡r¼˜¡ï{ÖE ]÷0h§ñ@ŠþµjÄ´‚ð:oô¢ùrFÊi›ç¡#¦D)#)­Ô×Úz€¼ø;ªJÓ´G®ß" Ÿýå1mÕýì§OQ ãã?üÃmàGoý˜R*k\˜Î#1EÌŒe]€ŒãÈ8Žl¹î†ž’ ›+Ú–˜"Î9rN¨SJɈf•ÝnGãRάëJΙyžÒt¿ß#¢4¾!ÆøZžH× [6-ãy$ç̲.ö[Ú†¦eYWRÊÄi›UEªÕæxrs«Y[J!ÆHŒ+fFßu ýçñÄt)µr¼:n ˜¦3µV¼ó´¡¥“íÎøöÂR€ãñÑß®W´MVY–™Z·Ìi¼GE±º5Õ©C^÷Ę̈¥PJ¦ZÝò+ôô}ÏnØŸ/€¶ ònu‘Í)¥dj-˜Uªf›5­Vj-ÔR)µlQ/‚sŽ¦Ù²¬ áë‹D*úLD>ÛîÔìKÍê}Ђz߸œ“¦”¤Ö"E„ çœ h©Ej­ Ã&àN¾pê^ñÿXÿz«¬5uo´{IEND®B`‚f-spot-0.8.2/icons/object-rotate-right.svg0000644000175000017500000002047011417267577020776 0ustar00rubenruben00000000000000 image/svg+xml Lapo Calamandrei Rotate Right 2006-10-02 Object rotate f-spot-0.8.2/icons/rating-rated-16.png0000644000175000017500000000130211417267577017704 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<?IDAT8•SÏK”Q=÷½÷}ßøi£92Ž©AЦQ[„åIŒpÑ¢…B›2©…D$µhmËmK7E“Õ&ÚÕ?05edF¸IÅÑHgèûñ¾Û¢š&Yôà,œ{8÷Ü{‰™Qé½~¤®ävñnVâP%LŠj¤4Ö@´ï5&’\(Ç• çZÚÎÊ–ø°AD£ÿå “"!¥Xî<õ.0Þ<9´¢}Ý’Hî$Wr0i=V¡¨ÐAÔ7«0TÖÁ«Y1J‚ÚËÌM$ìHUíÄû§ U}àn¦ñöéIW{[$¤Ø ¢,€e0?¦¹ò.C&ã}WDÍžKª¹R»@ð÷[«Óø™ ñ-åûú¼ümqnr¬ýhÖ6ÃÝ ªd c4 ³¿Ày¸ùø<¿nt ë‰bˆ/gŸRæõö¾dUÈ®;óÑß^Í#p é©‚çÆ{G‚;ÿ„Ø;Lzž“|ŸN90âYÔo « éÇý‘?ý§xçK–vIØ$Èh,€B°ª\«¥%j[L=»cí&`Bìº×- ˜uƒûˆ4wZ›¹/=æË (C T×6X:Xù”r–Ÿ iÿ »µã²e‡ëMe¨“ÅlJ7qî¡ÊÖG"¹µœðí@ëk ¤œp1Ò5׳Ùõîa?ºC “"›ˆrRÊç¾ï%’¼Tê.“¢}R©é@ë~fŽ‹™‹xqáÒ9lçü¿ÒgGpIEND®B`‚f-spot-0.8.2/icons/adjust-colors-22.png0000644000175000017500000000235611417267576020122 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<kIDAT8µ”kL“WÇoßÞ(­mQ@Bi,›—l!¶ls2—yK0aÉÔ]\¶Dc²Ãbd[È6#Á,Kã¶ÄeÑÄÄm1*3è¦eVtr) ·Q*-¥¼oÛw”f÷aOòÿržÿùåäÎyEQø?Jý¤æî/wÏQGx;¦‘^áEPšU²öbDÍ¥ÛJ{ž´W˜îÄ_l´ò—/L˜;{žh1¤âõq¿·+ê®õŒFG¥-%%ŸþOà½û˷̳ÍÜ¿zõZ½W®çîh>¹$Ì„—HÓäQUu2ÜÕ>¸}Çöž \Q±+CgÔßÚôþ»†š¡Ïh»'m²éóyÝZÆ¡ï¾à JJ>i{Ü£z|!¦Š–¬ÌIh UO h»i US°2'!¦Š–Nå™VÔ¸ÒR2…ÆPõ”Ðñj U“–’)(j\Oc:‡Y—ŠOî˜dV†¬D¯ä9µ ßÑŽþP…Ñgí©Ü“ó¸wÂsÛS±ë•*&†£AÅ™£1˜gæþ\–¬fþœdft ‡ÆèìP]©«ùµ|ßÞ¯¤Pøã²²²Èpyeù³Iš„“Ö³ªÇ›>[#U¹ždŠÅ¬x³ZO'®ÿ…/0F’IÇb›… 6éÏ]¸°­¹ñ:ÀŽxÇŽ5¡ðOE¹ù‰Ž»]¸Ïº)0oÅ ²¢ Y1÷çòêË…TžhâLC7=ƒ#ŒIzG8ÓÐMå‰& —-Ó&Y­ŽÇ¢hõÞqf§§§›Œ&„Ïw«þ…†—xgö wœä-]IÍÕn¼ý$)2IÞþ5W»YâzM¯Äø(…rl&‹ÖêJ4JöÕxŒz û‰ Î$mn ‡/ÝD’#Ó¾’úæ>–/^„¢yq°F’YÍfq¬¥åáJÏs„¾ßoâ}k#£žûAž4®î±õhÔ¼x²V{sèÁƒ¨.;{‚9õO‡À(£IŽL+‹QÃP`)¢tÅÁ‚Jihø%Ëš5¢8néôÒÖÙKnVò”ùŽ+7+™ÖÎ>”ú8Øž–õ[KGGG `véÄšQw‘†ºÓ¬sÙIµê‘dy’R­zÖ¹ì4\>U싃‹‹‹£oüü‡;dZ¿Çñã$.Y‚ Óa ŽÜÔÄÙóµTnvRä²3ˤC–#Ì2é(rÙ©Üì¤æÜy¹··÷àÎ’7àÑtA ?ØüÞŠ¬ùé_ff›íÏ-ö 9‚¯¹™“î˱°V+¼W(8Òç4Ào8ĽŽ®Õ×Jmm­‡¿=pp÷ðð°x0`r8)EkWmµêµNÍ ³-&Ëòˆßïméê¾ÖÚÞÑ™ït.·˜­¦D5’þ ܾí¹uètÕé«À0'ÌcAÔ@= 4€ø(:ˆ2 A „€°¢(±xÓ• 0®ñI¨ü[Ê4€Ò["Ý÷K¹×IEND®B`‚f-spot-0.8.2/icons/tag-new-16.svg0000644000175000017500000002506211417267577016711 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/view-restore-22.png0000644000175000017500000000134211417267577017757 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆtEXtSoftwarewww.inkscape.org›î<tIDAT8Õ•=LSQ†ß¯ôçÒ^A(¡*MÚKª’ƒ($@Œ1.5®þEœL ƒtÒõ#š88 #ƒ‹V£DEC%Ä0øzQ‹`ŒJ[Zï=ç8*ý£5Êà—œá¼ù¾'ïyϹ¹$„Àf”iS¨ÿXñ«Ò¾Ó·¶ÿSp㱫»ë]ήmuͧnÖ€ùo€Š_µ[mÖó n×g]MxF ¿‰Fc‘²+~µYñ«”£µØlÖ'^oÃY×í˜ÑÂÒÒâò @å<7ßñk‰0o¬ L&ê%“érkÛÞ„¼Å17>6¹ÆÎiÁ€¶6S^„V›d“‘LYx²½¥£s%ˆ¤WC¯D|¥{=4 Ü××Òu]Ée&u‡tblxüŒ³®M{v1Žçƒ#ñäJJÕ‚—¹s°®ëJOOOžÙÑÉOxôñ),3jsŽ‘á‰x2•º7ýàÒõB‡Ì‹âÊíÁ¬ýÔô7Øìöt"”¾¿ï5,D–¢œó‹… @Ϋ`Œáí»Ù¬š`kMuÖo§µµÕUfsÅ}ůZJ:æœc@=™Õp´û.ˆ_>Ï!¶C2‘@äÇ¢±”DDm.¸QlFfŸúi`þûtÝ@cC-Ú}N4y}˜}†qQzØ/EX×õß‚¾Ó‹¹"#I’„ðÔ hÁ@QhIÇ@@–Æ9߈WÌËçcìÏÁ…çÖšc"’…±b}¦Õ¦Êµ!Y–7\ë¢ð‘£”c«âkÿŽ'0ÆæT!}‹„ ô'å^ÕÊù»Ê–…³Å~™bz•ÇxIEND®B`‚f-spot-0.8.2/icons/view-restore-32.svg0000644000175000017500000004405611417267577020004 0ustar00rubenruben00000000000000 image/svg+xml Restore View http://jimmac.musichall.cz Jakub Steiner window fullscreen view. restore f-spot-0.8.2/icons/mode-browse-32.png0000644000175000017500000000216511417267577017554 0ustar00rubenruben00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<òIDATX…ÅW]h\EþfæÎÝ45Ô?”²M²$iJ 6o*‚èƒ>ˆyDT6íî¶kâ)”&nr›u¥–h­?%«¥h-ø j)Mq+jš&MLS‘d²›½wæøq»Ù»³aÁîÃÜs¾™ïÌ=œs.#"üŸ° ™|‡²ŒXâB|9pè•U¾ó†Öº›ˆ„ 1¦çïE±#"8ÇÙî}ê,KšOÃïœÌ+/³=9ò÷ñ䀷_Xat>”Ò8q2åzžwUÈ ê099­uÅ ššBÔtf¾Þ.D$¤´1=}ÃH@0Ø !„ö8ýÑúú¿FÆ€‡Ÿ|Üç*/~õiY[.—C×3óh ]ÄÍ?ÁÔôcXXÊbÛ][Zkœý.]Äá¾r7àöËÖ2‚þ[ |þÍ%ØRÀ–R–æx‰Mû;‚Özç¦fE6û¦gŸ0\,‰1¤Ó×ðÒë׌ÈáÖí=Èdöû×üT ³ÂS~9€ý»ÞË8.Ÿ: «ÉÝØZ^iÂâìø¦—Râjh—¯eÇ\´z(b”håp8¯š³&@+¥ÐÒ²ÓˆDDȯ¸œóe´ÖDD¬¹¹µ(¥8e€´¬ádÊé&"Ó¤$Û¶Ï9àô»+++¤”2z<Ï¥·N$ó‰Á¾­Dg(‘©†ïºyr†Á 0)%®ÿ‘Qå< µì†”’²Ù¬"’¶mcjêºÉ`ÇŽc¸#iFz;AÊpóyûâ· m¯ööB)UQÀ™Ñõ–^2<Þ¾ œ³Ò¾¾2WÖÆ}ñY4µw`f| s“«½~qw7Ô>¾p¥ˆSófÔØÞ- ÷"¸s½#ž¹ðSYÿš ˜øn>‡¹éÊθóøñ÷_gþµff| ·&®^"€@¨ؾ„…•Ú®’pïkcå“pzaÁwñӟAçÝ¢wœáÒÛ£Ö¶»¼"†Ÿoæ*h." ÝØ¿êîêbc‘€çúF Q9;z´jŽ@ ¥Úví1"\×c\`Œi¥Z[ý§¡5&l Ý0™rÞTJuUõs)ćÑp¬ ’)ç]¥Ô Œ±Êep5!„8 Ç:k9l`öw x=±øü  ê =iÁIEND®B`‚f-spot-0.8.2/icons/Makefile.in0000644000175000017500000004477211503407232016434 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = icons DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ theme = hicolor themedir = $(pkgdatadir)/icons/$(theme) hicolordir = $(DESTDIR)$(datadir)/icons/hicolor theme_icons = \ actions,adjust-colors-16.png \ actions,adjust-colors-22.png \ actions,adjust-colors-24.png \ actions,align-horizon-16.png \ actions,align-horizon-22.png \ actions,align-horizon-24.png \ actions,autocolor-16.png \ actions,autocolor-22.png \ actions,autocolor-24.png \ actions,color-desaturate-16.png \ actions,color-desaturate-22.png \ actions,color-desaturate-24.png \ actions,color-sepia-16.png \ actions,color-sepia-22.png \ actions,crop-16.png \ actions,crop-22.png \ actions,filter-soft-focus-16.png \ actions,filter-soft-focus-22.png \ actions,filter-soft-focus-24.png \ actions,object-rotate-left.svg \ actions,object-rotate-left-16.png \ actions,object-rotate-left-22.png \ actions,object-rotate-left-24.png \ actions,object-rotate-left-32.png \ actions,object-rotate-right.svg \ actions,object-rotate-right-16.png \ actions,object-rotate-right-22.png \ actions,object-rotate-right-24.png \ actions,object-rotate-right-32.png \ actions,rating-blank-16.png \ actions,rating-rated-16.png \ actions,rating-rated-gray-16.png \ actions,red-eye-remove-16.png \ actions,red-eye-remove-22.png \ actions,red-eye-remove-24.png \ actions,tag-16.png \ actions,tag-22.png \ actions,tag-new-16.png \ actions,tag-new-22.png \ actions,tag-new-24.png \ actions,view-far-16.png \ actions,view-far-22.png \ actions,view-far-24.png \ actions,view-fullscreen.svg \ actions,view-fullscreen-16.png \ actions,view-fullscreen-22.png \ actions,view-fullscreen-24.png \ actions,view-fullscreen-32.png \ actions,view-near-16.png \ actions,view-near-22.png \ actions,view-near-24.png \ actions,view-restore.svg \ actions,view-restore-16.png \ actions,view-restore-22.png \ actions,view-restore-24.png \ actions,view-restore-32.png \ devices,camera-photo-16.png \ devices,camera-photo-22.png \ devices,camera-photo-24.png \ devices,camera-photo-32.png \ emblems,emblem-event-16.png \ emblems,emblem-event-22.png \ emblems,emblem-event-24.png \ emblems,emblem-event-32.png \ emblems,emblem-event.svg \ emblems,emblem-people-16.png \ emblems,emblem-people-22.png \ emblems,emblem-people-24.png \ emblems,emblem-people-32.png \ emblems,emblem-places-16.png \ emblems,emblem-places-22.png \ emblems,emblem-places-24.png \ emblems,emblem-places-32.png \ emblems,emblem-places.svg \ emblems,emblem-readonly-16.png \ emblems,emblem-readonly-22.png \ emblems,emblem-readonly-24.png \ emblems,emblem-readonly-32.png \ places,film-roll-16.png \ places,film-roll-22.png \ places,film-roll-24.png \ status,mode-browse.svg \ status,mode-browse-16.png \ status,mode-browse-22.png \ status,mode-browse-24.png \ status,mode-browse-32.png \ status,mode-image-edit-16.png \ status,mode-image-edit-22.png \ status,mode-image-edit-24.png install_icon_exec = $(top_srcdir)/icon-theme-installer \ -t "$(theme)" \ -s "$(srcdir)" \ -d "x$(DESTDIR)" \ -b "$(themedir)" \ -m "$(mkinstalldirs)" \ -x "$(INSTALL_DATA)" MAINTAINERCLEANFILES = Makefile.in EXTRA_DIST = $(wildcard *.png *.svg) \ flower.png all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign icons/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign icons/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: install-am install-strip uninstall-am .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-local install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am uninstall-hook install-data-local: @-$(install_icon_exec) -i $(theme_icons) $(mkinstalldirs) $(hicolordir)/16x16/apps $(INSTALL_DATA) $(srcdir)/f-spot-16.png $(hicolordir)/16x16/apps/f-spot.png $(mkinstalldirs) $(hicolordir)/22x22/apps $(INSTALL_DATA) $(srcdir)/f-spot-22.png $(hicolordir)/22x22/apps/f-spot.png $(mkinstalldirs) $(hicolordir)/24x24/apps $(INSTALL_DATA) $(srcdir)/f-spot-24.png $(hicolordir)/24x24/apps/f-spot.png $(mkinstalldirs) $(hicolordir)/32x32/apps $(INSTALL_DATA) $(srcdir)/f-spot-32.png $(hicolordir)/32x32/apps/f-spot.png $(mkinstalldirs) $(hicolordir)/48x48/apps $(INSTALL_DATA) $(srcdir)/f-spot-48.png $(hicolordir)/48x48/apps/f-spot.png $(mkinstalldirs) $(hicolordir)/128x128/apps $(INSTALL_DATA) $(srcdir)/f-spot-128.png $(hicolordir)/128x128/apps/f-spot.png $(mkinstalldirs) $(hicolordir)/256x256/apps $(INSTALL_DATA) $(srcdir)/f-spot-256.png $(hicolordir)/256x256/apps/f-spot.png uninstall-hook: @-$(install_icon_exec) -u $(theme_icons) rm -f $(hicolordir)/16x16/apps/f-spot.png rm -f $(hicolordir)/22x22/apps/f-spot.png rm -f $(hicolordir)/24x24/apps/f-spot.png rm -f $(hicolordir)/32x32/apps/f-spot.png rm -f $(hicolordir)/48x48/apps/f-spot.png rm -f $(hicolordir)/128x128/apps/f-spot.png rm -f $(hicolordir)/256x256/apps/f-spot.png # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/icons/mode-browse-22.png0000644000175000017500000000121511417267577017546 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< IDAT8Õ“±kSQÅ7É{ÁZµ&HK˳)XéàRÔ‚`AtG)ºÔÁZ!`7 þY| Áà h-8)nvÑÅE¨n.­UPÉ …”Ú÷î}÷sÐDb_£ÁvðL÷ïÜw÷(ß÷ËALŠxˆëº7óùüd±Xük.…B! Ã@6‚ÖZ …B$"mqS"’H&S,/ÁZ @E˜Hc"ƒ×—CDípSuSù‹Xk ‚tÚ%‘H`E¸sïÑ:¿ ås±9xÓs¹!<š[`¹P[­¡dwmÛ Ê?£!|´?ÀíʰVæ^Tò:èŽ6\œ}úzÝÙÈtŒ°·[HBV–xû‘Ñý. óïüõÈ 0†ÁóWxiD„1K{ÇosõB€‰ ÆÌOn“°RÊj£==}±7‡:D)eÚá¦Ç©ýbËGï8N ®úÝÂf!ÕNM}ß/k­'D$–«”Çqþ÷JŸ½ö±ÓÜ}ü­ÉÞ³[ãë,Ÿ˜|›Ùüìå_ׇã‡{98”féƒ`­P]|ÉžÜp¬À>/‹»ú€°#Ëi÷îØÉü+‹—ªŸÞ³ÝµôvÅî0èe¨..ÐïeZ ߨÌ4}ˆLÈÜó.Šβò9ݘ[ ?¹ýG¥[Ô´Ž“#Ý>³É•Ö[TéR©Ô² I'¹µ•þš¿æÃ‘ÊwIEND®B`‚f-spot-0.8.2/icons/f-spot-not.png0000644000175000017500000000052211417267577017110 0ustar00rubenruben00000000000000‰PNG  IHDR à‘bKGDÿÿÿ ½§“ pHYs  šœtIMEÖ ³ßš-ßIDATÓ}Ð1nÂ0…á߯(’gsK(Czƒvl¦ Fl{+6F&È-‚*Ú™kp‡f B¨R£Ì@:¶o|zËûmJHˆÈ€·g@´ƒU_ë—È¥hœc_U|žNðJ éNk_[ë¿×k>|m­¯­õ;­} ©òÈzó9ÁxÌ×bB ‡wDÆäˆ¥è>ª»¶±1µAðW,JEF^a<°y—Xùø«^ ®·ƒÔAèÈõü~c2våü³¹H¹Ê몡)ëô{ ë¾ñÑ ¡#Š·“¸mªÞÆ×ŽW4¦Ÿ_Á0CÁ&û=srâ­ÑÖOâbõ£ jjwY¥@‰Ë'YeNÜŒ´AþYÍ3æ  ,3°l€`˜¡L,êCó‚æé>lËòäŠÕÿîcä¶JÅÅ9âöƒÙäB©éöÓQ==G ¶`Ûæ£\ÊIrg O¹ W7—¿ÓîZ6™ýuãÒ]%­ÚŠT€Ð°-‹žƒ%S7Ÿ …­Swƒ…>ÿ‘ž}ë§b“WÏTmyZ§¿5Ñ“éBh$ÆP©q”·˜ÞC{’É‘_„¾2óóh¹Ú÷Y—ê¬}p<`õm*ØùŠ¡âÃeÞQÞˆÒ*îOLtÿEeSúÝùI´ˆwÍXs—}~÷Êþ ´eù[j5¦²» kv1Ür(=Ü~¢í‰¦d}<ÛrÅ?L¶ ð÷+€’µù¬»\ãîo}?c_SÖOŸ*ûV·oû0yÑÛQ ÔÙïwâE.Ùz€< X¬Ö>v?Û"µÆ©Žc–Šª©Îf+²×=òL9›œ}ENœg¶üjÑŒ‰ë› iûì}ý-»]>¿«÷Èþ鯯¦ö|y…AÀ¬y¶àY$ّ٦âð#Tî(áôÅž|¹ˆ“|¶e{1¬nÀç”^àô¹°>D™óžçøÝ ­øW«6o¿rZ¡ø?ןW6VKMÅIEND®B`‚f-spot-0.8.2/icons/autocolor-22.svg0000644000175000017500000002427011417267576017352 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/autocolor-16.png0000644000175000017500000000144611417267576017342 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<£IDAT8u’_HSQÇ¿çž;ww7ÙŸ¦Ûl6ï*­RV˜ŒÀÜPÜ0 z’þÙ(ɇ|íÉùÒCAÖCDÏB”=‚R>¤e: )$ü›nW§ûãîþœÒn}àÇáÇ9|øý9`Œa7"Sàòóݨòõ:«|½5ÅîxCD à‹"Y &›Á<åÚ9Ž3¸=p;gmBÝß/JKï#¬o –Ôž—CıûHÅÓÛŒ±›’?XR CDÀn®ðÕ ¢8^ÒýX¬{2þýx+HþàI»Õ`jqá\,VÀEŸÿJÅ'‘ˆ¼€Íf£óò¹g]Ý]wyžv´ûO©ÏžpŠ*žP 0¹Ø€%òèéÌhë§É‰¬„5H¦÷“ííøc‹jåVµd¥„ª ªZÉt›Á8€‘Öž´²Ñ=²(+«ñm¯×£>Z>¼}õÍ$Ìf%„ò„1ö/‘C„˜\Œýf,úJWZêkiöðã_¾âw8†°®ߦç7cesƒ=™A>’?(TjV7zYåñ4bum ccS˜‰Iñ”pun°çM~ Åh³×Ô+ž¶k¥<¼MnT‹?µ”C÷Þ@8îŽÑhЪ U¸ÒñS³ø8ú,« ÇpFòíÿHþ I­¢n«Å€Ãv=•8äî@Æ\jQ E„.«Ä¯—›õ,¥ä@!€’É¡¹Ñ oƒ ‚V'àž`rhø"å;Ãë[%Ó³óyXÍ¥ˆÆ’xùnËkQ¤SÉ,ŒÆšÖË[ „PËéMÙtüB‰F_§3–;@µû29ð%M'äåt,<ËrÙa°Ü@Ñ5B(€€@ñ÷Ëçd(Rþ¥ö;ÿTIEND®B`‚f-spot-0.8.2/icons/view-restore-24.png0000644000175000017500000000132711417267577017764 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  šœtIMEÖ ;5õ[)ßdIDATHÇíUMhA}“n’m²¶æ‡ˆ¶F-ˆ”j UA4Ò»ôО„$—šƒzLñ$ÁƒÁè±Oš¢E-Ûj(R° “¨‰M‘¦M²›wwÖCÍ_›U ‚øÁÀî7o¾7ïÛ7³Àÿø§‚÷øÙîó·vVæZ¶ª¸ëìè~ÇÛi»Ýâ0óÇ——ÞŽ‹ÀlÁ®M£aÈá°¶Ù-‰x,ñ:›ÒåyÝoêæ=~R“ë1 y¾ã‚“ï4Çc 6³š›Œ‡|rC´ì¸1NR²¬ €NGFˆNw­·ï`žÛf^ŒÌÌ­f³ÂÅxÈ«\§½E½FÖÈ¡XÒpš9SÏ‘£‡ZAûbò•œ õÅë¨$I®ZPQRq÷¥Œ3'1ŽÀf· ëÀ>( ų‰)¡P(^>¹Ùh_U $Iry½Þ:ÐôÜ'„ž@¯gpìD?! ”b*<+K¥ûß°E×oOT½Ï\‚ÑdZ“LÖDxÃJ:“¥”^Þ¬³u.RoÞ%«F4™ÆvK{Î½× «µ½aZð¿^³J)ÆFÏUåN ß!_>/BÈ (æóH/¯ +”XBH€Kš dù—Qú.#õ-I’±»ÃŠ~· ]¼³ÓO1QÛc®ˆ›µ¨!$Ië UEøÎ ôÌú­Â²,óÏùÄfînª ìåÊ¥Tóña}äZ‚F˜?&h¤ ægp­­åÅÇi%pX j!0¨ªú5 îÒ"]Q”€¶f&©yî,{G  ùW£?(ÇS ‘þZIEND®B`‚f-spot-0.8.2/icons/object-rotate-left-22.png0000644000175000017500000000172511417267577021023 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“tIMEÖ ,5ÐùÈîwIDAT8•”[h\U†¿}®Ã™vr&Æ´“ %úÒ6±±IA1^¡­xJk“zyE±Š `^„ø yðB¥Õš&o ‚¢%ÕPPc./4UQ:iR›QÒIf’™s¶s&ÉL2Iܰ`ï}ÖúÎZÿ^{ 68ε ù‚ܧiú£àÜ.mÇï8ÒSè×ЋÐ6än¡«Ç}77ûÍû,³º^¨ÞhùÜÈ37-Î×¶+FÙ–kï´ 91€üí}œTìTÖIh(-ÇòâÖGÚ•—}áú£¡'Þ²˜èÇ<Ò^r*( ² ¬=Än³¼ê•Б./¿÷"㿬T´ìZ(ëƒ%ˆŸ ýxíáŽMÄÎ.A…ŠðoCl½|µ z@ä2Ý@Æc¹Ëw㎠^^3ܳ˜¡Þƒ 43õÕÛÉé¡>™ž‰[Å*^,™î±åì¤LŒœ¶‡Úô©Öš€0*]ÿÍn|Þ+´\Šœ‰ ÓÌ—NÿõœyØðZFôäÑÙ“c >'d–™]`y2äÀ:Ù ³hï¶²³©’/ÏO°ïÙ~F\íxHSäsCLÀrK,yºžPæêYâî[®_Ñ÷|…àßÔŸ\Æ+: püCÊ-&{¯hIEND®B`‚f-spot-0.8.2/icons/mode-image-edit-16.png0000644000175000017500000000114211417267577020254 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ßIDAT8•“MkQ†Ÿ;©C“jÓ«6PÛHÔM×Å;Á½P²ð/hW2`ŠuåJPíB¡‚ŠHÁe»¨µ~ ‚iÝØX0ØÎÌ™ëB8PÈ»¸\^^žsÎ=\Q¯_».¥? ht§Ð4›Ø¶í»ž«º•ë¹Ê¶mßPJé)3ÅØùd3>®+ð¤¾mù…»5”RºñÏ({©V~réÂI¾­}äò-ém…(@Äœ0TÌs¨ä’¶öPìs(®±é¤¢àæúW¼_MrûÆ:JÅ<ÍY>›gÃéa ·? ¹-Þ¾CèK •Ò¹BPÌü½åÈô@®]ååÓYvåw²ÞüNùÀnÒ™lpïÑ«Ž§å ÝMt#ÍÌ“×)‹³ãÕ8`eu¥#à4¤§á¹-dcž|a(ÙAcµ±  -¥­ÿ²`næj<)¢cËââNÐ4 ß÷Qª½ëÛ—¸ÿü¡RœÝË•‹g0 = Òçó§/„*Œj2*:®ž >¬Cétºˆ·Ñ…4M_[¹x¶áàŽéü¬4Z$ à‡µÍ…t• ¥ç𱾨ó¼ ºø9hÜÇÙ‡>q!=’í­ûWÀ„@ÿÍÖÕyÙbañÅw—Ðlu`ÔᇯÏ*@`†ZŠÎނиG½0jåÈ5ªèS5­q4EåH¹®ÓZùf•B*üþàŽxsuJ¬\hAø¹ú†½hSå ãô ŒCåAƒõ£ÎjGž) $²±;R§¤{€)\O`÷öMó)>@ýï=hûÍýŒ”~µkK²±³ü2=>,+РÉá‚ã`0(qªú.Ö°¡8‹/’¾e±Xhà1Yã—*2$Û^Xd¤=c^pÃÔ‰2L rè!G0#19†´öá\]'D4ƒ×ï:ðT‚áP¹Æd’æ WCœœ`ð‘yc꽟½[¼P?SF]ªíB¯sw»•PˆððcEn¶»|vOh93îË—#5U†ÝG.be†l4FަvwÄ3)µ¶\)»û ‚¾Y£ˆíþ‰ oûþ*f)°n]¶Hâ!ñ±çp%Z:œ74‹ù–‚2XÙÒÜp§o®L"@Jœ<pÙY„B!¼¸H+lníy À©4ž?J4Ô>³ GkÚ¹µ¼(N« ½-nD…TL¡•µ÷^•Ǻ{uGlšìË2çÍ3¨*bÎ<²sTh±¹Q^ÝA¸G&Ô\DrìÁfEŒhÝp!ŠŒ¡¯oááIØýc –z[D(&´Åí´ùy™˜ÞrºÚ f‘Ï-Ì@uS7^Ùugkl(Y<|Ùïë:xdÈîÆRWù…ùÝÛÖæUé2´÷Œ…=¼(¹8÷)(dñ”"A”_UßV¯U%ÆžÍL#š­=XþÁODÃÐH%øôÍ|/2aï±ËÜp¿íkáÇmvõ;Ê,r³RpsÀر­nhè»Ê`Ò$áü¡-p–=Â5–¤Hñ’N‹,} òÒaw³¸ÔxÏãn§ÓõëÁÒÆ}WçB.ááÍ­¹¸\ÿ'®žnA^:‚Yš$,,ÔB,çãLM+¾>ѱ€ŽzÜ]GÁùÇŒSì"NêðÄÈxeÅU›Þ”‘BÌÖ¦Z¬?»›ÅË«L˜ÿìL˜ ©ÐÌL†A­„}€ 5uôûÜ׎‰L8† ÓÜ‹ÅBH”¨èú%ÛÓf¦­ÿüí"J7KI½¾§ ¥_®BGï(.4t¯Üê%|¬§qÔÕ]ζV\½N†a¼kM{p, @@&T>­Rf2o)Ué›'ƒa~4‹D¹À#Îγ[UMØ;äà0À0 ÷°Î´€‡@|R‘Ò(O0®Øä±]¬˜hÀÝï·—a˜ØãùOC}ôF{E™Š¾h¡P7~çÙÔi image/svg+xml f-spot-0.8.2/icons/object-rotate-left-16.svg0000644000175000017500000007700511417267577021045 0ustar00rubenruben00000000000000 image/svg+xml Lapo Calamandrei f-spot-0.8.2/icons/view-fullscreen.svg0000644000175000017500000002643211417267577020237 0ustar00rubenruben00000000000000 image/svg+xml View Fullscreen http://jimmac.musichall.cz Jakub Steiner window maximize fullscreen view f-spot-0.8.2/icons/camera-photo.svg0000644000175000017500000013231511417267576017501 0ustar00rubenruben00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Photo Camera snapshot camera photo compact snap f-spot-0.8.2/icons/view-restore-22.svg0000644000175000017500000002653111417267577020001 0ustar00rubenruben00000000000000 image/svg+xml Restore View http://jimmac.musichall.cz Jakub Steiner window fullscreen view. restore f-spot-0.8.2/icons/f-spot-256.png0000644000175000017500000015145511417267577016640 0ustar00rubenruben00000000000000‰PNG  IHDR\r¨fsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< tEXtTitlePidginÆÐ¾LtEXtAuthorJakub Steineræû÷/!tEXtSourcehttp://jimmac.musichall.czifã^ IDATxœì½yœ$G}'ú<ê¾ï®>çža43º¬!,iÁB á•`-$Œ°,ÃC–0xm Îç]ƒxìûÈÆoá±¶¥• ÂB„îc4—zfº{ú¾»ª«ªëê:2÷¼"³2«ª{ªçúõäTfdDdDd|¿¿_œIÞùÎwâMY¿<öØcdÁZ…±º¿÷fÏXOšÅ5Þ;·VÏÓÉ;ßùζý¾)z!oÀÚe ÖÊvÁ½‘$pªàouÝìoÁÊ›Цœ… ?Uè¬üë!‹Vî ò&´/o@Ù Ð[Ý_è;M ÍäT5ýZ­‚7‰à4È›`"§±]ßiЯ—Ú‘NÀ©C+÷y“¬åMå wæu ôë±Ö*§ òvÁß.´º§Ê›DÐ(¿ÑpÞê^'ÀOnºé&×õ×_¿÷–[nyîÙ³‡;|øpÍf­$°–ûÍü7sk殓7‰@îL'àtËYÞ™·V ¯õ\uÛ¾};ÿÅ/~ñšÞÞÞ;yžß+{ýõ×ïûÁ~ Àïÿþï»?õ©O¬×ëýô§?ýÒ—¾ô¥99¼ˆ5˜à"Z¤v7žódLƒ•»N”:ð&ü†Xç(èéóVàn ü>Ÿ½ÿþû/ݲeË6›ímápØÇ}.— ¥gŸ}ö/o¾ùæÿ @|ì±Çîݹsç§\.?11‘- O?ýôÓŸÿÌg>3 d}3ÍÞ®U°žfƒ•[3wü&ÁÚ8‹;óÖ úõ¹ÿþûß²wïÞÛNçµ@Àǃ^¯W—€X,æìéé¹À£ ûöíãÀ'“I;˲‡ÃÁL&ó¯×{åUW]uàÅ_üÜ=÷Ü3‰Mm¦‘­î5“fV1øƒá¾ñùfî:¡ëÉo¼áà,½ñúT@ßÊÙ¿ÏW\q«Ïç{¿Çãqwuu…ü~?!Ä<«‡6›­÷ª«®êûÅ/~1òÙÏ~ö¶X,æfYVõH f³ÙkÜn÷…Ï>ûìñ×^{í¯þäOþäUhÍ‚õÞJZ5Z]£…{ƒü¦5Þ0M€uÿLwæ5ñZAOàÎ;ïŒÜpà 7ƒÁÛíöpwww  ²4ˆ›ÉôôtíÇ?þñÿøä'?ùÿ<ñÄO]xá…q޳Öù|cccÙB¡0~ôèÑ¿¾ãŽ;ž†¾i`Öh§©°žfB;×­ÜäNç<tøgôfn-ï]ýõžøÃ×%‰;l6[_"‘ðE"Ïó&Ùh.ÕjÏ=÷ÜÔáÇÿá]ïz×§·lÙâj'\±XÄøøx.—ËÍŒŒì¿å–[‡Ö4 Aª¿­ÜÚ½nåÞ oT"8g `À?Ýy úM›6Ù¾üå/_300ðGÇíI$Îh4ê²Ûí&I^›¼üòË+år¹rÉ%—„m6ۚ–ËeLNN®¤Óéåñññ¯Ü}÷Ýÿ>??_ƒ5 ¼IgXÎ9Ø`ào$èéóµ¯×ËÞÿý—nÞ¼ù£‡ãŠP(dO$^—«-%ݶ,,,ˆ333õóÏ?ÝýC•J“““…T*•››ûû»ï¾û{ãããhV,~O…¬î·sÝʽAÞ(DpÎ@‡€ß #µ¾ñ—ùÆ7¾ñ–½{÷Þîr¹®õù|öD"ðù|fyèˆÔëu¼þúëØ³gÏ)ÇU«Õ055UZ\\\Y\\üŸÿüçÿᥗ^*¼àTa=çf×íÞSå\'‚³ž6øn×w ôû÷ïï}ë[ßz«ßï¿Éív»“ÉdÐçó†aL²ÑyBww7:e]ÔëuÌÌ̬ÎÎÎæs¹Üÿ¼ï¾û¾ù£ý(‹³‡¬Üš¹ëä\%‚³šÖþhÇ7»×iГ}ìc‘w¿ûÝ7…B¡ÙíöP2™ „B¡¶{ð;)ËËËÈçóèíííh¼‚ `nn®:55•Ïçóç;ßùÚw¾ó”ríƒþTúÞ$JÎJØào”‰J ¿þúëÝ·ß~û{âñø<Ï÷wuuyÖÛƒßIEGŽéH3À*þÅÅÅúäädneeå§?üðß|ë[ßš–o¿I§QÎ:hünË[Ýët>Ù½{·í3ŸùÌï |”çùób±˜3‹9;уßI9yò$¢Ñ(Œ3;-©TJÏ …§Ÿxâ‰/~ñ‹_…²S!+Æ{ÍΛ¹5s×ÉÙNg´þÓ݉ױüûî»ï²íÛ·ßa³ÙÞ …ìñxÜãv»sr–H6›E:ƦM›NËó2™Œ866–-‹¯>ûì³û?ýéOB# èëB\oá’ÎX'ø7¢ãÎìþzL}æØ}ÞyçÝît:¯õûýöD"áßÈüNË¡C‡°gÏXMÞÉf³Ë …㯽öÚg?þñÀ„ÎF8ã°N“=¦ý†¶çå_æ _øBßå—_~«×ë}¿Ëåruwwü~ÿiëÁ奈Ãçó! žög+ÓŒóùüÄáÇ?wçw>‰¬ˆ ™[;¿ÍÎÛ¹¶rk³‰Î(l€Öß03¾ÙïÇ>ö±Èµ×^ûþp8ü!‡ÃêêêòƒA¶Ù<úsA …fgg±uëÖ3–zšñðððço½õVešq§‰ •[»×Vn:9[HàŒ@Àß à·û«œ«îïyÏ{<ùÈGÞÇ?Êó|_"‘ðD£QþL÷àwZ:„óÎ;gÚ‚)—˘˜˜XY^^^ÿÊ'>ñ‰ï/,,ÔpöZç„5pF`à?SÀ×ýîÞ½ÛþWõWïèïïWzðÑhÔép8šfæ\–ééiØívD"‘3ê4ã|*•Z™ýÚ'>ñ‰žœœ\…v+ðo„EpÎ[§6üë|[~½^/ûo|ãòmÛ¶ÝÁóüÛä9øî³¹¿“R.—1>>Ž;vœé¤è¤V«arr²´´´dœfÜŠš¹™ý¶r3ž›][¹éäLÁi%€#¯ëÁß½{÷ºÝîk}>Ÿ-û}>ßií?[äÈ‘#عs'ÎÆ> ešñÜÜÜÊòòòwî¿ÿ~ešq§‰ ð7#+7œn8m°Fð¯wxn­ ;ÿò—¿—Ëýïï~÷»kf|º: ­ÜT9$p¶@§ÀßäÆûûØÇ¢×]wÝûC¡Ð‡ív{(‘HøC¡s6j»3%ÕjCCCxË[Þr¦“ÒRDQÄÂÂB}jj*·²²ò“‡~ø¿­qšñ™=Påt‘Ài!€&à_o{¿€[žË»è\ßÕÕuÇqýñxÜFùµn€ñF•b¡Žc`³k$888ˆÍ›7ãl›²ÜLäiÆYyšñ—Ö8Íx#FÎ:Øpè0ø×M{÷îµ}ö³Ÿ}G2™¼Óf³í‰D"Žx<îx#÷à¯E*•:NŸÃб9LM¤ñÖßÞŽ}÷«÷Q­V‘L&Ï`*×'ò4ãL¡Pxõ¹çžû¼ašñFAGú6šÎhv¾nÐû|>ö¸bóæÍåyþmáp˜Åbdzž¬¼á¤^0~r CÇf1>²„zMÛæ?Úå÷\ªù­×188ˆóÎ;ïL$µ#’Íf1::š)‹fÓŒ×3|ة敀% %€uhÿµ¶óÍ®™|pÏöíÛïp8×ú|>["‘ðý¦öàEEÌL.chp#ÇçQY¥¾úe(ž›?rüAmSNor¦Džfœ‘§ÿõwÞùk¬Ú!´ynv­ÊF‘À†À‚ßôúk_ûÚæ .¸àCç¿8gww·ÿÍ|MçW048‹¡Á9ó«˜ñ!íô[oÝ‚‹ÞºY½Þ¨BΔÈÓŒ³¹\nAžfüÖFëi*4;7»Ve#Hàtwu·¿•»%øÿìÏþ,rã7þÄn·Ç»ºº|oöàk’Í1ttCÇæ°œ.D.@B¤]é«§„`èØœŽ††N‚g½H$§%).— »víò—Ëe øÖsÏ=—ÿ¿åÝŒëЦ´1†o"JéÒ¿ÆøŒq¯÷Yë’ ±,´;~ÍÚü¦æ>öùçŸýâ‹/Ž¿©í¥üác³œÇü\V+d¹Jõ?M$7¢¿–å}·\‚h\[Â|ôÈ1<ñ£!t%£xÛÕ;ì9ý+7JèiÆ333_½çž{þÙ°›±Q㯧¹`t7ºY]è¼Àvz¥×)túµj盹1lï{ßû¶„Ãá½.—ë7²‘_­Ô048‡ç~y¿þù1Lœ\B!_‘ Šh‡¢ý !êB´BUüÈî6‡ž°ú,‡Ã†ÜJGÌãØ‘L§àñ:žÛýÀ²,B¡-{Nç•ï~÷»o¿þúëÙ“'O™žž®¡¹kvÝê·¸###¤“˜í(t¨ÝßN›_9X6§ÓYÚ¶mÛïuuu;ƒÔ§(õš€ñá¼ôÌIüò±£8yb¹LD¤Á ð€%à‰þD DÏ–°ç¢>µÕn·#½¼€“'ràX+¹^?<…ÑáE¸Ü6„‹ª{îÃ0ƒ|"‘ð8ÎËßþö·ß~ã7ú²Ùìá'NTdo§båšýZÅÙ $ŽÀÈÈÈZ´+0=üñ?ºá†â=ôÐIHàÀÊ?øÁÿÒÝÝí~#7DQÄÌÄ2^}aO=vÇÎb9U€( 5à´¼9à‰^ú«Õtuáõ;Õt”KeÌÏdQ*Ö!íZL_)ãøÑY ›ƒÝÁ!ñžó£. ÃÀï÷s]]].—Ëuñ\ðá|à BÈზмk±z[…ÑI§H c°NÓ¿ø×ä#ùHèÊ+¯üÿ{{{ßsË-·ÜöŽw¼#óä“O—J%Û¥—^ÚÓÛÛû¯×{n×:YœÏáàËãøÅOqäÀ$Ró+ê‚δoxÚ¤§YBÏ®òŸ‰õÀp ú7kË;ò…,¦FóàyV¶X¬`èØ<Ž˲ˆÄ¼`˜sû•BàõzÙd2ét»ÝçïܹóÖ›o¾y›ßï?ô /äa ÔõX­âPå¬" íß¶kò3_ýêWÿjëÖ­Wôõõ¹¢ÑhÐív¿ý}ï{ßmW^yeá‘Gyõ /|Gww÷b>o6SÄ‘W'ñËÇqàùQÌÏfQ­ÖLÛñ àU1žÈEÚ.ài`%SÂyöª@¶ÙlXJ-`ld„° ¡,éX-U1:´€£‡¦@‰ùÀ²ç¶uFÇãa’ɤÓãñœ×ßßó-·ÜrÁæÍ›?õÔSY³ -ÜÚiXÅÓ+ #ãeëüzO3S§ü×_½Ïçó}0‰p€T ·lÙâëïï÷Åb±?ß¾}{©R©årçêôÞb¡‚áÁY ŸÇÂ,UŸˆ¢É-Š™(ãLò}¥Ç¿Á;Q-*¨îÄ$ªÕ&GSØUãñ(âÉgË œ5° +eüêgƒx陜ñο¤vû¹¿kR$a"‘Hpyyù½çí×\sÍ+/½ôÒþ{î¹çuh[–Yƒ›Ù0¡ñWãuG¤#À)j+Oì}÷ÝwÏÖ­[ßîóùtŸÊQ:lººº\,˲Œ p»Ýg|«vDéÁþWCøõ“Ç09šB!¿JibMË«¢jkýŸf(Þµ<1ú¡Ýˆª;åA®{›¶ÅÔ$8œvä ˘YgcÁPƒY_Bµ*`j<ïL ºZG$æo;ý_=ê´8NÒÕÕåôù|›Àûn»í¶w^~ùåÇ~øÃÎC?Öo”f °•»*§jœ²p ÚßXV³oß>W(º#[š÷,Ë¢··—ëîîÆÂÂ^ýuƒA$‰³n#‹zMÀÄè†ç0>²ˆz]Ð Fº™ê0jxÕ20úÐ9Š ÖƒN•¬+têdÕJ ¼M*K‡ÃÏ»ƒ…PÁ(æ½EµVN+•^zn^Ãyç÷àÂK7Ãë;7-6Zü~?öíÛÌçó—»\®ïÿøÇ?þûk¯½öëê°žûO[€¹ö·:ïˆl2Úiç(ç­„ù¾ð‡ñxÜÓŽFg‰Dñx©T ƒƒƒðù|èêê™\î«ÌÁœÃȉTW«Ò›”Õ¥ðŠöÔISÀksMô€oŒc=Í…º `lxÛÞÒ¥úèîN «7é±" 7Œé³z»õš€ƒ/OàÈ)ì u)‰>É›¥õ n°ˆî„`ô„ž¢±z7{0y² ?^oE˜Š!?‚ bðÐ4ŽžÁÖ \tù&Dbû9²”|>ééé©|°À s­N‹•Њ TY/ œ¬a›¯õ˜þRÏÿâñ¸çT¾’‡‡±¼¼Œááa8$“I8ÎÖ×!¹L'^ŸÃȱ9,/©;Dš{/*.zЙ”¨^ËSµÁij¾ÀÉ› ô³40+QÌMgP*VàtI–Ïóp{p¸X5Ïjñ®QDQ”+ÍbÓ¶(.ºl3ÝçÞzƒãÇ—¾öµ¯ý€ÒD5º>+ÒŒÚÑük tÚ°hšÞ³ª'*ø=×ÓÓó©îîîŽ 5 " "—Ëall ,Ë"™L¢û Œ“VÛ-Ì­¨î:-JÚ1ëš™¾!9š÷42òƒ‘lôÏ2gíYÒÅØ‰ì:¿GõÒÓÓ…îþeŒŸÈƒðzóÁ`¨jlCcAõ<6¼ˆ±áEôô‡qáe›ÐKME>›¥X,bjj*ó‹_üb@RûŸÜ{ï½±]»vÅ?úÑ41öòÓnmkEÖc¬›Öù o³zk<wæÁ¼>:ý± ŸÏŸÏ‡|>™™‚€d2‰µ~·¯Z©áäñ ›Ãôä2DAÔ3[‡¯»Ývs¡ àÍÐlè¯SÂó133–eÔ>Q1;µŒW_Ã/ÄÐÑYdRˆ¢uœ]ÑD¤ÆÂ)PRîZaèFòUoÆxÕq~êPCfóA÷<ÒÐ9gÊÀtÜJÌD; %v'XR#I»G6›Ej~ÏPq¦&×$è“ÙÎx”KUŒžXÀÐë³`9¡¨ç¬™f<<<,T«UîïxÇy»wïîÙ´i“Óï÷óÊ4!Ä.Š"óÐC= k+ ®¬”iƒ¬Ó²Ö«ý­¬vÇŽûûûûOëæ}v»›6mB¥RÁÜÜ&'§QÈ29šF©XÕ41Ñ2!&ö.õ£o³ëÁH;7Ü!FæwZ0‹¸MÜÖÖ\ ž `üÄ"ö\ܧúóü'ì:"BD ”fñwBË–ð«Çñê³£Ø{Ivíé–; 7X,²P©TP­V™·]ù6;ÐX?‚P(ÄD£Ñëü7hýFhÖ'`L‰¥–_‹°f à´3 €¡Ïxà·íÚµëÖÓ±¼·^´˲ðûýˆD"¨‹e8¼UT+uWj`mhÐÄzGZ»iºÖòšw¢÷ÓTÃPŠ”v‘—S·éÃ$ÍtÜú4C›}H?T¾¬¬ÖÐ݂åõÍäW XšË£RÀrŒš[Úz._V¢¥Z÷gbT«uL¥qìÐ4êB¡¨¬é|„µÊÚBOMM!Âét6%ºT*%rwàå—_ž€õ¡f j‡Û´o¬™L¦ýZ™$­@oEÜg>ó™oïØ±££¿´;5‘Â?ÿÏ‚!±¸O›Í& Ã0…‚H&ð…lpë…l ŒJF0Í]MOŒ€'ÒÔ\õr¼4™@™í׸Ððjz¨t[^%*QI3kcèцéìÙ\K³epk`}=¨ÕsSS_Ÿ =ReLµš€ÙÉ N£ºZC(â==¤¦ÌÍ͵µO"Çq6†a\?üðãªÐÙØLš1QS–ÚØíϮٯ~õ«ìÚµëzzz6|~èãÿq s9Œž\Ä¡W'!"¢q8®‘ü~’Ý øƒ6¸5FD!W!ŒyûÖðÄðzÕ¨ib¥¸ú@{×l À£Â­ àõ §’B=Y*ô$UʯbÛy 5­v› Ë™%ÌŒÁÂ0aµµE›ßò Ê‚N— ˜ŸÉbðµi”ŠUÃni½AS¨œšÌÌÌ Àát¨Åh%6T*}ä‘G¾W­VKØ@+ Ý5k"€‹~šý¶:"`?÷¹Ïý¿;vìØºÑ³õæg³øåƒj*kÕ:&ÇR8øÊ*Uy±ŠA‹BàóyÑÝÝ…@Ä §·ŽQÈT!ª]x3Ml†‚fL©¼•õ#à‰.^) ‹@…UÓl­!n ^Ixáöj<].—‘š_A¹X˱ë4ô„a,Æš?òŸ(ŠXšÏaðà4ò+«„ܰ;:?éUþ0)zzzÚ\xFÉd‡Ã1üÜsÏ€6KP«öþº¤£p:´ÿþýûwîÙ³çî¾¾¾ ×þOþô(––V4­,£EDÌL¦qð•q”‹UD¢^Ý'² ˆÝ=]F\°{ªàí@![ƒ …MïÀ‹-HºJß~s¡ámP€WbîYæ€oE&Jú†AW?Õ °ÛP(ä°0]Ë2à6µI¾LÊÔ¯©ôbÇÏ “.ÂtÂá<…A%Cæææáv»¥ï$P %)!‚ã9^¨ Á‡~ø? uÒ[·›³"ixhG àthÿýû÷ß¿sçηlôzþÔROüäHøésQæf28øêòÙ2Ba·iåq¹œèJ&ŽyasUàp…\ ‚ e_W5¼@ 8:wsÀ+ o xb[sÀ7€“Åü*¶îŽ«VÏóH¥—0?Y@À°Í#h8µ}£Ð9heUè˲é"NžÅÒÒ ¼>;\žS³0AçtéòhÏ4žç±´´äÿÙÏ~öP>ŸÏCjÐÒ1+ f@[p:´ÿ'?ùÉM_|ñØpíÿËŸ½Ž…ùœü€ Є i‘¥…¿:‰åt.·D"Dõu9™|à\«pû ¹*ê5#Ьßhz+;Ì; I#±¨4pꀕfÅA¨‹ðGÜðúµWV¯×‘^Ê¡X¨ƒãškwPé3²A+Pë*]–-Ž•LïÏc~: ·ÇÏ:—"/,,€ãx¸Ýk›§&Š"òù¼èv»ç~õ«_†Ö è„Ð !€ Òþ4 °_ùÊWþûöíÛ÷9Îu±]»’ËñØi™ TUT@§ÓtDõ—NåqôµI,Í­ÀãwÀã¥+€ÝfG¢+Žh<ÞU;@PÌUQ«AÞ4Ãð40éZ®1üiÚ†&“À*¤)àEÕ¿ñí© £É„‚­(Šè©)´;lÈ3Xœ\ðrùä'Ú×@M i¢Ã7r‹¦°²ŠÑ㋘_†ÝÉÁ´ZnÒXEQÄÄøbñX–aèw¦<Ø\DQoã¹Z­{è_zÒh@§¬€?§L§Cûßu×]ÉK/½ô [¶lÙpíÿôSÇ17“Q“¦€Ü üÊ‹¤ÍW‚ìrÇÌbvj¯>¿£aþ;ÏsˆÅ£ˆÆB°¹ëp€R¡ŽjEÔúä4Y@_`&€§+³™(¹ÓžˆjD=’3©xàRËŒ ”¯`ÓÎ(XVŠƒe,/§±0UDiRPG@MçÍÔæá͉K‘R¡‚ñá¦FÒày¾Óà£Q–—@Ãéš9û}¨ò±©ïdvvÎyøðáÌÏÏg '€v,vÈ@ëf@KhSû+çV 7;Ô¶ÿßüÍß|aûöí»Ýî¶3¶)äWñ“ï„ ˆ¨iÐ™ä º²Ð…!XÉ­âÄà&GSp9mð‡\P,€p‡h4„X" »»§_ÀjI@¥,‚0Ô³EíçÚ8- IDATùº?ce·¼ZÅ @шKΓN#7’ TÒ ãÕƒŒ."Ü>‡ 9Û¢€ÌrÅl]šÔ P›üPimÈ‹%z3Æ_.×05šÆÄÐXŽE0ä4Uä¢(b||€ÇIÇ0ê»l‡DQD¹Tf\.×ÊÏþóW`¾6 ¹V8Ôɺ `æü3†s榛n _sÍ5ÿ}ëÖ­NbVâ”ç~5„ɉd9¡”BUb~¨á$¿¥ü*FNÌcth6`Ø%Ç(„À²,‘b±0œ^NÕJÕ’ô\]Ç%àÍ€i‘"4àé¸A…mU&”»ž …4§{3Õ °Û‘/d°0Uà $ëµÙa’~öP:o:o0òúJ¥Ž™ñeŒ[‚pÔ-Š„ÇåÌ2Ê««pºœàX À‘ç‚4Šy}E€ã9¶\*'zè¡PFëIAíEn"Í0~*»fÐPýL£_æŽ;··×³Ñà/—«xíå1¹â‰:ðKªŒèN” ¦‘ˆ43OY(G”s²ßlº€§Ä#ÿóEœ8: AtÖDi7ãM[pþEçaÏoõ`ë.b Q‰˜k<Q;uy²”{ÀÐÏÓÅ­¥qz¾€ÕREÍ$DZp¹í°Ûi4¤¨MˆJšÜà ÃÑÎóŒÏ•ÕJL¤¥‰"DQîÜÜ<¨妼_¢uçIM†8Øí¶ðUW]Õ€‡†Eã›53,Y†i¶tßÒ8mÿk®¹ÆÝu×Ý·uëV÷FÀ‹Ï c|tI¬ mµâ¨ZN­üJ%׈A¡Cû•«iŽúðà<‚aýª5–aø‹Gàô2°ù¤™¡…l B]P+µVX47ÝŸÆSmXzÀÃ@2FÀÓTM8œ<ü­Gœa€lnùå8–µÔøì¨R†.¯æ nƒTLÃiq7ú<_pEŸî‹H¹l…B§<σeX©€aÔPmÕc"qÁêê*ëp8ª?þøsæ(úÂÌ °ÚEÈâ z±Âùz-ãÌ®ªŒásï½÷þq2™ÜðÏyU+5¼ú⸠Z%Ú©ü€¬é Qå­9ø!KÖ¥B¯üzßÿîË8òÊVWkrLÚûe9=}Ý8ÿÂÝØ}Q¶ÿ–±Àˆ¨×ÔkuÔ*uÔª5T+5TVë¨UÔ*êÕ:êuA²4D‘ÚzÒÊz°|ƒinxd!DfÆ32iI‡²Bif^SiµÙaµzÙu» Ö¥Þ˜g*»þ° ]½Uk‹¢€™™Yp§)¥,]ÞÛ9† Ñ•`ûúúÞ Àie.m˜”RKÜYŠ•`:?²ÍÏ{ÝÌh¼§ÜgvïÞíŒF£·'‰ _ïÿÚËã(•*Ò µÊÈ/Qþ‘–Õù"ƒ  *47%;DÔØŸ¨·µí¸WËziÇÍbë[ع· v'µÐIÁ2,º’qÄQ¤–R˜IÌ!³XÁâdõ  uò±®ä£qÃ-i>> ~Q¿äA{aÄ|Ù²þŒºVË@ÊçJª„âJ.¯ô:†…Ûí€Ó]D¥,¤Uzbƒsÿ±¦wÕGèGù¦NwìÓݹXYY( `Êú=ѶEÒH€Ãá„ÍfóÜpà »¿ÿýï?iH@ÿ*šu6Û>Œ>·Ó&Àièùgþáþá6oÞüŸ‚Áà†nÚ_« ø{Õj]Õl´yOWfURP CÙ×* äP49H@lŒŸê"Ró+>:r© È¡®7PßÜnâñ¼A;lî ‚ÒŠ }TÑÄÍ(§„ÒðDå @ÒPQÖì u‚ [‚QÐüP7/%º2 ´-U^J^9;‹`Tkp6+ùäR5°eyЦ¨ZZ)/ƒ¦Ö­…Ù¯¤I¤›.† q‰júµ:ãöÙqþ[å/"‹R7îøø8@»Ã›Çñ`Y©P}×k$Q Š"Ïqÿ“ŸüäIhSƒé*Ñ11Ãz»àkGû7 «Óþ===öX,ö±îîî _ïøµ ùK;àWEÔ&Â*Å*@Ù·ŸhŸß–³¦U>QÖ¢zBF޳^0òúF- ok;öui³é(þ…ƒ…‚Èæ²ðGæK—±0VAµ¬lµEt%¯{ Dõ¡s³Òë*A ñC"€4‰ Š"W+>伉X˜Èaóní#¢ þ0™¡Uˆ‚Ô/*îµÀ…¬Åw«Úh+í¼}oÔ¦K¡P@­Z‡Ýa«ôü3zÀ·læ˜%…0‡C$‹½ÒâHsêT’ZElÔô–šßl£ `ëÕþܾ}û;C¡Ð†.øÿñÈTVk*5m©‘€ü¢åG £h*ŒÎZ0 Óð|ù$›.atp+™2Ü^ìê&Úþ|»ÑX°œ«§Ÿ \P¯5±¡MÛ !‰œ“65Vµr` µ‡[š-·ie bµ\C´Û ›ƒ“·$(ËȦʨ®Š`Y¢fÍÜ` €g]MÓ2lÚ— {¦æò¯ÓÍcß[{¤q}9¿“¨Õjp8°ÛxØx^¤:[kÿÆûJ˜ÙÙ9Ñår=pàÀ(ô+›­4FØ ·­€öÖ06ž›¹5 ¯øaÜn7×××÷gÉdrÃ?óúái¬dKÒÃEƒî³¿¢9È`Àô0¢ ~e.¾YC©iC€²UçÌh¿øáëxáçÃH/ÊÛŠ+#G2ê<7víÞŽóÎߊíúѿǧ— x¥"7ÞØ\Ð@o x`tñªiˆÀìÕ‘XõƒÍz0ªD HV}PÀT.D+p·µùaB2„`Ëî˜Ô£/]©XB!_DZà9 Ãjiác1Úg8;ù“v}=®‹/¾øØ!}K@WU©s+l…AKÑ5Öù?åÜêÐÝðÁ¯¾þL—(Ï>…Ñ ØsQ?ÂÈæ¿öDÉ×ú›ë„a ‡à÷û/t¹\žb±˜‡¤˜Ÿkwа±3P'Æf@«>#È­Üš…§Ã±Ùßßïnî”娑iÌÍfT° &àÔ5”_¹ÆÊ/dpFæ}¨"ùe´0”–$„H‹E “ Cň*X”ôARs¤çFˆ¸±å¼(â=~]¯4 ͸۲mª•*¦‚3ÈeòHOÕQX/gCwb¼ÎBnfà#f>¥“j¹†Ìb¨6~îóyà–QXP«Ë#r¾ÒdŒjŒ½IZ[ Qþo¨W «Mæ^]­ “^Áè‰4öýÖfV&BÔyʈÖÑ,Cà°Ûáv»ùÛo¿ýw¾ùÍo>mj0 dšŒ¹höpK2(8ÚÿÿñÇï÷‡NÇ·ù~ýÔqÊ4UÀ üj7šêúvªü28EB@Dé=ˆ!Š„è•xäÎÅ:d+C~-MŠùN‘ü»0“ÅâLþ[öÄ‘ÜP‰K1#9žÃÀæ>Ôj5̆ç‘Içž©¡˜uÕEx5oÔ¯Þ1³,âŸXŸ"€p,ˆpwÅLYó$(V¶”ˆº÷ ‹jY™¦«¨ýËbè6cyýÛƒ: OOLãÐË“EË Eø¶zt;‹"­l×}ªX–COo·sß¾}ð(¤©Áƈ[ ï5º•4ë0ÓôfnÍÂÓáØ]»výõÀÀÀ†oõ=||³Ó]“Þ|tÛž¾•-ta CYïºxUQ-µ5n ~4‚Ÿ~þÊr¯==_~ÿ&ާP¯éWŠÁ²,zú’صg¶Eï^¼1­@}¦.½Íû´v¶FžZٙǛšÊC¨ jØn³Ááa©…Ah<ÔŒHšDQêÄêÊ„(Aº”;ÕKíkLk: Ïîß˳ê,ÞJµŠåô –Ó%p,ƒ©‰œ´¼YÙëPe)ÈÖûÇ0 ‚¡ ÇŽx<„¤˜iüÀpn”VXÕ ­ì£Cb|˜Õ¡»ÿÀ\áõzãõANZ$í¯¤@>åÅ5€Ÿ®ˆ–ÚÚh-PnŠ üºçSÓêŽU“ÃH>ZšJ+U¼þâ4~õƒ!Œ ¦ ÔDГRÇRW2†»·bëÞ(zöpàZG—±ãNKY§ ¨{¦ ‡’é¨×,Ït•<ôÁj½O Œé¢¥WTy ¡.Êä ]+ä@ ¢heO Íð¤†#èÝÒuÐMOÎâð«S°q<á07™“†2 Ñš+"Úílz0 ÝfC0ào½õÖë`½6 Öš‰¥+  £´z¨1Ñìù矿```mß[£ˆ1>ºˆÉ±%éÁ ÚÚh@ƒ[{ÖB#!X[ 4ÑX49¬kB*¥*†ÌáéÇè‘%Ô*ŠE CN”f›Ebaˆ"P¯@¬À뉪Qc§*¨¸§ ºzúHpµ×o3‚ ÿ”gê @‘ƒLu™$„: ª»ïéãíÙ„ÍΨ‰­UªÈ¤sXœ_‘Æý SãYª²ŠÎ×ÿp¼ ÉdÒ¾c玛 M féœέ¤?:a: ý× n_ýêW/ðx<ýn÷Æõý)Zð™'K¶šOp¶¶ToM´µI ð7Z h+Môó«•:F/âÙãäáEöD,Ì/!7WïàÖƒœdÓ¸—犨Wë*¨xŽ…ÝÅÊŸkÔäИN-½f¤¡½3DÉZ¨IEôn @ÒÌ<ÌÍ-âÈk“à9 ,aAÀ`âdZy¡Ò$:bÈkøü~°,Û½gÏž8ôÍ%F|ÑbF–ØVpßj€YDÆH[{Ùe—í°þâæ)ˆ(¿XˆÀìt#C &ÚZNÐÐN3 ÁÔÍÊZÐâWžÐÚZ @nAÚóÕK5ŒPQÊWt%#ˆ"Ò©e”–;xõŶA&ÔlQß ùà ýsÖ ê††Ã4,Ñ¥„ >à‡ÍÉ©`¬ÖjH--cf*+iiÃÂ`~j«¥š\ß:{0°ÛxD£Qû{ßûÞ÷°¡ý9–@·¯Š´Y;DÀìß¿§ËåÚµÖOo·#ƶﳿ8Þ~ªòjà´ÒÖ  G_ŽX¾¯†Æ/V$bcš@¥Å”0tÏÒ§©WtßúÒ| +óòÔr5MõÞ<îôtA×®öû½ðǹ µZv0æA0 Aÿ® Zf€ˆ¥…Žž†³A†Uó+­)ÒÎ5D€H;w%\__ßõšôzP¿Í¤?ª´3 ÐìáF2^³W_}õ_tXûÓZ_‘¥ÅŽ¿>§ Fð[ik£µ@U¾ÀRñRñÃ$Œø‰!~cšT6€Ÿ C9‘¤n¿M«Ê‚ˆÔÒ2Ji Ыq@ÊOÛ€7€XÎ[>UAmµ®â‹aØœƒ¶6‚ßèÖ”0´·nÛÓi2¸Ñà×U°4‰À¯ÜïÛ’ŠEÛr*BJl×Ê¢QójÏ0Þ¨™[^8¢¨oˆ"Ba/â’VkÀ›iy-¯Mo$]¼™d¦Ë:èö¸á 3ºçwÔTNI‰*‡pҷϵÉ$ XZLãä‰p,/µý‰¶­¹"­ó¨£Ã)µ¡¥û3µÚ?€çx$ºL,û]Nh@c±ØÍðj*L;žZ<ØHs×]wuy½Þ߇Ãí0SS1¾¨öx?ÿëaˆ"µåµ >  A½ÔM$ß×€¦V>Pào‹0¨x,ÀßøüöÒDƒ±wg´úÏdr(eEyÿ€Ö€7P+À“ƸA…W–rTŠÊNH’?‡Ã›«ó n8`8¨8{vøuàˤ³8y|,ÃKùeXÂÈÛ}@! bôxòZþŽ,ÇÂëõ‚aˆë½ï}ï>4Î unt£Ÿ¦ÒN' ÕC̦\37ÞxãŸ÷ööz[% ™¨Z¿Á*!äWÊ8ôÊ„ ø( 'Ì } {ºxÍÀOŒqÁ*^%MÄ&èô¶$¿Þ°¨K-ÀÂÜ" "š^‰Ûðj:ôS_2 x%9œË2v¹0paœƒÑUò@Ä_”“ŸÛ9P›0¦@ b‡'`ÓÚþ¢€……Ž¿> Ž—væbéç"ˆDö“¦%/§KXN×_±[ˆÍfCww·óòË/¿Ò A[ÍðØŽèüqfŽ&nV‘N0ðöx<ïŽF£ëÜìO4iR鯸½ôÌê5Aš)ø©Êc X#Ð(7Åœ îªôn­¬…Æ4AM·‘0´¼(};‚ZÙÈeW°š#@QøÚõ‰îJ—“þ?},†¸ xÂv»ìðDì`X-Œ(Šª‡Ó‡Z™ÁÒàb*¦>,‚Ñ9KîÐ÷I­äò?¹"2 `@+™ûòG?”­áDˆòNI"NžHãÂË6fV+Çqˆwňܤf€²QˆÄBZ.­:`ðKÿê¤U' ‘Œ‡ñ0·ÝvÛ=½½½ëÚéW\øK¥*¼8n 4 Á­%ø•ÌXjk#8µŠÜºmO™ÎVà‡•µ@Å#ûuûít¹µbùÙD*_І7hTõÙÔèòÔ®õàÚн˃¿Aÿù>øâv0¬ò¨C! ÊÅ#Âæ‚ÞJ1hêÆô˜¤¡!†?5~)Œ7hƒ/lÓY$‹s)¼þÚx» aäœD> ï™e2Ñ艴<í˜::ôDz <7xž³ßzë­WÂzÃP#­Ü,E™mdãC¬Äø0æšk®ñƒÁ÷Çb±5îõ×>ð•ÿ_yn•jMNµbÃüÐM~9CFBhJZÀöÚöa‘&}š©B6!±ÞAªHD ”WUF¹N(KEuå‘ÀäÒè ÀááHØá‹ÛÁ;´ù*Vá«åUd3y”Še¬æ€BJD­l–ž6ê.1=m€‰m^Ê^ ù"¦&RꨉKäõþ 0²îÔV}*u2Ÿ+can1z¿†fúx ©xΆ޾^ÇÞ½{?àgVåÌ,:b:æ©RÝ9ƒ£Uj‰Åa¼Ï|ò“Ÿü“d2éZËVßC{ª«i¯?TVkxåùÑpjÚ’ªL8­ÖÊT×´ˆ†{+mm´ ¡yÛúxLÀïòÚêvƒ.¤¹éE” T€§òÜèfxÀæ`àë²ÃwÀæ¦@oQó«ÕrË+(ʨ€ü’ˆjA! Ô×êFÏí@ËéåˆÙu,5?»„ïN„A¥Z[g! up­!,†hKÀ‰Tâ#ÇÒˆ&Ö²¸µ%C¨u˜³qˆDÃp8{].—[Þ(¤=¨­n«i3ÀLKÝ"©ªæ‚ .p…Ãáwuuµ¹ÝÏÚµ¾âþÚKc(—ªzÀ˜Öh Â™ zÍlŒßH¦{Æ0-­êYÂ0¦)¹- ¼T^¥b «Bµ™–7|âÝâxž¸ þ¸N¿V]”Q£ÔëuäsEä²ÔÊ" K@y w-7¦Ï"1mÚ$´yÄ·xtõ­T,c~&ƒr©ËDîü#Òô¡ýÞ·¾õ­ïAÚ6Üj£3iÙG`e¦IÀìh¸ÿ¹Ï}îöX,æfYz ³UÊÖ®õ•“z­Ž—Ÿ3´e[€_I¤~ mÝh-PaTdXY °L“ò„æ#†|X†ÍÉ!Ú릋s3‹(Ìk/„¼îL®FÀÃx"<üq;\!íCF¶V®A@!_B>[@¥, ˜VsÌjCRÖjst[û7¹as±$l:ke~~ _+ƒŸ%Ú·þTQ nQù'Å ˆ(«˜]FßæfÝ ÙLÌÊq<’ÝIûŽ;>à4ß(Ä:MüGŒÀn±â‡ééé±wuu}¬§§§év?§|åäÐIòåÚÚ~£[SÂÐrÖºmOÔ‚X_ÛÞ‚0,­ {[`ˆZ,åR«ù*„Šö‘ʦ€×ŠIwí óðÅmp‡y¹Ÿè‹Ÿ~;¢ˆb¡Œ|¦€Êj ¥e œ„E:&5¨“ ¶vj¼pÉ8–r³ºZÁÒ|…|vÞ€H3ÿ ÏR”*¨  /”ÎêácKèÝ$Ït7Eº™•kH·iAØl6„ÂA°,³)‹…¬š€ùk2úkh´Ó°:t÷ÿþïÿþ¢Ñ¨‹ã¬ûþNü"¤]b^üõˆüôvÚö0¸µþ–ÚÚNšh¬ÚöZššµíÍŸ¯„lÑyz…\³$íOÔ¼hYoxÙÑdáÚà‰ò`yMó‰/¢TVW±’)bµTA9”ÒBE{(Ýÿ`%µUX£OÞÎ"ÐíÐiÿ…Ù¼8–å¤òYuÃOµžÈp!ò.ªuU‹g|8ƒJµ.}à¥Ò-D™ëbL7!€ÓaG àn¾ùæ¿þõ¯ßíã!Fà›³Os!ô(€øMR~˜H$Â÷ööÞÛÝÝmºÕw'´¾r9xh¹L©Ãm{øunV„ œæào´Ìܬ¬-4!tmñËÛVK%R­T±Z¨@¬°Ði ÀØÝ,¼1Þ(ÎA›»æõ¥²ZE~¥€r©ŠÕœˆbš ^¦Â™>K»gí´~P7 dHOx@¯W²W­T‘N­ —)KÚ_?!Ú–ßJ ÊlSéBûQ²V1>¼Œ­;Ãm§ÐJL›<‡xWœß¼yó„Ô ¨Cüu7š Õ‘&‡îþ}÷ÝwƒÕVßfàotӃܨõU€žnÞŽn»mo4aXƒ¿yÛÞåg鱡V0?\k«m¯OS#‰p<ƒØ€—2C¥^ìâ£æÏø Nàì ¼q ô67¥é›ôàr%”K«¨ŠK"j%" …)Ñ=©ñÌT:ê6B8ž ØeÓ‘ÛÂ| ¯<7–å@ˆÚù'•;ò÷!¡´ûµ¿2C}h0…-;CkH]³ÓN&i€Ä&XŽQ‹¤V«¡°R‚Pæ´B!“á ¼ž‡«§ëŒ&B]@©XF©TD‚â_´ô¯”‹Éi!êÏz@mþ ó˜‚}j«ïZµ†Ürét Þˆ¤ñƒŸÒÚ\}]5hµÖŠ"f&²(jp¸Öþ™K-ÕæḊÃh,Â]wÝu·¼„…Ù¬œkiÛëÜÊ,?ÞÆ ”äárðz=Hö$à÷ûõmpY¢Ñ‚=Ó(eÅÆç+…I烶0(¢‹õ{ÁÚ-.¢^•ÆÛk„® OÄg˜Q?Zaþ>¤Š\*–ÅåT¦F¤-oÄp$ÈÚ6pY¸ƒ”²5¤Ç+ȧ«¤c ¶@:iÇ€`·š’,ÍQÈå X˜Ëç`D`i²CÔz(ÓIC=Õ-L¥F†Óع/ Ê× IDATj™–Soƒ×ç|W\qÅÖgžyæ¤f ~šŒb´ÔpÆ©ÀV¥i$€ùæ7¿ù6¯×s:-WíÑiÓ»[Ÿ>{á×Ô¶4ÓÖæf9LݬÀ¯ÅoÔÖ,GìâJØàt;ÐÝÓ…P(ˆV3yž‡ÓmÃÖTšLHŒ?4"bY‚ÄV@zq! ±Ä!²ÕwˆÃk¯ÎôKµ"P©T±¸°´Z,”ê/¼ðÂØ¿üË¿L]vÙe‘»ï¾ûòdw2‹Gl6{ã7[~Ý{9”óu¤'VQXªRšõôš¾ÕÌÒ ¿Û¦+‹Ôb^CX©÷RÛ_êù' DZù'ÁCƈ¢ýé¶€H÷ H® sy䲫ðú¬æÀY§¶©ÅD¤¼8vtu%øßû½ß»ã™gž¹ÒÔ`Å1Ü(–ÖÙj@brïòVßýý¾vÁ¿V­¯ÈôxÓËM´µbwjýš!ЪmOƒ_O",ËÀaíµÃá²!Ù@$F³¡N3éJƱ0:ŠBª1M°HÝîõ€·3j¡ÔêuËyĶú(«ƒ.1í•I=Þ™J¡P<4ýÈ#}öÙg§ä!­2+?ÿüó#Ï?ÿüá .¸`àwâêM›6ÅbñˆÝÌ"°»tír¢R´cy²‚•k‹`­ n ‹€¦}|]<NK· È犘™ZÇ9ÀVŽAiû3JŒ‰h­ýúDuDàä±4ö]’°H«µ…ÞÔv—o²‹H$BæÞi…`ë_!¨^7kÒ÷™¯ýë¸Ýî>·‹îûë¬ÖWJûÅ_´¿fÐnVm{Р×dïwÂåá‹GOÄÐÎÇLSs9LŸL£”_Å¥¿»Cu‡Ãð%&PL×ÀoÙA©¤Ÿ!HlöÑÊËée8œÒä3e_«V‘YÎÖ ùRmääÈÒ#ÿû‘£O<ñÄh½^ÏC~–:”ïuy80wû‡oÚ±cGÿ=÷ÞsõŽ;z"ÑÍá´có†wĶÛê·!3UÁÊ|¢@%f@mîÛä‚þn½³œÊáµO‚€˰>çÆÊëþµ TºþQZûÓÊIl¬ç¢ KcïoÅÛOü„çxx¼nÄõÞ÷¾÷¢G}ô)´þ† ,ÜTÿFUÖLãÓ×ÌE]ôùþþ~j³ÏÎj}¥f/Ìæ0>’²hÛ-QkjÛË™¡Ãåg‘èwÀíç ‘L&ÐÎWŒ²©¦O¦1=’B¹XQÉ¥-Ãíw¾Ôãv»Àryˆu%V$¦·LÂI7ì.N3@Eù|þ GgÞ ‚€•l¡žÉdkóssÙïÿGøÃŽ”Ëåô _ ¸!µ%iZ?€ÐñãÇþøÎ?èùÄŸ~âê ö¿) ØÜW49;ÙbC°WDv¦ŠÜ\MÊ£N:jk‡WO”ËÓÚ_D>WÂøè"8Ά‘¦7³ŒÜÊ(Ã2.díO×gh [Eû+µ|y©ˆÔb¡ˆ³YR[Ý2½Ë° x‡®d‚»üòË?òè£>ƒÆ©Áæf`‹&€YZšó¥/}i—ÛíÞ)mõ½1Z_q{ñ™“¦m{³)¾Öm{}ÇžÞéfïwÂâø‘ìNÀëm½‰Qa¥ŒÉá¦G–°’)šRZgFÓØv~R ÓÝÛ…¥©¬ÌiÁ¤ ‰v•þøV¯®ä2Ëð6N*uAD±XÒK™j&“)þøÇ?ü·û·¡t:°=è³ÐÌþUHCIuh¤(ß_° 866¶pïŸÞ;Ç»îþÓ»ûÒK.Ý x·×Ýð1_†'öÛàï¶aeV"88UP·ðª)x»9Zõ —]Á¡WGAÀ€•Á/Š~B”Ìè:øÌ´¿®Ù+jñáÁ4.¹²[u·’¦f¿Å]žç‰„ÉäÄÔÅèP3 ÙŽ@0¹G0oûÛå­¾×6:wk­¯¸¥— 9¾½©®¥¨½¶==@`³ÄûœÆmðµèÁ§eµTÅäȦ†SH/¬èˆÄLfN¦tàäçE-/ ±ÁüÁ.^+«ºˆL6»§Æg+…|¾òä“O =üðÃǦ¦¦R@Ÿ¡ŽH /AÒöÊŠ2e™6 k´ŠŽæçççÿò/þr:$>þñ¿íª«¯Úúy¯ßÍóO8À×ËÁÛÍ!?_Gn¶¡¢½åõ€º©G¢?u†pvhuI±’-âäÐXÖ¦šü ÃÊŸv—ûVEû7vð)Úß¼O€º0r<…‹¯H®Éâi*T<ÏÁévÀápp·Þzëúîw¿ûoh¾B°e3ÀØ`vèîýÅ_üÅf—Ëu‘Ïï3˜DÓúÊÙËÏœDÍT7Õð²»Ñ|ÖÚÑg#ˆ$íˆõ8átÙÑÛ—D0غ¿V­cêd “ÃK˜ŸÎ‚¨>Ãh"é˜ @ae™¥·œD¿ß‡”=#Í7±jŒ#ñÍÐÿL6‹b¾XýÑŸú×}èèààà$°æ iú 4¿IÓW¡MU­[*´ŠTƒd%äøR2™Ìü—¾ô¥™¯}íkOÝu×]o»öÚk/ðøÜ¶@ÐËË’À›`à‰3(, X™­£¾j¶„¸5¨×"Þ««—+Ù"M€,'µùE ¬´êO*k"›ýÒì?‘Òþº5 #²3´ª_©bn&DwëÏൕ7êQ !à8‰®8Áçÿáw¿ûÝ£q£všª¿vº³éH˜w¾óÙ××çÛ(­¯xÎeJ8qtN~Ö#Råc œt Ñç„ÓÅ£«;h4Ò²_DÌŽ§1>´ˆé±4„š~ü~-2{2­ M Z˜Ì!7#jù G¨üù"v¸ü6ͼELOÏTþóïÿçI¥RKŸA#è‹*…zEÛA¯/p9Ј@€D9Î,d"(•JÑ¿û»¿[|à~}ûí·_rÃûn¸ÄðÛ‚!?§ÌA ÅeàŽ2(¥d"(7xéˆ8 X—Vóíüè4Ë0ÊÒfÉ Ã@T z)°¯¢ý \РýÕ‚ƒKH$M—ÅÈB@Eµ!ày¡P£'É—Ëå1Ù(¤f€! }3€>Ã5{×]wu_z饟߼y³Cy†ð/­¯w×´Ýs¿ÆülnMàgŒÙ°å<z·{°cw¶ïÜ‚žÞnx½ž¦~:ƒ×_™Äs??Ž“ƒ Ȧ‹’¦0hiÕÐ],ÙO¹PÅÀ[b*Èív;æ—fQZj>@ôï I߬“Ë%›É?âÉc>úè³ÆŒ˜0 `Zç^hkÐÀ¨ù‹^» ç‚O’EQ\½^/¾òÊ+3ÿü¿þùh©Xªôõõ'ÂÛl¼4±Æ œ‹ÀcÀ; ê«€ÐzNњĿ‰Kuþó«8r`óÓY°œ <ǃˆ<–Ãr’ÀhßÝ &f#ÈuuZíО›Ë®â¼ c¦epÊB€º `9E"‘X|饗B Ц‰•EÀüĈ 7ÝtÓŸ÷ôô(kQ;®õ‡B¡‚ÁC3m·í½=[<ð8„#atuÅár5c`IÒ‹yŒ_À؉ó«úÎĦi;²Zª"5»‚HRû6J8BÆ‘B½";+Í ¢f Þ®]WšÓS³•ûï¿ÿgÀ? MÛס×ö€¹©o<7^ÓÚƒÖ(J¼uH•­ÍY!ö½ï}où{ßûÞáoûÛ²mûV›ÝnƒÛãR×.ÐböƒÕœˆÂ¬ˆJ~íºÐ(6/ï&ºÌä–Wpäà8+÷) «~òKï´ìàk$Z´ÕrSc9ônnü&ΩRCX–E"g·oßv+€ï¡ùF!M›­šJ`rË-·D<Ï»#‘0#Ò%AœªÖWܼ0†ZMhкt›ÙíeѽÙ@؆@°ýü|¶Œ‘cs=.iy}ükc[Õ$ŽÙÑ´Žâ]1Ì'–‘›PÀOF'b›½ Kh%»"}ýèèäää€ióÌ}EË+š0×â ®›‰±)`FJÓ@é'PF–d8pˆ·1BAâ+`³ñðx]àx–ŠZ›Àæ#¨äEçD¬f×Oî.¢îj±‚Ñá9Ô«x›,ÃÊS¥Ž?E©¨Ÿù†)Úß´OÀPÂ"€¡c)ônj¬kΡ±bÞÆ!ôCÄîîîîÐôôôº÷ lµXæÖ[o½·»;éV´­o |ùÊþÕRG^6iÛ8] ’›Ü'ìðxÜèíK¶Õƒ_.UqòØdYÔú9díڻɒül­¬¯%¯_(üäC mxýìð{a+ÖÖ±ym¦dQÊ’Hñ’ÞÎ`Àà¾W£ï®ªÌý#+«²ª«ÀŽÝœitWUfVVeþ¾+¿üRƒÖÑÖÖª>ú裿ññÿ'¼BüÜ?¨¿ìàÿÊ#<Ò’N§ÿ§LG‡æ{ò[Æõů ¯ÏÂ4,zXAÏ@Ýû¢ˆÅ£èß׃¶¶¶]Yð¯_[ÅÔè 7æ1v㜾a"uGÄwÂ4,¬ÎçÐ=ØêœÎt´c{n f™g’m  @¡PÀĵ‰…ÑÑÑëàÓry¸S?~ðïDü¿ýç©AI¾¿óûÒ¥K¨ÅJ é*_cŸËmbyª„ž¡´µ'jC©u5k1 e?`VJË •wö¥X·— U+f§WQ«ZÐC:çþDáÞvÄÁXƒmtßÂN.¿"³Ï;cŸ¹/ĪQL_Û¡£n¿‹D‚~ía\ª ®kèîéVòùÂüwx…ø¹¿¿v§¿ƒlþ¶’ßýÝßýDwwwÌ –ØxÉîŽ\¿î¼K Œš‰·_Ÿƒ¦töGп?h\Go_Ï®-ø³Sk˜¼²Œé‰,,Ó²Eã '–Þ‚±|}ÓCºº;±Òµ†íi¯$NèHuD<m~v¾òÅ/~ñ‡²à:·èè!;ñÕF€:OÁ ÅBõRÀÆììì¹Î®ŽGZ3iEU¨š‚x«…K¯ÌAÓ ŸèF¦§É–(ô°V7øÕ0b=@y¨lŒ"0i Ôâe”¹.¼:É}Š&¹û ÝŸ/úq¯M@¸T&¾9¸ ˆ}àº{$7b0$;Âôd‡Ýl úDl5 ™J€1ÚzêÔ©¾·ß~["÷WÓ>ß1"Ð=÷ÜommýpWWWèvq}0€2†ËoOãøÝ-ˆ§ttuw¢««rœFiqn×./arlÕŠ}ÇKkoóo^“÷^Ù…ÌšÍ^ΉD GT® 4!èÜŸð°¢J¹‚¹¹ùÕ7ß|óø\®Å·ø›‚õŽR€|Àµ žxâ‰Ç~O¦³=¬ª<Î^¦WÅÊt F­†Ëo,BUqàx'z÷µ!žŠ ­_k¡ê‰~ Þ”WòšM¤ÖÄ»½3 ÙåLƒ!Ž ¤‡ÒÃS h!hDQUû½ói@ñ$2Èì‚6a`6è™M08îÃv}„‹³”Ê¢‘ÝjÚ»OŠ¢AÓ5tvv©¿ò+¿òÛo¿ýöFc5 ¨ß›ãßg?ûÙttd⪪ßókà»çí¿”¡P(`csåR=-èê>°+ þÚjW//áêå%¶Ë;èõ»IÁå‚Äú½&J–g7Ñ(ãœëêéÄöÂ2¬"'T¡¨Š–ž0ä—53=Wùâ¿ø#pî¿ ¯˜·[°“øïOÍÄþ T*…žîž]Yð··Ê¿´ˆñË‹ØX-B„«{<¿å´á•›O U1¥È–§·< £#ƒ…Ž%JòÈ#¿{îܹßWÃ䙚fýé„ÙJ[[Û¨T+¨Vª‡ùì…릉õ lmmÙ+™2ÜÑ‚oÔ,\[ÂØÅELOfÁ„¾xéÉn9G¿ÅI´‘1`ifCGÝõâݽ]È// Ó!pa­f ›]+<õÔSáêþ²åØ÷ß ›Î°7‚ÀÀ‰TennnÕ0j‹åRe(æ–øP8„LO Ùù2ˆeÁ4 £+ŠÅT`X*f§6p}"‹Þ4Ž@$F"nÊ,¨ÅÛ(a{«ÝæþŠõ—RM,ü!àz¼ñÇi|#îßÀåWÎä%ü[Ô7u5‡Sgn}¸0BUå³JKKK‚/éö¯‚ ‚®ÀÄ÷Qh_ÿúןjmm-kšv,ŸÏ«‰dRÓu½)ð-ËÂúƱ¹¹‰T*…tvv"‹5ìDJ¦®®â¥gÇñoÿc—±¹^‚]qeßwÜÜmW áwãmVšæu ò½AÌš…þaW ˆD"Èn-£{ ÝCɦ¯ÏVÿæoþæûããão˜·þûçýìþ à7s#„í†ÎʃL öõõǺººïimmQ4]ƒ¢*Ðt‚õE °ãÀQ¸Åžp] ¶·Ê¸6¶€íÍ"âñ¨EíYƒúæl­ñÒ3—P«XP5šÊ?*QA ¹‘=ÆaâˆýÜ_:ß(ˆW* \4pôÔÍïàOŽ:VW²ª¦ioŒ_‡;Käkq}jDªeY‘çŸ~ëk_ûÚ¥ÕÕl¥½­½'ŸÏ«ÉdRÕCr¸(Š­Í-,..!»¶†x,Žþþ~ôöö"‘hâƒÏ€¹ÙuœaßÿΛ¸ðú,²+Û ”5R£cØ n̺²7Aš£fí¬U t µ"æš—¢(ØÞÎ! 9ïÈ4L\¿>]øãÏþñ·À]~WàRõ °KoÓùÞ ÷÷s“&yäóþ|ËþÜÏýܯ···iZˆëãᘆõù¨Û!GpfÂ# ÙQzÄR]Blçʸ6º€Õâ‰(¨E »ë (eXÏæqñͨšUÓ¡k!hªˆé?Euîç4³Ñ‚ùEúÞšD*(rpÆ€JÙÄÀbñúX‹·"™¦F I¥R?úѾoØpñ()ˆ(¿éØØØú׿þõ‹333ù|^ST¢­¯­cii ºBoo/úûû‘L&w7ï¹§®àìcobia‹;ÿHÜrw\üæ@c bgâ4¸Ïí Et´v¹aÃ5]ÃÖ–ñÌÍÎ×¾üå¯üèâÅ‹?…ËýEðŽåü{Qšq{?£hD8€†¡¾ç=ïy8•nÉ„Â!h:çÞF•¢”ããÓ}— ¨DÅÞ¨“8º|¾PÅÄè"V—6GA)E(¤¡°UÁùçÇP)™P5 š‚¦éPˆ0;òânú!š*º“ËoЂŸ ›“òº×¥‡ô ìl辑D)EH cee5óƒüà«à³E²º4èûFÊ8³+¨‚ë 3ÆTU‹ÇãóÛÛÛYJ))—*¬«« wÜq»š¾“Ó¡#(î5‘í¤îÇMÞÑ@\ô/_ßô\jiiA!_c ¦ibss³òõ¯ýUpãß6\ÝhÀ¤|ùš?ÏnË5R}‚òXJçÏŸÿ—ìêšÉ¹"·å´÷E›»+P ÚÖzEÑ ê!¨ªMÑ@ˆU Ùsù„õB¡rüøÉ xöû0;™E±PÅÚjª¦A±%ný·¥ ¸ŒÅÓ¹üÊãáôüO#îïU#ê_ÌäÕ\WïM'Bø&¢¡ˆŽX,¦}ô£}/%3OÚ‰M[ªŸùÌg:ßñŽw|¤µµõ½Éd2ÔÛÛ›H§ÓºØ^Rÿ@Òmqä6KžóNK›ñ—›M~¼ÞÎ{I©\¨"·VBK&ƹcH¦¨Õ ¬®¬ßùο¾H)Í‚ûü—Á­êÍ@êOA|­Q×d]žœ—¯5+k¨~ãßxæá‡þß«•š¦é*˜Ò+(ÇG)ˆ¢@¡PmÈ “h¶[±B4˜Š Å2Q,X8÷ô(!еˆª¹Ä„¨à“ý.#¼üöìò+=­ŸûÛY¹?C1_ÃÊbÝ}®ôw«’¢(€ÂÐÓÛCNßyú·|®ÏˆÜ‡€¯ƒ‚‚:¿Ÿxâ‰uttü~$Iôöö¦Z[[‰ªÖ/渙tâô>¼ôìø @%[h~¯½ÔËó®În!Õc”1´µµcey›[µ¯|å+/ƒÏûÀEÿ@¼“tDˆïš8þóòµ ²òoÃ4Í|.—»\Èï GuèºÎ¥€Þ0Šãœð¢ðe¹ ¤RâìÖc°X–ÅõQÛ³ÐR4PFA)µoJ@Q¡ŠªÁ2Š£"‚1{îŸyÐÛŒûûhACî/¯­#6¡¹6¶u['€ZÓiLZt<O‹Å"\æX k¤ª¦i{N:Õ’Édn9øàø}·vÝ&F\—¼÷ ¸ë-lÈÊÌ&,j2F)âñ8J¥2ž|òÉWLÓÜ_6ü‰´) ‘t½Q¹½\kT¿ˆP~æ™g¾±–]7…:<ÓvfTÄ4¯mø³—ì* wÒTsvU :45] C×B©!„´tU‡ªrð ( ± …üÃÝü‰ÓÈFÜ¿q8`ösø÷<6ë×r t§WycI×uèa étZùØÇ>öëàÒ½kðhšMÈ«_ýêW¿½¸¸˜¿• õ§Lg =}i>ýcw˜ó!îgW ë›èæ7“vR!š¤ZÅÄæR”RPFÁE*•bSp½þä_€Ý8èúÍ–k&qìTÖP;{öì«ÕjµV«¨< P8®"‘æ¨÷NnÛˆÂ#ö(ŠMÕì8 A ] C×ÂPÕt5dçQÁ €@åF?BÀlߨ˯¨-`À«ïÛåÊe³ÓÛ¸‰(ŒXèîî&‡GÜ'@ÆwàmF”ù—Émoo— ãÇnò¥ãwôCUU¨ªMS ©öGã]S k*4=ࣹUSÜê~ùcš`b#¬Î°-ø·ï™Wç¶À(£ ”R´¶¥ÉG>ò‘Ÿ·ú—Qoũѹf€lVn7çv[gPY@qyyù­\.Ï,‹:¸LoÄB\ÝœÓ|Åž"´…T¾¥—¦jÐ5î誂Ֆx¨/¡÷®ZØÜ?ÌRãpÿ 0sÏŸÀ‰1¯øV%®èhiIÁ4Ìξ¾¾vðY>¿!ГšÀzóÍ7ŸYYY©ÛêáV¦£§úöÈ}ì×þÈ‘€îùØ:¤¢(PåJœL0©â†Ü_Ô7=± ø=pÒuD#Èd2ʇ?üáߟ hêvë¿(7ÝPþÒ—¾ôäüü|õ·Õ“’©(ö 6ð”ò`ý³ä&–ÿÆb}°}€x+¡@ IDAT>^B$>2!bÃÖrŒ k4E[[[ø“Ÿüä=RÍ·Ga¬O»áä7’ß5.\¸0T* £Æô°‚t&TÇm]›€ÔÂ|Â6@T Ñl‚À :c¦E=#¢$̾s7êò H#@µ€aZ¸~-wÃ/´i"e&::;ÐÛÛóp5 ©á®™€ :66¶Ïç×+•ÛËÙNGNôîœ Øyº.`¾ÿÿSÆD)­/À ì ­­éлßýîÿ„Æ;6ýÿ)y¦?õ©OÝކØÖƘÅ\5 ?Ü”k '+\ÂXhVØvÛ§€oô¡ÀYïËx ÷Ü_.<‡"kÈ=’CƒT‡§>\ße¨£]$Ƹ iYªÕ*Ÿ¡¹ÜvË]wݵ;¨ÍÄ > •ñŸ´´t[ ‡÷@UwŽŸö:Âq‹o¾½Z†QµÀ(ŸÔt‘h¤ëÈ‘#m€íÿï“n»ÇÅ=÷œù­ÖÖ´º±±ÊøšhïAQm&:¸XÉg¯c0qE~;¢ˆàè®PT¤7¹3~0{Ï;ìoÙåW¾Äý…T0w=rIÚ7ícÌ}©XB¥TCµhbuqW®Œ2EQjû÷ï?ïl€HNÿ¹Ëêèèhþýïÿ/ïÛ·ïö83ÐuËK[Ø\/ò†ø\i÷`"¬ÆðïÖW(õeý÷ >¶,ËREÙÍB øÛ_½ Ðc*"IÍVÀ ¶¦[W~ðƒ\@𢎠ñ\œÛ pý}Ýìšlìæ#¼oÔÏþóïìÿåH,*äKˆÇâP5¾Ë¢*(l›(åMçI‚¹0?F=qYˆø6«wÀ(«‹â\ãé=ŸØÞD‡÷ƒR¸ÝzÆL…ÐÕ³óîAþrŒ2Ôj5T*˜5†J©†ìÊÆFÇqýú4œœ\øÚ×¾ö¯ßüæ7¿<::zõÞ¤òkÙ'`6›]ÝØØ˜/‹‡ãñ½5z/éè‰>L¯ð£ÛÅ÷É® ÃG4ÏΔª‰DT_º^0¡ÖØÍzCn-UÐÒv¼©¸vÇwü&€ÿ|*0¨9~"àQ—äkVn§s®ù…¤ ²ÊéÓ§?HÄâ‘X››ˆ%z@)ƒªtöE¯4äþrrÁl÷‰4"© õ1þ™ýßëô#×çœhÈýwvù âþ€D0ìŠÇ¯¬ãä;/ 7LµZ  jU¾Ì~aaÛÛ9Z«›ßûÞ÷^ã7®~ÝþÈ1$S3 ©O=õÔÙ………Ûj ¼Ì ÎÕ™5³÷­˜X^(b;WsÜ‘ptz“‹÷ù|ÛÛlo±²°Ž7^{ Ï?÷þøãçáÝö ðvfPÇîâFà º?ÿNâ¾üôOÿÁ§ÿ>Ý–êWTÅÑ[Kù Wt>w­(å’‰ü–YÇm›‚ªNÌöƒ¹9÷Õî•ûs ºD„QÊ(e –ýÛb Ô¥ ¦IaQþì‘ˆŠ‘ãmxèçö¡-­w€oš&J¥*•*ÊÅÖW7qm|ß¾Ó41¸î¹ÿ.ôíëAº­…ÄQ­5μó¡wž~ßûÞ—6Móùk×®M‚ƒ¿o9Ï£õ*“:Oü¶TK¥ÒÖòòòÕ\.wgKK nW9ыыóÍ3ßOtòÖ¦b%_>ѪùWµ½2VËή—¬BTKDÂÜúR5o¢Z4¡EݤëzøƒüàþÇ{ì‚·}‚;öf¯ùƒ@ÞèœçøÎ»îüãtk*¥ª*(å[½å²&*9››[0ûa¨TMEKFG8ª Râ*k#îOm Áãl10 PÁåíÅA”1€ €ú@IìÆ^À\ßž Õ€1@U ö·àðÑV JCÓˆS'µ½?«Õ*jÕLƒ¡°]Àüüfff‰D084€_xïÏ"™âuTUl{Î" ü4MC(B$!±x´es#÷ð‘£GÎÆãñ£Åb œV7R¸e" uÿñÿñ•|ä#–X×};QFŽõàÂkÓ»-±3˜‰ïÇ›^­•kƒÇÛBräb>5UŸ7•Já¾ûï OC£WFk«secCE*™Ž’&7/d ¤ú50Û' Ý–J~ðƒüÍÇ{ì?õâú¼“°—k¸ÖøAª¢'Ïg>ó™cº¦ ëaŽ‹GûQ°6o€ <:t\:Ä¡½'ŒÙñ‚Ëuµì‚Ù\x¹m˜ƒê³×&Ð|zÏýãðñÐÛ—Àð±6I#V¥öqÐ×j5”KeX&Ca»ˆ……ELOOƒRŠÁÁ}¸ÿ÷ ­­•6±ƒê¸ŽeÄEeQ˜Æfmnvî_ŠÅbõ*€‡ø7³¸ù‰@Ų¬í©©©·Ž;öP[Û­ßñD¤#'zqáõiïÉÛCoê´‡ {±p±zôèžp.—/ÍãÍצñÀC‡0<\Ø$áî3w‡JÇJ¸zõª±:·Q)®R«-Õ8R\«!Ù§pñ“º®‘žÞž_…BZ«ÕÄ·_<Íôÿý×悼÷Õe:£>Ú†C#iÄ“ºT½a(—Ê0 Šb¡„Å…%LMM¡X,b``ÇOC{¦šªB×u›³ÛëUœhÆ;'Æ Ã@~;oþå_þåÄÁgúðh¨§AƒˆÚ•ä¿ýíoïäÉ“w·µµí-üÏRO-é¶·Ê3QB4¥7N=LÃ0N´…Óé´sŽ1à'/^ÃÚZ}ýUtvµàŸÆÑc=Ng‰Á‹ÅpêŽSzíHU¿zõš‘]بn-”ké~A1* Õ¼-F) Öµ}èCÇ¿ô¥/‡»x3©~ð7“›á¿ö{¿÷{C±Xô¤âóüxË×+Ž÷žQÖÏ`™ PL„Õ’i±”†bÎt±+½Kñb½`–8>¼™ÛšsÏŒ€÷6ιdK‡Ž¤1|¤é6w÷*gÚÎ0P*•`Ô,”K,-.crrëëëØ·oöD¦³ªÆA¯i|“¦i|‰%‰¸NP–Ä}kµ²ËëÖåK—/d³Yaõdó—³AT<èX½zõjíÑGý@d§ðÞ7“ÊeK³€{öZû¥kMóú¿ œ™ál$—/³µÒïº3‹Åœ7u| o¼vÝik±XÅøè"®\^„®+èèJIű§j*:;;ÔÞ}Ýšš°Ô‚±i¬,g‹ÉXKØ¡f J œ¨šjoË´ó›ßü7ÔOçÔu¦”Y|7å÷rÞÿQhø‡ø—íé‘H˜Ýu}©†•Ù²-ÖSX”"bñ0"ª¦‚Ç dØX­øÀ¼ŸSÌfæAt3î_'âÛ™"Q#Ç[ñà»ûpÿ;{з/HTs@_3 äó¶ ØÜØÆÜô^í œÿÉyÔjzû»qìÄQt÷t"™ŠóP^öGÓ4Nt;ª‘½hMµ#!Éc9(Y–…B¾€ùÙ%ã¯þ꯾V,§Áw“¾»+6³^®AÁà å/_¾üòÈÈÈ/uuuÝ&Á8r¼¯Ÿ›Ø}âûé—ío ¥–eÑÁ‘öp&“ñ”~ùÜ5 @°×õ¾ÿļøÂUÜûÀAÜqz€Ïo;\ …tŒÑ4µ™iuya­¶:•+÷¤R• (‰Á‘(T ½£ýîx<-‹"У|ËFi§ëÍR3)`Çχ>ô¡Þh,ú@8"|ð¼ ‡T HàÀH}û’u|˲ìi»ª¥*²«ë¸ví®_¿Žöö0+j â艃ˆ'—眞Ç.ðp}U±·3'n(sÁØ$Áý×V7éµk×®®®®Î¡~3™À$ìDùµòƒ>ø³}}}·Í58 aj|åbÍaÑ~ß/÷¹üÊsí€F€[NÜ«PÍî÷©H"‘pÞþÔä*ο|Í!0~9 ¨ÖL\ŸÌâí·fA-†LW šÊs‰JéÖV¥·¿[‹·‡ô‚¹aÍÏ/mÇ“Q=Ujo‡KMÊ’ÉÔ¥—^zi;t¦/Ý(w“OäQ|çÕ?ú£?úB¦³í´àþ„l¬Ô°4U²Cx10Â@- µª‰Xš¢#“…UU¡‡Ud—*¨:¾òÒœ»ýîÄ{lÄýoÖåWQöíOàÎûºð3?ׇýÃ-H¥Ãv[8èË¥2r¹¶6¶±0»Œ·Þø)ž}ö9,/¯4Žr¡…\¥¢†¡ƒ<ÜŽH8Œp8ŒP8 =BHס‡tèWxL Õ^Z®Ö¿ ”b;—ÇÜì‚ñÅ¿ýâ?ær¹qKðn'˜d À¯OÊç ¤OçÏŸŸ, EÃ0bº~ÛhïÅÚêÅ ¬æÞ¥Œ oø¥œ—_¼0áàã¿#ß(Z¼Éb©ŠžÇ+?™Âwàî{†‰iÎX$4UÅÀ¾}jooÚ?”ÕæŒÅñ¹|ow,‹…£‰Hôá‡ßýñ?ÿó?õñÞoWÚImð_S(ïÿû»âÉøÏG"!EV'Kpæ ”€(œÓUK ››[hïpm,½ƒql­UƒÅ~YÚ âþÞú\âBÐÙÅÃi J!$Yð…—fµZE¹XFµj`}m““AG¦!e? [ ›b;2 äô™>ÄbQhªjoZª:œ^U¾AŠˆ¡ØQŒwùådÔ l®o²éëÓÓ³³³Óà!å ?“?²ÐzùœLª¶_ýõg‡‡‡µ¿¿ÿÖ ´ÓÈÉ^¼üܸÝrsˆö']>ma«²R|pä¯ÿüÜæ¦×!xŒ³0…À+:Ú„0NU+5œio¼:ƒS§ûpæþ!Äã;?/§ª*º{º”ήŽðÚÚzh~n¾¶¼8½ÖÑ• '’Ƀ===‰¥¥¥xì…¸ý·éa7’ƒ|N¸+«>úèï'Ѥ¦kÎF'Û5l¯‚4:ïK„ýZ™/!Ѳ‚LG»£tDpåM8ˆ½1—_¯ˆ_oà©­=‚¡Ã)ìN!–¶à‹%Ôª¶7·qýú FGG±½½Þž!„ÔÔÊVy ÂcØ{iG¦#MUíˆF.ðylr?ðæb¿H–e¡X,byiÕøÖ·¾õ}¸{IŠ=åT×ÿ;9ÞË„@¼7@ñþáž|衇ÞßßßÛfÉzÚ°8Û ŒRCÏ©½Ò Fk÷ööz¬œ/Ÿ»êŠ— ªI¨;Ü¿†iâ×gpá­9=Ñ‹3÷ !ŽJuòNïèÈL¦=¼¹¹š™©”Ê¥åOúÓïÿÔ§>õذ[°7*ÛèÛÿQÀUHåÌ™3­---ÿC,Ueî?µì¾ÛnB-¡r) ¦£f¡V3 ‚!‰ Q‘éŠ`uÉžªÓáý`ösÿFsÿ<Å“:ö§08œBº5À‚oš(—J¨UMòEÌÏ-`ll +++èîÞ…v@'}X[âú#_’¬Úñ 9!Pl çîûú‰„½^L‹rý޵𠬻‘v×}FÍÀúú&VVV—&&&®Ç”wÜ(ȨÇL0:::¿½½½^©Tb‘HdW½‘4r¼×!7+Öï6劫Å{GîòÌr¬,ç0qm^HÛI"^Õ@ \‰Á²(.ýtWÞ^ÀðHÎ<0„öŒë t:&-éT´X( ¥’-¿ÿÌ3Ïü /¼ðgò'r {—ä–6»îÿ݈ر·ø’òO|â¿KFb [&6³ÜÍÕ8§cöÛ›Ö×ÖÑÝ×ádÖ3Ãêb9ÀÀ·——û‡£*ö'1t8…L—ëÈ*Œy¦i¢\.èš(•*XYZÅÕ«W133ƒŽŽnÕTšÂÚ’•|—aEÑl^è쪳ñÃmèèJÙ=uOÜ~WÜß䶈¹™ùÚc=ö$8÷ß‚»'€x ûÜoðŽX»-¾ë¸.º}îܹ:tèC¸m†€CGºñÂFwN™4<Ü-á ÃàѶ_µyùÜ5Ø‚½äùe×*Ÿy¬¸'H ÀwW[ÆÕ±e8Ô‰»ïDWOÂáb¼,A<ž GŽŽ¤Š¥Ò;R-©o>üðÓ¯¾úêçþàþàUÔäAâPû_ÑNR€"}Ô_ú¥_êëêêúD2®{¸ÿDQšwg`Œ¸ïÚ³ŠŠÕÅRm+èîí¥Š¢ «? E#° ¯Øï¤F3’矦+èL`àP=ýqwÖFòÌ«”+¨Ö Ô*ֳ똘˜ÄääZZÒ`fÄÄÚ’b.¹pnO['öÖc„G!Vì×t÷}}ÐumGn£É2-d³kØÚÜZ¿téÒÜý$‚6“qÞœ| I'µÄOøœté+_ùÊSï{ßû½ Õ1x ƒëÙ[\s½M2 _Z/Ý5|4,ï°¾VÀØ•E>èlª-8Ž|À+rÂg#çI½" S«˜šÈ¢°gî@ï¾4Ü¡ÏS<ÅÁƒÒ•Jåîd2ù/¾øâÂÅ‹?ÿñü9¸îž~ð£Éq“—S÷íáþ'NœˆýÎïüÎ#½}½¿©kÚH4ŠjšêpÿRÞÂÚbÕ¤t{€QáåÆCx1JP-W¡1UU¡é _ 4] äþMnE!èêcà`}ƒ ¨>|Æ*• jÕŒEn3‡ééLLL@×CP•ÌrV‹<ð(×å ì©9¢ñvÛÄ@!*`;7 uŒ`ð@ ]= ·ö¦ß7K”rWê™éùÚ÷¾÷Ä¿Ïù7Š(Íàα0îÔÿ ¢*ËËË«Ùlö¶ 9Ñã!7ª Øô7ð@-ŠÞᤶÿ~÷ÿÉ‹×@“ {p¸; ¨ÑQ|69€…Ëì6ÙÇó3›˜ŸÞ@wo î¾wû´¹£[ˆ³‘0†ö¤«µZ:žˆÿÝK/½˜˜˜üÂÇ?þñ+•Jþ-ă$‚f¯ÈÿÛùÎd2úŸþéŸ><00ðQœÖt5¢‡”¨Yeˆ'cž aç' >úœ|x…„oØaÙ"1Q°¾ZA¶#‹þÁ^G èŒcqºèÜûÅ»g¥ÍtE0p ‰þ ǂϳºÆ¼J©Ër}ð'&&P«ˆFZPÜJÁ0l·[†¦p‡8» ./…*·A[ä'¶jœy K ·ˆÛˉ1£f`mc…|>÷ú믿 w?‰]éþ"5²øSC5àÙgŸ}òÈ‘#ƒ‡7({ÓièP'B! †aÞ6#¥ ÅJ®rúðAMÈÛ¹2.½=oß–Io¢~*ÛÎ.ÎàäÞí⢼­å:Qkí²¼´'¿„öLwÞÛƒÃÈ¢C(¤cß@_Ê0ŒT2™üoOýø©?™›™û‹O|âßY__žƒ~ N¦Ÿò#9y8ÿ_ÿõ_ß{èСßÔBÚ;uM ‡"zRñ0fÅB¡ˆëÃÕ’…չУ3ûÁ¥’Olg*¨õ¥*V;²èß×Ç·StôE éFÍ~ &žœ¶´…Ð ‰}âž­·ec^¥Rµ*¥ –W055…\.‡D¼ ëY ¥‚U± (a.ªÛ"¾âD Ö ØV}±Ë0çø€cÓ ö˜ @ß¾$zú·ŒÛûc ¥b×'¦k?üá~®û‹½$ýÛÈ7Mlu÷„w1pJSúêW¿úü¯þê¯þ§ÛI4]Åÿ¼è9O¼¤“Í“? c£ ]û£ÊÁƒ=DñüK°,ê·øbDË,â…5“˜÷…KƒDι±VÄ¿?Ž×[gqúLŽd Ú@–bMÓÐÝוÈ™DKªåÿ8{öìgÿûg?ûÙº|ùrÐ^ñ~îî¿F>ÿùÏ>yòä‡#‘ðû‰BÂÑx$†¡é:@LJQ.—aÖ(Ò™8TÕ}ms׊ ÔåÐ p¤ׯsJî(|Ñ %Dº½º w0Žé«ywmE\CßöH •vWZËžyôµŠ‰µì:®_¿Žìj‰D+ &¶sQ¬’*¢A×l«=‘¸½£Ï«¶ÑNµ{Mbs~ÞCâù»Çàîû»ázAÞzŽeÔL¬o¬£/–Î;÷8(Âu÷Ÿ|ì΀€< œÒTòùüÆ¿G ácݸüÓ9Ç‹w¸qFötêuâªòiJ)ÊÕbíø¡>%rU±PÅOßœ!²¾ïúpqx^Š·n&#œÓâË#*wI°ÄÛ¬à…§&ñÆù9œ¼³#Ç;¡jÒtTMAGg{¼-ÓOµ$þË—¾ô÷ÿ[6»öå/|á ÿ÷+¯¼Rô5QÖ€|ò“Ÿì~×»Þõh2™ø5$b‰h:‹]çÛmƒp YÌ„i(ËPuápȉè\«P,ÏT\ðK^wò9Â#ø21 bq¦€ÖÖUH ‚Q¢ô ű4[@Ï@}âhïˆ8/ÏPƒY †ÁõúÙÙY,,, M`mµŠì²BŠ| r…ëñ€½§€ÃÝíð⊽»ˆ¢Ú/Ì÷…ºf3„öØèìN``¨ÅîÚ[~j1T*UL^2žþùgÀuÿMðè?~ƒp3)€‚%¿.)VΞ={vddä¶ 8A,B¹ÄW6 Ï2" C’[/uŒu®›/! ”p:M±W¦ñÔÖ§áÈ‘Ïûxõü$ ƒÚù½¯‚w<ó¼‘@û‚$1È¢>„ƒÉ’@½À½%ÏW,Tqþ…ë¸ðúŽÝÑ£';¡éб>ÝšŽ&SÉhª%õûÿõ/ÿëo¯e×¾ñ·û·ÿ×ÓO?ƒÛä‘GIýÚ¯ýÚ:;;þg’‰Å#©h<¬é:wQå›k`€E)¨ÅòT*U m ÈÓù‰",Îþ=^zBl\Ñ}jæˆÖ¹uëë„©˜©!´wEðžÿqÐkÁ·yÕj–ÉÀ(l½~33³‡ÂØZ7°8oÒ<ˆ¢òíÃ|?\bo*"ÀïµèsðsnÏÃŒËay»™s(Žù,Ç™û{êÇÀ-L–i"»šE±Tª<ýôÓb'émxuÿ]‰ÿ@½ð†Ô€ú§:ÿ±}̼­BÁá㽸ðÚL:n01F £bî á°«ÅT*Þxõº$ú‹†²»/gàÄsÝ®ºNb6HUrž"I%ò£ÉƒÃèyîr©†7~2‹‹o.àÈñN¹ƒÛIå`Ê(ÉX8 ‡“©äo}æ3Ÿyô£ýè÷¿õ­o}åçþçïü ]×B=‹GÂá0ñ"&¿9µW'2ʰ¾ZÆÜä&Ö×¶1rG Bá£û5ŠÅéR=ø}C‘Ï rj͘íg¨¥"Ÿ/ ÑÓÝ‚Üw5˜† 0•RËË+˜››ƒeQó3S%XfÙvà sÉD8ê@Ñø¼½ªØÀwôzaà\^þvû“ÙÂ>ˆûÂß 5ÅþC·O ¦C¹RÅÔä”ùê+¯¾ÎýÅNÒASA¢¿§7vkó.)Br“““?½ÝBüÒ¾÷Jó”Ì€=vÄcÃxíüªUS–à×çŠæÄ3¸—“%Ú>BBˆçªdÜ’$_1þŒ‚wòŠjUo¿¹€Ko/aøH;ŽœìD$¦Z,‹o>jQ º®è‰T"­(øM0¹‘ IDATÿ_?þ5]µ¢±°Žðjbᎇ@Ù—ÏXš-`aº€r©†í\wÜß‚¶L º®9„ba²Ó`ŽT#ƒß½GŇH;Mº6}8¢¾°qÁ%¶Àï³'¸õ3nWÓG€kM·»ˆRBlãc Œ€G¬e0- FÍÀäxÕê6zâÐt‚p4ŒD2 =¬CU¸u=ôFÕÂÊ|˳Eä6jN<>¦Œ‚YåR§îK£5“„&qÿÅ)ýÆÃø%C À¨P\Q[ßEQU0;3‡d2‰ùíed³kU1yukñøOƒ[þ·Á§ãý oú†*€Èà×BöäsÔ…+W®¼|äÈ‘Û(äðñžzpƒ‰R‹Œ´*²“eQ¼úò$¯?ŸaÎõ$.Ááâ¯ý†$íÞ‹9Y"`6—‡íHb‡¬¦÷¯š{´ñ[ð $ Ä¢2ôî‹¡o¨šFh‰" CÕUÛ˜[Î2(²Ë,Ï”°ž­x"éò¦Ùj„e¢jˆÄH\E$vŒÔf' ;‚ßmW¼¡Øˆ%Âæ¦òÈå³hkmÇüt‹sÛ¶8®@Õt¢Bµ­ø°ÅyÅ7w/ì b‰­b÷÷./l8Ž &€N™HÒ ó<ÿŽ't=™ÙËÐk˜„C‘¬{2FQ­Vpõê5sllüuÓ4ýºÿžâ{·‚ÎÉj€ ÿo|ãì™3gÞÝÕÕuÛÔ€¶LÝ)¬-o7ÌÓØ e D+µ§ÎxV2½ýÖ,¶óe8î¾pËÅVæÓ Ü;Êö1¼¹aT |žKþDpâ T̵6A„ÏâlO:Ê9}Í0f¡»?†Áƒ… ’-„£aèºMån€°m”2¬/W°2_ÂêRÌ”T{°sÄ9¿E-Xö¼ÿ‰{Ò\÷éAYš)¢V¦MÀﵸlŠK„(ånµª¢Â¨ªX cîÚ:(¥Ð´ï…»Ù ýžûãÛàW(àêÅáôÇ'2±ñvGÆb€kÔ#Îs4?c wßÛ U½qžç8 ù€/j¬g×±žÝ°¾ûÝïþœûçÌýá;×Hà%ßR`(Ÿ;wn"ŸÏn ž¦`7‰±¡‘V5•J9ç(eø‰ðC> ¤E[‡uÞ€wâÏÃÔ:à»ú½ClqžoÂÀ¨ ©ì­Ã)eΦ¦e¡³;Ї;kˆÆCˆÇÃÐC<®ç‚n§ ØZ¯by¶„Õ¡Vv?ð8íØ?,;~=£ À¢Q‘hØÑýfÇ‹.ø]¤{ÀϤsî»P$`D¬“×]vt=ìì®#$€Ô¹æ*ŽE_Lá‰u€ˆ‹éªj¼¸„ÇÛlÔÏWÎ}¶hLÛÕõI¨‚~Rù˜€Z†YÃèØUkzzúíJ¥²¾ï_ õ±þv’üDbÇxþBÔ;PÈk¯½öìáÇ?x;…>Öƒ—ŸñE "u?šJT+VOž>íáþW.Îcs£$q|WMd€3•çxó‰M‚ï%ßm³Ë3g[p™û3Êlñ“G¡©UL–¶öŽÎ ¥-‚PDC<A(lGŽUå),@ùœ‰•¹VæÊ¨Øa¶¼3Ìéaç4å’³%ôP)WqôÎÚ:[ i®î¿<[B¹dÖD|{À/ƒ B œcS¦(PU Nô ÓQ)Äòa±8‡Ø„N8ñ@øèCp½ñ˜£¥* ˆn9muVÖy–å Ð+Î`t gŽÇ)·Ç°ç×ëƒÀïisý¹PDÁwu ¯úñà‘&_þI)ƒaÔpíÚ]Z\ßÞÞžçþE¸Üßü ä¿æün4 à?ªP´UTî ÙÚÚÚ¨T*ñÛ(„wÅð±nð5·N|wMR¬œ<}ŸÇòul ÙÕ¼“ÑåøLõ}ÂP‰t)†(ÏOK‹Œ÷™xÆ(×é«5TkUÄ:†µ¢¨š¦ Ñæ ×„Ÿ:ñrzûµª…Õ…2VæÊÈm’¸íвâ;ëËÜŽ2XŒ”rßúr Ã'[КIyýd*(n›»NJD»{z“Ù³4M±ÕÍ~§|•=›†mäR!NÄ!aÔˆcÔóqû&à¯Ô`8}g‘f‚îßµVë똛™³Îž={nÀüØ5÷›r[ì Aœ@!ÃÃ÷ëa}û[17¹¾«òœ¢¬X=yçφS“«X˜ßtè°ßy‡È¯Ùæ,ñ_úâcN¶0G åÕPT+UTk5 HáÀHÂñD¡¨Uåœ^ °Þ¶µ†•¹Ö–+ ¦´ÄÖ¹Gø™sÝ1;HãÂဌ:>ÿ”Z¨Vk8x4…TkÌãø³¾\Åö¦÷ÕDŒ–®ûÏÁžns†¢€0•ivüêäåëDg ü„›ùdBƒ£žþ’\Æy_=Nžî@4^?¼½ÆW™4¾÷'3-¬¯o`jòºùä“Ožwûm¦û£É9Hç<ß»Ýp§<¢R'PÈúúú\±X¹Ù@!BÀwDgÊpp¤c×@¤þCIµ³³ÓËýŸ¿êPio÷ÁÇýÅyâyË NÂ¥”ÙûÈSîŠ †wv ¥=¢ø^øÖZOÛ-T`Ô¨3à!µ1øÔAžÌõ©§,µÙ¢ó~)'†a€2í]Q$’Q;à%OÓ£yû^MÄhéz#N*l|ÞžAa\—WSqd÷>ĹNvd/ArÚ×ä9 µŸÙðW pæ>ï~{>/ç’”‰RÓ¤½2Êòùüü¼¡¾ý ’šr~‘öHNAR‚£üøÇ?þþðððБ#Gn8N€»<0© Œ¡o 4]ƒeZÞ5H†Uª¼ëÍê{fzݵüÃuQq€Ïñá YüüÛ|ö4çPTÀ0,dWKH¤£Ðí}à<Ï 3°2_Æê\•²%^Š·3®îr+狉a oYgðówÛm¾ÚÏ¥ÜíwÿH -騳>¶²Ulf+Çõs×zð7žfóª 2ÐëËÀSF€Òõºzê€Ü\¯¯#b>ðƒ1;Õd*l÷ïß,€R¬¯¯câÚ¤ùôÓOËÁ>÷—¹¸›ÍŽ™ÿ\£Íƒ ù“|s™™J_þò—Ÿ_[[3”Ý1 }Ÿ àSjëÿ¶åܹï`ë®ëì=Wzzz¼¡¾Ÿ¿jÃn>ã‹?Üvð®â†ež‡8DBj¯°ÚU »Zg ¬=§­ëW/¯`{«d8ÞË¦Ç xíéU¼öL³W uàÓ…”J\ÛA˜ë˜Ãݶ0Þ ž“–Íý-{áeY0L”ÕÐÙE<‡¦¹Ž?×Gó.øHü ñ€kgð3ßõ ð{ ]0øëê¿- ÀÏêË8÷—ÀÜó@¯Ï×B¬ž„t è1 ò1qìDıopÄññq”Jåìäää8Ü`ŸrÀ ì5" 0\Gü©aÁyì@!¥Ricqqq<—Ëí¢ o¢öxð©»K — (†5!R‡VÅ8vç‘£Ö®.çpm|Ùn¹XõÛGÄ ìèö“:=ë&ûÉŽêØÜ@ì ‚kªŠ¥ùj“ƒÓŽz¬¨Àâõ" y1g/@æÌ€ ~j;ð%uhÀÄÄžøÌ±©Øù)7LR‹Â²(jÕöH"™ŽÙ‘mùCmoX[®¸ mßu@†óÜu D3î[~ÈõÕ]߉‹Kï-ühPpòÇŽ·£­],“}üÇ{¾£~R`m} £—ÇŒçž{.(Ôw#¥ "à9§œlVYÐÇßg…à“O>yvvvv×K÷˜ |&‰ûøÌ>èýI„#;OftEɾ}^礗ž¿æü&„9ÀìœyžÌF²4 ‰d3Õy¼D•.¬üwÓ%XZÜBµZƒe¹¡Üºú"®î'2bVR ÔqUäa¶K/sì(p€Ïóq¢a‚R “QXÌ„e0­*ö§L%ê¹?sËï¤Cûnáeh}௫ß~XGz’ C#ð;ÒIð=‚Ÿp NQûè…è2Øë€î?–ð…]‰Z ׯ¯¢Z­nŽŽ^„7Øg#Ü5Â%|¿ëRH)šÔáÏÇìÆÿùŸÿù•­­-s7Su®ŽïûeàSøÔ&` Ó Ô~Ö´jæÈÉ>â õÍã§oÌÀ¨Y0M ¦É@íè2gúÎÔ“dîà„Â=+{ Ê„ƒ0{eø´]N¬5'@H×11–En£h?#¯«s_ `BÄì)y ÞºÃÑìwûý8ÄCÔ›h8€â>@…@íªµ*ú‡’ˆ%"‡u‡ûr&VŠõbtçí}Û€ó7V!¼àÔ´ü¨»§§Þ@ Ky|eœç#H åÐp+2‰[üz €Q`k;‡·Þº`üä'ç…×ßn÷vï ¼[#¡m2ã{Z–•›ššzëøñãïl(DèûA†>¡ï{ ‚Ô±¨3ÆÐ°“WÏdúu8è õýÜGQ«ðkŽ®{!‰Mý¡çÙj‚"¼eýÏÝW¼&Žິ*Ðt ›k9†Ë´ ªªª ‘ÖKè(ä ‡ëñ÷$¿3ê¼u§wýÒ‚ôÃSÖ>GÅoʃMPjÁ´L†‰ýÃi¤Ò<اàþÓ£9®.8×ËÅìãòâþuß"Ä©=à÷Kž2þ{”ñ´©þÀ ·dã!÷=Øç5àÉÆ^éO°qÏL|cŽûýŽŽÂ2ÍÂ[o½õ&‚ƒ}1\ÿG¾Þ4í%"P³Êˆ”‡@Rþõ_ÿõì©S§Î4 âŸßw€/œIRmec`:E<©£T0<3­áýž˜õ¹­Þzm¤®àPfŽ æ¸SÊüUוq]Â7¦—:ðm$E…¦é˜ŸÞ@º-]×O·®}Qä/ó~—§òø[fÞžv¸sèt‡tRjŸQ‹KSàAEŒšÞ¢q¾…µöY.šXœ)Ià÷r_~ß½¿1wþ@âÓüõmª¯GprÞW"Î/'îûSèîMÞà|OŠB¡€·Þø©ùæ›o=7Ô·ÑOÐýiWÜhl *Ô,É ¿-åï}ï{òù|•ë¸r½ëûÔ‘h1°w A)Ý¥°Ã#‡<’ιgƹø+‰òœÜÎ#Äu@açb©+ÀçCÏ`–IaŒª £j¢V³P­Y¨U €LO¬cs£Ó2 vDíçtÁÏ*×뙳$ë¾ Z|)u¼ú(8A3”QÀòJ]–É—üZ–‰á£íH·% ëîk»>–·û;‚ßNØ€Ì\Pº×ƒÁ_oÑ?«/Ó ü_O$Iw„‹þŠbsÿú|¢¿K0êEì’¨¯Î/0‚Ë—.¡V3ÊçÏŸÍ-ÿð»!î4žô'ÿùFTH&"PHþâÅ‹/¯­­I Ëåð{Ñ÷å|Î4¡§g( À«±SFÙÁcC} ¼v~roÀ< ß3á°Ï;+ì ”ŠýÉç U ¦i:ÆÀH\Eª-dn`H`0·AÎDìÆí¶£¨° 8§l°PÛ÷Þ²øôeLÃ@GwXâþ®ÖÔ¿?Ž®þdõzì>ŠM¹¸Û^GRÙÈ À&eD»bU`«x°— ðó¾íéK`ßPJŒIRðß•làðëŽy}Ô¢ØÞÎã§o]0¯\¹òÜ`Ÿb›¯ÛÂý§ƒ*oD ü7+ ßúÖ·ž³pe@ûæ÷©£åÀ§âOiHµz<|‘leÖñG<Üÿåç¯Â4¬>ä¾–Ê“fåíóv^>°à1êUÅÜõ äseÈ’Rï`ÌäTprñübðsþ|!0pá€tÇ+ÖÕÛò·ÍÚïТ0M#':O†A<ë,Rm!Üù3<ô¾^ô ÅÝŽ®ãâõà·³5áâðŸí Èn™)¡AÎïÅT­"q~´<<™ P¢àÞú$./ñoð‰øb`4¾SÆÆÇP(k/¼ðÂóàâœûû÷|„t¼#Þ15#~ê±S¥rCÄo9PH¾Z«îz~ßÍ犪NžºÙ~­k0é4†€±ýGÛà õ]6pþ¥É]·^Ì—­øžòhV^ ÁaˆþJáa*:æg¶‘Ï`™–#VwõGøÕ€°óëŽu.×Ü^8ÉÒ‚P(e`¿D!ØÜ("»¼‰|®ˆjµÊÝ%BhÑqǃ<üú18œQ¤Å6PÊš5%êÀï_½M€ÞÔ¢/êpúÇÞÈÓéÞ¹Šm¿QD? ÓŃézñ~GàH ‹“D2MŠB¾ˆW_yÕš¾>ý"n\÷oĈýy°ÿÑD2¡Ã^°¡Oú-ß; ÀP?[@ލ˜Ÿ(")j>üÞ3º™èܳã˜[öQáï§Ú»¾\^2 ½æö E­j o0…x"ì,¹U5[kU”¶ ïÒ/!þBpQ+-8\ÕþçÍk« –»‡¥µ0?»™©,,j€š(µC ìý¦‡tõÇ00̉nn³æDîàRüàw@/¾=ešÕ$E°†e\À àDu,Ä~ÂÅ4‡H¿óá´wļ€_¯—Q ¾˜ÜÃnOËy9A.]¼ˆ+WÆjß~ìÛ_0 `.¸Yîß”q«¿ø‹¿ˆÉÉÉ @ËßâwÐq£<ò·¾¸¸XøÙŸýÙ÷ötw‡üÀuNƒi>gš0h¶@"ªlf+¨–)žJ±ƒÃCŽ„cü¿í}ypÇyç¯gæÝ'€‡“8xŠ—$Š”uK–EEQl'kÇr6޽U‘7åMÖŠ§j·jËlÕ¦¶ò×þµIe7µ[›T¢ÕÚÉÚ±y-9‘dS¼D Þ$ âÞ{x÷L÷þÑÓ3=ƒyЇýUÓÓ3=o¦g¾ßwô×_— |÷ÍãÐ+Ô¡~ÕcÜjŒ/>šÆÚsRÄqfŸ#$—‚:’mAÃ~hæZ{ Àí[y^–Ø’œ$«}Øf*“˜ $ÄAd˜EÔL=¦cr|W/OA×ËV ¢È zr@Ð| :zÂØ¼3E%H/–¡Ô“iW37V3½¥5Tgþf|N=[åWlI¯3S260þr’É^ú• ô³ûYô¦õ]HŸ¼mÀþÎ$Ö°lJQ.éøÑDÇnŒ¹6rÀ-p @ÌùgÒm¨ôõÕWëæ`Ö]{ïWûb–)ìD!“™Lf¡P,Dü~ÉÞ8ã ?{˜°£7„\®PÙÿ‰½Ž¹šƒÇ¯£+ó›s€¶-Ž­j‰içKNŸõ´WP*QATU13Y@ÿö’m1>Š¢¢³7E k ƒ‹ •ß,X6ãÃb^!úËäh‡ãKSyŽŠÎ0|jçoaçžN lK¡5GKkÁ@>¿ÏL»M(س¿;Nâú¥4®ž_B± ×d~f£€‹‘¥6ê~=ægL¬(ÄŸÍG"õa¦r-©™Ÿ­Ùžèâ/Ïj/ ‡&Gä*ØŒîüXÜy¢âÒÅa,..éÿüÓþp&û¬–éwä?¨Û·o÷Òä;÷ÚV·` ?¾Ä¶mÛÅbj#ãû¨ý2PÆø ݹk›åÂ6 Š¿ÿÛã(—õ¦$¶Ã?áým¶=í`­u÷ø3ˆ„ŸáXsÉ-E!È.WI—<Õ}ÇW K}‹Ù™-õŹŒOhLF˜eh†5'’€ÌÍä0re¹•˜QF¡X‚ª é©X檤:Cؾ'‰`PCz©„²µ^@s̿ʮ7Ï¡ ft¤0ex#>üjk……é72¯AíÞrl‹é‰Ùç±x¿úé­¦Öf«ýŽsÅ›—4C8Þ³$ñ¥÷Îû(æËøÇ·ß¦7'nž¾|ùò!Ô—þÕ${=F÷”þ€ U@À­Ú‹­»L\õ^m mtttå3Ÿùôotvuø×kïW3òù|å‘Göúdçßécš0o¦YÆÇúŸØÀa]Q¬KÁ¸TÇãù÷cI áhÂA`r,@ 幤>µ™Ôk‰ñùžÉ@‚ɨ˜CÏV+„—H¸É/@°0_ÀÈÕ9¬dWÀh…|Š™µKE!hëbÇÞD£~¤—K(©'óówÎÚ0¿j˜LlPè:Ÿ¥¨ë„¯|ÌV®g<Ѫ3 RoSÕ€jÐ©Ž›c9Œ_¿†žþvìJ!‘Œ¢³;…h4‚@ UÓ¬%Ü·ìŒcóC1Œd1|z‹³Eߥ՜z«U{K[ÌîÔ3ŸÊL+f¡+ˆ³ï‹uí:bŸ#ªBa~´ÝñÞ­²ãS÷í÷ëVõÝ™€)Ê…2Ž=Fs¹Ü¥b±8…Õžÿ;.ýÉäED:FÀª ûÓŸþôÇ›7léè ¬×Þw› …|Aß¾Õ¹Ä÷ù37±´˜“ùwÍŒK¤ëiïh­(P@Í4`>Ð E!¯#—/ÀðÃï÷ƒ(@w_7®fV«ûfO;ØÛ¥îKU– j(uJ+UÑL°T@ Å4CT¨Ô5 芅ª Šƒ˜¾UÂäÄ8Ú;ýر{ ‰D]=mˆ'ã‚ði|nØÃÀönÝÈâÌàf¦r §ž5 Û©*D±¨M0p0¿ ö‡`kfŠý¢š¦º¿4ÎøâT ÆnŒaüÆ8}ï½÷~õ×L²O75%ýeR…*°f@­óÔË—/ç^{íµÏ§ÚSþõÚû²f•¥Û¶n·<ÿŒßû?'_)YžÙÆ‚ÌzB¤}XÞ[雫۞x´'9>.ŠÁŸ‹‰)ˆ%"V~ͧ`|$k1ŠüŒ‰oÁK IDATf _ÛL$ª˜“y˜´N¡}53Õ‰P] ˆj.±%Â\„CëîqÈç(ÆGÓX˜ÏÀ0ŠÈ,§`Œ:üOðÐÞt÷F‘[)#»\n˜ùE¿[}arˆþµ&mÁVñU/s@±"sT€‚`ȇW?³ª¦ÅÞÒœª¿ý.ÉAœûÕŒ2èßûþ÷ÙÂüµ3gμ `<á§;ãùæ<ÕýF˜¼¦ôÖfˆ 7ªmÀPÌf³‹“““W¶ô? ÖeïSf{pKÅ’¾e`«cÆß•‹S˜›I;‘Ù…âÎC6W:…D£ííŠz퉹-!PS * ¨ª"»\F¹TA¥\áê´ª"ÕD0¬¢s/îÁ¤ru©_ 4Ä}ó›bž¤“ƒ¯”k¨ Œ‚ 3@ ª¢C§C‡ªhÈ,<:ƒXLÁ¶]Ä“lêëD²%ŽH$¿Ïoiݽt÷nÅìtC'fpc$í*Ùð@%ÆLß©)åyÊ£3î÷¢ØïŒð~·^9h¿‚Çt P]×ñ–øµ5§¦!.Ã@p}tc×ÇŒC‡ýµS}7MK@Òläh€û¸¼õG"eÏž½O%qߺì}‰ÊíØþ#²ñß=‰l¦hýòj‡8äåØóØUÛ¯–ø«¥„Ý^Q °Û楔"SŽù -u´˜7°8S´Ô}!Ùµ1¾½ÇÕ[evI7p€½‘XjàÀE{qNBT”ËÀíÉf¦Ó(—VIgxŠq³ÏxTþº"Q¶ïlÁÖ ”J‹VÒÛ§¦Ø}ªXi†UÛRW8õ¬}UÖ¤ã *·Sü~¯~f4MuhwÎwïõne @rüºÞ5¥ †Nñÿð¶°°0qòäÉ·á”þ²í/^e#@àEu¥?à€;`¸Û+”óçϾüå/¡¥5sÿ5fïËT.—MÝýJ4µ~kôÚ,pe ŒOPñɪö3¾ûcàA¬¡@"±5c •²Ž@˜"žˆXËpB*F/g°š™Ì“*Yµs AiQ ùUÚ¦±ßV¥0¨–Ï@ì낙馧2(—sX^^‚¡ëVŸÈ#¡°[Jâ¡]mÐ+J¦†b«ûŠÅÐpyô#K€ Úæ•ÏAá×RÍsE{…ìÛ߉­Û’UŸx¼ÛjŒ×»6Û0àúõQ¼ûîOãÇŽÿM6›½îùqÿ 3½û¸»nɼ.h­&€ø1âÚ—‰¸ê ¸ŠS2 #=22rª{S×§Báàšì}™ô2…{Iò#?¿"1žóN½U}‡r穾Õn/Iˆºíí,©«(P¨Œ*òYzÅ@©TB(ÌsÐ%[ˆ%|È,—íŽ]³Ô‡e[ÛíÄ;±)1—Ûa”@QDnU(# „B¡ Q¡((UͨA *Õa*TJA+®^(BѲØ’E²u=½èèlC,C0ȇ= !H´øqðÓ›ñäó=8srÎÎC×™´c§ê‚ †üر» ûŸØ ˜É‚RÚ4ã8_üšÚ‹ƒ^¦‚ø¸ÌS¬ñn”Š:|¡2-Q>H ×.ð5×§î»ÚÙ‡aÕ:ÚŠ5ŸÇZ>‰?1#SÁ‰ñaŽ(惊ôÃôdù|Ë‹ ÈåòPU~QEµ×AôûTô Äñè£ðU,.¸F ˜ `2º"•ùV±|ĹbÆ!QyU%xåÕ-}âí4Æø«Þ÷jÆçª?ƒ¡3¼ýö?bnn~þèÑ£ß0îsþݽjÒÛkŒªIÀO- ¨F^8pàÀæÞ¾Þš¦’Fí}™(¥,kEkkkÕß÷ùUlÝÑŽýOl†æS17“…¡SoÆ%ÕwŒ/:Asi |«ØH0ŠJ…"‘RŽù ¡ª*üÓ·òÈçô R÷å}/аjÍJ1TȬç¶4&Òô €YV ƒßççiÈd€Ùé2r+Y,ÌÏ ÉpÓ€¦ò| „(Ð4=½Q<úX'B ‹ %èÃaËÕtR*ÄÖÉ`‚bMýݱ« »ö¤Ì÷°ÆÝá:Æ(ÃíÉiüÝw¿k\¼xéïÎKÿ4î¢ôªÀÇä Ô²Ùlé¹çž;‰†}Úû2 eºë¡Ýªœë_&ñÙ2ø| ú·¤°ÿÉ‚>ÌÏf WøºtNçM5Æmžñ‰ÔÞŽ!0Ej/²îò=î€cŒ'%*…?D¢a+³‘¡·o®ØÏ¹Vu¿¶Õ@ƒ1é›QwÖƒ1,ù2hŠY–GLó¢^ÃÊŠ‚¹iÙl‹ 3H/§A©Eåk% sBUºº£xô±Äâ~,/Q.Q“ùaKyIí‰X (¢NUðò«[Ù©Ïa½CñNd|ǾÙŒR‚þ𘛛Køá‡ß—þ³pfûýØ¥?°>'  ñöå}A^õ f¢#GŽ\Ëç ja¾Ttm{ßõ«,kq¤­ò¼3çg ¿_ÓÏoŧúqnèNC&]^štÓ ò#ùlаڬ³=QP0¨` S)Vu,%2hïhE(‚¢*èßÅÐñ0£Yu_ꉚê~£>±ca03®@a|þ"QF@©Éì  D¬ ¨òéÈ”B!:(Q‘^4°8[ÆÜÌf¦çÐÒ’Ä–íýèêî@<ž@00“©ìy¤{ö¶cäÚ†NNci±djÄtš« ¶@œ÷ÿæ­I´¶ˆ…>àÇ sKxéÅ9öåo€€2ŠÛSÓ8ñÑ qãÆ%Õw3ä© Çˆ²×~½ö€Ïž=}ý}{|>U©gïËT,–讇ö4$ýÅW+ÖD!èêI`ß}H¶„±¸C©P±^²÷P ß©¦1X½†öÄÝÞ|Cgˆµ2„#~C!hš ͧ`~¦ˆl†kkwòÕS÷k€ÆªßeþN@ë,Š b–¹v 4${ø§K+4,Ì™ì –§q{jÕAÏÇ3‹ùmíaì}¤íd³%ä º­ö ÉOìˆAEåÀK7#ñÕPý½ìzëÅ9%¾õy™1>Sñ'?ù &''s?ÿùÏßOø!ÛþÕâþï¸ôjÀ8«ÕÉõÚÔÔTþ•W~õ×ÂÑ ¿Qæ¿d]ÕSšIý*0cfùGIêŠáÑÇûÐÚEz©`å °×|­M2¾äB°>ªºíÍÖ‚ñ£¡Pâñ|~þ±2·Æ²òãÞAu_>·QÐÈì1¦/:–@1GáDP1ýÄa&TJ>,-(Èf X\œÂÔÔ4Êå|šMKªóþM¶±çáº{bÈå*XY©Øf€HbúzûâØw K’úõßKõw¿Cb½sJ¦oÏàÍ¿}Ó¸uëÖOnß¾}ÀMضµ9ÿ^Ô´ô¯eû ÚÀMâFVß”èi‘0´péÒ¥›+Ù•ùÖöDD¶…kQ©P6Þ³»ªîo‰ Vóþp °cW¶ïjÇ‘yœ>6ŽéÉŒ¤öIPGÕwªö¤ñö¦æÊœ‡kІBÚ@z1ƒbO áH„ônŽBÕ ]ï¸ôjhÀšcÜRßKÏó Ä·oß¶ÏðÕ0襛&>ÚÝÝS3£1}'>hÆœ3ß@þ°Å‰–v=Ò…žþ$ò+edÒŦ$¾--læíW©úR{§3ŸKAÁt†pE|…ùbªª`y±„å…¬GìçµÊÒ³­IÝo²mÍß!ÐÀþ,ˆÝ! ŠÐˆdpU^a°’ö#.aqq 7FÇP(桪U03"1?¶ïhÅÀ–$*é47󺺣8ð ±Ê¯ÜçöË‘%¾ «%¾ìW¥ ‹ø«¿úk:7;÷þ­[·Ž'üqÿw]úu`f@-rƒ…:66–û¿ñ/~# ùk´”ŠecçŽÝš¼ÒL" Žûƒ6zÀ2H_~4ÀŽ=èßÚ†bQGz©àɸ«ß'iŸ¬uèñ~·Ô  $Ö¶$üBà ¨»š1UP&®.9ܼ¤¾›)×"¹¥¾÷P÷ xÜŸˆ)ìjØ€`©ëÖsttGqà‰n¼ô«[ðÈþNlêkEÿ@/Ú;Ú0yk §‡033Æ „ÃQøÍ‘kF Æ÷VýÅGìzOàC‹ KøÛ¿}“¦ÓéÁ±±±Càž‘ìóž‘þÀ "R¹ ù|~qjjêR²-þ„æSA ŠÜJAÏçŠú7æ:;:#/¾øb5Æ%°+<>2æüØos  kØÿl/öèÆ•á\=?‡JÙX¥Ú#{›¥ Ò9â|Æía(*PE…Qô#·’E±PB$j@Ñ|hï !õ!—«”uQÆÀì ÔL¢êê‰;?>u_j[ÓG Z«-׊ 0ŠÖ¶0vìnÅ®½­H$ü0¨aÍ Õu šf «« ©öv¤—Ó8wöÞþÑ;èéíÆ¾}bÇŽH$âPT3LyÕ» «Þ[Ý·—Öa®­œ:Å…EãСC?‚ê[^æK<ö†Kÿf©®T5€æ´€zíµX,F~ø‘ç²é\yâÆ­ÅÿúgöÞþ“ÿüîüüüøk¯½ö‰Í›7{êþ«†ýÇ&“?v/é_Dì£òǯ¨›bض· þ€†ÌbºA-‰/$•íèó6dI"†«äŽ£´`þ‚X,Æ% ‹³É”`IÅ ëd`æüòcàúMÞ'áˆìkÇÁW7ãù—úÐ?@(ì³RŽÙšªBQy²’P8„þ^lÙ:€¹Ùy ž8‰±±1TŒ ¡‚Á Ø|ÄÑwÄóÝȪ?ùÏd²øë¿þkšË凯]»ölé/'üh„©ï¸ô€̹ìf~¸ö½@P.\¸ÕT-ÿíoûÝ·ÞzëÈȵ‘«†aLþÅ_üÅ—öïß¿INõí¦f†ý<¥C b^KéZªª ­3Œm{Û kXY*óùM3¾`~ÛnÏdešF[G+‚ˆ¢ V1z•' !€+û­|}¡JÛÏÛ´ä^#h0éBÎsÝ áìcPÅ®½)|òå>|u[¶'ùÍg!ÖŸbøð€ÅŠþSTÕŒT Ð×߇mCz9cG?Âèè(Š…¢ÑÁ 5a¨ÆûŒ2|tâŽ>j:tè¿WIõ-ºÀ-í×-ý›±ý­×`X-ÝE¸ÙFÌ@^×õÙ¿üË¿ü€(x‡åë·~«³³³s@Nõíø±5 ûÕ3l h‚™ÛóØÔÛƒP(… lMàÂÐ< |V¡bIyWÀ_F\1ª2î4¤|¡ ÞÐÔä§nTê;´ëå8Úz©û]=aìÜ݆‡ö¶"©2¼Û ¹µ1ãPÖ ¦ðX Æý8Œ1ø|><ýìxê™O`xè<Ž=Ž¡ÓCxdßÃØ¿ÿúûûÌ„,Šçïð© øÙ?cš¦e2‘èS¨þòôV·äw3¾WùŽH IxõÕWÙ»ï¾[Må¯Eµ€@@Hjž«ìر£¯\.—®_¿^êïïÈãÿkö“Z71ìçÝÞ,É "Þe iï #ÕÂâLc–±0Ã¥ö*Æ7+EY!*‡EÆ@õ ôŠ\>X,†@@E4îCª#ŒùÙœaœù 0ÇÈ@U“ßUÊ\ ÁÌuô`|«¥§¬ɶ víiÅνmH¶T÷묕¼ÌÆWé@…3öæǟÜO¾f†n–65`ÈûµLzDÞyç…·ÞzëÝ@  iš¶µX,ª‰DBUUÕ!Q¼W®·?J†õ û9Û{€ˆ—D¬"Áˆ†®ÍQ´÷„P)QäWtÛë/9˜„I ˜j<3¡”)­‚dk~3™&5f¦òNmÂÚb–CѲaå¬>Äù²ì8/ÉíÅøî~‡£m$êÇÃ¥ðÒ¯öã¹{ÑÛC0t'æ¢9Ém8œ†Dr*v¶"B:»;ñÔ3O"‰`ðÄ)?þff§Y("‘p>Íg±l¡XÄß}÷ïØJ67~êÔ©üq/ôQïOê5Ï­» `}ÒX4é ËnƯ€¦ëzððáÃKo¾ùæ…t:]ŠÇã]ù|^‰Ç㪦jsÛŒ×ܰ_-é/×oTì€|Oƒ?¨¢³?‚ŽÞô E![±»Fò°À`€®"[œAWW;B¡ EA$êǵËKˆŠX—XKb˜€"îPø˜]6Ï_¯ P±{ož?؇O½Ò‡Í[ˆDëN÷¸#$3¿¼¿ê˜èzs¿-ÕŠmÛ¶bfzÖJòÏÌ̢ǡ(*®\¾‚Ÿ¼ó=9xò¯ÌTßS¨žê»š6°&F^«í/¨iŠ Ë^ÛF@øtÆXixxxúÍ7ß<;==immíÌårj<W}> ^ê¶ô5òÚ50®£}©§‰xÝsóT¤zBèìR å9ÿˆ99HîD®²j‰Ö"Ñ4Íͧ`q¾„Ü …0ËKíŒ:ãу¦;Òz =qÏr&zI}¹oø?ÕG°í¡$žûd/~z3¶ílA"X­–ßEªÕþ(5P*–pc|üôñcÇ+årêܹó¡›$“Í÷ßÅBiê£>úð…>æ±:ãÝUé¬jh@c à.‹}/ÿ‚Þ™+æ_îòåË3o½õÖ¹ëׯϧR©Ž|>¯Åb1ÍçóyªÛžÒ[f\7ÈA?¬J{×µjK&ÝÓêö²Bõ+hí  £?B€\Fç# €µ"ŽP@( R@[[+ü~?3êoúVNR"d©&zZ|üÌ0–æ`þ‰UŒÅŒ=³)x®û‰ lNàÉçºñ+ŸÙŒ]{ÛÐÒlȃ·©ÓËÇy¦*BCèÇ?þýúõ“³3³7HÇÐé3Ñ›7qíÚµ¿Y^^>žì3ƒúÒ_f~/F®ËÜë•þÀ@üø:L¯ã^Ä`ÁÇT³0`lllî»ßýî¹óçÏO·µ¥Ús¹¼?‹j~`•ºÝ¨Ç~­±5Ad íU Ñ@çæ ȯP0ÃÖB}XÊßBWO'Âá EE4æÃõ«Ëài…ïü …4wä+5 1D[yøÐÖ":{¢xü©.¼òé<¼¿íaÏ1ûû¸À0yë¶:>>þ£¥¥¥›…Baæúõëg®¤R©åóçÏ¿.ýç°:Ù§Ó ª%õÝçX´ÒXM›r™ÀÜÇ M@A6¬Üºuká{ßûÞ…S§NÝL¥R­Åb) ‡4>mØí±´Õ{[R;nˆÈí›ÔDˆµùÑ9„êŠYÃZÒŒ€ªÄ“aD£Qø|>(*Af¹Œlº¢8%7d&—‚R=L€t8´¦‚xä@þÚ<Ù‰®ž4߃Çô2B`PŠüJNI´$s'>:ñÏàN¾L©Tš™œœ·ûgàñÇÍø^ûpÕ¹9h#¤?°NhP pï×Ó j‘¬€ƒAnfffé?øÁ¥#GŽŒµ¶´$ÊåJ4 ªÁ`Àº¾gä \Òÿãùžœí !ˆ&5´ ùWt:c@‰fÑÞц@€ÛÚªJ0yÓLBœ ,¼þDêyE €åe^‰ø°ûQîÌ{âÙlêãylpqªÍ"†Ê(Éç ¼ÿÁ_«¥Íí"ø°ŸPýkÅüWSý«•=éž a-@ÞoÆ9èEÂ,¦AÜ4@]XXH¿ýö¯¼÷Þ{#Éd2 †¸ÏçS‚á ÷m»%­Üß5<ö«ò¸Ú¯DÄå$Æ—Zÿ8S†c Rý‚*JYséqlêí¶‰DüI[IKlÓ_Ì/`ƒ ©ÏSg›ÝN€PPöI<õ|žþdúúãfö\Xfå-@¬K¡ë:ŠÅ ù2é4nNÜòùýþŸM€G­æÁQÎé¾Ö¥\r=\uî}O Ø(õØhÂ!(ï×rÖjï&ð1W+²™L&ýÎ;ï^ûñ|%5UkQ¢D"Û“Öô^ýN¼mþ* Àœmù)2ˆ¸¾ZáÇàI6 ‚Q-Ý>K—WXýIDAT,Ì.""™‰B 9éå’-õ­fǘ=,_ÕôoMàñ';ñÌ‹=èß’@,î·AB8á51æÁJ©ÅôÅ|™Ì foÏâÊåãÆØD¥\.߸uóÖ‘ñññ[àZ¨nþ¹ãýQÿ«mÝem”ôîLV`™ø»z¿‘m£$:žšå28"/ÇÌÎÍÍÍ|ûÛß¾•H$º¾ño¼ðòËíìêòwvu¨ ±Ýj«oµº^/rP~T/©—uÈÆŠê ³äpFÓ4½ݸ=5îžnƒ<~~Ó@ ãc>)ˆ(Œ‚Ï Røâ+àÑ€`=aôo‰£w MSWß»4òÀ—4 ¬UÀ„ù`‚šfÒ½ß bŒÁ0 ”ËTJKE,/e0ys’ÎÎÎÒ|±>;töüáÇËåòUpgŸx‘^‹{x1£@MÚHéäÕW_Ý y„;~§N¹Qó šQÞWÌ?ŸùÐ  = uþþïÿþ3Ÿýìg?ÑÑÑîïîéÖTM±’1[2ËŒkIAF²ÚÎÛIç¹Û»@ÀÑÞu-q~*󼥆AQ.—qøgÇð‹Ï!•jƒæÓÀÃ?½=ŽB¾b.·ÆÀ(oKCk*ˆ¾úbU§©Ã7ÞeëÞÌÌÑJÒh\eë¹ï L_©˜L_,!Îbrr’Mݺm”ËåüÅK¯þðð¹l6»n^΃göÏó'|Öx”Ýup•½ö7œù `Ý —k1z#eñ§€k9~Aqp hÒ4­ý_ÿë¯>õÅ/~ñéT*èéíö©ª††@À“q…¤Þ'ã;¶”Á ü#>s==ÝØ²u B¡ . Ïãú•%0Êãû£1z7ÇÐÛC8•?yd­i &¬ud`½` ˜[ ¶Fƒ­¤EIýÎïüÎã_ùÊWžOµ§B›z{ü>SŠ«¥÷jðÚë*íe¢”r-@70;3‰‰›xúé§OÄ¡(™¥ÞFW_ ½ýħÒíŒ|€k> •Jår¥b ¹\S“S½¡çócffææ±cÇΚvý ¸w? ›ÙÓf}Üî¯ÀÛÛ_1?ðñ€õ›Uö›5 ª•å:y_ [#ˆhihûÜç>·ï÷~ï÷^lïhööõøÅ D7ãÖW׋‰EûZ Yú{·w¥`€nèÐuüó‡xñSŸD{{|~Ÿ 2¦W¥ó=h@°ŠéKerLOOcdd”¦—ÓF&“™>uêÔ¹‹/^—æpf_‚ +àŽe‘Î[Lí•×ô[ó×*[t§˜¸4e xÕÕ„õj2øà‚6˜æÁË/¿¼çë_ÿ·/uuu%6õm >o;½†ô÷UÒ¿:ˆÔ’þÖõL3À0 œ;s©T Ûwl3—'6Æ|÷;Pƒ¢¢ë(—Ë(+(Š˜™žÁÈÈu:77O …Ââ… .œ .é‹àÃÉõ˜^.7ÃôM1?p°a —›qÖ:怃€ IØAû¾}û¶~ë[ß:¸uë–îîž®@(r2ñ*éo3ÿ*Æ÷—ôwƒH5¿e\ øàŸᓟz©öü~?ÖÃ|wjý~ƒ@ÀG? ”Še”Ë %,Ì/bôúu6::F3 7oœøèÄ™l6»›éei/âEdI/å{­Ý·‰_‹áïŠôî0kwÝZ‡ «mëÐ$ i;wîø£?ú£ƒ{öìîëèêD"!ãá±ß(¨G»­ë.ž»„x<»B$ÌW^¯¾€@€\©PBÉdúôr×G®áÚµZ©èå…Å…'>:14??? 'Ó I/T|YÒæ°ZÚ‹m5o”éïIæ>îÈåµ€Wø“ ;– @ª¯¯¯÷ÿø_zì±Ç¶utµû£±°">ÜõûHñxp£Èd²8sê>õÒ'‘L& ¨ª8ñ¾aÚ”Ë%”Kò%dÒŒŽŽáò¥Ë4—Ëù|~òìÙ³Cããã7Á™[8óÄ_ܦσKú ìü“^‰:›‘ð0zÓÌ<`l¸÷×ê'poÂà¦KÐÞÞÞóÍo~óÅgŸ}vw[ªÅOÆÞ PEúËààÖ$%Ùðó÷>ij/<‡Îöüª2ß=”1Pj˜Ž<îÌ[ɬ`ll .\ óó ”R:wéÒ¥áË—/_Ãjgžô®/Á²A;µ$½»®‘c^ÛZe¯}‹>.æ>Fô1hrùN„FÐ •H$ºÞxã^~ùࣉdŸl«âföóÒš!1$hPW/Àçóãá‡÷" [¡Ã÷*03ž¡Ráy¥b¹•&&nbøì0›šš¢ŠB–ÇÆn\ºsÒœÎ<7Ó‹„œ2Ó[¿îÚ6ÂÔHùûŠù»ÀÕª•7ÊDaÆ"¨( gta{(êø7ÿækÏ|ö×ýñD"H¶%4…(2ìW‹„ÌC!_Àñ#ƒø•W^F"‡ÝÜS@@ ½RA¡XD¥XÁJ®€©ÉIœ9s†ŽŽ1USW¦oO_9uêÔ™J¥"¢òÜv}ö°PïÝãôÍJïõHûZŒ_­ÀÇÏüÀ] !î} ]h…õ«_}êµ×¾ðt"´´%}D1…ëö«EòÞ;„gŸy]íøüÎUÇï Pƒ¢bè(K(•Êȯäq{jÃÃgqéÒeª(JqqyqôìÐÙSR ¾;HGfzy¬^væYOYeÛˆ$o†ñk•kÕ¸;ÌÜEàþ‚ªaÆ¿ýÛ¿ýøWþÕWžO&¡ÖTÒ¯(d•ôoÆñW‹ŒŽŒ¡\6°ÿ±}ˆD#VÀzêøfNZ*KÖÜúééYœ;wÃgÏRàz¡P˜8wîÜÉùùùiØá¸nI/Âq…3¯Y¦odÛì1w¹‘}Ý-æî2Ú@mÀ]·‘@ ¶Õ€@ø „F YaƯõõÛÚZ£­©¤_Q‰ƒñö«EòÙû?=„_ûÌ«H$âдwÆŸ¸‡r¹‚r©„\®ˆÅ…\ºx ƒƒƒ4ÎPBÈíË—/Ÿ¾yóæ8V{ð—`;øŠ°çÞW«od»ÖsÖR®UgÑÝd~à`õwÝÝ‚šaÆððR{{*ÑÚž (ª‚þ‚|ø³£xüÀãèÚÔ…`ÀaÜ1 `|(’;óÊ(KX^JãÚÕk81x‚ÞžºÍ4M™½qöÊ•+WQ;WL¼1ø‚áë1}­c2ùZ˜ý¾c~àA÷¸ë„ZaÆVtá3Ï<³ãëo|ýঞžTK*Ð|ÖÀÁº‰1†[“H/¯à‰'?p8ÄÓ{ØåM¹5ÔàAH¥R åRÙ•ŒŽŒáäÉA6::FUUMOLL\>ú|áÌ“½È6ûF¨ôõê-{íW«sнÀüÀ=ÀºA ZýZ€À«®Y 3þæ7¿ypËÖ-]ÉÖXÐçߘDM”RüÓO>Àg>ûi$q¨˜»g”B7 sn}¹l7oÞÄéÓCìâÅKTQ”ÜÔÔÔ•¡¡¡!ÓƒïÇ^}™é½<øhbÛè±zmêßlƒîæîQtØ6 õÂŒû¿ñÍoܽ{w²%ð|¤ê“5HGÃ#<ŠÞÞM q6  frår…|3Ó3>dž†ÎPÃ0Jsós#§NžÊårÕ<ø‚é p2ýZyk©«U®w¬™:ÝKŒ/èžA÷ÈåõøAEAT 3þÖ·þè¥}=¶-ÙóBþ5'Þ™0”ç_xžD¢s½û:Ìï(óaE>Í–O±Ÿ[À¥KÙàà)Z,+KKKã§OŸ>=??/òâ»=øiØL/϶k–é›=Öh¹‘ýfêVѽÈüÀ}‚6¼ŽÝ ìáC9Ì8n¤´ÛaÆÏìŠÄÂþH,Ô”“€1`êæLþ£ãù^ûâ|É–ä%Öo ND]×yRRK‹K¸rõ*OËËËt%»29<<|f|||µ=ø2ӯŃßè±jÇkßÈ~µºZõºW™¸Ï@P@4®TÛ߈„Zu2ˆ!D$‰Î7Þxã…—¾´/ û£±°ÚˆiMç7ÿæêºÞþ;_ùÒ¶-›7# z¦ì¶‡)tgÑÉf²ʼnéÛÓ¬X,Μ?þœƒ/Vgjăß(Ó7{l-åFö«Õ5rÌ¢{™ñÝ— èc¹|§€€`u6ã˜Ã‡¡P¨ók_ûÚ³ŸýõÏ>‰†ñDD#ÕàdÀí[³ùÏ}îóÿmÏž=‰¯}ík¯¿ü+/iÑXÔ2ØS‰+:*ºŽ|.ññqœ>}šŽÞ ÅRqéò¥Ë†††.–ôðÕp„ª/fÛ‰È<¯´YÍ0û½jË?0Œ/è¾A÷!ˆ­W]µ$¦–F iZêõ×_êµ×^{&âÉ¨Ï ù\Ñøá÷ÿñøŸþéŸþ_é?ù“ÿôg¿ù…ߌ3@$ÕÐ+: Å"nOÝÆðÙsôÒåK´\*­\»6réĉçêÄàßKüµî¯µ~ÝOŒ/èA0p‡[¢(©ù¥ùø¿úòW^ˆ'b¡DkÜ/–äž™œÏñ‹¿õ_–——/Xúú׿þ>ÿ…Ï}jËæÍDÓ4”+ÌÎÌâÒ¥Kløì9£\.FGG¯;vìL.—“³èˆñz¯|1ÛN¨öwÿ–ýzõõŽ­¢û‘ù;¿2ÐÇJâ%4â…¹Ïu××Úߨ—ΤëÉ[¯5…ú=C)M}ç­ïÌ~ç­ï ~þóŸß÷úë¿ûb²%D#¾'Ï-//ß_À"sêÔ©ïlݺõyÂà›žaÃgÎù|®<1qsôرcg¥,:"¾°é…_„ãÞ-¦oæX³u[E÷+ÓËô@inº‹\nVK¨vÌ+º0;¨¨@Û+¯¼²ëw_ÿÝçþý¿û÷ÿëöíÛçŒ;åÚÞøÃ7Þ6t#´œ^ž8zäèðÄÄĪgÑñJ%y²Š4ÇìwÒƒ_­®V}½cžô 0?ð€€L÷@,Ázͱbä K €  –Á—°šgàxWW×Þéééð:l¿šßkÁK qɽ^û_2ý¤_tŸA½sd ‚ÇDÁ}%Øz k f&ÀM 1ÅV¨ø2Ó{-s*uõŽß μzÇªÒƒÈø‚~á@Ð=r¹Æw—ië—þ ìeÓuó¸A™íuØùòªIz¬£|¯0}#ÇWуÌô2ý€ 9ºPÞ_(Ôj#FÜÌ,*µ½€Tw'Ëì7S×ÌñUô‹Âô2ý€ »r¹ó¡Þõù]/¦—UÛ`˜øÅd|A¿Ý##k)׺Ÿf©†½ÓÃvµêë«J¿ÈL/Ó/  Ýe ¨u¬™k®…Ök—ÿ’éï#ú%Ô¡»îýµ0üZA ÝÇÝ/y÷ý¤;^uÍÚùÍüV-j†)Éôýb>%1ç'cIEND®B`‚f-spot-0.8.2/icons/view-fullscreen-24.png0000644000175000017500000000125711417267577020445 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  šœtIMEÖ " AP…p¦Ií(_>úïÑ6ƒb±8†aO'Bˆ…B¡Ð›ˆìyž‰+žç™¶ðõîS¾üD„+SÛwc=ŸÚ¦•/ë-¶ã2ËbÃDæ€L0ûîs§¹EUolÇR¾¬¬ØŽÛ+„¸—ÍfvU«µtãPk;ãg;–RkÝö ÁŸí8=Q$M£Ê—Œ±iέÃG÷g£·‰At\Mœ85˜N q1ötuÐŒ1ǃ0ôÊ3ÏëÍÑý ÐT"¼|ñú‡Ö4kŒZ-‘òe@ÚŽ{Àt3 A‰êµÚ÷KDæ†ò¥ù£‹”/+¶ãîk艙L¦# ’ANKª<ö¾c›®´YγX*•¶Æ™cÌ"€îOå±/q'y3€s.ÅŠ¯õ8 @@ÏÉ«ÃOM®‰šÂëó3—G"€À¯¸Ïµ°`À²ÅSž¼²{OxðÐ^#WÌ#s?[9OúáØœó·Œ1+ ÃcÊ—¯âØñ¸€êÜ“ê¦ù¯`˜ûøðâíùñsl$ù ¾¤< œ%ýIEND®B`‚f-spot-0.8.2/icons/tag-22.svg0000644000175000017500000002676411417267577016131 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/Makefile.am0000644000175000017500000001070611430555233016415 0ustar00rubenruben00000000000000theme = hicolor themedir = $(pkgdatadir)/icons/$(theme) hicolordir = $(DESTDIR)$(datadir)/icons/hicolor theme_icons = \ actions,adjust-colors-16.png \ actions,adjust-colors-22.png \ actions,adjust-colors-24.png \ actions,align-horizon-16.png \ actions,align-horizon-22.png \ actions,align-horizon-24.png \ actions,autocolor-16.png \ actions,autocolor-22.png \ actions,autocolor-24.png \ actions,color-desaturate-16.png \ actions,color-desaturate-22.png \ actions,color-desaturate-24.png \ actions,color-sepia-16.png \ actions,color-sepia-22.png \ actions,crop-16.png \ actions,crop-22.png \ actions,filter-soft-focus-16.png \ actions,filter-soft-focus-22.png \ actions,filter-soft-focus-24.png \ actions,object-rotate-left.svg \ actions,object-rotate-left-16.png \ actions,object-rotate-left-22.png \ actions,object-rotate-left-24.png \ actions,object-rotate-left-32.png \ actions,object-rotate-right.svg \ actions,object-rotate-right-16.png \ actions,object-rotate-right-22.png \ actions,object-rotate-right-24.png \ actions,object-rotate-right-32.png \ actions,rating-blank-16.png \ actions,rating-rated-16.png \ actions,rating-rated-gray-16.png \ actions,red-eye-remove-16.png \ actions,red-eye-remove-22.png \ actions,red-eye-remove-24.png \ actions,tag-16.png \ actions,tag-22.png \ actions,tag-new-16.png \ actions,tag-new-22.png \ actions,tag-new-24.png \ actions,view-far-16.png \ actions,view-far-22.png \ actions,view-far-24.png \ actions,view-fullscreen.svg \ actions,view-fullscreen-16.png \ actions,view-fullscreen-22.png \ actions,view-fullscreen-24.png \ actions,view-fullscreen-32.png \ actions,view-near-16.png \ actions,view-near-22.png \ actions,view-near-24.png \ actions,view-restore.svg \ actions,view-restore-16.png \ actions,view-restore-22.png \ actions,view-restore-24.png \ actions,view-restore-32.png \ devices,camera-photo-16.png \ devices,camera-photo-22.png \ devices,camera-photo-24.png \ devices,camera-photo-32.png \ emblems,emblem-event-16.png \ emblems,emblem-event-22.png \ emblems,emblem-event-24.png \ emblems,emblem-event-32.png \ emblems,emblem-event.svg \ emblems,emblem-people-16.png \ emblems,emblem-people-22.png \ emblems,emblem-people-24.png \ emblems,emblem-people-32.png \ emblems,emblem-places-16.png \ emblems,emblem-places-22.png \ emblems,emblem-places-24.png \ emblems,emblem-places-32.png \ emblems,emblem-places.svg \ emblems,emblem-readonly-16.png \ emblems,emblem-readonly-22.png \ emblems,emblem-readonly-24.png \ emblems,emblem-readonly-32.png \ places,film-roll-16.png \ places,film-roll-22.png \ places,film-roll-24.png \ status,mode-browse.svg \ status,mode-browse-16.png \ status,mode-browse-22.png \ status,mode-browse-24.png \ status,mode-browse-32.png \ status,mode-image-edit-16.png \ status,mode-image-edit-22.png \ status,mode-image-edit-24.png install_icon_exec = $(top_srcdir)/icon-theme-installer \ -t "$(theme)" \ -s "$(srcdir)" \ -d "x$(DESTDIR)" \ -b "$(themedir)" \ -m "$(mkinstalldirs)" \ -x "$(INSTALL_DATA)" install-data-local: @-$(install_icon_exec) -i $(theme_icons) $(mkinstalldirs) $(hicolordir)/16x16/apps $(INSTALL_DATA) $(srcdir)/f-spot-16.png $(hicolordir)/16x16/apps/f-spot.png $(mkinstalldirs) $(hicolordir)/22x22/apps $(INSTALL_DATA) $(srcdir)/f-spot-22.png $(hicolordir)/22x22/apps/f-spot.png $(mkinstalldirs) $(hicolordir)/24x24/apps $(INSTALL_DATA) $(srcdir)/f-spot-24.png $(hicolordir)/24x24/apps/f-spot.png $(mkinstalldirs) $(hicolordir)/32x32/apps $(INSTALL_DATA) $(srcdir)/f-spot-32.png $(hicolordir)/32x32/apps/f-spot.png $(mkinstalldirs) $(hicolordir)/48x48/apps $(INSTALL_DATA) $(srcdir)/f-spot-48.png $(hicolordir)/48x48/apps/f-spot.png $(mkinstalldirs) $(hicolordir)/128x128/apps $(INSTALL_DATA) $(srcdir)/f-spot-128.png $(hicolordir)/128x128/apps/f-spot.png $(mkinstalldirs) $(hicolordir)/256x256/apps $(INSTALL_DATA) $(srcdir)/f-spot-256.png $(hicolordir)/256x256/apps/f-spot.png uninstall-hook: @-$(install_icon_exec) -u $(theme_icons) rm -f $(hicolordir)/16x16/apps/f-spot.png rm -f $(hicolordir)/22x22/apps/f-spot.png rm -f $(hicolordir)/24x24/apps/f-spot.png rm -f $(hicolordir)/32x32/apps/f-spot.png rm -f $(hicolordir)/48x48/apps/f-spot.png rm -f $(hicolordir)/128x128/apps/f-spot.png rm -f $(hicolordir)/256x256/apps/f-spot.png MAINTAINERCLEANFILES = Makefile.in EXTRA_DIST = $(wildcard *.png *.svg) \ flower.png f-spot-0.8.2/icons/tag-16.png0000644000175000017500000000125111417267577016101 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<&IDAT8}‘ËjÓQÆ¿¹œÓ–æÖ Xš– µ*Il£®ÜÄ­úîÄ;©¢5|÷>…Ýh«‹âe—E/HmÒ$üç¸H£ ±Õ0—ßÌ7C!ôÛj¥\pN_·Û\\D¶Íìæ½åûúãÔX­”S"ò-_Èšž™ïîìaýãz=Š¢ìÊÝÕ^\û‹TõÕì™ÙøôÌ övwñùÓFÝ‚!ŸÏŸžœ¤l6;ºµµõÀå^÷œçkOoŒ]Y8·0Ìðeók­Ñh,·š­[›‡fÎÎÏi</T^<»=‘'KÅÅÀÌtê ÅâRŒˆ¢(ʤR03À…KãSSS2™ÌZ©TЉ(Ì Édf6±Z) Ý@„щfF:Ƶ«×cÞbÿàê‡5„À bQ!ЀˆÁÌPu@ø]Û!À©Ad åŸ ;YE±³½ §ÕjÎyxçàÔAÕAu0(AšÍ&TCxç,€¸Óm8qˆH·ðh’S?¿CÅADÿæßàè ½IÎ9ÔêP˜Iï½Ç߀˜™‘L¤àG2‘³€ˆ@t€ˆæææò¹ó`r‹ êæ™èÿˆ¨Ýiw4>ž€ªtõ²À‚™áý˜­VDDf.¿}÷æ¡™yœ`DÔQÕ—ËwVÚðÿ‚®qD«{ÞIEND®B`‚f-spot-0.8.2/icons/view-near-16.svg0000644000175000017500000002000211417267577017231 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/emblem-event-22.png0000644000175000017500000000250011417267577017701 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<½IDAT8•]OWÇsf—Ý–åe_±Dˆ TcAyµØ^Ù¦IÓm mb/zÓ˜ôô Ô~‚šÔ + ¦öB£éMÑÒj-°èZM#,°/,° » ìÎK/\·"Úø$“ÌœùŸßyžÿœóŒdš&/‹Þ¾ž& [–åƒ@«aÕBˆY`L×õàúÐÀ°ÿ¥“éEpo_]–åÓ6›­¿³£ÓZSSS ª*6›Ó4 g< lMÓ´³º®=40¼þ¿àÞ¾žVEQ.vuv•··wØb±3Ái2™ ™L]×q»Ýø¼•ØívFoÝÜ[Ðu½gh`xì¥àÞ¾ž.UQ¯ž<ù…šÍfxðà>+«+y¡Ã0òÏŠ¢²wÏ^‚Á —¯\Nišvxh`øæ&po_bµZ}Öÿye6›aÒ?@UU5-Íû)--Åé,a-& s÷îÌÎÍb±Xؽ«‰D"Á¥Ÿ/Íëº^?40œ¹lN¿wøýrI‚Iÿ’$Ñ}ðŸ;AÃÎF~ºt‘Ξ¡¤ÄEÃÎFŽ;Á¡îw1 ƒ‰Éq ihh,B|›¯°·¯§Éétö×Õí(¸÷ןØßJ[[’$ljÇãÿù'I´h£½­Ó4™ž~BKs³]ÑŸÛM {×®Ý"‰`¥®Rº:ß~Õ.ÚímT”W°š\%“ÉP·£NÝB–å®ÚÚZ[( ©éM,ËkeY¦©i±Ø¾JŸ]–å.a±XÚUE!‘xZªÇã}-è³ðæôY-‹Ãîh™L¦J‘÷ÓURúJH*•Ú2ær=ÕkšŽÍfÃ0Œj!„˜M&“ùò—ãK[&;Ξ#Þ _^~ª7 ̹cÆVVVòàH$¼|´÷8v»ÅÅç$Nçß…szEQXŒÅÆ„®ë#³s³eeåøý“hš¶ ìq{8zä6›Xl«×® ë:þÜaRÕBæC¡õ\ƒB7¦¦¦tUU±Z­,-/qsôÆ–¬½^GôQVVŽÛíàöo£,İZ 0 “P(d7ä)ÿýèÐ…ÁZ`wee•euu•ùù9d!SUUÿ¨EEE¼µ¯™mÛjøý1Fo I^‡I¿=‘Hœ<á{K®¤S@à¯Çãõy}„#a®üÊãÓÒ¼¯ÇKI‰‹x|yS¯$ ·ÛC(fzz:nÆ©gIä»ÛGŸ|øŽÃá¸ÜÑÑáp:D£‘M^¿ØÝ…ââ"b±Eîܹ³–H¬||õʵ_LÓÔóK’$SZ[¾Ô4í»úúúâÆ†‹n¤R)66ÖB $Š¢¢iãããÙÙÙ¹Ôß}31>9 I’´bš¦!™¦‰$I ð)ŠRÛy°ý«²²²6ŸÏ'<¯¥¨¨«ÕÂÚÚÉdŠh4ª‡Cac!»wkôö™õµõ'À’σ% pn âÚíûÜw³«¤¤Q-T·Ë²\¬ëújr5\ZZ~DÇgf‚“@˜€ô3+òçà"gpä.[nQ `Y`XÖr÷Y@7ŸûÏý !ã‚G¶%SIEND®B`‚f-spot-0.8.2/icons/object-rotate-right-16.png0000644000175000017500000000131011417267577021177 0ustar00rubenruben00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“tIMEÖ 'Õ}ÆjIDAT8’KHTa†ŸÿÌ/b¦`¥‘-Òq$‘¤E•¨PY’¶p[n"i-Q”šŒC›.¶Ê"„„°AG7é8š™÷œt.Μsþ¢9£Eïî¿=ßû}ï/k‘l“"ª˜•E¤ÒgÄbOnzù‡Ä`-²èþ(H z =¸@db@Îôº‚‘ù©Q-ª]rºû; Õ‹áihT+Øö!2ˆì2ÖFz¤ÏݲjhZeq7}‰e£€jSòÆnxù­cø©ùe¢àfgºÉlîñÔqhwÆ z„ ‚3ÈéwÈÕIPT”üË„¦†äX×moQÇzñ@œ%sR8ëd•È>ßd‘¾ȵï ZQ n0ñ°î×ÊØp­³›ž-@¢%O5v5%©3·²ñ\FéÅ$cü9  rN^ZÆ÷øÖ›c‘Óñ3ئ’gt-Úô£×#ý ¨60Y 8ƒå@ †¡ß~_ݪ|•REòqs­…C 0§}Ŷ)ŞͶ¸ãZºÆsZÖÓ‚–6%)ùs9Û¿‘’P9åûaŸÜ†ßÕìÓÔõ¸.^iÁå;¾ÖªŒ‘kÓöM›+Dç>ãw55}ýLI;!Sâ Ú¼FC^ ?ºì?b/oT‰,‚Ôö|dÊ~¾Ü=Ò‚g7;§ò´×©Kþ Å$rR5&´0"ÓÁä£ë¡Èì×V‡Koßí]œ<ÕØ‡ë-ãþ6]†—äü˦¨·Áú^&D¿ãl×ðrI¶z³*ê3æÞvÌJ#rÔÑÅÊàO¼R¡Ðéb$ñü7Õ5 »º qÞIEND®B`‚f-spot-0.8.2/icons/tag-new-24.png0000644000175000017500000000207111417267577016670 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× åD}ÆIDATHÇÕ•Mh\UÇ÷ž;“t’ÌÄL“æ³ÖÔ¤¦‰iR¤â⢨àJÅ‚ ‚ ApW¢‚ …´Qëbºq¥.,B7.µ’C¢6…dÆI›&&ÓæÍ$3ïó2´É›Ö q²ØÞ2óÎÃw~1™Üóí‘üù{?Ò ¿L¥‡ÈÜ0þÖø¨3æû‘‘‰ŽÎTc,ëùŸ¹”=µq×ÝfšÚžé-.¿ÿ§—{á;`ø*=Äo5ÇßáSš¹½§³«Ëx™©ß½…… ®­­µ44ØÜÐÑr‘D}=ÉÖ'ÁèÞÅWŠ¥+_þäÏž>N‘·Q€²–ÞÛÕÖÖÚÕÝm‚ `fj¦˜û+ûyiÝÈår¶¶túí»Ÿ#ÙöTEÀÄI욨Oí=sc÷§Ï·lŒOŒ?wòÄèÁ‘A°°p›-;øåÇ”7æ"—Ö_Ÿa-÷|èˆÄãöåáÑ‘„8AUhïhGà¥cÇ^’=’J5”WsïF®dŸFýå à¶|ܙމïûÕoÃÃÃõÉÆ¦ÇÎÍž¼¿¿/èíë© ø#lœ»d¹H€1ˆˆh9lêêâÜqèPýáÃR(ȯ΢T˔־Á/œ&ž|©ÀØÄiõùz3U]äá°|°Ö"VÀx1=ÄÂ5Z‘ŒEDX_/âÄá\åñ 1çÈdæq.†•Fp{Ѻ{X\íb«xM€ˆÅZ ß…ù¹9œTÌ:ÃóÖp"d³Ä bmÍrSc‰,ØJŠŠu¬yk8BˆÃó¼êòÕŠH´µR­96œÝÕ6möËuѬE¹ U@è 5ÖV²î_80€SÅTfoªåÄ„mcLuL8aS @JUMå'hH4` 45%1ÆÐœº k…T²ƒ¡±± S9œ›‘ u¶ ÒŠZc ª°gO/ªÊÀ¾ý¨*†â>CƒÃ¨*}·ö£¡‹0Ò¡Ž©µÖ/ùK—/çÍ©f¬Ä @¹\Æ÷+ÕUTÁ!îêXYYÌjTÒl(Ë“g'_Å0&âvQµ_k+  𗦧¦ß–Cº2M¬b7º¯·‘*ÂE |5à?žQR'$\a%IEND®B`‚f-spot-0.8.2/icons/align-horizon-22.png0000644000175000017500000000212311417267576020101 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÐIDAT8Ô_h[Uðï9çþIro’¶iº´º¶vCVV—u"¢{k}c¾Bˆ*aè|p¨O> ÄW3Q*â*ÊœŠŒ9Tæh㟇éÔ”¦[Ú&Mó¯Inν÷çƒÉŒY[¬?ø=ßùpîïüîaD„D,žTèm™?=5Vï¬Sþ#&h<¨Þ4;÷°íN‹';‘Í`péôÔØö'ŽÅ“êññ†8“‘§ ³\÷a¥¼«öMêþ° { ‹'y«è‰±™}š¨ïÑ„ì1SõJW0*ß·{víJz<»|7€¯ÛaQ>ààpøòH¯‘¥Å)!ÇÜZå `ŸP=ŠC³!MV¶LÀÍ=Í웋|×s^!!;ƒ°ŠwC‡Ç‡¾Ù=rè^ÞP¨Jc·®4n ê…ÁVmGîϒ°›‹ºEjX:JàŸÞsUc@ˆ×XĽ> `¡.èà­X†Qó 5rË_¬Hk5âX7@b£P•½¬*½z©ôn? àL fD„X<9`$bfC{{ÿÚef ±Ò§jŠÞp¯6/R÷©f—§ìÂñT>¾^ós—MXUoðÂ'w^>Ê\Ó4ÓtÃ~ƒ¯e³eiYG‰¾üW+š³|@t³9ÍeóÝ KžçÞ?Ù?X_g}=]ÌÀ9” Ê­®ž¿×¶k¿¼Vü `¢…­ç‹Á…Ô’~=½t\§ä8ôöuoè·;*+o€sx½`†OOC.wO縵âûr±I¥ÒZz1lH›\‡ÞƒâL/|úRâï’ðƒª- q´gÿ~Æ Ìç\˜ l üÑç'¼p?dÀt곓ßá–ʵíw7ŠÅ‰ð訟¤I V­‚lÛÜ.Þ¸½V?uñâ)»€yÆc_ðÖ3²Òi0Æ@R•ø(¥TÊW$ìˆ[W®Ü(+q/DÝcB$®ÕFRc"Q B &*îLظ30nt£WþKb©|Ø™–μã¢vZú…;îæ½Ì½÷œ9÷Þ÷f€Ón¢‘3º µùžRÊKy;ßåõéš¾/å«}”{G~œ˜9¶03±´¼hnm%è8«Íql&¶~siyÑŒ-ÌLœHÁÔÌÔùP0øíîø½ØvRÊ‚“A¡@×u¼Zyi¤/FF~Vciµ:Ûý±ë£7$±ÿŵõ†aÞ¿¿Ã¹2Ò14tNŒ]»X]}pµ%‚ÜQn¸··¦e`}c-“1¬±ÉpdÃóböÙåOŸ7>ܾu'Øß×ÜQn¸–R롦j>RÂÊZmBŠïÕ1<þbfБN!G+ä´D D¡5’l2 ,öÆÍi‰ "¹ ƒ$A²n\E¢±ç£ªPßhšVJvÇéÑ©º/AJ(ªŠØ\4åÐߟ|_3xvn:eYIÒ03ÜÝÛf3Kn'xp˜fÞÎs?ÍÙ¹éT]¶m‡|¾6ì¥v %;»@~’•+ˆŒ‘aèõ¶íPÃ1% )åq  ËWÞ„(5¼!Û4÷äÖÀ²6AB²R–4,í‹«(_' $ $dCÀâ¥äÙ‹ÖdœR6,éI!Z+‘”n‰d ‹¥ò6¼z¤ã4$(Šjd³Ù@wWO1ÑS·EE®,“˜– EQ †— @(ϯ¼}ÖuýØè63N=âñÍyg¤üuo¨vüêààà™ÿùþ&‰ƒd2é°ddOýOþMØñØã 5DIEND®B`‚f-spot-0.8.2/icons/view-far-16.png0000644000175000017500000000077411417267577017057 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<yIDAT8•½NA…Ï™…Ĭš¬ÖØÁ#Xja(|k,4&j(Lc£=…úÆÁÖÔ‚FélÜ,‰sq,HÌâêM¦øÎœsæ‡ööócD´bYÖš1ÆAÈÑ«ÖúÐs´¹±å+)äz29»NÍG”Ray0óÔE¥|puU°«HP65—Žt»>˜uhR éT:r}s™°+˜Ù‘R‚™¿LOOC¡Aff!Á̈¾l†'§ÇКG²1ß~ñSh·Ûèt:h=4ù—‚¾X»­n#CoPoÜ\× äÐËŠô7„äЂÜNP̹ïÿ]ð—ô«AÁó<<¿¼ “YÆÙù9Ç÷æaaq u÷3±&'Ƈ ¤”žïû¶R¶m##<]ß÷!¥ô@Q©R)¿k͈F£¡KkF¥Z~'¢(f.´[h>4W{½žö~)¥GD%f.ý÷Î'„Ô£z–u IEND®B`‚f-spot-0.8.2/icons/film-roll-16.svg0000644000175000017500000004322111417267577017241 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/mode-image-edit-32.svg0000644000175000017500000006205011417267577020272 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/tag-22.png0000644000175000017500000000170711417267577016104 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<DIDAT8µ•ÏO\UÇ?çž;Æ:--¥$ÄZ§C1]º±‰îcâ¿á‚›¸Ñd„X7&ºð/ðpo¢ÄUS%`bMZ~5ünå ô½{¯‹÷f3@Øx“·¸÷œ÷9ßsÞ7÷IÿcÙ³_óÕ{9c¿‹7ÑS«›‰w«ŸÎ|ÖûršâÚ£Ú¤ù¥R¹Ó9p}€"€ý½=~?x]?z0==óó…Àóóó—ñR¥òÎÐõÁA‰êË‹E/lÿ•xl|´«X,²»³Ëo¿.lÇG~¤Z­î¶‚MëAâo¯ö÷_¼qC¼÷,/.®¯­þ¹ñõõõþxòç¿Þ{J¥ÃÃÃÅ|‡þxšâàÚ\íüÕO&ïV.yïØØxA µjµú4±avks«BÀyÇÄíñŽ|!ÿþÜ£ÚÇç‚óyóyy²Ò©ViŒèÚÀ5ffg¿רL ‰H¦¦¦Šªöa+ø„+¼ ·.—.ãœkž•ËåBO±ûÁßOÿùhttÄÝ,¾Ž!à\BéÍIß<,‚ª*>$Ù^èèÈóî½{…û÷? ~Xgÿå.jç=!x²îÚlÛv FÀ15 Fˆ¢êõHmg­E¼Ç¹iE´ÏÀˆ "lmn£ÖbÕbmŽõµ5¬ÍamU‹UEÕbŒ^ ,bPUŽŽ3húDõˆœµ¬¬6A;å»8ï¸}«L‘·G ™êl•€|Cõñ»íW¯^vöõöaŒ¢F ’$Á¹ô¶#B#JÞv°··È>-F°!í?v?yüÂgªö*Í6Oÿ8ðÞm/-.Í;@²kQÒ_ŽH¦¾äΡ^bàHàÿ<6½ŠWûIEND®B`‚f-spot-0.8.2/icons/filter-soft-focus-16.png0000644000175000017500000000117011417267577020701 0ustar00rubenruben00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  šœtIME×ñóòdHtEXtComment(c) 2006 Jakub Steiner created with the GIMP :: http://gimp.org#ÿX@±IDAT8Ë¥“AoÓ@…¿µv=›¤6Rå¿ qàs@â‡@… jZ¯‰wmKË!ĵ æ:ofÞ›y£>­ob]*_ñP<Ð45Ù4çj¹"›æ”[ÇúóGʭØ”‹ü;!© C]sŒÉxL¼÷ÄXBÀZ‹R³PB]£«ªB©ÈùYÆüRº‚?K6÷ùk>F….Ü=ãјÅüYG9Ôž7×´m€Ö†«å Im'énó}µ'išG °&›æ]1@Û6dÓ­õÛ45IžÍ°Öâ½Çú³¹ï=ÖZòl†úúí6vš7w4¿'¿|ñjPüæíkŒ6Ìç ÎÏ2DdÈ éÑ~*š¶0HøÏЮ,º;mþÉÂhÓ1ޱ@¹]ww^>_‘gù@ó1Ž;q¥£,]ç“Ä•E§ÉŠ¥mÛ'§·m‹Û1peAbLz*·­Mï|†rëNš“¢gù%JÅï/æ Bx´²sü†Èõþú]„ˆÕ àxç¾÷ûy+#@‘ˆ¤(u ´Ûïèï$Ïfô}âÊ‚Ý~ñð‘")¿º†ÍóiÑÜIEND®B`‚f-spot-0.8.2/icons/view-near-24.png0000644000175000017500000000117011417267577017222 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× !C­åÓIDATHÇíU1OÛ@}wvRíÖ2Э +À’v)kUõ?Ô…"$JÅÄÄÒNt®D•¿jRQwHâ T8D…2E†JU“ä’».MÇç¸aæMöù¾÷¾ï}Ÿï€[„€t¶··îƒŽlF"Ñ×”Ò±a‰8çkî€×ßoll]vÖÕî:²ùüÙ‹5M‹«7LvìøØ\ûœÚ€·>EQ—4-®:ÎopÎ¥ §g§˜|4)ýF)…¦ÅÕt&µÔ+@{öÜýWª”À*—‘L&Ñjµ‚,òðȈÀúÓé/¸úuý»>À%|W@@¹@µZÅ‘iv÷vÁ“Ó ~ Ú«Àl.Û¯Õj0Œ|€€¿ ÚŸ FÁð¼èß+´Bîaåü¶m{×*ü¼¸÷ È"!͠З}º~ ïÁ`‹üD‡?¥¹|ívañ¡ÅbòS#½EQB-RÃ,zµ¸ˆýLö¥ ˲0=5ññ˜:ÿ_©aS01ñ /Ë+ËX³ü›ÝdŠ†Ã€)ãº.!¾0ÆŠ¥‰'HíÅ‘YD£Ñðžû„Àu]€À‘÷@ˆO¹\v5‘xy}T#˜›™ÅÜÌl`î××. £É9ß‘ (¤þ®X2ëåk… qoXs(!k±*m~¸½Ç‡Â_X'òa¹/|IEND®B`‚f-spot-0.8.2/icons/autocolor-22.png0000644000175000017500000000224411417267576017334 0ustar00rubenruben00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<!IDAT8•kl“UÇç¼oûö¾®t- ƒ¶Üæ(ŒEÁŠ1”K$AL0! ( ú…/Ö/Æ/è'¿W.‰—Dp¨˜ Ž’MÙÑîÖm]÷^ü@GÆ`Cü'OÎ9Ï“ó;Ož“ó,ËâÿXtÝ»©â*ã”O‹ ì@ ÈâVŽ Š%S €íÀ‰±1ÉqаX4”Çú|ZD'n²Ù”lª²'–LÙ¦çÓ" ̶Wl[¥ÕœÿÈiÿ¸Ïzómà`N>-*ÆoR¤Ü±h^µxöAé³w‡»¢¾Òé‰*5óö/¼ØÖpÀ´¨BãÊðxbqÄ{ðÅUvÍnÛ÷ °¸ £äº“•"p{¼3O^Xûaæú¬c~»Mݹie½¦[ŸG{4–LÍš ¬%Þ;2Øû«5:|…Bö¢Ñù„ó½g®nþþÕ}/?K¦T!Ø:³: oÜbåÒZ!¥Ø=¸èÖ+v§ôtþÉWŸ¦X,b&þÊJŸòžK–eÝåȧåÃhll¬°9ä—>Ÿ?±vÝ3šf×h>õ·ðÖ®çÊÍ._Ê-ËŠµy«kb)î(·î@šššúæÏ©[•ɪÝ_|þ ¹\Ž'—'¨_TKöügÈâMìN—…»îWã)õÉi-ءǂ 9~ü2™ uuµ¬]½ßifºº^‰%Sâ¡ÀÀÖ†x„ÄÒelÚþ--iš›§ª*Èæ-цÛ6âV<XJ¹'Tåwœ¹’Å[æùÝèÊóõ·ÇÈåó)Ñ\n—òµÿ Ž%Ss4»q8!˜[íE(óÛ²GùñçstgH`YOG× >,„XÆÎHMÈfX°bI ‘°‡úÙªü.<3HnÛKxî2EÁîpš v !”IÁB˜†»\n·­8¢Ó|±‹ö®-™7²B•.Â7ª*qx<.!•×:°¬_-„œ–ïbFØ¢ò…QzGÐM“ü@‘÷›ÎÒÝ;Œeš˜†BVêÖoœ l¥ÁΡlëwmÅÞe×Ú¯:¡šŸM³ Ý„\oÁûŽ„>˜ë*ö^?YêïÈÜóòîª/¸¸Ý«§)š×çš©ŽŠ´¹BRµ{ÌÑb¿©çŒâ@¶ÐÙÒfŽ(7´IÁe¸àöK`l®–M&·[®Xåµ ˜ÿm+¾žÓÿHIEND®B`‚f-spot-0.8.2/icons/emblem-people-16.png0000644000175000017500000000125211417267577020052 0ustar00rubenruben00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÖ 72RãÈtEXtCommentCreated with The GIMPïd%nIDAT8Ë­’MHTAdzëøx¾>Þƒ3¢²ö˃‹Þ"‚dÝCP."ˆå¥cx ÃCtÜeÛÎ]Ä*ºl !´«Ö¥šË.¼Þíyj`œr™âF‘Å·oNV*•¦XW7RJÇ!ÖÕMÀ¼;ž»ý@ñ%7ŸÅ4-´z¥¥Í‘(›¥MÇ[?·èŒDï¤Ò‰°®ë=†a03›A«×hl<õ£Öheõ;¶mïöÝ7†ðüGxþâ)ùü×R­Ñ¶ã`7ÉÍgB|v.[¦…×ã%l¡µ5|L×õÆZ£ÓMg˜™Í`º®ßI¥W܈mÛ”Ë6ËËËMn£‡’è :>ŸÁ!€8@ÝNws½¸f4Ÿ¿@æeƲL‹RiƒP°…P°P(õ{³eZ×÷RÊOSÓ“—̶ܿm„¥@¡PJ±G9,©tb}umEU«ÕÇêÚŠJ¥ëµWØ)廩éÉk‡"¥œåäõ×x"DcIEND®B`‚f-spot-0.8.2/icons/f-spot-question-mark.png0000644000175000017500000000537111417267577021116 0ustar00rubenruben00000000000000‰PNG  IHDRÓ?1bKGDùC» pHYs  ÒÝ~ütIMEÖ &ªØ. †IDATxÚíÛvš@@‰€\D 1i»VÿÿßÚµ’Æ ÈEÐ>ÐRËÅ$ê Èìýd¼Ïffæîp8hª2¡ ƇAˆ&MÓêqžçûý¾ý—0ŒÉäßñh2™˜¦Ië‰æîp8Ð ×õ,ËjqQýׄétZz¢ë:Mƒ`·Ûåyžçùn·ë:´‹À²¬Édb†eYü ÐÑ>Ë2ÉAß…iš†aL§SR&÷×Êm®Îd2±, àúyN–eqßÊ.M°m›³¸ˆ8ŽÓ4ÍóüF¿ÿt:u‡Î ý8އâ_Ža³Ù @¹Ð¯õ³ÙŒ¤NåúQív»?Ms÷§qîîî4Mk6Tù†êmÇ9~OõÙêqõÁÚf»6ÕõMÞýóøë•<Ïs‡ßêDQ´ÝnUØSÓ4çó9]ü;ð¯×ë¢(”Úkß÷)¢!€Çñf³Qsß-Ëò}Ô ÃÁVµpRÅjµߥø,¢_qÒ4 È~ "úÅiþàRÅÐî°pÇó<ÕPkDX†r¢¿ ÷ò:ãé«å=Õišö~suÇÕw¦gô'Irª-Úª¶ÕKÇõÔ®-èºî8ŽeYç•™v»]Ç]_òÝ2óéºõ‰ VÑuýþþ^©™*¤iúöö&nû¦izžw•Ί¢ˆ¢è´«âp]W©DH Š¢xyy´q]×}ß¿ú½–išn6›^êÓA¨së¨WÄ]âp]w¹\Š˲îïï{ D¥Jãã <¿±åÅb!4[Ðu=ùg¥»ÝNP‹!@¬×k›õúªðh{€¢(Š¢(ÔÃáp¢ÞW{©ùgõLõ ¯ôÀuÝjj_©öü»ûu¼wµ}¬6ÕW5®Óƒ‹Ûx_ÃçmÛÖz?‡+Š¢¯ ™Ð@'}MÊoÐ ÔãÑQrEldWÒÔ: e† Y€Ñ%º±à(JèŸÑ§0r. 4¾{†œ$ÊP$Ä[ º­?|רßfñµ¯;š{ñÁ!ËÚ{JkmàénÓ4k¿k³zªµ‰»~õÖähýñïVÛß5rEzƒÑ ùj‰4$w;cmF%z€Qî—äÑ_tB€sLµu `¸‡®^ŽŽ2{n»s†'zI/³Ê,?«0Eܘ º®Ëï$—Þèn> ÷J_"yÜ<÷÷÷‚"CòÝòô÷’üçŒëú*Üw4òJp9Ýñëëkó¥ÖÉ–[ŸiÖYyuš(Š>8üWë®ãÖ>ØÅÝÝ"£ÏÆ/mÛ­KC7ƒ ë™Z5ùg‡Y–EQÔú­>¸/­<Ñ] À¨¡k-A/‘!h‚ÇÓbC•bÊ™–/™&Z×õårÙË•Á0 %_ÿ‘†ƒ2~TÛ¶W«ÕÁäû~_1‘$I•ü ÀÕQqà,Ë’$I’äÝÛ ¦Ó©mÛ=FC–eâ–öèÂ4ÍÇÇGP„ý~ߜߡ,r™¦Ùo)´\ØFþÍ?ËåR—J 0d’$i½z+!ùQjáxÆýGÑ0™ôRáæ$þ†¡œ³ÞjÚà Ïó Ã@è‡<Ï×ëu’$]ÓS"µ=šä¹uéæ–ÇQçâ 1ú[OyÏ;Iëš>Zë@ÜË"4ˆã¸—¤¿b¹\ª–üpLôÿ!5£Ÿ ^__ûšhºŠþkÝ(ED?ÑO §ùõëWë¯èºîû>ÑŠF¿²×| 6›ÐèoÖw™Íf‹Å‚_ú!MÓ···æ Þc>2Ãó‰7t½ªëúb± íA€ÞÈó¼¼ÞzlîGfxþ쫞çÍf3Òè“(ŠäßÜ?N}ßïe;€ÿ’ŸÍf#ùd—œ†Â%ãñÏ}Ïó<Ï£Ù`(Ù¿œiHx` Ù¿èáyžmÛ„> ¡·ŸA@3"ÀMòüüÜÌõ?‹®ë_¿~e.h¸±´çùùùZ+#ဠ¸ *ŠÕju<)Ðáphkª'›´ÿÔEñóçÏ<ÏiXz€ÛÈ|D¬ fÆ÷ïßi^z€A³Ýn­ŠW­50\„Æh†I’ÐÈ0Ü詯V+ÚŠ„%Ó4¥@€fÿ‚VD­ñÙ¢2 ÀHÿ•i´6 ±ö¿È‚`XH®R]¸ò À•ɲ¬6úá/µ?[˽ÇÏ×kÿ—Š%§[ã†{K®F-^›/µ¾ÿô››FiÌœN€0$X ”FòØEÖÎ@¥;:2g4a°< ŽÙlFþƒJ '3ñ}ŸÖF€ávµroE³’Õ,‡µ’·¦ë:ù ”ù|^‹ïæm]ÁÝîM%hg(¦i PÛ¶¥i œÃb±t9È0ŒÇÇGZ†ÎÓÓ“ˆI¬LÓ¤yà¡oß¾]w›_¾|!ù¹:LŒ%Ýn÷ãÇ« ”!ú@Q Ãxzzâº'Ü0///ažñAß÷}ß'ïG€1ta~\BÆIô—ã'«_Áó<˲\×%ô`ü$IRN¤ÅÝ ÐÔ@Ó´ß<-w3+IEND®B`‚f-spot-0.8.2/icons/emblem-places-16.png0000644000175000017500000000163411417267577020041 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆtEXtSoftwarewww.inkscape.org›î<.IDAT8mÓÍkeÇñï33»³on6›˜T£M6¥–¤Új£ÕÔV(­%d‘âE ÞÁ£Âþ ¢ñ$öäÉ‚¢ÝK¡„úÒØ´z(mÜ„i^Hö%›—Mvfvæyžñ"°¿ó—Ïí'¢(âà ÅépÙ0ŒqÃ0ÎJký‡ÖúO`Æ)—ööâ P(N“ ~xûµXêèá5»·»&,{œ‡•—#gµî=x¼ê¡œrÊ¥[ÿ޼÷å·ã'7?9}²'ŽH¢uƒ„½N;œ Ô# äo¡Â?–³þâŠùÍâÏ_”þ Åé‰7ŽïÏL¼SKì=˜¦ÉÆöâñ>â–O̬Ë,Ð÷Ì,ž/¸úÓ%¿²lL:åÒ¬š¼’³ã,~þñõžtÊG˜y«á…§H%ã$âÃÏ}OWò¾âû­ýn®\½X}Ä.Ÿ?í§McN˜âΣϨ´& –¹DÛëåÞ§¬ÔÇ e‚¸UãÜ)? -!Ä™¡çÄêæyª»ÇqÃn’¶¢cH¢(âåp¸ï&ÙD–­V–N˜BI( ¬Ù0ü¦âl2áñ¤vŒêöA¨è„¿âú ‡~AJ…kÏ,Ðr»‰tÍ aÆ9 ÞØš"—þtr;n²¾}¥4vL ,‰”¥4Ý©%œê(-o”ˆûÚ̽x¢7ß?Vo ‹‘g8öÂpʥߟúÆ‘ PDˆq!Ä9@GZÿ Ün8å’{°ÿɨªd~­#IEND®B`‚f-spot-0.8.2/icons/mode-image-edit-24.png0000644000175000017500000000134711417267577020262 0ustar00rubenruben00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× /6¯îÅÜÇ™ŠJròØ)!|.€výÁ«] Î[0¥àÃÏ»ö\Ä!ÃfãæeG›êñd<Ž©þýëO´?#BØð£)¼†®³]Ð=a\ëÆÏ%R:™ØÙeh¾ZGr B†D^,þšE0°Šo y4Ô¿|z+ɯРË0"Ñâ¿Ä¨X"{i¡JÿŽtöBÆvvRJ¼{?Ššº&üø2‹íç@\ScÀ!Òp ôU|ªvúÌN½ÆZj‘æ¬8€1¦¦atb²¼’R`#ùóóŸ UÕ`ìÅ$†Ö»Ôº(±”س[„ð#½–ÄfÞ£<©,V U‰Å„Rß ¡ÁÊl@V‘ÎÀT5PØi비b1†7ãîiø÷Œd{ïS¢]†-žNÌáñÈ4¤ÜÞ»u©7.¶–ÚUäéé,§V\ÎC#qœé8]÷,kC#3hô& ÑmWÍ-Íhl´ÜLžÅwͲ­­ ^¯®:*Á𠣏¬ô¼}%ŠGÏß:Jtçêi„BõeÕøÀ9ÏÚ¶í3Œº²‚õvw¢·»sOQmÛç<ë ¢¾X,Ö/„¨èÊ$"‹sÞ‡ÿ¦j¿^j~óoC­IEND®B`‚f-spot-0.8.2/icons/emblem-readonly-16.png0000644000175000017500000000114711417267577020406 0ustar00rubenruben00000000000000‰PNG  IHDRóÿasBIT|dˆIDAT8u’ÍOQÅÏëZ>åK×F׬Ü–·Õ÷&ì‰iH01.¥¥H*MÀ°5ü†€K]¹ñ_0l„(R óõ:ï¾ãb:Cùº™d^fÎù½{O®Â•ªÕªŠ¥Á·"ò8±É8 xgªPøn»æM¥²üóª'¯Æz}a£Õ Ž)"ÌJDxxø›­fØX¯/Üh®Ö«3­Í¦o­¥ˆ°›tiLÌØDŒMLk&6ak³éWëÕ™Ìçe‡±ÁáÆü³#ppð‹»{_ßF`hh8˜››~pÿ¡z^žÙÙùÜð ÀtÍìÔÔ4›`o×ïøQy©²¬–*Ë*2ÁÓý¯{¾éܾÓ5³™/h­KJ"a•S?²K¯^ ƒpLDÒ¶=¯t  ” 8çðÆœ]®Í3¨5Þ•µÒÛž—ÆáœƒµRB§ïkÕË' ­=4Öjm¡¼ÄꇕvG$É( yrú·ÕŸã#vüsZ±<ïœsum¥íÙÄN‹%´ÏN@ç@Ç'd:JÿÛ:Â&ǧa­ðJÓöÁ[Œ‘>„ʳêíáœK…¼ Ø3‚(B¹8:8çÒ”ûÅD>JzL;QPpÒpý€Ëâ´‰Þ·LA!ß ­µoâhtâÎ$\~3/.2 \o¬0 ¡µö=‹Ÿ¶·>‹×¶'ËâúBbEXüÂ?°ø†”žÞIEND®B`‚f-spot-0.8.2/icons/film-roll-22.svg0000644000175000017500000005777711417267577017263 0ustar00rubenruben00000000000000 image/svg+xml f-spot-0.8.2/icons/object-rotate-right-22.svg0000644000175000017500000010010111417267577021205 0ustar00rubenruben00000000000000 image/svg+xml Lapo Calamandrei f-spot-0.8.2/icons/f-spot-128.png0000644000175000017500000004733411417267577016636 0ustar00rubenruben00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆ pHYsììu85tEXtSoftwarewww.inkscape.org›î< IDATxœÔ½wœ$Wy6úœSUs÷ôLOžÙ™ÍA»ÚU’i%a0F€-°¿Ÿ¬‹…Aærñý|ÁØFŒ/HÈ$Kˆ `e!±+¤Ý•6hƒvwrŽ=3=©swUï ]]SÝÓ«`ã3¿3U]¡»ê<ïû¼áœ:EöïßßÕòÌ3Ï*»ÍûˆÅºÕ6«s+fZZm3î³úŒýû÷¯Ùö»RÈïš¼‰ W‚Z èÕ Ò:€ßMAø€*À¿Ð/D(´R ðVBð?Rèç?óÌ3D«» Ê«T©ÅÒX9Ã’3~þÄ'>9|øð]Ï?ÿüŸà‚Á wàÀ¿¸úê«]¦sÍëÆj¾c5ßGÙ}¿ž6{³Ë9¼NН¤õÕÖ-÷Ý|óÍÎÏ|æ3®¯¯ßvÖÕÕÕŸ={öØîÝ»ßóÜsÏ}èÒK/½{vvv`vvö‰¯|å+_ûÏÿüÏ4Jn®¨²Íji^ðßËÿ%ðÙõJì°f[cc#ÿïÿþïïijjzo0¼¨¡¡¡…çyýGfffÒŸÿüçoùÌg>ó›7oÞ’$abbbxzzúÙûï¿ÿî|p •¡š`Àbi^ðß#o©¼v}=-/«?ýéO¯îêêúã@ °»¡¡¡ÓápXš<Æ^xá…ã—^zén§ÓÉ÷ɲŒ©©©‰™™™>øà—î½÷Þ9¼Å‚ü× Ã[&UìzµõõÀ_×'¸÷Þ{·íÛ·ïc@`_,ër»Ý¶Z®w`` ×ÝÝí¨´Ÿ1†©©©Ù™™™ß>þøãÿüÅ/~q%peÔ&¿s‚ð¦ ÀoÞv!4_Vÿîïþ®ù¦›nú³H$rY8Þ ]zÝ«««à8n·»êqŒ1ÌÎÎ.LOO~饗î¾óÎ;{P.•„>—æu½¼U‚ð¦ ÀëþBœ93ÐÛo¿=xÛm·}4_SWW·- (}cAM<G}}}ÍÇÏÏÏ/ONN¾râĉùøÇ?~ ÿáM ð×¾VÀ˶ïß¿ßy×]w}¸¡¡a0ÜYWWå¸2“ý†Êìì,.ø¼D"‘ššš:vþüù{?ô¡ ¡d+a@…ÏÆ¥yÀ›+oXª€ÿ†L&ƒ`0ø¦}g¡PGFFz¦§§y×]wÝ{âĉ¬¡#X±ð&°Á›%ÕÀ7çÈéÇ>ö±Ðm·Ýö±p8|M8~S<ø7RR©ÎÍ¢kk¼^Çëv×+Åb‘ŒŒ Äãñ'¿ô¥/}íÙgŸMÁÚ70F…ÏÆ%€ ‚ € ¿¬£ä=ïyëÎ;ïü“h4º?ìŒF£oª¡%Ÿ1Ø7ƒÁž8¦'——^Ý…=—v`~~¡PoÕõ‰¢ˆ‰‰‰‘ééé_ë[ßúòÃ?¼„õ… Vá‚„à‚  õWŸ>öØcokmmý‹`0¸«¾¾¾E„šïÍ.¢(atp=3Y€,3„` ሸír‹ELŒÏ¢sCË[z=²,crrrrvvö7?øÁþñ[ßúÖJÀ[ `m&€×)5ÇS5‚¿¦kV„í›7o~— oÜ«z…É ã œŸÅÈàŠyI¹x¢ö…«WEÁÒb‹ )„"LO$pìð4®¼¦Í­¡·äÚ(¥hmmmniiù_7|ä#ùíc=öÏ_üâGÔ+3 Ô%… lõ3±Ø¾nẺºÖ=¨‚Ç_Ió)òàƒîüÅ/~±päÈ‘øM7ÝôÁH$ò_êÜŧWpêØ(<ÕƒžÓ“X\HA–(% „€B•¥Âv» M­A2À¹ÓSMÀíq ªž&~½…ŸÏç‰ÅbÛ6mÚtË­·ÞºwûöíýO?ýô¢vˆiYñ«´•¡¡!R ¶5™€uìþ­à¶ßpà O¬®®Ÿ={ög@à–ýû÷ï[÷‡Þ`YJ¤0ØÇ@Ï VW²ú‚]=ˆ®òÚM¨&@=Öãwâo¿’$á—?=„ÑÁ¤ÖÇ|¸äÊ èÚÔ𦄉ÕÊÜÜÜòôôô˧OŸþÚG>ò‘c(%•dÔæX߬k*P¿¶nÅÜž={þwKKK@¨££ã¢¡¡¡…x<΢Ñ(y³.•Ìa°wƒ=³X˜K*@¢dœj[ €3b¸)¤“9ħWPßèGs[#}«àTë5_Å“žD0ìÁ¾+:±i[(}k!¢Ñè---Wž:uêØààà7Þÿþ÷0"W8õ‚ÌÀº&`hh¨Ð5íçþþïÿ¾ëÚk¯ýœÇãq€ ´¾¾Þ#™ŸŸG¡P€Óé|C”ωè??ƒ#ûqè@&Ç–É”ï$ S¢€M•ÍJ¥D_…z )3 GÑÒÇôŸŸXÉDùlÃýóè=7 J)ÂQï[&.—Ë^__ßáv»÷‡B¡ç8°PáP#ð5›‚ª&`ÇÏr ÞÑ£G¿wñÅÿA%€‹Å" B¡jÿEQÂØà<{ãI@’eéÚNXé³¾Sc¨´OJ›Yù±š¹p8x|à£W€à©_½ŒÁó˪p•ÿžV\n.Ú׎í{Z`³½5ýÏ>ûlß7ÞøG&QnªåT6µ^mµOˆ;ï¼³9‹]UM»A@,ƒ(Š˜››Çqcn&3LŽ-b°Wõà ’~(£rÃ?Ýæë€3m]ÙHJ‡•ŽÕNg ÃL/¢¹=Œ†¦Î.Ae¬¼A@€l¦€#/ôãä+#ع· ;/n…Ýñæ…»‹‹‹âC=tøÖ[o ÝqÇ[]]}åÆoü!¨ä Öd je+§Ï¨ýzäÈ‘oíÛ·ï.$«'I!IB¡A@|fƒ½³îC6[(kl3ˆÊGD¦ …A˃? n4 HÌǪ?Ò±1Š+¯ßŒÅÄ2~þàQó ešÆX›€m»›±ko\µ HªZŽ=ºZ,Ç»»»[êêêü¯¾úê}ûöý!€ª3° Td€ à[1@n¹å–º†††k.4¥K)‡ºº:ȲŒ™é8Fãè;“€TdŠã¦ª·;íÕA¤Ú&¢k³Ñè넬\»)¦~÷äè"ŠÅ"!:6ÑfI±óæ&´±(áÌÑ1œ;1;b¸h_¼~絋V2™ º»»}@`»¶Íï÷ï¾öÚk›<8‚è†;Ö˺,PÑ 48Fà+޽ÿö·¿ýÅ­[·^}!09¾ˆGü lvuQü~/ZÚêQs@°ËH. ‹Ð0‚RìntÜ´ª Ñ&TsÉšø_?G[7—Ìàõ;á¹I§1Ú¿ Ž£–Çj×C(5]ˆ'Ñsz +KYø‚N8œ‚>´uÄPßä†`gH'ó‹X ’&š§o¼$(´LP`X7n/”%c2Z:Ãpyì˜G±ÀJ`“rÁY³]¯Ê½.-¤Ð{f ‰…¼'œ.Û:"ÀËç Ë2Žò±ª”RÌÍÅ]>øÐO 8„@•®b­XE–p¡Úÿý÷~ÇŽï¼íϬà…çzT y#Cóè9=B 0BÀ‹æ¶(š=àír™"ļ¬6¸bŽ)ÅM,cÃ~BM@Cýlbm=Ê£sS=ìNVV–‘˜É‚RjÁ¥©‚`u)‡³³˜›Y…Çc‡Ûc+ù$¦2??@ Pú ƒZŠ¢äžžž~ª··×8LÝXjb5pÚÏíÚµËý§ú§_ŠD"”0þésXL¤ Z§ÄäbQÂÄØ"Ξ„,É×yáõ»ÑÜEc«œ]F1/"Ÿ•­i™Áp  ©Ñl¨Œ¢9•N¯ Á° ùBãË œ–N‚pºF­¢t\z5áÞ9ÌN.Ãéàñ9APk±PD:†ÓéPÓÕ(]<·êøÅ/~ñ,JŽ øee]0i¿¶¬¤ýô¡‡úô®]»ÞE/ ’XHáù§ÏlzÉÎk ÊÃôä2z_›B± "vÃëu£±9‚X[6§„b±ˆ|š©N¡ð2›O ¦º©k¨Š¼UBˆP‚bAFKwn·3S ²¬"¨–B ÿQýÚt?…™Tc ˜Y‚ÍÁÃt‚A êr¹Àñ¼þ}:´  „"Ÿsüð‡?ü€¼ð–îªÙ ” À…j4µò“Ÿü§h4ZW+øpð×ç±_]ÓhºvB£N@–ægVÑ{fÙLÁ°õ±0šÚ‚œDID&)êçX‹ 3•¹0²Ñ‡ÈgDÄ:p8mH¥’Š ÔÔJ>€f†´kÒ®ÁÈ…\éT›ê”Ð8±—Ë ^àAUç’þY–ÝŒ±?>k3`%¨(5h™ <òÈ#¹gÏž[8Ž«YûW—3xö‰3ºÆj2p`õ8,Î¥Ðnéd¾€nŸцšÛCpxdH’ˆÔJ²È KLeSeYŠ‘¨^>3øúìv:ŠÅ"¦†W­§š €Ö*EÉ1µ` j¼/ÃßEW´Áëw`fz„§<Ï›|®n·‹O&Sþ_ýêWOОVß,º×V¥Ë׸®³×ëåÚÚÚ>`³Ù.(ð?zdL†ÞøZfø¹ü¥1™ ŒôÍãéGÎàÈs}XšOÃf·aÓ¶v\µ;ö\C¬ÓŽW™DÕ Yf`ƒ$ÉE¢(C,J $QÖ«,30YµÅ*{ÌŽ¯‚1†XS‘&‡.<Ô}PRªF†Õ?ëÛͬA ü!7Ú|%éL‚M(ë_P¹¼ò6Æù6þ/OA1f¬ªfÍÚkI0ù?ùÉOÞ×ÞÞ¾P²™Žc2˜,—hYf$VFÅ¢(C*Ê(%ˆ¢ˆbAD± Pv±(¡˜×ªˆ‚ZgÇ—qèÉüöW½˜]c@S[=v_Ñ…×ÄмÉÁ¾Öæi»’S8?ž“e„">Ôµ8!3ÅTȲ Y’Á$LÒÌG)œ¤´œ½¨jîtóA€ [Ã`F†§pöÕI¬,åôp“1¹j¥”  nòù|n ðÍ&AÇTSzúz´ãÆõz½ÔËñÊ¡A‹â:7/ËÞÊ­`Ê?Êñ«KYœúí?>€é¡%0™!ÖÆö}бËޝh‚ o£…œ„•ù,!Dìk¯ÙÀ`JO&“dQñ9˜Ì 3Õ¾%‚ „ÂáÐСhÿPÿ(µajlUõúÕD?cUë¦Í›ê>ýéOßÅDWÝj{TÓ~½>ôÐCïliiÙU;ô ù|Ç ¯MÂX,Ky¬ÑÂÊç=îRÍ& è9:ƒ“ÆÕd›Œl²°r­ÁЦ’C¨Þ »CÍ–9T ‰i»ÚêºT[.3´l Œarl½g¦ÁQÓc Ûl]ê¢u4\¾€ÝŒ—èZyæ™gˆ• °òþõ?[¶lù«P(Tq"…2èÕìÄËÃÈg‹Öš¼FÛˬ((Dó!ª„s*pu-^ sKHŒj7¦ï\šÉB–$xý.„›ík¼{s$@,ö)‚¡ø:vÆN?dÆ040Yâ@ ‡B^ÆôDR1—²E5E„ÑH]gsss¨‚TRnj2÷ßÿeÍÍÍ»k€^w\Š¢ˆc‡†×ÒíðkÕvrA‚b³óˆuúÁ°0½ ¹¸¾Í/cÃ5É"Ãê|à‹8,A­&J-1DóÆeˆÏÌ¡çô(å@¨âWô'*P¾¬ø2+«[·m ýå_þùmPûJмFÌ& ÚIÜÅ_ü©ºººªc£5­×„àô±q¤Sù* b]K™| m/÷ €Æî(–°4YÔ;Ö³ùæï£”Àîà %ȲŒ@ć{-¨ÕY€êû‡†cîŸF¡@ÀS2&F—P,Š´¯i~¹…Cp»½7ÀÚ T,Ôâ€5Nr÷Ýwoojjº¸"ð­WÖ•'_޾4d¡íxÚ^™êמ¯ü/phÜà°0“„T€j§+Ø|³öA 5»Ðqq¯®ƒ¿ÁÆìv[¨µÐ¾V:< <°0¿„óg&Á„r`„ŒA,H\´Þº@¬±¡}ß¾}1®•„¥Aëjÿ5×\óÙúúzËþþRœªi¿"gOMbu%«ƒraÚ®_põóËÇØ?8žbeiËSŠí”ïÔ[ l] ß8oă Þˆ]÷î™,ay)äRé%éYÿNc³®U9R¶rŠ0™a¸ «+EØy˜D -oM0Ü·€öÚSÊ•Ãyí÷¶ïØæyÿûßwDZcÇ>ƒÒxA#¦ÆC X;$ÌÒöö³ŸíŒÅb—˜˜é)3ãºÒUÁd†W^ªè¨U‚ÊTo}~9CB@yŠÆN?3IH9å8 i#à€2®Ààk°Ã[gå•í2“‘^Éau1‹ìŠˆäœY,5¡ÖKÊVHÙöH‹ œ¬,­âì©q@æB•\ˆ¬ ð‘e†‘¡EdRy8œ‚.´V?¢‰†×ç…Ëí¾ €@Á„#3,õ²žÃ@÷¾÷½Ÿkjj*ëﯤõšôŸŸÁR"¥S^mÚ^2µk»µ9ihówpH¯¦±2ST4U×N¢kµÃËÃ_oƒ·^ÐGþ ™TÉDéÕ"Rs¤‚&4ÔøP!L@Ì«åÀ Ôu(‰¤áÁi¬,dÁ p„ÑšOQ"‰a¸/-»¢•ÆŒ¬)M±›nºiÃSO=u¥‡G* Y—þê¯þª¹¾¾þ M«i½qýå­µuM$P›¶7§öôUî' „€£±.?Àæf–!¦Ë5Õæâà ðDm°9K~p._D2‘AfUDz^‚˜Õ¨[ÝTkÚWv˜7Ðho#H'Ó8wj”³£¼ªáÊ}ÊÛ>ЛÀ¦•{ÛÍ¿»yë&Çõ׿ãÓO=õÔí(7f!få”Õ[o½õs---Q`}­×„`x` ³Ikm79jæäL»ƒ¢¾ÕƒúZÛc8q¨s#™Ê¾%ˆ4»asrÈdsHÅEPJÀÛ(Dr%Ï:ñZN N— 6›}737`i¼ý4Þ°Ó >½å–[" WJÊ<|3àL§eíØKÕâþrGÍJÛm6‘&'š:hj«‡ßïÕ¯¾±#€ùѬµY  8±n?†Äô2.uíì>NN’$LOÎdÆÆÆ–)áH}CÔÝÞÙî£_È®HHŒå^×Õü¡Cx¢˜e–L¦W³é#ÁNÔŒ ÎàøáaØ78Þž D@Ó|= 00 phl-™ÂjE {c¬iäСCçPyZ™5a @vïÞíŠÅb7ðœò +¾²œ84\QÛ=~m]4¶†ÐÖÙ›­äÔ$âIŒõÏc|p…\Q÷´ÐM“Û™á6înD¬)ŠÁ@ùU¹ „ú ^0ôõõ'o¸~ÿ½¢(jÚ¾ ‚­=Kgl¨ŸE(±óJ>ŸŸºçž¯žùÚ×þeûÇ?þñ÷ÞxÓþ‹7twl6þ6 o#E:.#='+CÖ)vàRëÀÛA Jy€R=sZ¦ù&&ìK`Ï ºSÉüh¥­­…644ü9€Ÿ©÷¦VÆVa ¾üå/²½½mÃZ[¿Vë5qM,¤0Ô?_÷;]Ú6ÑÒBkG nwi–˜•¥ Fúæ0Ú7‡ÔJ®¬ó¥ÒÍeR,ϧ¨s#ÔèÄl2S° î ’$âàΈ¢øk(4ŸVÀ6oÚèúìç>{ûç>û¹¯¢ ”idßÿïÿy{{ÇÆZ´^[_YÌ PÈàm7u ¥½uu!ÝC-äE õÎb°'Ž™‰%ÅÙP5½ü’«Ü—amvt›÷6!ÚPWpùNŸ žˆ’,áØÑã}©Tê,€Jà[Í«ÃÒè ;RD(f#~èСomÛ±eO0°ž]ÄÀ¹8:6EmÂës ·dç© ¤uÜ ŠMžL ïµi8^œ ”çAµ9d@¡J?a¥ 2¨\ 'FVÀ®k^û¦/K: ˆ5Ö·Ëý!ÿ† f , ðûý\cCãlveëh½,KȤ3Èåóàˆ€÷þÑ•%^”12Gÿ¹Œ ΫƒJŽ î:›½gÃm”o,äD$f’ˆ4úŒ9_Í ÚáÀ0Ø?´úå/ù!óP칌ÊÀÊ~¦´d(ï&—äŸ{î¹Sï»å[Úšš7pèu }'ç1ܳ€ŽÍu¨o ÀtÁ\u@~($›_€±á9‚v»ê.VH IDATÀs<¡Ê…P"«mMÈÿ30¢7?rY £+hi¯æ –ÚK”ŠCõ---Á‰‰‰ ,’Be ðÀü^8î.i:Öh}*F.—ƒÀ ƒ«S·+7¹€Þ3Sì›E1/U±ëÕ>a]Á˜]B¤Ñ‡ú–0V¦‹ð×; Ë2Ž¿zb0‘Hœb÷Íà×Ê•H)¹º’õ7Ÿ‚EߍÈ#<· 6·(J€ßåt:)Ëæ°²²Š|>¿Ï@ ·Û J)f&—pô¥!<õËÓ8ut󳫤ò0©<\Zû,e(e8Ö¼/—* us.·Y1‡GÀÈðhê¯ÿ¯¿þF2™|JXg´ûÕæÑ1·šU!ät:=rÑ®‹Þ® ñRž »ÂB•~|‘`vj #qȲ ŽR8Ýv}¯cn: ‡Ý ŽÚA©e6 RrþÌQ€A8`ˆVW ØvQ¸¦I©!p:]dlt<öÔ“Oý;çÖ(üå/½ôRßÃ?üš(ŠžH¤.F)< ƒðx‘H¬p‡P£aü%”éhx‚ 6Áž·ƒRxÁ®<å ®äù[8xš³]¦ýÆÜ€ºO’†û–kƨ(khp}ðƒÜŒò‘àeÏ0…'N‘åò›j „܈5ª¡öŸ+]%»ó0Õîëƒ(Õ¥*Šp(•Sea: Y–ÐÜÒúøÇ?Þnúáõ»Z1›w{<ÉÕ•4. ŸWÂ\E HŽ ðvœ<˜LÕÌŸæí—@J¿¾ ×ß»hq‰­~I{gwÝu×ý#ÊÍþš©ÇóßøÆ7þc||íqpÅÖMoòU#¶aÃÆº7áñ `Œ£qÇ!(Œ¯÷YZ™€Äb1Ï5×\ó¶Z_ÓÊó ñ$–éu³~TcRºXí‚[¶xÄöÎVÛèð<^|¡S‹8qléT‘:ü~éèn±·l¬ã'çGR‰ù¥¼ n»+ð6Î DŸþùó`[¬m£X+,eõ›ßü·¿mj‰ÝÄqO®"›-"Ÿá pp{H­‘\.VïÊbúÊ~€ÓÃcóö®x{ö^Þ€úF\.F†ÆñäcOãÈ¡ãp¹=èÞÔÖöfü>8œNØívØl8Ž/uº©e1±ˆ¼tìðáÃBéâÖÓã•&®Íó›ß|âOþäO>±sçΚߠ¸q{#†úâ¥fµZê×rA2»üý+oòÀ¡—ôí¢(áÄñœ:1Š­;špé儜ôªë.÷fsYvúøkÉž¤ÜÚÕèݹkÇø%*Ï¡k¬VWi€666:}~ÿ»AÀÊB©Ué$ÃäÄ ÂÑ ê[]˜ËTöª„z‚C[§ý¨ot  ‡é‰üæùƒXXXD8Ð†É š[ÑÑՇݛ]É/<Žç@)·ü|>þ¾Áåûî»ï{–a‘ †qƒº.f³ÙÅ‘‘‘Á;wÖü®ŸŽ u°9ó¥,Õ…¤}[7ˆ ˜œXÄØÈ¼âª«£e ‰É8{zçÎL¡{s—^ÞH—ì»b·P( ç|oRøúk¯½¶AIÛ\Ì`¾+î¾ûÆÂ(¥˜P"dÆ((Ç!›ÁSu18ž@*° ´nÈ81Ê^ttùÐØæV³2Éåü-†‡GôÇ0;m“Z0â ð\zå~})NÍ.š×J>—Çùs½½¹\î,”N²2¿Èì–Ñ£Ãá ï|ç;ßi³ÙjŠ©)%X]ÊbÞbÈòHÀà$ªk¯féßûÀÛÜ<Ï“§Ÿx ‹‹iÅLhÈÕá%ÃâBgNNbv6 Ÿß_À‰h}Ôkˆ®¾úªßÿþ´ÏÏÏŸÐfѬ²ís„¦¦&ï‡>üG_÷üÞÔ²ˆñ¾´â¤É2$IBr%·ŸÂëw!›±²XXè=ÂPßè¶=a\v] í]^øvÈE/9†gžü5'19ÊÏø‘IÙÁSxÞ Ap }C—\Þ »Ý® €òt2µ?_À‰£¯&¿üÏwÿS¡P8g½cÌì2ÃçüÃ?|àŸøDbïÞ½5Ϻqk çOO®ÙN,Ö´O27x˜Ãá s³+ìŸ3¢dÙ+™ †’@Œ ÏclhM­~칤 M­4·47Çc·ßóÕ{n¼ëoï:øƒïÿàKßûÞ÷æPŠÿ÷i¼(]8î»ï¾·Gë#ìt:.EaŽ£˜èOªÎœr(E>G0;Gsk ±v7Æ’k=¡ˆÍÊÃn³r<(áÊ0ŠK¯l…`³UÔvsE CÃ#ƒÉdò5”À/cÍ0~›vT,W†††z/DšÚ‚ðxÈdò{­/z5µý½w¼Ã ‡uÛ¯¦WA¦%´(˜vÙLùÖ©‰LMžA4êÁî}-hí ¢¾¡®±.þÐ]Ÿ½ëúÛo¿ýÅ_þò—ÿøÕ¯~µâ´ªÿò/ÿ²³«»óOívûE>¿·¶d2 ‡ÓÔŠˆÄl®äÉ«WÈ™´YbEm°»8dR"Ü>Ín4wxàöò`2Ï žÀ©S§‘Iç‘N Xˆó „Ï pØåYN™+€N͇ÄZ$–1===2??Ê)+|ËòÂVf ðØcïëë›»üòËkýñMÛc8ùŠâƒ)vP›èXÍ|i÷Ádä ©ÜM×_é€Ã/ êùt]ËÕY>3ðG™ï^ΚŒ,'²8øëø^±cË®(:ºƒpyœÁ&GÓMøàû¯ºþúw$DIÎúüž¦`0àãx%__,Šˆ¦12°˜aKCÙ”ˆù©œãË¥~y Â8@äŸ]@÷¦D›A°!“ÊâüÙ^ÌÌÄ‘ËP õ%@ˆB÷€çìà8¡Dóê´qJt ´—¬Â‰:ÑÚ^û»8³ýÇ¿ Žò^Ò2ŒyÃC•$ûûûÏ\vÙeµJ`4æG(ìÆò’©OÉ"èòÇ81 8VW²8{zÂpÚ° ã)ÀLÍ#(G2ãº_É d,-pè7«8úÁ¶Ý!¸ý‚@½ ÍQ¯ J£Ë ³9ÌŽgŸL#_(€·å°}_3(¥ë_Õ'fÒ;Í`„€r<2)K‰$æçæ091tZDïksÊÌ_Að‚rÊ“@§Øy€¡Ô!@eYMÉ2ÃÞËc5µ; 0pba½ýS¯@#a5¾"% ûíoû»7ÜpÃu±X¬æÔðÆm1{i½-]¤ºÌ2…ý×ïuÀˇ Kê`•2‘d†P°¤å¥«ÖÂ.m^=!Ë Å""Q;¢1‚'¢1ìvUe¬$ò˜™Ì">žE±(*Þ½XD.—Æ.;œ.;òY³£™rðµ ¥ Q¨›˜ZåΡïìÒ©(áÀqne,'€ãlà¨ö, Ó|™A›£Ú˜I †ØÐ]=£¥ÅA$QÄØèXþÑGù í/˜ð¬Ê–fàÈ‘#=ýýý³±X¬­ê•ÊÆíMʃ¢•.€',¢õužt*“ÇÇP+œ88ø"€$ª¿kx ˜…@‹S===G¯¾úê¶Z{ýAEãf“–BP(æÅëÞ±ËG_‚$ʧ¯$Ì@þÌ ›²,ƒ1 ’$!_ÈÃá hëö" !óÃíq¨ äR"â“iÌNd‘Z-ê6\ÖÆâ3‰Éúd];ÝðÜ(ä%L¨Ù=Ùç7ú„‚r<8Ù' TV‡ÇQt^X¢zôL,”)þѤ˜ú |>6m £¼ÕG"ª¯¨ Q’pöµsÅßüæÀÃPžŒª¦ý0 €Q`:!÷¯ÿú¯ß½ñÆßÕÞÞ¾îkàSz¶:·D±Oj×]Vb¾¥µÙËqü•”Â>õv+»˜Ò~¥¡DQCÍnDÂˆÆ¼ðøœ èŠyÓSiÄ'2XY,@䤥a™ª…ÐgÞ”e b±ðEDê †^K–Þ!`~)ÀƒrJJ—W½+,Vêï¯ |™)¶¿4üÛ¼úÝ%F ù^;snþôéÓ h¿ùyH#³¯ 5˜¬$¦Ø××7>000ÝÞÞ^õmÓ²,C’%È’„öî0޽0\Ž?D±(_uÍVŽRSÇæT„Á®Nóø“ksbï•-”9ff²˜Ocq®YÖ€.¥gyy@‰J$&A%äó9lÜéEC,Id˜JZ‚o^% jRURù+«ÎœÁ©3:‘æžB&+æÈíâ±uG¤ðÖpþ\¯xè¥CBy¿p%í/có0³„hë2€ôÉ“'ˆbåѨ’,A’DH’Qa³Ô7¯}Œ‰wç³];mÅ¢„cG†õ¼y™ èäo¼@¦ƒ&c¸gK %ÄÈâÅ'âè9¶„…™œòfY¡v¥]™b•ÉêÌÝ2J)]YFA,¼ˆHƒòôíÄ@ Å‚ Ù‚ôÖR³É„j§~¹ÀèµøŒ1콬‚ÀU4³v¼ÅêJ¯žxuñÈ‘#OB™ø¢Ú«dõÏVÝê@ ÷õ¯ý‡ƒƒƒÉ5'0f^R) ¢$¡µ«äÁ²,±‹¯Ü Àñ—‡‘NçUÞø«ZFÚXRítS@Æf&!K2\^’:«¤‚k¬ 0̱[šoWE‹ŠçßÞåACS`£jÚW6W¦Å°²dVª ÉÈøÜní­¯ xB($IÂèð˜ôꉓO‡2éEÕ·‰kŸÍ£‚Í¿@œ(_ÖÁV€W´_ˆ†7¨áRÔžÍnß¹Å&Š2üú<²™2éÒé<²é<2ÙrÙ ù¢Zµ÷úHÊ‹Tê$„‚8LO®BEx‚2œlldY×rp@b%íUí/‹Šhj ‚ã8L %‘ÏI¥—ZX)£–èÜàST}Ògí³¬„7„ðÅžKbÞБf=ÂJ«…\/üöÅ•üåÚ_­*xXHF%§A~ñÅŸTÆ]*%Jå´/éUÂÑfuRưóÒvJÁ‰W†‘Næ 7 =²Ì «/yEåÍ!Å‚„bAÖ—babhS ȲŒú—AÙˆ¾•@b2dIR € [ü¨kðƒRŠÕ%QÖ@jàë@cm’Hf…ǘK`@i¸;%p8xìÙ«:´ÎX%QBoO/zÀ(”ù Ìôo©ýF¨TÌÂÿú׿þó¾¾¾%³½×@uú7°@›"—ÊîÙ»Ý!Ë /ìSÁG™˜»-÷SŽrxe’ÅùÙÈ’Œ†§ ´ð’0hÚ&ÉLy&_cQ„ËÃCVý„—…pÙ ˆ69-7³-7Q¾ª± ¾8‹'zŸ ÇSìÚS‡“¯¼–ÃáÀñ㯮<ñÄ£|ÀG5ï_/Va qÝhEF6oÙT+•úeI_/mSö‡ëíà‚îÝÍ„RŠ“ÇG±²¨ 3z¶Ð=ZLÛµ¬ÇQ0ÆCmˆO¥Íæáñ¸àÚ°˜ÈœEe¾_ÍY+…oåô}øÀÆGæÑÜĦ-­pûxì»6ŠÕ¥<ú_[ÆøˆUD“ÖWígJ‘@­´4Ç\¼·k³¥´·ʾ|ä(ëïë?e.¤¬èVÀëëÚ aZ!†jþ¬o…BÂW\~ÇQ¢…|%(…’\Ú¾˜XÎÝð®+„P<òÃWÍÊž 2küÚuã6ªŸ¬.§áó†½E`n:£­yê¥^<¨ÙCƒ©`ÊuÏͦÑ~s³ (r°;yø.4wxÑÒé…,ÊXZÌ—E-K`—¼~‰ô¡Þ²¬«&!ZSñ¡4ÙqQ=º7‡ôÄ‘î•Ú§Ü$äsüú×Ï¥øö_0e6“Ja¬Ñþýû÷3nÿþýVo ¯&ìôéÓ ï~÷»o‰DÂnl¹¶¼ÆªP¸ÚÛÛûC ¬“ö5kWW×ÓÁæì ƒ2Pdu|||pÓæuò°ÕPÌÀ +++ù}{.wÀ‹¿é+5‚Ö k’µíg” Ã&Ø0?]Àêr ¡ˆsSh =…&P„1%eËsvÀFÁqxÎA*`nº€ÉñÔÇfÑÒ1‚M[ÛŽøqÑel¹(„s§pöÔÄ¢liÂÑR ¢Ì?l`/J•Úº#ŸÏn™ð)µ…òE„©d¿~ö¹Ìc=v?”9“a­þaÿþý PßÚÕÕU‰ÌŸÛsW]uå¼ÀQ£½×W— Qlinûfqä…KM73!0¼Îz¿¢IJCeÒyØÝEÔEƒ ˜O—ü”Lb: aPMªŽ±ãÁQ'€ã¤S¦Æ’˜š˜ÇÜÜ ìvv‡Ž®0¶í Ãf§X˜Ë¡PP&„€î¬–fA#”‚ã”%ÕžäÔßã(n|×8]åÚO«D+Ë«ìÉ'Ÿ:uöìÙï¯#–&@{sh¥WÇ×­„===+ï~÷»ÿ  yËì½®ùJr'Îvmßíàyÿù³Êãcê¤ÎÆ×º—Ѿxí…Ôd6´‡  8H¼CDck¾€ýç–•Ç­40_ÎÓL„D;Q¥÷Žãp”ÇñÈfâÓ9ŒDZ´8B1׉¦V?v^\·×†å…ŠEVzúÄ3Ç• ƒ>%èÞÂŽõ¨¬åf@,J¸÷ß¾UøÉòÿ‰¢Ø‹ò)qjÖ~`m c`Ž˜*mÉ©ÉÉóÝ›6ÄJ&@¡~cf‰ìveÁ»þ`7^:؇óg¦”þÏ5T§J›îñײŸž°8›Åüì"bÍQÄZܘJ–è°d„’@h½ª“ 4P „pê xÞ\&žÓy õ µs ­ílÝÞ»"ØyQú{—pòxˉ¼f¯ô—Lè‚OÕk'ÀÞKËœÚrÊ/§~&33³H®®ö˜†zWª–B j0@ùr¶’Z]¼æmo{7/ð¼fïµ€l6Wܾe§Mn›·5bÛ®fˆ¢„…¹À`‘@™&¬·_i †bAÒhhŠ€ç8Œ% tÏJa Ú$Õ|­(Ïô+9~Ec9pê¨Qä°0WÄäÈ2¦§Ç‘J%asðhk`çEQD¢n¬&‹Èg¥Òœ§™JÑÞÀE»ë×h¹Y󵌠$IøïÿGá‡?|ø‹…Bá,JãýÖKý2 \ûÊ `<¹>𵉉Éx÷ÆÎVÍÞ‹XD—Ë%è_¨:H ûß³W\Ûc‡‡pöäÄ‚dÒôÊŒ`ÜO0BÀs/mîÞÆÛívÞ’MfŒA°qhíŒ`ûî&pÅâ|²:Å\­ÂòÈ¥%Ø=ƒ~¤SE,Îç+8€#Ö«F ¥ÛP€ÒüeÐå8@¶aqQÆÔx ñ¹ ö¢½£¯€5 ¥Å‡\NB2Y¥MÍ>ìÞÓ=}ý¡ýs9#ˆE?ýñO‹?ûÙÏþ)“ÉœBiN¤šf@3kÿ¨b*v;BAIDATmc££c37ÜpýûN»Cɦóù ]úÄzNÍ¥3h ÏÀñM­lßÝ›b)‘…$Êk^:Q)Q¤yÕ €,2ˆ$‰Æ–:؆z—k·VFЄFu )úÕÀ‰€åÃ|\Äà@&&Fú{°e[=Ú;D;v5(¡1ov¡ì_L,âW¿üÕø±cÇî…2ÞO´ßŠt|Íe½±þeæÐôÅ2€âùóç‡ggç&ýA_·v $IòÆ®M¶ò/*%e`HÐh—(v]Ò‚m{bè=ÇùWgIôØ_£Bë(A f) …"êÝðúíH­æ!KkÁ­ŒçAùa` jLO@Ô§{DI@|¦ˆøtósÏ£µ=Œ­[6b˶-¸öíú5QÖÜ£jîA!_ÄÃÿ¨øÒK‡¾Ò`ÏjÓßZa¸¦¬çÓgm©U @ztxäÐÆÍº%Q’'ƦV\N7Ù¹u>s”ºIóõT-348(%ز«ÝÛë0Ü3žSq¤Vò€7ØIFÀ8ùUÆG¦°eûFttûpîT †A!ë‚k\7°Ã)gåÚ¨îé7D½èÚädžn/ìN‚\.¾ž~œ>s»víDç†N¸]®5v¾ÜÏQî9‘H`b|2>==}¥ÁžÕ4¿ x+úL&°4æ²Æ ôööGë¢[þ÷ß}á©ù¹…ó·Ýö‘}.—‹S›ªœþ™¡ñ ¬PÆ êy„ˆ ]ÛÂðH¯æQÈi3’så9Yf(ÈKhnÁí±c¸ú(c5b¨î«3BIx•&÷úíØ¹'ŠëojÇåW7£µ-§Û ØlˆÖGÑÐPñ‘1:t‡·6»D{­­©RJñèÏ!>öŸýÿ‹‹‹‡Qš ½fí·¢ 6`£ €âøøøð§îüô <ðÀ·Âá°­ìh]·¡Úè0ìgÆý@Š 4wøÑÔîÃÌÄ*N/`9‘³dFlódÒi„"A„Â,%r D$JXÇÔŽ˜ g³ùpº8toaÓÖ›½zô¢}Oy0Žãåpرý¢mؼ}3úqäÈìܹ{ö\ »Ý^öð'!ãc8uòÔÂàààTìyÁÚT€ýû÷³gžyÆŠþÍŸ5AȾí¶Û¼^o;cŠ'_Òn´›´Ë´Æý¬|¿º½¾Ùƒh£ 3 [ÄÒœöN!Å,(/_æPÌz028À^?Ú»üX])’ÚýI$I!€$Hôñ{Ðd°Ý«  ÿü’ÙœŠÌŒLÖíñ î³¿-ý·­ýOìövþAÜÖD€A.*„ @€|–e+.]ºtæäÏNޗ—j6sšF÷ýöÓÑ1U ôé~>M3˜÷m¾T|w ãð‘CxúăîÎ90 oOCѶLØìi¾¥}¶(ùh¸ñ Ñ_Äõÿ5„×+BU,/­h>ŸÌÎ­ŽŒŒ 466¶û¼ìIúÖÈø£yÐ6^ò8„‰ R…`ô`#´)2Øì¹ðñ…Ó§ß}÷`eU…-3+“¦6q‰ ú<às©²Œ¾!>r¼‚ù'k°¤ƒçe* «(Ý&0ÿǧ+˜A¯`| iÈ{ô}MUàq{†Åãáí~wät:½=½}}}÷AnܘÙ¾í)—eD'Ûh—OùÏ‹„=EO ï'âô¡‚ñ¹Ê«ªªŽ~òÉÅwªöUåÛmi†ÉŸVU®5¼ å;ËI ¨E·h2Ý#¨ª·Û M¦§fÐq»Cv8«££cÝ·AHŸDàôr/},ëŽeñA_öy¬Ø€(b„„Ð6Q1p BȰ£¼¼üÈï®\>]YUQb/´gÀ/Õ| UQÑß7ˆ½qOÞKžuIÅü¼-Í­Êôÿ¦Ýóóó---Ͳ,ƒîñhëx~Ò¡¯o$ElŽL B(¶X,ÕW>½röÀê²’Ò¢œhe4Mƒ$IXv®aמ×|WåÂK>½dY†,Ip»×Ñ}¯[éî¾/.8f›››ÿãt:A,ý;Ò]ˆM:bŒ!ŽÖ’$Q›,*D[¥§§W}zõ÷gkܵ½l[.å`Ý»wz”Sµ'9A"Öþª¢BEH²‚þGýjçNqfæ;GWWWëäädˆ¥Oƒdð”t£ëóˆ1†8ÚÐ~Rˆ§Hº(^€¨G ‹JE‚ T\¾|ù½cÇî-ÛYšÇ |Ðg%YýçWÿžýÕGgmÉò“# Ь`bbR»ÝÞ!ŽŽ9ô> ü”ïáD V§|4²—ìM±z=6M ö„@Ç"o@=B&È2óÞ‹/žyë'oî/۹Úb8wüæãßþù‹/¿øcMÍÀ@UÌ?}ªuÜîûú—†¶···ƒXúH¯/Ûë0 G„q?’M> dll_imports = new Dictionary> (); private static List ignore_dlls = new List (); private static List config_dlls = null; public static int Main (string [] args) { LoadConfigDlls (args[0]); foreach (string file in args) { LoadDllImports (file); } return VerifyDllImports (args[0]) ? 0 : 1; } private static bool VerifyDllImports (string configFile) { int total_unmapped_count = 0; foreach (KeyValuePair> dll_import in dll_imports) { int file_unmapped_count = 0; foreach (DllImportRef dll_import_ref in dll_import.Value) { if (config_dlls != null && config_dlls.Contains (dll_import_ref.Name)) { continue; } if (file_unmapped_count++ == 0) { Console.Error.WriteLine ("Unmapped DLLs in file: {0}", dll_import.Key); } Console.Error.WriteLine (" + {0} : {1},{2}", dll_import_ref.Name, dll_import_ref.Line, dll_import_ref.Column); } total_unmapped_count += file_unmapped_count; } if (total_unmapped_count > 0) { Console.Error.WriteLine (); Console.Error.WriteLine (" If any DllImport above is explicitly allowed to be unmapped,"); Console.Error.WriteLine (" add an 'willfully unmapped' comment to the inside of the attribute:"); Console.Error.WriteLine (); Console.Error.WriteLine (" [DllImport (\"libX11.so.6\") /* willfully unmapped */]"); Console.Error.WriteLine (); } if (total_unmapped_count > 0 && config_dlls == null) { Console.Error.WriteLine ("No config file for DLL mapping was found ({0})", configFile); } return total_unmapped_count == 0; } private static void LoadDllImports (string csFile) { if (csFile.StartsWith ("-i")) { ignore_dlls.Add (csFile.Substring (2)); return; } if (Path.GetExtension (csFile) == ".cs" && File.Exists (csFile)) { List dll_import_refs = null; foreach (DllImportRef dll_import in ParseFileForDllImports (csFile)) { if (ignore_dlls.Contains (dll_import.Name)) { continue; } if (dll_import_refs == null) { dll_import_refs = new List (); } dll_import_refs.Add (dll_import); } if (dll_import_refs != null) { dll_imports.Add (csFile, dll_import_refs); } } } private static void LoadConfigDlls (string configFile) { try { XmlTextReader config = new XmlTextReader (configFile); config_dlls = new List (); while (config.Read ()) { if (config.NodeType == XmlNodeType.Element && config.Name == "dllmap") { string dll = config.GetAttribute ("dll"); if (!config_dlls.Contains (dll)) { config_dlls.Add (dll); } } } } catch { } } #region DllImport parser private static StreamReader reader; private static int reader_line; private static int reader_col; private static IEnumerable ParseFileForDllImports (string file) { reader_line = 1; reader_col = 1; using (reader = new StreamReader (file)) { char c; bool in_paren = false; bool in_attr = false; bool in_dll_attr = false; bool in_string = false; bool in_comment = false; int dll_line = 1, dll_col = 1; string dll_string = null; string dll_comment = null; while ((c = (char)reader.Peek ()) != Char.MaxValue) { switch (c) { case ' ': case '\t': Read (); break; case '[': in_attr = true; dll_string = null; dll_comment = null; dll_line = reader_line; dll_col = reader_col; Read (); break; case '(': Read (); in_paren = true; break; case ')': Read (); in_paren = false; break; case '"': Read (); if (dll_string == null && in_dll_attr && in_paren && !in_string) { in_string = true; } break; case '/': Read (); if ((char)reader.Peek () == '*') { Read (); if (in_dll_attr && !in_comment) { in_comment = true; } } break; case ']': if (in_dll_attr && dll_string != null && dll_comment != "willfully unmapped") { yield return new DllImportRef (dll_string, dll_line, dll_col); } in_attr = false; in_dll_attr = false; Read (); break; default: if (!in_dll_attr && in_attr && ReadDllAttribute ()) { in_dll_attr = true; } else if (in_dll_attr && in_string) { dll_string = ReadDllString (); in_string = false; } else if (in_dll_attr && in_comment) { dll_comment = ReadDllComment (); in_comment = false; } else { Read (); } break; } } } } private static bool ReadDllAttribute () { return Read () == 'D' && Read () == 'l' && Read () == 'l' && Read () == 'I' && Read () == 'm' && Read () == 'p' && Read () == 'o' && Read () == 'r' && Read () == 't'; } private static string ReadDllString () { StringBuilder builder = new StringBuilder (32); while (true) { char c = Read (); if (Char.IsLetterOrDigit (c) || c == '.' || c == '-' || c == '_') { builder.Append (c); } else { break; } } return builder.ToString (); } private static string ReadDllComment () { StringBuilder builder = new StringBuilder (); char lc = Char.MaxValue; while (true) { char c = Read (); if (c == Char.MaxValue || (c == '/' && lc == '*')) { break; } else if (lc != Char.MaxValue) { builder.Append (lc); } lc = c; } return builder.ToString ().Trim (); } private static char Read () { char c = (char)reader.Read (); if (c == '\n') { reader_line++; reader_col = 1; } else { reader_col++; } return c; } #endregion } f-spot-0.8.2/build/m4/0000777000175000017500000000000011503407371014665 5ustar00rubenruben00000000000000f-spot-0.8.2/build/m4/shamrock/0000777000175000017500000000000011503407371016474 5ustar00rubenruben00000000000000f-spot-0.8.2/build/m4/shamrock/gnome-doc.m40000644000175000017500000000136211417267574020621 0ustar00rubenruben00000000000000AC_DEFUN([SHAMROCK_CHECK_GNOME_DOC_UTILS], [ AC_ARG_ENABLE([user-help], AC_HELP_STRING([--enable-user-help], [Enable building the user-help [[default=auto]]]),, enable_user_help=auto) if test "x$enable_user_help" = "xauto"; then PKG_CHECK_MODULES(GNOME_DOC_UTILS, gnome-doc-utils, enable_user_help=yes, enable_user_help=no) elif test "x$enable_user_help" = "xyes"; then PKG_CHECK_MODULES(GNOME_DOC_UTILS, gnome-doc-utils) fi if test "x$enable_user_help" = "xyes"; then GNOME_DOC_INIT([$1], enable_user_help=yes, enable_user_help=no) else AM_CONDITIONAL(ENABLE_SK, false) fi AM_CONDITIONAL(HAVE_GNOME_DOC_UTILS, test "x$enable_user_help" = "xyes") ]) f-spot-0.8.2/build/m4/shamrock/mono.m40000644000175000017500000000371611417267574017726 0ustar00rubenruben00000000000000AC_DEFUN([SHAMROCK_FIND_MONO_1_0_COMPILER], [ SHAMROCK_FIND_PROGRAM_OR_BAIL(MCS, mcs) ]) AC_DEFUN([SHAMROCK_FIND_MONO_2_0_COMPILER], [ SHAMROCK_FIND_PROGRAM_OR_BAIL(MCS, gmcs) ]) AC_DEFUN([SHAMROCK_FIND_MONO_4_0_COMPILER], [ SHAMROCK_FIND_PROGRAM_OR_BAIL(MCS, dmcs) ]) AC_DEFUN([SHAMROCK_FIND_MONO_RUNTIME], [ SHAMROCK_FIND_PROGRAM_OR_BAIL(MONO, mono) ]) AC_DEFUN([_SHAMROCK_CHECK_MONO_MODULE], [ PKG_CHECK_MODULES(MONO_MODULE, $1 >= $2) ]) AC_DEFUN([SHAMROCK_CHECK_MONO_MODULE], [ _SHAMROCK_CHECK_MONO_MODULE(mono, $1) ]) AC_DEFUN([SHAMROCK_CHECK_MONO2_MODULE], [ _SHAMROCK_CHECK_MONO_MODULE(mono-2, $1) ]) AC_DEFUN([_SHAMROCK_CHECK_MONO_MODULE_NOBAIL], [ PKG_CHECK_MODULES(MONO_MODULE, $2 >= $1, HAVE_MONO_MODULE=yes, HAVE_MONO_MODULE=no) AC_SUBST(HAVE_MONO_MODULE) ]) AC_DEFUN([SHAMROCK_CHECK_MONO_MODULE_NOBAIL], [ _SHAMROCK_CHECK_MONO_MODULE_NOBAIL(mono, $1) ]) AC_DEFUN([SHAMROCK_CHECK_MONO2_MODULE_NOBAIL], [ _SHAMROCK_CHECK_MONO_MODULE_NOBAIL(mono-2, $1) ]) AC_DEFUN([_SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES], [ for asm in $(echo "$*" | cut -d, -f3- | sed 's/\,/ /g') do AC_MSG_CHECKING([for Mono $2 GAC for $asm.dll]) if test \ -e "$($PKG_CONFIG --variable=libdir $1)/mono/$2/$asm.dll" -o \ -e "$($PKG_CONFIG --variable=prefix $1)/lib/mono/$2/$asm.dll"; \ then \ AC_MSG_RESULT([found]) else AC_MSG_RESULT([not found]) AC_MSG_ERROR([missing required Mono $2 assembly: $asm.dll]) fi done ]) AC_DEFUN([SHAMROCK_CHECK_MONO_1_0_GAC_ASSEMBLIES], [ _SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES(mono, 1.0, $*) ]) AC_DEFUN([SHAMROCK_CHECK_MONO_2_0_GAC_ASSEMBLIES], [ _SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES(mono, 2.0, $*) ]) AC_DEFUN([SHAMROCK_CHECK_MONO2_2_0_GAC_ASSEMBLIES], [ _SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES(mono-2, 2.0, $*) ]) AC_DEFUN([SHAMROCK_CHECK_MONO_4_0_GAC_ASSEMBLIES], [ _SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES(mono, 4.0, $*) ]) AC_DEFUN([SHAMROCK_CHECK_MONO2_4_0_GAC_ASSEMBLIES], [ _SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES(mono-2, 4.0, $*) ]) f-spot-0.8.2/build/m4/shamrock/expansions.m40000644000175000017500000000146611417267574021145 0ustar00rubenruben00000000000000AC_DEFUN([SHAMROCK_EXPAND_LIBDIR], [ expanded_libdir=`( case $prefix in NONE) prefix=$ac_default_prefix ;; *) ;; esac case $exec_prefix in NONE) exec_prefix=$prefix ;; *) ;; esac eval echo $libdir )` AC_SUBST(expanded_libdir) ]) AC_DEFUN([SHAMROCK_EXPAND_BINDIR], [ expanded_bindir=`( case $prefix in NONE) prefix=$ac_default_prefix ;; *) ;; esac case $exec_prefix in NONE) exec_prefix=$prefix ;; *) ;; esac eval echo $bindir )` AC_SUBST(expanded_bindir) ]) AC_DEFUN([SHAMROCK_EXPAND_DATADIR], [ case $prefix in NONE) prefix=$ac_default_prefix ;; *) ;; esac case $exec_prefix in NONE) exec_prefix=$prefix ;; *) ;; esac expanded_datadir=`(eval echo $datadir)` expanded_datadir=`(eval echo $expanded_datadir)` AC_SUBST(expanded_datadir) ]) f-spot-0.8.2/build/m4/shamrock/util.m40000644000175000017500000000024311417267574017723 0ustar00rubenruben00000000000000AC_DEFUN([SHAMROCK_CONCAT], [ $1="$$1 $$2" ]) AC_DEFUN([SHAMROCK_CONCAT_MODULE], [ SHAMROCK_CONCAT($1_CFLAGS, $2_CFLAGS) SHAMROCK_CONCAT($1_LIBS, $2_LIBS) ]) f-spot-0.8.2/build/m4/shamrock/programs.m40000644000175000017500000000036111417267574020601 0ustar00rubenruben00000000000000AC_DEFUN([SHAMROCK_FIND_PROGRAM], [ AC_PATH_PROG($1, $2, $3) AC_SUBST($1) ]) AC_DEFUN([SHAMROCK_FIND_PROGRAM_OR_BAIL], [ SHAMROCK_FIND_PROGRAM($1, $2, no) if test "x$$1" = "xno"; then AC_MSG_ERROR([You need to install '$2']) fi ]) f-spot-0.8.2/build/m4/shamrock/monodoc.m40000644000175000017500000000146511417267574020413 0ustar00rubenruben00000000000000AC_DEFUN([SHAMROCK_CHECK_MONODOC], [ AC_ARG_ENABLE(docs, AC_HELP_STRING([--disable-docs], [Do not build documentation]), , enable_docs=yes) if test "x$enable_docs" = "xyes"; then AC_PATH_PROG(MONODOCER, monodocer, no) if test "x$MONODOCER" = "xno"; then AC_MSG_ERROR([You need to install monodoc, or pass --disable-docs to configure to skip documentation installation]) fi AC_PATH_PROG(MDASSEMBLER, mdassembler, no) if test "x$MDASSEMBLER" = "xno"; then AC_MSG_ERROR([You need to install mdassembler, or pass --disable-docs to configure to skip documentation installation]) fi DOCDIR=`$PKG_CONFIG monodoc --variable=sourcesdir` AC_SUBST(DOCDIR) AM_CONDITIONAL(BUILD_DOCS, true) else AC_MSG_NOTICE([not building ${PACKAGE} API documentation]) AM_CONDITIONAL(BUILD_DOCS, false) fi ]) f-spot-0.8.2/build/m4/shamrock/i18n.m40000644000175000017500000000053611417267574017532 0ustar00rubenruben00000000000000AC_DEFUN([SHAMROCK_CONFIGURE_I18N], [ ALL_LINGUAS=`grep -v '^#' $srcdir/po/LINGUAS | $SED ':a;N;$!ba;s/\n/ /g; s/[ ]+/ /g' | xargs` GETTEXT_PACKAGE=$1 AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Gettext Package]) AM_GLIB_GNU_GETTEXT AC_SUBST([CONFIG_STATUS_DEPENDENCIES],['$(top_srcdir)/po/LINGUAS']) ]) f-spot-0.8.2/build/m4/shamrock/nunit.m40000644000175000017500000000141511417267574020105 0ustar00rubenruben00000000000000AC_DEFUN([SHAMROCK_CHECK_NUNIT], [ NUNIT_REQUIRED=2.4.7 AC_ARG_ENABLE(tests, AC_HELP_STRING([--enable-tests], [Enable NUnit tests]), enable_tests=$enableval, enable_tests="no") if test "x$enable_tests" = "xno"; then do_tests=no AM_CONDITIONAL(ENABLE_TESTS, false) else PKG_CHECK_MODULES(NUNIT, nunit >= $NUNIT_REQUIRED, do_tests="yes", do_tests="no") AC_SUBST(NUNIT_LIBS) AM_CONDITIONAL(ENABLE_TESTS, test "x$do_tests" = "xyes") if test "x$do_tests" = "xno"; then PKG_CHECK_MODULES(NUNIT, mono-nunit >= 2.4, do_tests="yes", do_tests="no") AC_SUBST(NUNIT_LIBS) AM_CONDITIONAL(ENABLE_TESTS, test "x$do_tests" = "xyes") if test "x$do_tests" = "xno"; then AC_MSG_WARN([Could not find nunit: tests will not be available]) fi fi fi ]) f-spot-0.8.2/build/m4/shave/0000777000175000017500000000000011503407370015772 5ustar00rubenruben00000000000000f-spot-0.8.2/build/m4/shave/shave-libtool.in0000644000175000017500000000571611417267574021115 0ustar00rubenruben00000000000000#!/bin/sh # # Copyright (c) 2009, Damien Lespiau # # Permission is hereby granted, free of charge, to any person # obtaining a copy of this software and associated documentation # files (the "Software"), to deal in the Software without # restriction, including without limitation the rights to use, # copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following # conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # OTHER DEALINGS IN THE SOFTWARE. # we need sed SED=@SED@ if test -z "$SED" ; then SED=sed fi lt_unmangle () { last_result=`echo $1 | $SED -e 's#.libs/##' -e 's#[0-9a-zA-Z_\-\.]*_la-##'` } # the real libtool to use LIBTOOL="$1" shift # if 1, don't print anything, the underlaying wrapper will do it pass_though=0 # scan the arguments, keep the right ones for libtool, and discover the mode preserved_args= # have we seen the --tag option of libtool in the command line ? tag_seen=0 while test "$#" -gt 0; do opt="$1" shift case $opt in --mode=*) mode=`echo $opt | $SED -e 's/[-_a-zA-Z0-9]*=//'` preserved_args="$preserved_args $opt" ;; -o) lt_output="$1" preserved_args="$preserved_args $opt" ;; --tag=*) tag_seen=1 preserved_args="$preserved_args $opt" ;; *) preserved_args="$preserved_args $opt" ;; esac done case "$mode" in compile) # shave will be called and print the actual CC/CXX/LINK line preserved_args="$preserved_args --shave-mode=$mode" pass_though=1 ;; link) preserved_args="$preserved_args --shave-mode=$mode" Q=" LINK " ;; *) # let's u # echo "*** libtool: Unimplemented mode: $mode, fill a bug report" ;; esac lt_unmangle "$lt_output" output=$last_result # automake does not add a --tag switch to its libtool invocation when # assembling a .s file and rely on libtool to infer the right action based # on the compiler name. As shave is using CC to hook a wrapper, libtool gets # confused. Let's detect these cases and add a --tag=CC option. tag="" if test $tag_seen -eq 0 -a x"$mode" = xcompile; then tag="--tag=CC" fi if test -z $V; then if test $pass_though -eq 0; then echo "$Q$output" fi $LIBTOOL --silent $tag $preserved_args else echo $LIBTOOL $tag $preserved_args $LIBTOOL $tag $preserved_args fi f-spot-0.8.2/build/m4/shave/shave.in0000644000175000017500000000463411417267574017451 0ustar00rubenruben00000000000000#!/bin/sh # # Copyright (c) 2009, Damien Lespiau # # Permission is hereby granted, free of charge, to any person # obtaining a copy of this software and associated documentation # files (the "Software"), to deal in the Software without # restriction, including without limitation the rights to use, # copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following # conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # OTHER DEALINGS IN THE SOFTWARE. # we need sed SED=@SED@ if test -z "$SED" ; then SED=sed fi lt_unmangle () { last_result=`echo $1 | $SED -e 's#.libs/##' -e 's#[0-9a-zA-Z_\-\.]*_la-##'` } # the tool to wrap (cc, cxx, ar, ranlib, ..) tool="$1" shift # the reel tool (to call) REEL_TOOL="$1" shift pass_through=0 preserved_args= while test "$#" -gt 0; do opt="$1" shift case $opt in --shave-mode=*) mode=`echo $opt | $SED -e 's/[-_a-zA-Z0-9]*=//'` ;; -o) lt_output="$1" preserved_args="$preserved_args $opt" ;; -out:*|/out:*) lt_output="${opt#*:}" preserved_args="$preserved_args $opt" ;; *) preserved_args="$preserved_args $opt" ;; esac done # mode=link is handled in the libtool wrapper case "$mode,$tool" in link,*) pass_through=1 ;; *,cxx) Q=" CXX " ;; *,cc) Q=" CC " ;; *,fc) Q=" FC " ;; *,f77) Q=" F77 " ;; *,objc) Q=" OBJC " ;; *,mcs) Q=" MCS " ;; *,*) # should not happen Q=" CC " ;; esac lt_unmangle "$lt_output" output=$last_result if test -z $V; then if test $pass_through -eq 0; then echo "$Q$output" fi $REEL_TOOL $preserved_args else echo $REEL_TOOL $preserved_args $REEL_TOOL $preserved_args fi f-spot-0.8.2/build/m4/shave/shave.m40000644000175000017500000000661311417267574017362 0ustar00rubenruben00000000000000dnl Make automake/libtool output more friendly to humans dnl dnl Copyright (c) 2009, Damien Lespiau dnl dnl Permission is hereby granted, free of charge, to any person dnl obtaining a copy of this software and associated documentation dnl files (the "Software"), to deal in the Software without dnl restriction, including without limitation the rights to use, dnl copy, modify, merge, publish, distribute, sublicense, and/or sell dnl copies of the Software, and to permit persons to whom the dnl Software is furnished to do so, subject to the following dnl conditions: dnl dnl The above copyright notice and this permission notice shall be dnl included in all copies or substantial portions of the Software. dnl dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, dnl EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES dnl OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND dnl NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT dnl HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, dnl WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING dnl FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR dnl OTHER DEALINGS IN THE SOFTWARE. dnl dnl SHAVE_INIT([shavedir],[default_mode]) dnl dnl shavedir: the directory where the shave scripts are, it defaults to dnl $(top_builddir) dnl default_mode: (enable|disable) default shave mode. This parameter dnl controls shave's behaviour when no option has been dnl given to configure. It defaults to disable. dnl dnl * SHAVE_INIT should be called late in your configure.(ac|in) file (just dnl before AC_CONFIG_FILE/AC_OUTPUT is perfect. This macro rewrites CC and dnl LIBTOOL, you don't want the configure tests to have these variables dnl re-defined. dnl * This macro requires GNU make's -s option. AC_DEFUN([_SHAVE_ARG_ENABLE], [ AC_ARG_ENABLE([shave], AS_HELP_STRING( [--enable-shave], [use shave to make the build pretty [[default=$1]]]),, [enable_shave=$1] ) ]) AC_DEFUN([SHAVE_INIT], [ dnl you can tweak the default value of enable_shave m4_if([$2], [enable], [_SHAVE_ARG_ENABLE(yes)], [_SHAVE_ARG_ENABLE(no)]) if test x"$enable_shave" = xyes; then dnl where can we find the shave scripts? m4_if([$1],, [shavedir="$ac_pwd"], [shavedir="$ac_pwd/$1"]) AC_SUBST(shavedir) dnl make is now quiet AC_SUBST([MAKEFLAGS], [-s]) AC_SUBST([AM_MAKEFLAGS], ['`test -z $V && echo -s`']) dnl we need sed AC_CHECK_PROG(SED,sed,sed,false) dnl substitute libtool SHAVE_SAVED_LIBTOOL=$LIBTOOL LIBTOOL="${SHELL} ${shavedir}/shave-libtool '${SHAVE_SAVED_LIBTOOL}'" AC_SUBST(LIBTOOL) dnl substitute cc/cxx SHAVE_SAVED_CC=$CC SHAVE_SAVED_CXX=$CXX SHAVE_SAVED_FC=$FC SHAVE_SAVED_F77=$F77 SHAVE_SAVED_OBJC=$OBJC SHAVE_SAVED_MCS=$MCS CC="${SHELL} ${shavedir}/shave cc ${SHAVE_SAVED_CC}" CXX="${SHELL} ${shavedir}/shave cxx ${SHAVE_SAVED_CXX}" FC="${SHELL} ${shavedir}/shave fc ${SHAVE_SAVED_FC}" F77="${SHELL} ${shavedir}/shave f77 ${SHAVE_SAVED_F77}" OBJC="${SHELL} ${shavedir}/shave objc ${SHAVE_SAVED_OBJC}" MCS="${SHELL} ${shavedir}/shave mcs ${SHAVE_SAVED_MCS}" AC_SUBST(CC) AC_SUBST(CXX) AC_SUBST(FC) AC_SUBST(F77) AC_SUBST(OBJC) AC_SUBST(MCS) V=@ else V=1 fi Q='$(V:1=)' AC_SUBST(V) AC_SUBST(Q) ]) f-spot-0.8.2/build/m4/f-spot/0000777000175000017500000000000011503407370016074 5ustar00rubenruben00000000000000f-spot-0.8.2/build/m4/f-spot/libfspot.m40000644000175000017500000000014511420634373020157 0ustar00rubenruben00000000000000AC_DEFUN([FSPOT_CHECK_LIBFSPOT], [ AC_ISC_POSIX AC_PROG_CC AC_HEADER_STDC AM_PATH_GLIB_2_0 ]) f-spot-0.8.2/build/m4/f-spot/mono-addins.m40000644000175000017500000000050011417267574020553 0ustar00rubenruben00000000000000AC_DEFUN([FSPOT_CHECK_MONO_ADDINS], [ PKG_CHECK_MODULES(MONO_ADDINS, mono-addins >= 0.3.1) AC_SUBST(MONO_ADDINS_LIBS) PKG_CHECK_MODULES(MONO_ADDINS_SETUP, mono-addins-setup >= 0.3.1) AC_SUBST(MONO_ADDINS_SETUP_LIBS) PKG_CHECK_MODULES(MONO_ADDINS_GUI, mono-addins-gui >= 0.3.1) AC_SUBST(MONO_ADDINS_GUI_LIBS) ]) f-spot-0.8.2/build/m4/f-spot/gnome-keyring-sharp.m40000644000175000017500000000031211417267574022232 0ustar00rubenruben00000000000000AC_DEFUN([FSPOT_CHECK_GNOME_KEYRING_SHARP], [ GNOMEKEYRINGSHARP_REQUIRED=1.0 PKG_CHECK_MODULES(KEYRINGSHARP, gnome-keyring-sharp-1.0 >= $GNOMEKEYRINGSHARP_REQUIRED) AC_SUBST(KEYRINGSHARP_LIBS) ]) f-spot-0.8.2/build/m4/f-spot/flickrnet.m40000644000175000017500000000023411417267574020330 0ustar00rubenruben00000000000000AC_DEFUN([FSPOT_CHECK_FLICKRNET], [ FLICKRNET_REQUIRED=2.0 PKG_CHECK_MODULES(FLICKRNET, flickrnet >= $FLICKRNET_REQUIRED) AC_SUBST(FLICKRNET_LIBS) ]) f-spot-0.8.2/build/m4/f-spot/gtk-sharp.m40000644000175000017500000000117611417267574020255 0ustar00rubenruben00000000000000AC_DEFUN([FSPOT_CHECK_GTK_SHARP], [ GTKSHARP_REQUIRED=2.12.2 PKG_CHECK_MODULES(GTKSHARP, gtk-sharp-2.0 >= $GTKSHARP_REQUIRED) AC_SUBST(GTKSHARP_LIBS) PKG_CHECK_MODULES(GLIBSHARP, glib-sharp-2.0 >= $GTKSHARP_REQUIRED) AC_SUBST(GLIBSHARP_LIBS) PKG_CHECK_MODULES(GLIBSHARP_2_12_7, glib-sharp-2.0 >= 2.12.7, HAVE_GLIBSHARP_2_12_7=yes, HAVE_GLIBSHARP_2_12_7=no) AM_CONDITIONAL(HAVE_GLIBSHARP_2_12_7, [test "$HAVE_GLIBSHARP_2_12_7" = "yes"]) PKG_CHECK_MODULES(GTKSHARP_A11Y, gtk-sharp-2.0 >= 2.12.10, gtksharp_with_a11y=yes, gtksharp_with_a11y=no) AM_CONDITIONAL(ENABLE_ATK, test "x$gtksharp_with_a11y" = "xyes") ]) f-spot-0.8.2/build/m4/Makefile.in0000644000175000017500000003413211503407227016731 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = build/m4 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ $(srcdir)/f-spot/*.m4 \ $(srcdir)/shamrock/*.m4 \ $(srcdir)/shave/*.m4 \ $(srcdir)/shave/*.in MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign build/m4/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign build/m4/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/build/m4/Makefile.am0000644000175000017500000000022511417267574016731 0ustar00rubenruben00000000000000EXTRA_DIST = \ $(srcdir)/f-spot/*.m4 \ $(srcdir)/shamrock/*.m4 \ $(srcdir)/shave/*.m4 \ $(srcdir)/shave/*.in MAINTAINERCLEANFILES = Makefile.in f-spot-0.8.2/build/build.rules.mk0000644000175000017500000000703711422535714017134 0ustar00rubenruben00000000000000UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) SOURCES_BUILD += $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) if ENABLE_TESTS LINK += " $(NUNIT_LIBS)" ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" endif if ENABLE_ATK ENABLE_ATK_FLAG = "-define:ENABLE_ATK" endif FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in f-spot-0.8.2/build/build.environment.mk0000644000175000017500000001515111443366532020345 0ustar00rubenruben00000000000000# Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions ## Directories DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon:= : empty:= space:= $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) f-spot-0.8.2/build/dll-map-makefile-verifier0000755000175000017500000000040511417267574021215 0ustar00rubenruben00000000000000#!/usr/bin/env bash if [ -f $2 ]; then # Lame, but better than nothing grep $(basename $2) $1 | grep module_SCRIPTS &>/dev/null || { echo "Assembly has corresponding .config file, but it was not found in module_SCRIPTS in Makefile.am" 2>&1 exit 1 } fi f-spot-0.8.2/build/pkg-config/0000777000175000017500000000000011503407371016371 5ustar00rubenruben00000000000000f-spot-0.8.2/build/pkg-config/f-spot.pc.in0000644000175000017500000000062411430555233020530 0ustar00rubenruben00000000000000prefix=@prefix@ exec_prefix=${prefix} libdir=@libdir@ Name: F-Spot Description: F-Spot, Organise, enjoy and share your pictures Version: @VERSION@ Libs: -r:${libdir}/f-spot/f-spot.exe -r:${libdir}/f-spot/FSpot.Core.dll -r:${libdir}/f-spot/FSpot.Utils.dll -r:${libdir}/f-spot/FSpot.Cms.dll -r:${libdir}/f-spot/FSpot.Query.dll -r:${libdir}/f-spot/FSpot.JobScheduler.dll -r:${libdir}/f-spot/FSpot.Gui.dll f-spot-0.8.2/build/pkg-config/Makefile.in0000644000175000017500000004054511503407227020442 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = build/pkg-config DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(pkgconfigdir)" DATA = $(pkgconfig_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ pkgconfigdir = $(libdir)/pkgconfig pkgconfig_in_files = $(wildcard f-spot*.pc.in) pkgconfig_DATA = $(pkgconfig_in_files:.pc.in=.pc) EXTRA_DIST = $(pkgconfig_in_files) CLEANFILES = $(pkgconfig_DATA) MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign build/pkg-config/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign build/pkg-config/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(pkgconfigdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgconfigDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgconfigDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-pkgconfigDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am uninstall-pkgconfigDATA %.pc: %.pc.in sed "s,\@VERSION\@,$(VERSION),g; s,\@prefix\@,$(prefix),g; s,\@libdir\@,$(libdir),g" < $< > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/build/pkg-config/Makefile.am0000644000175000017500000000053211417267574020436 0ustar00rubenruben00000000000000pkgconfigdir = $(libdir)/pkgconfig pkgconfig_in_files = $(wildcard f-spot*.pc.in) pkgconfig_DATA = $(pkgconfig_in_files:.pc.in=.pc) %.pc: %.pc.in sed "s,\@VERSION\@,$(VERSION),g; s,\@prefix\@,$(prefix),g; s,\@libdir\@,$(libdir),g" < $< > $@ EXTRA_DIST = $(pkgconfig_in_files) CLEANFILES = $(pkgconfig_DATA) MAINTAINERCLEANFILES = Makefile.in f-spot-0.8.2/build/private-icon-theme-installer0000755000175000017500000000115111417267574021775 0ustar00rubenruben00000000000000#!/usr/bin/env bash mkinstalldirs=$1; shift install_data=$1; shift action=$1; shift dest_dir=$1; shift src_dir=$1; shift for icon in $@; do dest_dir_build="${dest_dir}/icons/hicolor/$(dirname ${icon})" if [[ ${action} == "-i" || ${action} == "-il" ]]; then src_file="${src_dir}/ThemeIcons/${icon}" $mkinstalldirs "${dest_dir_build}" &>/dev/null if [[ ${action} == "-i" ]]; then echo "Installing private icon theme icon: ${icon}" fi $install_data "${src_file}" "${dest_dir_build}" else echo "Uninstalling private icon theme icon: ${icon}" rm -f "${dest_dir_build}/$(basename ${icon})" fi done f-spot-0.8.2/build/Makefile.in0000644000175000017500000005263011503407226016413 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = build DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = pkg-config m4 DLL_MAP_VERIFIER_ASSEMBLY = dll-map-verifier.exe ALL_TARGETS = $(DLL_MAP_VERIFIER_ASSEMBLY) EXTRA_DIST = \ private-icon-theme-installer \ DllMapVerifier.cs \ dll-map-makefile-verifier CLEANFILES = *.exe *.mdb MAINTAINERCLEANFILES = Makefile.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign build/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign build/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am all: $(ALL_TARGETS) $(DLL_MAP_VERIFIER_ASSEMBLY): DllMapVerifier.cs $(MCS) -out:$@ $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/build/Makefile.am0000644000175000017500000000055411503404760016400 0ustar00rubenruben00000000000000SUBDIRS = pkg-config m4 DLL_MAP_VERIFIER_ASSEMBLY = dll-map-verifier.exe ALL_TARGETS = $(DLL_MAP_VERIFIER_ASSEMBLY) all: $(ALL_TARGETS) $(DLL_MAP_VERIFIER_ASSEMBLY): DllMapVerifier.cs $(MCS) -out:$@ $< EXTRA_DIST = \ private-icon-theme-installer \ DllMapVerifier.cs \ dll-map-makefile-verifier CLEANFILES = *.exe *.mdb MAINTAINERCLEANFILES = Makefile.in f-spot-0.8.2/lib/0000777000175000017500000000000011503407375014020 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/SmugMugNet/0000777000175000017500000000000011503407426016050 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/SmugMugNet/SmugMugNet/0000777000175000017500000000000011503407426020103 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/SmugMugNet/SmugMugNet/SmugMugApi.cs0000644000175000017500000000663411430555233022454 0ustar00rubenruben00000000000000/* * SmugMugApi.cs * * Authors: * Thomas Van Machelen * * Copyright (C) 2006 Thomas Van Machelen * This is free software. See COPYING for details. * */ using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO; using System.Text.RegularExpressions; using System.Xml; using System.Collections.Specialized; using Hyena; namespace SmugMugNet { public class SmugMugApi { private string username = String.Empty; private string password = String.Empty; private bool connected = false; private Credentials credentials; private const string VERSION = "1.1.1"; private Category[] categories; public bool Connected { get { return connected; } } public SmugMugApi (string email_address, string password) { this.username = email_address; this.password = password; } public bool Login () { if (this.username.Length == 0 | this.password.Length == 0) { throw new SmugMugException("There is no username or password."); } if (this.connected == false && this.credentials.UserID == 0) { try { this.credentials = SmugMugProxy.LoginWithPassword (this.username, this.password); this.connected = true; } catch { return false; } } else { LoginWithHash (); } return true; } private void LoginWithHash () { try { string session_id = SmugMugProxy.LoginWithHash (this.credentials.UserID, this.credentials.PasswordHash); if (session_id != null && session_id.Length > 0) { this.credentials.SessionID = session_id; } else { throw new SmugMugException ("SessionID was empty"); } } catch (Exception ex) { throw new SmugMugException ("A login error occured, SessionID may be invalid.", ex.InnerException); } } public void Logout () { if (!connected) return; if (this.credentials.SessionID == null && this.credentials.SessionID.Length == 0) return; SmugMugProxy.Logout (this.credentials.SessionID); connected = false; this.credentials = new Credentials (null, 0, null); } public Category[] GetCategories () { if (this.categories == null) { try { this.categories = SmugMugProxy.GetCategories (credentials.SessionID); } catch (Exception ex) { throw new SmugMugException ("Could not retrieve Categories", ex.InnerException); } } return this.categories; } public Album CreateAlbum (string title, int category_id, bool is_public) { try { return SmugMugProxy.CreateAlbum (title, category_id, credentials.SessionID, is_public); } catch (Exception ex) { throw new SmugMugException ("Could not create album", ex.InnerException); } } public Album[] GetAlbums () { try { return SmugMugProxy.GetAlbums(credentials.SessionID); } catch (Exception ex) { throw new SmugMugException ("Could not get albums", ex.InnerException); } } public Uri GetAlbumUrl (int image_id) { try { return SmugMugProxy.GetAlbumUrl (image_id, credentials.SessionID); } catch (Exception ex) { throw new SmugMugException ("Could not get album url", ex.InnerException); } } public int Upload (string path, int album_id) { try { return SmugMugProxy.Upload (path, album_id, credentials.SessionID); } catch (Exception ex) { throw new SmugMugException ("Could not upload file", ex.InnerException); } } } } f-spot-0.8.2/lib/SmugMugNet/SmugMugNet/SmugMugException.cs0000644000175000017500000000104411430555233023667 0ustar00rubenruben00000000000000using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO; using System.Text.RegularExpressions; using System.Xml; using System.Collections.Specialized; using Hyena; namespace SmugMugNet { public class SmugMugException : ApplicationException { public SmugMugException(string message) : base (message) { Log.Debug (message); } public SmugMugException (string message, Exception innerException) : base (message, innerException) { Log.Debug (message, innerException.ToString()); } } } f-spot-0.8.2/lib/SmugMugNet/SmugMugNet/Credentials.cs0000644000175000017500000000135511430555233022666 0ustar00rubenruben00000000000000using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO; using System.Text.RegularExpressions; using System.Xml; using System.Collections.Specialized; using Hyena; namespace SmugMugNet { public struct Credentials { public string session_id; public int user_id; public string password_hash; public string SessionID { get { return session_id; } set { session_id = value; } } public int UserID { get { return user_id; } } public string PasswordHash { get { return password_hash; } } public Credentials(string session_id, int user_id, string password_hash) { this.session_id = session_id; this.user_id = user_id; this.password_hash = password_hash; } } } f-spot-0.8.2/lib/SmugMugNet/SmugMugNet/SmugMugProxy.cs0000644000175000017500000001735711430555233023070 0ustar00rubenruben00000000000000using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO; using System.Text.RegularExpressions; using System.Xml; using System.Collections.Specialized; using Hyena; namespace SmugMugNet { public class SmugMugProxy { // FIXME: this getting should be done over https private const string GET_URL = "https://api.SmugMug.com/hack/rest/"; private const string POST_URL = "https://upload.SmugMug.com/hack/rest/"; // key from massis private const string APIKEY = "umtr0zB2wzwTZDhF2BySidg0hY0le3K6"; private const string VERSION = "1.1.1"; // rest methods private const string LOGIN_WITHPASS_METHOD = "smugmug.login.withPassword"; private const string LOGIN_WITHHASH_METHOD = "smugmug.login.withHash"; private const string LOGOUT_METHOD = "smugmug.logout"; private const string ALBUMS_CREATE_METHOD = "smugmug.albums.create"; private const string ALBUMS_GET_URLS_METHOD = "smugmug.images.getURLs"; private const string ALBUMS_GET_METHOD = "smugmug.albums.get"; private const string CATEGORIES_GET_METHOD = "smugmug.categories.get"; // parameter constants private const string EMAIL = "EmailAddress"; private const string PASSWORD = "Password"; private const string USER_ID = "UserID"; private const string PASSWORD_HASH = "PasswordHash"; private const string SESSION_ID = "SessionID"; private const string CATEGORY_ID = "CategoryID"; private const string IMAGE_ID = "ImageID"; private const string TITLE = "Title"; private const string ID = "id"; public static Credentials LoginWithPassword (string username, string password) { string url = FormatGetUrl (LOGIN_WITHPASS_METHOD, new SmugMugParam (EMAIL, username), new SmugMugParam (PASSWORD, password)); XmlDocument doc = GetResponseXml (url); string sessionId = doc.SelectSingleNode ("/rsp/Login/SessionID").InnerText; int userId = int.Parse (doc.SelectSingleNode ("/rsp/Login/UserID").InnerText); string passwordHash = doc.SelectSingleNode ("/rsp/Login/PasswordHash").InnerText; return new Credentials (sessionId, userId, passwordHash); } public static string LoginWithHash (int user_id, string password_hash) { string url = FormatGetUrl (LOGIN_WITHHASH_METHOD, new SmugMugParam (USER_ID, user_id), new SmugMugParam (PASSWORD_HASH, password_hash)); XmlDocument doc = GetResponseXml(url); return doc.SelectSingleNode ("/rsp/Login/SessionID").InnerText; } public static void Logout (string session_id) { string url = FormatGetUrl (LOGOUT_METHOD, new SmugMugParam (SESSION_ID, session_id)); GetResponseXml (url); } public static Album[] GetAlbums (string session_id) { string url = FormatGetUrl (ALBUMS_GET_METHOD, new SmugMugParam(SESSION_ID, session_id)); XmlDocument doc = GetResponseXml (url); XmlNodeList albumNodes = doc.SelectNodes ("/rsp/Albums/Album"); Album[] albums = new Album[albumNodes.Count]; for (int i = 0; i < albumNodes.Count; i++) { XmlNode current = albumNodes[i]; albums[i] = new Album (current.SelectSingleNode (TITLE).InnerText, int.Parse (current.Attributes[ID].Value)); } return albums; } public static Uri GetAlbumUrl (int image_id, string session_id) { string url = FormatGetUrl(ALBUMS_GET_URLS_METHOD, new SmugMugParam(IMAGE_ID, image_id), new SmugMugParam(SESSION_ID, session_id)); XmlDocument doc = GetResponseXml(url); string album_url = doc.SelectSingleNode("/rsp/ImageURLs/Image/AlbumURL").InnerText; return new Uri(album_url); } public static Category[] GetCategories (string session_id) { string url = FormatGetUrl(CATEGORIES_GET_METHOD, new SmugMugParam (SESSION_ID, session_id)); XmlDocument doc = GetResponseXml (url); XmlNodeList categoryNodes = doc.SelectNodes ("/rsp/Categories/Category"); Category[] categories = new Category[categoryNodes.Count]; for (int i = 0; i < categoryNodes.Count; i++) { XmlNode current = categoryNodes[i]; categories[i] = new Category (current.SelectSingleNode (TITLE).InnerText, int.Parse (current.Attributes[ID].Value)); } return categories; } public static Album CreateAlbum (string title, int category_id, string session_id) { return CreateAlbum (title, category_id, session_id, true); } public static Album CreateAlbum (string title, int category_id, string session_id, bool is_public) { int public_int = is_public ? 1 : 0; string url = FormatGetUrl (ALBUMS_CREATE_METHOD, new SmugMugParam (TITLE, title), new SmugMugParam (CATEGORY_ID, category_id), new SmugMugParam (SESSION_ID, session_id), new SmugMugParam ("Public", public_int)); XmlDocument doc = GetResponseXml (url); int id = int.Parse(doc.SelectSingleNode("/rsp/Create/Album").Attributes[ID].Value); return new Album(title, id); } public static int Upload (string path, int album_id, string session_id) { FileInfo file = new FileInfo(path); if (!file.Exists) throw new ArgumentException("Image does not exist: " + file.FullName); try { WebClient client = new WebClient (); client.BaseAddress = "http://upload.smugmug.com"; client.Headers.Add ("Cookie:SMSESS=" + session_id); NameValueCollection queryStringCollection = new NameValueCollection (); queryStringCollection.Add ("AlbumID", album_id.ToString()); // Temporarily disabled because rest doesn't seem to return the ImageID anymore // queryStringCollection.Add ("ResponseType", "REST"); // luckily JSON still holds it queryStringCollection.Add ("ResponseType", "JSON"); client.QueryString = queryStringCollection; byte[] responseArray = client.UploadFile ("http://upload.smugmug.com/photos/xmladd.mg", "POST", file.FullName); string response = Encoding.ASCII.GetString (responseArray); // JSon approach Regex id_regex = new Regex ("\\\"id\\\":( )?(?\\d+),"); Match m = id_regex.Match (response); int id = -1; if (m.Success) id = int.Parse (m.Groups["image_id"].Value); return id; // REST approach, disabled for now //XmlDocument doc = new XmlDocument (); //doc.LoadXml (response); // return int.Parse (doc.SelectSingleNode ("/rsp/ImageID").InnerText); } catch (Exception ex) { throw new SmugMugUploadException ("Error uploading image: " + file.FullName, ex.InnerException); } } private static string FormatGetUrl(string method_name, params SmugMugParam[] parameters) { StringBuilder builder = new StringBuilder (string.Format ("{0}{1}/?method={2}", GET_URL, VERSION, method_name)); foreach (SmugMugParam param in parameters) builder.Append (param.ToString ()); builder.Append (new SmugMugParam ("APIKey", APIKEY)); return builder.ToString(); } private static XmlDocument GetResponseXml (string url) { HttpWebRequest request = HttpWebRequest.Create (url) as HttpWebRequest; request.Credentials = CredentialCache.DefaultCredentials; WebResponse response = request.GetResponse (); XmlDocument doc = new XmlDocument (); doc.LoadXml (new StreamReader (response.GetResponseStream ()).ReadToEnd ()); CheckResponseXml (doc); response.Close (); return doc; } private static void CheckResponseXml (XmlDocument doc) { if (doc.SelectSingleNode("/rsp").Attributes["stat"].Value == "ok") return; string message = doc.SelectSingleNode ("/rsp/err").Attributes["msg"].Value; throw new SmugMugException (message); } private class SmugMugParam { string name; object value; public SmugMugParam (string name, object value) { this.name = name; this.value = (value is String ? System.Web.HttpUtility.UrlEncode ((string)value) : value); } public string Name { get {return name;} } public object Value { get {return value;} } public override string ToString() { return string.Format("&{0}={1}", Name, Value); } } } } f-spot-0.8.2/lib/SmugMugNet/SmugMugNet/SmugMugUploadException.cs0000644000175000017500000000073411430555233025041 0ustar00rubenruben00000000000000using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO; using System.Text.RegularExpressions; using System.Xml; using System.Collections.Specialized; using Hyena; namespace SmugMugNet { public sealed class SmugMugUploadException : ApplicationException { public SmugMugUploadException (string message, Exception innerException) : base (message, innerException) { Log.Debug (message, innerException.ToString ()); } } } f-spot-0.8.2/lib/SmugMugNet/SmugMugNet/NoCheckCertificatePolicy.cs0000644000175000017500000000271411430555233025266 0ustar00rubenruben00000000000000// Authors: // Gonzalo Paniagua Javier (gonzalo@ximian.com) // // (C) Copyright 2006 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System.Net; using System.Security.Cryptography.X509Certificates; namespace SmugMugNet { public class NoCheckCertificatePolicy : ICertificatePolicy { public bool CheckValidationResult (ServicePoint a, X509Certificate b, WebRequest c, int d) { return true; } } } f-spot-0.8.2/lib/SmugMugNet/SmugMugNet/Album.cs0000644000175000017500000000107211430555233021465 0ustar00rubenruben00000000000000using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO; using System.Text.RegularExpressions; using System.Xml; using System.Collections.Specialized; using Hyena; namespace SmugMugNet { public struct Album { public Album(string title, int id) { this.album_id = id; this.title = title; } private int album_id; public int AlbumID { get { return album_id; } set { album_id = value; } } private string title; public string Title { get { return title; } set { title = value; } } } } f-spot-0.8.2/lib/SmugMugNet/SmugMugNet/Category.cs0000644000175000017500000000112011430555233022174 0ustar00rubenruben00000000000000using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO; using System.Text.RegularExpressions; using System.Xml; using System.Collections.Specialized; using Hyena; namespace SmugMugNet { public struct Category { public Category( string title, int id) { this.title = title; this.category_id = id; } private int category_id; public int CategoryID { get { return category_id; } set { category_id = value; } } private string title; public string Title { get { return title; } set { title = value; } } } } f-spot-0.8.2/lib/SmugMugNet/Makefile.in0000644000175000017500000006674411503407241020125 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = lib/SmugMugNet ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = SmugMugNet TARGET = library LINK = $(REF_SMUGMUGNET) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ SmugMugNet/Album.cs \ SmugMugNet/Category.cs \ SmugMugNet/Credentials.cs \ SmugMugNet/NoCheckCertificatePolicy.cs \ SmugMugNet/SmugMugApi.cs \ SmugMugNet/SmugMugException.cs \ SmugMugNet/SmugMugProxy.cs \ SmugMugNet/SmugMugUploadException.cs RESOURCES = # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/SmugMugNet/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/SmugMugNet/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/lib/SmugMugNet/Makefile.am0000644000175000017500000000064311430555233020102 0ustar00rubenruben00000000000000ASSEMBLY = SmugMugNet TARGET = library LINK = $(REF_SMUGMUGNET) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ SmugMugNet/Album.cs \ SmugMugNet/Category.cs \ SmugMugNet/Credentials.cs \ SmugMugNet/NoCheckCertificatePolicy.cs \ SmugMugNet/SmugMugApi.cs \ SmugMugNet/SmugMugException.cs \ SmugMugNet/SmugMugProxy.cs \ SmugMugNet/SmugMugUploadException.cs RESOURCES = include $(top_srcdir)/build/build.mk f-spot-0.8.2/lib/libfspot/0000777000175000017500000000000011503407414015634 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/libfspot/f-pixbuf-utils.h0000644000175000017500000000266211422535714020672 0ustar00rubenruben00000000000000/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ /* f-pixbuf-utils.h * * Copyright (C) 2003 Ettore Perazzoli * * 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., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Ettore Perazzoli */ #ifndef _F_PIXBUF_UTILS_H_ #define _F_PIXBUF_UTILS_H_ #include /* Return the largest between height and width of the specified PIXBUF. */ int f_pixbuf_get_image_size (GdkPixbuf *pixbuf); /* Return the normalized width for the specified PIXBUF at the specified thumbnail SIZE. */ int f_pixbuf_get_scaled_width (GdkPixbuf *pixbuf, int size); /* Return the normalized height for the specified PIXBUF at the specified thumbnail SIZE. */ int f_pixbuf_get_scaled_height (GdkPixbuf *pixbuf, int size); #endif f-spot-0.8.2/lib/libfspot/f-screen-utils.c0000644000175000017500000001152611417267577020663 0ustar00rubenruben00000000000000/* this is taken from recent versions of libeog based on Ross Burton's patch */ /* * right now we return the parsed profile rather than the data to avoid wrapping the XFree * as well. */ #include #include #include #include #include #include cmsHPROFILE * f_screen_get_profile (GdkScreen *screen) { Display *dpy; Atom icc_atom, type; int format; gulong nitems; gulong bytes_after; guchar *str; int result; cmsHPROFILE *profile; dpy = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen)); icc_atom = gdk_x11_get_xatom_by_name_for_display (gdk_screen_get_display (screen), "_ICC_PROFILE"); result = XGetWindowProperty (dpy, GDK_WINDOW_XID (gdk_screen_get_root_window (screen)), icc_atom, 0, G_MAXLONG, False, XA_CARDINAL, &type, &format, &nitems, &bytes_after, (guchar **)&str); /* TODO: handle bytes_after != 0 */ if (nitems) { profile = cmsOpenProfileFromMem(str, nitems); XFree (str); return profile; } else return NULL; } typedef struct { double Exposure; double Brightness; double Contrast; double Hue; double Saturation; cmsCIEXYZ WPsrc, WPdest; } BCHSWADJUSTS, *LPBCHSWADJUSTS; static int bchswSampler(register WORD In[], register WORD Out[], register LPVOID Cargo) { cmsCIELab LabIn, LabOut; cmsCIELCh LChIn, LChOut; cmsCIEXYZ XYZ; double l; double power; gboolean shift; LPBCHSWADJUSTS bchsw = (LPBCHSWADJUSTS) Cargo; cmsLabEncoded2Float(&LabIn, In); // Move white point in Lab cmsLab2XYZ(&bchsw ->WPsrc, &XYZ, &LabIn); cmsXYZ2Lab(&bchsw ->WPdest, &LabIn, &XYZ); shift = (LabIn.L > 0.5); l = LabIn.L / 100; if (shift) l = 1.0 - l; if (l < 0.0) l = 0.0; if (bchsw->Contrast < 0) power = 1.0 + bchsw->Contrast; else power = (bchsw->Contrast == 1.0) ? 127 : 1.0 / (1.0 - bchsw->Contrast); l = 0.5 * pow (l * 2.0 , power); if (shift) l = 1.0 - l; LabIn.L = l * 100; cmsLab2LCh(&LChIn, &LabIn); // Do some adjusts on LCh LChOut.L = LChIn.L * bchsw ->Exposure + bchsw ->Brightness; LChOut.C = MAX (0, LChIn.C + bchsw ->Saturation); LChOut.h = LChIn.h + bchsw ->Hue; cmsLCh2Lab(&LabOut, &LChOut); // Back to encoded cmsFloat2LabEncoded(Out, &LabOut); return TRUE; } // Creates an abstract profile operating in Lab space for Brightness, // contrast, Saturation and white point displacement cmsHPROFILE LCMSEXPORT f_cmsCreateBCHSWabstractProfile(int nLUTPoints, double Exposure, double Bright, double Contrast, double Hue, double Saturation, LPcmsCIExyY current_wp, LPcmsCIExyY destination_wp, LPGAMMATABLE Tables []) { cmsHPROFILE hICC; LPLUT Lut; BCHSWADJUSTS bchsw; cmsCIExyY WhitePnt; bchsw.Exposure = Exposure; bchsw.Brightness = Bright; bchsw.Contrast = Contrast; bchsw.Hue = Hue; bchsw.Saturation = Saturation; cmsxyY2XYZ(&bchsw.WPsrc, current_wp); cmsxyY2XYZ(&bchsw.WPdest, destination_wp); hICC = _cmsCreateProfilePlaceholder(); if (!hICC) // can't allocate return NULL; cmsSetDeviceClass(hICC, icSigAbstractClass); cmsSetColorSpace(hICC, icSigLabData); cmsSetPCS(hICC, icSigLabData); cmsSetRenderingIntent(hICC, INTENT_PERCEPTUAL); // Creates a LUT with 3D grid only Lut = cmsAllocLUT(); cmsAlloc3DGrid(Lut, nLUTPoints, 3, 3); if (Tables != NULL) cmsAllocLinearTable (Lut, Tables, 1); if (!cmsSample3DGrid(Lut, bchswSampler, (LPVOID) &bchsw, 0)) { // Shouldn't reach here cmsFreeLUT(Lut); cmsCloseProfile(hICC); return NULL; } // Create tags cmsAddTag(hICC, icSigDeviceMfgDescTag, (LPVOID) "(f-spot internal)"); cmsAddTag(hICC, icSigProfileDescriptionTag, (LPVOID) "f-spot BCHSW abstract profile"); cmsAddTag(hICC, icSigDeviceModelDescTag, (LPVOID) "BCHSW built-in"); cmsAddTag(hICC, icSigMediaWhitePointTag, (LPVOID) cmsD50_XYZ()); cmsAddTag(hICC, icSigAToB0Tag, (LPVOID) Lut); // LUT is already on virtual profile cmsFreeLUT(Lut); // Ok, done return hICC; } LPGAMMATABLE f_cms_gamma_table_new (unsigned short data[], int start, int length) { LPGAMMATABLE table = cmsAllocGamma (length); int i; if (!table) return NULL; data += start; for (i = 0; i < length; i++) table->GammaTable [i] = data [i]; g_warning ("table %p, count = %d v[0] = %d", table, table->nEntries, table->GammaTable [0]); return table; } ushort * f_cms_gamma_table_get_values (LPGAMMATABLE table) { return &(table->GammaTable [0]); } int f_cms_gamma_table_get_count (LPGAMMATABLE table) { return table->nEntries; } f-spot-0.8.2/lib/libfspot/f-pixbuf-utils.c0000644000175000017500000001227111422535714020662 0ustar00rubenruben00000000000000/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ /* f-pixbuf-utils.c * * Copyright (C) 2001, 2002, 2003 The Free Software Foundation, Inc. * Copyright (C) 2003 Ettore Perazzoli * * 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., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Paolo Bacchilega * * Adapted by Ettore Perazzoli */ /* Some bits are based upon the GIMP source code, the original copyright * note follows: * * The GIMP -- an image manipulation program * Copyright (C) 1995 Spencer Kimball and Peter Mattis * */ #include #include "f-pixbuf-utils.h" #include #include #include #include #include #include "f-image-surface.h" /* Public functions. */ int f_pixbuf_get_image_size (GdkPixbuf *pixbuf) { int width, height; width = gdk_pixbuf_get_width (pixbuf); height = gdk_pixbuf_get_height (pixbuf); return MAX (width, height); } int f_pixbuf_get_scaled_width (GdkPixbuf *pixbuf, int size) { int orig_width, orig_height; orig_width = gdk_pixbuf_get_width (pixbuf); orig_height = gdk_pixbuf_get_height (pixbuf); if (orig_width > orig_height) return size; else return size * ((double) orig_width / orig_height); } int f_pixbuf_get_scaled_height (GdkPixbuf *pixbuf, int size) { int orig_width, orig_height; orig_width = gdk_pixbuf_get_width (pixbuf); orig_height = gdk_pixbuf_get_height (pixbuf); if (orig_width > orig_height) return size * ((double) orig_height / orig_width); else return size; } cairo_surface_t * f_pixbuf_to_cairo_surface (GdkPixbuf *pixbuf) { gint width = gdk_pixbuf_get_width (pixbuf); gint height = gdk_pixbuf_get_height (pixbuf); guchar *gdk_pixels = gdk_pixbuf_get_pixels (pixbuf); int gdk_rowstride = gdk_pixbuf_get_rowstride (pixbuf); int n_channels = gdk_pixbuf_get_n_channels (pixbuf); guchar *cairo_pixels; cairo_format_t format; cairo_surface_t *surface; int j; if (n_channels == 3) format = CAIRO_FORMAT_RGB24; else format = CAIRO_FORMAT_ARGB32; surface = f_image_surface_create (format, width, height); cairo_pixels = (guchar *)f_image_surface_get_data (surface); for (j = height; j; j--) { guchar *p = gdk_pixels; guchar *q = cairo_pixels; if (n_channels == 3) { guchar *end = p + 3 * width; while (p < end) { #if G_BYTE_ORDER == G_LITTLE_ENDIAN q[0] = p[2]; q[1] = p[1]; q[2] = p[0]; #else q[1] = p[0]; q[2] = p[1]; q[3] = p[2]; #endif p += 3; q += 4; } } else { guchar *end = p + 4 * width; guint t1,t2,t3; #define MULT(d,c,a,t) G_STMT_START { t = c * a + 0x7f; d = ((t >> 8) + t) >> 8; } G_STMT_END while (p < end) { #if G_BYTE_ORDER == G_LITTLE_ENDIAN MULT(q[0], p[2], p[3], t1); MULT(q[1], p[1], p[3], t2); MULT(q[2], p[0], p[3], t3); q[3] = p[3]; #else q[0] = p[3]; MULT(q[1], p[0], p[3], t1); MULT(q[2], p[1], p[3], t2); MULT(q[3], p[2], p[3], t3); #endif p += 4; q += 4; } #undef MULT } gdk_pixels += gdk_rowstride; cairo_pixels += 4 * width; } return surface; } GdkPixbuf * f_pixbuf_from_cairo_surface (cairo_surface_t *source) { gint width = cairo_image_surface_get_width (source); gint height = cairo_image_surface_get_height (source); GdkPixbuf *pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, width, height); guchar *gdk_pixels = gdk_pixbuf_get_pixels (pixbuf); int gdk_rowstride = gdk_pixbuf_get_rowstride (pixbuf); int n_channels = gdk_pixbuf_get_n_channels (pixbuf); cairo_format_t format; cairo_surface_t *surface; cairo_t *ctx; static const cairo_user_data_key_t key; int j; format = f_image_surface_get_format (source); surface = cairo_image_surface_create_for_data (gdk_pixels, format, width, height, gdk_rowstride); ctx = cairo_create (surface); cairo_set_source_surface (ctx, source, 0, 0); if (format == CAIRO_FORMAT_ARGB32) cairo_mask_surface (ctx, source, 0, 0); else cairo_paint (ctx); for (j = height; j; j--) { guchar *p = gdk_pixels; guchar *end = p + 4 * width; guchar tmp; while (p < end) { tmp = p[0]; #if G_BYTE_ORDER == G_LITTLE_ENDIAN p[0] = p[2]; p[2] = tmp; #else p[0] = p[1]; p[1] = p[2]; p[2] = p[3]; p[3] = tmp; #endif p += 4; } gdk_pixels += gdk_rowstride; } cairo_destroy (ctx); cairo_surface_destroy (surface); return pixbuf; } f-spot-0.8.2/lib/libfspot/f-image-surface.c0000644000175000017500000000245511417267577020757 0ustar00rubenruben00000000000000#include #include const cairo_user_data_key_t pixel_key; const cairo_user_data_key_t format_key; cairo_surface_t * f_image_surface_create (cairo_format_t format, int width, int height) { int size; cairo_surface_t *surface; unsigned char *pixels; switch (format) { case CAIRO_FORMAT_ARGB32: case CAIRO_FORMAT_RGB24: size = 4; break; case CAIRO_FORMAT_A8: size = 8; break; case CAIRO_FORMAT_A1: size = 1; break; } pixels = g_malloc (width * height * size); surface = cairo_image_surface_create_for_data (pixels, format, width, height, width * size); cairo_surface_set_user_data (surface, &pixel_key, pixels, g_free); cairo_surface_set_user_data (surface, &format_key, GINT_TO_POINTER (format), NULL); return surface; } void * f_image_surface_get_data (cairo_surface_t *surface) { return cairo_surface_get_user_data (surface, &pixel_key); } cairo_format_t f_image_surface_get_format (cairo_surface_t *surface) { return GPOINTER_TO_INT (cairo_surface_get_user_data (surface, &format_key)); } int f_image_surface_get_width (cairo_surface_t *surface) { return cairo_image_surface_get_width (surface); } int f_image_surface_get_height (cairo_surface_t *surface) { return cairo_image_surface_get_height (surface); } f-spot-0.8.2/lib/libfspot/Makefile.in0000644000175000017500000005317611503407245017713 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib/libfspot DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(fspotlibdir)" LTLIBRARIES = $(fspotlib_LTLIBRARIES) am__DEPENDENCIES_1 = libfspot_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libfspot_la_OBJECTS = f-image-surface.lo f-pixbuf-unsharp.lo \ f-pixbuf-utils.lo f-screen-utils.lo libfspot_la_OBJECTS = $(am_libfspot_la_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libfspot_la_SOURCES) DIST_SOURCES = $(libfspot_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ INCLUDES = \ -I $(top_srcdir) -I $(top_srcdir)/lib/ \ -DLIBEOG_ETTORE_CHANGES=1 \ -DG_LOG_DOMAIN=\"libf\" \ -DG_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED \ -DGDK_DISABLE_DEPRECATED -DGNOME_DISABLE_DEPRECATED \ -DG_DISABLE_SINGLE_INCLUDES \ -DGDK_PIXBUF_DISABLE_SINGLE_INCLUDES \ -DGTK_DISABLE_SINGLE_INCLUDES \ $(F_CFLAGS) \ $(LCMS_CFLAGS) \ $(WERROR) fspotlibdir = $(libdir)/f-spot fspotlib_LTLIBRARIES = libfspot.la libfspot_la_SOURCES = \ f-image-surface.c \ f-image-surface.h \ f-pixbuf-unsharp.c \ f-pixbuf-utils.c \ f-pixbuf-utils.h \ f-screen-utils.c libfspot_la_LIBADD = \ -lX11 \ $(F_LIBS) \ $(LCMS_LIBS) \ $(GIO_LIBS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/libfspot/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/libfspot/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-fspotlibLTLIBRARIES: $(fspotlib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(fspotlibdir)" || $(MKDIR_P) "$(DESTDIR)$(fspotlibdir)" @list='$(fspotlib_LTLIBRARIES)'; test -n "$(fspotlibdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(fspotlibdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(fspotlibdir)"; \ } uninstall-fspotlibLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(fspotlib_LTLIBRARIES)'; test -n "$(fspotlibdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(fspotlibdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(fspotlibdir)/$$f"; \ done clean-fspotlibLTLIBRARIES: -test -z "$(fspotlib_LTLIBRARIES)" || rm -f $(fspotlib_LTLIBRARIES) @list='$(fspotlib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libfspot.la: $(libfspot_la_OBJECTS) $(libfspot_la_DEPENDENCIES) $(LINK) -rpath $(fspotlibdir) $(libfspot_la_OBJECTS) $(libfspot_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/f-image-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/f-pixbuf-unsharp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/f-pixbuf-utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/f-screen-utils.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(fspotlibdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-fspotlibLTLIBRARIES clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-fspotlibLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-fspotlibLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean \ clean-fspotlibLTLIBRARIES clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-fspotlibLTLIBRARIES install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-fspotlibLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/lib/libfspot/f-pixbuf-unsharp.c0000644000175000017500000003064411417267577021223 0ustar00rubenruben00000000000000/* * f-pixbuf-unsharp.c * -- This is adapted from a plug-in for the GIMP 1.0 * http://www.stdout.org/~winston/gimp/unsharp.html * (now out of date) by * * Copyright (C) 1999 Winston Chang * * * * Copyright 2004 Novell, Inc. * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include #define ROUND(x) ((int) ((x) + 0.5)) /* ----------------------- gen_lookup_table ----------------------- */ /* generates a lookup table for every possible product of 0-255 and each value in the convolution matrix. The returned array is indexed first by matrix position, then by input multiplicand (?) value. */ static gdouble * gen_lookup_table (gdouble *cmatrix, gint cmatrix_length) { int i, j; gdouble* lookup_table = g_new (gdouble, cmatrix_length * 256); gdouble* lookup_table_p = lookup_table; gdouble* cmatrix_p = cmatrix; for (i=0; i y) { for (row = 0; row < y ; row++) { scale=0; /* find the scale factor */ for (j = 0; j < y ; j++) { /* if the index is in bounds, add it to the scale counter */ if ((j + cmatrix_length/2 - row >= 0) && (j + cmatrix_length/2 - row < cmatrix_length)) scale += cmatrix[j + cmatrix_length/2 - row]; } for (i = 0; i= row - cmatrix_length/2) && (j <= row + cmatrix_length/2)) sum += cur_col[j*bytes + i] * cmatrix[j]; } dest_col[row*bytes + i] = (guchar) ROUND (sum / scale); } } } else { /* for the edge condition, we only use available info and scale to one */ for (row = 0; row < cmatrix_middle; row++) { /* find scale factor */ scale=0; for (j = cmatrix_middle - row; j0; j--) { sum += *(ctable_p + *cur_col_p1); cur_col_p1 += bytes; ctable_p += 256; } cur_col_p++; *(dest_col_p++) = ROUND (sum); } } /* for the edge condition , we only use available info, and scale to one */ for (; row < y; row++) { /* find scale factor */ scale=0; for (j = 0; j< y-row + cmatrix_middle; j++) scale += cmatrix[j]; for (i = 0; i // // Copyright (c) 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.IO; using System.Net; namespace Hyena.Metrics { public class HttpPoster { private string url; private MetricsCollection metrics; public HttpPoster (string url, MetricsCollection metrics) { this.url = url; this.metrics = metrics; // Sending the Expect header causes lighttpd to fail with a 417 header. ServicePointManager.Expect100Continue = false; } public bool Post () { var request = (HttpWebRequest) WebRequest.Create (url); request.Timeout = 30 * 1000; request.Method = "POST"; request.KeepAlive = false; request.ContentType = "text/json"; request.AllowAutoRedirect = true; try { using (var stream = request.GetRequestStream ()) { using (var writer = new StreamWriter (stream)) { // TODO gzip the data writer.Write (metrics.ToJsonString ()); } } var response = (HttpWebResponse) request.GetResponse (); using (var strm = new StreamReader (response.GetResponseStream ())) { Console.WriteLine (strm.ReadToEnd ()); } return response.StatusCode == HttpStatusCode.OK; } catch (Exception e) { Log.Exception ("Error posting metrics", e); } return false; } } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Metrics/Sample.cs0000644000175000017500000000426211420634720024453 0ustar00rubenruben00000000000000// // Sample.cs // // Author: // Gabriel Burt // // Copyright (c) 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using Hyena.Data.Sqlite; namespace Hyena.Metrics { public class Sample { [DatabaseColumn (Constraints = DatabaseColumnConstraints.PrimaryKey)] protected long Id { get; set; } [DatabaseColumn] public string MetricName { get; protected set; } [DatabaseColumn] public DateTime Stamp { get; protected set; } [DatabaseColumn] public string Value { get; protected set; } // For SqliteModelProvider's use public Sample () {} public Sample (Metric metric, object value) { MetricName = metric.Name; Stamp = DateTime.Now; SetValue (value); } protected void SetValue (object value) { if (value == null) { Value = ""; } else if (value is DateTime) { Value = Hyena.DateTimeUtil.ToInvariantString ((DateTime) value); } else { Value = value.ToString (); } } } }f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Metrics/MetricsCollection.cs0000644000175000017500000000747411420634720026664 0ustar00rubenruben00000000000000// // MetricsCollection.cs // // Author: // Gabriel Burt // // Copyright (c) 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Linq; using System.Collections.Generic; using System.Text; using System.Reflection; using Hyena; using Hyena.Json; namespace Hyena.Metrics { public sealed class MetricsCollection : List, IDisposable { public static readonly int FormatVersion = 1; public string AnonymousUserId { get; private set; } public ISampleStore Store { get; private set; } public MetricsCollection (string uniqueUserId, ISampleStore store) { AnonymousUserId = uniqueUserId; Store = store; } public Metric Add (string name) { return Add (new Metric (name, Store)); } public Metric Add (string name, object value) { return Add (new Metric (name, Store, value)); } public Metric Add (string name, Func sampleFunc) { return Add (new Metric (name, Store, sampleFunc)); } public new Metric Add (Metric metric) { base.Add (metric); return metric; } public void Dispose () { foreach (var m in this) { m.Dispose (); } Clear (); } public string ToJsonString () { var report = new Dictionary (); report["ID"] = AnonymousUserId; report["Now"] = DateTimeUtil.ToInvariantString (DateTime.Now); report["FormatVersion"] = FormatVersion; var metrics = new Dictionary (); foreach (var metric in this.OrderBy (m => m.Name)) { metrics[metric.Name] = Store.GetFor (metric).Select (s => new object [] { DateTimeUtil.ToInvariantString (s.Stamp), s.Value ?? "" }); } report["Metrics"] = metrics; return new Serializer (report).Serialize (); } public void AddDefaults () { Add ("Env/OS Platform", PlatformDetection.SystemName); Add ("Env/OS Version", System.Environment.OSVersion); Add ("Env/Processor Count", System.Environment.ProcessorCount); Add ("Env/.NET Runtime Version", System.Environment.Version); Add ("Env/Debugging", ApplicationContext.Debugging); Add ("Env/CultureInfo", System.Globalization.CultureInfo.CurrentCulture.Name); foreach (var asm in AppDomain.CurrentDomain.GetAssemblies ()) { var name = asm.GetName (); Add (String.Format ("Assemblies/{0}", name.Name), name.Version); } } } }f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Metrics/MemorySampleStore.cs0000644000175000017500000000337111420634720026661 0ustar00rubenruben00000000000000// // MemorySampleStore.cs // // Author: // Gabriel Burt // // Copyright (c) 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Collections.Generic; namespace Hyena.Metrics { public class MemorySampleStore : Dictionary>, ISampleStore { public MemorySampleStore () { } public void Add (Sample sample) { if (!ContainsKey (sample.MetricName)) { this[sample.MetricName] = new List (); } this[sample.MetricName].Add (sample); } public IEnumerable GetFor (Metric metric) { return this[metric.Name]; } } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Metrics/Tests/0000777000175000017500000000000011503407406024006 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Metrics/Tests/MetricsTests.cs0000644000175000017500000000514211420634720026763 0ustar00rubenruben00000000000000// // MetricsTests.cs // // Author: // Gabriel Burt // // Copyright (C) 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using System.Linq; using System.IO; using NUnit.Framework; using Hyena; using Hyena.Json; using Hyena.Metrics; namespace Hyena.Tests { [TestFixture] public class MetricsTests { [Test] public void MetricsCollection () { string id = "myuniqueid"; var metrics = new MetricsCollection (id, new MemorySampleStore ()); Assert.AreEqual ("myuniqueid", metrics.AnonymousUserId); metrics.AddDefaults (); Assert.IsTrue (metrics.Count > 0); string metrics_str = metrics.ToJsonString (); Assert.IsTrue (metrics_str.Contains ("\"ID\":\"myuniqueid\"")); // tests/Makefile.am runs the tests with Locale=it_IT Assert.IsTrue (metrics_str.Contains ("it-IT")); // Make sure DateTime samples are saved as invariant strings var now = DateTime.Now; var time_metric = metrics.Add ("Foo", now); Assert.AreEqual (Hyena.DateTimeUtil.ToInvariantString (now), metrics.Store.GetFor (time_metric).First ().Value); // Make sure we can read the JSON back in var ds = new Json.Deserializer (); ds.SetInput (metrics.ToJsonString ()); var json_obj = ds.Deserialize () as JsonObject; Assert.AreEqual (id, json_obj["ID"]); Assert.IsTrue (json_obj["Metrics"] is JsonObject); } } } #endif f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Metrics/DbSampleStore.cs0000644000175000017500000000365211420634720025740 0ustar00rubenruben00000000000000// // DbSampleStore.cs // // Author: // Gabriel Burt // // Copyright (c) 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using Hyena.Data.Sqlite; using System.Collections.Generic; namespace Hyena.Metrics { public class DbSampleStore : SqliteModelProvider, ISampleStore { private HyenaSqliteConnection conn; public DbSampleStore (HyenaSqliteConnection conn, string tableName) : base(conn, tableName, true) { this.conn = conn; } public void Add (Sample sample) { Save (sample); } public IEnumerable GetFor (Metric metric) { return FetchAllMatching ("MetricName = ? ORDER BY Stamp ASC", metric.Name); } public void Clear () { conn.Execute (String.Format ("DELETE FROM {0}", TableName)); } } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Metrics/ISampleStore.cs0000644000175000017500000000262111420634720025576 0ustar00rubenruben00000000000000// // ISampleStore.cs // // Author: // Gabriel Burt // // Copyright (c) 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Collections.Generic; namespace Hyena.Metrics { public interface ISampleStore { void Add (Sample sample); IEnumerable GetFor (Metric metric); void Clear (); } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Metrics/Metric.cs0000644000175000017500000000526111420634720024455 0ustar00rubenruben00000000000000// // Metric.cs // // Author: // Gabriel Burt // // Copyright (c) 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Collections.Generic; using System.Reflection; namespace Hyena.Metrics { public sealed class Metric : IDisposable { public string Name { get; private set; } public bool CanTakeSample { get { return sample_func != null; } } private ISampleStore store; private Func sample_func; internal Metric (string name, ISampleStore store) { Name = name; this.store = store; } internal Metric (string name, ISampleStore store, Func sampleFunc) : this (name, store) { sample_func = sampleFunc; } internal Metric (string name, ISampleStore store, object value) : this (name, store) { PushSample (value); } public void Dispose () { } public void PushSample (object sampleValue) { try { store.Add (new Sample (this, sampleValue)); } catch (Exception e) { Log.Exception ("Error taking sample", e); } } public void TakeSample () { if (sample_func == null) { Log.Warning ("sampleFunc is null. Are you calling TakeSample on a non-event-driven metric?"); return; } try { store.Add (new Sample (this, sample_func ())); } catch (Exception e) { Log.Exception ("Error taking sample", e); } } } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/0000777000175000017500000000000011503407406023407 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/Sqlite.cs0000644000175000017500000006165011467745411025215 0ustar00rubenruben00000000000000// // Sqlite.cs // // Authors: // Gabriel Burt // // Copyright (C) 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Linq; using System.Text; using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using Hyena; namespace Hyena.Data.Sqlite { public class Connection : IDisposable { IntPtr ptr; internal IntPtr Ptr { get { return ptr; } } internal List Statements = new List (); public string DbPath { get; private set; } public long LastInsertRowId { get { return Native.sqlite3_last_insert_rowid (Ptr); } } public Connection (string dbPath) { DbPath = dbPath; CheckError (Native.sqlite3_open (Native.GetUtf8Bytes (dbPath), out ptr)); if (ptr == IntPtr.Zero) throw new Exception ("Unable to open connection"); Native.sqlite3_extended_result_codes (ptr, 1); AddFunction (); AddFunction (); AddFunction (); AddFunction (); } public void Dispose () { if (ptr != IntPtr.Zero) { lock (Statements) { var stmts = Statements.ToArray (); if (stmts.Length > 0) Hyena.Log.DebugFormat ("Connection disposing of {0} remaining statements", stmts.Length); foreach (var stmt in stmts) { stmt.Dispose (); } } CheckError (Native.sqlite3_close (ptr)); ptr = IntPtr.Zero; } } ~Connection () { Dispose (); } internal void CheckError (int errorCode) { CheckError (errorCode, ""); } internal void CheckError (int errorCode, string sql) { if (errorCode == 0 || errorCode == 100 || errorCode == 101) return; string errmsg = Native.sqlite3_errmsg16 (Ptr).PtrToString (); if (sql != null) { errmsg = String.Format ("{0} (SQL: {1})", errmsg, sql); } throw new SqliteException (errorCode, errmsg); } public Statement CreateStatement (string sql) { return new Statement (this, sql); } public QueryReader Query (string sql) { return new Statement (this, sql) { ReaderDisposes = true }.Query (); } public T Query (string sql) { using (var stmt = new Statement (this, sql)) { return stmt.Query (); } } public void Execute (string sql) { // TODO // * The application must insure that the 1st parameter to sqlite3_exec() is a valid and open database connection. // * The application must not close database connection specified by the 1st parameter to sqlite3_exec() while sqlite3_exec() is running. // * The application must not modify the SQL statement text passed into the 2nd parameter of sqlite3_exec() while sqlite3_exec() is running. CheckError (Native.sqlite3_exec (Ptr, Native.GetUtf8Bytes (sql), IntPtr.Zero, IntPtr.Zero, IntPtr.Zero), sql); } // We need to keep a managed ref to the function objects we create so // they won't get GC'd List functions = new List (); const int UTF16 = 4; public void AddFunction () where T : SqliteFunction { var type = typeof (T); var pr = (SqliteFunctionAttribute)type.GetCustomAttributes (typeof (SqliteFunctionAttribute), false).First (); var f = (SqliteFunction) Activator.CreateInstance (typeof (T)); f._InvokeFunc = (pr.FuncType == FunctionType.Scalar) ? new SqliteCallback(f.ScalarCallback) : null; f._StepFunc = (pr.FuncType == FunctionType.Aggregate) ? new SqliteCallback(f.StepCallback) : null; f._FinalFunc = (pr.FuncType == FunctionType.Aggregate) ? new SqliteFinalCallback(f.FinalCallback) : null; f._CompareFunc = (pr.FuncType == FunctionType.Collation) ? new SqliteCollation(f.CompareCallback) : null; if (pr.FuncType != FunctionType.Collation) { CheckError (Native.sqlite3_create_function16 ( ptr, pr.Name, pr.Arguments, UTF16, IntPtr.Zero, f._InvokeFunc, f._StepFunc, f._FinalFunc )); } else { CheckError (Native.sqlite3_create_collation16 ( ptr, pr.Name, UTF16, IntPtr.Zero, f._CompareFunc )); } functions.Add (f); } public void RemoveFunction () where T : SqliteFunction { var type = typeof (T); var pr = (SqliteFunctionAttribute)type.GetCustomAttributes (typeof (SqliteFunctionAttribute), false).First (); if (pr.FuncType != FunctionType.Collation) { CheckError (Native.sqlite3_create_function16 ( ptr, pr.Name, pr.Arguments, UTF16, IntPtr.Zero, null, null, null )); } else { CheckError (Native.sqlite3_create_collation16 ( ptr, pr.Name, UTF16, IntPtr.Zero, null )); } var func = functions.FirstOrDefault (f => f is T); if (func != null) { functions.Remove (func); } } } public class SqliteException : Exception { public int ErrorCode { get; private set; } public SqliteException (int errorCode, string message) : base (String.Format ("Sqlite error {0}: {1}", errorCode, message)) { ErrorCode = errorCode; } } public interface IDataReader : IDisposable { bool Read (); object this[int i] { get; } object this[string columnName] { get; } T Get (int i); T Get (string columnName); object Get (int i, Type asType); int FieldCount { get; } string [] FieldNames { get; } } public class Statement : IDisposable, IEnumerable { IntPtr ptr; Connection connection; bool bound; QueryReader reader; bool disposed; internal bool Reading { get; set; } internal IntPtr Ptr { get { return ptr; } } internal bool Bound { get { return bound; } } internal Connection Connection { get { return connection; } } public bool IsDisposed { get { return disposed; } } public string CommandText { get; private set; } public int ParameterCount { get; private set; } public bool ReaderDisposes { get; internal set; } internal event EventHandler Disposed; internal Statement (Connection connection, string sql) { CommandText = sql; this.connection = connection; IntPtr pzTail = IntPtr.Zero; CheckError (Native.sqlite3_prepare16_v2 (connection.Ptr, sql, -1, out ptr, out pzTail)); lock (Connection.Statements) { Connection.Statements.Add (this); } if (pzTail != IntPtr.Zero && Marshal.ReadByte (pzTail) != 0) { Dispose (); throw new ArgumentException ("sql", String.Format ("This sqlite binding does not support multiple commands in one statement:\n {0}", sql)); } ParameterCount = Native.sqlite3_bind_parameter_count (ptr); reader = new QueryReader () { Statement = this }; } internal void CheckReading () { CheckDisposed (); if (!Reading) { throw new InvalidOperationException ("Statement is not readable"); } } internal void CheckDisposed () { if (disposed) { throw new InvalidOperationException ("Statement is disposed"); } } private string ShortSql { get { return CommandText.Substring (0, Math.Min (CommandText.Length, 20)); } } public void Dispose () { if (disposed) return; disposed = true; if (ptr != IntPtr.Zero) { // Don't check for error here, because if the most recent evaluation had an error finalize will return it too // See http://sqlite.org/c3ref/finalize.html Native.sqlite3_finalize (ptr); ptr = IntPtr.Zero; lock (Connection.Statements) { Connection.Statements.Remove (this); } var h = Disposed; if (h != null) { h (this, EventArgs.Empty); } } } ~Statement () { Dispose (); } object [] null_val = new object [] { null }; public Statement Bind (params object [] vals) { Reset (); if (vals == null && ParameterCount == 1) vals = null_val; if (vals == null || vals.Length != ParameterCount || ParameterCount == 0) throw new ArgumentException ("vals", String.Format ("Statement has {0} parameters", ParameterCount)); for (int i = 1; i <= vals.Length; i++) { int code = 0; object o = SqliteUtils.ToDbFormat (vals[i - 1]); if (o == null) code = Native.sqlite3_bind_null (Ptr, i); else if (o is double) code = Native.sqlite3_bind_double (Ptr, i, (double)o); else if (o is float) code = Native.sqlite3_bind_double (Ptr, i, (double)(float)o); else if (o is int) code = Native.sqlite3_bind_int (Ptr, i, (int)o); else if (o is uint) code = Native.sqlite3_bind_int (Ptr, i, (int)(uint)o); else if (o is long) code = Native.sqlite3_bind_int64 (Ptr, i, (long)o); else if (o is ulong) code = Native.sqlite3_bind_int64 (Ptr, i, (long)(ulong)o); else if (o is byte[]) { byte [] bytes = o as byte[]; code = Native.sqlite3_bind_blob (Ptr, i, bytes, bytes.Length, (IntPtr)(-1)); } else { // C# strings are UTF-16, so 2 bytes per char // -1 for the last arg is the TRANSIENT destructor type so that sqlite will make its own copy of the string string str = (o as string) ?? o.ToString (); code = Native.sqlite3_bind_text16 (Ptr, i, str, str.Length * 2, (IntPtr)(-1)); } CheckError (code); } bound = true; return this; } internal void CheckError (int code) { connection.CheckError (code, CommandText); } private void Reset () { CheckDisposed (); if (Reading) { throw new InvalidOperationException ("Can't reset statement while it's being read; make sure to Dispose any IDataReaders"); } CheckError (Native.sqlite3_reset (ptr)); } public IEnumerator GetEnumerator () { Reset (); while (reader.Read ()) { yield return reader; } } IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator (); } public Statement Execute () { Reset (); using (reader) { reader.Read (); } return this; } public T Query () { Reset (); using (reader) { return reader.Read () ? reader.Get (0) : (T) SqliteUtils.FromDbFormat (null); } } public QueryReader Query () { Reset (); return reader; } } public class QueryReader : IDataReader { Dictionary columns; int column_count = -1; internal Statement Statement { get; set; } IntPtr Ptr { get { return Statement.Ptr; } } public void Dispose () { Statement.Reading = false; if (Statement.ReaderDisposes) { Statement.Dispose (); } } public int FieldCount { get { if (column_count == -1) { Statement.CheckDisposed (); column_count = Native.sqlite3_column_count (Ptr); } return column_count; } } string [] field_names; public string [] FieldNames { get { if (field_names == null) { field_names = Columns.Keys.OrderBy (f => Columns[f]).ToArray (); } return field_names; } } public bool Read () { Statement.CheckDisposed (); if (Statement.ParameterCount > 0 && !Statement.Bound) throw new InvalidOperationException ("Statement not bound"); int code = Native.sqlite3_step (Ptr); if (code == ROW) { Statement.Reading = true; return true; } else { Statement.Reading = false; Statement.CheckError (code); return false; } } public object this[int i] { get { Statement.CheckReading (); int type = Native.sqlite3_column_type (Ptr, i); switch (type) { case SQLITE_INTEGER: return Native.sqlite3_column_int64 (Ptr, i); case SQLITE_FLOAT: return Native.sqlite3_column_double (Ptr, i); case SQLITE3_TEXT: return Native.sqlite3_column_text16 (Ptr, i).PtrToString (); case SQLITE_BLOB: int num_bytes = Native.sqlite3_column_bytes (Ptr, i); if (num_bytes == 0) return null; byte [] bytes = new byte[num_bytes]; Marshal.Copy (Native.sqlite3_column_blob (Ptr, i), bytes, 0, num_bytes); return bytes; case SQLITE_NULL: return null; default: throw new Exception (String.Format ("Column is of unknown type {0}", type)); } } } public object this[string columnName] { get { return this[GetColumnIndex (columnName)]; } } public T Get (int i) { return (T) Get (i, typeof(T)); } public object Get (int i, Type asType) { return GetAs (this[i], asType); } internal static object GetAs (object o, Type type) { if (o != null && o.GetType () == type) return o; if (o == null) o = null; else if (type == typeof(uint)) o = (uint)(long)o; else if (type == typeof(ulong)) o = (ulong)(long)o; else if (type == typeof(float)) o = (float)(double)o; if (o != null && o.GetType () == type) return o; return SqliteUtils.FromDbFormat (type, o); } static Type long_type = typeof(long); static Type double_type = typeof(double); static Type [] long_types = { typeof(int), typeof(uint), typeof(ulong) }; static Type [] double_types = { typeof(float) }; static Type [] self_types = { typeof(string), typeof(byte[]), long_type, double_type}; static Type DbTypeFor (Type type) { if (long_types.Contains (type)) return typeof(int); else if (double_types.Contains (type)) return double_type; else if (self_types.Contains (type)) return type; else return null; } public T Get (string columnName) { return Get (GetColumnIndex (columnName)); } private Dictionary Columns { get { if (columns == null) { columns = new Dictionary (); for (int i = 0; i < FieldCount; i++) { columns[Native.sqlite3_column_name16 (Ptr, i).PtrToString ()] = i; } } return columns; } } private int GetColumnIndex (string columnName) { Statement.CheckReading (); int col = 0; if (!Columns.TryGetValue (columnName, out col)) throw new ArgumentException ("columnName"); return col; } const int SQLITE_INTEGER = 1; const int SQLITE_FLOAT = 2; const int SQLITE3_TEXT = 3; const int SQLITE_BLOB = 4; const int SQLITE_NULL = 5; const int ROW = 100; const int DONE = 101; } internal static class Native { const string SQLITE_DLL = "sqlite3"; // Connection functions [DllImport(SQLITE_DLL)] internal static extern int sqlite3_open(byte [] utf8DbPath, out IntPtr db); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_close(IntPtr db); [DllImport(SQLITE_DLL)] internal static extern long sqlite3_last_insert_rowid (IntPtr db); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_busy_timeout(IntPtr db, int ms); [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)] internal static extern IntPtr sqlite3_errmsg16(IntPtr db); [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)] internal static extern int sqlite3_create_function16(IntPtr db, string strName, int nArgs, int eTextRep, IntPtr app, SqliteCallback func, SqliteCallback funcstep, SqliteFinalCallback funcfinal); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_aggregate_count(IntPtr context); [DllImport(SQLITE_DLL)] internal static extern IntPtr sqlite3_aggregate_context(IntPtr context, int nBytes); [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)] internal static extern int sqlite3_create_collation16(IntPtr db, string strName, int eTextRep, IntPtr ctx, SqliteCollation fcompare); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_extended_result_codes (IntPtr db, int onoff); // Statement functions [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)] internal static extern int sqlite3_prepare16_v2(IntPtr db, string pSql, int nBytes, out IntPtr stmt, out IntPtr ptrRemain); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_step(IntPtr stmt); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_column_count(IntPtr stmt); [DllImport(SQLITE_DLL)] internal static extern IntPtr sqlite3_column_name16(IntPtr stmt, int index); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_column_type(IntPtr stmt, int iCol); [DllImport(SQLITE_DLL)] internal static extern IntPtr sqlite3_column_blob(IntPtr stmt, int iCol); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_column_bytes(IntPtr stmt, int iCol); [DllImport(SQLITE_DLL)] internal static extern double sqlite3_column_double(IntPtr stmt, int iCol); [DllImport(SQLITE_DLL)] internal static extern long sqlite3_column_int64(IntPtr stmt, int iCol); [DllImport(SQLITE_DLL)] internal static extern IntPtr sqlite3_column_text16(IntPtr stmt, int iCol); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_finalize(IntPtr stmt); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_reset(IntPtr stmt); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_exec(IntPtr db, byte [] sql, IntPtr callback, IntPtr cbArg, IntPtr errPtr); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_bind_parameter_index(IntPtr stmt, byte [] paramName); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_bind_parameter_count(IntPtr stmt); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_bind_blob(IntPtr stmt, int param, byte[] val, int nBytes, IntPtr destructorType); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_bind_double(IntPtr stmt, int param, double val); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_bind_int(IntPtr stmt, int param, int val); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_bind_int64(IntPtr stmt, int param, long val); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_bind_null(IntPtr stmt, int param); [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)] internal static extern int sqlite3_bind_text16 (IntPtr stmt, int param, string val, int numBytes, IntPtr destructorType); //DllImport(SQLITE_DLL)] //internal static extern int sqlite3_bind_zeroblob(IntPtr stmt, int, int n); // Context functions [DllImport(SQLITE_DLL)] internal static extern void sqlite3_result_blob(IntPtr context, byte[] value, int nSize, IntPtr pvReserved); [DllImport(SQLITE_DLL)] internal static extern void sqlite3_result_double(IntPtr context, double value); [DllImport(SQLITE_DLL)] internal static extern void sqlite3_result_error(IntPtr context, byte[] strErr, int nLen); [DllImport(SQLITE_DLL)] internal static extern void sqlite3_result_int(IntPtr context, int value); [DllImport(SQLITE_DLL)] internal static extern void sqlite3_result_int64(IntPtr context, Int64 value); [DllImport(SQLITE_DLL)] internal static extern void sqlite3_result_null(IntPtr context); [DllImport(SQLITE_DLL)] internal static extern void sqlite3_result_text(IntPtr context, byte[] value, int nLen, IntPtr pvReserved); [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)] internal static extern void sqlite3_result_error16(IntPtr context, string strName, int nLen); [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)] internal static extern void sqlite3_result_text16(IntPtr context, string strName, int nLen, IntPtr pvReserved); // Value methods [DllImport(SQLITE_DLL)] internal static extern IntPtr sqlite3_value_blob(IntPtr p); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_value_bytes(IntPtr p); [DllImport(SQLITE_DLL)] internal static extern double sqlite3_value_double(IntPtr p); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_value_int(IntPtr p); [DllImport(SQLITE_DLL)] internal static extern Int64 sqlite3_value_int64(IntPtr p); [DllImport(SQLITE_DLL)] internal static extern int sqlite3_value_type(IntPtr p); [DllImport(SQLITE_DLL)] internal static extern IntPtr sqlite3_value_text16(IntPtr p); internal static string PtrToString (this IntPtr ptr) { return System.Runtime.InteropServices.Marshal.PtrToStringUni (ptr); } internal static byte [] GetUtf8Bytes (string str) { return Encoding.UTF8.GetBytes (str + '\0'); } } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/SqliteFunctionAttribute.cs0000644000175000017500000000566011467745411030606 0ustar00rubenruben00000000000000// // Derived from // Mono.Data.Sqlite.SQLiteFunctionAttribute.cs // // Author(s): // Robert Simpson (robert@blackcastlesoft.com) // // Adapted and modified for the Mono Project by // Marek Habersack (grendello@gmail.com) // // // Copyright (C) 2006 Novell, Inc (http://www.novell.com) // Copyright (C) 2007 Marek Habersack // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // /******************************************************** * ADO.NET 2.0 Data Provider for Sqlite Version 3.X * Written by Robert Simpson (robert@blackcastlesoft.com) * * Released to the public domain, use at your own risk! ********************************************************/ using System; using System.Runtime.InteropServices; namespace Hyena.Data.Sqlite { /// /// A simple custom attribute to enable us to easily find user-defined functions in /// the loaded assemblies and initialize them in Sqlite as connections are made. /// [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] public class SqliteFunctionAttribute : Attribute { internal Type _instanceType; /// /// Default constructor, initializes the internal variables for the function. /// public SqliteFunctionAttribute() { Name = ""; Arguments = -1; FuncType = FunctionType.Scalar; } /// /// The function's name as it will be used in Sqlite command text. /// public string Name { get; set; } /// /// The number of arguments this function expects. -1 if the number of arguments is variable. /// public int Arguments { get; set; } /// /// The type of function this implementation will be. /// public FunctionType FuncType { get; set; } } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/HyenaSqliteCommand.cs0000644000175000017500000002261011467745411027472 0ustar00rubenruben00000000000000// // HyenaSqliteCommand.cs // // Authors: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.IO; using System.Text; using System.Threading; namespace Hyena.Data.Sqlite { public class CommandExecutedArgs : EventArgs { public CommandExecutedArgs (string sql, int ms) { Sql = sql; Ms = ms; } public string Sql; public int Ms; } public class HyenaSqliteCommand { private object result = null; private Exception execution_exception = null; private bool finished = false; private ManualResetEvent finished_event = new ManualResetEvent (true); private string command; private string command_format = null; private string command_formatted = null; private int parameter_count = 0; private object [] current_values; private int ticks; public string Text { get { return command; } } public bool ReaderDisposes { get; set; } internal HyenaCommandType CommandType; public HyenaSqliteCommand (string command) { this.command = command; } public HyenaSqliteCommand (string command, params object [] param_values) { this.command = command; ApplyValues (param_values); } internal void Execute (HyenaSqliteConnection hconnection, Connection connection) { if (finished) { throw new Exception ("Command is already set to finished; result needs to be claimed before command can be rerun"); } execution_exception = null; result = null; int execution_ms = 0; string command_text = CurrentSqlText; try { ticks = System.Environment.TickCount; switch (CommandType) { case HyenaCommandType.Reader: using (var reader = connection.Query (command_text)) { result = new ArrayDataReader (reader); } break; case HyenaCommandType.Scalar: result = connection.Query (command_text); break; case HyenaCommandType.Execute: default: connection.Execute (command_text); result = connection.LastInsertRowId; break; } execution_ms = System.Environment.TickCount - ticks; if (log_all) { Log.DebugFormat ("Executed in {0}ms {1}", execution_ms, command_text); } } catch (Exception e) { Log.DebugFormat ("Exception executing command: {0}", command_text); Log.Exception (e); execution_exception = e; } // capture the text string raise_text = null; if (raise_command_executed && execution_ms >= raise_command_executed_threshold_ms) { raise_text = Text; } finished_event.Reset (); finished = true; if (raise_command_executed && execution_ms >= raise_command_executed_threshold_ms) { var handler = CommandExecuted; if (handler != null) { // Don't raise this on this thread; this thread is dedicated for use by the db connection ThreadAssist.ProxyToMain (delegate { handler (this, new CommandExecutedArgs (raise_text, execution_ms)); }); } } } internal object WaitForResult (HyenaSqliteConnection conn) { while (!finished) { conn.ResultReadySignal.WaitOne (); } // Reference the results since they could be overwritten object ret = result; var exception = execution_exception; // Reset to false in case run again finished = false; conn.ClaimResult (); finished_event.Set (); if (exception != null) { throw exception; } return ret; } internal void WaitIfNotFinished () { finished_event.WaitOne (); } internal HyenaSqliteCommand ApplyValues (params object [] param_values) { if (command_format == null) { CreateParameters (); } // Special case for if a single null values is the paramter array if (parameter_count == 1 && param_values == null) { current_values = new object [] { "NULL" }; command_formatted = null; return this; } if (param_values.Length != parameter_count) { throw new ArgumentException (String.Format ( "Command {2} has {0} parameters, but {1} values given.", parameter_count, param_values.Length, command )); } // Transform values as necessary - not needed for numerical types for (int i = 0; i < parameter_count; i++) { param_values[i] = SqlifyObject (param_values[i]); } current_values = param_values; command_formatted = null; return this; } public static object SqlifyObject (object o) { if (o is string) { return String.Format ("'{0}'", (o as string).Replace ("'", "''")); } else if (o is DateTime) { return DateTimeUtil.FromDateTime ((DateTime) o); } else if (o is bool) { return ((bool)o) ? "1" : "0"; } else if (o == null) { return "NULL"; } else if (o is byte[]) { string hex = BitConverter.ToString (o as byte[]).Replace ("-", ""); return String.Format ("X'{0}'", hex); } else if (o is Array) { StringBuilder sb = new StringBuilder (); bool first = true; foreach (object i in (o as Array)) { if (!first) sb.Append (","); else first = false; sb.Append (SqlifyObject (i)); } return sb.ToString (); } else { return o; } } private string CurrentSqlText { get { if (command_format == null) { return command; } if (command_formatted == null) { command_formatted = String.Format (System.Globalization.CultureInfo.InvariantCulture, command_format, current_values); } return command_formatted; } } private void CreateParameters () { StringBuilder sb = new StringBuilder (); foreach (char c in command) { if (c == '?') { sb.Append ('{'); sb.Append (parameter_count++); sb.Append ('}'); } else { sb.Append (c); } } command_format = sb.ToString (); } #region Static Debugging Facilities private static bool log_all = false; public static bool LogAll { get { return log_all; } set { log_all = value; } } public delegate void CommandExecutedHandler (object o, CommandExecutedArgs args); public static event CommandExecutedHandler CommandExecuted; private static bool raise_command_executed = false; public static bool RaiseCommandExecuted { get { return raise_command_executed; } set { raise_command_executed = value; } } private static int raise_command_executed_threshold_ms = 400; public static int RaiseCommandExecutedThresholdMs { get { return raise_command_executed_threshold_ms; } set { raise_command_executed_threshold_ms = value; } } #endregion } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/SqliteModelCache.cs0000644000175000017500000004675211467745411027130 0ustar00rubenruben00000000000000// // SqliteModelCache.cs // // Authors: // Gabriel Burt // Scott Peterson // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.Text; using Hyena.Query; namespace Hyena.Data.Sqlite { public class SqliteModelCache : DictionaryModelCache where T : ICacheableItem, new () { private HyenaSqliteConnection connection; private ICacheableDatabaseModel model; private SqliteModelProvider provider; private HyenaSqliteCommand select_range_command; private HyenaSqliteCommand select_single_command; private HyenaSqliteCommand select_first_command; private HyenaSqliteCommand count_command; private HyenaSqliteCommand delete_selection_command; private HyenaSqliteCommand save_selection_command; private HyenaSqliteCommand get_selection_command; private HyenaSqliteCommand indexof_command; private string select_str; private string reload_sql; private string last_indexof_where_fragment; private long uid; private long selection_uid; private long rows; // private bool warm; private long first_order_id; public event Action AggregatesUpdated; public SqliteModelCache (HyenaSqliteConnection connection, string uuid, ICacheableDatabaseModel model, SqliteModelProvider provider) : base (model) { this.connection = connection; this.model = model; this.provider = provider; CheckCacheTable (); if (model.SelectAggregates != null) { if (model.CachesJoinTableEntries) { count_command = new HyenaSqliteCommand (String.Format (@" SELECT count(*), {0} FROM {1}{2} j WHERE j.{4} IN (SELECT ItemID FROM {3} WHERE ModelID = ?) AND {5} = j.{6}", model.SelectAggregates, // eg sum(FileSize), sum(Duration) provider.TableName, // eg CoreTracks model.JoinFragment, // eg , CorePlaylistEntries CacheTableName, // eg CoreCache model.JoinPrimaryKey, // eg EntryID provider.PrimaryKey, // eg CoreTracks.TrackID model.JoinColumn // eg TrackID )); } else { count_command = new HyenaSqliteCommand (String.Format ( "SELECT count(*), {0} FROM {1} WHERE {2} IN (SELECT ItemID FROM {3} WHERE ModelID = ?)", model.SelectAggregates, provider.TableName, provider.PrimaryKey, CacheTableName )); } } else { count_command = new HyenaSqliteCommand (String.Format ( "SELECT COUNT(*) FROM {0} WHERE ModelID = ?", CacheTableName )); } uid = FindOrCreateCacheModelId (String.Format ("{0}-{1}", uuid, typeof(T).Name)); if (model.Selection != null) { selection_uid = FindOrCreateCacheModelId (String.Format ("{0}-{1}-Selection", uuid, typeof(T).Name)); } if (model.CachesJoinTableEntries) { select_str = String.Format ( @"SELECT {0} {10}, OrderID, {5}.ItemID FROM {1} INNER JOIN {2} ON {3} = {2}.{4} INNER JOIN {5} ON {2}.{6} = {5}.ItemID {11} WHERE {5}.ModelID = {7} {8} {9}", provider.Select, provider.From, model.JoinTable, provider.PrimaryKey, model.JoinColumn, CacheTableName, model.JoinPrimaryKey, uid, String.IsNullOrEmpty (provider.Where) ? null : "AND", provider.Where, "{0}", "{1}" ); reload_sql = String.Format (@" DELETE FROM {0} WHERE ModelID = {1}; INSERT INTO {0} (ModelID, ItemID) SELECT {1}, {2} ", CacheTableName, uid, model.JoinPrimaryKey ); } else if (model.CachesValues) { // The duplication of OrderID/ItemID in the select below is intentional! // The first is used construct the QueryFilterInfo value, the last internally // to this class select_str = String.Format ( @"SELECT OrderID, ItemID {2}, OrderID, ItemID FROM {0} {3} WHERE {0}.ModelID = {1}", CacheTableName, uid, "{0}", "{1}" ); reload_sql = String.Format (@" DELETE FROM {0} WHERE ModelID = {1}; INSERT INTO {0} (ModelID, ItemID) SELECT DISTINCT {1}, {2} ", CacheTableName, uid, provider.Select ); } else { select_str = String.Format ( @"SELECT {0} {7}, OrderID, {2}.ItemID FROM {1} INNER JOIN {2} ON {3} = {2}.ItemID {8} WHERE {2}.ModelID = {4} {5} {6}", provider.Select, provider.From, CacheTableName, provider.PrimaryKey, uid, String.IsNullOrEmpty (provider.Where) ? String.Empty : "AND", provider.Where, "{0}", "{1}" ); reload_sql = String.Format (@" DELETE FROM {0} WHERE ModelID = {1}; INSERT INTO {0} (ModelID, ItemID) SELECT {1}, {2} ", CacheTableName, uid, provider.PrimaryKey ); } select_single_command = new HyenaSqliteCommand ( String.Format (@" SELECT OrderID FROM {0} WHERE ModelID = {1} AND ItemID = ?", CacheTableName, uid ) ); select_range_command = new HyenaSqliteCommand ( String.Format (String.Format ("{0} {1}", select_str, "LIMIT ?, ?"), null, null) ); select_first_command = new HyenaSqliteCommand ( String.Format ( "SELECT OrderID FROM {0} WHERE ModelID = {1} LIMIT 1", CacheTableName, uid ) ); if (model.Selection != null) { delete_selection_command = new HyenaSqliteCommand (String.Format ( "DELETE FROM {0} WHERE ModelID = {1}", CacheTableName, selection_uid )); save_selection_command = new HyenaSqliteCommand (String.Format ( "INSERT INTO {0} (ModelID, ItemID) SELECT {1}, ItemID FROM {0} WHERE ModelID = {2} LIMIT ?, ?", CacheTableName, selection_uid, uid )); get_selection_command = new HyenaSqliteCommand (String.Format ( "SELECT OrderID FROM {0} WHERE ModelID = {1} AND ItemID IN (SELECT ItemID FROM {0} WHERE ModelID = {2})", CacheTableName, uid, selection_uid )); } } private bool has_select_all_item = false; public bool HasSelectAllItem { get { return has_select_all_item; } set { has_select_all_item = value; } } // The idea behind this was we could preserve the CoreCache table across restarts of Banshee, // and indicate whether the cache was already primed via this property. It's not used, and may never be. public bool Warm { //get { return warm; } get { return false; } } public long Count { get { return rows; } } public long CacheId { get { return uid; } } protected virtual string CacheModelsTableName { get { return "HyenaCacheModels"; } } protected virtual string CacheTableName { get { return "HyenaCache"; } } private long FirstOrderId { get { lock (this) { if (first_order_id == -1) { first_order_id = connection.Query (select_first_command); } return first_order_id; } } } public long IndexOf (string where_fragment, long offset) { if (String.IsNullOrEmpty (where_fragment)) { return -1; } if (!where_fragment.Equals (last_indexof_where_fragment)) { last_indexof_where_fragment = where_fragment; if (!where_fragment.Trim ().ToLower ().StartsWith ("and ")) { where_fragment = " AND " + where_fragment; } string sql = String.Format ("{0} {1} LIMIT ?, 1", select_str, where_fragment); indexof_command = new HyenaSqliteCommand (String.Format (sql, null, null)); } lock (this) { using (IDataReader reader = connection.Query (indexof_command, offset)) { if (reader.Read ()) { long target_id = (long) reader[reader.FieldCount - 2]; if (target_id == 0) { return -1; } return target_id - FirstOrderId; } } return -1; } } public long IndexOf (ICacheableItem item) { if (item == null || item.CacheModelId != CacheId) { return -1; } return IndexOf (item.CacheEntryId); } public long IndexOf (object item_id) { lock (this) { if (rows == 0) { return -1; } long target_id = connection.Query (select_single_command, item_id); if (target_id == 0) { return -1; } return target_id - FirstOrderId; } } public T GetSingleWhere (string conditionOrderFragment, params object [] args) { return GetSingle (null, null, conditionOrderFragment, args); } private HyenaSqliteCommand get_single_command; private string last_get_single_select_fragment, last_get_single_condition_fragment, last_get_single_from_fragment; public T GetSingle (string selectFragment, string fromFragment, string conditionOrderFragment, params object [] args) { if (selectFragment != last_get_single_select_fragment || conditionOrderFragment != last_get_single_condition_fragment ||fromFragment != last_get_single_from_fragment || get_single_command == null) { last_get_single_select_fragment = selectFragment; last_get_single_condition_fragment = conditionOrderFragment; last_get_single_from_fragment = fromFragment; get_single_command = new HyenaSqliteCommand (String.Format (String.Format ( "{0} {1} {2}", select_str, conditionOrderFragment, "LIMIT 1"), selectFragment, fromFragment )); } using (IDataReader reader = connection.Query (get_single_command, args)) { if (reader.Read ()) { T item = provider.Load (reader); item.CacheEntryId = reader[reader.FieldCount - 1]; item.CacheModelId = uid; return item; } } return default(T); } private HyenaSqliteCommand last_reload_command; private string last_reload_fragment; public override void Reload () { lock (this) { if (last_reload_fragment != model.ReloadFragment || last_reload_command == null) { last_reload_fragment = model.ReloadFragment; last_reload_command = new HyenaSqliteCommand (String.Format ("{0}{1}", reload_sql, last_reload_fragment)); } Clear (); //Log.DebugFormat ("Reloading {0} with {1}", model, last_reload_command.Text); connection.Execute (last_reload_command); } } public override void Clear () { lock (this) { base.Clear (); first_order_id = -1; } } private bool saved_selection = false; private ICacheableItem saved_focus_item = null; public void SaveSelection () { if (model.Selection != null && model.Selection.Count > 0 && !(has_select_all_item && model.Selection.AllSelected)) { connection.Execute (delete_selection_command); saved_selection = true; if (!has_select_all_item && model.Selection.FocusedIndex != -1) { T item = GetValue (model.Selection.FocusedIndex); if (item != null) { saved_focus_item = GetValue (model.Selection.FocusedIndex); } } long start, end; foreach (Hyena.Collections.RangeCollection.Range range in model.Selection.Ranges) { start = range.Start; end = range.End; // Compensate for the first, fake 'All *' item if (has_select_all_item) { start -= 1; end -= 1; } connection.Execute (save_selection_command, start, end - start + 1); } } else { saved_selection = false; } } public void RestoreSelection () { if (saved_selection) { long selected_id = -1; long first_id = FirstOrderId; // Compensate for the first, fake 'All *' item if (has_select_all_item) { first_id -= 1; } model.Selection.Clear (false); foreach (long order_id in connection.QueryEnumerable (get_selection_command)) { selected_id = order_id - first_id; model.Selection.QuietSelect ((int)selected_id); } if (has_select_all_item && model.Selection.Count == 0) { model.Selection.QuietSelect (0); } if (saved_focus_item != null) { long i = IndexOf (saved_focus_item); if (i != -1) { // TODO get rid of int cast model.Selection.FocusedIndex = (int)i; } } saved_selection = false; saved_focus_item = null; } } protected override void FetchSet (long offset, long limit) { lock (this) { using (IDataReader reader = connection.Query (select_range_command, offset, limit)) { T item; while (reader.Read ()) { if (!ContainsKey (offset)) { item = provider.Load (reader); item.CacheEntryId = reader[reader.FieldCount - 1]; item.CacheModelId = uid; Add (offset, item); } offset++; } } } } public void UpdateAggregates () { rows = UpdateAggregates (AggregatesUpdated, uid); } public void UpdateSelectionAggregates (Action handler) { SaveSelection (); UpdateAggregates (handler, selection_uid); } private long UpdateAggregates (Action handler, long model_id) { long aggregate_rows = 0; using (IDataReader reader = connection.Query (count_command, model_id)) { if (reader.Read ()) { aggregate_rows = Convert.ToInt64 (reader[0]); if (handler != null) { handler (reader); } } } return aggregate_rows; } private long FindOrCreateCacheModelId (string id) { long model_id = connection.Query (String.Format ( "SELECT CacheID FROM {0} WHERE ModelID = '{1}'", CacheModelsTableName, id )); if (model_id == 0) { //Console.WriteLine ("Didn't find existing cache for {0}, creating", id); model_id = connection.Execute (new HyenaSqliteCommand (String.Format ( "INSERT INTO {0} (ModelID) VALUES (?)", CacheModelsTableName ), id )); } else { //Console.WriteLine ("Found existing cache for {0}: {1}", id, uid); //warm = true; //Clear (); //UpdateAggregates (); } return model_id; } private static string checked_cache_table; private void CheckCacheTable () { if (CacheTableName == checked_cache_table) { return; } if (!connection.TableExists (CacheTableName)) { connection.Execute (String.Format (@" CREATE TEMP TABLE {0} ( OrderID INTEGER PRIMARY KEY, ModelID INTEGER, ItemID TEXT)", CacheTableName )); } if (!connection.TableExists (CacheModelsTableName)) { connection.Execute (String.Format ( "CREATE TABLE {0} (CacheID INTEGER PRIMARY KEY, ModelID TEXT UNIQUE)", CacheModelsTableName )); } checked_cache_table = CacheTableName; } } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/ICacheableDatabaseModel.cs0000644000175000017500000000314311467745411030313 0ustar00rubenruben00000000000000// // ICacheableDatabaseModel.cs // // Author: // Gabriel Burt // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using Hyena.Data; namespace Hyena.Data.Sqlite { public interface ICacheableDatabaseModel : ICacheableModel { string ReloadFragment { get; } string SelectAggregates { get; } string JoinTable { get; } string JoinFragment { get; } string JoinPrimaryKey { get; } string JoinColumn { get; } bool CachesJoinTableEntries { get; } bool CachesValues { get; } } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/SqliteUtils.cs0000644000175000017500000002040111467745411026223 0ustar00rubenruben00000000000000// // SqliteUtils.cs // // Author: // Scott Peterson // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Reflection; using System.Text; using System.Collections.Generic; namespace Hyena.Data.Sqlite { public static class SqliteUtils { internal static string GetType (Type type) { if (type == typeof (string)) { return "TEXT"; } else if (type == typeof (int) || type == typeof (long) || type == typeof (bool) || type == typeof (DateTime) || type == typeof (TimeSpan) || type.IsEnum) { return "INTEGER"; } else if (type == typeof (int?) || type == typeof (long?) || type == typeof (bool?) || type == typeof (uint?)) { return "INTEGER NULL"; } else if (type == typeof (byte[])) { return "BLOB"; } else if (type == typeof (double)) { return "REAL"; } else if (type == typeof (double?)) { return "REAL NULL"; } else { throw new Exception (String.Format ( "The type {0} cannot be bound to a database column.", type.Name)); } } public static object ToDbFormat (object value) { if (value == null) return null; return ToDbFormat (value.GetType (), value); } public static object ToDbFormat (Type type, object value) { if (type == typeof (string)) { // Treat blank strings or strings with only whitespace as null return value == null || String.IsNullOrEmpty (((string)value).Trim ()) ? null : value; } else if (type == typeof (DateTime)) { return DateTime.MinValue.Equals ((DateTime)value) ? (object)null : DateTimeUtil.FromDateTime ((DateTime)value); } else if (type == typeof (TimeSpan)) { return TimeSpan.MinValue.Equals ((TimeSpan)value) ? (object)null : ((TimeSpan)value).TotalMilliseconds; } else if (type.IsEnum) { return Convert.ChangeType (value, Enum.GetUnderlyingType (type)); } else if (type == typeof (bool)) { return ((bool)value) ? 1 : 0; } return value; } public static T FromDbFormat (object value) { object o = FromDbFormat (typeof(T), value); return o == null ? default(T) : (T)o; } public static object FromDbFormat (Type type, object value) { if (Convert.IsDBNull (value)) value = null; if (type == typeof (DateTime)) { return value == null ? DateTime.MinValue : DateTimeUtil.ToDateTime (Convert.ToInt64 (value)); } else if (type == typeof (TimeSpan)) { return value == null ? TimeSpan.MinValue : TimeSpan.FromMilliseconds (Convert.ToInt64 (value)); } else if (value == null) { if (type.IsValueType) { return Activator.CreateInstance (type); } else { return null; } } else if (type.IsEnum) { return Enum.ToObject (type, value); } else if (type == typeof (bool)) { return ((long)value == 1); } else if (type == typeof (double?)) { if (value == null) return null; double double_value = ((Single?) value).Value; return (double?) double_value; } else { return Convert.ChangeType (value, type); } } internal static string BuildColumnSchema (string type, string name, string default_value, DatabaseColumnConstraints constraints) { StringBuilder builder = new StringBuilder (); builder.Append (name); builder.Append (' '); builder.Append (type); if ((constraints & DatabaseColumnConstraints.NotNull) > 0) { builder.Append (" NOT NULL"); } if ((constraints & DatabaseColumnConstraints.Unique) > 0) { builder.Append (" UNIQUE"); } if ((constraints & DatabaseColumnConstraints.PrimaryKey) > 0) { builder.Append (" PRIMARY KEY"); } if (default_value != null) { builder.Append (" DEFAULT "); builder.Append (default_value); } return builder.ToString (); } } [SqliteFunction (Name = "HYENA_BINARY_FUNCTION", FuncType = FunctionType.Scalar, Arguments = 3)] public sealed class BinaryFunction : SqliteFunction { private static Dictionary> funcs = new Dictionary> (); public static void Add (string functionId, Func func) { lock (funcs) { if (funcs.ContainsKey (functionId)) { throw new ArgumentException (String.Format ("{0} is already taken", functionId), "functionId"); } funcs[functionId] = func; } } public static void Remove (string functionId) { lock (funcs) { if (!funcs.ContainsKey (functionId)) { throw new ArgumentException (String.Format ("{0} does not exist", functionId), "functionId"); } funcs.Remove (functionId); } } public override object Invoke (object[] args) { Func func; if (!funcs.TryGetValue (args[0] as string, out func)) throw new ArgumentException (args[0] as string, "HYENA_BINARY_FUNCTION name (arg 0)"); return func (args[1], args[2]); } } [SqliteFunction (Name = "HYENA_COLLATION_KEY", FuncType = FunctionType.Scalar, Arguments = 1)] internal class CollationKeyFunction : SqliteFunction { public override object Invoke (object[] args) { return Hyena.StringUtil.SortKey (args[0] as string); } } [SqliteFunction (Name = "HYENA_SEARCH_KEY", FuncType = FunctionType.Scalar, Arguments = 1)] internal class SearchKeyFunction : SqliteFunction { public override object Invoke (object[] args) { return Hyena.StringUtil.SearchKey (args[0] as string); } } [SqliteFunction (Name = "HYENA_MD5", FuncType = FunctionType.Scalar, Arguments = -1)] internal class Md5Function : SqliteFunction { public override object Invoke (object[] args) { int n_args = (int)(long) args[0]; var sb = new StringBuilder (); for (int i = 1; i <= n_args; i++) { sb.Append (args[i]); } return Hyena.CryptoUtil.Md5Encode (sb.ToString (), System.Text.Encoding.UTF8); } } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/DatabaseColumnAttribute.cs0000644000175000017500000000720411467745411030515 0ustar00rubenruben00000000000000// // DatabaseColumnAttribute.cs // // Author: // Scott Peterson // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.Reflection; using System.Text; namespace Hyena.Data.Sqlite { [Flags] public enum DatabaseColumnConstraints { NotNull = 1, PrimaryKey = 2, Unique = 4 } public abstract class AbstractDatabaseColumnAttribute : Attribute { private string column_name; private bool select = true; public AbstractDatabaseColumnAttribute () { } public AbstractDatabaseColumnAttribute (string column_name) { this.column_name = column_name; } public string ColumnName { get { return column_name; } } public bool Select { get { return select; } set { select = value; } } } [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] public sealed class DatabaseColumnAttribute : AbstractDatabaseColumnAttribute { private DatabaseColumnConstraints contraints; private string default_value; private string index; public DatabaseColumnAttribute () { } public DatabaseColumnAttribute (string column_name) : base (column_name) { } public DatabaseColumnConstraints Constraints { get { return contraints; } set { contraints = value; } } public string DefaultValue { get { return default_value; } set { default_value = value; } } public string Index { get { return index; } set { index = value; } } } [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] public sealed class VirtualDatabaseColumnAttribute : AbstractDatabaseColumnAttribute { private string target_table; private string local_key; private string foreign_key; public VirtualDatabaseColumnAttribute (string column_name, string target_table, string local_key, string foreign_key) : base (column_name) { this.target_table = target_table; this.local_key = local_key; this.foreign_key = foreign_key; } public string TargetTable { get { return target_table; } } public string LocalKey { get { return local_key; } } public string ForeignKey { get { return foreign_key; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/SqliteFunction.cs0000644000175000017500000004130311467745411026714 0ustar00rubenruben00000000000000// // Derived from // Mono.Data.Sqlite.SQLiteFunction.cs // // Author(s): // Robert Simpson (robert@blackcastlesoft.com) // // Adapted and modified for the Mono Project by // Marek Habersack (grendello@gmail.com) // // Adapted and modified for the Hyena by // Gabriel Burt // // Copyright (C) 2006,2010 Novell, Inc (http://www.novell.com) // Copyright (C) 2007 Marek Habersack // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // /******************************************************** * ADO.NET 2.0 Data Provider for Sqlite Version 3.X * Written by Robert Simpson (robert@blackcastlesoft.com) * * Released to the public domain, use at your own risk! ********************************************************/ namespace Hyena.Data.Sqlite { using System; using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Globalization; /// /// The type of user-defined function to declare /// public enum FunctionType { /// /// Scalar functions are designed to be called and return a result immediately. Examples include ABS(), Upper(), Lower(), etc. /// Scalar = 0, /// /// Aggregate functions are designed to accumulate data until the end of a call and then return a result gleaned from the accumulated data. /// Examples include SUM(), COUNT(), AVG(), etc. /// Aggregate = 1, /// /// Collation sequences are used to sort textual data in a custom manner, and appear in an ORDER BY clause. Typically text in an ORDER BY is /// sorted using a straight case-insensitive comparison function. Custom collating sequences can be used to alter the behavior of text sorting /// in a user-defined manner. /// Collation = 2, } /// /// An internal callback delegate declaration. /// /// Raw context pointer for the user function /// Count of arguments to the function /// A pointer to the array of argument pointers internal delegate void SqliteCallback(IntPtr context, int nArgs, IntPtr argsptr); /// /// An internal callback delegate declaration. /// /// Raw context pointer for the user function internal delegate void SqliteFinalCallback(IntPtr context); /// /// Internal callback delegate for implementing collation sequences /// /// Length of the string pv1 /// Pointer to the first string to compare /// Length of the string pv2 /// Pointer to the second string to compare /// Returns -1 if the first string is less than the second. 0 if they are equal, or 1 if the first string is greater /// than the second. internal delegate int SqliteCollation(int len1, IntPtr pv1, int len2, IntPtr pv2); /// /// This abstract class is designed to handle user-defined functions easily. An instance of the derived class is made for each /// connection to the database. /// /// /// Although there is one instance of a class derived from SqliteFunction per database connection, the derived class has no access /// to the underlying connection. This is necessary to deter implementers from thinking it would be a good idea to make database /// calls during processing. /// /// It is important to distinguish between a per-connection instance, and a per-SQL statement context. One instance of this class /// services all SQL statements being stepped through on that connection, and there can be many. One should never store per-statement /// information in member variables of user-defined function classes. /// /// For aggregate functions, always create and store your per-statement data in the contextData object on the 1st step. This data will /// be automatically freed for you (and Dispose() called if the item supports IDisposable) when the statement completes. /// public abstract class SqliteFunction : IDisposable { /// /// The base connection this function is attached to /// /// /// Internal array used to keep track of aggregate function context data /// private Dictionary _contextDataList; /// /// Holds a reference to the callback function for user functions /// internal SqliteCallback _InvokeFunc; /// /// Holds a reference to the callbakc function for stepping in an aggregate function /// internal SqliteCallback _StepFunc; /// /// Holds a reference to the callback function for finalizing an aggregate function /// internal SqliteFinalCallback _FinalFunc; /// /// Holds a reference to the callback function for collation sequences /// internal SqliteCollation _CompareFunc; /// /// Internal constructor, initializes the function's internal variables. /// protected SqliteFunction() { _contextDataList = new Dictionary(); } /// /// Scalar functions override this method to do their magic. /// /// /// Parameters passed to functions have only an affinity for a certain data type, there is no underlying schema available /// to force them into a certain type. Therefore the only types you will ever see as parameters are /// DBNull.Value, Int64, Double, String or byte[] array. /// /// The arguments for the command to process /// You may return most simple types as a return value, null or DBNull.Value to return null, DateTime, or /// you may return an Exception-derived class if you wish to return an error to Sqlite. Do not actually throw the error, /// just return it! public virtual object Invoke(object[] args) { return null; } /// /// Aggregate functions override this method to do their magic. /// /// /// Typically you'll be updating whatever you've placed in the contextData field and returning as quickly as possible. /// /// The arguments for the command to process /// The 1-based step number. This is incrememted each time the step method is called. /// A placeholder for implementers to store contextual data pertaining to the current context. public virtual void Step(object[] args, int stepNumber, ref object contextData) { } /// /// Aggregate functions override this method to finish their aggregate processing. /// /// /// If you implemented your aggregate function properly, /// you've been recording and keeping track of your data in the contextData object provided, and now at this stage you should have /// all the information you need in there to figure out what to return. /// NOTE: It is possible to arrive here without receiving a previous call to Step(), in which case the contextData will /// be null. This can happen when no rows were returned. You can either return null, or 0 or some other custom return value /// if that is the case. /// /// Your own assigned contextData, provided for you so you can return your final results. /// You may return most simple types as a return value, null or DBNull.Value to return null, DateTime, or /// you may return an Exception-derived class if you wish to return an error to Sqlite. Do not actually throw the error, /// just return it! /// public virtual object Final(object contextData) { return null; } /// /// User-defined collation sequences override this method to provide a custom string sorting algorithm. /// /// The first string to compare /// The second strnig to compare /// 1 if param1 is greater than param2, 0 if they are equal, or -1 if param1 is less than param2 public virtual int Compare(string param1, string param2) { return 0; } /// /// Converts an IntPtr array of context arguments to an object array containing the resolved parameters the pointers point to. /// /// /// Parameters passed to functions have only an affinity for a certain data type, there is no underlying schema available /// to force them into a certain type. Therefore the only types you will ever see as parameters are /// DBNull.Value, Int64, Double, String or byte[] array. /// /// The number of arguments /// A pointer to the array of arguments /// An object array of the arguments once they've been converted to .NET values internal object[] ConvertParams(int nArgs, IntPtr argsptr) { object[] parms = new object[nArgs]; IntPtr[] argint = new IntPtr[nArgs]; Marshal.Copy(argsptr, argint, 0, nArgs); for (int n = 0; n < nArgs; n++) { IntPtr valPtr = (IntPtr)argint[n]; int type = Native.sqlite3_value_type (valPtr); switch (type) { case SQLITE_INTEGER: parms[n] = Native.sqlite3_value_int64 (valPtr); break; case SQLITE_FLOAT: parms[n] = Native.sqlite3_value_double (valPtr); break; case SQLITE3_TEXT: parms[n] = Native.sqlite3_value_text16 (valPtr).PtrToString (); break; case SQLITE_BLOB: parms[n] = Native.sqlite3_value_blob (valPtr); break; case SQLITE_NULL: parms[n] = null; break; default: throw new Exception (String.Format ("Value is of unknown type {0}", type)); } } return parms; } /// /// Takes the return value from Invoke() and Final() and figures out how to return it to Sqlite's context. /// /// The context the return value applies to /// The parameter to return to Sqlite void SetReturnValue(IntPtr context, object r) { if (r is Exception) { Native.sqlite3_result_error16 (context, ((Exception)r).Message, -1); } else { var o = SqliteUtils.ToDbFormat (r); if (o == null) Native.sqlite3_result_null (context); else if (r is int || r is uint) Native.sqlite3_result_int (context, (int)r); else if (r is long || r is ulong) Native.sqlite3_result_int64 (context, (long)r); else if (r is double || r is float) Native.sqlite3_result_double (context, (double)r); else if (r is string) { string str = (string)r; // -1 for the last arg is the TRANSIENT destructor type so that sqlite will make its own copy of the string Native.sqlite3_result_text16 (context, str, str.Length*2, (IntPtr)(-1)); } else if (r is byte[]) { var bytes = (byte[])r; Native.sqlite3_result_blob (context, bytes, bytes.Length, (IntPtr)(-1)); } } } /// /// Internal scalar callback function, which wraps the raw context pointer and calls the virtual Invoke() method. /// /// A raw context pointer /// Number of arguments passed in /// A pointer to the array of arguments internal void ScalarCallback(IntPtr context, int nArgs, IntPtr argsptr) { SetReturnValue(context, Invoke(ConvertParams(nArgs, argsptr))); } /// /// Internal collation sequence function, which wraps up the raw string pointers and executes the Compare() virtual function. /// /// Length of the string pv1 /// Pointer to the first string to compare /// Length of the string pv2 /// Pointer to the second string to compare /// Returns -1 if the first string is less than the second. 0 if they are equal, or 1 if the first string is greater /// than the second. internal int CompareCallback(int len1, IntPtr ptr1, int len2, IntPtr ptr2) { return Compare(ptr1.PtrToString (), ptr2.PtrToString ()); } /// /// The internal aggregate Step function callback, which wraps the raw context pointer and calls the virtual Step() method. /// /// /// This function takes care of doing the lookups and getting the important information put together to call the Step() function. /// That includes pulling out the user's contextData and updating it after the call is made. We use a sorted list for this so /// binary searches can be done to find the data. /// /// A raw context pointer /// Number of arguments passed in /// A pointer to the array of arguments internal void StepCallback(IntPtr context, int nArgs, IntPtr argsptr) { int n = Native.sqlite3_aggregate_count (context); long nAux; object obj = null; nAux = (long)Native.sqlite3_aggregate_context (context, 1); if (n > 1) obj = _contextDataList[nAux]; Step(ConvertParams(nArgs, argsptr), n, ref obj); _contextDataList[nAux] = obj; } /// /// An internal aggregate Final function callback, which wraps the context pointer and calls the virtual Final() method. /// /// A raw context pointer internal void FinalCallback(IntPtr context) { long n = (long)Native.sqlite3_aggregate_context (context, 1); object obj = null; if (_contextDataList.ContainsKey(n)) { obj = _contextDataList[n]; _contextDataList.Remove(n); } SetReturnValue(context, Final(obj)); IDisposable disp = obj as IDisposable; if (disp != null) disp.Dispose(); } /// /// Placeholder for a user-defined disposal routine /// /// True if the object is being disposed explicitly protected virtual void Dispose(bool disposing) { } /// /// Disposes of any active contextData variables that were not automatically cleaned up. Sometimes this can happen if /// someone closes the connection while a DataReader is open. /// public void Dispose() { Dispose(true); IDisposable disp; foreach (KeyValuePair kv in _contextDataList) { disp = kv.Value as IDisposable; if (disp != null) disp.Dispose(); } _contextDataList.Clear(); _InvokeFunc = null; _StepFunc = null; _FinalFunc = null; _CompareFunc = null; _contextDataList = null; GC.SuppressFinalize(this); } const int SQLITE_INTEGER = 1; const int SQLITE_FLOAT = 2; const int SQLITE3_TEXT = 3; const int SQLITE_BLOB = 4; const int SQLITE_NULL = 5; } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/HyenaSqliteConnection.cs0000644000175000017500000003752311467745411030224 0ustar00rubenruben00000000000000// // HyenaSqliteConnection.cs // // Authors: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2005-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Threading; using System.Collections.Generic; namespace Hyena.Data.Sqlite { public class HyenaDataReader : IDisposable { private IDataReader reader; private bool read = false; public IDataReader Reader { get { return reader; } } public HyenaDataReader (IDataReader reader) { this.reader = reader; } public T Get (int i) { if (!read) { Read (); } return (T) SqliteUtils.FromDbFormat (typeof(T), reader[i]); } public bool Read () { read = true; return reader.Read (); } public void Dispose () { reader.Dispose (); reader = null; } } public enum HyenaCommandType { Reader, Scalar, Execute, } public class HyenaSqliteConnection : IDisposable { private Hyena.Data.Sqlite.Connection connection; private string dbpath; protected string DbPath { get { return dbpath; } } // These are 'parallel' queues; that is, when a value is pushed or popped to // one, a value is pushed or popped to all three. // The 1st contains the command object itself, and the 2nd and 3rd contain the // arguments to be applied to that command (filled in for any ? placeholder in the command). // The 3rd exists as an optimization to avoid making an object [] for a single arg. private Queue command_queue = new Queue(); private Queue args_queue = new Queue(); private Queue arg_queue = new Queue(); private Thread queue_thread; private volatile bool dispose_requested = false; private volatile int results_ready = 0; private AutoResetEvent queue_signal = new AutoResetEvent (false); internal ManualResetEvent ResultReadySignal = new ManualResetEvent (false); private volatile Thread transaction_thread = null; private ManualResetEvent transaction_signal = new ManualResetEvent (true); private Thread warn_if_called_from_thread; public Thread WarnIfCalledFromThread { get { return warn_if_called_from_thread; } set { warn_if_called_from_thread = value; } } public string ServerVersion { get { return Query ("SELECT sqlite_version ()"); } } public HyenaSqliteConnection(string dbpath) { this.dbpath = dbpath; queue_thread = new Thread(ProcessQueue); queue_thread.Name = String.Format ("HyenaSqliteConnection ({0})", dbpath); queue_thread.IsBackground = true; queue_thread.Start(); } public void AddFunction () where T : SqliteFunction { connection.AddFunction (); } public void RemoveFunction () where T : SqliteFunction { connection.RemoveFunction (); } #region Public Query Methods // TODO special case for single object param to avoid object [] // SELECT multiple column queries public IDataReader Query (HyenaSqliteCommand command) { command.CommandType = HyenaCommandType.Reader; QueueCommand (command); return (IDataReader) command.WaitForResult (this); } public IDataReader Query (HyenaSqliteCommand command, params object [] param_values) { command.CommandType = HyenaCommandType.Reader; QueueCommand (command, param_values); return (IDataReader) command.WaitForResult (this); } public IDataReader Query (string command_str, params object [] param_values) { return Query (new HyenaSqliteCommand (command_str, param_values) { ReaderDisposes = true }); } public IDataReader Query (object command) { return Query (new HyenaSqliteCommand (command.ToString ()) { ReaderDisposes = true }); } // SELECT single column, multiple rows queries public IEnumerable QueryEnumerable (HyenaSqliteCommand command) { Type type = typeof (T); using (IDataReader reader = Query (command)) { while (reader.Read ()) { yield return (T) SqliteUtils.FromDbFormat (type, reader[0]); } } } public IEnumerable QueryEnumerable (HyenaSqliteCommand command, params object [] param_values) { Type type = typeof (T); using (IDataReader reader = Query (command, param_values)) { while (reader.Read ()) { yield return (T) SqliteUtils.FromDbFormat (type, reader[0]); } } } public IEnumerable QueryEnumerable (string command_str, params object [] param_values) { return QueryEnumerable (new HyenaSqliteCommand (command_str, param_values) { ReaderDisposes = true }); } public IEnumerable QueryEnumerable (object command) { return QueryEnumerable (new HyenaSqliteCommand (command.ToString ()) { ReaderDisposes = true }); } // SELECT single column, single row queries public T Query (HyenaSqliteCommand command) { command.CommandType = HyenaCommandType.Scalar; QueueCommand (command); object result = command.WaitForResult (this); return (T)SqliteUtils.FromDbFormat (typeof (T), result); } public T Query (HyenaSqliteCommand command, params object [] param_values) { command.CommandType = HyenaCommandType.Scalar; QueueCommand (command, param_values); object result = command.WaitForResult (this); return (T)SqliteUtils.FromDbFormat (typeof (T), result); } public T Query (string command_str, params object [] param_values) { return Query (new HyenaSqliteCommand (command_str, param_values) { ReaderDisposes = true }); } public T Query (object command) { return Query (new HyenaSqliteCommand (command.ToString ()) { ReaderDisposes = true }); } // INSERT, UPDATE, DELETE queries public int Execute (HyenaSqliteCommand command) { command.CommandType = HyenaCommandType.Execute;; QueueCommand(command); return Convert.ToInt32 (command.WaitForResult (this)); } public int Execute (HyenaSqliteCommand command, params object [] param_values) { command.CommandType = HyenaCommandType.Execute;; QueueCommand(command, param_values); return Convert.ToInt32 (command.WaitForResult (this)); } public int Execute (string command_str, params object [] param_values) { return Execute (new HyenaSqliteCommand (command_str, param_values) { ReaderDisposes = true }); } public int Execute (object command) { return Execute (new HyenaSqliteCommand (command.ToString ()) { ReaderDisposes = true }); } #endregion #region Public Utility Methods public void BeginTransaction () { if (transaction_thread == Thread.CurrentThread) { throw new Exception ("Can't start a recursive transaction"); } while (transaction_thread != Thread.CurrentThread) { if (transaction_thread != null) { // Wait for the existing transaction to finish before this thread proceeds transaction_signal.WaitOne (); } lock (command_queue) { if (transaction_thread == null) { transaction_thread = Thread.CurrentThread; transaction_signal.Reset (); } } } Execute ("BEGIN TRANSACTION"); } public void CommitTransaction () { if (transaction_thread != Thread.CurrentThread) { throw new Exception ("Can't commit from outside a transaction"); } Execute ("COMMIT TRANSACTION"); lock (command_queue) { transaction_thread = null; // Let any other threads continue transaction_signal.Set (); } } public void RollbackTransaction () { if (transaction_thread != Thread.CurrentThread) { throw new Exception ("Can't rollback from outside a transaction"); } Execute ("ROLLBACK"); lock (command_queue) { transaction_thread = null; // Let any other threads continue transaction_signal.Set (); } } public bool TableExists (string tableName) { return Exists ("table", tableName); } public bool IndexExists (string indexName) { return Exists ("index", indexName); } private bool Exists (string type, string name) { return Exists (type, name, "sqlite_master") || Exists (type, name, "sqlite_temp_master"); } private bool Exists (string type, string name, string master) { return Query (String.Format ( "SELECT COUNT(*) FROM {0} WHERE Type='{1}' AND Name='{2}'", master, type, name) ) > 0; } private delegate void SchemaHandler (string column); private void SchemaClosure (string table_name, SchemaHandler code) { string sql = Query (String.Format ( "SELECT sql FROM sqlite_master WHERE Name='{0}'", table_name)); if (String.IsNullOrEmpty (sql)) { return; } sql = sql.Substring (sql.IndexOf ('(') + 1); foreach (string column_def in sql.Split (',')) { string column_def_t = column_def.Trim (); int ws_index = column_def_t.IndexOfAny (ws_chars); code (ws_index == -1 ? column_def_t : column_def_t.Substring (0, ws_index)); } } public bool ColumnExists (string tableName, string columnName) { bool value = false; SchemaClosure (tableName, delegate (string column) { if (column == columnName) { value = true; return; } }); return value; } private static readonly char [] ws_chars = new char [] { ' ', '\t', '\n', '\r' }; public IDictionary GetSchema (string table_name) { Dictionary schema = new Dictionary (); SchemaClosure (table_name, delegate (string column) { schema.Add (column.ToLower (), null); }); return schema; } #endregion #region Private Queue Methods private void QueueCommand(HyenaSqliteCommand command, object [] args) { QueueCommand (command, null, args); } // TODO optimize object vs object [] code paths? /*private void QueueCommand(HyenaSqliteCommand command, object arg) { QueueCommand (command, arg, null); }*/ private void QueueCommand(HyenaSqliteCommand command) { QueueCommand (command, null, null); } private void QueueCommand(HyenaSqliteCommand command, object arg, object [] args) { if (warn_if_called_from_thread != null && Thread.CurrentThread == warn_if_called_from_thread) { Hyena.Log.Warning ("HyenaSqliteConnection command issued from the main thread"); } while (true) { lock (command_queue) { if (dispose_requested) { // No point in queueing the command if we're already disposing. // This helps avoid using the probably-disposed queue_signal below too return; } else if (transaction_thread == null || Thread.CurrentThread == transaction_thread) { command_queue.Enqueue (command); args_queue.Enqueue (args); arg_queue.Enqueue (arg); break; } } transaction_signal.WaitOne (); } queue_signal.Set (); } internal void ClaimResult () { lock (command_queue) { results_ready--; if (results_ready == 0) { ResultReadySignal.Reset (); } } } private void ProcessQueue() { if (connection == null) { connection = new Hyena.Data.Sqlite.Connection (dbpath); } // Keep handling queries while (!dispose_requested) { while (command_queue.Count > 0) { HyenaSqliteCommand command; object [] args; object arg; lock (command_queue) { command = command_queue.Dequeue (); args = args_queue.Dequeue (); arg = arg_queue.Dequeue (); } // Ensure the command is not altered while applying values or executing lock (command) { command.WaitIfNotFinished (); if (arg != null) { command.ApplyValues (arg); } else if (args != null) { command.ApplyValues (args); } command.Execute (this, connection); } lock (command_queue) { results_ready++; ResultReadySignal.Set (); } } queue_signal.WaitOne (); } // Finish connection.Dispose (); } #endregion public void Dispose() { dispose_requested = true; queue_signal.Set (); queue_thread.Join (); queue_signal.Close (); ResultReadySignal.Close (); transaction_signal.Close (); } } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/ArrayDataReader.cs0000644000175000017500000000571211467745411026744 0ustar00rubenruben00000000000000// // ArrayDataReader.cs // // Authors: // Gabriel Burt // // Copyright (C) 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Linq; using System.Text; using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using Hyena; namespace Hyena.Data.Sqlite { internal class ArrayDataReader : IDataReader { int rows; int row = -1; List data = new List (); internal ArrayDataReader (IDataReader reader) { if (!reader.Read ()) return; FieldCount = reader.FieldCount; FieldNames = reader.FieldNames; do { var vals = new object[FieldCount]; for (int i = 0; i < FieldCount; i++) { vals[i] = reader[i]; } data.Add (vals); rows++; } while (reader.Read ()); } public void Dispose () { row = -1; } public int FieldCount { get; private set; } public string [] FieldNames { get; private set; } public bool Read () { row++; return row < rows; } public object this[int i] { get { return data[row][i]; } } public object this[string columnName] { get { return this[GetColumnIndex (columnName)]; } } public T Get (int i) { return (T) Get (i, typeof(T)); } public object Get (int i, Type asType) { return QueryReader.GetAs (this[i], asType); } public T Get (string columnName) { return Get (GetColumnIndex (columnName)); } private int GetColumnIndex (string columnName) { return Array.IndexOf (FieldNames, columnName); } } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/Tests/0000777000175000017500000000000011503407406024511 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/Tests/SqliteUtilTests.cs0000644000175000017500000000527511420634720030166 0ustar00rubenruben00000000000000// // SqliteUtilTests.cs // // Author: // John Millikin // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using NUnit.Framework; using Hyena.Data.Sqlite; namespace Hyena.Data.Sqlite.Tests { [TestFixture] public class CollationKeyTests { protected void CollationKeyTest (object before, object after) { Assert.AreEqual (after, (new CollationKeyFunction ()).Invoke (new object[] {before})); } [Test] public void TestNull () { CollationKeyTest (null, null); CollationKeyTest (System.DBNull.Value, null); } [Test] public void TestKey () { // See Hyena.StringUtil.Tests for full tests. This just checks that // the collation function is actually being used. CollationKeyTest ("", new byte[] {1, 1, 1, 1, 0}); CollationKeyTest ("\u0104", new byte[] {14, 2, 1, 27, 1, 1, 1, 0}); } } [TestFixture] public class SearchKeyTests { protected void SearchKeyTest (object before, object after) { Assert.AreEqual (after, (new SearchKeyFunction ()).Invoke (new object[] {before})); } [Test] public void TestNull () { SearchKeyTest (null, null); SearchKeyTest (System.DBNull.Value, null); } [Test] public void TestKey () { // See Hyena.StringUtil.Tests for full tests. This just checks that // the search key function is actually being used. SearchKeyTest ("", ""); SearchKeyTest ("\u0104", "a"); } } } #endif f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/Tests/SqliteModelProviderTests.cs0000644000175000017500000002573511467745411032042 0ustar00rubenruben00000000000000// // SqliteModelProviderTests.cs // // Author: // Scott Peterson // // Copyright (C) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using System.IO; using NUnit.Framework; using Hyena.Data.Sqlite; namespace Hyena.Data.Sqlite.Tests { [TestFixture] public class SqliteModelProviderTests { private HyenaSqliteConnection connection; private ModelProvider provider; [TestFixtureSetUp] public void Init () { connection = new HyenaSqliteConnection ("test.db"); provider = new ModelProvider (connection); } [TestFixtureTearDown] public void Dispose () { connection.Dispose (); File.Delete ("test.db"); } [Test] public void IntMembers () { DbBoundType newed_item = new DbBoundType (); newed_item.PublicIntField = 3141592; newed_item.PublicIntProperty = 13; newed_item.SetPrivateIntField (128); newed_item.SetPrivateIntProperty (42); provider.Save (newed_item); DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey); Assert.AreEqual (newed_item.PublicIntField, loaded_item.PublicIntField); Assert.AreEqual (newed_item.PublicIntProperty, loaded_item.PublicIntProperty); Assert.AreEqual (newed_item.GetPrivateIntField (), loaded_item.GetPrivateIntField ()); Assert.AreEqual (newed_item.GetPrivateIntProperty (), loaded_item.GetPrivateIntProperty ()); } [Test] public void LongMembers () { DbBoundType newed_item = new DbBoundType (); newed_item.PublicLongField = 4926227057; newed_item.PublicLongProperty = -932; newed_item.SetPrivateLongField (3243); newed_item.SetPrivateLongProperty (1); provider.Save (newed_item); DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey); Assert.AreEqual (newed_item.PublicLongField, loaded_item.PublicLongField); Assert.AreEqual (newed_item.PublicLongProperty, loaded_item.PublicLongProperty); Assert.AreEqual (newed_item.GetPrivateLongField (), loaded_item.GetPrivateLongField ()); Assert.AreEqual (newed_item.GetPrivateLongProperty (), loaded_item.GetPrivateLongProperty ()); } [Test] public void StringMembers () { DbBoundType newed_item = new DbBoundType (); newed_item.PublicStringField = "Surely you're joking, Mr. Feynman."; newed_item.PublicStringProperty = "Even as a splitted bark, so sunder we: This way fall I to death."; newed_item.SetPrivateStringField ("Who is John Galt?"); newed_item.SetPrivateStringProperty ("The most formidable weapon against errors of every kind is Reason."); provider.Save (newed_item); DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey); Assert.AreEqual (newed_item.PublicStringField, loaded_item.PublicStringField); Assert.AreEqual (newed_item.PublicStringProperty, loaded_item.PublicStringProperty); Assert.AreEqual (newed_item.GetPrivateStringField (), loaded_item.GetPrivateStringField ()); Assert.AreEqual (newed_item.GetPrivateStringProperty (), loaded_item.GetPrivateStringProperty ()); } [Test] public void BlankStringMembers () { DbBoundType newed_item = new DbBoundType (); newed_item.PublicStringField = ""; newed_item.PublicStringProperty = null; newed_item.SetPrivateStringField (" \t "); newed_item.SetPrivateStringProperty (" foo "); provider.Save (newed_item); DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey); Assert.AreEqual (null, loaded_item.PublicStringField); Assert.AreEqual (null, loaded_item.PublicStringProperty); Assert.AreEqual (null, loaded_item.GetPrivateStringField ()); Assert.AreEqual (" foo ", loaded_item.GetPrivateStringProperty ()); } [Test] public void NullStringMembers () { DbBoundType newed_item = new DbBoundType (); newed_item.PublicStringField = null; newed_item.PublicStringProperty = null; newed_item.SetPrivateStringField (null); newed_item.SetPrivateStringProperty (null); provider.Save (newed_item); DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey); Assert.AreEqual (newed_item.PublicStringField, loaded_item.PublicStringField); Assert.AreEqual (newed_item.PublicStringProperty, loaded_item.PublicStringProperty); Assert.AreEqual (newed_item.GetPrivateStringField (), loaded_item.GetPrivateStringField ()); Assert.AreEqual (newed_item.GetPrivateStringProperty (), loaded_item.GetPrivateStringProperty ()); } // Some fidelity is lost in the conversion from DT to DB time format private void AssertArePrettyClose (DateTime time1, DateTime time2) { Assert.AreEqual (time1.Year, time2.Year); Assert.AreEqual (time1.Month, time2.Month); Assert.AreEqual (time1.Day, time2.Day); Assert.AreEqual (time1.Hour, time2.Hour); Assert.AreEqual (time1.Minute, time2.Minute); Assert.AreEqual (time1.Second, time2.Second); } [Test] public void DateTimeMembers () { DbBoundType newed_item = new DbBoundType (); newed_item.PublicDateTimeField = DateTime.Now; newed_item.PublicDateTimeProperty = new DateTime (1986, 4, 23); newed_item.SetPrivateDateTimeField (DateTime.MinValue); newed_item.SetPrivateDateTimeProperty (DateTime.Now); provider.Save (newed_item); string command = String.Format ("SELECT PrivateDateTimeField FROM {0} WHERE PrimaryKey = {1}", provider.TableName, newed_item.PrimaryKey); using (IDataReader reader = connection.Query (command)) { reader.Read (); Assert.IsTrue (reader[0] == null); } DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey); AssertArePrettyClose (newed_item.PublicDateTimeField, loaded_item.PublicDateTimeField); AssertArePrettyClose (newed_item.PublicDateTimeProperty, loaded_item.PublicDateTimeProperty); AssertArePrettyClose (newed_item.GetPrivateDateTimeField (), loaded_item.GetPrivateDateTimeField ()); AssertArePrettyClose (newed_item.GetPrivateDateTimeProperty (), loaded_item.GetPrivateDateTimeProperty ()); } [Test] public void TimeSpanMembers () { DbBoundType newed_item = new DbBoundType (); newed_item.PublicTimeSpanField = new TimeSpan (0, 0, 1); newed_item.PublicTimeSpanProperty = new TimeSpan (1, 0, 0); newed_item.SetPrivateTimeSpanField (new TimeSpan (1, 39, 12)); newed_item.SetPrivateTimeSpanProperty (TimeSpan.MinValue); provider.Save (newed_item); string command = String.Format ("SELECT PrivateTimeSpanProperty FROM {0} WHERE PrimaryKey = {1}", provider.TableName, newed_item.PrimaryKey); using (IDataReader reader = connection.Query (command)) { reader.Read (); Assert.IsTrue (reader[0] == null); } // NUnit boxes and uses reference equality, rather than Equals() DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey); Assert.AreEqual (newed_item.PublicTimeSpanField, loaded_item.PublicTimeSpanField); Assert.AreEqual (newed_item.PublicTimeSpanProperty, loaded_item.PublicTimeSpanProperty); Assert.AreEqual (newed_item.GetPrivateTimeSpanField (), loaded_item.GetPrivateTimeSpanField ()); Assert.AreEqual (newed_item.GetPrivateTimeSpanProperty (), loaded_item.GetPrivateTimeSpanProperty ()); } [Test] public void IntEnumMembers () { DbBoundType newed_item = new DbBoundType (); newed_item.PublicIntEnumField = IntEnum.Zero; newed_item.PublicIntEnumProperty = IntEnum.One; newed_item.SetPrivateIntEnumField (IntEnum.Two); newed_item.SetPrivateIntEnumProperty (IntEnum.Three); provider.Save (newed_item); DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey); Assert.AreEqual (newed_item.PublicIntEnumField, loaded_item.PublicIntEnumField); Assert.AreEqual (newed_item.PublicIntEnumProperty, loaded_item.PublicIntEnumProperty); Assert.AreEqual (newed_item.GetPrivateIntEnumField (), loaded_item.GetPrivateIntEnumField ()); Assert.AreEqual (newed_item.GetPrivateIntEnumProperty (), loaded_item.GetPrivateIntEnumProperty ()); } [Test] public void LongEnumMembers () { DbBoundType newed_item = new DbBoundType (); newed_item.PublicLongEnumField = LongEnum.Cero; newed_item.PublicLongEnumProperty = LongEnum.Uno; newed_item.SetPrivateLongEnumField (LongEnum.Dos); newed_item.SetPrivateLongEnumProperty (LongEnum.Tres); provider.Save (newed_item); DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey); Assert.AreEqual (newed_item.PublicLongEnumField, loaded_item.PublicLongEnumField); Assert.AreEqual (newed_item.PublicLongEnumProperty, loaded_item.PublicLongEnumProperty); Assert.AreEqual (newed_item.GetPrivateLongEnumField (), loaded_item.GetPrivateLongEnumField ()); Assert.AreEqual (newed_item.GetPrivateLongEnumProperty (), loaded_item.GetPrivateLongEnumProperty ()); } } } #endif f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/Tests/SqliteTests.cs0000644000175000017500000004151011467745411027333 0ustar00rubenruben00000000000000// // SqliteTests.cs // // Author: // Gabriel Burt // // Copyright (C) 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using System.Linq; using NUnit.Framework; using Hyena.Data.Sqlite; namespace Hyena.Data.Sqlite { [TestFixture] public class SqliteTests { Connection con; Statement select_literal; string dbfile = "hyena-data-sqlite-test.db"; [SetUp] public void Setup () { con = new Connection (dbfile); select_literal = con.CreateStatement ("SELECT ?"); } [TearDown] public void TearDown () { select_literal.Dispose (); Assert.AreEqual (0, con.Statements.Count); con.Dispose (); System.IO.File.Delete (dbfile); } [Test] public void TestBindWhileReading () { using (var stmt = con.CreateStatement ("SELECT ? as version")) { stmt.Bind (7); var reader = stmt.Query (); Assert.IsTrue (reader.Read ()); Assert.AreEqual (7, reader[0]); try { stmt.Bind (6); Assert.Fail ("Shouldn't be able to bind while a reader is active"); } catch {} Assert.AreEqual (7, reader[0]); reader.Dispose (); stmt.Bind (6); Assert.AreEqual (6, stmt.Query ()); } } [Test] public void TestQueryWhileReading () { using (var stmt = con.CreateStatement ("SELECT ? as version")) { stmt.Bind (7); var reader = stmt.Query (); Assert.IsTrue (reader.Read ()); Assert.AreEqual (7, reader[0]); try { stmt.Execute (); Assert.Fail ("Shouldn't be able to query while a reader is active"); } catch {} try { stmt.Query (); Assert.Fail ("Shouldn't be able to query while a reader is active"); } catch {} try { stmt.Query (); Assert.Fail ("Shouldn't be able to query while a reader is active"); } catch {} Assert.AreEqual (7, reader[0]); reader.Dispose (); stmt.Bind (6); Assert.AreEqual (6, stmt.Query ()); } } [Test] public void Test () { using (var stmt = con.CreateStatement ("SELECT 'foobar' as version")) { Assert.AreEqual ("foobar", stmt.Query ()); try { stmt.Bind (); Assert.Fail ("should not be able to bind parameterless statement"); } catch {} } using (var stmt = con.CreateStatement ("SELECT 2 + 5 as res")) { using (var reader = stmt.Query ()) { Assert.IsTrue (reader.Read ()); Assert.AreEqual (7, reader.Get (0)); Assert.AreEqual (7, reader[0]); Assert.AreEqual (7, reader["res"]); } } } [Test] public void TestBinding () { using (var stmt = con.CreateStatement ("SELECT ? as version")) { try { stmt.First (); Assert.Fail ("unbound statement should have thrown an exception"); } catch {} try { stmt.Bind (1, 2); Assert.Fail ("bound statement with the wrong number of parameters"); } catch {} try { stmt.Bind (); Assert.Fail ("bound statement with the wrong number of parameters"); } catch {} stmt.Bind (21); Assert.AreEqual (21, stmt.Query ()); stmt.Bind ("ffoooo"); using (var reader = stmt.First ()) { Assert.AreEqual ("ffoooo", reader[0]); Assert.AreEqual ("ffoooo", reader["version"]); } } using (var stmt = con.CreateStatement ("SELECT ? as a, ? as b, ?")) { stmt.Bind (1, "two", 3.3); using (var reader = stmt.Query ()) { Assert.IsTrue (reader.Read ()); Assert.AreEqual (1, reader.Get (0)); Assert.AreEqual ("two", reader["b"]); Assert.AreEqual ("two", reader.Get ("b")); Assert.AreEqual ("two", reader.Get (1)); Assert.AreEqual (3.3, reader[2]); } } } [Test] public void CreateTable () { CreateUsers (con); using (var stmt = con.CreateStatement ("SELECT COUNT(*) FROM Users")) { Assert.AreEqual (2, stmt.Query ()); } using (var reader = con.Query ("SELECT ID, Name FROM Users ORDER BY NAME")) { Assert.IsTrue (reader.Read ()); Assert.AreEqual ("Aaron", reader["Name"]); Assert.AreEqual ("Aaron", reader[1]); Assert.AreEqual (2, reader["ID"]); Assert.AreEqual (2, reader[0]); Assert.IsTrue (reader.Read ()); Assert.AreEqual ("Gabriel", reader["Name"]); Assert.AreEqual ("Gabriel", reader[1]); Assert.AreEqual (1, reader["ID"]); Assert.AreEqual (1, reader[0]); Assert.IsFalse (reader.Read ()); } } private void CreateUsers (Connection con) { using (var stmt = con.CreateStatement ("DROP TABLE IF EXISTS Users")) { stmt.Execute (); } using (var stmt = con.CreateStatement ("CREATE TABLE Users (ID INTEGER PRIMARY KEY, Name TEXT)")) { stmt.Execute (); try { stmt.Execute (); Assert.Fail ("Shouldn't be able to create table; already exists"); } catch {} } using (var stmt = con.CreateStatement ("INSERT INTO Users (Name) VALUES (?)")) { stmt.Bind ("Gabriel").Execute (); stmt.Bind ("Aaron").Execute (); } } [Test] public void CheckInterleavedAccess () { CreateUsers (con); var q1 = con.Query ("SELECT ID, Name FROM Users ORDER BY NAME ASC"); var q2 = con.Query ("SELECT ID, Name FROM Users ORDER BY ID ASC"); Assert.IsTrue (q1.Read ()); Assert.IsTrue (q2.Read ()); Assert.AreEqual ("Aaron", q1["Name"]); Assert.AreEqual ("Gabriel", q2["Name"]); con.Execute ("INSERT INTO Users (Name) VALUES ('Zeus')"); Assert.AreEqual (3, con.Query ("SELECT COUNT(*) FROM Users")); Assert.IsTrue (q2.Read ()); Assert.AreEqual ("Aaron", q2[1]); Assert.IsTrue (q1.Read ()); Assert.AreEqual ("Gabriel", q1[1]); // The new value is already passed when sorting by Name ASC // But it had ID=3, so it's available to the second query Assert.IsFalse (q1.Read ()); Assert.IsTrue (q2.Read ()); Assert.AreEqual ("Zeus", q2[1]); // Insert a value, see that q2 can see it, then delete it and try to // get the now-deleted value from q2 con.Execute ("INSERT INTO Users (Name) VALUES ('Apollo')"); Assert.AreEqual (4, con.Query ("SELECT COUNT(*) FROM Users")); Assert.IsTrue (q2.Read ()); con.Execute ("DELETE FROM Users WHERE Name='Apollo'"); Assert.AreEqual (3, con.Query ("SELECT COUNT(*) FROM Users")); Assert.AreEqual ("Apollo", q2[1]); Assert.IsFalse (q2.Read ()); try { Console.WriteLine (q1[1]); Assert.Fail ("Should have thrown"); } catch {} q1.Dispose (); q2.Dispose (); } [Test] public void ConnectionDisposesStatements () { var stmt = con.CreateStatement ("SELECT 1"); Assert.IsFalse (stmt.IsDisposed); con.Dispose (); Assert.IsTrue (stmt.IsDisposed); } [Test] public void MultipleCommands () { try { using (var stmt = con.CreateStatement ("CREATE TABLE Lusers (ID INTEGER PRIMARY KEY, Name TEXT); INSERT INTO Lusers (Name) VALUES ('Foo')")) { stmt.Execute (); } Assert.Fail ("Mutliple commands aren't supported in this sqlite binding"); } catch {} } [Test] public void Query () { using (var q = con.Query ("SELECT 7")) { int rows = 0; while (q.Read ()) { Assert.AreEqual (7, q[0]); rows++; } Assert.AreEqual (1, rows); } } [Test] public void QueryScalar () { Assert.AreEqual (7, con.Query ("SELECT 7")); } [Test] public void Execute () { try { con.Query ("SELECT COUNT(*) FROM Users"); Assert.Fail ("Should have thrown an exception"); } catch {} con.Execute ("CREATE TABLE Users (ID INTEGER PRIMARY KEY, Name TEXT)"); Assert.AreEqual (0, con.Query ("SELECT COUNT(*) FROM Users")); } [Test] public void Md5Function () { using (var stmt = con.CreateStatement ("SELECT HYENA_MD5(?, ?)")) { Assert.AreEqual ("ae2b1fca515949e5d54fb22b8ed95575", stmt.Bind (1, "testing").Query ()); Assert.AreEqual (null, stmt.Bind (1, null).Query ()); } using (var stmt = con.CreateStatement ("SELECT HYENA_MD5(?, ?, ?)")) { Assert.AreEqual ("ae2b1fca515949e5d54fb22b8ed95575", stmt.Bind (2, "test", "ing").Query ()); Assert.AreEqual (null, stmt.Bind (2, null, null).Query ()); } using (var stmt = con.CreateStatement ("SELECT HYENA_MD5(?, ?, ?, ?)")) { Assert.AreEqual (null, stmt.Bind (3, null, "", null).Query ()); try { con.RemoveFunction (); Assert.Fail ("Removed function while statement active"); } catch (SqliteException e) { Assert.AreEqual (5, e.ErrorCode); } } try { using (var stmt = con.CreateStatement ("SELECT HYENA_MD5(?, ?, ?, ?)")) { Assert.AreEqual ("ae2b1fca515949e5d54fb22b8ed95575", stmt.Query ()); Assert.Fail ("Function HYENA_MD5 should no longer exist"); } } catch {} } [Test] public void SearchKeyFunction () { using (var stmt = con.CreateStatement ("SELECT HYENA_SEARCH_KEY(?)")) { Assert.AreEqual (null, stmt.Bind (null).Query ()); Assert.AreEqual ("eee", stmt.Bind ("Éee").Query ()); Assert.AreEqual ("a", stmt.Bind ("\u0104").Query ()); } con.Execute ("SELECT HYENA_SEARCH_KEY('foo')"); } [Test] public void CollationKeyFunction () { using (var stmt = con.CreateStatement ("SELECT HYENA_COLLATION_KEY(?)")) { Assert.AreEqual (new byte[] {14, 2, 1, 27, 1, 1, 1, 0}, stmt.Bind ("\u0104").Query ()); } } [Test] public void DataTypes () { AssertGetNull (0); AssertRoundTrip (0); AssertRoundTrip (1); AssertRoundTrip (-1); AssertRoundTrip (42); AssertRoundTrip (int.MaxValue); AssertRoundTrip (int.MinValue); AssertGetNull (0); AssertRoundTrip (0); AssertRoundTrip (1); AssertRoundTrip (42); AssertRoundTrip (uint.MaxValue); AssertRoundTrip (uint.MinValue); AssertGetNull (0); AssertRoundTrip (0); AssertRoundTrip (1); AssertRoundTrip (-1); AssertRoundTrip (42); AssertRoundTrip (long.MaxValue); AssertRoundTrip (long.MinValue); AssertGetNull (0); AssertRoundTrip (0); AssertRoundTrip (1); AssertRoundTrip (42); AssertRoundTrip (ulong.MaxValue); AssertRoundTrip (ulong.MinValue); AssertGetNull (0f); AssertRoundTrip (0f); AssertRoundTrip (1f); AssertRoundTrip (-1f); AssertRoundTrip (42.222f); AssertRoundTrip (float.MaxValue); AssertRoundTrip (float.MinValue); AssertGetNull (0); AssertRoundTrip (0); AssertRoundTrip (1); AssertRoundTrip (-1); AssertRoundTrip (42.222); AssertRoundTrip (double.MaxValue); AssertRoundTrip (double.MinValue); AssertGetNull (null); AssertRoundTrip ("a"); AssertRoundTrip ("üb€r;&#co¯ol!~`\n\r\t"); AssertGetNull (null); AssertRoundTrip (new byte [] { 0 }); AssertRoundTrip (new byte [] { 0, 1}); AssertRoundTrip (System.Text.Encoding.UTF8.GetBytes ("üb€r;&#co¯ol!~`\n\r\t")); var ignore_ms = new Func ((a, b) => (a - b).TotalSeconds < 1); AssertGetNull (DateTime.MinValue); AssertRoundTrip (new DateTime (1970, 1, 1).ToLocalTime ()); AssertRoundTrip (DateTime.Now, ignore_ms); AssertRoundTrip (DateTime.MinValue); // FIXME //AssertRoundTrip (DateTime.MaxValue); Assert.AreEqual (new DateTime (1970, 1, 1).ToLocalTime (), con.Query ("SELECT 0")); AssertGetNull (TimeSpan.MinValue); AssertRoundTrip (TimeSpan.MinValue); AssertRoundTrip (TimeSpan.FromSeconds (0)); AssertRoundTrip (TimeSpan.FromSeconds (0.001)); AssertRoundTrip (TimeSpan.FromSeconds (0.002)); AssertRoundTrip (TimeSpan.FromSeconds (0.503)); AssertRoundTrip (TimeSpan.FromSeconds (1.01)); AssertRoundTrip (TimeSpan.FromHours (999.00193)); // FIXME //AssertRoundTrip (TimeSpan.MaxValue); } private void AssertRoundTrip (T val) { AssertRoundTrip (val, null); } private void AssertRoundTrip (T val, Func func) { var o = select_literal.Bind (val).Query (); if (func == null) { Assert.AreEqual (val, o); } else { Assert.IsTrue (func (val, o)); } } private void AssertGetNull (T val) { Assert.AreEqual (val, select_literal.Bind (null).Query ()); } } } #endif f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/Tests/DbBoundType.cs0000644000175000017500000002531511420634720027220 0ustar00rubenruben00000000000000// // DbBoundType.cs // // Author: // Scott Peterson // // Copyright (C) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using Hyena.Data.Sqlite; namespace Hyena.Data.Sqlite.Tests { internal enum IntEnum : int { Zero, One, Two, Three } internal enum LongEnum : long { Cero, Uno, Dos, Tres } internal class ModelProvider : SqliteModelProvider { public ModelProvider (HyenaSqliteConnection connection) : base (connection) { Init (); } public override string TableName { get { return "TestTable"; } } protected override int ModelVersion { get { return 1; } } protected override int DatabaseVersion { get { return 1; } } protected override void MigrateTable (int old_version) { } protected override void MigrateDatabase (int old_version) { } protected override DbBoundType MakeNewObject () { return new DbBoundType (); } } internal class DbBoundType { [DatabaseColumn ("PrimaryKey", Constraints = DatabaseColumnConstraints.PrimaryKey)] public int PrimaryKey; [DatabaseColumn ("PublicIntField")] public int PublicIntField; [DatabaseColumn ("PublicLongField")] public long PublicLongField; [DatabaseColumn ("PublicStringField")] public string PublicStringField; [DatabaseColumn ("PublicDateTimeField")] public DateTime PublicDateTimeField; [DatabaseColumn ("PublicTimeSpanField")] public TimeSpan PublicTimeSpanField; [DatabaseColumn ("PublicIntEnumField")] public IntEnum PublicIntEnumField; [DatabaseColumn ("PublicLongEnumField")] public LongEnum PublicLongEnumField; private int public_int_property_field; [DatabaseColumn ("PublicIntProperty")] public int PublicIntProperty { get { return public_int_property_field; } set { public_int_property_field = value; } } private long public_long_property_field; [DatabaseColumn ("PublicLongProperty")] public long PublicLongProperty { get { return public_long_property_field; } set { public_long_property_field = value; } } private string public_string_property_field; [DatabaseColumn ("PublicStringProperty")] public string PublicStringProperty { get { return public_string_property_field; } set { public_string_property_field = value; } } private DateTime public_date_time_proprety_field; [DatabaseColumn ("PublicDateTimeProperty")] public DateTime PublicDateTimeProperty { get { return public_date_time_proprety_field; } set { public_date_time_proprety_field = value; } } private TimeSpan public_time_span_property_field; [DatabaseColumn ("PublicTimeSpanProperty")] public TimeSpan PublicTimeSpanProperty { get { return public_time_span_property_field; } set { public_time_span_property_field = value; } } private IntEnum public_int_enum_property_field; [DatabaseColumn ("PublicIntEnumProperty")] public IntEnum PublicIntEnumProperty { get { return public_int_enum_property_field; } set { public_int_enum_property_field = value; } } private LongEnum public_long_enum_property_field; [DatabaseColumn ("PublicLongEnumProperty")] public LongEnum PublicLongEnumProperty { get { return public_long_enum_property_field; } set { public_long_enum_property_field = value; } } [DatabaseColumn ("PrivateIntField")] private int private_int_field; [DatabaseColumn ("PrivateLongField")] private long private_long_field; [DatabaseColumn ("PrivateStringField")] private string private_string_field; [DatabaseColumn ("PrivateDateTimeField")] private DateTime private_date_time_field; [DatabaseColumn ("PrivateTimeSpanField")] private TimeSpan private_time_span_field; [DatabaseColumn ("PrivateIntEnumField")] private IntEnum private_int_enum_field; [DatabaseColumn ("PrivateLongEnumField")] private LongEnum private_long_enum_field; public int GetPrivateIntField () { return private_int_field; } public void SetPrivateIntField (int value) { private_int_field = value; } public long GetPrivateLongField () { return private_long_field; } public void SetPrivateLongField (long value) { private_long_field = value; } public string GetPrivateStringField () { return private_string_field; } public void SetPrivateStringField (string value) { private_string_field = value; } public DateTime GetPrivateDateTimeField () { return private_date_time_field; } public void SetPrivateDateTimeField (DateTime value) { private_date_time_field = value; } public TimeSpan GetPrivateTimeSpanField () { return private_time_span_field; } public void SetPrivateTimeSpanField (TimeSpan value) { private_time_span_field = value; } public IntEnum GetPrivateIntEnumField () { return private_int_enum_field; } public void SetPrivateIntEnumField (IntEnum value) { private_int_enum_field = value; } public LongEnum GetPrivateLongEnumField () { return private_long_enum_field; } public void SetPrivateLongEnumField (LongEnum value) { private_long_enum_field = value; } private int private_int_property_field; [DatabaseColumn ("PrivateIntProperty")] private int private_int_property { get { return private_int_property_field; } set { private_int_property_field = value; } } private long private_long_property_field; [DatabaseColumn ("PrivateLongProperty")] private long private_long_property { get { return private_long_property_field; } set { private_long_property_field = value; } } private string private_string_property_field; [DatabaseColumn ("PrivateStringProperty")] private string private_string_property { get { return private_string_property_field; } set { private_string_property_field = value; } } private DateTime private_date_time_property_field; [DatabaseColumn ("PrivateDateTimeProperty")] private DateTime private_date_time_property { get { return private_date_time_property_field; } set { private_date_time_property_field = value; } } private TimeSpan private_time_span_property_field; [DatabaseColumn ("PrivateTimeSpanProperty")] private TimeSpan private_time_span_property { get { return private_time_span_property_field; } set { private_time_span_property_field = value; } } private IntEnum private_int_enum_property_field; [DatabaseColumn ("PrivateIntEnumProperty")] private IntEnum private_int_enum_property { get { return private_int_enum_property_field; } set { private_int_enum_property_field = value; } } private LongEnum private_long_enum_property_field; [DatabaseColumn ("PrivateLongEnumProperty")] private LongEnum private_long_enum_property { get { return private_long_enum_property_field; } set { private_long_enum_property_field = value; } } public int GetPrivateIntProperty () { return private_int_property; } public void SetPrivateIntProperty (int value) { private_int_property = value; } public long GetPrivateLongProperty () { return private_long_property; } public void SetPrivateLongProperty (long value) { private_long_property = value; } public string GetPrivateStringProperty () { return private_string_property; } public void SetPrivateStringProperty (string value) { private_string_property = value; } public DateTime GetPrivateDateTimeProperty () { return private_date_time_property; } public void SetPrivateDateTimeProperty (DateTime value) { private_date_time_property = value; } public TimeSpan GetPrivateTimeSpanProperty () { return private_time_span_property; } public void SetPrivateTimeSpanProperty (TimeSpan value) { private_time_span_property = value; } public IntEnum GetPrivateIntEnumProperty () { return private_int_enum_property; } public void SetPrivateIntEnumProperty (IntEnum value) { private_int_enum_property = value; } public LongEnum GetPrivateLongEnumProperty () { return private_long_enum_property; } public void SetPrivateLongEnumProperty (LongEnum value) { private_long_enum_property = value; } } } #endif f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/Tests/SqliteCommandTests.cs0000644000175000017500000001462011467745411030634 0ustar00rubenruben00000000000000// // SqliteCommandTests.cs // // Author: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using System.Reflection; using NUnit.Framework; using Hyena.Data.Sqlite; namespace Hyena.Data.Sqlite.Tests { [TestFixture] public class SqliteCommandTests { [Test] public void IdentifiesParameters () { HyenaSqliteCommand cmd = null; try { cmd = new HyenaSqliteCommand ("select foo from bar where baz = ?, bbz = ?, this = ?", "a", 32); Assert.Fail ("Should not have been able to pass 2 values to ApplyValues without exception"); } catch {} try { cmd = new HyenaSqliteCommand ("select foo from bar where baz = ?, bbz = ?, this = ?", "a", 32, "22"); } catch { Assert.Fail ("Should have been able to pass 3 values to ApplyValues without exception"); } Assert.AreEqual ("select foo from bar where baz = 'a', bbz = 32, this = '22'", GetGeneratedSql (cmd)); } [Test] public void Constructor () { HyenaSqliteCommand cmd = new HyenaSqliteCommand ("select foo from bar where baz = ?, bbz = ?, this = ?", "a", 32, "22"); Assert.AreEqual ("select foo from bar where baz = 'a', bbz = 32, this = '22'", GetGeneratedSql (cmd)); } [Test] public void CultureInvariant () { HyenaSqliteCommand cmd = new HyenaSqliteCommand ("select foo from bar where baz = ?", 32.2); Assert.AreEqual ("select foo from bar where baz = 32.2", GetGeneratedSql (cmd)); } [Test] public void ParameterSerialization () { HyenaSqliteCommand cmd = new HyenaSqliteCommand ("select foo from bar where baz = ?"); Assert.AreEqual ("select foo from bar where baz = NULL", GetGeneratedSql (cmd, null)); Assert.AreEqual ("select foo from bar where baz = 'It''s complicated, \"but\" ''''why not''''?'", GetGeneratedSql (cmd, "It's complicated, \"but\" ''why not''?")); Assert.AreEqual ("select foo from bar where baz = 0", GetGeneratedSql (cmd, new DateTime (1970, 1, 1).ToLocalTime ())); Assert.AreEqual ("select foo from bar where baz = 931309200", GetGeneratedSql (cmd, new DateTime (1999, 7, 7).ToLocalTime ())); Assert.AreEqual ("select foo from bar where baz = 555.55", GetGeneratedSql (cmd, 555.55f)); Assert.AreEqual ("select foo from bar where baz = 555.55", GetGeneratedSql (cmd, 555.55)); Assert.AreEqual ("select foo from bar where baz = 555", GetGeneratedSql (cmd, 555)); Assert.AreEqual ("select foo from bar where baz = 1", GetGeneratedSql (cmd, true)); Assert.AreEqual ("select foo from bar where baz = 0", GetGeneratedSql (cmd, false)); HyenaSqliteCommand cmd2 = new HyenaSqliteCommand ("select foo from bar where baz = ?, bar = ?, boo = ?"); Assert.AreEqual ("select foo from bar where baz = NULL, bar = NULL, boo = 22", GetGeneratedSql (cmd2, null, null, 22)); HyenaSqliteCommand cmd3 = new HyenaSqliteCommand ("select foo from bar where id in (?) and foo not in (?)"); Assert.AreEqual ("select foo from bar where id in (1,2,4) and foo not in ('foo','baz')", GetGeneratedSql (cmd3, new int [] {1, 2, 4}, new string [] {"foo", "baz"})); } static PropertyInfo tf = typeof(HyenaSqliteCommand).GetProperty ("CurrentSqlText", BindingFlags.Instance | BindingFlags.NonPublic); private static string GetGeneratedSql (HyenaSqliteCommand cmd, params object [] p) { return tf.GetValue ((new HyenaSqliteCommand (cmd.Text, p)), null) as string; } private static string GetGeneratedSql (HyenaSqliteCommand cmd) { return tf.GetValue (cmd, null) as string; } } [TestFixture] public class ObjectToSqlTests { protected void AssertToSql (object o, object expected) { Assert.AreEqual (expected, HyenaSqliteCommand.SqlifyObject (o)); } [Test] public void TestNull () { AssertToSql (null, "NULL"); } [Test] public void TestBool () { AssertToSql (false, "0"); AssertToSql (true, "1"); } [Test] public void TestString () { AssertToSql ("", "''"); AssertToSql ("test", "'test'"); AssertToSql ("te'st", "'te''st'"); } [Test] public void TestByteArray () { // BLOB notation AssertToSql (new byte[] {}, "X''"); AssertToSql (new byte[] {0x10, 0x20, 0x30}, "X'102030'"); } [Test] public void TestOtherArray () { AssertToSql (new object[] {}, ""); AssertToSql (new object[] {"a"}, "'a'"); AssertToSql (new object[] {"a", "b"}, "'a','b'"); } [Test] public void TestDateTime () { // Returned using local time, not UTC AssertToSql (new DateTime (2000, 1, 2), 946792800); // Disregards milliseconds AssertToSql (new DateTime (2000, 1, 2, 10, 9, 8, 7), 946829348); } } } #endif f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/SqliteModelProvider.cs0000644000175000017500000006724711467745411027721 0ustar00rubenruben00000000000000// // SqliteModelProvider.cs // // Author: // Scott Peterson // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.Reflection; using System.Text; namespace Hyena.Data.Sqlite { public class SqliteModelProvider where T : new () { private readonly List columns = new List (); private readonly List select_columns = new List (); private readonly List virtual_columns = new List (); private DatabaseColumn key; private int key_select_column_index; private HyenaSqliteConnection connection; private bool check_table = true; private HyenaSqliteCommand create_command; private HyenaSqliteCommand insert_command; private HyenaSqliteCommand update_command; private HyenaSqliteCommand delete_command; private HyenaSqliteCommand select_command; private HyenaSqliteCommand select_range_command; private HyenaSqliteCommand select_single_command; private string table_name; private string primary_key; private string select; private string from; private string where; private const string HYENA_DATABASE_NAME = "hyena_database_master"; public virtual string TableName { get { return table_name; } } protected virtual int ModelVersion { get { return 1; } } protected virtual int DatabaseVersion { get { return 1; } } protected virtual void MigrateTable (int old_version) { } protected virtual void MigrateDatabase (int old_version) { } protected virtual T MakeNewObject () { return new T (); } protected virtual string HyenaTableName { get { return "HyenaModelVersions"; } } public HyenaSqliteConnection Connection { get { return connection; } } protected SqliteModelProvider (HyenaSqliteConnection connection) { this.connection = connection; } public SqliteModelProvider (HyenaSqliteConnection connection, string table_name) : this (connection, table_name, true) { } public SqliteModelProvider (HyenaSqliteConnection connection, string table_name, bool checkTable) : this (connection) { this.table_name = table_name; this.check_table = checkTable; Init (); } protected void Init () { foreach (FieldInfo field in typeof(T).GetFields (BindingFlags.Instance | BindingFlags.Public)) { foreach (Attribute attribute in field.GetCustomAttributes (true)) { AddColumn (field, attribute); } } foreach (FieldInfo field in typeof(T).GetFields (BindingFlags.Instance | BindingFlags.NonPublic)) { foreach (Attribute attribute in field.GetCustomAttributes (true)) { AddColumn (field, attribute); } } foreach (PropertyInfo property in typeof(T).GetProperties (BindingFlags.Instance | BindingFlags.Public)) { foreach (Attribute attribute in property.GetCustomAttributes (true)) { AddColumn (property, attribute); } } foreach (PropertyInfo property in typeof(T).GetProperties (BindingFlags.Instance | BindingFlags.NonPublic)) { foreach (Attribute attribute in property.GetCustomAttributes (true)) { AddColumn (property, attribute); } } if (key == null) { throw new Exception (String.Format ("The {0} table does not have a primary key", TableName)); } key_select_column_index = select_columns.IndexOf (key); if (check_table) { CheckVersion (); CheckTable (); } } protected virtual void CheckVersion () { if (connection.TableExists (HyenaTableName)) { using (IDataReader reader = connection.Query (SelectVersionSql (TableName))) { if (reader.Read ()) { int table_version = reader.Get (0); if (table_version < ModelVersion) { MigrateTable (table_version); UpdateVersion (TableName, ModelVersion); } } else { InsertVersion (TableName, ModelVersion); } } int db_version = connection.Query (SelectVersionSql (HYENA_DATABASE_NAME)); if (db_version < DatabaseVersion) { MigrateDatabase (db_version); UpdateVersion (HYENA_DATABASE_NAME, DatabaseVersion); } } else { connection.Execute (String.Format ( @"CREATE TABLE {0} ( id INTEGER PRIMARY KEY, name TEXT UNIQUE, version INTEGER)", HyenaTableName) ); InsertVersion (HYENA_DATABASE_NAME, DatabaseVersion); InsertVersion (TableName, ModelVersion); } } private string SelectVersionSql (string name) { return String.Format ( "SELECT version FROM {0} WHERE name='{1}'", HyenaTableName, name); } private void UpdateVersion (string name, int version) { connection.Execute (String.Format ( "UPDATE {0} SET version={1} WHERE name='{2}'", HyenaTableName, version, name)); } private void InsertVersion (string name, int version) { connection.Execute (String.Format ( "INSERT INTO {0} (name, version) VALUES ('{1}', {2})", HyenaTableName, name, version)); } protected void CheckTable () { //Console.WriteLine ("In {0} checking for table {1}", this, TableName); IDictionary schema = connection.GetSchema (TableName); if (schema.Count > 0) { foreach (DatabaseColumn column in columns) { if (!schema.ContainsKey (column.Name.ToLower ())) { AddColumnToTable (column.Schema); } if (column.Index != null && !connection.IndexExists (column.Index)) { connection.Execute (String.Format ( "CREATE INDEX {0} ON {1}({2})", column.Index, TableName, column.Name) ); } } } else { CreateTable (); } } private void AddColumn (MemberInfo member, Attribute attribute) { DatabaseColumnAttribute column = attribute as DatabaseColumnAttribute; if (column != null) { DatabaseColumn c = member is FieldInfo ? new DatabaseColumn ((FieldInfo)member, column) : new DatabaseColumn ((PropertyInfo)member, column); AddColumn (c, column.Select); } VirtualDatabaseColumnAttribute virtual_column = attribute as VirtualDatabaseColumnAttribute; if (virtual_column != null) { if (member is FieldInfo) { virtual_columns.Add (new VirtualDatabaseColumn ((FieldInfo) member, virtual_column)); } else { virtual_columns.Add (new VirtualDatabaseColumn ((PropertyInfo) member, virtual_column)); } } } protected void AddColumn (DatabaseColumn c, bool select) { foreach (DatabaseColumn col in columns) { if (col.Name == c.Name) { throw new Exception (String.Format ( "{0} has multiple columns named {1}", TableName, c.Name) ); } if (col.Index != null && col.Index == c.Index) { throw new Exception (String.Format ( "{0} has multiple indecies named {1}", TableName, c.Name) ); } } columns.Add (c); if (select) { select_columns.Add (c); } if ((c.Constraints & DatabaseColumnConstraints.PrimaryKey) > 0) { if (key != null) { throw new Exception (String.Format ( "Multiple primary keys in the {0} table", TableName) ); } key = c; } } protected virtual void CreateTable () { connection.Execute (CreateCommand); foreach (DatabaseColumn column in columns) { if (column.Index != null) { connection.Execute (String.Format ( "CREATE INDEX {0} ON {1}({2})", column.Index, TableName, column.Name) ); } } } protected void CreateIndex (string name, string columns) { Connection.Execute (String.Format ( "CREATE INDEX {0} ON {1} ({2})", name, TableName, columns )); } public virtual void Save (T target, bool force_insert) { try { if (Convert.ToInt32 (key.GetRawValue (target)) > 0 && !force_insert) { Update (target); } else { key.SetValue (target, Insert (target)); } } catch (Exception e) { Hyena.Log.Exception (e); Hyena.Log.DebugFormat ("type of key value: {0}", key.GetRawValue (target).GetType ()); throw; } } public virtual void Save (T target) { Save (target, false); } protected virtual object [] GetInsertParams (T target) { // TODO create an instance variable object array and reuse it? beware threading issues object [] values = new object [columns.Count - 1]; int j = 0; for (int i = 0; i < columns.Count; i++) { if (columns[i] != key) { values[j] = columns[i].GetValue (target); j++; } } return values; } protected int Insert (T target) { return connection.Execute (InsertCommand, GetInsertParams (target)); } protected object [] GetUpdateParams (T target) { // TODO create an instance variable object array and reuse it? beware threading issues object [] values = new object [columns.Count]; int j = 0; for (int i = 0; i < columns.Count; i++) { if (columns[i] != key) { values[j] = columns[i].GetValue (target); j++; } } values[j] = key.GetValue (target); return values; } protected void Update (T target) { connection.Execute (UpdateCommand, GetUpdateParams (target)); } public virtual T Load (IDataReader reader) { T item = MakeNewObject (); Load (reader, item); return item; } public void Load (IDataReader reader, T target) { int i = 0; AbstractDatabaseColumn bad_column = null; try { foreach (var column in select_columns) { bad_column = column; column.SetValue (target, reader.Get (i++, column.ValueType)); } foreach (var column in virtual_columns) { bad_column = column; column.SetValue (target, reader.Get (i++, column.ValueType)); } } catch (Exception e) { Log.Debug ( String.Format ("Caught exception trying to load database column {0}", bad_column == null ? "[unknown]" : bad_column.Name), e.ToString () ); } } public IEnumerable FetchAll () { using (IDataReader reader = connection.Query (SelectCommand)) { while (reader.Read ()) { yield return Load (reader); } } } public T FetchFirstMatching (string condition, params object [] vals) { foreach (T item in FetchAllMatching (String.Format ("{0} LIMIT 1", condition), vals)) { return item; } return default(T); } public IEnumerable FetchAllMatching (string condition, params object [] vals) { HyenaSqliteCommand fetch_matching_command = CreateFetchCommand (condition); using (IDataReader reader = connection.Query (fetch_matching_command, vals)) { while (reader.Read ()) { yield return Load (reader); } } } public HyenaSqliteCommand CreateFetchCommand (string condition) { return new HyenaSqliteCommand (String.Format ("{0} AND {1}", SelectCommand.Text, condition)); } public IEnumerable FetchRange (int offset, int limit) { using (IDataReader reader = connection.Query (SelectRangeCommand, offset, limit)) { while (reader.Read ()) { yield return Load (reader); } } } public T FetchSingle (int id) { return FetchSingle ((long) id); } public virtual T FetchSingle (long id) { using (IDataReader reader = connection.Query (SelectSingleCommand, id)) { if (reader.Read ()) { return Load (reader); } } return default(T); } protected long PrimaryKeyFor (T item) { return Convert.ToInt64 (key.GetValue (item)); } protected long PrimaryKeyFor (IDataReader reader) { return Convert.ToInt64 (reader[key_select_column_index]); } public virtual void Delete (long id) { if (id > 0) connection.Execute (DeleteCommand, id); } public void Delete (T item) { Delete (PrimaryKeyFor (item)); } public void Delete (string condition, params object [] vals) { connection.Execute (String.Format ("DELETE FROM {0} WHERE {1}", TableName, condition), vals); } public virtual void Delete (IEnumerable items) { List ids = new List (); long id; foreach (T item in items) { id = PrimaryKeyFor (item); if (id > 0) ids.Add (id); } if (ids.Count > 0) connection.Execute (DeleteCommand, ids.ToArray ()); } public bool Refresh (T item) { if (key == null || item == null) return false; int id = (int) key.GetValue (item); if (id < 1) return false; using (IDataReader reader = connection.Query (SelectSingleCommand, id)) { if (reader.Read ()) { Load (reader, item); return true; } } return false; } public void Copy (T original, T copy) { foreach (DatabaseColumn column in select_columns) { if (column != key) { column.SetValue (copy, column.GetRawValue (original)); } } foreach (var column in virtual_columns) { column.SetValue (copy, column.GetRawValue (original)); } } protected virtual HyenaSqliteCommand CreateCommand { get { if (create_command == null) { StringBuilder builder = new StringBuilder (); builder.Append ("CREATE TABLE "); builder.Append (TableName); builder.Append ('('); bool first = true; foreach (DatabaseColumn column in columns) { if (first) { first = false; } else { builder.Append (','); } builder.Append (column.Schema); } builder.Append (')'); create_command = new HyenaSqliteCommand (builder.ToString ()); } return create_command; } } protected virtual HyenaSqliteCommand InsertCommand { get { // FIXME can this string building be done more nicely? if (insert_command == null) { StringBuilder cols = new StringBuilder (); StringBuilder vals = new StringBuilder (); bool first = true; foreach (DatabaseColumn column in columns) { if (column != key) { if (first) { first = false; } else { cols.Append (','); vals.Append (','); } cols.Append (column.Name); vals.Append ('?'); } } insert_command = new HyenaSqliteCommand (String.Format ( "INSERT INTO {0} ({1}) VALUES ({2})", TableName, cols.ToString (), vals.ToString ()) ); } return insert_command; } } protected virtual HyenaSqliteCommand UpdateCommand { get { if (update_command == null) { StringBuilder builder = new StringBuilder (); builder.Append ("UPDATE "); builder.Append (TableName); builder.Append (" SET "); bool first = true; foreach (DatabaseColumn column in columns) { if (column != key) { if (first) { first = false; } else { builder.Append (','); } builder.Append (column.Name); builder.Append (" = ?"); } } builder.Append (" WHERE "); builder.Append (key.Name); builder.Append (" = ?"); update_command = new HyenaSqliteCommand (builder.ToString ()); } return update_command; } } protected virtual HyenaSqliteCommand SelectCommand { get { if (select_command == null) { select_command = new HyenaSqliteCommand ( String.Format ( "SELECT {0} FROM {1} WHERE {2}", Select, From, String.IsNullOrEmpty (Where) ? "1=1" : Where ) ); } return select_command; } } protected virtual HyenaSqliteCommand SelectRangeCommand { get { if (select_range_command == null) { select_range_command = new HyenaSqliteCommand ( String.Format ( "SELECT {0} FROM {1}{2}{3} LIMIT ?, ?", Select, From, (String.IsNullOrEmpty (Where) ? String.Empty : " WHERE "), Where ) ); } return select_range_command; } } protected virtual HyenaSqliteCommand SelectSingleCommand { get { if (select_single_command == null) { select_single_command = new HyenaSqliteCommand ( String.Format ( "SELECT {0} FROM {1} WHERE {2}{3}{4} = ?", Select, From, Where, (String.IsNullOrEmpty (Where) ? String.Empty : " AND "), PrimaryKey ) ); } return select_single_command; } } protected virtual HyenaSqliteCommand DeleteCommand { get { if (delete_command == null) { delete_command = new HyenaSqliteCommand (String.Format ( "DELETE FROM {0} WHERE {1} IN (?)", TableName, PrimaryKey )); } return delete_command; } } public virtual string Select { get { if (select == null) { BuildQuerySql (); } return select; } } public virtual string From { get { if (from == null) { BuildQuerySql (); } return from; } } public virtual string Where { get { if (where == null) { BuildQuerySql (); } return where; } } public string PrimaryKey { get { if (primary_key == null) { primary_key = String.Format ("{0}.{1}", TableName, key.Name); } return primary_key; } protected set { primary_key = value; } } private void BuildQuerySql () { StringBuilder select_builder = new StringBuilder (); bool first = true; foreach (DatabaseColumn column in select_columns) { if (first) { first = false; } else { select_builder.Append (','); } select_builder.Append (TableName); select_builder.Append ('.'); select_builder.Append (column.Name); } StringBuilder where_builder = new StringBuilder (); Dictionary tables = new Dictionary (virtual_columns.Count + 1); bool first_virtual = true; foreach (VirtualDatabaseColumn column in virtual_columns) { if (first) { first = false; } else { select_builder.Append (','); } select_builder.Append (column.TargetTable); select_builder.Append ('.'); select_builder.Append (column.Name); bool table_not_joined = !tables.ContainsKey (column.TargetTable); if (first_virtual) { first_virtual = false; } else if (table_not_joined) { where_builder.Append (" AND "); } if (table_not_joined) { where_builder.Append (column.TargetTable); where_builder.Append ('.'); where_builder.Append (column.ForeignKey); where_builder.Append (" = "); where_builder.Append (TableName); where_builder.Append ('.'); where_builder.Append (column.LocalKey); tables.Add (column.TargetTable, null); } } StringBuilder from_builder = new StringBuilder (); from_builder.Append (TableName); foreach (KeyValuePair pair in tables) { from_builder.Append (','); from_builder.Append (pair.Key); } select = select_builder.ToString (); from = from_builder.ToString (); where = where_builder.ToString (); } public U GetProperty (T item, DbColumn column) { CheckProperty (typeof (U), column); return connection.Query (String.Format ( "SELECT {0} FROM {1} WHERE {2}={3}", column.Name, TableName, key.Name, key.GetValue (item))); } public void SetProperty (T item, U value, DbColumn column) { CheckProperty (typeof (U), column); connection.Execute (String.Format ( "UPDATE {0} SET {1}='{2}' WHERE {3}={4}", TableName, column.Name, SqliteUtils.ToDbFormat (typeof (U), value), key.Name, key.GetValue (item))); } public void ClearProperty (DbColumn column) { if (!connection.ColumnExists (TableName, column.Name)) { AddColumnToTable (SqliteUtils.BuildColumnSchema ( SqliteUtils.GetType (typeof (U)), column.Name, column.DefaultValue, column.Constraints)); } else { connection.Execute (string.Format ( "UPDATE {0} SET {1}='{2}'", TableName, column.Name, column.DefaultValue)); } } private void CheckProperty (Type type, DbColumn column) { if (!connection.ColumnExists (TableName, column.Name)) { AddColumnToTable (SqliteUtils.BuildColumnSchema ( SqliteUtils.GetType (type), column.Name, column.DefaultValue, column.Constraints)); } } private void AddColumnToTable (string column_schema) { connection.Execute (String.Format ( "ALTER TABLE {0} ADD {1}", TableName, column_schema) ); } } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Hyena.Data.Sqlite/DatabaseColumn.cs0000644000175000017500000001430011467745411026624 0ustar00rubenruben00000000000000// // DatabaseColumn.cs // // Author: // Scott Peterson // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Reflection; using System.Text; namespace Hyena.Data.Sqlite { public abstract class AbstractDatabaseColumn { private readonly FieldInfo field_info; private readonly PropertyInfo property_info; private readonly Type type; private readonly string column_type; private readonly string name; protected AbstractDatabaseColumn (FieldInfo field_info, AbstractDatabaseColumnAttribute attribute) : this (attribute, field_info, field_info.FieldType) { this.field_info = field_info; } protected AbstractDatabaseColumn (PropertyInfo property_info, AbstractDatabaseColumnAttribute attribute) : this (attribute, property_info, property_info.PropertyType) { if (!property_info.CanRead || (attribute.Select && !property_info.CanWrite)) { throw new Exception (String.Format ( "{0}: The property {1} must have both a get and a set " + "block in order to be bound to a database column.", property_info.DeclaringType, property_info.Name) ); } this.property_info = property_info; } private AbstractDatabaseColumn (AbstractDatabaseColumnAttribute attribute, MemberInfo member_info, Type type) { try { column_type = SqliteUtils.GetType (type); } catch (Exception e) { throw new Exception(string.Format( "{0}.{1}: {2}", member_info.DeclaringType, member_info.Name, e.Message)); } this.name = attribute.ColumnName ?? member_info.Name; this.type = type; } public object GetRawValue (object target) { return field_info != null ? field_info.GetValue (target) : property_info.GetValue (target, null); } public object GetValue (object target) { object result = GetRawValue (target); return SqliteUtils.ToDbFormat (type, result); } public void SetValue (object target, object value) { if (field_info != null) { field_info.SetValue (target, value); } else { property_info.SetValue (target, value, null); } } public string Name { get { return name; } } public string Type { get { return column_type; } } public Type ValueType { get { return type; } } } public sealed class DatabaseColumn : AbstractDatabaseColumn { private DatabaseColumnAttribute attribute; public DatabaseColumn (FieldInfo field_info, DatabaseColumnAttribute attribute) : base (field_info, attribute) { this.attribute = attribute; } public DatabaseColumn (PropertyInfo property_info, DatabaseColumnAttribute attribute) : base (property_info, attribute) { this.attribute = attribute; } public DatabaseColumnConstraints Constraints { get { return attribute.Constraints; } } public string DefaultValue { get { return attribute.DefaultValue; } } public string Index { get { return attribute.Index; } } public string Schema { get { return SqliteUtils.BuildColumnSchema (Type, Name, attribute.DefaultValue, attribute.Constraints); } } public override bool Equals (object o) { DatabaseColumn column = o as DatabaseColumn; return o != null && column.Name.Equals (Name); } public override int GetHashCode () { return Name.GetHashCode (); } } internal sealed class VirtualDatabaseColumn : AbstractDatabaseColumn { private VirtualDatabaseColumnAttribute attribute; public VirtualDatabaseColumn (FieldInfo field_info, VirtualDatabaseColumnAttribute attribute) : base (field_info, attribute) { this.attribute = attribute; } public VirtualDatabaseColumn (PropertyInfo property_info, VirtualDatabaseColumnAttribute attribute) : base (property_info, attribute) { this.attribute = attribute; } public string TargetTable { get { return attribute.TargetTable; } } public string LocalKey { get { return attribute.LocalKey; } } public string ForeignKey { get { return attribute.ForeignKey; } } } public struct DbColumn { public readonly string Name; public readonly DatabaseColumnConstraints Constraints; public readonly string DefaultValue; public DbColumn(string name, DatabaseColumnConstraints constraints, string default_value) { Name = name; Constraints = constraints; DefaultValue = default_value; } } } f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Makefile.in0000644000175000017500000007037511503407233022306 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = lib/Hyena/Hyena.Data.Sqlite ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = Hyena.Data.Sqlite TARGET = library LINK = -r:Mono.Posix -r:System -r:System.Core -r:$(DIR_BIN)/Hyena.dll \ $(am__append_1) SOURCES = \ Hyena.Data.Sqlite/ArrayDataReader.cs \ Hyena.Data.Sqlite/Sqlite.cs \ Hyena.Data.Sqlite/DatabaseColumn.cs \ Hyena.Data.Sqlite/DatabaseColumnAttribute.cs \ Hyena.Data.Sqlite/HyenaSqliteCommand.cs \ Hyena.Data.Sqlite/HyenaSqliteConnection.cs \ Hyena.Data.Sqlite/SqliteFunction.cs \ Hyena.Data.Sqlite/SqliteFunctionAttribute.cs \ Hyena.Data.Sqlite/ICacheableDatabaseModel.cs \ Hyena.Data.Sqlite/SqliteModelCache.cs \ Hyena.Data.Sqlite/SqliteModelProvider.cs \ Hyena.Data.Sqlite/SqliteUtils.cs \ Hyena.Data.Sqlite/Tests/DbBoundType.cs \ Hyena.Data.Sqlite/Tests/SqliteCommandTests.cs \ Hyena.Data.Sqlite/Tests/SqliteModelProviderTests.cs \ Hyena.Data.Sqlite/Tests/SqliteTests.cs \ Hyena.Data.Sqlite/Tests/SqliteUtilTests.cs \ Hyena.Metrics/DbSampleStore.cs \ Hyena.Metrics/HttpPoster.cs \ Hyena.Metrics/ISampleStore.cs \ Hyena.Metrics/MemorySampleStore.cs \ Hyena.Metrics/Metric.cs \ Hyena.Metrics/MetricsCollection.cs \ Hyena.Metrics/Sample.cs \ Hyena.Metrics/Tests/MetricsTests.cs # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/Hyena/Hyena.Data.Sqlite/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/Hyena/Hyena.Data.Sqlite/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/lib/Hyena/Hyena.Data.Sqlite/Makefile.am0000644000175000017500000000222211467745411022273 0ustar00rubenruben00000000000000ASSEMBLY = Hyena.Data.Sqlite TARGET = library LINK = -r:Mono.Posix -r:System -r:System.Core -r:$(DIR_BIN)/Hyena.dll SOURCES = \ Hyena.Data.Sqlite/ArrayDataReader.cs \ Hyena.Data.Sqlite/Sqlite.cs \ Hyena.Data.Sqlite/DatabaseColumn.cs \ Hyena.Data.Sqlite/DatabaseColumnAttribute.cs \ Hyena.Data.Sqlite/HyenaSqliteCommand.cs \ Hyena.Data.Sqlite/HyenaSqliteConnection.cs \ Hyena.Data.Sqlite/SqliteFunction.cs \ Hyena.Data.Sqlite/SqliteFunctionAttribute.cs \ Hyena.Data.Sqlite/ICacheableDatabaseModel.cs \ Hyena.Data.Sqlite/SqliteModelCache.cs \ Hyena.Data.Sqlite/SqliteModelProvider.cs \ Hyena.Data.Sqlite/SqliteUtils.cs \ Hyena.Data.Sqlite/Tests/DbBoundType.cs \ Hyena.Data.Sqlite/Tests/SqliteCommandTests.cs \ Hyena.Data.Sqlite/Tests/SqliteModelProviderTests.cs \ Hyena.Data.Sqlite/Tests/SqliteTests.cs \ Hyena.Data.Sqlite/Tests/SqliteUtilTests.cs \ Hyena.Metrics/DbSampleStore.cs \ Hyena.Metrics/HttpPoster.cs \ Hyena.Metrics/ISampleStore.cs \ Hyena.Metrics/MemorySampleStore.cs \ Hyena.Metrics/Metric.cs \ Hyena.Metrics/MetricsCollection.cs \ Hyena.Metrics/Sample.cs \ Hyena.Metrics/Tests/MetricsTests.cs include $(top_srcdir)/build/build.mk f-spot-0.8.2/lib/Hyena/Hyena/0000777000175000017500000000000011503407405016122 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/Hyena.dll.config0000644000175000017500000000027111430563642021130 0ustar00rubenruben00000000000000 f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/0000777000175000017500000000000011503407403020034 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/ISelectable.cs0000644000175000017500000000250211420634720022534 0ustar00rubenruben00000000000000// // ISelectable.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Hyena.Collections; namespace Hyena.Data { public interface ISelectable { Selection Selection { get; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/ArrayModelCache.cs0000644000175000017500000000446611430563642023363 0ustar00rubenruben00000000000000// // ArrayModelCache.cs // // Author: // Gabriel Burt // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Data { public abstract class ArrayModelCache : ModelCache where T : ICacheableItem, new () { protected T [] cache; protected long offset = -1; protected long limit = 0; public ArrayModelCache (ICacheableModel model) : base (model) { cache = new T [Model.FetchCount]; } public override bool ContainsKey (long i) { return (i >= offset && i <= (offset + limit)); } public override void Add (long i, T item) { if (cache.Length != Model.FetchCount) { cache = new T [Model.FetchCount]; Clear (); } if (offset == -1 || i < offset || i >= (offset + cache.Length)) { offset = i; limit = 0; } cache [i - offset] = item; limit++; } public override T this [long i] { get { return cache [i - offset]; } } public override void Clear () { offset = -1; limit = 0; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/IDataBinder.cs0000644000175000017500000000251011467745411022500 0ustar00rubenruben00000000000000// // IDataBinder.cs // // Author: // Gabriel Burt // // Copyright (C) 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using Hyena.Data; namespace Hyena.Data { public interface IDataBinder { void Bind (object o); object BoundObject { get; set; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/BaseListModel.cs0000644000175000017500000000610511420634720023052 0ustar00rubenruben00000000000000// // BaseListModel.cs // // Author: // Gabriel Burt // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Hyena.Collections; namespace Hyena.Data { public abstract class BaseListModel : IListModel { private Selection selection; public event EventHandler Cleared; public event EventHandler Reloaded; public BaseListModel () : base () { } protected virtual void OnCleared () { Selection.MaxIndex = Count - 1; EventHandler handler = Cleared; if(handler != null) { handler(this, EventArgs.Empty); } } protected virtual void OnReloaded () { Selection.MaxIndex = Count - 1; EventHandler handler = Reloaded; if(handler != null) { handler(this, EventArgs.Empty); } } public void RaiseReloaded () { OnReloaded (); } public abstract void Clear(); public abstract void Reload(); public abstract T this[int index] { get; } public abstract int Count { get; } public virtual object GetItem (int index) { return this[index]; } public virtual Selection Selection { get { return selection; } protected set { selection = value; } } protected ModelSelection model_selection; public virtual ModelSelection SelectedItems { get { return model_selection ?? (model_selection = new ModelSelection (this, Selection)); } } public T FocusedItem { get { return Selection.FocusedIndex == -1 ? default(T) : this[Selection.FocusedIndex]; } } private bool can_reorder = false; public bool CanReorder { get { return can_reorder; } set { can_reorder = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/SortType.cs0000644000175000017500000000243511420634720022156 0ustar00rubenruben00000000000000// // SortType.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // namespace Hyena.Data { public enum SortType { None, Ascending, Descending } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/ICareAboutView.cs0000644000175000017500000000243211420634720023173 0ustar00rubenruben00000000000000// // ICareAboutView.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // namespace Hyena.Data { public interface ICareAboutView { int RowsInView { set; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/ICacheableModel.cs0000644000175000017500000000252411420634720023305 0ustar00rubenruben00000000000000// // ICacheableModel.cs // // Author: // Gabriel Burt // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; namespace Hyena.Data { public interface ICacheableModel : ISelectable { int FetchCount { get; } } }f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/MemoryListModel.cs0000644000175000017500000000511611420634720023451 0ustar00rubenruben00000000000000// // MemoryListModel.cs // // Author: // Gabriel Burt // // Copyright (C) 2009 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using Hyena.Collections; namespace Hyena.Data { public class MemoryListModel : BaseListModel { private List list; public MemoryListModel () { list = new List (); Selection = new Selection (); } public override void Clear () { lock (list) { list.Clear (); } OnCleared (); } public override void Reload () { OnReloaded (); } public int IndexOf (T item) { lock (list) { return list.IndexOf (item); } } public void Add (T item) { lock (list) { list.Add (item); } } public void Remove (T item) { lock (list) { list.Remove (item); } } public override T this[int index] { get { lock (list) { if (list.Count <= index || index < 0) { return default (T); } return list[index]; } } } public override int Count { get { lock (list) { return list.Count; } } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/IPropertyStoreExpose.cs0000644000175000017500000000250211420634720024516 0ustar00rubenruben00000000000000// // IPropertyStoreExpose.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Data { public interface IPropertyStoreExpose { PropertyStore PropertyStore { get; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/ICacheableItem.cs0000644000175000017500000000253111420634720023141 0ustar00rubenruben00000000000000// // ICacheableItem.cs // // Author: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using Hyena.Data; namespace Hyena.Data { public interface ICacheableItem { object CacheEntryId { get; set; } long CacheModelId { get; set; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/DictionaryModelCache.cs0000644000175000017500000000370211420634720024375 0ustar00rubenruben00000000000000// // DictionaryModelCache.cs // // Author: // Gabriel Burt // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; namespace Hyena.Data { public abstract class DictionaryModelCache : ModelCache where T : ICacheableItem, new () { protected Dictionary cache; public DictionaryModelCache (ICacheableModel model) : base (model) { cache = new Dictionary (model.FetchCount); } public override bool ContainsKey (long i) { return cache.ContainsKey (i); } public override void Add (long i, T item) { cache.Add (i, item); } public override T this [long i] { get { return cache [i]; } } public override void Clear () { cache.Clear (); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/ISortableColumn.cs0000644000175000017500000000261511420634720023427 0ustar00rubenruben00000000000000// // ISortableColumn.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // namespace Hyena.Data { public interface ISortableColumn { string SortKey { get; } SortType SortType { get; set; } Hyena.Query.QueryField Field { get; } string Id { get; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/PropertyStore.cs0000644000175000017500000001530211441732606023230 0ustar00rubenruben00000000000000// // PropertyStore.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; namespace Hyena.Data { public delegate void PropertyChangeEventHandler(object o, PropertyChangeEventArgs args); public class PropertyChangeEventArgs : EventArgs { private string property_name; private bool added; private bool removed; private object old_value; private object new_value; public PropertyChangeEventArgs(string propertyName, bool added, bool removed, object oldValue, object newValue) { this.property_name = propertyName; this.added = added; this.removed = removed; this.old_value = oldValue; this.new_value = newValue; } public string PropertyName { get { return property_name; } } public bool Added { get { return added; } } public bool Removed { get { return removed; } } public object OldValue { get { return old_value; } } public object NewValue { get { return new_value; } } } public class PropertyStore { private Dictionary object_store; public event PropertyChangeEventHandler PropertyChanged; public PropertyStore() { } protected virtual void OnPropertyChanged(string propertyName, bool added, bool removed, object oldValue, object newValue) { PropertyChangeEventHandler handler = PropertyChanged; if(handler != null) { PropertyChangeEventArgs args = new PropertyChangeEventArgs(propertyName, added, removed, oldValue, newValue); handler(this, args); } } public void Remove(string name) { bool raise = false; object old_value = null; lock(this) { if(object_store.ContainsKey(name)) { old_value = object_store[name]; object_store.Remove(name); raise = true; } } if (raise) { OnPropertyChanged(name, false, true, old_value, null); } } public void RemoveStartingWith (string prefix) { lock(this) { Queue to_remove = null; foreach (KeyValuePair item in object_store) { if (item.Key.StartsWith (prefix)) { if (to_remove == null) { to_remove = new Queue (); } to_remove.Enqueue (item.Key); } } while (to_remove != null && to_remove.Count > 0) { Remove (to_remove.Dequeue ()); } } } public void Set(string name, T value) { bool added = false; T old_value = default(T); lock(this) { if(object_store == null) { object_store = new Dictionary(); } if(object_store.ContainsKey(name)) { old_value = (T)object_store[name]; if ((value == null && old_value == null) || value.Equals (old_value)) return; object_store[name] = value; } else { added = true; object_store.Add(name, value); } } OnPropertyChanged(name, added, false, old_value, value); } public T Get(string name) { lock(this) { if(object_store != null && object_store.ContainsKey(name)) { return (T)object_store[name]; } return default(T); } } public T Get(string name, T fallback) { lock(this) { if(object_store != null && object_store.ContainsKey(name)) { return (T)object_store[name]; } return fallback; } } public int GetInteger(string name) { return Get(name); } public void SetInteger(string name, int value) { Set(name, value); } // No longer used, since it causes strings to be marked for translation /*public string GetString(string name) { return Get(name); }*/ public void SetString(string name, string value) { Set(name, value); } public string [] GetStringList(string name) { return Get(name); } public void SetStringList(string name, params string [] value) { Set(name, value); } public bool GetBoolean(string name) { return Get(name); } public void SetBoolean(string name, bool value) { Set(name, value); } public bool Contains(string name) { lock(this) { return object_store != null && object_store.ContainsKey(name); } } public Type GetType(string name) { lock(this) { return Contains(name) ? object_store[name].GetType() : null; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/ISortable.cs0000644000175000017500000000251011420634720022243 0ustar00rubenruben00000000000000// // ISortable.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // namespace Hyena.Data { public interface ISortable { bool Sort (ISortableColumn column); ISortableColumn SortColumn { get; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/ModelCache.cs0000644000175000017500000000443411430563642022357 0ustar00rubenruben00000000000000// // ModelCache.cs // // Author: // Gabriel Burt // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; namespace Hyena.Data { public abstract class ModelCache where T : ICacheableItem, new () { private ICacheableModel model; protected ICacheableModel Model { get { return model; } } public ModelCache (ICacheableModel model) { this.model = model; } public virtual T GetValue (long index) { lock (this) { if (ContainsKey (index)) return this[index]; FetchSet (index, model.FetchCount); if (ContainsKey (index)) return this[index]; return default (T); } } // Responsible for fetching a set of items and placing them in the cache protected abstract void FetchSet (long offset, long limit); // Regenerate the cache public abstract void Reload (); public abstract bool ContainsKey (long i); public abstract void Add (long i, T item); public abstract T this[long i] { get; } public abstract void Clear (); } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/ObjectBinder.cs0000644000175000017500000000746511467745411022742 0ustar00rubenruben00000000000000// // ObjectBinder.cs // // Author: // Aaron Bockover // Gabriel Burt // // Copyright 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Reflection; namespace Hyena.Data { public class ObjectBinder : IDataBinder { private PropertyInfo property_info; private PropertyInfo sub_property_info; public void Bind (object item) { BindDataItem (item); } public virtual void BindDataItem (object item) { if (item == null) { BoundObjectParent = null; bound_object = null; return; } BoundObjectParent = item; if (Property != null) { EnsurePropertyInfo (Property, ref property_info, BoundObjectParent); bound_object = property_info.GetValue (BoundObjectParent, null); if (SubProperty != null) { EnsurePropertyInfo (SubProperty, ref sub_property_info, bound_object); bound_object = sub_property_info.GetValue (bound_object, null); } } else { bound_object = BoundObjectParent; } } private void EnsurePropertyInfo (string name, ref PropertyInfo prop, object obj) { if (prop == null || prop.ReflectedType != obj.GetType ()) { prop = obj.GetType ().GetProperty (name); if (prop == null) { throw new Exception (String.Format ( "In {0}, type {1} does not have property {2}", this, obj.GetType (), name)); } } } protected Type BoundType { get { return bound_object.GetType (); } } private object bound_object; public object BoundObject { get { return bound_object; } set { if (Property != null) { EnsurePropertyInfo (Property, ref property_info, BoundObjectParent); property_info.SetValue (BoundObjectParent, value, null); } } } public object BoundObjectParent { get; private set; } private string property; public string Property { get { return property; } set { property = value; if (value != null) { int i = value.IndexOf ("."); if (i != -1) { property = value.Substring (0, i); SubProperty = value.Substring (i + 1, value.Length - i - 1); } } } } public string SubProperty { get; set; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/ModelSelection.cs0000644000175000017500000000472711420634720023301 0ustar00rubenruben00000000000000// // ModelSelection.cs.cs // // Author: // Gabriel Burt // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Collections.Generic; using Hyena.Collections; namespace Hyena.Data { //public class ModelSelection : IList public class ModelSelection : IEnumerable { private IListModel model; private Selection selection; #region Properties /*public T this [int index] { get { if (index >= selection.Count) throw new ArgumentOutOfRangeException ("index"); //return model [selection [index]]; return default(T); } }*/ public int Count { get { return selection.Count; } } #endregion public ModelSelection (IListModel model, Selection selection) { this.model = model; this.selection = selection; } #region Methods /*public int IndexOf (T value) { //selection.IndexOf (model.IndexOf (value)); return -1; }*/ public IEnumerator GetEnumerator () { foreach (int i in selection) { yield return model [i]; } } IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator (); } #endregion } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/IFilterable.cs0000644000175000017500000000250011420634720022540 0ustar00rubenruben00000000000000// // IFilterable.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // namespace Hyena.Data { public interface IFilterable { string UserQuery { get; set; } int UnfilteredCount { get; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/IListModel.cs0000644000175000017500000000334411420634720022372 0ustar00rubenruben00000000000000// // IListModel.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Hyena.Collections; namespace Hyena.Data { public interface IListModel : ISelectable { event EventHandler Cleared; event EventHandler Reloaded; void Clear (); void Reload (); int Count { get; } bool CanReorder { get; } object GetItem (int index); } public interface IListModel : IListModel { T this[int index] { get; } } public interface IObjectListModel : IListModel { ColumnDescription [] ColumnDescriptions { get; } } }f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Data/ColumnDescription.cs0000644000175000017500000000672511420634720024034 0ustar00rubenruben00000000000000// // ColumnDescription.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Data { public class ColumnDescription { private string title; private string long_title; private double width; private bool visible; private string property; private bool initialized; public event EventHandler VisibilityChanged; public event EventHandler WidthChanged; public ColumnDescription (string property, string title, double width) : this (property, title, width, true) { } public ColumnDescription (string property, string title, double width, bool visible) { this.property = property; this.title = title; this.long_title = title; Width = width; Visible = visible; initialized = true; } protected virtual void OnVisibilityChanged () { EventHandler handler = VisibilityChanged; if (handler != null) { handler (this, EventArgs.Empty); } } protected virtual void OnWidthChanged () { EventHandler handler = WidthChanged; if (handler != null) { handler (this, EventArgs.Empty); } } public string Title { get { return title; } set { title = value; } } public string LongTitle { get { return long_title; } set { long_title = value; } } public double Width { get { return width; } set { if (Double.IsNaN (value)) { return; } double old = width; width = value; if (initialized && value != old) { OnWidthChanged (); } } } public int OrderHint { get; set; } public string Property { get { return property; } set { property = value; } } public bool Visible { get { return visible; } set { bool old = Visible; visible = value; if(initialized && value != old) { OnVisibilityChanged (); } } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Collections/0000777000175000017500000000000011503407403021441 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Collections/IntervalHeap.cs0000644000175000017500000002455011420634720024356 0ustar00rubenruben00000000000000// // IntervalHeap.cs // // Author: // Aaron Bockover // // Copyright (C) 2006-2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Collections.Generic; namespace Hyena.Collections { public class IntervalHeap : ICollection, ICollection { private const int MIN_CAPACITY = 16; private int count; private int generation; private Interval [] heap; public IntervalHeap () { Clear (); } public virtual T Pop () { if (count == 0) { throw new InvalidOperationException (); } T item = heap[0].Item; MoveDown (0, heap[--count]); generation++; return item; } public virtual T Peek () { if (count == 0) { throw new InvalidOperationException (); } return heap[0].Item; } public virtual void Push (T item, int priority) { if (item == null) { throw new ArgumentNullException ("item"); } if (count == heap.Length) { OptimalArrayResize (ref heap, 1); } MoveUp (++count - 1, new Interval (item, priority)); generation++; } public virtual void Clear () { generation = 0; count = 0; heap = new Interval[MIN_CAPACITY]; } void ICollection.CopyTo (Array array, int index) { if (array == null) { throw new ArgumentNullException ("array"); } if (index < 0) { throw new ArgumentOutOfRangeException ("index"); } Array.Copy (heap, 0, array, index, count); } public virtual void CopyTo (T [] array, int index) { if (array == null) { throw new ArgumentNullException ("array"); } if (index < 0) { throw new ArgumentOutOfRangeException ("index"); } Array.Copy (heap, 0, array, index, count); } public virtual bool Contains (T item) { if (item == null) { throw new ArgumentNullException ("item"); } return FindItemHeapIndex (item) >= 0; } public virtual void Add (T item) { if (item == null) { throw new ArgumentNullException ("item"); } Push (item, 0); } public virtual bool Remove (T item) { if (item == null) { throw new ArgumentNullException ("item"); } int index = FindItemHeapIndex (item); if (index < 0) { return false; } MoveDown (index, heap[--count]); generation++; return true; } public virtual void TrimExcess () { if (count < heap.Length * 0.9) { Array.Resize (ref heap, count); } } IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator (); } public virtual IEnumerator GetEnumerator () { return new IntervalHeapEnumerator (this); } public static IntervalHeap Synchronized (IntervalHeap heap) { if (heap == null) { throw new ArgumentNullException ("heap"); } return new SyncIntervalHeap (heap); } private int FindItemHeapIndex (T item) { for (int i = 0; i < count; i++) { if (item.Equals (heap[i].Item)) { return i; } } return -1; } private int GetLeftChildIndex (int index) { return index * 2 + 1; } private int GetParentIndex (int index) { return (index - 1) / 2; } private static void OptimalArrayResize (ref Interval [] array, int grow) { int new_capacity = array.Length == 0 ? 1 : array.Length; int min_capacity = array.Length == 0 ? MIN_CAPACITY : array.Length + grow; while (new_capacity < min_capacity) { new_capacity <<= 1; } Array.Resize (ref array, new_capacity); } private void MoveUp (int index, Interval node) { int parent_index = GetParentIndex (index); while (index > 0 && heap[parent_index].Priority < node.Priority) { heap[index] = heap[parent_index]; index = parent_index; parent_index = GetParentIndex (index); } heap[index] = node; } private void MoveDown (int index, Interval node) { int child_index = GetLeftChildIndex (index); while (child_index < count) { if (child_index + 1 < count && heap[child_index].Priority < heap[child_index + 1].Priority) { child_index++; } heap[index] = heap[child_index]; index = child_index; child_index = GetLeftChildIndex (index); } MoveUp (index, node); } public virtual int Count { get { return count; } } public bool IsReadOnly { get { return false; } } public virtual object SyncRoot { get { return this; } } public virtual bool IsSynchronized { get { return false; } } private struct Interval { private T item; private int priority; public Interval (T item, int priority) { this.item = item; this.priority = priority; } public T Item { get { return item; } } public int Priority { get { return priority; } } } private class SyncIntervalHeap : IntervalHeap { private IntervalHeap heap; internal SyncIntervalHeap (IntervalHeap heap) { this.heap = heap; } public override int Count { get { lock (heap) { return heap.Count; } } } public override bool IsSynchronized { get { return true; } } public override object SyncRoot { get { return heap.SyncRoot; } } public override void Clear () { lock (heap) { heap.Clear (); } } public override bool Contains(T item) { lock (heap) { return heap.Contains (item); } } public override T Pop() { lock (heap) { return heap.Pop (); } } public override T Peek () { lock (heap) { return heap.Peek (); } } public override void Push (T item, int priority) { lock (heap) { heap.Push (item, priority); } } public override void Add (T item) { lock (heap) { heap.Add (item); } } public override bool Remove (T item) { lock (heap) { return heap.Remove (item); } } public override void TrimExcess () { lock (heap) { heap.TrimExcess (); } } public override void CopyTo (T [] array, int index) { lock (heap) { heap.CopyTo (array, index); } } public override IEnumerator GetEnumerator () { lock (heap) { return new IntervalHeapEnumerator (this); } } } private class IntervalHeapEnumerator : IEnumerator, IEnumerator { private IntervalHeap heap; private int index; private int generation; public IntervalHeapEnumerator (IntervalHeap heap) { this.heap = heap; Reset (); } public void Reset () { generation = heap.generation; index = -1; } public void Dispose () { heap = null; } public bool MoveNext () { if (generation != heap.generation) { throw new InvalidOperationException (); } if (index + 1 == heap.count) { return false; } index++; return true; } object IEnumerator.Current { get { return Current; } } public T Current { get { if (generation != heap.generation) { throw new InvalidOperationException (); } return heap.heap[index].Item; } } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Collections/QueuePipelineElement.cs0000644000175000017500000001425211420634720026056 0ustar00rubenruben00000000000000// // QueuePipelineElement.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Threading; using System.Collections.Generic; namespace Hyena.Collections { internal class ElementProcessCanceledException : ApplicationException { } public abstract class QueuePipelineElement where T : class { #pragma warning disable 0067 // FIXME: This is to mute gmcs: https://bugzilla.novell.com/show_bug.cgi?id=360455 public event EventHandler Finished; public event EventHandler ProcessedItem; #pragma warning restore 0067 private Queue queue = new Queue (); private object monitor = new object (); private AutoResetEvent thread_wait; private bool processing = false; private bool threaded = true; private bool canceled = false; private int processed_count; public int ProcessedCount { get { return processed_count; } } private int total_count; public int TotalCount { get { return total_count; } } protected abstract T ProcessItem (T item); protected virtual void OnFinished () { lock (this) { canceled = false; } lock (queue) { total_count = 0; processed_count = 0; } EventHandler handler = Finished; if (handler != null) { handler (this, EventArgs.Empty); } } protected void OnProcessedItem () { EventHandler handler = ProcessedItem; if (handler != null) { handler (this, EventArgs.Empty); } } protected virtual void OnCanceled () { lock (queue) { queue.Clear (); total_count = 0; processed_count = 0; } } public virtual void Enqueue (T item) { lock (this) { lock (queue) { queue.Enqueue (item); total_count++; } if (!threaded) { Processor (null); return; } if (thread_wait == null) { thread_wait = new AutoResetEvent (false); } if (Monitor.TryEnter (monitor)) { Monitor.Exit (monitor); ThreadPool.QueueUserWorkItem (Processor); thread_wait.WaitOne (); } } } protected virtual void EnqueueDownstream (T item) { if (NextElement != null && item != null) { NextElement.Enqueue (item); } } private void Processor (object state) { lock (monitor) { if (threaded) { thread_wait.Set (); } lock (this) { processing = true; } try { while (queue.Count > 0) { CheckForCanceled (); T item = null; lock (queue) { item = queue.Dequeue (); processed_count++; } EnqueueDownstream (ProcessItem (item)); OnProcessedItem (); } } catch (ElementProcessCanceledException) { OnCanceled (); } lock (this) { processing = false; } if (threaded) { thread_wait.Close (); thread_wait = null; } OnFinished (); } } protected virtual void CheckForCanceled () { lock (this) { if (canceled) { throw new ElementProcessCanceledException (); } } } public void Cancel () { lock (this) { if (processing) { canceled = true; } if (NextElement != null) { NextElement.Cancel (); } } } public bool Processing { get { lock (this) { return processing; } } } public bool Threaded { get { return threaded; } set { if (processing) { throw new InvalidOperationException ("Cannot change threading model while the element is processing"); } threaded = value; } } protected Queue Queue { get { return queue; } } private QueuePipelineElement next_element; internal QueuePipelineElement NextElement { get { return next_element; } set { next_element = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Collections/LruCache.cs0000644000175000017500000001440311420634720023456 0ustar00rubenruben00000000000000// // LruCache.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Collections.Generic; namespace Hyena.Collections { public struct CacheEntry { private TKey key; public TKey Key { get { return key; } set { key = value; } } private TValue value; public TValue Value { get { return this.value; } set { this.value = value; } } internal DateTime LastUsed; internal int UsedCount; } public class LruCache : IEnumerable> { private Dictionary> cache; private int max_count; private long hits; private long misses; private double? minimum_hit_ratio; public LruCache () : this (1024) { } public LruCache (int maxCount) : this (maxCount, null) { } public LruCache (int maxCount, double? minimumHitRatio) { max_count = maxCount; minimum_hit_ratio = minimumHitRatio; cache = new Dictionary> (); } public void Add (TKey key, TValue value) { lock (cache) { CacheEntry entry; if (cache.TryGetValue (key, out entry)) { Ref (ref entry); cache[key] = entry; return; } entry.Key = key; entry.Value = value; Ref (ref entry); cache.Add (key, entry); misses++; EnsureMinimumHitRatio (); if (Count > max_count) { TKey expire = FindOldestEntry (); ExpireItem (cache[expire].Value); cache.Remove (expire); } } } public bool Contains (TKey key) { lock (cache) { return cache.ContainsKey (key); } } public void Remove (TKey key) { lock (cache) { if (Contains (key)) { ExpireItem (cache[key].Value); cache.Remove (key); } } } public bool TryGetValue (TKey key, out TValue value) { lock (cache) { CacheEntry entry; if (cache.TryGetValue (key, out entry)) { value = entry.Value; Ref (ref entry); cache[key] = entry; hits++; return true; } misses++; EnsureMinimumHitRatio (); value = default (TValue); return false; } } private void EnsureMinimumHitRatio () { if (minimum_hit_ratio != null && Count > MaxCount && HitRatio < minimum_hit_ratio) { MaxCount = Count; } } private void Ref (ref CacheEntry entry) { entry.LastUsed = DateTime.Now; entry.UsedCount++; } IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator (); } public IEnumerator> GetEnumerator () { lock (cache) { foreach (KeyValuePair> item in cache) { yield return item.Value; } } } // Ok, this blows. I have no time to implement anything clever or proper here. // Using a hashtable generally sucks for this, but it's not bad for a 15 minute // hack. max_count will be sufficiently small in our case that this can't be // felt anyway. Meh. private TKey FindOldestEntry () { lock (cache) { DateTime oldest = DateTime.Now; TKey oldest_key = default (TKey); foreach (CacheEntry item in this) { if (item.LastUsed < oldest) { oldest = item.LastUsed; oldest_key = item.Key; } } return oldest_key; } } protected virtual void ExpireItem (TValue item) { } public int MaxCount { get { lock (cache) { return max_count; } } set { lock (cache) { max_count = value; } } } public int Count { get { lock (cache) { return cache.Count; } } } public double? MinimumHitRatio { get { return minimum_hit_ratio; } } public long Hits { get { return hits; } } public long Misses { get { return misses; } } public double HitRatio { get { if (misses == 0) { return 1.0; } else { return ((double)hits) / ((double)(hits + misses)); } } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Collections/QueuePipeline.cs0000644000175000017500000000714611420634720024550 0ustar00rubenruben00000000000000// // QueuePipeline.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Collections { public class QueuePipeline where T : class { #pragma warning disable 0067 // FIXME: This is to mute gmcs: https://bugzilla.novell.com/show_bug.cgi?id=360455 public event EventHandler Finished; #pragma warning restore 0067 private object sync = new object (); private QueuePipelineElement first_element; internal QueuePipelineElement FirstElement { get { return first_element; } } public QueuePipeline () { } public void AddElement (QueuePipelineElement element) { element.Finished += OnElementFinished; lock (sync) { if (first_element == null) { first_element = element; return; } QueuePipelineElement current = first_element; while (current != null) { if (current.NextElement == null) { current.NextElement = element; break; } current = current.NextElement; } } } public virtual void Enqueue (T item) { if (first_element == null) { throw new InvalidOperationException ("There are no elements in this pipeline"); } first_element.Enqueue (item); } public virtual void Cancel () { if (first_element != null) { first_element.Cancel (); } } private void OnElementFinished (object o, EventArgs args) { bool any_processing = false; lock (sync) { QueuePipelineElement element = FirstElement; while (element != null) { any_processing |= element.Processing || element.ProcessedCount < element.TotalCount; if (any_processing) { break; } element = element.NextElement; } } if (!any_processing) { OnFinished (); } } protected virtual void OnFinished () { EventHandler handler = Finished; if (handler != null) { handler (this, EventArgs.Empty); } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Collections/WriteLineElement.cs0000644000175000017500000000303011420634720025176 0ustar00rubenruben00000000000000// // WriteLineElement.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Collections { public class WriteLineElement : QueuePipelineElement where T : class { public WriteLineElement () { Threaded = false; } protected override T ProcessItem (T item) { Console.WriteLine (item); return null; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Collections/Tests/0000777000175000017500000000000011503407403022543 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Collections/Tests/RangeCollectionTests.cs0000644000175000017500000003665211420634720027177 0ustar00rubenruben00000000000000// // RangeCollectionTests.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using System.Collections.Generic; using NUnit.Framework; using Hyena.Collections; namespace Hyena.Collections.Tests { [TestFixture] public class RangeCollectionTests { [Test] public void SingleRanges () { _TestRanges (new RangeCollection (), new int [] { 1, 11, 5, 7, 15, 32, 3, 9, 34 }); } [Test] public void MergedRanges () { RangeCollection range = new RangeCollection (); int [] indexes = new int [] { 0, 7, 5, 9, 1, 6, 8, 2, 10, 12 }; _TestRanges (range, indexes); Assert.AreEqual (3, range.RangeCount); int i= 0; foreach (RangeCollection.Range r in range.Ranges) { switch (i++) { case 0: Assert.AreEqual (0, r.Start); Assert.AreEqual (2, r.End); break; case 1: Assert.AreEqual (5, r.Start); Assert.AreEqual (10, r.End); break; case 2: Assert.AreEqual (12, r.Start); Assert.AreEqual (12, r.End); break; default: Assert.Fail ("This should not be reached!"); break; } } } [Test] public void LargeSequentialContains () { RangeCollection range = new RangeCollection (); int i, n = 1000000; for (i = 0; i < n; i++) { range.Add (i); } for (i = 0; i < n; i++) { Assert.AreEqual (true, range.Contains (i)); } } [Test] public void LargeSequential () { RangeCollection range = new RangeCollection (); int i, n = 1000000; for (i = 0; i < n; i++) { range.Add (i); Assert.AreEqual (1, range.RangeCount); } Assert.AreEqual (n, range.Count); i = 0; foreach (int j in range) { Assert.AreEqual (i++, j); } Assert.AreEqual (n, i); } [Test] public void LargeNonAdjacent () { RangeCollection range = new RangeCollection (); int i, n = 1000000; for (i = 0; i < n; i += 2) { range.Add (i); } Assert.AreEqual (n / 2, range.Count); i = 0; foreach (int j in range) { Assert.AreEqual (i, j); i += 2; } Assert.AreEqual (n, i); } private static void _TestRanges (RangeCollection range, int [] indexes) { foreach (int index in indexes) { range.Add (index); } Assert.AreEqual (indexes.Length, range.Count); Array.Sort (indexes); int i = 0; foreach (int index in range) { Assert.AreEqual (indexes[i++], index); } #pragma warning disable 0618 i = 0; foreach (int index in range.Indexes) { Assert.AreEqual (indexes[i++], index); } for (i = 0; i < range.Indexes.Length; i++) { Assert.AreEqual (indexes[i], range.Indexes[i]); } #pragma warning restore 0618 } [Test] public void RemoveSingles () { RangeCollection range = new RangeCollection (); int [] indexes = new int [] { 0, 2, 4, 6, 8, 10, 12, 14 }; foreach (int index in indexes) { range.Add (index); } foreach (int index in indexes) { Assert.AreEqual (true, range.Remove (index)); } } [Test] public void RemoveStarts () { RangeCollection range = _SetupTestRemoveMerges (); Assert.AreEqual (true, range.Contains (0)); range.Remove (0); Assert.AreEqual (false, range.Contains (0)); Assert.AreEqual (4, range.RangeCount); Assert.AreEqual (true, range.Contains (2)); range.Remove (2); Assert.AreEqual (false, range.Contains (2)); Assert.AreEqual (4, range.RangeCount); Assert.AreEqual (3, range.Ranges[0].Start); Assert.AreEqual (5, range.Ranges[0].End); Assert.AreEqual (true, range.Contains (14)); range.Remove (14); Assert.AreEqual (false, range.Contains (14)); Assert.AreEqual (4, range.RangeCount); Assert.AreEqual (15, range.Ranges[2].Start); Assert.AreEqual (15, range.Ranges[2].End); } [Test] public void RemoveEnds () { RangeCollection range = _SetupTestRemoveMerges (); Assert.AreEqual (true, range.Contains (5)); range.Remove (5); Assert.AreEqual (false, range.Contains (5)); Assert.AreEqual (5, range.RangeCount); Assert.AreEqual (2, range.Ranges[1].Start); Assert.AreEqual (4, range.Ranges[1].End); Assert.AreEqual (true, range.Contains (15)); range.Remove (15); Assert.AreEqual (false, range.Contains (15)); Assert.AreEqual (5, range.RangeCount); Assert.AreEqual (14, range.Ranges[3].Start); Assert.AreEqual (14, range.Ranges[3].End); } [Test] public void RemoveMids () { RangeCollection range = _SetupTestRemoveMerges (); Assert.AreEqual (5, range.RangeCount); Assert.AreEqual (14, range.Ranges[3].Start); Assert.AreEqual (15, range.Ranges[3].End); Assert.AreEqual (true, range.Contains (9)); range.Remove (9); Assert.AreEqual (false, range.Contains (9)); Assert.AreEqual (6, range.RangeCount); Assert.AreEqual (7, range.Ranges[2].Start); Assert.AreEqual (8, range.Ranges[2].End); Assert.AreEqual (10, range.Ranges[3].Start); Assert.AreEqual (11, range.Ranges[3].End); Assert.AreEqual (14, range.Ranges[4].Start); Assert.AreEqual (15, range.Ranges[4].End); } private static RangeCollection _SetupTestRemoveMerges () { RangeCollection range = new RangeCollection (); int [] indexes = new int [] { 0, 2, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19 }; foreach (int index in indexes) { range.Add (index); } int i = 0; foreach (RangeCollection.Range r in range.Ranges) { switch (i++) { case 0: Assert.AreEqual (0, r.Start); Assert.AreEqual (0, r.End); break; case 1: Assert.AreEqual (2, r.Start); Assert.AreEqual (5, r.End); break; case 2: Assert.AreEqual (7, r.Start); Assert.AreEqual (11, r.End); break; case 3: Assert.AreEqual (14, r.Start); Assert.AreEqual (15, r.End); break; case 4: Assert.AreEqual (17, r.Start); Assert.AreEqual (19, r.End); break; default: Assert.Fail ("Should never reach here"); break; } } return range; } #pragma warning disable 0618 [Test] public void IndexesCacheGeneration () { RangeCollection range = new RangeCollection (); int [] index_cache = range.Indexes; Assert.AreSame (index_cache, range.Indexes); range.Add (0); range.Add (5); if (index_cache == range.Indexes) { Assert.Fail ("Indexes Cache not regenerated after change"); } index_cache = range.Indexes; range.Remove (0); range.Add (3); if (index_cache == range.Indexes) { Assert.Fail ("Indexes Cache not regenerated after change"); } } #pragma warning restore 0618 [Test] public void IndexOf () { RangeCollection range = new RangeCollection (); range.Add (0); range.Add (2); range.Add (3); range.Add (5); range.Add (6); range.Add (7); range.Add (8); range.Add (11); range.Add (12); range.Add (13); Assert.AreEqual (0, range.IndexOf (0)); Assert.AreEqual (1, range.IndexOf (2)); Assert.AreEqual (2, range.IndexOf (3)); Assert.AreEqual (3, range.IndexOf (5)); Assert.AreEqual (4, range.IndexOf (6)); Assert.AreEqual (5, range.IndexOf (7)); Assert.AreEqual (6, range.IndexOf (8)); Assert.AreEqual (7, range.IndexOf (11)); Assert.AreEqual (8, range.IndexOf (12)); Assert.AreEqual (9, range.IndexOf (13)); Assert.AreEqual (-1, range.IndexOf (99)); } [Test] public void IndexerForGoodIndexes () { RangeCollection range = new RangeCollection (); /* Range Idx Value 0-2 0 -> 0 1 -> 1 2 -> 2 7-9 3 -> 7 4 -> 8 5 -> 9 11-13 6 -> 11 7 -> 12 8 -> 13 */ range.Add (0); range.Add (1); range.Add (2); range.Add (7); range.Add (8); range.Add (9); range.Add (11); range.Add (12); range.Add (13); Assert.AreEqual (0, range[0]); Assert.AreEqual (1, range[1]); Assert.AreEqual (2, range[2]); Assert.AreEqual (7, range[3]); Assert.AreEqual (8, range[4]); Assert.AreEqual (9, range[5]); Assert.AreEqual (11, range[6]); Assert.AreEqual (12, range[7]); Assert.AreEqual (13, range[8]); } [Test] public void StressForGoodIndexes () { Random random = new Random (0xbeef); RangeCollection ranges = new RangeCollection (); List indexes = new List (); for (int i = 0, n = 75000; i < n; i++) { int value = random.Next (n); if (ranges.Add (value)) { CollectionExtensions.SortedInsert (indexes, value); } } Assert.AreEqual (indexes.Count, ranges.Count); for (int i = 0; i < indexes.Count; i++) { Assert.AreEqual (indexes[i], ranges[i]); } } [Test] [ExpectedException (typeof (IndexOutOfRangeException))] public void IndexerForNegativeBadIndex () { RangeCollection range = new RangeCollection (); Assert.AreEqual (0, range[1]); } [Test] [ExpectedException (typeof (IndexOutOfRangeException))] public void IndexerForZeroBadIndex () { RangeCollection range = new RangeCollection (); Assert.AreEqual (0, range[0]); } [Test] [ExpectedException (typeof (IndexOutOfRangeException))] public void IndexerForPositiveBadIndex () { RangeCollection range = new RangeCollection (); range.Add (1); Assert.AreEqual (0, range[1]); } [Test] public void ExplicitInterface () { ICollection range = new RangeCollection (); range.Add (1); range.Add (2); range.Add (5); range.Add (6); Assert.AreEqual (4, range.Count); } [Test] public void NegativeIndices () { RangeCollection c = new RangeCollection (); c.Add (-10); c.Add (-5); c.Add (5); c.Add (-8); c.Add (10); c.Add (-9); c.Add (-11); Assert.IsTrue (c.Contains(-10), "#1"); Assert.IsTrue (c.Contains(-5), "#2"); Assert.IsTrue (c.Contains(5), "#3"); Assert.IsTrue (c.Contains(-8), "#4"); Assert.AreEqual (4, c.RangeCount, "#5"); Assert.AreEqual (new RangeCollection.Range (-11, -8), c.Ranges[0], "#6"); Assert.AreEqual (new RangeCollection.Range (-5, -5), c.Ranges[1], "#7"); Assert.AreEqual (new RangeCollection.Range (5, 5), c.Ranges[2], "#8"); Assert.AreEqual (new RangeCollection.Range (10, 10), c.Ranges[3], "#9"); Assert.AreEqual (0, c.FindRangeIndexForValue (-9), "#10"); Assert.IsTrue (c.FindRangeIndexForValue (-7) < 0, "#11"); } [Test] public void IPAddressRanges () { RangeCollection ranges = new RangeCollection (); int start = GetAddress ("127.0.0.1"); int end = GetAddress ("127.0.0.50"); for (int i = start; i <= end; i++) { ranges.Add (i); } Assert.IsTrue (ranges.Contains (GetAddress ("127.0.0.15"))); Assert.IsFalse (ranges.Contains (GetAddress ("127.0.0.0"))); Assert.IsFalse (ranges.Contains (GetAddress ("127.0.0.51"))); } private static int GetAddress (string addressStr) { System.Net.IPAddress address = System.Net.IPAddress.Parse (addressStr); return (int)(System.Net.IPAddress.NetworkToHostOrder ( BitConverter.ToInt32 (address.GetAddressBytes (), 0)) >> 32); } } } #endif f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Collections/Tests/QueuePipelineTests.cs0000644000175000017500000000512011420634720026663 0ustar00rubenruben00000000000000// // ElementQueueProcessor.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using System.Threading; using System.Collections.Generic; using NUnit.Framework; using Hyena.Collections; namespace Hyena.Collections.Tests { [TestFixture] public class QueuePipelineTests { private class FakeElement : QueuePipelineElement { protected override object ProcessItem (object item) { return null; } } [Test] public void BuildPipeline () { BuildPipeline (1); BuildPipeline (2); BuildPipeline (3); BuildPipeline (10); BuildPipeline (1000); } private void BuildPipeline (int count) { List elements = new List (); for (int i = 0; i < count; i++) { elements.Add (new FakeElement ()); } QueuePipeline qp = new QueuePipeline (); foreach (FakeElement s in elements) { qp.AddElement (s); } Assert.AreEqual (elements[0], qp.FirstElement); int index = 0; FakeElement element = (FakeElement)qp.FirstElement; while (element != null) { Assert.AreEqual (elements[index++], element); element = (FakeElement)element.NextElement; } } } } #endif f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Collections/Tests/IntervalHeapTests.cs0000644000175000017500000000664111420634720026504 0ustar00rubenruben00000000000000// // IntervalHeapTests.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using NUnit.Framework; using Hyena.Collections; namespace Hyena.Collections.Tests { [TestFixture] public class IntervalHeapTests { private IntervalHeap heap; private static int [] heap_data = new int[2048]; [TestFixtureSetUp] public void Init() { heap = new IntervalHeap(); for(int i = 0; i < heap_data.Length; i++) { heap_data[i] = i; } } private void PopulateHeap() { heap.Clear(); foreach(int i in heap_data) { heap.Push(i, 0); } Assert.AreEqual(heap.Count, heap_data.Length); } [Test] public void PopHeap() { PopulateHeap(); int i = 0; while(heap.Count > 0) { heap.Pop(); i++; } Assert.AreEqual(i, heap_data.Length); } [Test] public void IterateHeap() { PopulateHeap(); int i = 0; foreach(int x in heap) { Assert.AreEqual(x, heap_data[i++]); } Assert.AreEqual(i, heap.Count); } [Test] public void RemoveItemsFromHeap() { IntervalHeap h = new IntervalHeap(); for(int i = 0; i < 20; i++) { h.Push(i, i); } h.Remove(10); h.Remove(2); h.Remove(11); h.Remove(9); h.Remove(19); h.Remove(0); Assert.AreEqual(h.Pop(), 18); Assert.AreEqual(h.Pop(), 17); Assert.AreEqual(h.Pop(), 16); Assert.AreEqual(h.Pop(), 15); Assert.AreEqual(h.Pop(), 14); Assert.AreEqual(h.Pop(), 13); Assert.AreEqual(h.Pop(), 12); Assert.AreEqual(h.Pop(), 8); Assert.AreEqual(h.Pop(), 7); Assert.AreEqual(h.Pop(), 6); Assert.AreEqual(h.Pop(), 5); Assert.AreEqual(h.Pop(), 4); Assert.AreEqual(h.Pop(), 3); Assert.AreEqual(h.Pop(), 1); Assert.AreEqual(h.Count, 0); } } } #endif f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Collections/Selection.cs0000644000175000017500000001421311420634720023714 0ustar00rubenruben00000000000000// // Selection.cs // // Author: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; #if NET_2_0 using System.Collections.Generic; #endif namespace Hyena.Collections { #if NET_1_1 internal #else public #endif class Selection : #if NET_2_0 IEnumerable #else IEnumerable #endif { RangeCollection ranges = new RangeCollection (); private int max_index; private int first_selected_index; public event EventHandler Changed; public event EventHandler FocusChanged; private int focused_index = -1; public Selection () { } public int FocusedIndex { get { return focused_index; } set { focused_index = value; var handler = FocusChanged; if (handler != null) { handler (this, EventArgs.Empty); } } } protected virtual void OnChanged () { EventHandler handler = Changed; if (handler != null) { handler (this, EventArgs.Empty); } } public void ToggleSelect (int index) { if (!ranges.Remove (index)) { ranges.Add (index); } OnChanged (); } public void Select (int index) { ranges.Add (index); if (Count == 1) first_selected_index = index; OnChanged (); } public void QuietSelect (int index) { ranges.Add (index); if (Count == 1) first_selected_index = index; } public void Unselect (int index) { if (ranges.Remove (index)) OnChanged (); } public void QuietUnselect (int index) { ranges.Remove (index); } public bool Contains(int index) { return ranges.Contains (index); } public void SelectFromFirst (int end, bool clear) { bool contains = Contains (first_selected_index); if (clear) Clear(false); if (contains) SelectRange (first_selected_index, end); else Select (end); } public void SelectRange (int a, int b) { int start = Math.Min (a, b); int end = Math.Max (a, b); int i; for (i = start; i <= end; i++) { ranges.Add (i); } if (Count == i) first_selected_index = a; OnChanged (); } public void UnselectRange (int a, int b) { int start = Math.Min (a, b); int end = Math.Max (a, b); int i; for (i = start; i <= end; i++) { ranges.Remove (i); } OnChanged (); } public virtual void SelectAll () { SelectRange (0, max_index); } public void Clear () { Clear (true); } public void Clear (bool raise) { if (ranges.Count <= 0) { return; } ranges.Clear (); if (raise) OnChanged (); } public int Count { get { return ranges.Count; } } public int MaxIndex { set { max_index = value; } get { return max_index; } } public virtual bool AllSelected { get { if (ranges.RangeCount == 1) { RangeCollection.Range range = ranges.Ranges[0]; return range.Start == 0 && range.End == max_index; } return false; } } public RangeCollection RangeCollection { get { return ranges; } } public RangeCollection.Range [] Ranges { get { return ranges.Ranges; } } public int FirstIndex { get { return Count > 0 ? ranges[0] : -1; } } public int LastIndex { get { return Count > 0 ? ranges[Count - 1]: -1; } } #if NET_2_0 public IEnumerator GetEnumerator () { return ranges.GetEnumerator (); } IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator (); } #else public IEnumerator GetEnumerator () { return ranges.GetEnumerator (); } #endif public override string ToString () { System.Text.StringBuilder sb = new System.Text.StringBuilder (); sb.AppendFormat (""); return sb.ToString (); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Collections/SelectionProxy.cs0000644000175000017500000000573711420634720024771 0ustar00rubenruben00000000000000// // SelectionProxy.cs // // Author: // Gabriel Burt // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Collections { public class SelectionProxy { private Selection selection; public event EventHandler Changed; public event EventHandler SelectionChanged; public event EventHandler FocusChanged; public Selection Selection { get { return selection; } set { if (selection == value) return; if (selection != null) { selection.Changed -= HandleSelectionChanged; selection.FocusChanged -= HandleSelectionFocusChanged; } selection = value; if (selection != null) { selection.Changed += HandleSelectionChanged; selection.FocusChanged += HandleSelectionFocusChanged; } OnSelectionChanged (); } } protected virtual void OnChanged () { EventHandler handler = Changed; if (handler != null) { handler (selection, EventArgs.Empty); } } protected virtual void OnFocusChanged () { EventHandler handler = FocusChanged; if (handler != null) { handler (selection, EventArgs.Empty); } } protected virtual void OnSelectionChanged () { EventHandler handler = SelectionChanged; if (handler != null) { handler (selection, EventArgs.Empty); } } private void HandleSelectionChanged (object o, EventArgs args) { OnChanged (); } private void HandleSelectionFocusChanged (object o, EventArgs args) { OnFocusChanged (); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Collections/CollectionExtensions.cs0000644000175000017500000000553311420634720026147 0ustar00rubenruben00000000000000// // CollectionExtensions.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Text; using System.Collections.Generic; namespace Hyena.Collections { public static class CollectionExtensions { public static void SortedInsert (List list, T value) where T : IComparable { if (list.Count == 0 || list[list.Count - 1].CompareTo (value) < 0) { list.Add (value); } else if (list[0].CompareTo (value) > 0) { list.Insert (0, value); } else { int index = list.BinarySearch (value); list.Insert (index < 0 ? ~index : index, value); } } public static string Join (IList list) { return Join (list, ", "); } public static string Join (IList list, string separator) { return Join (list, null, null, separator); } public static string Join (IList list, string wrapper, string separator) { return Join (list, wrapper, wrapper, separator); } public static string Join (IList list, string front, string back, string separator) { StringBuilder builder = new StringBuilder (); for (int i = 0, n = list.Count; i < n; i++) { if (front != null) { builder.Append (front); } builder.Append (list[i]); if (back != null) { builder.Append (back); } if (i < n - 1) { builder.Append (separator); } } return builder.ToString (); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Collections/IStackProvider.cs0000644000175000017500000000260311420634720024660 0ustar00rubenruben00000000000000// // IStackProvider.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Collections { public interface IStackProvider { T Peek (); T Pop (); void Push (T t); void Clear (); int Count { get; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Collections/RangeCollection.cs0000644000175000017500000002615511420634720025047 0ustar00rubenruben00000000000000// // RangeCollection.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; #if NET_2_0 using System.Collections.Generic; #endif #if NET_1_1 namespace System.Collections #else namespace Hyena.Collections #endif { #if NET_1_1 internal #else public #endif class RangeCollection : ICloneable, #if NET_2_0 ICollection #else ICollection #endif { public struct Range { private int start; private int end; public Range (int start, int end) { this.start = start; this.end = end; } public override string ToString () { return String.Format ("{0}-{1} ({2})", Start, End, Count); } public int Start { get { return start; } set { start = value; } } public int End { get { return end; } set { end = value; } } public int Count { get { return End - Start + 1; } } } private const int MIN_CAPACITY = 16; private Range [] ranges; private int range_count; private int index_count; private int generation; private int [] indexes_cache; private int indexes_cache_generation; public RangeCollection () { Clear (); } #region Private Array Logic private void Shift (int start, int delta) { if (delta < 0) { start -= delta; } if (start < range_count) { Array.Copy (ranges, start, ranges, start + delta, range_count - start); } range_count += delta; } private void EnsureCapacity (int growBy) { int new_capacity = ranges.Length == 0 ? 1 : ranges.Length; int min_capacity = ranges.Length == 0 ? MIN_CAPACITY : ranges.Length + growBy; while (new_capacity < min_capacity) { new_capacity <<= 1; } #if NET_2_0 Array.Resize (ref ranges, new_capacity); #else Range [] new_ranges = new Range[new_capacity]; Array.Copy (ranges, 0, new_ranges, 0, ranges.Length); ranges = new_ranges; #endif } private void Insert (int position, Range range) { if (range_count == ranges.Length) { EnsureCapacity (1); } Shift (position, 1); ranges[position] = range; } private void RemoveAt (int position) { Shift (position, -1); Array.Clear (ranges, range_count, 1); } #endregion #region Private Range Logic private bool RemoveIndexFromRange (int index) { int range_index = FindRangeIndexForValue (index); if (range_index < 0) { return false; } Range range = ranges[range_index]; if (range.Start == index && range.End == index) { RemoveAt (range_index); } else if (range.Start == index) { ranges[range_index].Start++; } else if (range.End == index) { ranges[range_index].End--; } else { Range split_range = new Range (index + 1, range.End); ranges[range_index].End = index - 1; Insert (range_index + 1, split_range); } index_count--; return true; } private void InsertRange (Range range) { int position = FindInsertionPosition (range); bool merged_left = MergeLeft (range, position); bool merged_right = MergeRight (range, position); if (!merged_left && !merged_right) { Insert (position, range); } else if (merged_left && merged_right) { ranges[position - 1].End = ranges[position].End; RemoveAt (position); } } private bool MergeLeft (Range range, int position) { int left = position - 1; if (left >= 0 && ranges[left].End + 1 == range.Start) { ranges[left].End = range.Start; return true; } return false; } private bool MergeRight (Range range, int position) { if (position < range_count && ranges[position].Start - 1 == range.End) { ranges[position].Start = range.End; return true; } return false; } private static int CompareRanges (Range a, Range b) { return (a.Start + (a.End - a.Start)).CompareTo (b.Start + (b.End - b.Start)); } private int FindInsertionPosition (Range range) { int min = 0; int max = range_count - 1; while (min <= max) { int mid = min + ((max - min) / 2); int cmp = CompareRanges (ranges[mid], range); if (cmp == 0) { return mid; } else if (cmp > 0) { if (mid > 0 && CompareRanges (ranges[mid - 1], range) < 0) { return mid; } max = mid - 1; } else { min = mid + 1; } } return min; } public int FindRangeIndexForValue (int value) { int min = 0; int max = range_count - 1; while (min <= max) { int mid = min + ((max - min) / 2); Range range = ranges[mid]; if (value >= range.Start && value <= range.End) { return mid; // In Range } else if (value < range.Start) { max = mid - 1; // Below Range } else { min = mid + 1; // Above Range } } return ~min; } #endregion #region Public RangeCollection API public Range [] Ranges { get { Range [] ranges_copy = new Range[range_count]; Array.Copy (ranges, ranges_copy, range_count); return ranges_copy; } } public int RangeCount { get { return range_count; } } #if NET_2_0 [Obsolete ("Do not use the Indexes property in 2.0 profiles if enumerating only; Indexes allocates an array to avoid boxing in the 1.1 profile")] #endif public int [] Indexes { get { if (indexes_cache != null && generation == indexes_cache_generation) { return indexes_cache; } indexes_cache = new int[Count]; indexes_cache_generation = generation; for (int i = 0, j = 0; i < range_count; i++) { for (int k = ranges[i].Start; k <= ranges[i].End; j++, k++) { indexes_cache[j] = k; } } return indexes_cache; } } public int IndexOf (int value) { int offset = 0; foreach (Range range in ranges) { if (value >= range.Start && value <= range.End) { return offset + (value - range.Start); } offset += range.End - range.Start + 1; } return -1; } public int this[int index] { get { for (int i = 0, cuml_count = 0; i < range_count && index >= 0; i++) { if (index < (cuml_count += ranges[i].Count)) { return ranges[i].End - (cuml_count - index) + 1; } } throw new IndexOutOfRangeException (index.ToString ()); } } #endregion #region ICollection Implementation public bool Add (int value) { if (!Contains (value)) { generation++; InsertRange (new Range (value, value)); index_count++; return true; } return false; } void #if NET_2_0 ICollection. #else ICollection. #endif Add (int value) { Add (value); } public bool Remove (int value) { generation++; return RemoveIndexFromRange (value); } public void Clear () { range_count = 0; index_count = 0; generation++; ranges = new Range[MIN_CAPACITY]; } public bool Contains (int value) { return FindRangeIndexForValue (value) >= 0; } public void CopyTo (int [] array, int index) { throw new NotImplementedException (); } public void CopyTo (Array array, int index) { throw new NotImplementedException (); } public int Count { get { return index_count; } } public bool IsReadOnly { get { return false; } } #if !NET_2_0 public bool IsSynchronized { get { return false; } } public object SyncRoot { get { return this; } } #endif #endregion #region ICloneable Implementation public object Clone () { return MemberwiseClone (); } #endregion #region IEnumerable Implementation #if NET_2_0 public IEnumerator GetEnumerator () { for (int i = 0; i < range_count; i++) { for (int j = ranges[i].Start; j <= ranges[i].End; j++) { yield return j; } } } IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator (); } #else public IEnumerator GetEnumerator () { return Indexes.GetEnumerator (); } #endif #endregion } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Json/0000777000175000017500000000000011503407404020075 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Json/JsonObject.cs0000644000175000017500000000345511467745411022503 0ustar00rubenruben00000000000000// // JsonObject.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Linq; using System.Collections.Generic; using System.Text; namespace Hyena.Json { public class JsonObject : Dictionary, IJsonCollection { public void Dump () { Dump (1); } public void Dump (int level) { Console.Write (ToString ()); } public override string ToString () { return new Serializer (this).Serialize (); } public static JsonObject FromString (string input) { return new Deserializer (input).Deserialize () as JsonObject; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Json/JsonArray.cs0000644000175000017500000000320311420634720022327 0ustar00rubenruben00000000000000// // JsonArray.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Linq; using System.Collections.Generic; using System.Text; namespace Hyena.Json { public class JsonArray : List, IJsonCollection { public void Dump () { Dump (1); } public void Dump (int level) { Console.Write (ToString ()); } public override string ToString () { return new Serializer (this).Serialize (); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Json/TokenType.cs0000644000175000017500000000326711420634720022353 0ustar00rubenruben00000000000000// // TokenType.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Json { [Flags] internal enum TokenType { None = 0 << 0, ObjectStart = 1 << 0, ObjectFinish = 1 << 1, ArrayStart = 1 << 2, ArrayFinish = 1 << 3, Boolean = 1 << 4, String = 1 << 5, Null = 1 << 6, Number = 1 << 7, Integer = 1 << 8, Comma = 1 << 9, Colon = 1 << 10, Literal = String | Number | Boolean | Null | Integer, Value = ObjectStart | ArrayStart | Literal } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Json/IJsonCollection.cs0000644000175000017500000000257311420634720023466 0ustar00rubenruben00000000000000// // IJsonCollection.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Text; namespace Hyena.Json { public interface IJsonCollection : ICollection { void Dump (); void Dump (int count); } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Json/Serializer.cs0000644000175000017500000001160511420634720022535 0ustar00rubenruben00000000000000// // Serializer.cs // // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) // // Authors: // Sandy Armstrong // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; namespace Hyena.Json { public class Serializer { private const string serializedNull = "null"; private const string serializedTrue = "true"; private const string serializedFalse = "false"; private object input; public Serializer () { } public Serializer (object input) { SetInput (input); } public void SetInput (object input) { this.input = input; } // TODO: Support serialize to stream? public string Serialize () { return Serialize (input); } private string SerializeBool (bool val) { return val ? serializedTrue : serializedFalse; } private string SerializeInt (int val) { return val.ToString (); } private string SerializeDouble (double val) { return val.ToString (System.Globalization.CultureInfo.InvariantCulture.NumberFormat); } // TODO: exponent stuff private string SerializeString (string val) { // TODO: More work, escaping, etc return "\"" + val.Replace ("\\", "\\\\"). Replace ("\"", "\\\""). Replace ("\b", "\\b"). Replace ("\f", "\\f"). Replace ("\n", "\\n"). Replace ("\r", "\\r"). Replace ("\t", "\\t") + "\""; } private string SerializeEnumerable (IEnumerable array) { StringBuilder builder = new StringBuilder ("["); int i = 0; foreach (var obj in array) { builder.Append (Serialize (obj)); builder.Append (","); i++; } // Get rid of trailing comma if (i > 0) builder.Remove (builder.Length - 1, 1); builder.Append ("]"); return builder.ToString (); } private string SerializeDictionary (Dictionary obj) { StringBuilder builder = new StringBuilder ("{"); foreach (var pair in obj) { builder.Append (SerializeString (pair.Key)); builder.Append (":"); builder.Append (Serialize (pair.Value)); builder.Append (","); } // Get rid of trailing comma if (obj.Count > 0) builder.Remove (builder.Length - 1, 1); builder.Append ("}"); return builder.ToString (); } private string Serialize (object unknownObj) { if (unknownObj == null) return serializedNull; bool? b = unknownObj as bool?; if (b.HasValue) return SerializeBool (b.Value); int? i = unknownObj as int?; if (i.HasValue) return SerializeInt (i.Value); double? d = unknownObj as double?; if (d.HasValue) return SerializeDouble (d.Value); string s = unknownObj as string; if (s != null) return SerializeString (s); var o = unknownObj as Dictionary; if (o != null) return SerializeDictionary (o); var a = unknownObj as IEnumerable; if (a != null) return SerializeEnumerable (a); throw new ArgumentException ("Cannot serialize anything but doubles, integers, strings, JsonObjects, and JsonArrays"); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Json/Tests/0000777000175000017500000000000011503407404021177 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Json/Tests/SerializerTests.cs0000644000175000017500000001372411420634720024666 0ustar00rubenruben00000000000000// // SerializerTests.cs // // Authors: // Sandy Armstrong // // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using Hyena.Json; using NUnit.Framework; namespace Hyena.Json.Tests { [TestFixture] public class SerializerTests : Hyena.Tests.TestBase { [Test] public void SerializeBoolTest () { Serializer ser = new Serializer (true); Assert.AreEqual ("true", ser.Serialize ()); ser.SetInput (false); Assert.AreEqual ("false", ser.Serialize ()); } [Test] public void SerializeIntTest () { Serializer ser = new Serializer (12); Assert.AreEqual ("12", ser.Serialize ()); ser.SetInput (-658); Assert.AreEqual ("-658", ser.Serialize ()); ser.SetInput (0); Assert.AreEqual ("0", ser.Serialize ()); } [Test] public void SerializeDoubleTest () { Serializer ser = new Serializer (12.5); Assert.AreEqual ("12.5", ser.Serialize ()); ser.SetInput (-658.1); Assert.AreEqual ("-658.1", ser.Serialize ()); ser.SetInput (0.0); Assert.AreEqual ("0", ser.Serialize ()); ser.SetInput (0.1); Assert.AreEqual ("0.1", ser.Serialize ()); } [Test] public void SerializeStringTest () { VerifyString ("The cat\njumped \"over\" the rat! We escape with \\\"", @"""The cat\njumped \""over\"" the rat! We escape with \\\"""""); } [Test] public void EscapedCharactersTest () { VerifyString ("\\", @"""\\"""); VerifyString ("\b", @"""\b"""); VerifyString ("\f", @"""\f"""); VerifyString ("\n", @"""\n"""); VerifyString ("\r", @"""\r"""); VerifyString ("\t", @"""\t"""); VerifyString ("\u2022", "\"\u2022\""); } private void VerifyString (string original, string expectedSerialized) { Serializer ser = new Serializer (original); string output = ser.Serialize (); Assert.AreEqual (expectedSerialized, output, "Serialized Output"); Assert.AreEqual (original, new Deserializer (output).Deserialize (), "Input should be identical after serialized then deserialized back to string"); } [Test] public void SerializeNullTest () { Serializer ser = new Serializer (null); Assert.AreEqual ("null", ser.Serialize ()); } [Test] public void SerializeArrayTest () { JsonArray simpleArray = new JsonArray (); simpleArray.Add (1); simpleArray.Add ("text"); simpleArray.Add (0.1); simpleArray.Add ("5"); simpleArray.Add (false); simpleArray.Add (null); Serializer ser = new Serializer (simpleArray); Assert.AreEqual ("[1,\"text\",0.1,\"5\",false,null]", ser.Serialize ()); JsonArray emptyArray = new JsonArray (); ser.SetInput (emptyArray); Assert.AreEqual ("[]", ser.Serialize ()); } // TODO: Test arrays/objects in each other, various levels deep [Test] public void SerializeObjectTest () { JsonObject obj1 = new JsonObject (); obj1 ["intfield"] = 1; obj1 ["text field"] = "text"; obj1 ["double-field"] = 0.1; obj1 ["Boolean, Field"] = true; obj1 ["\"Null\"\nfield"] = null; Serializer ser = new Serializer (obj1); // Test object equality, since order not guaranteed string output = ser.Serialize (); JsonObject reconstitutedObj1 = (JsonObject) new Deserializer (output).Deserialize (); AssertJsonObjectsEqual (obj1, reconstitutedObj1); JsonObject obj2 = new JsonObject (); obj2 ["double-field"] = 0.1; obj2 ["\"Null\"\nfield"] = null; ser.SetInput (obj2); output = ser.Serialize (); Assert.IsTrue ((output == "{\"double-field\":0.1,\"\\\"Null\\\"\\nfield\":null}") || (output == "{\"\\\"Null\\\"\\nfield\":null,\"double-field\":0.1}"), "Serialized output format"); } private void AssertJsonObjectsEqual (JsonObject expectedObj, JsonObject actualObj) { Assert.AreEqual (expectedObj.Count, actualObj.Count, "Field count"); foreach (var expectedPair in expectedObj) Assert.AreEqual (expectedPair.Value, actualObj [expectedPair.Key], expectedPair.Key + " field"); } } } #endif f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Json/Tests/DeserializerTests.cs0000644000175000017500000000735411420634720025201 0ustar00rubenruben00000000000000// // DeserializerTests.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using System.Reflection; using NUnit.Framework; using Hyena.Json; namespace Hyena.Json.Tests { [TestFixture] public class DeserializerTests : Hyena.Tests.TestBase { private Deserializer deserializer; [TestFixtureSetUp] public void Setup () { deserializer = new Deserializer (); } [Test] public void Literal () { Assert.AreEqual ("hello", (string)deserializer.SetInput ("\"hello\"").Deserialize ()); Assert.AreEqual (-1.76e-3, (double)deserializer.SetInput ("-1.76e-3").Deserialize ()); Assert.AreEqual (null, deserializer.SetInput ("null").Deserialize ()); Assert.AreEqual (true, (bool)deserializer.SetInput ("true").Deserialize ()); Assert.AreEqual (false, (bool)deserializer.SetInput ("false").Deserialize ()); } [Test] public void Array () { JsonArray array = (JsonArray)deserializer.SetInput ("[]").Deserialize (); Assert.AreEqual (0, array.Count); array = (JsonArray)deserializer.SetInput ("[[]]").Deserialize (); Assert.AreEqual (1, array.Count); Assert.AreEqual (0, ((JsonArray)array[0]).Count); array = (JsonArray)deserializer.SetInput ("[[true,[]]]").Deserialize (); Assert.AreEqual (1, array.Count); Assert.AreEqual (2, ((JsonArray)array[0]).Count); Assert.AreEqual (0, ((JsonArray)((JsonArray)array[0])[1]).Count); array = (JsonArray)deserializer.SetInput ("[\"a\", 1.0, true]").Deserialize (); Assert.AreEqual (3, array.Count); Assert.AreEqual ("a", (string)array[0]); Assert.AreEqual (1, (double)array[1]); Assert.AreEqual (true, (bool)array[2]); } [Test] public void Object () { JsonObject obj = (JsonObject)deserializer.SetInput ("{}").Deserialize (); Assert.AreEqual (0, obj.Count); obj = (JsonObject)deserializer.SetInput ("{\"a\":{}}").Deserialize (); Assert.AreEqual (1, obj.Count); Assert.AreEqual (0, ((JsonObject)obj["a"]).Count); obj = (JsonObject)deserializer.SetInput ("{\"a\":[{\"b\":false},\"c\"]}").Deserialize (); Assert.AreEqual (1, obj.Count); JsonArray arr = (JsonArray)obj["a"]; Assert.AreEqual (2, arr.Count); Assert.AreEqual (false, ((JsonObject)arr[0])["b"]); Assert.AreEqual ("c", (string)arr[1]); } } } #endif f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Json/Tests/TokenizerTests.cs0000644000175000017500000002111611420634720024521 0ustar00rubenruben00000000000000// // TokenizerTests.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using System.Reflection; using NUnit.Framework; using Hyena.Json; namespace Hyena.Json.Tests { [TestFixture] public class TokenizerTests : Hyena.Tests.TestBase { private Tokenizer tokenizer; [TestFixtureSetUp] public void Setup () { tokenizer = new Tokenizer (); } [Test] public void Whitespace () { AssertTokenStream (""); AssertTokenStream (" "); AssertTokenStream ("\f\n\r\t "); } [Test] public void BoolNull () { // Boolean/null tests AssertTokenStream ("true", Token.Bool (true)); AssertTokenStream ("false", Token.Bool (false)); AssertTokenStream ("null", Token.Null); } [Test] public void NumberInt () { AssertTokenStream ("0", Token.Integer (0)); AssertTokenStream ("-0", Token.Integer (-0)); AssertTokenStream ("9", Token.Integer (9)); AssertTokenStream ("-9", Token.Integer (-9)); AssertTokenStream ("14", Token.Integer (14)); AssertTokenStream ("-14", Token.Integer (-14)); AssertTokenStream ("15309", Token.Integer (15309)); AssertTokenStream ("-15309", Token.Integer (-15309)); } [Test] public void NumberFloat () { AssertTokenStream ("0.0", Token.Number (0.0)); AssertTokenStream ("-0.0", Token.Number (-0.0)); AssertTokenStream ("1.9", Token.Number (1.9)); AssertTokenStream ("-1.9", Token.Number (-1.9)); AssertTokenStream ("9.1", Token.Number (9.1)); AssertTokenStream ("-9.1", Token.Number (-9.1)); AssertTokenStream ("15309.0", Token.Number (15309.0)); AssertTokenStream ("15309.9", Token.Number (15309.9)); AssertTokenStream ("-15309.01", Token.Number (-15309.01)); AssertTokenStream ("-15309.9009", Token.Number (-15309.9009)); } [Test] public void NumberExponent () { AssertTokenStream ("20.6e3", Token.Number (20.6e3)); AssertTokenStream ("20.6e+3", Token.Number (20.6e+3)); AssertTokenStream ("20.6e-3", Token.Number (20.6e-3)); AssertTokenStream ("-20.6e3", Token.Number (-20.6e3)); AssertTokenStream ("-20.6e+3", Token.Number (-20.6e+3)); AssertTokenStream ("-20.6e-3", Token.Number (-20.6e-3)); AssertTokenStream ("1e1", Token.Number (1e1)); AssertTokenStream ("1E2", Token.Number (1E2)); AssertTokenStream ("1.0e1", Token.Number (1.0e1)); AssertTokenStream ("1.0E1", Token.Number (1.0E1)); } [Test] public void Strings () { AssertTokenStream (@"""""", Token.String ("")); AssertTokenStream (@"""a""", Token.String ("a")); AssertTokenStream (@"""ab""", Token.String ("ab")); AssertTokenStream (@" ""a b"" ", Token.String ("a b")); AssertTokenStream (@"""\""\""""", Token.String ("\"\"")); AssertTokenStream (@" ""a \"" \"" b"" ", Token.String ("a \" \" b")); AssertTokenStream (@"""\ubeef""", Token.String ("\ubeef")); AssertTokenStream (@"""\u00a9""", Token.String ("\u00a9")); AssertTokenStream (@"""\u0000\u0001\u0002""", Token.String ("\u0000\u0001\u0002")); AssertTokenStream (@"""1\uabcdef0""", Token.String ("1\uabcdef0")); AssertTokenStream (@"""\b\f\n\r\t""", Token.String ("\b\f\n\r\t")); } [Test] public void Container () { AssertTokenStream ("{}", Token.ObjectStart, Token.ObjectFinish); AssertTokenStream ("[]", Token.ArrayStart, Token.ArrayFinish); AssertTokenStream ("{ }", Token.ObjectStart, Token.ObjectFinish); AssertTokenStream ("[ ]", Token.ArrayStart, Token.ArrayFinish); AssertTokenStream ("[{}]", Token.ArrayStart, Token.ObjectStart, Token.ObjectFinish, Token.ArrayFinish); AssertTokenStream ("[[[ { } ]]]", Token.ArrayStart, Token.ArrayStart, Token.ArrayStart, Token.ObjectStart, Token.ObjectFinish, Token.ArrayFinish, Token.ArrayFinish, Token.ArrayFinish); } [Test] public void Array () { AssertTokenStream ("[1]", Token.ArrayStart, Token.Integer (1), Token.ArrayFinish); AssertTokenStream ("[1,0]", Token.ArrayStart, Token.Integer (1), Token.Comma, Token.Integer (0), Token.ArrayFinish); AssertTokenStream ("[\"a\",true,null]", Token.ArrayStart, Token.String ("a"), Token.Comma, Token.Bool (true), Token.Comma, Token.Null, Token.ArrayFinish); AssertTokenStream ("[0,1,[[2,[4]],5],6]", Token.ArrayStart, Token.Integer (0), Token.Comma, Token.Integer (1), Token.Comma, Token.ArrayStart, Token.ArrayStart, Token.Integer (2), Token.Comma, Token.ArrayStart, Token.Integer (4), Token.ArrayFinish, Token.ArrayFinish, Token.Comma, Token.Integer (5), Token.ArrayFinish, Token.Comma, Token.Integer (6), Token.ArrayFinish); } [Test] public void Object () { AssertTokenStream ("{\"a\":{}}", Token.ObjectStart, Token.String ("a"), Token.Colon, Token.ObjectStart, Token.ObjectFinish, Token.ObjectFinish); AssertTokenStream ("{\"a\":{\"b\":[],\"c\":false}}", Token.ObjectStart, Token.String ("a"), Token.Colon, Token.ObjectStart, Token.String ("b"), Token.Colon, Token.ArrayStart, Token.ArrayFinish, Token.Comma, Token.String ("c"), Token.Colon, Token.Bool (false), Token.ObjectFinish, Token.ObjectFinish); AssertTokenStream ("[{\"a\":{},{}]", Token.ArrayStart, Token.ObjectStart, Token.String ("a"), Token.Colon, Token.ObjectStart, Token.ObjectFinish, Token.Comma, Token.ObjectStart, Token.ObjectFinish, Token.ArrayFinish); } private void AssertTokenStream (string input, params Token [] tokens) { int cmp_idx = 0; tokenizer.SetInput (input); while (true) { Token token = tokenizer.Scan (); if (token == null) { if (cmp_idx != tokens.Length) { throw new ApplicationException ("Unexpected EOF"); } break; } Token compare = tokens[cmp_idx++]; if (compare.Type != token.Type) { throw new ApplicationException (String.Format ("TokenTypes do not match (exp {0}, got {1}", compare.Type, token.Type)); } if (compare.Value == null && token.Value == null) { continue; } if ((compare.Type == TokenType.Integer && (int)compare.Value != (int)token.Value) || (compare.Type == TokenType.Number && (double)compare.Value != (double)token.Value) || (compare.Type == TokenType.String && (string)compare.Value != (string)token.Value) || (compare.Type == TokenType.Boolean && (bool)compare.Value != (bool)token.Value)) { throw new ApplicationException ("Token values do not match"); } } } } } #endif f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Json/Deserializer.cs0000644000175000017500000001205611420634720023047 0ustar00rubenruben00000000000000// // Deserializer.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.IO; namespace Hyena.Json { public class Deserializer { private Tokenizer tokenizer = new Tokenizer (); public Deserializer () { } public Deserializer (string input) { SetInput (input); } public Deserializer (Stream stream) { SetInput (stream); } public Deserializer (StreamReader reader) { SetInput (reader); } public Deserializer SetInput (StreamReader reader) { tokenizer.SetInput (reader); return this; } public Deserializer SetInput (Stream stream) { tokenizer.SetInput (stream); return this; } public Deserializer SetInput (string input) { tokenizer.SetInput (input); return this; } public object Deserialize () { Token token = CheckScan (TokenType.Value, true); if (token == null) { return null; } return Parse (token); } private object Parse (Token token) { if (token.Type == TokenType.ObjectStart) { return ParseObject (); } else if (token.Type == TokenType.ArrayStart) { return ParseArray (); } return token.Value; } private JsonObject ParseObject () { JsonObject obj = new JsonObject (); while (true) { Token key = CheckScan (TokenType.String | TokenType.ObjectFinish); if (key.Type == TokenType.ObjectFinish) { break; } CheckScan (TokenType.Colon); Token value = CheckScan (TokenType.Value); object value_val = value.Value; if (value.Type == TokenType.ArrayStart) { value_val = ParseArray (); } else if (value.Type == TokenType.ObjectStart) { value_val = ParseObject (); } obj.Add ((string)key.Value, value_val); Token token = CheckScan (TokenType.Comma | TokenType.ObjectFinish); if (token.Type == TokenType.ObjectFinish) { break; } } return obj; } private JsonArray ParseArray () { JsonArray array = new JsonArray (); while (true) { Token value = CheckScan (TokenType.Value | TokenType.ArrayFinish); if (value.Type == TokenType.ArrayFinish) { break; } array.Add (Parse (value)); Token token = CheckScan (TokenType.Comma | TokenType.ArrayFinish); if (token.Type == TokenType.ArrayFinish) { break; } } return array; } private Token CheckScan (TokenType expected) { return CheckScan (expected, false); } private Token CheckScan (TokenType expected, bool eofok) { Token token = tokenizer.Scan (); if (token == null && eofok) { return null; } else if (token == null) { UnexpectedEof (expected); } else if ((expected & token.Type) == 0) { UnexpectedToken (expected, token); } return token; } private void UnexpectedToken (TokenType expected, Token got) { throw new ApplicationException (String.Format ("Unexpected token {0} at [{1}:{2}]; expected {3}", got.Type, got.SourceLine, got.SourceColumn, expected)); } private void UnexpectedEof (TokenType expected) { throw new ApplicationException (String.Format ("Unexpected End of File; expected {0}", expected)); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Json/Tokenizer.cs0000644000175000017500000002471611420634720022405 0ustar00rubenruben00000000000000// // Tokenizer.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.IO; using System.Text; namespace Hyena.Json { internal class Tokenizer { private StreamReader reader; private StringBuilder string_buffer; private char peek = ' '; private int current_line = 1; private int current_column = 1; private int token_start_line; private int token_start_column; public Tokenizer () { Reset (); } public Tokenizer (string input) { SetInput (input); } public Tokenizer (Stream stream) { SetInput (stream); } public Tokenizer (StreamReader reader) { SetInput (reader); } private void Reset () { peek = ' '; current_line = 1; current_column = 1; token_start_line = 0; token_start_column = 0; } public void SetInput (StreamReader reader) { this.reader = reader; Reset (); } public void SetInput (Stream stream) { SetInput (new StreamReader (stream)); } public void SetInput (string input) { SetInput (new MemoryStream (Encoding.UTF8.GetBytes (input))); } private void ReadChar () { int val = reader.Read (); peek = val == -1 ? Char.MaxValue : (char)val; current_column++; } private void UnexpectedCharacter (char ch) { throw new ApplicationException (String.Format ("Unexpected character '{0}' at [{1}:{2}]", ch, current_line, current_column - 1)); } private void InvalidSyntax (string message) { throw new ApplicationException (String.Format ("Invalid syntax: {0} at [{1}:{2}]", message, current_line, current_column)); } private StringBuilder GetStringBuilder () { if (string_buffer == null) { string_buffer = new StringBuilder (64); return string_buffer; } string_buffer.Remove (0, string_buffer.Length); return string_buffer; } private string LexString () { StringBuilder buffer = GetStringBuilder (); bool read = true; while (!reader.EndOfStream) { if (read) { ReadChar (); } read = true; if (peek == '\\') { ReadChar (); switch (peek) { case 'u': ReadChar (); buffer.Append ((char)LexInt (true, 4)); read = false; break; case '"': case '\\': case '/': buffer.Append (peek); break; case 'b': buffer.Append ('\b'); break; case 'f': buffer.Append ('\f'); break; case 'n': buffer.Append ('\n'); break; case 'r': buffer.Append ('\r'); break; case 't': buffer.Append ('\t'); break; default: UnexpectedCharacter (peek); break; } } else if (peek == '"') { ReadChar (); return buffer.ToString (); } else { buffer.Append (peek); } } if (peek != '"') { InvalidSyntax ("Unterminated string, expected '\"' termination, got '" + peek + "'"); } else if (!read && reader.EndOfStream) { ReadChar (); } return buffer.ToString (); } private string LexId () { StringBuilder buffer = GetStringBuilder (); do { buffer.Append (peek); ReadChar (); } while (Char.IsLetterOrDigit (peek)); return buffer.ToString (); } private int LexInt () { return LexInt (false, 0); } private int LexInt (bool hex, int maxDigits) { int value = 0; int count = 0; do { value = (hex ? 16 : 10) * value + (hex ? peek >= 'A' && peek <= 'F' ? 10 + peek - 'A' : (peek >= 'a' && peek <= 'f' ? 10 + peek - 'a' : peek - '0') : peek - '0'); if (maxDigits > 0 && ++count >= maxDigits) { ReadChar (); return value; } ReadChar (); } while (Char.IsDigit (peek) || (hex && ((peek >= 'a' && peek <= 'f') || (peek >= 'A' && peek <= 'F')))); return value; } private double LexFraction () { double fraction = 0; double d = 10; while (true) { ReadChar (); if (!Char.IsDigit (peek)) { break; } fraction += (peek - '0') / d; d *= 10; } return fraction; } private object LexNumber (out bool isDouble) { isDouble = false; int intVal = 0; double doubleVal = 0.0; bool negate = peek == '-'; if (negate) { ReadChar (); } if (peek != '0') { doubleVal = intVal = LexInt (); } else { ReadChar (); } if (peek == '.') { isDouble = true; doubleVal += LexFraction (); } if (peek == 'e' || peek == 'E') { isDouble = true; ReadChar (); if (peek == '-') { ReadChar (); doubleVal /= Math.Pow (10, LexInt ()); } else if (peek == '+') { ReadChar (); doubleVal *= Math.Pow (10, LexInt ()); } else if (Char.IsDigit (peek)) { doubleVal *= Math.Pow (10, LexInt ()); } else { InvalidSyntax ("Malformed exponent"); } } if (Char.IsDigit (peek)) { InvalidSyntax ("Numbers starting with 0 must be followed by a . or not " + "followed by a digit (octal syntax not legal)"); } if (!isDouble) return negate ? -1 * intVal : intVal; else return negate ? -1.0 * doubleVal : doubleVal; } public Token Scan () { Token token = InnerScan (); if (token == null) { return null; } token.SourceLine = token_start_line; token.SourceColumn = token_start_column - 1; return token; } private Token InnerScan () { for (; ; ReadChar ()) { if (Char.IsWhiteSpace (peek) && peek != '\n') { continue; } else if (peek == '\n') { current_line++; current_column = 0; } else { break; } } token_start_column = current_column; token_start_line = current_line; switch (peek) { case '{': ReadChar (); return new Token (TokenType.ObjectStart); case '}': ReadChar (); return new Token (TokenType.ObjectFinish); case '[': ReadChar (); return new Token (TokenType.ArrayStart); case ']': ReadChar (); return new Token (TokenType.ArrayFinish); case ',': ReadChar (); return new Token (TokenType.Comma); case ':': ReadChar (); return new Token (TokenType.Colon); case '"': return new Token (TokenType.String, LexString ()); default: if (peek == '-' || Char.IsDigit (peek)) { bool isDouble; object num = LexNumber (out isDouble); if (!isDouble) return new Token (TokenType.Integer, num); else return new Token (TokenType.Number, num); } else if (Char.IsLetter (peek)) { string identifier = LexId (); switch (identifier) { case "true": return new Token (TokenType.Boolean, true); case "false": return new Token (TokenType.Boolean, false); case "null": return new Token (TokenType.Null); default: InvalidSyntax ("Invalid identifier '" + identifier + "'"); break; } } if (peek != Char.MaxValue) { UnexpectedCharacter (peek); } break; } return null; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Json/Token.cs0000644000175000017500000000645011420634720021506 0ustar00rubenruben00000000000000// // Token.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Json { internal class Token { public Token (TokenType type) : this (type, null) { } public Token (TokenType type, object value) { this.type = type; this.value = value; } private TokenType type; public TokenType Type { get { return type; } } private object value; public object Value { get { return value; } set { this.value = value; } } private int source_line; public int SourceLine { get { return source_line; } internal set { source_line = value; } } private int source_column; public int SourceColumn { get { return source_column; } internal set { source_column = value; } } internal static Token ObjectStart { get { return new Token (TokenType.ObjectStart); } } internal static Token ObjectFinish { get { return new Token (TokenType.ObjectFinish); } } internal static Token ArrayStart { get { return new Token (TokenType.ArrayStart); } } internal static Token ArrayFinish { get { return new Token (TokenType.ArrayFinish); } } internal static Token Null { get { return new Token (TokenType.Null); } } internal static Token Comma { get { return new Token (TokenType.Comma); } } internal static Token Colon { get { return new Token (TokenType.Colon); } } internal static Token Number (double value) { return new Token (TokenType.Number, value); } internal static Token Integer (int value) { return new Token (TokenType.Integer, value); } internal static Token String (string value) { return new Token (TokenType.String, value); } internal static Token Bool (bool value) { return new Token (TokenType.Boolean, value); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena/0000777000175000017500000000000011503407405017166 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/Hyena/XdgBaseDirectorySpec.cs0000644000175000017500000000725511420634720023537 0ustar00rubenruben00000000000000// // XdgBaseDirectorySpec.cs // // Author: // Aaron Bockover // // Copyright (C) 2006-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.IO; namespace Hyena { public static class XdgBaseDirectorySpec { public static string GetUserDirectory (string key, string fallback) { string home_dir = Environment.GetFolderPath (Environment.SpecialFolder.Personal); string config_dir = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData); string env_path = Environment.GetEnvironmentVariable (key); if (!String.IsNullOrEmpty (env_path)) { return env_path; } string user_dirs_path = Path.Combine (config_dir, "user-dirs.dirs"); if (!File.Exists (user_dirs_path)) { return Path.Combine (home_dir, fallback); } try { using (StreamReader reader = new StreamReader (user_dirs_path)) { string line; while ((line = reader.ReadLine ()) != null) { line = line.Trim (); int delim_index = line.IndexOf ('='); if (delim_index > 8 && line.Substring (0, delim_index) == key) { string path = line.Substring (delim_index + 1).Trim ('"'); bool relative = false; if (path.StartsWith ("$HOME/")) { relative = true; path = path.Substring (6); } else if (path.StartsWith ("~")) { relative = true; path = path.Substring (1); } else if (!path.StartsWith ("/")) { relative = true; } return relative ? Path.Combine (home_dir, path) : path; } } } } catch (FileNotFoundException) { } return Path.Combine (home_dir, fallback); } public static string GetXdgDirectoryUnderHome (string key, string fallback) { string xdg_dir = XdgBaseDirectorySpec.GetUserDirectory (key, fallback); string home_dir = Environment.GetFolderPath (Environment.SpecialFolder.Personal); if (xdg_dir == null || xdg_dir == home_dir || !xdg_dir.StartsWith (home_dir)) { xdg_dir = Path.Combine (home_dir, fallback); } return xdg_dir; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena/ConsoleCrayon.cs0000644000175000017500000002036011420634720022270 0ustar00rubenruben00000000000000// // ConsoleCrayon.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena { public static class ConsoleCrayon { #region Public API private static ConsoleColor foreground_color; public static ConsoleColor ForegroundColor { get { return foreground_color; } set { foreground_color = value; SetColor (foreground_color, true); } } private static ConsoleColor background_color; public static ConsoleColor BackgroundColor { get { return background_color; } set { background_color = value; SetColor (background_color, false); } } public static void ResetColor () { if (XtermColors) { Console.Write (GetAnsiResetControlCode ()); } else if (Environment.OSVersion.Platform != PlatformID.Unix && !RuntimeIsMono) { Console.ResetColor (); } } private static void SetColor (ConsoleColor color, bool isForeground) { if (color < ConsoleColor.Black || color > ConsoleColor.White) { throw new ArgumentOutOfRangeException ("color", "Not a ConsoleColor value."); } if (XtermColors) { Console.Write (GetAnsiColorControlCode (color, isForeground)); } else if (Environment.OSVersion.Platform != PlatformID.Unix && !RuntimeIsMono) { if (isForeground) { Console.ForegroundColor = color; } else { Console.BackgroundColor = color; } } } #endregion #region Ansi/VT Code Calculation // Modified from Mono's System.TermInfoDriver // License: MIT/X11 // Authors: Gonzalo Paniagua Javier // (C) 2005-2006 Novell, Inc private static int TranslateColor (ConsoleColor desired, out bool light) { light = false; switch (desired) { // Dark colors case ConsoleColor.Black: return 0; case ConsoleColor.DarkRed: return 1; case ConsoleColor.DarkGreen: return 2; case ConsoleColor.DarkYellow: return 3; case ConsoleColor.DarkBlue: return 4; case ConsoleColor.DarkMagenta: return 5; case ConsoleColor.DarkCyan: return 6; case ConsoleColor.Gray: return 7; // Light colors case ConsoleColor.DarkGray: light = true; return 0; case ConsoleColor.Red: light = true; return 1; case ConsoleColor.Green: light = true; return 2; case ConsoleColor.Yellow: light = true; return 3; case ConsoleColor.Blue: light = true; return 4; case ConsoleColor.Magenta: light = true; return 5; case ConsoleColor.Cyan: light = true; return 6; case ConsoleColor.White: default: light = true; return 7; } } private static string GetAnsiColorControlCode (ConsoleColor color, bool isForeground) { // lighter fg colours are 90 -> 97 rather than 30 -> 37 // lighter bg colours are 100 -> 107 rather than 40 -> 47 bool light; int code = TranslateColor (color, out light) + (isForeground ? 30 : 40) + (light ? 60 : 0); return String.Format ("\x001b[{0}m", code); } private static string GetAnsiResetControlCode () { return "\x001b[0m"; } #endregion #region xterm Detection private static bool? xterm_colors = null; public static bool XtermColors { get { if (xterm_colors == null) { DetectXtermColors (); } return xterm_colors.Value; } } [System.Runtime.InteropServices.DllImport ("libc", EntryPoint="isatty")] private extern static int _isatty (int fd); private static bool isatty (int fd) { try { return _isatty (fd) == 1; } catch { return false; } } private static void DetectXtermColors () { bool _xterm_colors = false; switch (Environment.GetEnvironmentVariable ("TERM")) { case "xterm": case "rxvt": case "rxvt-unicode": if (Environment.GetEnvironmentVariable ("COLORTERM") != null) { _xterm_colors = true; } break; case "xterm-color": _xterm_colors = true; break; } xterm_colors = _xterm_colors && isatty (1) && isatty (2); } #endregion #region Runtime Detection private static bool? runtime_is_mono; public static bool RuntimeIsMono { get { if (runtime_is_mono == null) { runtime_is_mono = Type.GetType ("System.MonoType") != null; } return runtime_is_mono.Value; } } #endregion #region Tests public static void Test () { TestSelf (); Console.WriteLine (); TestAnsi (); Console.WriteLine (); TestRuntime (); } private static void TestSelf () { Console.WriteLine ("==SELF TEST=="); foreach (ConsoleColor color in Enum.GetValues (typeof (ConsoleColor))) { ForegroundColor = color; Console.Write (color); ResetColor (); Console.Write (" :: "); BackgroundColor = color; Console.Write (color); ResetColor (); Console.WriteLine (); } } private static void TestAnsi () { Console.WriteLine ("==ANSI TEST=="); foreach (ConsoleColor color in Enum.GetValues (typeof (ConsoleColor))) { string color_code_fg = GetAnsiColorControlCode (color, true); string color_code_bg = GetAnsiColorControlCode (color, false); Console.Write ("{0}{1}: {2}{3} :: {4}{1}: {5}{3}", color_code_fg, color, color_code_fg.Substring (2), GetAnsiResetControlCode (), color_code_bg, color_code_bg.Substring (2)); Console.WriteLine (); } } private static void TestRuntime () { Console.WriteLine ("==RUNTIME TEST=="); foreach (ConsoleColor color in Enum.GetValues (typeof (ConsoleColor))) { Console.ForegroundColor = color; Console.Write (color); Console.ResetColor (); Console.Write (" :: "); Console.BackgroundColor = color; Console.Write (color); Console.ResetColor (); Console.WriteLine (); } } #endregion } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena/PlatformDetection.cs0000644000175000017500000000653011420634720023140 0ustar00rubenruben00000000000000// // PlatformUtil.cs // // Author: // Aaron Bockover // // Copyright 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Runtime.InteropServices; namespace Hyena { public static class PlatformDetection { public static readonly bool IsMac; public static readonly bool IsWindows; public static readonly bool IsLinux; public static readonly bool IsUnix; public static readonly bool IsMeeGo; public static readonly string PosixSystemName; public static readonly string SystemName; [DllImport ("libc")] private static extern int uname (IntPtr utsname); static PlatformDetection () { // From http://www.mono-project.com/FAQ:_Technical int p = (int)Environment.OSVersion.Platform; IsUnix = p == 4 || p == 6 || p == 128; IsWindows = p < 4; if (IsWindows) { SystemName = "Windows"; return; } // uname expects a pointer to a utsname structure, but we are // tricky here - this structure's first field is the field we // care about (char sysname []); the size of the structure is // unknown, as it varies on all platforms. Darwin uses only // the five POSIX fields, each 256 bytes, so the total size is // total size is 5 * 256 = 1280 bytes. Arbitrarily using 8192. var utsname = IntPtr.Zero; try { utsname = Marshal.AllocHGlobal (8192); if (uname (utsname) == 0) { PosixSystemName = Marshal.PtrToStringAnsi (utsname); } } catch { } finally { if (utsname != IntPtr.Zero) { Marshal.FreeHGlobal (utsname); } } if (PosixSystemName == null) { if (IsUnix) { SystemName = "Unix"; } return; } switch (PosixSystemName) { case "Darwin": IsMac = true; break; case "Linux": IsLinux = true; break; } SystemName = PosixSystemName; IsMeeGo = System.IO.File.Exists ("/etc/meego-release"); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena/CryptoUtil.cs0000644000175000017500000000526011420634720021632 0ustar00rubenruben00000000000000// // CryptoUtil.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Security.Cryptography; namespace Hyena { public static class CryptoUtil { // A-Z is ignored on purpose private static Regex md5_regex = new Regex ("^[a-f0-9]{32}$", RegexOptions.Compiled); private static MD5 md5 = MD5.Create (); public static bool IsMd5Encoded (string text) { return text == null || text.Length != 32 ? false : md5_regex.IsMatch (text); } public static string Md5Encode (string text) { return Md5Encode (text, Encoding.ASCII); } public static string Md5Encode (string text, Encoding encoding) { if (String.IsNullOrEmpty (text)) { return String.Empty; } byte [] hash; lock (md5) { hash = md5.ComputeHash (encoding.GetBytes (text)); } return ToHex (hash); } public static string Md5EncodeStream (Stream stream) { byte [] hash; lock (md5) { hash = md5.ComputeHash (stream); } return ToHex (hash); } private static string ToHex (byte [] hash) { StringBuilder shash = new StringBuilder (); for (int i = 0; i < hash.Length; i++) { shash.Append (hash[i].ToString ("x2")); } return shash.ToString (); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena/IUndoAction.cs0000644000175000017500000000256511420634720021675 0ustar00rubenruben00000000000000// // IUndoAction.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // namespace Hyena { public interface IUndoAction { void Undo (); void Redo (); void Merge (IUndoAction action); bool CanMerge (IUndoAction action); } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena/EventArgs.cs0000644000175000017500000000402011420634720021403 0ustar00rubenruben00000000000000// // EventArgs.cs // // Author: // Alexander Kojevnikov // // Copyright (C) 2009-2010 Alexander Kojevnikov // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena { public class EventArgs : System.EventArgs { private readonly T value; public EventArgs (T value) { this.value = value; } public T Value { get { return value; } } } public static class EventExtensions { public static void SafeInvoke (this T @event, params object[] args) where T : class { var multicast = @event as MulticastDelegate; if (multicast != null) { foreach (var handler in multicast.GetInvocationList ()) { try { handler.DynamicInvoke (args); } catch (Exception e) { Log.Exception (e); } } } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena/ThreadAssist.cs0000644000175000017500000001014711467745411022125 0ustar00rubenruben00000000000000// // ThreadAssist.cs // // Author: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2005-2009 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Threading; namespace Hyena { public static class ThreadAssist { private static Thread main_thread; public static Thread MainThread { get { return main_thread; } } public static Action ProxyToMainHandler { get; set; } public static void InitializeMainThread () { main_thread = Thread.CurrentThread; try { main_thread.Name = "Main Thread"; } catch { Log.DebugFormat ("Main thread set to {0}", main_thread.Name); } } public static bool InMainThread { get { if (main_thread == null) { throw new ApplicationException ("ThreadAssist.InitializeMainThread must be called first"); } return main_thread.Equals (Thread.CurrentThread); } } public static void AssertNotInMainThread () { if (ApplicationContext.Debugging && InMainThread) { Hyena.Log.Warning ("In GUI thread, will probably block it", System.Environment.StackTrace); } } public static void AssertInMainThread () { if (ApplicationContext.Debugging && !InMainThread) { Hyena.Log.Warning ("Not in main thread!", System.Environment.StackTrace); } } public static void BlockingProxyToMain (InvokeHandler handler) { if (!InMainThread) { var reset_event = new System.Threading.ManualResetEvent (false); ProxyToMainHandler (delegate { try { handler (); } finally { reset_event.Set (); } }); reset_event.WaitOne (); } else { handler (); } } public static void ProxyToMain (InvokeHandler handler) { if (!InMainThread) { ProxyToMainHandler (handler); } else { handler (); } } public static void SpawnFromMain (ThreadStart threadedMethod) { if (InMainThread) { Spawn (threadedMethod, true); } else { threadedMethod (); } } public static Thread Spawn (ThreadStart threadedMethod, bool autoStart) { Thread thread = new Thread (threadedMethod); thread.Name = String.Format ("Spawned: {0}", threadedMethod); thread.IsBackground = true; if (autoStart) { thread.Start (); } return thread; } public static Thread Spawn (ThreadStart threadedMethod) { return Spawn (threadedMethod, true); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena/Tests/0000777000175000017500000000000011503407405020270 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/Hyena/Tests/StringUtilTests.cs0000644000175000017500000003657411467745411023774 0ustar00rubenruben00000000000000// // StringUtilTests.cs // // Author: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using System.IO; using System.Linq; using NUnit.Framework; using Hyena; namespace Hyena.Tests { [TestFixture] public class StringUtilTests { private class Map { public Map (string camel, string under) { Camel = camel; Under = under; } public string Camel; public string Under; } private Map [] u_to_c_maps = new Map [] { new Map ("Hello", "hello"), new Map ("HelloWorld", "hello_world"), new Map ("HelloWorld", "hello__world"), new Map ("HelloWorld", "hello___world"), new Map ("HelloWorld", "hello____world"), new Map ("HelloWorld", "_hello_world"), new Map ("HelloWorld", "__hello__world"), new Map ("HelloWorld", "___hello_world_"), new Map ("HelloWorldHowAreYou", "_hello_World_HOW_ARE__YOU__"), new Map (null, ""), new Map ("H", "h") }; [Test] public void UnderCaseToCamelCase () { foreach (Map map in u_to_c_maps) { Assert.AreEqual (map.Camel, StringUtil.UnderCaseToCamelCase (map.Under)); } } private Map [] c_to_u_maps = new Map [] { new Map ("Hello", "hello"), new Map ("HelloWorld", "hello_world"), new Map ("HiWorldHowAreYouDoingToday", "hi_world_how_are_you_doing_today"), new Map ("SRSLYHowAreYou", "srsly_how_are_you"), new Map ("OMGThisShitIsBananas", "omg_this_shit_is_bananas"), new Map ("KTHXBAI", "kthxbai"), new Map ("nereid.track_view_columns.MusicLibrarySource-Library/composer", "nereid.track_view_columns._music_library_source_-_library/composer"), new Map ("", null), new Map ("H", "h") }; [Test] public void CamelCaseToUnderCase () { foreach (Map map in c_to_u_maps) { Assert.AreEqual (map.Under, StringUtil.CamelCaseToUnderCase (map.Camel)); } } [Test] public void DoubleToTenthsPrecision () { // Note we are testing with locale = it_IT, hence the commas Assert.AreEqual ("15", StringUtil.DoubleToTenthsPrecision (15.0)); Assert.AreEqual ("15", StringUtil.DoubleToTenthsPrecision (15.0334)); Assert.AreEqual ("15,1", StringUtil.DoubleToTenthsPrecision (15.052)); Assert.AreEqual ("15,5", StringUtil.DoubleToTenthsPrecision (15.5234)); Assert.AreEqual ("15", StringUtil.DoubleToTenthsPrecision (14.9734)); Assert.AreEqual ("14,9", StringUtil.DoubleToTenthsPrecision (14.92)); Assert.AreEqual ("0,4", StringUtil.DoubleToTenthsPrecision (0.421)); Assert.AreEqual ("0", StringUtil.DoubleToTenthsPrecision (0.01)); Assert.AreEqual ("1.000,3", StringUtil.DoubleToTenthsPrecision (1000.32)); Assert.AreEqual ("9.233", StringUtil.DoubleToTenthsPrecision (9233)); } [Test] public void DoubleToPluralInt () { // This method helps us pluralize doubles. Probably a horrible i18n idea. Assert.AreEqual (0, StringUtil.DoubleToPluralInt (0)); Assert.AreEqual (1, StringUtil.DoubleToPluralInt (1)); Assert.AreEqual (2, StringUtil.DoubleToPluralInt (2)); Assert.AreEqual (1, StringUtil.DoubleToPluralInt (0.5)); Assert.AreEqual (2, StringUtil.DoubleToPluralInt (1.8)); Assert.AreEqual (22, StringUtil.DoubleToPluralInt (21.3)); } [Test] public void RemovesNewlines () { Assert.AreEqual ("", StringUtil.RemoveNewlines ("")); Assert.AreEqual (null, StringUtil.RemoveNewlines (null)); Assert.AreEqual ("foobar", StringUtil.RemoveNewlines (@"foo bar")); Assert.AreEqual ("foobar baz", StringUtil.RemoveNewlines ("foo\nbar \nbaz")); Assert.AreEqual ("haswindows newline andunix", StringUtil.RemoveNewlines ("has\nwindows\r\n newline \nandunix")); } [Test] public void RemovesHtml () { Assert.AreEqual ("", StringUtil.RemoveHtml ("")); Assert.AreEqual (null, StringUtil.RemoveHtml (null)); Assert.AreEqual ("foobar", StringUtil.RemoveHtml ("foobar")); Assert.AreEqual ("foobar", StringUtil.RemoveHtml ("foobar")); Assert.AreEqual ("foobar", StringUtil.RemoveHtml ("foobar")); Assert.AreEqual ("foobar", StringUtil.RemoveHtml ("foobar")); Assert.AreEqual ("foobazbar", StringUtil.RemoveHtml ("foobazbar")); Assert.AreEqual ("foobaz foo bar", StringUtil.RemoveHtml (@"foobaz foo< /a> bar")); } [Test] public void TestJoin () { var s = new string [] { "foo", "bar" }; Assert.AreEqual ("foo, bar", s.Join (", ")); Assert.AreEqual ("foobar", s.Join ("")); Assert.AreEqual ("foobar", s.Join (null)); Assert.AreEqual ("", new string [] {}.Join (", ")); s = new string [] { "foo", "bar", "baz" }; Assert.AreEqual ("foo -- bar -- baz", s.Join (" -- ")); } [Test] public void TestFormatInterleaved () { var objects = new object [] { "one", 2 }; var format = new Func ((fmt) => StringUtil.FormatInterleaved (fmt, objects).Select (o => o.ToString ()).Join ("")); Assert.AreEqual ("onefoo2bar", format ("{0} foo {1} bar")); Assert.AreEqual ("fooone2bar", format ("foo {0} {1} bar")); Assert.AreEqual ("fooonebar2", format ("foo {0} bar {1}")); Assert.AreEqual ("onefoo bar2", format ("{0} foo bar {1}")); } [Test] public void TestSubstringBetween () { Assert.AreEqual ("bar", "foobarbaz".SubstringBetween ("foo", "baz")); Assert.AreEqual ("barfoobam", "erefoobarfoobambazabc".SubstringBetween ("foo", "baz")); Assert.AreEqual (null, "foobar".SubstringBetween ("foo", "baz")); Assert.AreEqual (null, "bar".SubstringBetween ("foo", "baz")); Assert.AreEqual (null, "".SubstringBetween ("foo", "baz")); } } [TestFixture] public class SearchKeyTests { private void AssertSearchKey (string before, string after) { Assert.AreEqual (after, StringUtil.SearchKey (before)); } [Test] public void TestEmpty () { AssertSearchKey ("", ""); AssertSearchKey (null, null); } // Test that resulting search keys are in lower-case [Test] public void TestLowercase () { AssertSearchKey ("A", "a"); AssertSearchKey ("\u0104", "a"); } // Test that combining diacritics are removed from Latin characters. [Test] public void TestRemoveDiacritics () { AssertSearchKey ("\u00e9", "e"); AssertSearchKey ("e\u0301", "e"); AssertSearchKey ("\u014d", "o"); AssertSearchKey ("o\u0304", "o"); AssertSearchKey ("Español", "espanol"); AssertSearchKey ("30 años de la revolución iraní", "30 anos de la revolucion irani"); AssertSearchKey ("FRANCÉS", "frances"); // Polish letters AssertSearchKey ("Ä…", "a"); AssertSearchKey ("Ä„", "a"); AssertSearchKey ("ć", "c"); AssertSearchKey ("Ć", "c"); AssertSearchKey ("Ä™", "e"); AssertSearchKey ("Ę", "e"); AssertSearchKey ("Å‚", "l"); AssertSearchKey ("Å", "l"); AssertSearchKey ("Å„", "n"); AssertSearchKey ("Ń", "n"); AssertSearchKey ("ó", "o"); AssertSearchKey ("Ó", "o"); AssertSearchKey ("Å›", "s"); AssertSearchKey ("Åš", "s"); AssertSearchKey ("ź", "z"); AssertSearchKey ("Ź", "z"); AssertSearchKey ("ż", "z"); AssertSearchKey ("Å»", "z"); // Hiragana AssertSearchKey ("\u304c", "\u304b"); // Cyrillic AssertSearchKey ("\u0451", "\u0435"); AssertSearchKey ("\u0401", "\u0435"); AssertSearchKey ("\u0439", "\u0438"); AssertSearchKey ("\u0419", "\u0438"); } // Test that some non-Latin characters are converted to Latin counterparts. [Test] public void TestEquivalents () { AssertSearchKey ("\u00f8", "o"); AssertSearchKey ("\u0142", "l"); } // Test that some kinds of punctuation are removed. [Test] public void TestRemovePunctuation () { AssertSearchKey ("'", ""); AssertSearchKey ("\"", ""); AssertSearchKey ("!", ""); AssertSearchKey ("?", ""); AssertSearchKey ("/", ""); } [Test] // http://bugzilla.gnome.org/show_bug.cgi?id=573484 public void TestCollapseSpaces () { AssertSearchKey (" a \t b ", "a b"); AssertSearchKey ("100 % techno", "100 techno"); // Character in the set of special overrides AssertSearchKey ("a \u00f8", "a o"); // Invalid combining character AssertSearchKey ("a \u0301", "a"); } } [TestFixture] public class EscapeFilenameTests { private void AssertProduces (string input, string output) { Assert.AreEqual (output, StringUtil.EscapeFilename (input)); } private void AssertProducesSame (string input) { AssertProduces (input, input); } [Test] public void TestEmpty () { AssertProduces (null, ""); AssertProduces ("", ""); AssertProduces (" ", ""); AssertProduces (" ", ""); } [Test] public void TestNotChanged () { AssertProducesSame ("a"); AssertProducesSame ("aaa"); AssertProducesSame ("Foo Bar"); AssertProducesSame ("03-Nur geträumt"); AssertProducesSame ("你好"); AssertProducesSame ("nÇ hÇŽo"); } [Test] public void TestStripped () { AssertProduces ("Foo*bar", "Foo_bar"); AssertProduces ("", "_foo_bar_"); AssertProduces ("", "_"); AssertProduces ("Greetings! -* 你好?", "Greetings! -_ 你好_"); } } [TestFixture] public class SortKeyTests { private void AssertSortKey (string before, object after) { Assert.AreEqual (after, StringUtil.SortKey (before)); } [Test] public void TestNull () { AssertSortKey (null, null); } [Test] public void TestEmpty () { AssertSortKey ("", new byte[] {1, 1, 1, 1, 0}); } [Test] public void TestSortKey () { AssertSortKey ("a", new byte[] {14, 2, 1, 1, 1, 1, 0}); AssertSortKey ("A", new byte[] {14, 2, 1, 1, 1, 1, 0}); AssertSortKey ("\u0104", new byte[] {14, 2, 1, 27, 1, 1, 1, 0,}); } } [TestFixture] public class EscapePathTests { private readonly char dir_sep = Path.DirectorySeparatorChar; private void AssertProduces (string input, string output) { Assert.AreEqual (output, StringUtil.EscapePath (input)); } private void AssertProducesSame (string input) { AssertProduces (input, input); } [Test] public void TestEmpty () { AssertProduces (null, ""); AssertProduces ("", ""); AssertProduces (" ", ""); AssertProduces (" ", ""); } [Test] public void TestNotChanged () { AssertProducesSame ("a"); AssertProducesSame ("aaa"); AssertProducesSame ("Foo Bar"); AssertProducesSame ("03-Nur geträumt"); AssertProducesSame ("превед"); AssertProducesSame ("nÇ hÇŽo"); AssertProducesSame (String.Format ("a{0}b.ogg", dir_sep)); AssertProducesSame (String.Format ("foo{0}bar{0}01. baz.ogg", dir_sep)); AssertProducesSame (String.Format ("{0}foo*?:", dir_sep)); // rooted, shouldn't change } [Test] public void TestStripped () { AssertProduces ( String.Format ("foo*bar{0}ham:spam.ogg", dir_sep), String.Format ("foo_bar{0}ham_spam.ogg", dir_sep)); AssertProduces ( String.Format ("..lots..{0}o.f.{0}.dots.ogg.", dir_sep), String.Format ("lots{0}o.f{0}dots.ogg", dir_sep)); AssertProduces ( String.Format ("foo{0}..{0}bar.ogg", dir_sep), String.Format ("foo{0}bar.ogg", dir_sep)); AssertProduces ( String.Format (". foo{0}01. bar.ogg. ", dir_sep), String.Format ("foo{0}01. bar.ogg", dir_sep)); } } [TestFixture] public class SubstringCountTests { private void AssertCount (string haystack, string needle, uint expected) { Assert.AreEqual (expected, StringUtil.SubstringCount (haystack, needle)); } [Test] public void TestEmpty () { AssertCount ("", "a", 0); AssertCount ("a", "", 0); } [Test] public void TestNoMatches () { AssertCount ("a", "b", 0); AssertCount ("with needle in", "long needle", 0); } [Test] public void TestMatches () { AssertCount ("abbcbba", "a", 2); AssertCount ("abbcbba", "b", 4); AssertCount ("with needle in", "needle", 1); } } } #endif f-spot-0.8.2/lib/Hyena/Hyena/Hyena/Tests/DateTimeUtilTests.cs0000644000175000017500000000557211420634720024201 0ustar00rubenruben00000000000000// // DateTimeUtilTests.cs // // Author: // Gabriel Burt // // Copyright (c) 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #if ENABLE_TESTS using System; using NUnit.Framework; using Hyena; namespace Hyena.Tests { [TestFixture] public class DateTimeUtilTests { [Test] public void InvariantString () { // Tests are run in Chicago timezone, UTC -6 in the winter, -5 in the summer TestInv ("2010-02-18 02:41:00.000 -06:00", new DateTime (2010, 2, 18, 2, 41, 0, 0)); TestInv ("2010-02-18 02:41:50.123 -06:00", new DateTime (2010, 2, 18, 2, 41, 50, 123)); TestInv ("2010-10-18 02:01:00.000 -05:00", new DateTime (2010, 10, 18, 2, 1, 0, 0)); } private void TestInv (string inv_string, DateTime dt) { // Make sure we can generate the given string from the DateTime Assert.AreEqual (inv_string, DateTimeUtil.ToInvariantString (dt)); // And vice versa DateTime parsed_dt; if (DateTimeUtil.TryParseInvariant (inv_string, out parsed_dt)) Assert.AreEqual (dt, parsed_dt); else Assert.Fail (String.Format ("TryParseInvariant failed on {0}", inv_string)); } [Test] public void FromToSymmetry () { // ToTimeT only has precision to the second; so strip off the remainding ticks DateTime now = DateTime.Now; now = now.Subtract (TimeSpan.FromTicks (now.Ticks % TimeSpan.TicksPerSecond)); long time_t = DateTimeUtil.ToTimeT (now); DateTime now_t = DateTimeUtil.FromTimeT (time_t); Assert.AreEqual (DateTimeKind.Local, now.Kind); Assert.AreEqual (DateTimeKind.Local, now_t.Kind); Assert.AreEqual (now, now_t); } } } #endif f-spot-0.8.2/lib/Hyena/Hyena/Hyena/Tests/TestBase.cs0000644000175000017500000000671011420634720022331 0ustar00rubenruben00000000000000// // BansheeTests.cs // // Author: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using System.IO; using System.Collections.Generic; using System.Reflection; using System.Threading; using NUnit.Framework; using Hyena; namespace Hyena.Tests { public struct TransformPair { public F From; public T To; public TransformPair (F from, T to) { From = from; To = to; } public static TransformPair [] GetFrom (params object [] objects) { TransformPair [] pairs = new TransformPair [objects.Length / 2]; for (int i = 0; i < objects.Length; i += 2) { pairs[i/2] = new TransformPair ((F)objects[i], (T)objects[i+1]); } return pairs; } public override string ToString () { return From.ToString (); } } public delegate To Transform (F from); public abstract class TestBase { private static string bin_dir; public static string BinDir { get { return bin_dir ?? (bin_dir = Path.GetDirectoryName (Assembly.GetExecutingAssembly ().Location)); } } private static string tests_dir; public static string TestsDir { get { return tests_dir ?? (tests_dir = Path.Combine (Path.GetDirectoryName (BinDir), "tests")); } } public static void AssertForEach (IEnumerable objects, Action runner) { System.Text.StringBuilder sb = new System.Text.StringBuilder (); foreach (T o in objects) { try { runner (o); } catch (AssertionException e) { sb.AppendFormat ("Failed assertion on {0}: {1}\n", o, e.Message); } catch (Exception e) { sb.AppendFormat ("\nCaught exception on {0}: {1}\n", o, e.ToString ()); } } if (sb.Length > 0) Assert.Fail ("\n" + sb.ToString ()); } // Fails to compile, causes SIGABRT in gmcs; boo /*public static void AssertTransformsEach (IEnumerable> pairs, Transform transform) { AssertForEach (pairs, delegate (TransformPair pair) { Assert.AreEqual (pair.To, transform (pair.From)); }); }*/ } } #endif f-spot-0.8.2/lib/Hyena/Hyena/Hyena/Tests/CryptoUtilTests.cs0000644000175000017500000000572111420634720023761 0ustar00rubenruben00000000000000// // CryptoUtilTests.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using System.IO; using NUnit.Framework; using Hyena; namespace Hyena.Tests { [TestFixture] public class CryptoUtilTests { [Test] public void Md5Encode () { Assert.AreEqual ("ae2b1fca515949e5d54fb22b8ed95575", CryptoUtil.Md5Encode ("testing")); Assert.AreEqual ("", CryptoUtil.Md5Encode (null)); Assert.AreEqual ("", CryptoUtil.Md5Encode ("")); } [Test] public void IsMd5Encoded () { Assert.IsTrue (CryptoUtil.IsMd5Encoded ("ae2b1fca515949e5d54fb22b8ed95575")); Assert.IsFalse (CryptoUtil.IsMd5Encoded ("abc233")); Assert.IsFalse (CryptoUtil.IsMd5Encoded ("lebowski")); Assert.IsFalse (CryptoUtil.IsMd5Encoded ("ae2b1fca515949e5g54fb22b8ed95575")); Assert.IsFalse (CryptoUtil.IsMd5Encoded (null)); Assert.IsFalse (CryptoUtil.IsMd5Encoded ("")); } [Test] public void Md5EncodeStream () { var file = Path.GetTempFileName (); var tw = new StreamWriter (file); tw.Write ("testing"); tw.Close (); var stream = new FileStream (file, FileMode.Open); Assert.AreEqual ("ae2b1fca515949e5d54fb22b8ed95575", CryptoUtil.Md5EncodeStream (stream)); stream.Close (); File.Delete (file); } /*[Test] public void Md5Performance () { int max = 10000; using (new Timer (String.Format ("Computed {0} MD5 hashes", max))) { for (int i = 0; i < max; i++) { CryptoUtil.Md5Encode ("LkaJSd Flkjdf234234lkj3WlkejewrVlkdf @343434 dsfjk 3497u34 l 2008 lkjdf"); } } }*/ } } #endif f-spot-0.8.2/lib/Hyena/Hyena/Hyena/Delegates.cs0000644000175000017500000000234411420634720021411 0ustar00rubenruben00000000000000// // Delegates.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // namespace Hyena { public delegate void Action (); } f-spot-0.8.2/lib/Hyena/Hyena/Hyena/Paths.cs0000644000175000017500000002101411420634720020566 0ustar00rubenruben00000000000000// // Paths.cs // // Author: // Aaron Bockover // Ruben Vermeersch // // Copyright (C) 2005-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System.IO; using System; using System.Text; namespace Hyena { public class Paths { public static string GetTempFileName (string dir) { return GetTempFileName (dir, null); } public static string GetTempFileName (string dir, string extension) { return GetTempFileName (new DirectoryInfo (dir), extension); } public static string GetTempFileName (DirectoryInfo dir, string extension) { string path = null; if (dir == null || !dir.Exists) { throw new DirectoryNotFoundException (); } do { string guid = Guid.NewGuid ().ToString (); string file = extension == null ? guid : String.Format ("{0}.{1}", guid, extension); path = Path.Combine (dir.FullName, file); } while (File.Exists (path)); return path; } public static string Combine (string first, params string [] components) { if (String.IsNullOrEmpty (first)) { throw new ArgumentException ("First component must not be null or empty", "first"); } else if (components == null || components.Length < 1) { throw new ArgumentException ("One or more path components must be provided", "components"); } string result = first; foreach (string component in components) { result = Path.Combine (result, component); } return result; } public static string FindProgramInPath (string command) { foreach (string path in GetExecPaths ()) { string full_path = Path.Combine (path, command); try { FileInfo info = new FileInfo (full_path); // FIXME: System.IO is super lame, should check for 0755 if (info.Exists) { return full_path; } } catch { } } return null; } private static string [] GetExecPaths () { string path = Environment.GetEnvironmentVariable ("PATH"); if (String.IsNullOrEmpty (path)) { return new string [] { "/bin", "/usr/bin", "/usr/local/bin" }; } // this is super lame, should handle quoting/escaping return path.Split (':'); } public static string MakePathRelative (string path, string to) { if (String.IsNullOrEmpty (path) || String.IsNullOrEmpty (to)) { return null; } if (Path.IsPathRooted (path) ^ Path.IsPathRooted (to)) { // one path is absolute, one path is relative, impossible to compare return null; } if (path == to) { return String.Empty; } if (to[to.Length - 1] != Path.DirectorySeparatorChar) { to = to + Path.DirectorySeparatorChar; } if (path.StartsWith (to)) { return path.Substring (to.Length); } return BuildRelativePath (path, to); } private static string BuildRelativePath (string path, string to) { var toParts = to.Split (Path.DirectorySeparatorChar); var pathParts = path.Split (Path.DirectorySeparatorChar); var i = 0; while (i < toParts.Length && i < pathParts.Length && toParts [i] == pathParts [i]) { i++; } var relativePath = new StringBuilder (); for (int j = 0; j < toParts.Length - i - 1; j++) { relativePath.Append (".."); relativePath.Append (Path.DirectorySeparatorChar); } var required = new string [pathParts.Length - i]; for (int j = i; j < pathParts.Length; j++) { required [j - i] = pathParts [j]; } relativePath.Append (String.Join (Path.DirectorySeparatorChar.ToString (), required)); return relativePath.ToString (); } public static string ApplicationData { get; private set; } public static string ApplicationCache { get; private set; } private static string application_name = null; public static string ApplicationName { get { if (application_name == null) { throw new ApplicationException ("Paths.ApplicationName must be set first"); } return application_name; } set { application_name = value; InitializePaths (); } } // This can only happen after ApplicationName is set. private static void InitializePaths () { ApplicationCache = Path.Combine (XdgBaseDirectorySpec.GetUserDirectory ( "XDG_CACHE_HOME", ".cache"), ApplicationName); ApplicationData = Path.Combine (Environment.GetFolderPath ( Environment.SpecialFolder.ApplicationData), ApplicationName); if (!Directory.Exists (ApplicationData)) { Directory.CreateDirectory (ApplicationData); } } public static string ExtensionCacheRoot { get { return Path.Combine (ApplicationCache, "extensions"); } } public static string SystemTempDir { get { return "/tmp/"; } } public static string TempDir { get { string dir = Path.Combine (ApplicationCache, "temp"); if (File.Exists (dir)) { File.Delete (dir); } Directory.CreateDirectory (dir); return dir; } } private static string installed_application_prefix = null; public static string InstalledApplicationPrefix { get { if (installed_application_prefix == null) { installed_application_prefix = Path.GetDirectoryName ( System.Reflection.Assembly.GetExecutingAssembly ().Location); if (Directory.Exists (Paths.Combine (installed_application_prefix, "share", ApplicationName))) { return installed_application_prefix; } DirectoryInfo entry_directory = new DirectoryInfo (installed_application_prefix); if (entry_directory != null && entry_directory.Parent != null && entry_directory.Parent.Parent != null) { installed_application_prefix = entry_directory.Parent.Parent.FullName; } } return installed_application_prefix; } } public static string InstalledApplicationDataRoot { get { return Path.Combine (InstalledApplicationPrefix, "share"); } } public static string InstalledApplicationData { get { return Path.Combine (InstalledApplicationDataRoot, ApplicationName); } } public static string GetInstalledDataDirectory (string path) { return Path.Combine (InstalledApplicationData, path); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena/SafeUri.cs0000644000175000017500000001466711430563642021072 0ustar00rubenruben00000000000000/*************************************************************************** * SafeUri.cs * * Copyright (C) 2006 Novell, Inc. * Written by Aaron Bockover ****************************************************************************/ /* THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ using System; using System.Runtime.InteropServices; namespace Hyena { public class SafeUri { private enum LocalPathCheck { NotPerformed, Yes, No } private static int MAX_SCHEME_LENGTH = 8; private string uri; private string local_path; private string scheme; private LocalPathCheck local_path_check = LocalPathCheck.NotPerformed; public SafeUri (string uri) { int scheme_delimit_index = uri.IndexOf ("://"); if (scheme_delimit_index > 0 && scheme_delimit_index <= MAX_SCHEME_LENGTH) { this.uri = uri; } else { this.uri = FilenameToUri (uri); } } public SafeUri (string uri, bool isUri) { if (isUri) { this.uri = uri; } else { this.uri = FilenameToUri (uri); } } public SafeUri (Uri uri) { this.uri = uri.AbsoluteUri; } public static string FilenameToUri (string localPath) { // TODO: replace with managed conversion to avoid marshalling IntPtr path_ptr = GLib.Marshaller.StringToPtrGStrdup (localPath); #if WIN32 IntPtr uri_ptr = g_filename_to_uri_utf8 (path_ptr, IntPtr.Zero, IntPtr.Zero); #else IntPtr uri_ptr = g_filename_to_uri (path_ptr, IntPtr.Zero, IntPtr.Zero); #endif GLib.Marshaller.Free (path_ptr); if (uri_ptr == IntPtr.Zero) { throw new ApplicationException ("Filename path must be absolute"); } string uri = GLib.Marshaller.Utf8PtrToString (uri_ptr); GLib.Marshaller.Free (uri_ptr); return uri; } public static string UriToFilename (string uri) { // TODO: replace with managed conversion to avoid marshalling IntPtr uri_ptr = GLib.Marshaller.StringToPtrGStrdup (uri); #if WIN32 IntPtr path_ptr = g_filename_from_uri_utf8 (uri_ptr, IntPtr.Zero, IntPtr.Zero); #else IntPtr path_ptr = g_filename_from_uri (uri_ptr, IntPtr.Zero, IntPtr.Zero); #endif GLib.Marshaller.Free (uri_ptr); if (path_ptr == IntPtr.Zero) { throw new ApplicationException ("URI could not be converted to local file location"); } string path = GLib.Marshaller.Utf8PtrToString (path_ptr); GLib.Marshaller.Free (path_ptr); return path; } public static string UriToFilename (SafeUri uri) { return UriToFilename (uri.AbsoluteUri); } public override string ToString () { return AbsoluteUri; } public static implicit operator string (SafeUri s) { return s.ToString (); } public override bool Equals (object o) { SafeUri s = o as SafeUri; if (s != null) { return s.AbsoluteUri == AbsoluteUri; } return false; } public override int GetHashCode () { return AbsoluteUri.GetHashCode (); } public string AbsoluteUri { get { return uri; } } public bool IsLocalPath { get { if (local_path_check == LocalPathCheck.NotPerformed) { if (IsFile) { local_path_check = LocalPathCheck.Yes; return true; } else { local_path_check = LocalPathCheck.No; return false; } } return local_path_check == LocalPathCheck.Yes; } } public string AbsolutePath { get { if (local_path == null && IsLocalPath) { local_path = UriToFilename (uri); } return local_path; } } public string LocalPath { get { return AbsolutePath; } } public string Scheme { get { if (scheme == null) { scheme = uri.Substring (0, uri.IndexOf ("://")); } return scheme; } } public bool IsFile { get { return Scheme == System.Uri.UriSchemeFile; } } #if WIN32 [DllImport ("libglib-2.0-0.dll")] private static extern IntPtr g_filename_to_uri_utf8 (IntPtr filename, IntPtr hostname, IntPtr error); [DllImport ("libglib-2.0-0.dll")] private static extern IntPtr g_filename_from_uri_utf8 (IntPtr uri, IntPtr hostname, IntPtr error); #else [DllImport ("libglib-2.0-0.dll")] private static extern IntPtr g_filename_to_uri (IntPtr filename, IntPtr hostname, IntPtr error); [DllImport ("libglib-2.0-0.dll")] private static extern IntPtr g_filename_from_uri (IntPtr uri, IntPtr hostname, IntPtr error); #endif } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena/ApplicationContext.cs0000644000175000017500000001001311467745411023327 0ustar00rubenruben00000000000000// // ApplicationContext.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Text; using System.Runtime.InteropServices; using Hyena.CommandLine; namespace Hyena { public delegate void InvokeHandler (); public static class ApplicationContext { public static readonly DateTime StartedAt = DateTime.Now; static ApplicationContext () { Log.Debugging = Debugging; } private static CommandLineParser command_line = new CommandLineParser (); public static CommandLineParser CommandLine { set { command_line = value; } get { return command_line; } } public static string ApplicationName { get; set; } private static Layout command_line_layout; public static Layout CommandLineLayout { get { return command_line_layout; } set { command_line_layout = value; } } private static bool? debugging = null; public static bool Debugging { get { if (debugging == null) { debugging = CommandLine.Contains ("debug"); debugging |= CommandLine.Contains ("debug-sql"); debugging |= EnvironmentIsSet ("BANSHEE_DEBUG"); } return debugging.Value; } set { debugging = value; Log.Debugging = Debugging; } } public static bool EnvironmentIsSet (string env) { return !String.IsNullOrEmpty (Environment.GetEnvironmentVariable (env)); } public static System.Globalization.CultureInfo InternalCultureInfo { get { return System.Globalization.CultureInfo.InvariantCulture; } } [DllImport ("libc")] // Linux private static extern int prctl (int option, byte [] arg2, IntPtr arg3, IntPtr arg4, IntPtr arg5); [DllImport ("libc")] // BSD private static extern void setproctitle (byte [] fmt, byte [] str_arg); private static void SetProcessName (string name) { if (Environment.OSVersion.Platform != PlatformID.Unix) { return; } try { if (prctl (15 /* PR_SET_NAME */, Encoding.ASCII.GetBytes (name + "\0"), IntPtr.Zero, IntPtr.Zero, IntPtr.Zero) != 0) { throw new ApplicationException ("Error setting process name: " + Mono.Unix.Native.Stdlib.GetLastError ()); } } catch (EntryPointNotFoundException) { setproctitle (Encoding.ASCII.GetBytes ("%s\0"), Encoding.ASCII.GetBytes (name + "\0")); } } public static void TrySetProcessName (string name) { try { SetProcessName (name); } catch { } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena/StringUtil.cs0000644000175000017500000003440211467745411021633 0ustar00rubenruben00000000000000// // StringUtil.cs // // Author: // Aaron Bockover // // Copyright (C) 2006-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Linq; using System.Collections.Generic; using System.IO; using System.Text; using System.Globalization; using System.Text.RegularExpressions; namespace Hyena { public static class StringUtil { private static CompareOptions compare_options = CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth; public static int RelaxedIndexOf (string haystack, string needle) { return CultureInfo.CurrentCulture.CompareInfo.IndexOf (haystack, needle, compare_options); } public static int RelaxedCompare (string a, string b) { if (a == null && b == null) { return 0; } else if (a != null && b == null) { return 1; } else if (a == null && b != null) { return -1; } int a_offset = a.StartsWith ("the ") ? 4 : 0; int b_offset = b.StartsWith ("the ") ? 4 : 0; return CultureInfo.CurrentCulture.CompareInfo.Compare (a, a_offset, a.Length - a_offset, b, b_offset, b.Length - b_offset, compare_options); } public static string CamelCaseToUnderCase (string s) { return CamelCaseToUnderCase (s, '_'); } private static Regex camelcase = new Regex ("([A-Z]{1}[a-z]+)", RegexOptions.Compiled); public static string CamelCaseToUnderCase (string s, char underscore) { if (String.IsNullOrEmpty (s)) { return null; } StringBuilder undercase = new StringBuilder (); string [] tokens = camelcase.Split (s); for (int i = 0; i < tokens.Length; i++) { if (tokens[i] == String.Empty) { continue; } undercase.Append (tokens[i].ToLower (System.Globalization.CultureInfo.InvariantCulture)); if (i < tokens.Length - 2) { undercase.Append (underscore); } } return undercase.ToString (); } public static string UnderCaseToCamelCase (string s) { if (String.IsNullOrEmpty (s)) { return null; } StringBuilder builder = new StringBuilder (); for (int i = 0, n = s.Length, b = -1; i < n; i++) { if (b < 0 && s[i] != '_') { builder.Append (Char.ToUpper (s[i])); b = i; } else if (s[i] == '_' && i + 1 < n && s[i + 1] != '_') { if (builder.Length > 0 && Char.IsUpper (builder[builder.Length - 1])) { builder.Append (Char.ToLower (s[i + 1])); } else { builder.Append (Char.ToUpper (s[i + 1])); } i++; b = i; } else if (s[i] != '_') { builder.Append (Char.ToLower (s[i])); b = i; } } return builder.ToString (); } public static string RemoveNewlines (string input) { if (input != null) { return input.Replace ("\r\n", String.Empty).Replace ("\n", String.Empty); } return null; } private static Regex tags = new Regex ("<[^>]+>", RegexOptions.Compiled | RegexOptions.Multiline); public static string RemoveHtml (string input) { if (input == null) { return input; } return tags.Replace (input, String.Empty); } public static string DoubleToTenthsPrecision (double num) { return DoubleToTenthsPrecision (num, false); } public static string DoubleToTenthsPrecision (double num, bool always_decimal) { return DoubleToTenthsPrecision (num, always_decimal, NumberFormatInfo.CurrentInfo); } public static string DoubleToTenthsPrecision (double num, bool always_decimal, IFormatProvider provider) { num = Math.Round (num, 1, MidpointRounding.ToEven); return String.Format (provider, !always_decimal && num == (int)num ? "{0:N0}" : "{0:N1}", num); } // This method helps us pluralize doubles. Probably a horrible i18n idea. public static int DoubleToPluralInt (double num) { if (num == (int)num) return (int)num; else return (int)num + 1; } // A mapping of non-Latin characters to be considered the same as // a Latin equivalent. private static Dictionary BuildSpecialCases () { Dictionary dict = new Dictionary (); dict['\u00f8'] = 'o'; dict['\u0142'] = 'l'; return dict; } private static Dictionary searchkey_special_cases = BuildSpecialCases (); // Removes accents from Latin characters, and some kinds of punctuation. public static string SearchKey (string val) { if (String.IsNullOrEmpty (val)) { return val; } val = val.ToLower (); StringBuilder sb = new StringBuilder (); UnicodeCategory category; bool previous_was_letter = false; bool got_space = false; // Normalizing to KD splits into (base, combining) so we can check for letters // and then strip off any NonSpacingMarks following them foreach (char orig_c in val.TrimStart ().Normalize (NormalizationForm.FormKD)) { // Check for a special case *before* whitespace. This way, if // a special case is ever added that maps to ' ' or '\t', it // won't cause a run of whitespace in the result. char c = orig_c; if (searchkey_special_cases.ContainsKey (c)) { c = searchkey_special_cases[c]; } if (c == ' ' || c == '\t') { got_space = true; continue; } category = Char.GetUnicodeCategory (c); if (category == UnicodeCategory.OtherPunctuation) { // Skip punctuation } else if (!(previous_was_letter && category == UnicodeCategory.NonSpacingMark)) { if (got_space) { sb.Append (" "); got_space = false; } sb.Append (c); } // Can ignore A-Z because we've already lowercased the char previous_was_letter = Char.IsLetter (c); } string result = sb.ToString (); try { result = result.Normalize (NormalizationForm.FormKC); } catch { // FIXME: work-around, see http://bugzilla.gnome.org/show_bug.cgi?id=590478 } return result; } private static Regex invalid_path_regex = BuildInvalidPathRegex (); private static Regex BuildInvalidPathRegex () { char [] invalid_path_characters = new char [] { // Control characters: there's no reason to ever have one of these in a track name anyway, // and they're invalid in all Windows filesystems. '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', '\x08', '\x09', '\x0A', '\x0B', '\x0C', '\x0D', '\x0E', '\x0F', '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1A', '\x1B', '\x1C', '\x1D', '\x1E', '\x1F', // Invalid in FAT32 / NTFS: " \ / : * | ? < > // Invalid in HFS : // Invalid in ext3 / '"', '\\', '/', ':', '*', '|', '?', '<', '>' }; string regex_str = "["; for (int i = 0; i < invalid_path_characters.Length; i++) { regex_str += "\\" + invalid_path_characters[i]; } regex_str += "]+"; return new Regex (regex_str, RegexOptions.Compiled); } private static CompareInfo culture_compare_info = CultureInfo.CurrentCulture.CompareInfo; public static byte[] SortKey (string orig) { if (orig == null) { return null; } return culture_compare_info.GetSortKey (orig, CompareOptions.IgnoreCase).KeyData; } private static readonly char[] escape_path_trim_chars = new char[] {'.', '\x20'}; public static string EscapeFilename (string input) { if (input == null) return ""; // Remove leading and trailing dots and spaces. input = input.Trim (escape_path_trim_chars); return invalid_path_regex.Replace (input, "_"); } public static string EscapePath (string input) { if (input == null) return ""; // This method should be called before the full path is constructed. if (Path.IsPathRooted (input)) { return input; } StringBuilder builder = new StringBuilder (); foreach (string name in input.Split (Path.DirectorySeparatorChar)) { // Escape the directory or the file name. string escaped = EscapeFilename (name); // Skip empty names. if (escaped.Length > 0) { builder.Append (escaped); builder.Append (Path.DirectorySeparatorChar); } } // Chop off the last character. if (builder.Length > 0) { builder.Length--; } return builder.ToString (); } public static string MaybeFallback (string input, string fallback) { string trimmed = input == null ? null : input.Trim (); return String.IsNullOrEmpty (trimmed) ? fallback : trimmed; } public static uint SubstringCount (string haystack, string needle) { if (String.IsNullOrEmpty (haystack) || String.IsNullOrEmpty (needle)) { return 0; } int position = 0; uint count = 0; while (true) { int index = haystack.IndexOf (needle, position); if (index < 0) { return count; } count++; position = index + 1; } } public static string SubstringBetween (this string input, string start, string end) { int s = input.IndexOf (start); if (s == -1) return null; s += start.Length; int l = Math.Min (input.Length - 1, input.IndexOf (end, s)) - s; if (l > 0 && s + l < input.Length) { return input.Substring (s, l); } else { return null; } } private static readonly char[] escaped_like_chars = new char[] {'\\', '%', '_'}; public static string EscapeLike (string s) { if (s.IndexOfAny (escaped_like_chars) != -1) { return s.Replace (@"\", @"\\").Replace ("%", @"\%").Replace ("_", @"\_"); } return s; } public static string Join (this IEnumerable strings, string sep) { var sb = new StringBuilder (); foreach (var str in strings) { sb.Append (str); sb.Append (sep); } if (sb.Length > 0 && sep != null) { sb.Length -= sep.Length; } return sb.ToString (); } public static IEnumerable FormatInterleaved (string format, params object [] objects) { var indices = new Dictionary (); for (int i = 0; i < objects.Length; i++) { int j = format.IndexOf ("{" + i + "}"); if (j == -1) { Hyena.Log.ErrorFormat ("Translated string {0} should contain {{1}} in which to place object {2}", format, i, objects[i]); } indices[objects[i]] = j; } int str_pos = 0; foreach (var obj in objects.OrderBy (w => indices[w])) { int widget_i = indices[obj]; if (widget_i > str_pos) { var str = format.Substring (str_pos, widget_i - str_pos).Trim (); if (str != "") yield return str; } yield return obj; str_pos = widget_i + 2 + Array.IndexOf (objects, obj).ToString ().Length; } if (str_pos < format.Length - 1) { var str = format.Substring (str_pos, format.Length - str_pos).Trim (); if (str != "") yield return str; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena/Timer.cs0000644000175000017500000000361011420634720020571 0ustar00rubenruben00000000000000// // Timer.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena { public class Timer : IDisposable { private DateTime start; private string label; public Timer (string format, params object [] vals) : this (String.Format (format, vals)) { } public Timer (string label) { this.label = label; start = DateTime.Now; } public TimeSpan ElapsedTime { get { return DateTime.Now - start; } } public void WriteElapsed (string message) { Console.Error.WriteLine ("{0} {1} {2}", label, message, ElapsedTime); } public void Dispose () { WriteElapsed ("timer stopped:"); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena/Log.cs0000644000175000017500000002715611420634720020245 0ustar00rubenruben00000000000000// // Log.cs // // Author: // Aaron Bockover // // Copyright (C) 2005-2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Text; using System.Collections.Generic; using System.Threading; namespace Hyena { public delegate void LogNotifyHandler (LogNotifyArgs args); public class LogNotifyArgs : EventArgs { private LogEntry entry; public LogNotifyArgs (LogEntry entry) { this.entry = entry; } public LogEntry Entry { get { return entry; } } } public enum LogEntryType { Debug, Warning, Error, Information } public class LogEntry { private LogEntryType type; private string message; private string details; private DateTime timestamp; internal LogEntry (LogEntryType type, string message, string details) { this.type = type; this.message = message; this.details = details; this.timestamp = DateTime.Now; } public LogEntryType Type { get { return type; } } public string Message { get { return message; } } public string Details { get { return details; } } public DateTime TimeStamp { get { return timestamp; } } } public static class Log { public static event LogNotifyHandler Notify; private static Dictionary timers = new Dictionary (); private static uint next_timer_id = 1; private static bool debugging = false; public static bool Debugging { get { return debugging; } set { debugging = value; } } public static void Commit (LogEntryType type, string message, string details, bool showUser) { if (type == LogEntryType.Debug && !Debugging) { return; } if (type != LogEntryType.Information || (type == LogEntryType.Information && !showUser)) { switch (type) { case LogEntryType.Error: ConsoleCrayon.ForegroundColor = ConsoleColor.Red; break; case LogEntryType.Warning: ConsoleCrayon.ForegroundColor = ConsoleColor.DarkYellow; break; case LogEntryType.Information: ConsoleCrayon.ForegroundColor = ConsoleColor.Green; break; case LogEntryType.Debug: ConsoleCrayon.ForegroundColor = ConsoleColor.Blue; break; } var thread_name = String.Empty; if (Debugging) { var thread = Thread.CurrentThread; thread_name = String.Format ("{0} ", thread.ManagedThreadId); } Console.Write ("[{5}{0} {1:00}:{2:00}:{3:00}.{4:000}]", TypeString (type), DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond, thread_name); ConsoleCrayon.ResetColor (); if (details != null) { Console.WriteLine (" {0} - {1}", message, details); } else { Console.WriteLine (" {0}", message); } } if (showUser) { OnNotify (new LogEntry (type, message, details)); } } private static string TypeString (LogEntryType type) { switch (type) { case LogEntryType.Debug: return "Debug"; case LogEntryType.Warning: return "Warn "; case LogEntryType.Error: return "Error"; case LogEntryType.Information: return "Info "; } return null; } private static void OnNotify (LogEntry entry) { LogNotifyHandler handler = Notify; if (handler != null) { handler (new LogNotifyArgs (entry)); } } #region Timer Methods public static uint DebugTimerStart (string message) { return TimerStart (message, false); } public static uint InformationTimerStart (string message) { return TimerStart (message, true); } private static uint TimerStart (string message, bool isInfo) { if (!Debugging && !isInfo) { return 0; } if (isInfo) { Information (message); } else { Debug (message); } return TimerStart (isInfo); } public static uint DebugTimerStart () { return TimerStart (false); } public static uint InformationTimerStart () { return TimerStart (true); } private static uint TimerStart (bool isInfo) { if (!Debugging && !isInfo) { return 0; } uint timer_id = next_timer_id++; timers.Add (timer_id, DateTime.Now); return timer_id; } public static void DebugTimerPrint (uint id) { if (!Debugging) { return; } TimerPrint (id, "Operation duration: {0}", false); } public static void DebugTimerPrint (uint id, string message) { if (!Debugging) { return; } TimerPrint (id, message, false); } public static void InformationTimerPrint (uint id) { TimerPrint (id, "Operation duration: {0}", true); } public static void InformationTimerPrint (uint id, string message) { TimerPrint (id, message, true); } private static void TimerPrint (uint id, string message, bool isInfo) { if (!Debugging && !isInfo) { return; } DateTime finish = DateTime.Now; if (!timers.ContainsKey (id)) { return; } TimeSpan duration = finish - timers[id]; string d_message; if (duration.TotalSeconds < 60) { d_message = duration.TotalSeconds.ToString (); } else { d_message = duration.ToString (); } if (isInfo) { InformationFormat (message, d_message); } else { DebugFormat (message, d_message); } } #endregion #region Public Debug Methods public static void Debug (string message, string details) { if (Debugging) { Commit (LogEntryType.Debug, message, details, false); } } public static void Debug (string message) { if (Debugging) { Debug (message, null); } } public static void DebugFormat (string format, params object [] args) { if (Debugging) { Debug (String.Format (format, args)); } } #endregion #region Public Information Methods public static void Information (string message) { Information (message, null); } public static void Information (string message, string details) { Information (message, details, false); } public static void Information (string message, string details, bool showUser) { Commit (LogEntryType.Information, message, details, showUser); } public static void Information (string message, bool showUser) { Information (message, null, showUser); } public static void InformationFormat (string format, params object [] args) { Information (String.Format (format, args)); } #endregion #region Public Warning Methods public static void Warning (string message) { Warning (message, null); } public static void Warning (string message, string details) { Warning (message, details, false); } public static void Warning (string message, string details, bool showUser) { Commit (LogEntryType.Warning, message, details, showUser); } public static void Warning (string message, bool showUser) { Warning (message, null, showUser); } public static void WarningFormat (string format, params object [] args) { Warning (String.Format (format, args)); } #endregion #region Public Error Methods public static void Error (string message) { Error (message, null); } public static void Error (string message, string details) { Error (message, details, false); } public static void Error (string message, string details, bool showUser) { Commit (LogEntryType.Error, message, details, showUser); } public static void Error (string message, bool showUser) { Error (message, null, showUser); } public static void ErrorFormat (string format, params object [] args) { Error (String.Format (format, args)); } #endregion #region Public Exception Methods public static void DebugException (Exception e) { if (Debugging) { Exception (e); } } public static void Exception (Exception e) { Exception (null, e); } public static void Exception (string message, Exception e) { Stack exception_chain = new Stack (); StringBuilder builder = new StringBuilder (); while (e != null) { exception_chain.Push (e); e = e.InnerException; } while (exception_chain.Count > 0) { e = exception_chain.Pop (); builder.AppendFormat ("{0}: {1} (in `{2}')", e.GetType (), e.Message, e.Source).AppendLine (); builder.Append (e.StackTrace); if (exception_chain.Count > 0) { builder.AppendLine (); } } // FIXME: We should save these to an actual log file Log.Warning (message ?? "Caught an exception", builder.ToString (), false); } #endregion } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena/DateTimeUtil.cs0000644000175000017500000000637711420634720022060 0ustar00rubenruben00000000000000// // Utilities.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Globalization; namespace Hyena { public class DateTimeUtil { // FIXME I don't think having a local-unix-epoch makes any sense, I think we should be using // all UTC values. Depending on the time of year in daylight savings timezones, the // local-seconds-since-epoch value will differ, which will cause errors, no? public static readonly DateTime LocalUnixEpoch = new DateTime (1970, 1, 1).ToLocalTime (); public static DateTime ToDateTime (long time) { return FromTimeT (time); } public static long FromDateTime (DateTime time) { return ToTimeT (time); } private static long super_ugly_min_hack = -15768000000; // 500 yrs before epoch...ewww public static DateTime FromTimeT (long time) { return (time <= super_ugly_min_hack) ? DateTime.MinValue : LocalUnixEpoch.AddSeconds (time); } public static long ToTimeT (DateTime time) { return (long)time.Subtract (LocalUnixEpoch).TotalSeconds; } public static string FormatDuration (long time) { return FormatDuration (TimeSpan.FromSeconds (time)); } public static string FormatDuration (TimeSpan time) { return FormatDuration (time.Hours, time.Minutes, time.Seconds); } public static string FormatDuration (int hours, int minutes, int seconds) { return (hours > 0 ? String.Format ("{0}:{1:00}:{2:00}", hours, minutes, seconds) : String.Format ("{0}:{1:00}", minutes, seconds)); } const string INVARIANT_FMT = "yyyy-MM-dd HH:mm:ss.fff zzz"; public static string ToInvariantString (DateTime dt) { return dt.ToString (INVARIANT_FMT, CultureInfo.InvariantCulture); } public static bool TryParseInvariant (string str, out DateTime dt) { return DateTime.TryParseExact (str, INVARIANT_FMT, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt); } } }f-spot-0.8.2/lib/Hyena/Hyena/Hyena/UndoManager.cs0000644000175000017500000000772011420634720021717 0ustar00rubenruben00000000000000// // UndoManager.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; namespace Hyena { public class UndoManager { private Stack undo_stack = new Stack(); private Stack redo_stack = new Stack(); private int frozen_count; private bool try_merge; public event EventHandler UndoChanged; public void Undo() { lock(this) { UndoRedo(undo_stack, redo_stack, true); } } public void Redo() { lock(this) { UndoRedo(redo_stack, undo_stack, false); } } public void Clear() { lock(this) { frozen_count = 0; try_merge = false; undo_stack.Clear(); redo_stack.Clear(); OnUndoChanged(); } } public void AddUndoAction(IUndoAction action) { lock(this) { if(frozen_count != 0) { return; } if(try_merge && undo_stack.Count > 0) { IUndoAction top = undo_stack.Peek(); if(top.CanMerge(action)) { top.Merge(action); return; } } undo_stack.Push(action); redo_stack.Clear(); try_merge = true; OnUndoChanged(); } } protected virtual void OnUndoChanged() { EventHandler handler = UndoChanged; if(handler != null) { handler(this, EventArgs.Empty); } } private void UndoRedo(Stack pop_from, Stack push_to, bool is_undo) { if(pop_from.Count == 0) { return; } IUndoAction action = pop_from.Pop(); frozen_count++; if(is_undo) { action.Undo(); } else { action.Redo(); } frozen_count--; push_to.Push(action); try_merge = true; OnUndoChanged(); } public bool CanUndo { get { return undo_stack.Count > 0; } } public bool CanRedo { get { return redo_stack.Count > 0; } } public IUndoAction UndoAction { get { lock (this) { return CanUndo ? undo_stack.Peek () : null; } } } public IUndoAction RedoAction { get { lock (this) { return CanRedo ? redo_stack.Peek () : null; } } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/0000777000175000017500000000000011503407405021172 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/EvaluatorBase.cs0000644000175000017500000002466511420634720024267 0ustar00rubenruben00000000000000// // EvaluatorBase.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Reflection; using System.Collections.Generic; using System.Collections.ObjectModel; namespace Hyena.SExpEngine { public delegate TreeNode SExpFunctionHandler(EvaluatorBase evaluator, TreeNode [] args); public delegate TreeNode SExpVariableResolutionHandler(TreeNode node); public class EvaluationException : ApplicationException { public EvaluationException(TreeNode node, string token, Exception inner) : base(String.Format( "Evaluation exception at token `{0} ({1})' [{2},{3}]", node.GetType(), token, node.Line, node.Column), inner) { } } public class UnknownVariableException : ApplicationException { public UnknownVariableException(string var) : base(var) { } } public class EvaluatorBase { private class MethodInfoContainer { public object Object; public MethodInfo MethodInfo; public bool EvaluateVariables; } private TreeNode expression; private TreeNode function_table_expression = new TreeNode(); private string input; private Dictionary functions = new Dictionary(); private List exceptions = new List(); public EvaluatorBase() { expression = function_table_expression; } public EvaluatorBase(TreeNode expression) { this.expression = expression; } public EvaluatorBase(string input) { expression = function_table_expression; this.input = input; } public void RegisterVariable(string name, string value) { expression.RegisterFunction(name, value); } public void RegisterVariable(string name, bool value) { expression.RegisterFunction(name, value); } public void RegisterVariable(string name, int value) { expression.RegisterFunction(name, value); } public void RegisterVariable(string name, double value) { expression.RegisterFunction(name, value); } public void RegisterVariable(string name, SExpVariableResolutionHandler value) { expression.RegisterFunction(name, value); } public void RegisterVariable(string name, TreeNode value) { expression.RegisterFunction(name, value); } public void RegisterFunction(SExpFunctionHandler handler, params string [] names) { foreach(string name in names) { if(functions.ContainsKey(name)) { functions.Remove(name); } functions.Add(name, handler); } } public void RegisterFunction(object o, MethodInfo method, string [] names) { RegisterFunction(o, method, names, true); } public void RegisterFunction(object o, MethodInfo method, string [] names, bool evaluateVariables) { MethodInfoContainer container = new MethodInfoContainer(); container.MethodInfo = method; container.Object = o; container.EvaluateVariables = evaluateVariables; foreach(string name in names) { if(functions.ContainsKey(name)) { functions.Remove(name); } functions.Add(name, container); } } public void RegisterFunctionSet(FunctionSet functionSet) { functionSet.Load(this); } public TreeNode EvaluateTree(TreeNode expression) { this.expression = expression; this.input = null; return Evaluate(); } public TreeNode EvaluateString(string input) { this.expression = null; this.input = input; return Evaluate(); } public TreeNode Evaluate() { exceptions.Clear(); try { if(expression == null) { Parser parser = new Parser(); expression = parser.Parse(input); expression.CopyFunctionsFrom(function_table_expression); } return Evaluate(expression); } catch(Exception e) { Exception next = e; do { if(next != null) { exceptions.Add(next); next = next.InnerException; } } while(next != null && next.InnerException != null); if(next != null) { exceptions.Add(next); } } return null; } public TreeNode Evaluate(TreeNode node) { if(!node.HasChildren || node is FunctionNode) { return EvaluateNode(node); } TreeNode final_result_node = new TreeNode(); foreach(TreeNode child_node in node.Children) { TreeNode result_node = EvaluateNode(child_node); if(result_node != null) { final_result_node.AddChild(result_node); } if(child_node is FunctionNode) { if(functions.ContainsKey((child_node as FunctionNode).Function)) { break; } FunctionNode impl = ResolveFunction(child_node as FunctionNode); if(impl != null && impl.RequiresArguments) { break; } } } return final_result_node.ChildCount == 1 ? final_result_node.Children[0] : final_result_node; } private TreeNode EvaluateNode(TreeNode node) { TreeNode result_node = null; if(node is FunctionNode) { try { result_node = EvaluateFunction(node as FunctionNode); } catch(Exception e) { Exception ee = e; if(e is TargetInvocationException) { ee = e.InnerException; } throw new EvaluationException(node, (node as FunctionNode).Function, ee); } } else if(node is LiteralNodeBase) { result_node = node; } else { result_node = Evaluate(node); } return result_node; } private TreeNode EvaluateFunction(FunctionNode node) { object handler = null; TreeNode parent = node.Parent; TreeNode [] args = null; if(!functions.ContainsKey(node.Function)) { handler = ResolveFunction(node); if(handler == null) { throw new InvalidFunctionException(node.Function); } } else { handler = functions[node.Function]; } if(parent.Children[0] == node) { args = new TreeNode[parent.ChildCount - 1]; for(int i = 0; i < args.Length; i++) { args[i] = parent.Children[i + 1]; if(handler is MethodInfoContainer && !(handler as MethodInfoContainer).EvaluateVariables) { continue; } } } if(handler is FunctionNode) { return (handler as FunctionNode).Evaluate(this, args); } else if(handler is SExpFunctionHandler) { return ((SExpFunctionHandler)handler)(this, args); } else if(handler is MethodInfoContainer) { MethodInfoContainer container = (MethodInfoContainer)handler; return (TreeNode)container.MethodInfo.Invoke(container.Object, new object [] { args }); } else { throw new InvalidFunctionException(String.Format( "Unknown runtime method handler type {1}", handler.GetType())); } } internal FunctionNode ResolveFunction(FunctionNode node) { TreeNode shift_node = node; do { if(shift_node.Functions.ContainsKey(node.Function)) { return shift_node.Functions[node.Function]; } shift_node = shift_node.Parent; } while(shift_node != null); return null; } public bool Success { get { return exceptions.Count == 0; } } public TreeNode ExpressionTree { get { return expression; } } public ReadOnlyCollection Exceptions { get { return new ReadOnlyCollection(exceptions); } } public string ErrorMessage { get { if(exceptions.Count == 0) { return null; } else if(exceptions.Count >= 2) { return String.Format("{0}: {1}", exceptions[exceptions.Count - 2].Message, exceptions[exceptions.Count - 1].Message); } return exceptions[0].Message; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/Evaluator.cs0000644000175000017500000000424711420634720023466 0ustar00rubenruben00000000000000// // Evaluator.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.SExpEngine { public class Evaluator : EvaluatorBase { public Evaluator() : base() { RegisterFunctions(); } public Evaluator(TreeNode expression) : base(expression) { RegisterFunctions(); } public Evaluator(string expression) : base(expression) { RegisterFunctions(); } private void RegisterFunctions() { RegisterFunctionSet(new ControlFunctionSet()); RegisterFunctionSet(new LogicFunctionSet()); RegisterFunctionSet(new FunctionFunctionSet()); RegisterFunctionSet(new CastFunctionSet()); RegisterFunctionSet(new CompareFunctionSet()); RegisterFunctionSet(new ArithmeticFunctionSet()); RegisterFunctionSet(new StringFunctionSet()); RegisterFunctionSet(new UtilityFunctionSet()); RegisterFunctionSet(new ListFunctionSet()); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/StringFunctionSet.cs0000644000175000017500000001403111420634720025144 0ustar00rubenruben00000000000000// // StringFunctionSet.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Text; using System.Text.RegularExpressions; namespace Hyena.SExpEngine { public class StringFunctionSet : FunctionSet { [Function("string-concat")] public virtual TreeNode OnConcatenateStrings(TreeNode [] args) { return ConcatenateStrings(Evaluator, args); } public static TreeNode ConcatenateStrings(EvaluatorBase evaluator, TreeNode [] args) { StringBuilder result = new StringBuilder(); foreach(TreeNode arg in args) { TreeNode eval_arg = evaluator.Evaluate(arg); if(!(eval_arg is VoidLiteral)) { result.Append(eval_arg); } } return new StringLiteral(result.ToString()); } private void CheckArgumentCount(TreeNode [] args, int expected) { CheckArgumentCount(args, expected, expected); } private void CheckArgumentCount(TreeNode [] args, int expected_min, int expected_max) { if(args.Length < expected_min || args.Length > expected_max) { throw new ArgumentException("expects " + expected_min + " <= args <= " + expected_max + " arguments"); } } private string GetArgumentString(TreeNode [] args, int index) { TreeNode node = Evaluate(args[index]); if(!(node is StringLiteral)) { throw new ArgumentException("argument " + index + " must be a string"); } return (node as StringLiteral).Value; } private int GetArgumentInteger(TreeNode [] args, int index) { TreeNode node = Evaluate(args[index]); if(!(node is IntLiteral)) { throw new ArgumentException("argument " + index + " must be an integer"); } return (node as IntLiteral).Value; } [Function("length")] public virtual TreeNode OnLength(TreeNode [] args) { CheckArgumentCount(args, 1); TreeNode node = Evaluate(args[0]); if(node is StringLiteral) { return new IntLiteral((node as StringLiteral).Value.Length); } else if(!(node is LiteralNodeBase) && !(node is FunctionNode)) { return new IntLiteral(node.ChildCount); } return new IntLiteral(0); } [Function("contains")] public virtual TreeNode OnContains(TreeNode [] args) { CheckArgumentCount(args, 2); return new BooleanLiteral(GetArgumentString(args, 0).Contains(GetArgumentString(args, 1))); } [Function("index-of")] public virtual TreeNode OnIndexOf(TreeNode [] args) { CheckArgumentCount(args, 2); return new IntLiteral(GetArgumentString(args, 0).IndexOf(GetArgumentString(args, 1))); } [Function("last-index-of")] public virtual TreeNode OnLastIndexOf(TreeNode [] args) { CheckArgumentCount(args, 2); return new IntLiteral(GetArgumentString(args, 0).LastIndexOf(GetArgumentString(args, 1))); } [Function("starts-with")] public virtual TreeNode OnStartsWith(TreeNode [] args) { CheckArgumentCount(args, 2); return new BooleanLiteral(GetArgumentString(args, 0).StartsWith(GetArgumentString(args, 1))); } [Function("ends-with")] public virtual TreeNode OnEndsWith(TreeNode [] args) { CheckArgumentCount(args, 2); return new BooleanLiteral(GetArgumentString(args, 0).EndsWith(GetArgumentString(args, 1))); } [Function("substring")] public virtual TreeNode OnSubstring(TreeNode [] args) { CheckArgumentCount(args, 2, 3); if(args.Length == 2) { return new StringLiteral(GetArgumentString(args, 0).Substring(GetArgumentInteger(args, 1))); } else { return new StringLiteral(GetArgumentString(args, 0).Substring( GetArgumentInteger(args, 1), GetArgumentInteger(args, 2))); } } [Function("split")] public virtual TreeNode OnSplit(TreeNode [] args) { CheckArgumentCount(args, 2); TreeNode result = new TreeNode(); string str = GetArgumentString(args, 0); string pattern = GetArgumentString(args, 1); foreach(string item in Regex.Split(str, pattern)) { result.AddChild(new StringLiteral(item)); } return result; } [Function("trim")] public virtual TreeNode OnTrim(TreeNode [] args) { CheckArgumentCount(args, 1); return new StringLiteral(GetArgumentString(args, 0).Trim()); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/Parser.cs0000644000175000017500000002012211420634720022746 0ustar00rubenruben00000000000000// // Parser.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Globalization; namespace Hyena.SExpEngine { public class ParserException : ApplicationException { public ParserException(string token, int line, int col, Exception inner) : base(String.Format( "Parser exception at token `{0}' [{1},{2}]: {3}", token, line, col, inner == null ? "Unknown error" : inner.Message), inner) { } } public class Parser { private static Regex number_regex = new Regex(@"^[-+]?(0x[\dA-Fa-f]+)?[\d]*\.?[\d]*([eE][-+]?[\d]+)?$"); private static System.Globalization.CultureInfo culture_info = new System.Globalization.CultureInfo("en-US"); private StreamReader reader; private bool debug; private StringBuilder current_token; private TreeNode root_node ; private TreeNode current_parent; private int scope; private int line; private int column; public Parser() { } public TreeNode Parse(string input) { return Parse(new MemoryStream(Encoding.UTF8.GetBytes(input))); } public TreeNode Parse(Stream stream) { return Parse(new StreamReader(stream)); } public TreeNode Parse(StreamReader reader) { this.reader = reader; current_token = new StringBuilder(); root_node = new TreeNode(); current_parent = root_node; scope = 0; line = 1; column = 0; try { Tokenize(); if(scope != 0) { throw new ApplicationException("Scope does pop back to zero"); } } catch(Exception e) { throw new ParserException(current_token.ToString(), line, column, e); } return root_node; } private void Tokenize() { bool in_string = false; bool in_comment = false; while(true) { int ich = reader.Read(); char ch = (char)ich; if(ich < 0) { break; } if(ch == '\n') { line++; column = 0; } else { column++; } if(in_comment) { if(ch == '\r' || ch == '\n') { in_comment = false; } continue; } switch(ch) { case '(': case ')': if(!in_string) { TokenPush(false); if(ch == '(') { ScopePush(); } else { ScopePop(); } } else { current_token.Append(ch); } break; case '"': if(in_string) { in_string = false; TokenPush(true); } else { in_string = true; } break; case '\\': if((char)reader.Peek() == '"') { current_token.Append((char)reader.Read()); } break; case ';': if(in_string) { current_token.Append(ch); } else { TokenPush(false); in_comment = true; } break; default: if(Char.IsWhiteSpace(ch)) { if(in_string) { current_token.Append(ch); } else { TokenPush(false); } } else { current_token.Append(ch); } break; } } TokenPush(false); reader.Close(); } private void ScopePush() { current_parent = new TreeNode(current_parent); scope++; } private void ScopePop() { current_parent = current_parent.Parent; scope--; } private void TokenPush(bool as_string) { if(current_token.Length == 0 && !as_string) { return; } TreeNode node = null; string token = current_token.ToString(); if(Debug) { Console.Write("{3}[{0}] TOKEN({4},{5}): [{2}{1}{2}]", scope, token, as_string ? "\"" : String.Empty, String.Empty.PadLeft(scope - 1, ' '), line, column - current_token.Length); } if(as_string) { node = new StringLiteral(token); } else if(token == "#t") { node = new BooleanLiteral(true); } else if(token == "#f") { node = new BooleanLiteral(false); } else if(token.Length > 0 && token != "." && token != "-" && token != "+" && number_regex.IsMatch(token)) { try { if(token.StartsWith("0x") || token.StartsWith("-0x")) { int offset = token[0] == '-' ? 3 : 2; int value = Int32.Parse(token.Substring(offset), NumberStyles.HexNumber, culture_info.NumberFormat); node = new IntLiteral(value * (offset == 3 ? -1 : 1)); } else if(token.Contains(".")) { node = new DoubleLiteral(Double.Parse(token, NumberStyles.Float, culture_info.NumberFormat)); } else { node = new IntLiteral(Int32.Parse(token, NumberStyles.Integer, culture_info.NumberFormat)); } } catch { throw new FormatException("Invalid number format: " + token); } } else { node = new FunctionNode(token); } if(Debug) { Console.WriteLine(" => [{0}]", node); } node.Line = line; node.Column = column; current_parent.AddChild(node); current_token.Remove(0, current_token.Length); } public bool Debug { get { return debug; } set { debug = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/ControlFunctionSet.cs0000644000175000017500000000711111420634720025317 0ustar00rubenruben00000000000000// // ControlFunctionSet.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.SExpEngine { public class ControlFunctionSet : FunctionSet { [Function("if")] public virtual TreeNode OnIf(TreeNode [] args) { if(args == null || args.Length < 2 || args.Length > 3) { throw new ArgumentException("if accepts 2 or 3 arguments"); } TreeNode arg = Evaluate(args[0]); if(!(arg is BooleanLiteral)) { throw new ArgumentException("first if argument must be boolean"); } BooleanLiteral conditional = (BooleanLiteral)arg; if(conditional.Value) { return Evaluate(args[1]); } else if(args.Length == 3) { return Evaluate(args[2]); } return new VoidLiteral(); } [Function("while")] public virtual TreeNode OnWhile(TreeNode [] args) { if(args == null || args.Length < 1 || args.Length > 2) { throw new ArgumentException("while accepts a condition and an expression or just an expression"); } while(true) { if(args.Length == 2) { TreeNode result = Evaluate(args[0]); if(!(result is BooleanLiteral)) { throw new ArgumentException("condition is not boolean"); } if(!(result as BooleanLiteral).Value) { break; } } try { Evaluate(args[args.Length - 1]); } catch(Exception e) { if(BreakHandler(e)) { break; } } } return new VoidLiteral(); } [Function("break")] public virtual TreeNode OnBreak(TreeNode [] args) { throw new BreakException(); } private class BreakException : Exception { public BreakException() { } } public static bool BreakHandler(Exception e) { Exception parent_e = e; while(parent_e != null) { if(parent_e is BreakException) { return true; } parent_e = parent_e.InnerException; } throw e; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/CompareFunctionSet.cs0000644000175000017500000001064711420634720025275 0ustar00rubenruben00000000000000// // CompareFunctionSet.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.SExpEngine { public class CompareFunctionSet : FunctionSet { [Function("compare-to")] public virtual TreeNode OnCompareTo(TreeNode [] args) { if(args.Length != 2) { throw new ArgumentException("must have two arguments"); } return Compare(Evaluator, args[0], args[1]); } public static TreeNode Compare(EvaluatorBase evaluator, TreeNode a, TreeNode b) { TreeNode arg_a = evaluator.Evaluate(a); TreeNode arg_b = evaluator.Evaluate(b); if(arg_a.GetType() != arg_b.GetType()) { throw new ArgumentException("arguments must be of the same type to compare"); } int result = 0; if(arg_a is IntLiteral) { result = (arg_a as IntLiteral).Value.CompareTo( (arg_b as IntLiteral).Value); } else if(arg_a is DoubleLiteral) { result = (arg_a as DoubleLiteral).Value.CompareTo( (arg_b as DoubleLiteral).Value); } else if(arg_a is StringLiteral) { result = (arg_a as StringLiteral).Value.CompareTo( (arg_b as StringLiteral).Value); } else if(arg_a is BooleanLiteral) { result = (arg_a as BooleanLiteral).Value.CompareTo( (arg_b as BooleanLiteral).Value); } else { throw new ArgumentException("invalid type for comparison"); } return new IntLiteral(result); } [Function("less-than", "<")] public virtual TreeNode OnCompareLessThan(TreeNode [] args) { IntLiteral result = (IntLiteral)OnCompareTo(args); return new BooleanLiteral(result.Value < 0); } [Function("greater-than", ">")] public virtual TreeNode OnCompareGreaterThan(TreeNode [] args) { IntLiteral result = (IntLiteral)OnCompareTo(args); return new BooleanLiteral(result.Value > 0); } [Function("equal", "=")] public virtual TreeNode OnCompareEqual(TreeNode [] args) { IntLiteral result = (IntLiteral)OnCompareTo(args); return new BooleanLiteral(result.Value == 0); } [Function("not-equal", "!=")] public virtual TreeNode OnCompareNotEqual(TreeNode [] args) { BooleanLiteral result = (BooleanLiteral)OnCompareEqual(args); return new BooleanLiteral(!result.Value); } [Function("less-than-or-equal", "<=")] public virtual TreeNode OnCompareLessThanOrEqual(TreeNode [] args) { BooleanLiteral a = (BooleanLiteral)OnCompareLessThan(args); BooleanLiteral b = (BooleanLiteral)OnCompareEqual(args); return new BooleanLiteral(a.Value || b.Value); } [Function("greater-than-or-equal", ">=")] public virtual TreeNode OnCompareGreaterThanOrEqual(TreeNode [] args) { BooleanLiteral a = (BooleanLiteral)OnCompareGreaterThan(args); BooleanLiteral b = (BooleanLiteral)OnCompareEqual(args); return new BooleanLiteral(a.Value || b.Value); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/ArithmeticFunctionSet.cs0000644000175000017500000001232511420634720025773 0ustar00rubenruben00000000000000// // ArithmeticFunctionSet.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.SExpEngine { public class ArithmeticFunctionSet : FunctionSet { public enum ArithmeticOperation { Add, Subtract, Multiply, Divide, Modulo } public virtual TreeNode OnPerformArithmetic(TreeNode [] args, ArithmeticOperation operation) { double result = 0.0; bool as_int = true; for(int i = 0; i < args.Length; i++) { TreeNode arg = Evaluate(args[i]); if(arg is IntLiteral || arg is DoubleLiteral) { double arg_value; if(arg is DoubleLiteral) { as_int = false; arg_value = (arg as DoubleLiteral).Value; } else { arg_value = (int)(arg as IntLiteral).Value; } if(i == 0) { result = arg_value; continue; } switch(operation) { case ArithmeticOperation.Add: result += arg_value; break; case ArithmeticOperation.Subtract: result -= arg_value; break; case ArithmeticOperation.Multiply: result *= arg_value; break; case ArithmeticOperation.Divide: result /= arg_value; break; case ArithmeticOperation.Modulo: if(!(arg is IntLiteral)) { throw new ArgumentException("Modulo requires int arguments"); } result %= (int)arg_value; break; } } else { throw new ArgumentException("arguments must be double or int"); } } return as_int ? ((TreeNode)new IntLiteral((int)result)) : ((TreeNode)new DoubleLiteral(result)); } [Function("add", "+")] public virtual TreeNode OnAdd(TreeNode [] args) { TreeNode first = Evaluate(args[0]); if(first is StringLiteral) { return StringFunctionSet.ConcatenateStrings(Evaluator, args); } return OnPerformArithmetic(args, ArithmeticOperation.Add); } [Function("sub", "-")] public virtual TreeNode OnSubtract(TreeNode [] args) { return OnPerformArithmetic(args, ArithmeticOperation.Subtract); } [Function("mul", "*")] public virtual TreeNode OnMultiply(TreeNode [] args) { return OnPerformArithmetic(args, ArithmeticOperation.Multiply); } [Function("div", "/")] public virtual TreeNode OnDivide(TreeNode [] args) { return OnPerformArithmetic(args, ArithmeticOperation.Divide); } [Function("mod", "%")] public virtual TreeNode OnModulo(TreeNode [] args) { return OnPerformArithmetic(args, ArithmeticOperation.Modulo); } [Function("++")] public virtual TreeNode OnIncrement(TreeNode [] args) { return IntegerUpdate(args, 1); } [Function("--")] public virtual TreeNode OnDecrement(TreeNode [] args) { return IntegerUpdate(args, -1); } private TreeNode IntegerUpdate(TreeNode [] args, int value) { TreeNode variable_node = (FunctionNode)args[0]; TreeNode result = Evaluate(variable_node); TreeNode new_result = new IntLiteral(((IntLiteral)result).Value + value); FunctionFunctionSet.VariableSet(Evaluator, args[0], new_result); return new_result; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/ListFunctionSet.cs0000644000175000017500000001335411420634720024620 0ustar00rubenruben00000000000000// // ListFunctionSet.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.SExpEngine { public class ListFunctionSet : FunctionSet { // FIXME: Why is this here? --Aaron // // private TreeNode EvaluateList(TreeNode node) // { // TreeNode list = new TreeNode(); // // foreach(TreeNode child in node.Children) { // list.AddChild(Evaluate(child)); // } // // return list; // } private bool IsList(TreeNode node) { return !(node is LiteralNodeBase) && !(node is FunctionNode); } public void CheckList(TreeNode node) { if(!IsList(node)) { throw new ArgumentException("argument must be a list"); } } [Function("is-list")] public virtual TreeNode OnIsList(TreeNode [] args) { return new BooleanLiteral(IsList(args[0])); } [Function("item-at")] public virtual TreeNode OnItemAt(TreeNode [] args) { TreeNode list = Evaluate(args[0]); CheckList(list); TreeNode node = Evaluate(args[1]); int index = 0; if(!(node is IntLiteral)) { throw new ArgumentException("argument must be an index"); } index = (node as IntLiteral).Value; return Evaluate(list.Children[index]); } [Function("remove-at")] public virtual TreeNode OnRemoveAt(TreeNode [] args) { TreeNode list = Evaluate(args[0]); CheckList(list); TreeNode node = Evaluate(args[1]); int index = 0; if(!(node is IntLiteral)) { throw new ArgumentException("argument must be an index"); } index = (node as IntLiteral).Value; list.Children.RemoveAt(index); return list; } [Function("remove")] public virtual TreeNode OnRemove(TreeNode [] args) { TreeNode list = Evaluate(args[0]); CheckList(list); TreeNode node = Evaluate(args[1]); foreach(TreeNode compare_node in list.Children) { if(((IntLiteral)CompareFunctionSet.Compare(Evaluator, node, compare_node)).Value == 0) { list.Children.Remove(compare_node); break; } } return list; } [Function("append")] public virtual TreeNode OnAppend(TreeNode [] args) { TreeNode list = Evaluate(args[0]); CheckList(list); list.Children.Add(Evaluate(args[1])); return list; } [Function("prepend")] public virtual TreeNode OnPrepend(TreeNode [] args) { TreeNode list = Evaluate(args[0]); CheckList(list); list.Children.Insert(0, Evaluate(args[1])); return list; } [Function("insert")] public virtual TreeNode OnInsert(TreeNode [] args) { TreeNode list = Evaluate(args[0]); CheckList(list); TreeNode node = Evaluate(args[1]); int index = 0; if(!(node is IntLiteral)) { throw new ArgumentException("argument must be an index"); } index = (node as IntLiteral).Value; list.Children.Insert(index, Evaluate(args[2])); return list; } [Function("foreach")] public virtual TreeNode OnForeach(TreeNode [] args) { TreeNode list = Evaluate(args[1]); CheckList(list); FunctionNode item_variable = (FunctionNode)args[0]; TreeNode function = args[2]; TreeNode self = args[0].Parent.Children[0]; self.Parent.RegisterFunction(item_variable.Function, item_variable); foreach(TreeNode child in list.Children) { item_variable.Body = child; try { if(function is FunctionNode) { FunctionNode function_impl = Evaluator.ResolveFunction(function as FunctionNode); function_impl.Evaluate(Evaluator, new TreeNode [] { child }); } else { Evaluate(function); } } catch(Exception e) { if(ControlFunctionSet.BreakHandler(e)) { break; } } } return new VoidLiteral(); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/CastFunctionSet.cs0000644000175000017500000000626111420634720024576 0ustar00rubenruben00000000000000// // CastFunctionSet.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.SExpEngine { public class CastFunctionSet : FunctionSet { [Function("cast-double")] public virtual TreeNode OnCastDouble(TreeNode [] args) { if(args.Length != 1) { throw new ArgumentException("cast must have only one argument"); } TreeNode arg = Evaluate(args[0]); if(arg is DoubleLiteral) { return arg; } else if(arg is IntLiteral) { return new DoubleLiteral((int)(arg as IntLiteral).Value); } else if(arg is StringLiteral) { return new DoubleLiteral(Convert.ToDouble((arg as StringLiteral).Value)); } throw new ArgumentException("can only cast double, int, or string literals"); } [Function("cast-int")] public virtual TreeNode OnCastInt(TreeNode [] args) { DoubleLiteral result = (DoubleLiteral)OnCastDouble(args); return new IntLiteral((int)result.Value); } [Function("cast-bool")] public virtual TreeNode OnCastBool(TreeNode [] args) { DoubleLiteral result = (DoubleLiteral)OnCastDouble(args); return new BooleanLiteral((int)result.Value != 0); } [Function("cast-string")] public virtual TreeNode OnCastString(TreeNode [] args) { if(args.Length != 1) { throw new ArgumentException("cast must have only one argument"); } TreeNode arg = Evaluate(args[0]); if(arg is DoubleLiteral) { return new StringLiteral(Convert.ToString((arg as DoubleLiteral).Value)); } else if(arg is IntLiteral) { return new StringLiteral(Convert.ToString((arg as IntLiteral).Value)); } else if(arg is StringLiteral) { return arg; } throw new ArgumentException("can only cast double, int, or string literals"); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/LogicFunctionSet.cs0000644000175000017500000000565011420634720024742 0ustar00rubenruben00000000000000// // LogicFunctionSet.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.SExpEngine { public class LogicFunctionSet : FunctionSet { [Function("not", "!")] public virtual TreeNode OnNot(TreeNode [] args) { if(args.Length != 1) { throw new ArgumentException("not must have only one argument"); } TreeNode arg = Evaluate(args[0]); if(!(arg is BooleanLiteral)) { throw new ArgumentException("can only not a boolean"); } return new BooleanLiteral(!(arg as BooleanLiteral).Value); } [Function("or", "|")] public virtual TreeNode OnOr(TreeNode [] args) { return OnAndOr(args, false); } [Function("and", "|")] public virtual TreeNode OnAnd(TreeNode [] args) { return OnAndOr(args, true); } private TreeNode OnAndOr(TreeNode [] args, bool and) { if(args.Length < 2) { throw new ArgumentException("must have two or more boolean arguments"); } bool result = false; for(int i = 0; i < args.Length; i++) { TreeNode node = Evaluate(args[i]); if(!(node is BooleanLiteral)) { throw new ArgumentException("arguments must be boolean"); } BooleanLiteral arg = (BooleanLiteral)node; if(i == 0) { result = arg.Value; continue; } if(and) { result &= arg.Value; } else { result |= arg.Value; } } return new BooleanLiteral(result); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/FunctionNode.cs0000644000175000017500000000772711420634720024125 0ustar00rubenruben00000000000000// // FunctionNode.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; namespace Hyena.SExpEngine { public class InvalidFunctionException : Exception { public InvalidFunctionException(string message) : base(message) { } } public class FunctionNode : TreeNode { private string function; private object body; public FunctionNode(string function) { this.function = function; } public FunctionNode(string function, object body) { this.function = function; this.body = body; } public TreeNode Evaluate(EvaluatorBase evaluator, TreeNode [] args) { if(args != null && args.Length != FunctionCount && RequiresArguments) { throw new ArgumentException("Function " + function + " takes " + FunctionCount + " arguments, not " + args.Length); } if(args != null && RequiresArguments) { int i = 0; string [] names = new string[args.Length]; foreach(KeyValuePair var in Functions) { names[i++] = var.Key; } for(i = 0; i < args.Length; i++) { (body as TreeNode).RegisterFunction(names[i], evaluator.Evaluate(args[i])); } } return evaluator.Evaluate(ResolveBody(evaluator)); } private TreeNode ResolveBody(EvaluatorBase evaluator) { if(body == null) { throw new UnknownVariableException(Function); } if(body is string) { return new StringLiteral((string)body); } else if(body is double) { return new DoubleLiteral((double)body); } else if(body is int) { return new IntLiteral((int)body); } else if(body is bool) { return new BooleanLiteral((bool)body); } else if(body is SExpVariableResolutionHandler) { return ((SExpVariableResolutionHandler)body)(this); } else if(body is TreeNode) { return evaluator.Evaluate((TreeNode)body); } throw new UnknownVariableException(String.Format( "Unknown function type `{0}' for function `{1}'", body.GetType(), Function)); } public override string ToString() { return Function; } internal object Body { get { return body; } set { body = value; } } internal bool RequiresArguments { get { return FunctionCount > 0 && body is TreeNode; } } public string Function { get { return function; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/UtilityFunctionSet.cs0000644000175000017500000000427511420634720025352 0ustar00rubenruben00000000000000// // UtilityFunctionSet.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.SExpEngine { public class UtilityFunctionSet : FunctionSet { [Function("print")] public virtual TreeNode OnPrint(TreeNode [] args) { if(args.Length != 1) { throw new ArgumentException("print must have only one argument"); } Console.WriteLine(Evaluate(args[0])); return new VoidLiteral(); } [Function("print-type")] public virtual TreeNode OnPrintType(TreeNode [] args) { if(args.Length != 1) { throw new ArgumentException("print-type must have only one argument"); } Console.WriteLine(Evaluate(args[0]).GetType()); return new VoidLiteral(); } [Function("dump")] public virtual TreeNode OnDump(TreeNode [] args) { foreach(TreeNode arg in args) { Evaluate(arg).Dump(); } return new VoidLiteral(); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/FunctionSet.cs0000644000175000017500000000604411420634720023762 0ustar00rubenruben00000000000000// // FunctionSet.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Reflection; namespace Hyena.SExpEngine { [AttributeUsage(AttributeTargets.Method)] public class FunctionAttribute : Attribute { private string [] names; private bool evaluate_variables; public FunctionAttribute(params string [] names) { this.evaluate_variables = true; this.names = names; } public FunctionAttribute(bool evaluateVariables, params string [] names) { this.evaluate_variables = evaluateVariables; this.names = names; } public string [] Names { get { return names; } } public bool EvaluateVariables { get { return evaluate_variables; } } } public abstract class FunctionSet { private EvaluatorBase evaluator; public void Load(EvaluatorBase evaluator) { this.evaluator = evaluator; foreach(MethodInfo method in GetType().GetMethods()) { string [] names = null; bool evaluate_variables = true; foreach(Attribute attr in method.GetCustomAttributes(false)) { if(attr is FunctionAttribute) { names = (attr as FunctionAttribute).Names; evaluate_variables = (attr as FunctionAttribute).EvaluateVariables; break; } } if(names == null || names.Length == 0) { continue; } evaluator.RegisterFunction(this, method, names, evaluate_variables); } } public TreeNode Evaluate(TreeNode node) { return evaluator.Evaluate(node); } protected EvaluatorBase Evaluator { get { return evaluator; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/Literals.cs0000644000175000017500000000573011420634720023301 0ustar00rubenruben00000000000000// // Literals.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.SExpEngine { public class LiteralNodeBase : TreeNode { private Type type = null; public Type EnclosedType { get { return type ?? GetType(); } set { type = value; } } } public class LiteralNode : LiteralNodeBase { private T value; public LiteralNode(T value) { this.value = value; EnclosedType = typeof(T); } public override string ToString() { return Value.ToString(); } public T Value { get { return value; } } } // Literal Types public class VoidLiteral : LiteralNodeBase { public override string ToString() { return "void"; } } public class DoubleLiteral : LiteralNode { private static System.Globalization.CultureInfo culture_info = new System.Globalization.CultureInfo("en-US"); public DoubleLiteral(double value) : base(value) { } public override string ToString() { return (Value - (int)Value) == 0.0 ? String.Format("{0}.0", Value.ToString(culture_info)) : Value.ToString(culture_info); } } public class BooleanLiteral : LiteralNode { public BooleanLiteral(bool value) : base(value) { } public override string ToString() { return Value ? "true" : "false"; } } public class IntLiteral : LiteralNode { public IntLiteral(int value) : base(value) { } } public class StringLiteral : LiteralNode { public StringLiteral(string value) : base(value) { } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/TreeNode.cs0000644000175000017500000001326111420634720023225 0ustar00rubenruben00000000000000// // TreeNode.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.Collections.ObjectModel; namespace Hyena.SExpEngine { public class TreeNode { private List children = new List(); private Dictionary functions = new Dictionary(); private TreeNode parent; private int column; private int line; public TreeNode() { } public TreeNode(TreeNode parent) { this.parent = parent; parent.AddChild(this); } internal void CopyFunctionsFrom(TreeNode node) { foreach(KeyValuePair function in node.Functions) { RegisterFunction(function.Key, function.Value); } } internal void RegisterFunction(string name, object value) { if(functions.ContainsKey(name)) { functions[name] = new FunctionNode(name, value); } else { functions.Add(name, new FunctionNode(name, value)); } } internal void RegisterFunction(string name, FunctionNode function) { if(functions.ContainsKey(name)) { functions[name] = function; } else { functions.Add(name, function); } } public TreeNode Flatten() { TreeNode result_node = new TreeNode(); Flatten(result_node, this); return result_node.ChildCount == 1 ? result_node.Children[0] : result_node; } private void Flatten(TreeNode result_node, TreeNode node) { if(node == null) { return; } if(!node.HasChildren && !(node is VoidLiteral)) { result_node.AddChild(node); return; } foreach(TreeNode child_node in node.Children) { Flatten(result_node, child_node); } } public void AddChild(TreeNode child) { child.Parent = this; children.Add(child); } public TreeNode Parent { get { return parent; } set { parent = value; } } public int ChildCount { get { return children.Count; } } public bool HasChildren { get { return ChildCount > 0; } } public int Line { get { return line; } set { line = value; } } public int Column { get { return column; } set { column = value; } } public List Children { get { return children; } } public IDictionary Functions { get { return functions; } } public int FunctionCount { get { return functions.Count; } } public bool Empty { get { return ChildCount == 0 && !(this is LiteralNodeBase) && !(this is FunctionNode); } } public void Dump() { DumpTree(this); } public TreeNode FindRootNode() { TreeNode shift_node = this; while(shift_node.Parent != null) { shift_node = shift_node.Parent; } return shift_node; } public static void DumpTree(TreeNode node) { DumpTree(node, 0); } private static void DumpTree(TreeNode node, int depth) { if(node is LiteralNodeBase || node is FunctionNode) { PrintIndent(depth, node); } else if(node != null) { int i = 0; Console.Write("{0}+ [", String.Empty.PadLeft(depth * 2, ' ')); foreach(KeyValuePair function in node.Functions) { Console.Write("{0}{1}", function.Key, i++ < node.FunctionCount - 1 ? ", " : String.Empty); } Console.WriteLine("]"); foreach(TreeNode child in node.Children) { DumpTree(child, depth + 1); } } } private static void PrintIndent(int depth, TreeNode node) { Console.Write(String.Empty.PadLeft(depth * 2, ' ')); if(node is FunctionNode) { Console.WriteLine((node as FunctionNode).Function); } else { Console.WriteLine(node); } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.SExpEngine/FunctionFunctionSet.cs0000644000175000017500000000722611420634720025473 0ustar00rubenruben00000000000000// // FunctionFunctionSet.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.SExpEngine { public class FunctionFunctionSet : FunctionSet { [Function(false, "set")] public virtual TreeNode OnSet(TreeNode [] args) { return VariableSet(Evaluator, args, true); } public static TreeNode VariableSet(EvaluatorBase evaluator, TreeNode var, TreeNode value) { return VariableSet(evaluator, new TreeNode[] { var, value }, true); } public static TreeNode VariableSet(EvaluatorBase evaluator, TreeNode [] args, bool update) { if(args.Length != 2) { throw new ArgumentException("must have two arguments"); } if(!(args[0] is FunctionNode)) { throw new ArgumentException("first argument must be a variable"); } FunctionNode variable_node = evaluator.ResolveFunction(args[0] as FunctionNode); if(variable_node != null) { variable_node.Body = evaluator.Evaluate(args[1]); } else { TreeNode parent = args[0].Parent; parent = parent.Parent ?? parent; parent.RegisterFunction((args[0] as FunctionNode).Function, evaluator.Evaluate(args[1])); } return new VoidLiteral(); } [Function(false, "define")] public virtual TreeNode OnDefine(TreeNode [] args) { if(args.Length < 2 || args.Length > 3) { throw new ArgumentException("define must have two or three arguments"); } if(!(args[0] is FunctionNode)) { throw new ArgumentException("first define argument must be a variable"); } FunctionNode function = new FunctionNode((args[0] as FunctionNode).Function, args[args.Length - 1]); if(args.Length == 3 && args[1].HasChildren) { foreach(TreeNode function_arg in args[1].Children) { if(!(function_arg is FunctionNode)) { throw new ArgumentException("define function arguments must be variable tokens"); } function.RegisterFunction((function_arg as FunctionNode).Function, new VoidLiteral()); } } TreeNode parent = args[0].Parent; parent = parent.Parent ?? parent; parent.RegisterFunction(function.Function, function); return new VoidLiteral(); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/0000777000175000017500000000000011503407405020272 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/AliasedObjectSet.cs0000644000175000017500000000707611420634720023774 0ustar00rubenruben00000000000000// // AliasedObjectSet.cs // // Authors: // Gabriel Burt // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Text; using System.Collections; using System.Collections.Generic; namespace Hyena.Query { public interface IAliasedObject { string Name { get; } string [] Aliases { get; } } public class AliasedObjectSet : IEnumerable where T : IAliasedObject { protected Dictionary map = new Dictionary (); protected List aliases = new List (); protected T [] objects; public AliasedObjectSet (params T [] objects) { this.objects = objects; foreach (T obj in objects) { map [obj.Name.ToLower ()] = obj; foreach (string alias in obj.Aliases) { if (!String.IsNullOrEmpty (alias) && alias.IndexOf (" ") == -1) { foreach (string sub_alias in alias.Split(',')) { string lower_alias = sub_alias.ToLower (); map [lower_alias] = obj; if (!aliases.Contains (lower_alias)) { aliases.Add (lower_alias); } } } } } aliases.Sort (SortByLongest); } private int SortByLongest (string a, string b) { return b.Length.CompareTo (a.Length); } public string FindAlias (string input) { input = input.ToLower (); foreach (string alias in aliases) { if (input.StartsWith (alias)) { return alias; } } return null; } public T [] Objects { get { return objects; } } public T First { get { return objects [0]; } } public IEnumerator GetEnumerator () { foreach (T o in objects) { yield return o; } } IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator (); } public T this [string alias] { get { if (!String.IsNullOrEmpty (alias) && map.ContainsKey (alias.ToLower ())) return map[alias.ToLower ()]; return default(T); } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/QueryToken.cs0000644000175000017500000000453611420634720022733 0ustar00rubenruben00000000000000// // QueryToken.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Query { public enum TokenID { Unknown, OpenParen, CloseParen, Not, Or, And, Range, Term } public class QueryToken { private TokenID id; private int line; private int column; private string term; public QueryToken() { } public QueryToken(string term) { this.id = TokenID.Term; this.term = term; } public QueryToken(TokenID id) { this.id = id; } public QueryToken(TokenID id, int line, int column) { this.id = id; this.line = line; this.column = column; } public TokenID ID { get { return id; } set { id = value; } } public int Line { get { return line; } set { line = value; } } public int Column { get { return column; } set { column = value; } } public string Term { get { return term; } set { term = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/IntegerQueryValue.cs0000644000175000017500000000736111420634720024244 0ustar00rubenruben00000000000000// // IntegerQueryValue.cs // // Authors: // Gabriel Burt // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Xml; using System.Text; using Mono.Unix; using Hyena; namespace Hyena.Query { public class IntegerQueryValue : QueryValue { public static readonly Operator Equal = new Operator ("equals", Catalog.GetString ("is"), "= {0}", "=", "==", ":"); public static readonly Operator NotEqual = new Operator ("notEqual", Catalog.GetString ("is not"), "!= {0}", true, "!=", "!:"); public static readonly Operator LessThanEqual = new Operator ("lessThanEquals", Catalog.GetString ("at most"), "<= {0}", "<="); public static readonly Operator GreaterThanEqual = new Operator ("greaterThanEquals", Catalog.GetString ("at least"), ">= {0}", ">="); public static readonly Operator LessThan = new Operator ("lessThan", Catalog.GetString ("less than"), "< {0}", "<"); public static readonly Operator GreaterThan = new Operator ("greaterThan", Catalog.GetString ("more than"), "> {0}", ">"); protected long value; public override string XmlElementName { get { return "int"; } } public override void ParseUserQuery (string input) { IsEmpty = !Int64.TryParse (input, out value); } public override void LoadString (string input) { ParseUserQuery (input); } public override void ParseXml (XmlElement node) { ParseUserQuery (node.InnerText); } public void SetValue (int value) { SetValue ((long) value); } public virtual void SetValue (long value) { this.value = value; IsEmpty = false; } protected static AliasedObjectSet operators = new AliasedObjectSet (Equal, NotEqual, LessThan, GreaterThan, LessThanEqual, GreaterThanEqual); public override AliasedObjectSet OperatorSet { get { return operators; } } public override object Value { get { return value; } } public long IntValue { get { return value; } } public virtual long DefaultValue { get { return 0; } } public virtual long MinValue { get { return Int64.MinValue; } } public virtual long MaxValue { get { return Int64.MaxValue; } } public override string ToSql (Operator op) { return Convert.ToString (value, System.Globalization.CultureInfo.InvariantCulture); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/QueryOperator.cs0000644000175000017500000000504011420634720023435 0ustar00rubenruben00000000000000// // QueryOperator.cs // // Author: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Xml; using System.Text; using System.Collections.Generic; namespace Hyena.Query { public class Operator : IAliasedObject { public string name; public string Name { get { return name; } } public string label; public string Label { get { return label ?? Name; } set { label = value; } } private string [] aliases; public string [] Aliases { get { return aliases; } } public string PrimaryAlias { get { return aliases [0]; } } private string sql_format; public string SqlFormat { get { return sql_format; } } // FIXME get rid of this private bool is_not; public bool IsNot { get { return is_not; } } internal Operator (string name, string label, string sql_format, params string [] userOps) : this (name, label, sql_format, false, userOps) { } internal Operator (string name, string label, string sql_format, bool is_not, params string [] userOps) { this.name = name; this.label = label; this.sql_format = sql_format; this.aliases = userOps; this.is_not = is_not; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/QueryOrder.cs0000644000175000017500000000423311420634720022720 0ustar00rubenruben00000000000000// // QueryOrder.cs // // Authors: // Gabriel Burt // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Text; using System.Collections.Generic; namespace Hyena.Query { public class QueryOrder { private string name; public string Name { get { return name; } } private string label; public string Label { get { return label; } set { label = value; } } private string order_sql; public string OrderSql { get { return order_sql; } } private QueryField field; public QueryField Field { get { return field; } } public QueryOrder (string name, string label, string order_sql, QueryField field) { this.name = name; this.label = label; this.order_sql = order_sql; this.field = field; } public string ToSql () { return String.Format ("ORDER BY {0}", order_sql); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/FileSizeQueryValue.cs0000644000175000017500000001144311420634720024355 0ustar00rubenruben00000000000000// // FileSizeQueryValue.cs // // Authors: // Gabriel Burt // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Xml; using System.Text; using Hyena; namespace Hyena.Query { public enum FileSizeFactor : long { None = 1, KB = 1024, MB = 1048576, GB = 1073741824, TB = 1099511627776, PB = 1125899906842624 } public class FileSizeQueryValue : IntegerQueryValue { private FileSizeFactor factor = FileSizeFactor.None; public FileSizeFactor Factor { get { return factor; } } public FileSizeQueryValue () { } public FileSizeQueryValue (long bytes) { value = bytes; IsEmpty = false; DetermineFactor (); } public double FactoredValue { get { return (double)value / (double)factor; } } public override void ParseUserQuery (string input) { if (input.Length > 1 && (input[input.Length - 1] == 'b' || input[input.Length - 1] == 'B')) { input = input.Substring (0, input.Length - 1); } double double_value; IsEmpty = !Double.TryParse (input, out double_value); if (IsEmpty && input.Length > 1) { IsEmpty = !Double.TryParse (input.Substring (0, input.Length - 1), out double_value); } if (!IsEmpty) { switch (input[input.Length - 1]) { case 'k': case 'K': factor = FileSizeFactor.KB; break; case 'm': case 'M': factor = FileSizeFactor.MB; break; case 'g': case 'G': factor = FileSizeFactor.GB; break; case 't': case 'T': factor = FileSizeFactor.TB; break; case 'p': case 'P': factor = FileSizeFactor.PB; break; default : factor = FileSizeFactor.None; break; } value = (long)((double)factor * double_value); } } public override void ParseXml (XmlElement node) { base.ParseUserQuery (node.InnerText); if (node.HasAttribute ("factor")) { this.factor = (FileSizeFactor) Enum.Parse (typeof(FileSizeFactor), node.GetAttribute ("factor")); } else { DetermineFactor (); } } public override void AppendXml (XmlElement node) { base.AppendXml (node); node.SetAttribute ("factor", factor.ToString ()); } public void SetValue (double value, FileSizeFactor factor) { this.value = (long)(value * (double)factor); this.factor = factor; IsEmpty = false; } protected void DetermineFactor () { if (!IsEmpty && value != 0) { foreach (FileSizeFactor factor in Enum.GetValues (typeof(FileSizeFactor))) { if (value >= (double)factor) { this.factor = factor; } } } } public override string ToUserQuery () { return ToUserQuery (false); } public string ToUserQuery (bool always_decimal) { if (factor != FileSizeFactor.None) { return String.Format ("{0} {1}", IntValue == 0 ? "0" : StringUtil.DoubleToTenthsPrecision (((double)IntValue / (double)factor), always_decimal), factor.ToString () ); } else { return base.ToUserQuery (); } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/ExactUriStringQueryValue.cs0000644000175000017500000000267411420634720025564 0ustar00rubenruben00000000000000// // ExactUriStringQueryValue.cs // // Authors: // Andrés G. Aragoneses // // Copyright (C) 2010 Andrés G. Aragoneses // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Query { public class ExactUriStringQueryValue : ExactStringQueryValue { protected override string StringValue { get { return Uri.EscapeUriString (base.StringValue); } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/QueryField.cs0000644000175000017500000001445311420634720022675 0ustar00rubenruben00000000000000// // QueryField.cs // // Authors: // Gabriel Burt // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Text; using System.Collections.Generic; namespace Hyena.Query { public class QueryField : IAliasedObject { private bool no_custom_format; private bool column_lowered; private Type [] value_types; public Type [] ValueTypes { get { return value_types; } } private string name; public string Name { get { return name; } set { name = value; } } private string property_name; public string PropertyName { get { return property_name; } set { property_name = value; } } private string label; public string Label { get { return label; } set { label = value; } } private string short_label; public string ShortLabel { get { return short_label ?? label; } set { short_label = value; } } private string [] aliases; public string [] Aliases { get { return aliases; } } public string PrimaryAlias { get { return aliases[0]; } } private string column; public string Column { get { return column; } } private bool is_default; public bool IsDefault { get { return is_default; } } public QueryField (string name, string propertyName, string label, string column, params string [] aliases) : this (name, propertyName, label, column, false, aliases) { } public QueryField (string name, string propertyName, string label, string column, bool isDefault, params string [] aliases) : this (name, propertyName, label, column, new Type [] {typeof(StringQueryValue)}, isDefault, aliases) { } public QueryField (string name, string propertyName, string label, string column, Type valueType, params string [] aliases) : this (name, propertyName, label, column, new Type [] {valueType}, false, aliases) { } public QueryField (string name, string propertyName, string label, string column, Type [] valueTypes, params string [] aliases) : this (name, propertyName, label, column, valueTypes, false, aliases) { } public QueryField (string name, string propertyName, string label, string column, Type [] valueTypes, bool isDefault, params string [] aliases) { this.name = name; this.property_name = propertyName; this.label = label; this.column = column; this.value_types = valueTypes; this.is_default = isDefault; this.aliases = aliases; this.no_custom_format = (Column.IndexOf ("{0}") == -1 && Column.IndexOf ("{1}") == -1); this.column_lowered = (Column.IndexOf ("Lowered") != -1); if (!no_custom_format) { // Ensure we have parens around any custom 'columns' that may be an OR of two columns this.column = String.Format ("({0})", this.column); } foreach (Type value_type in valueTypes) { QueryValue.AddValueType (value_type); } } public IEnumerable CreateQueryValues () { foreach (Type type in ValueTypes) { yield return Activator.CreateInstance (type) as QueryValue; } } public string ToTermString (string op, string value) { return ToTermString (PrimaryAlias, op, value); } public string ToSql (Operator op, QueryValue qv) { string value = qv.ToSql (op) ?? String.Empty; if (op == null) op = qv.OperatorSet.First; StringBuilder sb = new StringBuilder (); if (no_custom_format) { string column_with_key = Column; if (qv is StringQueryValue && !(column_lowered || qv is ExactStringQueryValue)) { column_with_key = String.Format ("HYENA_SEARCH_KEY({0})", Column); } sb.AppendFormat ("{0} {1}", column_with_key, String.Format (op.SqlFormat, value)); if (op.IsNot) { return String.Format ("({0} OR {1} IS NULL)", sb.ToString (), Column); } else { return String.Format ("({0} AND {1} IS NOT NULL)", sb.ToString (), Column); } } else { sb.AppendFormat ( Column, String.Format (op.SqlFormat, value), value, op.IsNot ? "NOT" : null ); } return sb.ToString (); } public static string ToTermString (string alias, string op, string value) { value = String.Format ( "{1}{0}{1}", value, value.IndexOf (" ") == -1 ? String.Empty : "\"" ); return String.IsNullOrEmpty (alias) ? value : String.Format ("{0}{1}{2}", alias, op, value); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/QueryParser.cs0000644000175000017500000000377311420634720023111 0ustar00rubenruben00000000000000// // QueryParser.cs // // Author: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.IO; using System.Text; namespace Hyena.Query { public abstract class QueryParser { protected StreamReader reader; public QueryParser() { Reset (); } public QueryParser(string inputQuery) : this(new MemoryStream(Encoding.UTF8.GetBytes(inputQuery))) { } public QueryParser(Stream stream) : this(new StreamReader(stream)) { } public QueryParser(StreamReader reader) : this() { InputReader = reader; } public abstract QueryNode BuildTree (QueryFieldSet fieldSet); public abstract void Reset (); public StreamReader InputReader { get { return reader; } set { reader = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/QueryTermNode.cs0000644000175000017500000001257211420634720023367 0ustar00rubenruben00000000000000// // QueryTermNode.cs // // Author: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Xml; using System.Text; using System.Collections.Generic; namespace Hyena.Query { public class QueryTermNode : QueryNode { private QueryField field; private Operator op; private QueryValue qvalue; public static QueryTermNode ParseUserQuery (QueryFieldSet field_set, string token) { QueryTermNode term = new QueryTermNode (); // See if the query specifies a field, and if so, pull out the operator as well string field_alias = field_set.FindAlias (token); if (field_alias != null) { term.Field = field_set [field_alias]; string token_without_field = token.Substring (field_alias.Length); foreach (QueryValue val in term.Field.CreateQueryValues ()) { term.Value = val; string op_alias = term.Value.OperatorSet.FindAlias (token_without_field); if (op_alias != null) { term.Operator = term.Value.OperatorSet [op_alias]; int field_separator = token.IndexOf (op_alias); string temp = token.Substring (field_separator + op_alias.Length); term.Value.ParseUserQuery (temp); if (!term.Value.IsEmpty) { break; } } term.Operator = null; term.Value = null; } } if (term.Value == null) { term.Field = null; term.Value = QueryValue.CreateFromUserQuery (token, term.Field); term.Operator = StringQueryValue.Contains; } return term; } public QueryTermNode () : base () { } public override QueryNode Trim () { if (Parent != null && (qvalue == null || qvalue.IsEmpty || (field != null && op == null))) { Parent.RemoveChild (this); } return this; } public override void AppendUserQuery (StringBuilder sb) { sb.Append (Field == null ? Value.ToUserQuery () : Field.ToTermString (Operator.PrimaryAlias, Value.ToUserQuery ())); } public override void AppendXml (XmlDocument doc, XmlNode parent, QueryFieldSet fieldSet) { XmlElement op_node = doc.CreateElement (op == null ? "contains" : op.Name); parent.AppendChild (op_node); QueryField field = Field; if (field != null) { XmlElement field_node = doc.CreateElement ("field"); field_node.SetAttribute ("name", field.Name); op_node.AppendChild (field_node); } XmlElement val_node = doc.CreateElement (Value.XmlElementName); Value.AppendXml (val_node); op_node.AppendChild (val_node); } public override void AppendSql (StringBuilder sb, QueryFieldSet fieldSet) { if (Field == null) { sb.Append ("("); int emitted = 0; foreach (QueryField field in fieldSet.Fields) { if (field.IsDefault) if (EmitTermMatch (sb, field, emitted > 0)) emitted++; } sb.Append (")"); } else { EmitTermMatch (sb, Field, false); } } private bool EmitTermMatch (StringBuilder sb, QueryField field, bool emit_or) { if (Value.IsEmpty) { return false; } if (emit_or) { sb.Append (" OR "); } sb.Append (field.ToSql (Operator, Value)); return true; } public QueryField Field { get { return field; } set { field = value; } } public Operator Operator { get { return op; } set { op = value; } } public QueryValue Value { get { return qvalue; } set { qvalue = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/EnumQueryValue.cs0000644000175000017500000000706711420634720023556 0ustar00rubenruben00000000000000// // EnumQueryValue.cs // // Author: // Alexander Kojevnikov // // Copyright (C) 2009 Alexander Kojevnikov // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.Linq; using System.Xml; using System.Text; using Mono.Unix; using Hyena; namespace Hyena.Query { public abstract class EnumQueryValue : QueryValue { public static readonly Operator Equal = new Operator ("equals", Catalog.GetString ("is"), "= {0}", "=", "==", ":"); public static readonly Operator NotEqual = new Operator ("notEqual", Catalog.GetString ("is not"), "!= {0}", true, "!=", "!:"); protected int value; public abstract IEnumerable Items { get; } public override string XmlElementName { get { return "int"; } } public override object Value { get { return value; } } public void SetValue (int value) { this.value = value; IsEmpty = false; } protected static AliasedObjectSet operators = new AliasedObjectSet (Equal, NotEqual); public override AliasedObjectSet OperatorSet { get { return operators; } } public override void ParseUserQuery (string input) { foreach (var item in Items) { if (input == item.ID.ToString () || input == item.Name || item.Aliases.Contains (input)) { value = item.ID; IsEmpty = false; break; } } } public override void ParseXml (XmlElement node) { IsEmpty = !Int32.TryParse (node.InnerText, out value); } public override void LoadString (string str) { ParseUserQuery (str); } public override string ToSql (Operator op) { return Convert.ToString (value, System.Globalization.CultureInfo.InvariantCulture); } } public sealed class EnumQueryValueItem : IAliasedObject { public int ID { get; private set; } public string Name { get; private set; } public string DisplayName { get; private set; } public string[] Aliases { get; private set; } public EnumQueryValueItem (int id, string name, string display_name, params string[] aliases) { ID = id; Name = name; DisplayName = display_name; Aliases = aliases; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/Tests/0000777000175000017500000000000011503407405021374 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/Tests/QueryTests.cs0000644000175000017500000002337411420634720024060 0ustar00rubenruben00000000000000// // QueryTests.cs // // Author: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using System.Reflection; using NUnit.Framework; using Hyena.Query; namespace Hyena.Query.Tests { [TestFixture] public class QueryTests : Hyena.Tests.TestBase { private static QueryField ArtistField = new QueryField ( "artist", "ArtistName", "Artist", "CoreArtists.NameLowered", true, "by", "artist", "artists" ); private static QueryField AlbumField = new QueryField ( "album", "AlbumTitle", "Album", "CoreAlbums.TitleLowered", true, "on", "album", "from", "albumtitle" ); private static QueryField PlayCountField = new QueryField ( "playcount", "PlayCount", "Play Count", "CoreTracks.PlayCount", typeof(IntegerQueryValue), "plays", "playcount", "numberofplays", "listens" ); private static QueryField DurationField = new QueryField ( "duration", "Duration", "Duration", "CoreTracks.Duration", typeof(TimeSpanQueryValue), "duration", "length", "time" ); private static QueryField MimeTypeField = new QueryField ( "mimetype", "MimeType", "Mime Type", "CoreTracks.MimeType {0} OR CoreTracks.Uri {0}", typeof(ExactStringQueryValue), "type", "mimetype", "format", "ext", "mime" ); private static QueryField UriField = new QueryField ( "uri", "Uri", "File Location", "CoreTracks.Uri", typeof(ExactUriStringQueryValue), "uri", "path", "file", "location" ); private static QueryFieldSet FieldSet = new QueryFieldSet ( ArtistField, AlbumField, PlayCountField, MimeTypeField, DurationField ); [Test] public void QueryValueSql () { QueryValue qv; qv = new DateQueryValue (); qv.ParseUserQuery ("2007-03-9"); Assert.AreEqual (new DateTime (2007, 3, 9), qv.Value); Assert.AreEqual ("2007-03-09", qv.ToUserQuery ()); Assert.AreEqual ("1173420000", qv.ToSql ()); qv = new StringQueryValue (); qv.ParseUserQuery ("foo 'bar'"); Assert.AreEqual ("foo 'bar'", qv.Value); Assert.AreEqual ("foo 'bar'", qv.ToUserQuery ()); Assert.AreEqual ("foo bar", qv.ToSql ()); qv = new StringQueryValue (); qv.ParseUserQuery ("Foo Baño"); Assert.AreEqual ("Foo Baño", qv.Value); Assert.AreEqual ("Foo Baño", qv.ToUserQuery ()); Assert.AreEqual ("foo bano", qv.ToSql ()); qv = new ExactStringQueryValue (); qv.ParseUserQuery ("foo 'bar'"); Assert.AreEqual ("foo 'bar'", qv.Value); Assert.AreEqual ("foo 'bar'", qv.ToUserQuery ()); Assert.AreEqual ("foo ''bar''", qv.ToSql ()); qv = new IntegerQueryValue (); qv.ParseUserQuery ("22"); Assert.AreEqual (22, qv.Value); Assert.AreEqual ("22", qv.ToUserQuery ()); Assert.AreEqual ("22", qv.ToSql ()); qv = new FileSizeQueryValue (); qv.ParseUserQuery ("2048 KB"); Assert.AreEqual (2097152, qv.Value); Assert.AreEqual ("2.048 KB", qv.ToUserQuery ()); Assert.AreEqual ("2097152", qv.ToSql ()); // TODO this will break once an it_IT translation for "days ago" etc is committed qv = new RelativeTimeSpanQueryValue (); qv.ParseUserQuery ("2 days ago"); Assert.AreEqual (-172800, qv.Value); Assert.AreEqual ("2 days ago", qv.ToUserQuery ()); // TODO this will break once an it_IT translation for "minutes" etc is committed qv = new TimeSpanQueryValue (); qv.ParseUserQuery ("4 minutes"); Assert.AreEqual (240, qv.Value); Assert.AreEqual ("4 minutes", qv.ToUserQuery ()); Assert.AreEqual ("240000", qv.ToSql ()); } [Test] public void QueryParsing () { string [] tests = new string [] { "foo", "foo bar", "foo -bar", "-foo -bar", "-(foo bar)", "-(foo or bar)", "-(foo (-bar or baz))", "-(foo (-bar or -baz))", "by:foo", "-by:foo", "-by!=foo", "duration>\"2 minutes\"", "plays>3", "-plays>3", "by:baz -on:bar", "by:baz -on:bar", "by:baz (plays>3 or plays<2)", "by:on", // bgo#601065 "on:by", }; AssertForEach (tests, UserQueryParsesAndGenerates); } [Test] public void CustomFormatParenthesisBugFixed () { QueryValue val = new StringQueryValue (); val.ParseUserQuery ("mp3"); Assert.AreEqual ( "(CoreTracks.MimeType LIKE '%mp3%' ESCAPE '\\' OR CoreTracks.Uri LIKE '%mp3%' ESCAPE '\\')", MimeTypeField.ToSql (StringQueryValue.Contains, val) ); } [Test] public void EscapeSingleQuotes () { QueryValue val = new StringQueryValue (); val.ParseUserQuery ("Kelli O'Hara"); Assert.AreEqual ( "(CoreArtists.NameLowered LIKE '%kelli ohara%' ESCAPE '\\' AND CoreArtists.NameLowered IS NOT NULL)", ArtistField.ToSql (StringQueryValue.Contains, val) ); } [Test] // http://bugzilla.gnome.org/show_bug.cgi?id=570312 public void EscapeSqliteWildcards1 () { QueryValue val = new StringQueryValue (); val.ParseUserQuery ("100% Techno"); Assert.AreEqual ( "(CoreAlbums.TitleLowered LIKE '%100 techno%' ESCAPE '\\' AND CoreAlbums.TitleLowered IS NOT NULL)", AlbumField.ToSql (StringQueryValue.Contains, val) ); } [Test] // http://bugzilla.gnome.org/show_bug.cgi?id=570312 public void EscapeSqliteWildcards2 () { QueryValue val = new StringQueryValue (); val.ParseUserQuery ("-_-"); Assert.AreEqual ( "(CoreAlbums.TitleLowered LIKE '%-\\_-%' ESCAPE '\\' AND CoreAlbums.TitleLowered IS NOT NULL)", AlbumField.ToSql (StringQueryValue.Contains, val) ); } [Test] // http://bugzilla.gnome.org/show_bug.cgi?id=570312 public void EscapeSqliteWildcards3 () { QueryValue val = new StringQueryValue (); val.ParseUserQuery ("Metallic/\\"); Assert.AreEqual ( "(CoreAlbums.TitleLowered LIKE '%metallic%' ESCAPE '\\' AND CoreAlbums.TitleLowered IS NOT NULL)", AlbumField.ToSql (StringQueryValue.Contains, val) ); } [Test] // http://bugzilla.gnome.org/show_bug.cgi?id=570312 public void EscapeSqliteWildcards4Real () { QueryValue val = new ExactStringQueryValue (); val.ParseUserQuery ("/\\_%`'"); Assert.AreEqual ( "(CoreTracks.MimeType LIKE '%/\\\\\\_\\%`''%' ESCAPE '\\' OR CoreTracks.Uri LIKE '%/\\\\\\_\\%`''%' ESCAPE '\\')", MimeTypeField.ToSql (StringQueryValue.Contains, val) ); } [Test] // http://bugzilla.gnome.org/show_bug.cgi?id=612152 public void EscapeUri () { QueryValue val = new ExactUriStringQueryValue (); val.ParseUserQuery ("space 3quotes`'\"underscore_percentage%slash/backslash\\"); Assert.AreEqual ( @"(CoreTracks.Uri LIKE '%space\%203quotes\%60''\%22underscore\_percentage\%25slash/backslash\%5C%' ESCAPE '\' AND CoreTracks.Uri IS NOT NULL)", UriField.ToSql (StringQueryValue.Contains, val) ); } [Test] // Test behavior issues described in // http://bugzilla.gnome.org/show_bug.cgi?id=547078 public void ParenthesesInQuotes () { string query = "artist==\"foo (disc 2)\""; QueryNode query_tree = UserQueryParser.Parse (query, FieldSet); Assert.IsNotNull (query_tree, "Query should parse"); Assert.AreEqual ("by==\"foo (disc 2)\"", query_tree.ToUserQuery ()); } private static void UserQueryParsesAndGenerates (string query) { QueryNode node = UserQueryParser.Parse (query, FieldSet); if (query == null || query.Trim () == String.Empty) { Assert.AreEqual (node, null); return; } Assert.AreEqual (query, node.ToUserQuery ()); } } } #endif f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/ExactStringQueryValue.cs0000644000175000017500000000315211420634720025074 0ustar00rubenruben00000000000000// // ExactStringQueryValue.cs // // Authors: // John Millikin // // Copyright (C) 2009 John Millikin // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Query { // A query value that requires the string match exactly public class ExactStringQueryValue : StringQueryValue { public override string ToSql (Operator op) { return String.IsNullOrEmpty (value) ? null : EscapeString (op, StringValue); } protected virtual string StringValue { get { return value.ToLower (); } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/DateQueryValue.cs0000644000175000017500000001036511420634720023522 0ustar00rubenruben00000000000000// // DateQueryValue.cs // // Authors: // Gabriel Burt // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.Xml; using System.Text; using System.Text.RegularExpressions; using Mono.Unix; using Hyena; namespace Hyena.Query { public class DateQueryValue : QueryValue { //public static readonly Operator Equal = new Operator ("equals", "= {0}", "==", "=", ":"); //public static readonly Operator NotEqual = new Operator ("notEqual", "!= {0}", true, "!=", "!:"); //public static readonly Operator LessThanEqual = new Operator ("lessThanEquals", "<= {0}", "<="); //public static readonly Operator GreaterThanEqual = new Operator ("greaterThanEquals", ">= {0}", ">="); public static readonly Operator LessThan = new Operator ("lessThan", Catalog.GetString ("before"), "< {0}", true, "<"); public static readonly Operator GreaterThan = new Operator ("greaterThan", Catalog.GetString ("after"), ">= {0}", ">"); protected DateTime value = DateTime.Now; public override string XmlElementName { get { return "date"; } } //protected static AliasedObjectSet operators = new AliasedObjectSet (Equal, NotEqual, LessThan, GreaterThan, LessThanEqual, GreaterThanEqual); protected static AliasedObjectSet operators = new AliasedObjectSet (LessThan, GreaterThan); public override AliasedObjectSet OperatorSet { get { return operators; } } public override object Value { get { return value; } } public override void ParseUserQuery (string input) { try { value = DateTime.Parse (input); IsEmpty = false; } catch { IsEmpty = true; } } public override string ToUserQuery () { if (value.Hour == 0 && value.Minute == 0 && value.Second == 0) { return value.ToString ("yyyy-MM-dd"); } else { return value.ToString (); } } public void SetValue (DateTime date) { value = date; IsEmpty = false; } public override void LoadString (string val) { try { SetValue (DateTime.Parse (val)); } catch { IsEmpty = true; } } public override void ParseXml (XmlElement node) { try { LoadString (node.InnerText); } catch { IsEmpty = true; } } public override string ToSql (Operator op) { if (op == GreaterThan) { return DateTimeUtil.FromDateTime (value.AddDays (1.0)).ToString (System.Globalization.CultureInfo.InvariantCulture); } else { return DateTimeUtil.FromDateTime (value).ToString (System.Globalization.CultureInfo.InvariantCulture); } } public DateTime DateTime { get { return value; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/StringQueryValue.cs0000644000175000017500000000731511420634720024114 0ustar00rubenruben00000000000000// // StringQueryValue.cs // // Authors: // Gabriel Burt // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Xml; using System.Text; using Mono.Unix; using Hyena; namespace Hyena.Query { public class StringQueryValue : QueryValue { private const string ESCAPE_CLAUSE = " ESCAPE '\\'"; public static readonly Operator Contains = new Operator ("contains", Catalog.GetString ("contains"), "LIKE '%{0}%'" + ESCAPE_CLAUSE, ":"); public static readonly Operator DoesNotContain = new Operator ("doesNotContain", Catalog.GetString ("doesn't contain"), "NOT LIKE '%{0}%'" + ESCAPE_CLAUSE, true, "!:"); public static readonly Operator Equal = new Operator ("equals", Catalog.GetString ("is"), "= '{0}'", "=="); public static readonly Operator NotEqual = new Operator ("notEqual", Catalog.GetString ("is not"), "!= '{0}'", true, "!="); public static readonly Operator StartsWith = new Operator ("startsWith", Catalog.GetString ("starts with"), "LIKE '{0}%'" + ESCAPE_CLAUSE, "="); public static readonly Operator EndsWith = new Operator ("endsWith", Catalog.GetString ("ends with"), "LIKE '%{0}'" + ESCAPE_CLAUSE, ":="); protected string value; public override string XmlElementName { get { return "string"; } } public override object Value { get { return value; } } protected static AliasedObjectSet operators = new AliasedObjectSet (Contains, DoesNotContain, Equal, NotEqual, StartsWith, EndsWith); public override AliasedObjectSet OperatorSet { get { return operators; } } public override void ParseUserQuery (string input) { value = input; IsEmpty = String.IsNullOrEmpty (value); } public override void ParseXml (XmlElement node) { value = node.InnerText; IsEmpty = String.IsNullOrEmpty (value); } public override void LoadString (string str) { ParseUserQuery (str); } public override string ToSql (Operator op) { return String.IsNullOrEmpty (value) ? null : EscapeString (op, Hyena.StringUtil.SearchKey (value)); } protected static string EscapeString (Operator op, string orig) { orig = orig.Replace ("'", "''"); if (op == Contains || op == DoesNotContain || op == StartsWith || op == EndsWith) { return StringUtil.EscapeLike (orig); } return orig; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/IntegerKeyedObjectQueryValue.cs0000644000175000017500000000341211420634720026346 0ustar00rubenruben00000000000000// // IntegerKeyedObjectQueryValue.cs // // Authors: // Scott Peterson // // Copyright (C) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Query { public abstract class IntegerKeyedObjectQueryValue : IntegerQueryValue where T : class { private T object_value; public override void SetValue (long value) { object_value = null; base.SetValue (value); } public T ObjectValue { get { if (object_value == null) { object_value = Resolve (); } return object_value; } } protected abstract T Resolve (); } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/QueryLimit.cs0000644000175000017500000000462511420634720022730 0ustar00rubenruben00000000000000// // QueryLimit.cs // // Authors: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Text; using System.Collections.Generic; namespace Hyena.Query { public class QueryLimit { private string name; public string Name { get { return name; } } private string label; public string Label { get { return label; } set { label = value; } } private bool row_based; public bool RowBased { get { return row_based; } } private int factor = 1; public int Factor { get { return factor; } } private string column; public string Column { get { return column; } } public QueryLimit (string name, string label, string column, int factor) : this (name, label, false) { this.column = column; this.factor = factor; } public QueryLimit (string name, string label, bool row_based) { this.name = name; this.label = label; this.row_based = row_based; } public string ToSql (IntegerQueryValue limit_value) { return RowBased ? String.Format ("LIMIT {0}", limit_value.ToSql ()) : null; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/RelativeTimeSpanQueryValue.cs0000644000175000017500000000733511420634720026064 0ustar00rubenruben00000000000000// // RelativeTimeSpanQueryValue.cs // // Authors: // Gabriel Burt // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.Xml; using System.Text; using System.Text.RegularExpressions; using Mono.Unix; using Hyena; namespace Hyena.Query { public class RelativeTimeSpanQueryValue : TimeSpanQueryValue { // The SQL operators in these Operators are reversed from normal on purpose public static new readonly Operator GreaterThan = new Operator ("greaterThan", Catalog.GetString ("more than"), "< {0}", true, ">"); public static new readonly Operator LessThan = new Operator ("lessThan", Catalog.GetString ("less than"), "> {0}", "<"); public static new readonly Operator GreaterThanEqual = new Operator ("greaterThanEquals", Catalog.GetString ("at least"), "<= {0}", true, ">="); public static new readonly Operator LessThanEqual = new Operator ("lessThanEquals", Catalog.GetString ("at most"), ">= {0}", "<="); protected static new AliasedObjectSet operators = new AliasedObjectSet (GreaterThan, LessThan, GreaterThanEqual, LessThanEqual); public override AliasedObjectSet OperatorSet { get { return operators; } } public static RelativeTimeSpanQueryValue RelativeToNow (DateTime since) { RelativeTimeSpanQueryValue qv = new RelativeTimeSpanQueryValue (); qv.SetRelativeValue ((since - DateTime.Now).TotalSeconds, TimeFactor.Second); qv.DetermineFactor (); return qv; } public override string XmlElementName { get { return "date"; } } public override double Offset { get { return -offset; } } public override void SetUserRelativeValue (double offset, TimeFactor factor) { SetRelativeValue (-offset, factor); } public override void AppendXml (XmlElement node) { base.AppendXml (node); node.SetAttribute ("type", "rel"); } public override string ToSql (Operator op) { return DateTimeUtil.FromDateTime (DateTime.Now + TimeSpan.FromSeconds ((double) offset)).ToString (System.Globalization.CultureInfo.InvariantCulture); } protected override string FactorString (TimeFactor factor, double count, bool translate) { string result = base.FactorString (factor, count, translate); return (result == null) ? null : String.Format ( translate ? Catalog.GetString ("{0} ago") : "{0} ago", result); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/XmlQueryParser.cs0000644000175000017500000001041711420634720023563 0ustar00rubenruben00000000000000// // XmlQueryParser.cs // // Author: // Gabriel Burt // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.IO; using System.Text; using System.Xml; namespace Hyena.Query { public class XmlQueryParser : QueryParser { private string str; private QueryFieldSet field_set; public static QueryNode Parse (string input, QueryFieldSet fieldSet) { return new XmlQueryParser (input).BuildTree (fieldSet); } public XmlQueryParser () : base () {} public XmlQueryParser (string str) { this.str = str; } public override QueryNode BuildTree (QueryFieldSet fieldSet) { field_set = fieldSet; XmlDocument doc = new XmlDocument (); try { doc.LoadXml (str); XmlElement request = doc.FirstChild as XmlElement; if (request == null || request.Name != "request") throw new Exception ("Invalid request"); XmlElement query = request.FirstChild as XmlElement; if (query == null || query.Name != "query" || query.GetAttribute ("banshee-version") != "1") throw new Exception ("Invalid query"); QueryNode node = Parse (query.FirstChild as XmlElement, null); return (node != null) ? node.Trim () : null; } catch (Exception) { } return null; } private QueryNode Parse (XmlElement node, QueryListNode parent) { if (node == null) return null; QueryListNode list = null; //Console.WriteLine ("Parsing node: {0}", node.Name); switch (node.Name.ToLower ()) { case "and": list = new QueryListNode (Keyword.And); break; case "or": list = new QueryListNode (Keyword.Or); break; case "not": list = new QueryListNode (Keyword.Not); break; default: QueryTermNode term = new QueryTermNode (); // Get the field (if any) that this term applies to if (node["field"] != null) term.Field = field_set [node["field"].GetAttribute ("name")]; // Get the value term.Value = QueryValue.CreateFromXml (node, term.Field); // Get the operator from the term's name term.Operator = term.Value.OperatorSet [node.Name]; if (parent != null) { parent.AddChild (term); } return term; } if (list != null) { if (parent != null) parent.AddChild (list); // Recursively parse the children of a QueryListNode foreach (XmlNode child in node.ChildNodes) { Parse (child as XmlElement, list); } } return list; } public override void Reset () { } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/NullQueryValue.cs0000644000175000017500000000503311420634720023553 0ustar00rubenruben00000000000000// // NullQueryValue.cs // // Authors: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Xml; using System.Text; using Mono.Unix; using Hyena; namespace Hyena.Query { public class NullQueryValue : QueryValue { public static readonly Operator IsNullOrEmpty = new Operator ("empty", Catalog.GetString ("empty"), "IN (NULL, '', 0)", true, "!"); public static readonly NullQueryValue Instance = new NullQueryValue (); public override string XmlElementName { get { return "empty"; } } public override object Value { get { return null; } } protected static AliasedObjectSet operators = new AliasedObjectSet (IsNullOrEmpty); public override AliasedObjectSet OperatorSet { get { return operators; } } private NullQueryValue () { IsEmpty = false; } public override void ParseUserQuery (string input) { } public override void LoadString (string input) { } public override void ParseXml (XmlElement node) { } public override void AppendXml (XmlElement node) { node.InnerText = String.Empty; } public void SetValue (string str) { } public override string ToSql (Operator op) { return null; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/UserQueryParser.cs0000644000175000017500000002120611420634720023737 0ustar00rubenruben00000000000000// // UserQueryParser.cs // // Author: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.IO; using System.Text; namespace Hyena.Query { public class UserQueryParser : QueryParser { private QueryListNode current_parent; private char peek; private int current_column; private int current_line; private int token_start_column; private int token_start_line; private bool eos_consumed; private QueryListNode root; private QueryFieldSet field_set; public static QueryNode Parse (string input, QueryFieldSet fieldSet) { return new UserQueryParser (input).BuildTree (fieldSet); } public UserQueryParser () : base () {} public UserQueryParser (string inputQuery) : base (inputQuery) {} public UserQueryParser (Stream stream) : base (stream) {} public UserQueryParser (StreamReader reader) : base (reader) {} public override QueryNode BuildTree (QueryFieldSet fieldSet) { field_set = fieldSet; root = current_parent = new QueryListNode (Keyword.And); bool last_was_term = false; while (true) { QueryToken token = Scan (); if (token.ID == TokenID.Unknown) { break; } token.Column = token_start_column; token.Line = token_start_line; // If we have two terms in a row, put an AND between them if (last_was_term && token.ID == TokenID.Term) ParseToken (new QueryToken (TokenID.And)); ParseToken (token); last_was_term = token.ID == TokenID.Term; } return root.Trim (); } private void DepthPush () { current_parent = new QueryListNode (Keyword.And, current_parent); } private void DepthPop () { // Avoid trying to pop more than is possible if (current_parent.Parent != null) current_parent = current_parent.Parent; } private void NodePush (QueryNode node) { if (current_parent == null && node is QueryListNode) { root = current_parent = node as QueryListNode; return; } if (current_parent.Keyword == Keyword.Not && current_parent.ChildCount == 1) DepthPop (); current_parent.AddChild (node); // If the node is a list, it's our new parent QueryListNode list = node as QueryListNode; if (list != null) { current_parent = list; } } private void ParseToken (QueryToken token) { switch (token.ID) { case TokenID.OpenParen: DepthPush (); break; case TokenID.CloseParen: DepthPop (); break; case TokenID.Not: NodePush (new QueryListNode (Keyword.Not)); break; case TokenID.Or: case TokenID.And: // Only push a node if the current_parent is not the same as this token if (current_parent.Keyword == Keyword.Not || current_parent.Keyword == (token.ID == TokenID.Or ? Keyword.And : Keyword.Or)) { QueryListNode list = new QueryListNode (token.ID == TokenID.Or ? Keyword.Or : Keyword.And); QueryListNode p = current_parent.Parent; if (p != null) { current_parent.Parent.RemoveChild (current_parent); } if (current_parent.Keyword == Keyword.Not || current_parent.ChildCount > 1) { list.AddChild (current_parent); } else { list.TakeChildren (current_parent); } current_parent = p; NodePush (list); } break; case TokenID.Term: NodePush (QueryTermNode.ParseUserQuery (field_set, token.Term)); break; } } private QueryToken Scan () { if (reader.EndOfStream) { if (eos_consumed) return new QueryToken (TokenID.Unknown); else eos_consumed = true; } for (; ; ReadChar ()) { if (Char.IsWhiteSpace (peek) && peek != '\n') { continue; } else if (peek == '\n') { current_line++; current_column = 0; } else { break; } } token_start_column = current_column; token_start_line = current_line; if (peek == '(') { ReadChar (); return new QueryToken (TokenID.OpenParen); } else if (peek == ')') { ReadChar (); return new QueryToken (TokenID.CloseParen); } else if (peek == '-') { ReadChar (); return new QueryToken (TokenID.Not); } else if (peek == '|' || peek == ',') { ReadChar (); return new QueryToken (TokenID.Or); } else { string token = ScanString (); if (reader.EndOfStream) eos_consumed = true; switch (token) { case "or": case "OR": return new QueryToken (TokenID.Or); case "NOT": return new QueryToken (TokenID.Not); default: return new QueryToken (token); } } } // TODO: Allow white space before/after term operators private bool IsStringTerminationChar (char ch) { return Char.IsWhiteSpace (ch) || ch == '(' || ch == ')' || ch == '|' || ch == ','; } private string ScanString () { StringBuilder buffer = new StringBuilder (); bool in_string = false; while (true) { if (!in_string && IsStringTerminationChar (peek)) { break; } else if (peek == '"') { in_string = !in_string; } else { buffer.Append (peek); if (reader.EndOfStream) { break; } } ReadChar (); if (reader.EndOfStream) { if (!IsStringTerminationChar (peek) && peek != '"') { buffer.Append (peek); } break; } } return buffer.ToString (); } public override void Reset () { peek = ' '; current_column = 0; current_line = 0; token_start_column = 0; token_start_line = 0; } private void ReadChar () { if (peek == Char.MinValue) { return; } peek = (char)reader.Read (); current_column++; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/QueryValue.cs0000644000175000017500000001117611420634720022725 0ustar00rubenruben00000000000000// // QueryValue.cs // // Authors: // Gabriel Burt // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.Xml; using System.Text; using Hyena; namespace Hyena.Query { public abstract class QueryValue { private static List subtypes = new List (); public static void AddValueType (Type type) { if (!subtypes.Contains (type)) { subtypes.Add (type); } } public static QueryValue CreateFromUserQuery (string input, QueryField field) { if (field == null) { QueryValue val = new StringQueryValue (); val.ParseUserQuery (input); return val; } else { foreach (QueryValue val in field.CreateQueryValues ()) { val.ParseUserQuery (input); if (!val.IsEmpty) { return val; } } } return null; } public static QueryValue CreateFromStringValue (string input, QueryField field) { if (field == null) { QueryValue val = new StringQueryValue (); val.LoadString (input); return val; } else { foreach (QueryValue val in field.CreateQueryValues ()) { val.LoadString (input); if (!val.IsEmpty) { return val; } } } return null; } public static QueryValue CreateFromXml (XmlElement parent, QueryField field) { if (field != null) { foreach (QueryValue val in field.CreateQueryValues ()) { if (CreateFromXml (val, parent)) { return val; } } return null; } else { foreach (Type subtype in subtypes) { QueryValue val = Activator.CreateInstance (subtype) as QueryValue; if (CreateFromXml (val, parent)) { return val; } } } return null; } private static bool CreateFromXml (QueryValue val, XmlElement parent) { XmlElement val_node = parent[val.XmlElementName]; if (val_node != null) { val.ParseXml (val_node); return !val.IsEmpty; } return false; } private bool is_empty = true; public bool IsEmpty { get { return is_empty; } protected set { is_empty = value; } } public abstract object Value { get; } public abstract string XmlElementName { get; } public abstract AliasedObjectSet OperatorSet { get; } public abstract void LoadString (string input); public abstract void ParseXml (XmlElement node); public virtual void AppendXml (XmlElement node) { node.InnerText = Value.ToString (); } public abstract void ParseUserQuery (string input); public virtual string ToUserQuery () { return Value.ToString (); } public override string ToString () { return Value.ToString (); } public string ToSql () { return ToSql (null); } public abstract string ToSql (Operator op); } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/QueryNode.cs0000644000175000017500000001617111420634720022536 0ustar00rubenruben00000000000000// // QueryNode.cs // // Author: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.Xml; using System.IO; using System.Text; namespace Hyena.Query { public enum QueryNodeSearchMethod { DepthFirst, BreadthFirst } public abstract class QueryNode { private QueryListNode parent; private int source_column; private int source_line; public QueryNode() { } public QueryNode(QueryListNode parent) { Parent = parent; Parent.AddChild(this); } protected void PrintIndent(int depth) { Console.Write(String.Empty.PadLeft(depth * 2, ' ')); } public void Dump() { Dump(0); } internal virtual void Dump(int depth) { PrintIndent(depth); Console.WriteLine(this); } public abstract QueryNode Trim (); public string ToUserQuery () { StringBuilder sb = new StringBuilder (); AppendUserQuery (sb); return sb.ToString (); } public abstract void AppendUserQuery (StringBuilder sb); public string ToXml (QueryFieldSet fieldSet) { return ToXml (fieldSet, false); } public virtual string ToXml (QueryFieldSet fieldSet, bool pretty) { XmlDocument doc = new XmlDocument (); XmlElement request = doc.CreateElement ("request"); doc.AppendChild (request); XmlElement query = doc.CreateElement ("query"); query.SetAttribute ("banshee-version", "1"); request.AppendChild (query); AppendXml (doc, query, fieldSet); if (!pretty) { return doc.OuterXml; } using (StringWriter sw = new StringWriter ()) { using (XmlTextWriter xtw = new XmlTextWriter (sw)) { xtw.Formatting = System.Xml.Formatting.Indented; xtw.Indentation = 2; doc.WriteTo (xtw); return sw.ToString (); } } } public IEnumerable SearchForValues () where T : QueryValue { return SearchForValues (QueryNodeSearchMethod.DepthFirst); } public IEnumerable SearchForValues (QueryNodeSearchMethod method) where T : QueryValue { if (method == QueryNodeSearchMethod.DepthFirst) { return SearchForValuesByDepth (this); } else { return SearchForValuesByBreadth (); } } private static IEnumerable SearchForValuesByDepth (QueryNode node) where T : QueryValue { QueryListNode list = node as QueryListNode; if (list != null) { foreach (QueryNode child in list.Children) { foreach (T item in SearchForValuesByDepth (child)) { yield return item; } } } else { QueryTermNode term = node as QueryTermNode; if (term != null) { T value = term.Value as T; if (value != null) { yield return value; } } } } private IEnumerable SearchForValuesByBreadth () where T : QueryValue { Queue queue = new Queue (); queue.Enqueue (this); do { QueryNode node = queue.Dequeue (); QueryListNode list = node as QueryListNode; if (list != null) { foreach (QueryNode child in list.Children) { queue.Enqueue (child); } } else { QueryTermNode term = node as QueryTermNode; if (term != null) { T value = term.Value as T; if (value != null) { yield return value; } } } } while (queue.Count > 0); } public IEnumerable GetFields () { foreach (QueryTermNode term in GetTerms ()) yield return term.Field; } public IEnumerable GetTerms () { Queue queue = new Queue (); queue.Enqueue (this); do { QueryNode node = queue.Dequeue (); QueryListNode list = node as QueryListNode; if (list != null) { foreach (QueryNode child in list.Children) { queue.Enqueue (child); } } else { QueryTermNode term = node as QueryTermNode; if (term != null) { yield return term; } } } while (queue.Count > 0); } public override string ToString () { return ToUserQuery (); } public abstract void AppendXml (XmlDocument doc, XmlNode parent, QueryFieldSet fieldSet); public virtual string ToSql (QueryFieldSet fieldSet) { StringBuilder sb = new StringBuilder (); AppendSql (sb, fieldSet); return sb.ToString (); } public abstract void AppendSql (StringBuilder sb, QueryFieldSet fieldSet); public QueryListNode Parent { get { return parent; } set { parent = value; } } public int SourceColumn { get { return source_column; } set { source_column = value; } } public int SourceLine { get { return source_line; } set { source_line = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/QueryFieldSet.cs0000644000175000017500000000306711420634720023350 0ustar00rubenruben00000000000000// // QueryFieldSet.cs // // Authors: // Gabriel Burt // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Text; using System.Collections.Generic; namespace Hyena.Query { public class QueryFieldSet : AliasedObjectSet { public QueryFieldSet (params QueryField [] fields) : base (fields) { } public QueryField [] Fields { get { return Objects; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/TimeSpanQueryValue.cs0000644000175000017500000002050611420634720024363 0ustar00rubenruben00000000000000// // TimeSpanQueryValue.cs // // Authors: // Gabriel Burt // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.Globalization; using System.Xml; using System.Text; using System.Text.RegularExpressions; using Mono.Unix; using Hyena; namespace Hyena.Query { public enum TimeFactor { Second = 1, Minute = 60, Hour = 3600, Day = 3600*24, Week = 3600*24*7, Month = 3600*24*30, Year = 3600*24*365 } public class TimeSpanQueryValue : IntegerQueryValue { /*public static readonly Operator Equal = new Operator ("equals", "= {0}", "==", "=", ":"); public static readonly Operator NotEqual = new Operator ("notEqual", "!= {0}", true, "!=", "!:"); public static readonly Operator LessThanEqual = new Operator ("lessThanEquals", "<= {0}", "<="); public static readonly Operator GreaterThanEqual = new Operator ("greaterThanEquals", ">= {0}", ">="); public static readonly Operator LessThan = new Operator ("lessThan", "< {0}", "<"); public static readonly Operator GreaterThan = new Operator ("greaterThan", "> {0}", ">");*/ protected double offset = 0; protected TimeFactor factor = TimeFactor.Second; public override string XmlElementName { get { return "timespan"; } } //protected static AliasedObjectSet operators = new AliasedObjectSet (Equal, NotEqual, LessThan, GreaterThan, LessThanEqual, GreaterThanEqual); protected static AliasedObjectSet ops = new AliasedObjectSet (LessThan, GreaterThan, LessThanEqual, GreaterThanEqual); public override AliasedObjectSet OperatorSet { get { return operators; } } public override object Value { get { return offset; } } public virtual double Offset { get { return offset; } } public TimeFactor Factor { get { return factor; } } public double FactoredValue { get { return Offset / (double) factor; } } // FIXME replace period in following with culture-dependent character private static Regex number_regex = new Regex ("\\d+(\\.\\d+)?", RegexOptions.Compiled); public override void ParseUserQuery (string input) { Match match = number_regex.Match (input); if (match != Match.Empty && match.Groups.Count > 0) { double val; try { val = Convert.ToDouble (match.Groups[0].Captures[0].Value); } catch (FormatException) { val = Convert.ToDouble (match.Groups[0].Captures[0].Value, NumberFormatInfo.InvariantInfo); } foreach (TimeFactor factor in Enum.GetValues (typeof(TimeFactor))) { if (input == FactorString (factor, val, true) || input == FactorString (factor, val, false)) { SetUserRelativeValue (val, factor); return; } } } IsEmpty = true; } public override string ToUserQuery () { return FactorString (factor, FactoredValue, true); } public virtual void SetUserRelativeValue (double offset, TimeFactor factor) { SetRelativeValue (offset, factor); } public void SetRelativeValue (double offset, TimeFactor factor) { this.factor = factor; this.offset = (long) (offset * (double)factor); IsEmpty = false; } public override void LoadString (string val) { try { SetRelativeValue (Convert.ToDouble (val), TimeFactor.Second); DetermineFactor (); } catch { IsEmpty = true; } } protected void DetermineFactor () { double val = Math.Abs (offset); foreach (TimeFactor factor in Enum.GetValues (typeof(TimeFactor))) { if (val >= (double) factor) { this.factor = factor; } } } public override void ParseXml (XmlElement node) { try { LoadString (node.InnerText); if (node.HasAttribute ("factor")) { this.factor = (TimeFactor) Enum.Parse (typeof(TimeFactor), node.GetAttribute ("factor")); } } catch { IsEmpty = true; } } public override void AppendXml (XmlElement node) { base.AppendXml (node); node.SetAttribute ("factor", factor.ToString ()); } public override string ToSql (Operator op) { return Convert.ToString (offset * 1000, System.Globalization.CultureInfo.InvariantCulture); } protected virtual string FactorString (TimeFactor factor, double count, bool translate) { string result = null; int plural_count = StringUtil.DoubleToPluralInt (count); if (translate) { switch (factor) { case TimeFactor.Second: result = Catalog.GetPluralString ("{0} second", "{0} seconds", plural_count); break; case TimeFactor.Minute: result = Catalog.GetPluralString ("{0} minute", "{0} minutes", plural_count); break; case TimeFactor.Hour: result = Catalog.GetPluralString ("{0} hour", "{0} hours", plural_count); break; case TimeFactor.Day: result = Catalog.GetPluralString ("{0} day", "{0} days", plural_count); break; case TimeFactor.Week: result = Catalog.GetPluralString ("{0} week", "{0} weeks", plural_count); break; case TimeFactor.Month: result = Catalog.GetPluralString ("{0} month", "{0} months", plural_count); break; case TimeFactor.Year: result = Catalog.GetPluralString ("{0} year", "{0} years", plural_count); break; default: return null; } } else { switch (factor) { case TimeFactor.Second: result = plural_count == 1 ? "{0} second" : "{0} seconds"; break; case TimeFactor.Minute: result = plural_count == 1 ? "{0} minute" : "{0} minutes"; break; case TimeFactor.Hour: result = plural_count == 1 ? "{0} hour" : "{0} hours"; break; case TimeFactor.Day: result = plural_count == 1 ? "{0} day" : "{0} days"; break; case TimeFactor.Week: result = plural_count == 1 ? "{0} week" : "{0} weeks"; break; case TimeFactor.Month: result = plural_count == 1 ? "{0} month" : "{0} months"; break; case TimeFactor.Year: result = plural_count == 1 ? "{0} year" : "{0} years"; break; default: return null; } } return String.Format (result, StringUtil.DoubleToTenthsPrecision ( count, false, translate ? NumberFormatInfo.CurrentInfo : NumberFormatInfo.InvariantInfo)); } } }f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Query/QueryListNode.cs0000644000175000017500000001644311420634720023374 0ustar00rubenruben00000000000000// // QueryListNode.cs // // Author: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Xml; using System.Text; using System.Collections.Generic; namespace Hyena.Query { public enum Keyword { Not, Or, And } public class QueryListNode : QueryNode { private List children = new List(); private Keyword keyword; public QueryListNode(Keyword keyword) : base() { this.keyword = keyword; } public QueryListNode(Keyword keyword, QueryListNode parent) : base(parent) { this.keyword = keyword; } public void AddChild(QueryNode child) { child.Parent = this; children.Add(child); } public void RemoveChild(QueryNode child) { child.Parent = null; children.Remove(child); } public void TakeChildren (QueryListNode from) { foreach (QueryNode child in from.Children) { AddChild (child); } from.Children.Clear (); } public void ReplaceChild(QueryNode old_child, QueryNode new_child) { int index = children.IndexOf(old_child); if(index < 0) { throw new ApplicationException("old_child does not exist"); } children.RemoveAt(index); children.Insert(index, new_child); } public void InsertChild(int index, QueryNode child) { child.Parent = this; children.Insert(index, child); } public int IndexOfChild(QueryNode child) { return children.IndexOf(child); } internal override void Dump(int depth) { PrintIndent(depth); Console.WriteLine("<{0}>", Keyword); foreach(QueryNode child in children) { child.Dump(depth + 1); } PrintIndent(depth); Console.WriteLine("", Keyword); } public QueryNode GetLeftSibling(QueryNode node) { int index = IndexOfChild(node); if(index >= 1) { return Children[index - 1]; } return null; } public QueryNode GetRightSibling(QueryNode node) { int index = IndexOfChild(node); if(index < 0 || index > ChildCount - 2) { return null; } return Children[index + 1]; } public override QueryNode Trim () { // Trim depth first List copy = new List (Children); foreach (QueryNode child in copy) child.Trim (); if (Keyword == Keyword.Not) { if (ChildCount != 1) { if (Parent != null) { Parent.RemoveChild (this); } else { return null; } } } else { if (ChildCount <= 1) { if (Parent != null) { QueryListNode p = Parent; p.RemoveChild (this); p.TakeChildren (this); } else if (ChildCount == 1) { Children[0].Parent = null; return Children[0]; } } } return this; } public override void AppendXml (XmlDocument doc, XmlNode parent, QueryFieldSet fieldSet) { if (ChildCount == 0) return; XmlElement node = doc.CreateElement (Keyword.ToString ().ToLower ()); parent.AppendChild (node); foreach (QueryNode child in Children) child.AppendXml (doc, node, fieldSet); } public override void AppendUserQuery (StringBuilder sb) { if (ChildCount == 0) return; if (Keyword != Keyword.Not) { if (ChildCount > 1 && Parent != null) sb.Append ("("); bool first = true; foreach (QueryNode child in Children) { if (!first) { if (Keyword == Keyword.Or) { // FIXME translate sb.Append (" or "); } else { sb.Append (" "); } } else { first = false; } child.AppendUserQuery (sb); } if (ChildCount > 1 && Parent != null) sb.Append (")"); } else { sb.Append ("-"); Children [0].AppendUserQuery (sb); } } public override void AppendSql (StringBuilder sb, QueryFieldSet fieldSet) { if (ChildCount == 0) return; if (Keyword != Keyword.Not) { sb.Append ("("); bool first = true; foreach (QueryNode child in Children) { if (!first) { sb.AppendFormat (" {0} ", Keyword); } else { first = false; } child.AppendSql (sb, fieldSet); } sb.Append (")"); } else { sb.Append ("NOT("); Children [0].AppendSql (sb, fieldSet); sb.Append (")"); } } public bool IsEmpty { get { return ChildCount == 0; } } public List Children { get { return children; } } public QueryNode LastChild { get { return ChildCount > 0 ? children[ChildCount - 1] : null; } } public int ChildCount { get { return children.Count; } } public Keyword Keyword { get { return keyword; } set { keyword = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Makefile.in0000644000175000017500000007666411503407234020206 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = lib/Hyena/Hyena ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = Hyena TARGET = library LINK = -r:Mono.Posix -r:System -r:System.Core $(GLIBSHARP_LIBS) \ $(am__append_1) SOURCES = \ Hyena.Collections/CollectionExtensions.cs \ Hyena.Collections/IntervalHeap.cs \ Hyena.Collections/IStackProvider.cs \ Hyena.Collections/LruCache.cs \ Hyena.Collections/QueuePipeline.cs \ Hyena.Collections/QueuePipelineElement.cs \ Hyena.Collections/RangeCollection.cs \ Hyena.Collections/Selection.cs \ Hyena.Collections/SelectionProxy.cs \ Hyena.Collections/Tests/IntervalHeapTests.cs \ Hyena.Collections/Tests/QueuePipelineTests.cs \ Hyena.Collections/Tests/RangeCollectionTests.cs \ Hyena.Collections/WriteLineElement.cs \ Hyena.CommandLine/CommandLineParser.cs \ Hyena.CommandLine/Layout.cs \ Hyena.CommandLine/LayoutGroup.cs \ Hyena.CommandLine/LayoutOption.cs \ Hyena.Data/ArrayModelCache.cs \ Hyena.Data/BaseListModel.cs \ Hyena.Data/ColumnDescription.cs \ Hyena.Data/DictionaryModelCache.cs \ Hyena.Data/ICacheableItem.cs \ Hyena.Data/ICacheableModel.cs \ Hyena.Data/ICareAboutView.cs \ Hyena.Data/IDataBinder.cs \ Hyena.Data/IFilterable.cs \ Hyena.Data/IListModel.cs \ Hyena.Data/IPropertyStoreExpose.cs \ Hyena.Data/ISelectable.cs \ Hyena.Data/ISortable.cs \ Hyena.Data/ISortableColumn.cs \ Hyena.Data/MemoryListModel.cs \ Hyena.Data/ModelCache.cs \ Hyena.Data/ModelSelection.cs \ Hyena.Data/ObjectBinder.cs \ Hyena.Data/PropertyStore.cs \ Hyena.Data/SortType.cs \ Hyena.Downloader/Buffer.cs \ Hyena.Downloader/DownloadManager.cs \ Hyena.Downloader/DownloadManagerJob.cs \ Hyena.Downloader/HttpDownloader.cs \ Hyena.Downloader/HttpDownloaderState.cs \ Hyena.Downloader/HttpFileDownloader.cs \ Hyena.Downloader/HttpStringDownloader.cs \ Hyena.Downloader/Tests/HttpTestServer.cs \ Hyena.Downloader/Tests/Tests.cs \ Hyena.Jobs/Job.cs \ Hyena.Jobs/JobExtensions.cs \ Hyena.Jobs/PriorityHints.cs \ Hyena.Jobs/Resource.cs \ Hyena.Jobs/Scheduler.cs \ Hyena.Jobs/SimpleAsyncJob.cs \ Hyena.Jobs/Tests/SchedulerTests.cs \ Hyena.Json/Deserializer.cs \ Hyena.Json/IJsonCollection.cs \ Hyena.Json/JsonArray.cs \ Hyena.Json/JsonObject.cs \ Hyena.Json/Serializer.cs \ Hyena.Json/Tests/DeserializerTests.cs \ Hyena.Json/Tests/SerializerTests.cs \ Hyena.Json/Tests/TokenizerTests.cs \ Hyena.Json/Token.cs \ Hyena.Json/Tokenizer.cs \ Hyena.Json/TokenType.cs \ Hyena.Query/AliasedObjectSet.cs \ Hyena.Query/DateQueryValue.cs \ Hyena.Query/EnumQueryValue.cs \ Hyena.Query/ExactStringQueryValue.cs \ Hyena.Query/ExactUriStringQueryValue.cs \ Hyena.Query/FileSizeQueryValue.cs \ Hyena.Query/IntegerKeyedObjectQueryValue.cs \ Hyena.Query/IntegerQueryValue.cs \ Hyena.Query/NullQueryValue.cs \ Hyena.Query/QueryField.cs \ Hyena.Query/QueryFieldSet.cs \ Hyena.Query/QueryLimit.cs \ Hyena.Query/QueryListNode.cs \ Hyena.Query/QueryNode.cs \ Hyena.Query/QueryOperator.cs \ Hyena.Query/QueryOrder.cs \ Hyena.Query/QueryParser.cs \ Hyena.Query/QueryTermNode.cs \ Hyena.Query/QueryToken.cs \ Hyena.Query/QueryValue.cs \ Hyena.Query/RelativeTimeSpanQueryValue.cs \ Hyena.Query/StringQueryValue.cs \ Hyena.Query/Tests/QueryTests.cs \ Hyena.Query/TimeSpanQueryValue.cs \ Hyena.Query/UserQueryParser.cs \ Hyena.Query/XmlQueryParser.cs \ Hyena.SExpEngine/ArithmeticFunctionSet.cs \ Hyena.SExpEngine/CastFunctionSet.cs \ Hyena.SExpEngine/CompareFunctionSet.cs \ Hyena.SExpEngine/ControlFunctionSet.cs \ Hyena.SExpEngine/Evaluator.cs \ Hyena.SExpEngine/EvaluatorBase.cs \ Hyena.SExpEngine/FunctionFunctionSet.cs \ Hyena.SExpEngine/FunctionNode.cs \ Hyena.SExpEngine/FunctionSet.cs \ Hyena.SExpEngine/ListFunctionSet.cs \ Hyena.SExpEngine/Literals.cs \ Hyena.SExpEngine/LogicFunctionSet.cs \ Hyena.SExpEngine/Parser.cs \ Hyena.SExpEngine/StringFunctionSet.cs \ Hyena.SExpEngine/TreeNode.cs \ Hyena.SExpEngine/UtilityFunctionSet.cs \ Hyena/ApplicationContext.cs \ Hyena/ConsoleCrayon.cs \ Hyena/CryptoUtil.cs \ Hyena/DateTimeUtil.cs \ Hyena/Delegates.cs \ Hyena/EventArgs.cs \ Hyena/IUndoAction.cs \ Hyena/Log.cs \ Hyena/Paths.cs \ Hyena/PlatformDetection.cs \ Hyena/SafeUri.cs \ Hyena/StringUtil.cs \ Hyena/Tests/CryptoUtilTests.cs \ Hyena/Tests/DateTimeUtilTests.cs \ Hyena/Tests/StringUtilTests.cs \ Hyena/Tests/TestBase.cs \ Hyena/ThreadAssist.cs \ Hyena/Timer.cs \ Hyena/UndoManager.cs \ Hyena/XdgBaseDirectorySpec.cs \ System.Web/Helpers.cs \ System.Web/HttpUtility.cs # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) Hyena.dll.config EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) \ $(THEME_ICONS_SOURCE) Hyena.dll.config CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/Hyena/Hyena/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/Hyena/Hyena/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/lib/Hyena/Hyena/Hyena.CommandLine/0000777000175000017500000000000011503407403021351 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/Hyena.CommandLine/CommandLineParser.cs0000644000175000017500000001330511420634720025243 0ustar00rubenruben00000000000000// // CommandLineParser.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.Collections.ObjectModel; namespace Hyena.CommandLine { public class CommandLineParser { private struct Argument { public int Order; public string Value; public Argument (int order, string value) { Order = order; Value = value; } } private int generation; private int sorted_args_generation; private int offset; private string [] arguments; private KeyValuePair [] sorted_args; private Dictionary parsed_arguments = new Dictionary (); private List file_list = new List (); public CommandLineParser () : this (Environment.GetCommandLineArgs (), 1) { } public CommandLineParser (string [] arguments, int offset) { this.arguments = arguments; this.offset = offset; Parse (); } private void Parse () { for (int i = offset; i < arguments.Length; i++) { if (!IsOption (arguments[i])) { file_list.Add (arguments[i]); continue; } string name = OptionName (arguments[i]); string value = String.Empty; int eq_offset = name.IndexOf ('='); if (eq_offset > 1) { value = name.Substring (eq_offset + 1); name = name.Substring (0, eq_offset); } if (parsed_arguments.ContainsKey (name)) { parsed_arguments[name] = new Argument (i, value); } else { parsed_arguments.Add (name, new Argument (i, value)); } } } private bool IsOption (string argument) { return argument.Length > 2 && argument.Substring (0, 2) == "--"; } private string OptionName (string argument) { return argument.Substring (2); } public bool Contains (string name) { return parsed_arguments.ContainsKey (name); } public bool ContainsStart (string start) { foreach (string argument in parsed_arguments.Keys) { if (argument.StartsWith (start)) { return true; } } return false; } public string this[string name] { get { return Contains (name) ? parsed_arguments[name].Value : String.Empty; } set { Argument arg = parsed_arguments[name]; arg.Value = value; parsed_arguments[name] = arg; generation++; } } public IEnumerable> Arguments { get { if (sorted_args == null || sorted_args_generation != generation) { sorted_args = new KeyValuePair[parsed_arguments.Count]; int i = 0; foreach (KeyValuePair arg in parsed_arguments) { sorted_args[i++] = arg; } Array.Sort (sorted_args, delegate (KeyValuePair a, KeyValuePair b) { return a.Value.Order.CompareTo (b.Value.Order); }); sorted_args_generation = generation; } foreach (KeyValuePair arg in sorted_args) { yield return new KeyValuePair (arg.Key, arg.Value.Value); } } } public ReadOnlyCollection Files { get { return new ReadOnlyCollection (file_list); } } public override string ToString () { System.Text.StringBuilder builder = new System.Text.StringBuilder (); builder.Append ("Parsed Arguments\n"); foreach (KeyValuePair argument in parsed_arguments) { builder.AppendFormat (" {0} = [{1}]\n", argument.Key, argument.Value.Value); } builder.Append ("\nFile List\n"); foreach (string file in file_list) { builder.AppendFormat ("{0}\n", file); } return builder.ToString (); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.CommandLine/Layout.cs0000644000175000017500000001414511420634720023160 0ustar00rubenruben00000000000000// // Layout.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Text; using System.Collections.Generic; namespace Hyena.CommandLine { public class Layout { private List groups; public Layout (List groups) { this.groups = groups; } public Layout (params LayoutGroup [] groups) : this (new List (groups)) { } private int TerminalWidth { get { return Console.WindowWidth <= 0 ? 80 : Console.WindowWidth; } } public string ToString (params string [] groupIds) { return ToString (GroupIdsToGroups (groupIds)); } public override string ToString () { return ToString (groups); } public string ToString (IEnumerable groups) { StringBuilder builder = new StringBuilder (); int min_spacing = 6; int group_index = 0; int group_count = 0; int max_option_length = 0; int max_description_length = 0; int description_alignment = 0; foreach (LayoutGroup group in groups) { foreach (LayoutOption option in group) { if (option.Name.Length > max_option_length) { max_option_length = option.Name.Length; } } } max_description_length = TerminalWidth - max_option_length - min_spacing - 4; description_alignment = max_option_length + min_spacing + 4; IEnumerator enumerator = groups.GetEnumerator (); while (enumerator.MoveNext ()) { group_count++; } foreach (LayoutGroup group in groups) { if (group.Id != "default") { builder.Append (group.Title); builder.AppendLine (); builder.AppendLine (); } for (int i = 0, n = group.Count; i < n; i++) { int spacing = (max_option_length - group[i].Name.Length) + min_spacing; builder.AppendFormat (" --{0}{2}{1}", group[i].Name, WrapAlign (group[i].Description, max_description_length, description_alignment, i == n - 1), String.Empty.PadRight (spacing)); builder.AppendLine (); } if (group_index++ < group_count - 1) { builder.AppendLine (); } } return builder.ToString (); } public string LayoutLine (string str) { return WrapAlign (str, TerminalWidth, 0, true); } private static string WrapAlign (string str, int width, int align, bool last) { StringBuilder builder = new StringBuilder (); bool did_wrap = false; for (int i = 0, b = 0; i < str.Length; i++, b++) { if (str[i] == ' ') { int word_length = 0; for (int j = i + 1; j < str.Length && str[j] != ' '; word_length++, j++); if (b + word_length >= width) { builder.AppendLine (); builder.Append (String.Empty.PadRight (align)); b = 0; did_wrap = true; continue; } } builder.Append (str[i]); } if (did_wrap && !last) { builder.AppendLine (); } return builder.ToString (); } public void Add (LayoutGroup group) { groups.Add (group); } public void Remove (LayoutGroup group) { groups.Remove (group); } public void Remove (string groupId) { LayoutGroup group = FindGroup (groupId); if (group != null) { groups.Remove (group); } } private LayoutGroup FindGroup (string id) { foreach (LayoutGroup group in groups) { if (group.Id == id) { return group; } } return null; } private IEnumerable GroupIdsToGroups (string [] groupIds) { foreach (string group_id in groupIds) { LayoutGroup group = FindGroup (group_id); if (group != null) { yield return group; } } } public static LayoutOption Option (string name, string description) { return new LayoutOption (name, description); } public static LayoutGroup Group (string id, string title, params LayoutOption [] options) { return new LayoutGroup (id, title, options); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.CommandLine/LayoutGroup.cs0000644000175000017500000000646211420634720024200 0ustar00rubenruben00000000000000// // LayoutGroup.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; namespace Hyena.CommandLine { public class LayoutGroup : IEnumerable { private List options; private string id; private string title; public LayoutGroup (string id, string title, List options) { this.id = id; this.title = title; this.options = options; } public LayoutGroup (string id, string title, params LayoutOption [] options) : this (id, title, new List (options)) { } public IEnumerator GetEnumerator () { return options.GetEnumerator (); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () { return GetEnumerator (); } public void Add (LayoutOption option) { options.Add (option); } public void Add (string name, string description) { options.Add (new LayoutOption (name, description)); } public void Remove (LayoutOption option) { options.Remove (option); } public void Remove (string optionName) { LayoutOption option = FindOption (optionName); if (option != null) { options.Remove (option); } } private LayoutOption FindOption (string name) { foreach (LayoutOption option in options) { if (option.Name == name) { return option; } } return null; } public LayoutOption this[int index] { get { return options[index]; } set { options[index] = value; } } public int Count { get { return options.Count; } } public string Id { get { return id; } } public string Title { get { return title; } } public IList Options { get { return options; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.CommandLine/LayoutOption.cs0000644000175000017500000000316711420634720024353 0ustar00rubenruben00000000000000// // LayoutOption.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // namespace Hyena.CommandLine { public class LayoutOption { private string name; private string description; public LayoutOption (string name, string description) { this.name = name; this.description = description; } public string Name { get { return name; } } public string Description { get { return description; } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Jobs/0000777000175000017500000000000011503407404020061 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Jobs/Job.cs0000644000175000017500000001775111441732606021137 0ustar00rubenruben00000000000000// // Job.cs // // Author: // Gabriel Burt // // Copyright (C) 2009 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Linq; using System.Threading; using System.Collections.Generic; using System.Collections.ObjectModel; namespace Hyena.Jobs { public enum JobState { None, Scheduled, Running, Paused, Cancelled, Completed }; public class Job { public event EventHandler Updated; public event EventHandler Finished; public event EventHandler CancelRequested; private int update_freeze_ref; private JobState state = JobState.None; private ManualResetEvent pause_event; private DateTime created_at = DateTime.Now; private TimeSpan run_time = TimeSpan.Zero; private Object sync = new Object (); public bool IsCancelRequested { get; private set; } #region Internal Properties internal bool IsScheduled { get { return state == JobState.Scheduled; } } internal bool IsRunning { get { return state == JobState.Running; } } internal bool IsPaused { get { return state == JobState.Paused; } } public bool IsFinished { get { lock (sync) { return state == JobState.Cancelled || state == JobState.Completed; } } } internal DateTime CreatedAt { get { return created_at; } } internal TimeSpan RunTime { get { return run_time; } } #endregion #region Scheduler Methods internal void Start () { Log.Debug ("Starting", Title); lock (sync) { if (state != JobState.Scheduled && state != JobState.Paused) { Log.DebugFormat ("Job {0} in {1} state is not runnable", Title, state); return; } State = JobState.Running; if (pause_event != null) { pause_event.Set (); } RunJob (); } } internal void Cancel () { lock (sync) { if (!IsFinished) { IsCancelRequested = true; State = JobState.Cancelled; EventHandler handler = CancelRequested; if (handler != null) { handler (this, EventArgs.Empty); } } } Log.Debug ("Canceled", Title); } internal void Preempt () { Log.Debug ("Preempting", Title); Pause (false); } internal bool Pause () { Log.Debug ("Pausing ", Title); return Pause (true); } private bool Pause (bool unschedule) { lock (sync) { if (IsFinished) { Log.DebugFormat ("Job {0} in {1} state is not pausable", Title, state); return false; } State = unschedule ? JobState.Paused : JobState.Scheduled; if (pause_event != null) { pause_event.Reset (); } } return true; } #endregion private string title; private string status; private string [] icon_names; private double progress; #region Public Properties public string Title { get { return title; } set { title = value; OnUpdated (); } } public string Status { get { return status; } set { status = value; OnUpdated (); } } public double Progress { get { return progress; } set { progress = Math.Max (0.0, Math.Min (1.0, value)); OnUpdated (); } } public string [] IconNames { get { return icon_names; } set { if (value != null) { icon_names = value; OnUpdated (); } } } public bool IsBackground { get; set; } public bool CanCancel { get; set; } public string CancelMessage { get; set; } public bool DelayShow { get; set; } public PriorityHints PriorityHints { get; set; } // Causes runtime method-not-found error in mono 2.0.1 //public IEnumerable Resources { get; protected set; } internal Resource [] Resources; public JobState State { get { return state; } internal set { state = value; OnUpdated (); } } public void SetResources (params Resource [] resources) { Resources = resources; } #endregion #region Constructor public Job () : this (null, PriorityHints.None) { } public Job (string title, PriorityHints hints, params Resource [] resources) { Title = title; PriorityHints = hints; Resources = resources; } #endregion #region Abstract Methods protected virtual void RunJob () { } #endregion #region Protected Methods public void Update (string title, string status, double progress) { Title = title; Status = status; Progress = progress; } protected void FreezeUpdate () { System.Threading.Interlocked.Increment (ref update_freeze_ref); } protected void ThawUpdate (bool raiseUpdate) { System.Threading.Interlocked.Decrement (ref update_freeze_ref); if (raiseUpdate) { OnUpdated (); } } protected void OnUpdated () { if (update_freeze_ref != 0) { return; } EventHandler handler = Updated; if (handler != null) { handler (this, EventArgs.Empty); } } public void YieldToScheduler () { if (IsPaused || IsScheduled) { if (pause_event == null) { pause_event = new ManualResetEvent (false); } pause_event.WaitOne (); } } protected void OnFinished () { Log.Debug ("Finished", Title); pause_event = null; if (state != JobState.Cancelled) { State = JobState.Completed; } EventHandler handler = Finished; if (handler != null) { handler (this, EventArgs.Empty); } } #endregion internal bool HasScheduler { get; set; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Jobs/SimpleAsyncJob.cs0000644000175000017500000000463711420634720023301 0ustar00rubenruben00000000000000// // SimpleAsyncJob.cs // // Author: // Gabriel Burt // // Copyright (C) 2009 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Linq; using System.Threading; using System.Collections.Generic; using System.Collections.ObjectModel; namespace Hyena.Jobs { public abstract class SimpleAsyncJob : Job { private Thread thread; public SimpleAsyncJob () { } public SimpleAsyncJob (string name, PriorityHints hints, params Resource [] resources) : base (name, hints, resources) { } protected override void RunJob () { if (thread == null) { thread = new Thread (InnerStart); thread.Name = String.Format ("Hyena.Jobs.JobRunner ({0})", Title); thread.Priority = this.Has (PriorityHints.SpeedSensitive) ? ThreadPriority.Normal : ThreadPriority.Lowest; thread.Start (); } } protected void AbortThread () { if (thread != null) { thread.Abort (); } } private void InnerStart () { try { Run (); } catch (ThreadAbortException) { } catch (Exception e) { Log.Exception (e); } } protected abstract void Run (); } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Jobs/Resource.cs0000644000175000017500000000322011420634720022171 0ustar00rubenruben00000000000000// // Resource.cs // // Author: // Gabriel Burt // // Copyright (C) 2009 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Jobs { public class Resource { // Convenience Resources for programs to use public static readonly Resource Cpu = new Resource { Id = "cpu", Name = "CPU" }; public static readonly Resource Disk = new Resource { Id = "disk", Name = "Disk" }; public static readonly Resource Database = new Resource { Id = "db", Name = "Database" }; public string Id { get; set; } public string Name { get; set; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Jobs/Tests/0000777000175000017500000000000011503407404021163 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Jobs/Tests/SchedulerTests.cs0000644000175000017500000001624211420634720024455 0ustar00rubenruben00000000000000// // SchedulerTests.cs // // Author: // Gabriel Burt // // Copyright (C) 2009 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using System.Linq; using System.Threading; using NUnit.Framework; using Hyena; namespace Hyena.Jobs { [TestFixture] public class SchedulerTests { private Scheduler scheduler; [SetUp] public void Setup () { //Log.Debugging = true; TestJob.job_count = 0; Log.Debug ("New job scheduler test"); } [TearDown] public void TearDown () { if (scheduler != null) { // Ensure the scheduler's jobs are all finished, otherwise // their job threads will be killed, throwing an exception while (scheduler.JobCount > 0); } //Log.Debugging = false; } [Test] public void TestSimultaneousSpeedJobs () { scheduler = new Scheduler (); scheduler.Add (new TestJob (200, PriorityHints.SpeedSensitive, Resource.Cpu, Resource.Disk)); scheduler.Add (new TestJob (200, PriorityHints.SpeedSensitive, Resource.Cpu, Resource.Disk)); scheduler.Add (new TestJob (200, PriorityHints.None, Resource.Cpu, Resource.Disk)); // Test that two SpeedSensitive jobs with the same Resources will run simultaneously AssertJobsRunning (2); // but that the third that isn't SpeedSensitive won't run until they are both done while (scheduler.JobCount > 1); Assert.AreEqual (PriorityHints.None, scheduler.Jobs.First ().PriorityHints); } [Test] public void TestOneNonSpeedJobPerResource () { // Test that two SpeedSensitive jobs with the same Resources will run simultaneously scheduler = new Scheduler (); scheduler.Add (new TestJob (200, PriorityHints.None, Resource.Cpu, Resource.Disk)); scheduler.Add (new TestJob (200, PriorityHints.None, Resource.Cpu, Resource.Disk)); AssertJobsRunning (1); } [Test] public void TestSpeedJobPreemptsNonSpeedJobs () { scheduler = new Scheduler (); TestJob a = new TestJob (200, PriorityHints.None, Resource.Cpu); TestJob b = new TestJob (200, PriorityHints.None, Resource.Disk); TestJob c = new TestJob (200, PriorityHints.LongRunning, Resource.Database); scheduler.Add (a); scheduler.Add (b); scheduler.Add (c); // Test that three jobs got started AssertJobsRunning (3); scheduler.Add (new TestJob (200, PriorityHints.SpeedSensitive, Resource.Cpu, Resource.Disk)); // Make sure the SpeedSensitive jobs has caused the Cpu and Disk jobs to be paused AssertJobsRunning (2); Assert.AreEqual (true, a.IsScheduled); Assert.AreEqual (true, b.IsScheduled); Assert.AreEqual (true, c.IsRunning); } /*[Test] public void TestManyJobs () { var timer = System.Diagnostics.Stopwatch.StartNew (); scheduler = new Scheduler ("TestManyJobs"); // First add some long running jobs for (int i = 0; i < 100; i++) { scheduler.Add (new TestJob (20, PriorityHints.LongRunning, Resource.Cpu)); } // Then add some normal jobs that will prempt them for (int i = 0; i < 100; i++) { scheduler.Add (new TestJob (10, PriorityHints.None, Resource.Cpu)); } // Then add some SpeedSensitive jobs that will prempt all of them for (int i = 0; i < 100; i++) { scheduler.Add (new TestJob (5, PriorityHints.SpeedSensitive, Resource.Cpu)); } while (scheduler.Jobs.Count > 0); Log.DebugFormat ("Took {0} to schedule and process all jobs", timer.Elapsed); //scheduler.StopAll (); }*/ /*[Test] public void TestCannotDisposeWhileDatalossJobsScheduled () { scheduler = new Scheduler (); TestJob loss_job; scheduler.Add (new TestJob (200, PriorityHints.SpeedSensitive, Resource.Cpu)); scheduler.Add (loss_job = new TestJob (200, PriorityHints.DataLossIfStopped, Resource.Cpu)); AssertJobsRunning (1); Assert.AreEqual (false, scheduler.JobInfo[loss_job].IsRunning); try { //scheduler.StopAll (); Assert.Fail ("Cannot stop with dataloss job scheduled"); } catch { } } public void TestCannotDisposeWhileDatalossJobsRunning () { scheduler = new Scheduler (); scheduler.Add (new TestJob (200, PriorityHints.DataLossIfStopped, Resource.Cpu)); AssertJobsRunning (1); try { //scheduler.StopAll (); Assert.Fail ("Cannot stop with dataloss job running"); } catch { } }*/ private void AssertJobsRunning (int count) { Assert.AreEqual (count, scheduler.Jobs.Count (j => j.IsRunning)); } private class TestJob : SimpleAsyncJob { internal static int job_count; int iteration; int sleep_time; public TestJob (int sleep_time, PriorityHints hints, params Resource [] resources) : base (String.Format ("{0} ( {1}, {2})", job_count++, hints, resources.Aggregate ("", (a, b) => a += b.Id + " ")), hints, resources) { this.sleep_time = sleep_time; } protected override void Run () { for (int i = 0; !IsCancelRequested && i < 2; i++) { YieldToScheduler (); Hyena.Log.DebugFormat ("{0} iteration {1}", Title, iteration++); System.Threading.Thread.Sleep (sleep_time); } OnFinished (); } } } } #endif f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Jobs/PriorityHints.cs0000644000175000017500000000255511420634720023243 0ustar00rubenruben00000000000000// // PriorityHints.cs // // Author: // Gabriel Burt // // Copyright (C) 2009 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Jobs { [Flags] public enum PriorityHints { None = 0, DataLossIfStopped = 1, SpeedSensitive = 2, LongRunning = 4 } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Jobs/JobExtensions.cs0000644000175000017500000000460411420634720023203 0ustar00rubenruben00000000000000// // JobExtensions.cs // // Author: // Gabriel Burt // // Copyright (C) 2009 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Linq; using System.Collections.Generic; namespace Hyena.Jobs { public static class JobExtensions { internal static IEnumerable Without (this IEnumerable source, PriorityHints hints) where T : Job { return source.Where (j => !j.Has (hints)); } internal static IEnumerable With (this IEnumerable source, PriorityHints hints) where T : Job { return source.Where (j => j.Has (hints)); } internal static IEnumerable SharingResourceWith (this IEnumerable source, Job job) where T : Job { return source.Where (j => j.Resources.Intersect (job.Resources).Any ()); } public static void ForEach (this IEnumerable source, Action func) { foreach (T item in source) func (item); } public static bool Has (this T job, PriorityHints hints) where T : Job { return (job.PriorityHints & hints) == hints; } // Useful.. /*public static bool Include (this Enum source, Enum flags) { return ((int)source & (int)flags) == (int)flags; }*/ } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Jobs/Scheduler.cs0000644000175000017500000001524611420634720022333 0ustar00rubenruben00000000000000// // Scheduler.cs // // Author: // Gabriel Burt // // Copyright (C) 2009 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Linq; using System.Threading; using System.Collections.Generic; using System.Collections.ObjectModel; using Hyena; namespace Hyena.Jobs { public class Scheduler { private List jobs; public event Action JobAdded; public event Action JobRemoved; public IEnumerable Jobs { get; private set; } public int JobCount { get { lock (jobs) { return jobs.Count; } } } public bool HasAnyDataLossJobs { get { lock (jobs) { return jobs.With (PriorityHints.DataLossIfStopped).Any (); } } } public Scheduler () { jobs = new List (); Jobs = new ReadOnlyCollection (jobs); } public void Add (Job job) { lock (jobs) { lock (job) { if (jobs.Contains (job) || job.HasScheduler) { throw new ArgumentException ("Job not schedulable", "job"); } job.HasScheduler = true; } jobs.Add (job); job.State = JobState.Scheduled; job.Finished += OnJobFinished; if (CanStart (job)) { StartJob (job); } } Action handler = JobAdded; if (handler != null) { handler (job); } } public void Cancel (Job job) { lock (jobs) { if (jobs.Contains (job)) { // Cancel will call OnJobFinished which will call Schedule job.Cancel (); } } } public void Pause (Job job) { lock (jobs) { if (jobs.Contains (job)) { if (job.Pause ()) { // See if any scheduled jobs can now be started Schedule (); } } } } public void Resume (Job job) { lock (jobs) { if (jobs.Contains (job) && CanStartJob (job, true)) { StartJob (job); } } } public void CancelAll (bool evenDataLossJobs) { lock (jobs) { List jobs_copy = new List (jobs); foreach (var job in jobs_copy) { if (evenDataLossJobs || !job.Has (PriorityHints.DataLossIfStopped)) { job.Cancel (); } } } } private void OnJobFinished (object o, EventArgs args) { Job job = o as Job; lock (jobs) { jobs.Remove (job); } Action handler = JobRemoved; if (handler != null) { handler (job); } Schedule (); } private void Schedule () { lock (jobs) { // First try to start any non-LongRunning jobs jobs.Without (PriorityHints.LongRunning) .Where (CanStart) .ForEach (StartJob); // Then start any LongRunning ones jobs.With (PriorityHints.LongRunning) .Where (CanStart) .ForEach (StartJob); } } #region Job Query helpers private bool IsRunning (Job job) { return job.IsRunning; } private bool CanStart (Job job) { return CanStartJob (job, false); } private bool CanStartJob (Job job, bool pausedJob) { if (!job.IsScheduled && !(pausedJob && job.IsPaused)) return false; if (job.Has (PriorityHints.SpeedSensitive)) return true; // Run only one non-SpeedSensitive job that uses a given Resource if (job.Has (PriorityHints.LongRunning)) return jobs.Where (IsRunning) .SharingResourceWith (job) .Any () == false; // With the exception that non-LongRunning jobs will preempt LongRunning ones return jobs.Where (IsRunning) .Without (PriorityHints.LongRunning) .SharingResourceWith (job) .Any () == false; } private void StartJob (Job job) { ConflictingJobs (job).ForEach (PreemptJob); job.Start (); } private void PreemptJob (Job job) { job.Preempt (); } private IEnumerable ConflictingJobs (Job job) { if (job.Has (PriorityHints.SpeedSensitive)) { // Preempt non-SpeedSensitive jobs that use the same Resource(s) return jobs.Where (IsRunning) .Without (PriorityHints.SpeedSensitive) .SharingResourceWith (job); } else if (!job.Has (PriorityHints.LongRunning)) { // Preempt any LongRunning jobs that use the same Resource(s) return jobs.Where (IsRunning) .With (PriorityHints.LongRunning) .SharingResourceWith (job); } return Enumerable.Empty (); } #endregion } } f-spot-0.8.2/lib/Hyena/Hyena/System.Web/0000777000175000017500000000000011503407405020122 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/System.Web/HttpUtility.cs0000644000175000017500000007335111420634720022761 0ustar00rubenruben00000000000000// // System.Web.HttpUtility // // Authors: // Patrik Torstensson (Patrik.Torstensson@labs2.com) // Wictor Wilén (decode/encode functions) (wictor@ibizkit.se) // Tim Coleman (tim@timcoleman.com) // Gonzalo Paniagua Javier (gonzalo@ximian.com) // // Copyright (C) 2005 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System.Collections; using System.Collections.Specialized; using System.Globalization; using System.IO; using System.Security.Permissions; using System.Text; using System.Web.Util; #if NET_2_0 using System.Collections.Generic; #endif namespace System.Web { #if !MONOTOUCH // CAS - no InheritanceDemand here as the class is sealed [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] #endif public sealed class HttpUtility { #region Fields static Hashtable entities; static object lock_ = new object (); #endregion // Fields static Hashtable Entities { get { lock (lock_) { if (entities == null) InitEntities (); return entities; } } } #region Constructors static void InitEntities () { // Build the hash table of HTML entity references. This list comes // from the HTML 4.01 W3C recommendation. entities = new Hashtable (); entities.Add ("nbsp", '\u00A0'); entities.Add ("iexcl", '\u00A1'); entities.Add ("cent", '\u00A2'); entities.Add ("pound", '\u00A3'); entities.Add ("curren", '\u00A4'); entities.Add ("yen", '\u00A5'); entities.Add ("brvbar", '\u00A6'); entities.Add ("sect", '\u00A7'); entities.Add ("uml", '\u00A8'); entities.Add ("copy", '\u00A9'); entities.Add ("ordf", '\u00AA'); entities.Add ("laquo", '\u00AB'); entities.Add ("not", '\u00AC'); entities.Add ("shy", '\u00AD'); entities.Add ("reg", '\u00AE'); entities.Add ("macr", '\u00AF'); entities.Add ("deg", '\u00B0'); entities.Add ("plusmn", '\u00B1'); entities.Add ("sup2", '\u00B2'); entities.Add ("sup3", '\u00B3'); entities.Add ("acute", '\u00B4'); entities.Add ("micro", '\u00B5'); entities.Add ("para", '\u00B6'); entities.Add ("middot", '\u00B7'); entities.Add ("cedil", '\u00B8'); entities.Add ("sup1", '\u00B9'); entities.Add ("ordm", '\u00BA'); entities.Add ("raquo", '\u00BB'); entities.Add ("frac14", '\u00BC'); entities.Add ("frac12", '\u00BD'); entities.Add ("frac34", '\u00BE'); entities.Add ("iquest", '\u00BF'); entities.Add ("Agrave", '\u00C0'); entities.Add ("Aacute", '\u00C1'); entities.Add ("Acirc", '\u00C2'); entities.Add ("Atilde", '\u00C3'); entities.Add ("Auml", '\u00C4'); entities.Add ("Aring", '\u00C5'); entities.Add ("AElig", '\u00C6'); entities.Add ("Ccedil", '\u00C7'); entities.Add ("Egrave", '\u00C8'); entities.Add ("Eacute", '\u00C9'); entities.Add ("Ecirc", '\u00CA'); entities.Add ("Euml", '\u00CB'); entities.Add ("Igrave", '\u00CC'); entities.Add ("Iacute", '\u00CD'); entities.Add ("Icirc", '\u00CE'); entities.Add ("Iuml", '\u00CF'); entities.Add ("ETH", '\u00D0'); entities.Add ("Ntilde", '\u00D1'); entities.Add ("Ograve", '\u00D2'); entities.Add ("Oacute", '\u00D3'); entities.Add ("Ocirc", '\u00D4'); entities.Add ("Otilde", '\u00D5'); entities.Add ("Ouml", '\u00D6'); entities.Add ("times", '\u00D7'); entities.Add ("Oslash", '\u00D8'); entities.Add ("Ugrave", '\u00D9'); entities.Add ("Uacute", '\u00DA'); entities.Add ("Ucirc", '\u00DB'); entities.Add ("Uuml", '\u00DC'); entities.Add ("Yacute", '\u00DD'); entities.Add ("THORN", '\u00DE'); entities.Add ("szlig", '\u00DF'); entities.Add ("agrave", '\u00E0'); entities.Add ("aacute", '\u00E1'); entities.Add ("acirc", '\u00E2'); entities.Add ("atilde", '\u00E3'); entities.Add ("auml", '\u00E4'); entities.Add ("aring", '\u00E5'); entities.Add ("aelig", '\u00E6'); entities.Add ("ccedil", '\u00E7'); entities.Add ("egrave", '\u00E8'); entities.Add ("eacute", '\u00E9'); entities.Add ("ecirc", '\u00EA'); entities.Add ("euml", '\u00EB'); entities.Add ("igrave", '\u00EC'); entities.Add ("iacute", '\u00ED'); entities.Add ("icirc", '\u00EE'); entities.Add ("iuml", '\u00EF'); entities.Add ("eth", '\u00F0'); entities.Add ("ntilde", '\u00F1'); entities.Add ("ograve", '\u00F2'); entities.Add ("oacute", '\u00F3'); entities.Add ("ocirc", '\u00F4'); entities.Add ("otilde", '\u00F5'); entities.Add ("ouml", '\u00F6'); entities.Add ("divide", '\u00F7'); entities.Add ("oslash", '\u00F8'); entities.Add ("ugrave", '\u00F9'); entities.Add ("uacute", '\u00FA'); entities.Add ("ucirc", '\u00FB'); entities.Add ("uuml", '\u00FC'); entities.Add ("yacute", '\u00FD'); entities.Add ("thorn", '\u00FE'); entities.Add ("yuml", '\u00FF'); entities.Add ("fnof", '\u0192'); entities.Add ("Alpha", '\u0391'); entities.Add ("Beta", '\u0392'); entities.Add ("Gamma", '\u0393'); entities.Add ("Delta", '\u0394'); entities.Add ("Epsilon", '\u0395'); entities.Add ("Zeta", '\u0396'); entities.Add ("Eta", '\u0397'); entities.Add ("Theta", '\u0398'); entities.Add ("Iota", '\u0399'); entities.Add ("Kappa", '\u039A'); entities.Add ("Lambda", '\u039B'); entities.Add ("Mu", '\u039C'); entities.Add ("Nu", '\u039D'); entities.Add ("Xi", '\u039E'); entities.Add ("Omicron", '\u039F'); entities.Add ("Pi", '\u03A0'); entities.Add ("Rho", '\u03A1'); entities.Add ("Sigma", '\u03A3'); entities.Add ("Tau", '\u03A4'); entities.Add ("Upsilon", '\u03A5'); entities.Add ("Phi", '\u03A6'); entities.Add ("Chi", '\u03A7'); entities.Add ("Psi", '\u03A8'); entities.Add ("Omega", '\u03A9'); entities.Add ("alpha", '\u03B1'); entities.Add ("beta", '\u03B2'); entities.Add ("gamma", '\u03B3'); entities.Add ("delta", '\u03B4'); entities.Add ("epsilon", '\u03B5'); entities.Add ("zeta", '\u03B6'); entities.Add ("eta", '\u03B7'); entities.Add ("theta", '\u03B8'); entities.Add ("iota", '\u03B9'); entities.Add ("kappa", '\u03BA'); entities.Add ("lambda", '\u03BB'); entities.Add ("mu", '\u03BC'); entities.Add ("nu", '\u03BD'); entities.Add ("xi", '\u03BE'); entities.Add ("omicron", '\u03BF'); entities.Add ("pi", '\u03C0'); entities.Add ("rho", '\u03C1'); entities.Add ("sigmaf", '\u03C2'); entities.Add ("sigma", '\u03C3'); entities.Add ("tau", '\u03C4'); entities.Add ("upsilon", '\u03C5'); entities.Add ("phi", '\u03C6'); entities.Add ("chi", '\u03C7'); entities.Add ("psi", '\u03C8'); entities.Add ("omega", '\u03C9'); entities.Add ("thetasym", '\u03D1'); entities.Add ("upsih", '\u03D2'); entities.Add ("piv", '\u03D6'); entities.Add ("bull", '\u2022'); entities.Add ("hellip", '\u2026'); entities.Add ("prime", '\u2032'); entities.Add ("Prime", '\u2033'); entities.Add ("oline", '\u203E'); entities.Add ("frasl", '\u2044'); entities.Add ("weierp", '\u2118'); entities.Add ("image", '\u2111'); entities.Add ("real", '\u211C'); entities.Add ("trade", '\u2122'); entities.Add ("alefsym", '\u2135'); entities.Add ("larr", '\u2190'); entities.Add ("uarr", '\u2191'); entities.Add ("rarr", '\u2192'); entities.Add ("darr", '\u2193'); entities.Add ("harr", '\u2194'); entities.Add ("crarr", '\u21B5'); entities.Add ("lArr", '\u21D0'); entities.Add ("uArr", '\u21D1'); entities.Add ("rArr", '\u21D2'); entities.Add ("dArr", '\u21D3'); entities.Add ("hArr", '\u21D4'); entities.Add ("forall", '\u2200'); entities.Add ("part", '\u2202'); entities.Add ("exist", '\u2203'); entities.Add ("empty", '\u2205'); entities.Add ("nabla", '\u2207'); entities.Add ("isin", '\u2208'); entities.Add ("notin", '\u2209'); entities.Add ("ni", '\u220B'); entities.Add ("prod", '\u220F'); entities.Add ("sum", '\u2211'); entities.Add ("minus", '\u2212'); entities.Add ("lowast", '\u2217'); entities.Add ("radic", '\u221A'); entities.Add ("prop", '\u221D'); entities.Add ("infin", '\u221E'); entities.Add ("ang", '\u2220'); entities.Add ("and", '\u2227'); entities.Add ("or", '\u2228'); entities.Add ("cap", '\u2229'); entities.Add ("cup", '\u222A'); entities.Add ("int", '\u222B'); entities.Add ("there4", '\u2234'); entities.Add ("sim", '\u223C'); entities.Add ("cong", '\u2245'); entities.Add ("asymp", '\u2248'); entities.Add ("ne", '\u2260'); entities.Add ("equiv", '\u2261'); entities.Add ("le", '\u2264'); entities.Add ("ge", '\u2265'); entities.Add ("sub", '\u2282'); entities.Add ("sup", '\u2283'); entities.Add ("nsub", '\u2284'); entities.Add ("sube", '\u2286'); entities.Add ("supe", '\u2287'); entities.Add ("oplus", '\u2295'); entities.Add ("otimes", '\u2297'); entities.Add ("perp", '\u22A5'); entities.Add ("sdot", '\u22C5'); entities.Add ("lceil", '\u2308'); entities.Add ("rceil", '\u2309'); entities.Add ("lfloor", '\u230A'); entities.Add ("rfloor", '\u230B'); entities.Add ("lang", '\u2329'); entities.Add ("rang", '\u232A'); entities.Add ("loz", '\u25CA'); entities.Add ("spades", '\u2660'); entities.Add ("clubs", '\u2663'); entities.Add ("hearts", '\u2665'); entities.Add ("diams", '\u2666'); entities.Add ("quot", '\u0022'); entities.Add ("amp", '\u0026'); entities.Add ("lt", '\u003C'); entities.Add ("gt", '\u003E'); entities.Add ("OElig", '\u0152'); entities.Add ("oelig", '\u0153'); entities.Add ("Scaron", '\u0160'); entities.Add ("scaron", '\u0161'); entities.Add ("Yuml", '\u0178'); entities.Add ("circ", '\u02C6'); entities.Add ("tilde", '\u02DC'); entities.Add ("ensp", '\u2002'); entities.Add ("emsp", '\u2003'); entities.Add ("thinsp", '\u2009'); entities.Add ("zwnj", '\u200C'); entities.Add ("zwj", '\u200D'); entities.Add ("lrm", '\u200E'); entities.Add ("rlm", '\u200F'); entities.Add ("ndash", '\u2013'); entities.Add ("mdash", '\u2014'); entities.Add ("lsquo", '\u2018'); entities.Add ("rsquo", '\u2019'); entities.Add ("sbquo", '\u201A'); entities.Add ("ldquo", '\u201C'); entities.Add ("rdquo", '\u201D'); entities.Add ("bdquo", '\u201E'); entities.Add ("dagger", '\u2020'); entities.Add ("Dagger", '\u2021'); entities.Add ("permil", '\u2030'); entities.Add ("lsaquo", '\u2039'); entities.Add ("rsaquo", '\u203A'); entities.Add ("euro", '\u20AC'); } public HttpUtility () { } #endregion // Constructors #region Methods public static void HtmlAttributeEncode (string s, TextWriter output) { output.Write(HtmlAttributeEncode(s)); } public static string HtmlAttributeEncode (string s) { if (null == s) return null; bool needEncode = false; for (int i = 0; i < s.Length; i++) { if (s [i] == '&' || s [i] == '"' || s [i] == '<') { needEncode = true; break; } } if (!needEncode) return s; StringBuilder output = new StringBuilder (); int len = s.Length; for (int i = 0; i < len; i++) switch (s [i]) { case '&' : output.Append ("&"); break; case '"' : output.Append ("""); break; case '<': output.Append ("<"); break; default: output.Append (s [i]); break; } return output.ToString(); } public static string UrlDecode (string str) { return UrlDecode(str, Encoding.UTF8); } static char [] GetChars (MemoryStream b, Encoding e) { return e.GetChars (b.GetBuffer (), 0, (int) b.Length); } static void WriteCharBytes (IList buf, char ch, Encoding e) { if (ch > 255) { foreach (byte b in e.GetBytes (new char[] { ch })) buf.Add (b); } else buf.Add ((byte)ch); } public static string UrlDecode (string s, Encoding e) { if (null == s) return null; if (s.IndexOf ('%') == -1 && s.IndexOf ('+') == -1) return s; if (e == null) e = Encoding.UTF8; long len = s.Length; #if NET_2_0 var bytes = new List (); #else ArrayList bytes = new ArrayList (); #endif int xchar; char ch; for (int i = 0; i < len; i++) { ch = s [i]; if (ch == '%' && i + 2 < len && s [i + 1] != '%') { if (s [i + 1] == 'u' && i + 5 < len) { // unicode hex sequence xchar = GetChar (s, i + 2, 4); if (xchar != -1) { WriteCharBytes (bytes, (char)xchar, e); i += 5; } else WriteCharBytes (bytes, '%', e); } else if ((xchar = GetChar (s, i + 1, 2)) != -1) { WriteCharBytes (bytes, (char)xchar, e); i += 2; } else { WriteCharBytes (bytes, '%', e); } continue; } if (ch == '+') WriteCharBytes (bytes, ' ', e); else WriteCharBytes (bytes, ch, e); } #if NET_2_0 byte[] buf = bytes.ToArray (); #else byte[] buf = (byte[])bytes.ToArray (typeof (byte)); #endif bytes = null; return e.GetString (buf); } public static string UrlDecode (byte [] bytes, Encoding e) { if (bytes == null) return null; return UrlDecode (bytes, 0, bytes.Length, e); } static int GetInt (byte b) { char c = (char) b; if (c >= '0' && c <= '9') return c - '0'; if (c >= 'a' && c <= 'f') return c - 'a' + 10; if (c >= 'A' && c <= 'F') return c - 'A' + 10; return -1; } static int GetChar (byte [] bytes, int offset, int length) { int value = 0; int end = length + offset; for (int i = offset; i < end; i++) { int current = GetInt (bytes [i]); if (current == -1) return -1; value = (value << 4) + current; } return value; } static int GetChar (string str, int offset, int length) { int val = 0; int end = length + offset; for (int i = offset; i < end; i++) { char c = str [i]; if (c > 127) return -1; int current = GetInt ((byte) c); if (current == -1) return -1; val = (val << 4) + current; } return val; } public static string UrlDecode (byte [] bytes, int offset, int count, Encoding e) { if (bytes == null) return null; if (count == 0) return String.Empty; if (bytes == null) throw new ArgumentNullException ("bytes"); if (offset < 0 || offset > bytes.Length) throw new ArgumentOutOfRangeException ("offset"); if (count < 0 || offset + count > bytes.Length) throw new ArgumentOutOfRangeException ("count"); StringBuilder output = new StringBuilder (); MemoryStream acc = new MemoryStream (); int end = count + offset; int xchar; for (int i = offset; i < end; i++) { if (bytes [i] == '%' && i + 2 < count && bytes [i + 1] != '%') { if (bytes [i + 1] == (byte) 'u' && i + 5 < end) { if (acc.Length > 0) { output.Append (GetChars (acc, e)); acc.SetLength (0); } xchar = GetChar (bytes, i + 2, 4); if (xchar != -1) { output.Append ((char) xchar); i += 5; continue; } } else if ((xchar = GetChar (bytes, i + 1, 2)) != -1) { acc.WriteByte ((byte) xchar); i += 2; continue; } } if (acc.Length > 0) { output.Append (GetChars (acc, e)); acc.SetLength (0); } if (bytes [i] == '+') { output.Append (' '); } else { output.Append ((char) bytes [i]); } } if (acc.Length > 0) { output.Append (GetChars (acc, e)); } acc = null; return output.ToString (); } public static byte [] UrlDecodeToBytes (byte [] bytes) { if (bytes == null) return null; return UrlDecodeToBytes (bytes, 0, bytes.Length); } public static byte [] UrlDecodeToBytes (string str) { return UrlDecodeToBytes (str, Encoding.UTF8); } public static byte [] UrlDecodeToBytes (string str, Encoding e) { if (str == null) return null; if (e == null) throw new ArgumentNullException ("e"); return UrlDecodeToBytes (e.GetBytes (str)); } public static byte [] UrlDecodeToBytes (byte [] bytes, int offset, int count) { if (bytes == null) return null; if (count == 0) return new byte [0]; int len = bytes.Length; if (offset < 0 || offset >= len) throw new ArgumentOutOfRangeException("offset"); if (count < 0 || offset > len - count) throw new ArgumentOutOfRangeException("count"); MemoryStream result = new MemoryStream (); int end = offset + count; for (int i = offset; i < end; i++){ char c = (char) bytes [i]; if (c == '+') { c = ' '; } else if (c == '%' && i < end - 2) { int xchar = GetChar (bytes, i + 1, 2); if (xchar != -1) { c = (char) xchar; i += 2; } } result.WriteByte ((byte) c); } return result.ToArray (); } public static string UrlEncode(string str) { return UrlEncode(str, Encoding.UTF8); } public static string UrlEncode (string s, Encoding Enc) { if (s == null) return null; if (s == "") return ""; bool needEncode = false; int len = s.Length; for (int i = 0; i < len; i++) { char c = s [i]; if ((c < '0') || (c < 'A' && c > '9') || (c > 'Z' && c < 'a') || (c > 'z')) { if (NotEncoded (c)) continue; needEncode = true; break; } } if (!needEncode) return s; // avoided GetByteCount call byte [] bytes = new byte[Enc.GetMaxByteCount(s.Length)]; int realLen = Enc.GetBytes (s, 0, s.Length, bytes, 0); return Encoding.ASCII.GetString (UrlEncodeToBytes (bytes, 0, realLen)); } public static string UrlEncode (byte [] bytes) { if (bytes == null) return null; if (bytes.Length == 0) return ""; return Encoding.ASCII.GetString (UrlEncodeToBytes (bytes, 0, bytes.Length)); } public static string UrlEncode (byte [] bytes, int offset, int count) { if (bytes == null) return null; if (bytes.Length == 0) return ""; return Encoding.ASCII.GetString (UrlEncodeToBytes (bytes, offset, count)); } public static byte [] UrlEncodeToBytes (string str) { return UrlEncodeToBytes (str, Encoding.UTF8); } public static byte [] UrlEncodeToBytes (string str, Encoding e) { if (str == null) return null; if (str == "") return new byte [0]; byte [] bytes = e.GetBytes (str); return UrlEncodeToBytes (bytes, 0, bytes.Length); } public static byte [] UrlEncodeToBytes (byte [] bytes) { if (bytes == null) return null; if (bytes.Length == 0) return new byte [0]; return UrlEncodeToBytes (bytes, 0, bytes.Length); } static char [] hexChars = "0123456789abcdef".ToCharArray (); static bool NotEncoded (char c) { return (c == '!' || c == '\'' || c == '(' || c == ')' || c == '*' || c == '-' || c == '.' || c == '_'); } static void UrlEncodeChar (char c, Stream result, bool isUnicode) { if (c > 255) { //FIXME: what happens when there is an internal error? //if (!isUnicode) // throw new ArgumentOutOfRangeException ("c", c, "c must be less than 256"); int idx; int i = (int) c; result.WriteByte ((byte)'%'); result.WriteByte ((byte)'u'); idx = i >> 12; result.WriteByte ((byte)hexChars [idx]); idx = (i >> 8) & 0x0F; result.WriteByte ((byte)hexChars [idx]); idx = (i >> 4) & 0x0F; result.WriteByte ((byte)hexChars [idx]); idx = i & 0x0F; result.WriteByte ((byte)hexChars [idx]); return; } if (c > ' ' && NotEncoded (c)) { result.WriteByte ((byte)c); return; } if (c==' ') { result.WriteByte ((byte)'+'); return; } if ( (c < '0') || (c < 'A' && c > '9') || (c > 'Z' && c < 'a') || (c > 'z')) { if (isUnicode && c > 127) { result.WriteByte ((byte)'%'); result.WriteByte ((byte)'u'); result.WriteByte ((byte)'0'); result.WriteByte ((byte)'0'); } else result.WriteByte ((byte)'%'); int idx = ((int) c) >> 4; result.WriteByte ((byte)hexChars [idx]); idx = ((int) c) & 0x0F; result.WriteByte ((byte)hexChars [idx]); } else result.WriteByte ((byte)c); } public static byte [] UrlEncodeToBytes (byte [] bytes, int offset, int count) { if (bytes == null) return null; int len = bytes.Length; if (len == 0) return new byte [0]; if (offset < 0 || offset >= len) throw new ArgumentOutOfRangeException("offset"); if (count < 0 || count > len - offset) throw new ArgumentOutOfRangeException("count"); MemoryStream result = new MemoryStream (count); int end = offset + count; for (int i = offset; i < end; i++) UrlEncodeChar ((char)bytes [i], result, false); return result.ToArray(); } public static string UrlEncodeUnicode (string str) { if (str == null) return null; return Encoding.ASCII.GetString (UrlEncodeUnicodeToBytes (str)); } public static byte [] UrlEncodeUnicodeToBytes (string str) { if (str == null) return null; if (str == "") return new byte [0]; MemoryStream result = new MemoryStream (str.Length); foreach (char c in str){ UrlEncodeChar (c, result, true); } return result.ToArray (); } /// /// Decodes an HTML-encoded string and returns the decoded string. /// /// The HTML string to decode. /// The decoded text. public static string HtmlDecode (string s) { if (s == null) throw new ArgumentNullException ("s"); if (s.IndexOf ('&') == -1) return s; StringBuilder entity = new StringBuilder (); StringBuilder output = new StringBuilder (); int len = s.Length; // 0 -> nothing, // 1 -> right after '&' // 2 -> between '&' and ';' but no '#' // 3 -> '#' found after '&' and getting numbers int state = 0; int number = 0; bool have_trailing_digits = false; for (int i = 0; i < len; i++) { char c = s [i]; if (state == 0) { if (c == '&') { entity.Append (c); state = 1; } else { output.Append (c); } continue; } if (c == '&') { state = 1; if (have_trailing_digits) { entity.Append (number.ToString (Helpers.InvariantCulture)); have_trailing_digits = false; } output.Append (entity.ToString ()); entity.Length = 0; entity.Append ('&'); continue; } if (state == 1) { if (c == ';') { state = 0; output.Append (entity.ToString ()); output.Append (c); entity.Length = 0; } else { number = 0; if (c != '#') { state = 2; } else { state = 3; } entity.Append (c); } } else if (state == 2) { entity.Append (c); if (c == ';') { string key = entity.ToString (); if (key.Length > 1 && Entities.ContainsKey (key.Substring (1, key.Length - 2))) key = Entities [key.Substring (1, key.Length - 2)].ToString (); output.Append (key); state = 0; entity.Length = 0; } } else if (state == 3) { if (c == ';') { if (number > 65535) { output.Append ("&#"); output.Append (number.ToString (Helpers.InvariantCulture)); output.Append (";"); } else { output.Append ((char) number); } state = 0; entity.Length = 0; have_trailing_digits = false; } else if (Char.IsDigit (c)) { number = number * 10 + ((int) c - '0'); have_trailing_digits = true; } else { state = 2; if (have_trailing_digits) { entity.Append (number.ToString (Helpers.InvariantCulture)); have_trailing_digits = false; } entity.Append (c); } } } if (entity.Length > 0) { output.Append (entity.ToString ()); } else if (have_trailing_digits) { output.Append (number.ToString (Helpers.InvariantCulture)); } return output.ToString (); } /// /// Decodes an HTML-encoded string and sends the resulting output to a TextWriter output stream. /// /// The HTML string to decode /// The TextWriter output stream containing the decoded string. public static void HtmlDecode(string s, TextWriter output) { if (s != null) output.Write (HtmlDecode (s)); } /// /// HTML-encodes a string and returns the encoded string. /// /// The text string to encode. /// The HTML-encoded text. public static string HtmlEncode (string s) { if (s == null) return null; bool needEncode = false; for (int i = 0; i < s.Length; i++) { char c = s [i]; if (c == '&' || c == '"' || c == '<' || c == '>' || c > 159) { needEncode = true; break; } } if (!needEncode) return s; StringBuilder output = new StringBuilder (); int len = s.Length; for (int i = 0; i < len; i++) switch (s [i]) { case '&' : output.Append ("&"); break; case '>' : output.Append (">"); break; case '<' : output.Append ("<"); break; case '"' : output.Append ("""); break; default: // MS starts encoding with &# from 160 and stops at 255. // We don't do that. One reason is the 65308/65310 unicode // characters that look like '<' and '>'. #if TARGET_JVM if (s [i] > 159 && s [i] < 256) { #else if (s [i] > 159) { #endif output.Append ("&#"); output.Append (((int) s [i]).ToString (Helpers.InvariantCulture)); output.Append (";"); } else { output.Append (s [i]); } break; } return output.ToString (); } /// /// HTML-encodes a string and sends the resulting output to a TextWriter output stream. /// /// The string to encode. /// The TextWriter output stream containing the encoded string. public static void HtmlEncode(string s, TextWriter output) { if (s != null) output.Write (HtmlEncode (s)); } #if NET_1_1 public static string UrlPathEncode (string s) { if (s == null || s.Length == 0) return s; MemoryStream result = new MemoryStream (); int length = s.Length; for (int i = 0; i < length; i++) { UrlPathEncodeChar (s [i], result); } return Encoding.ASCII.GetString (result.ToArray ()); } static void UrlPathEncodeChar (char c, Stream result) { #if NET_2_0 if (c < 33 || c > 126) { #else if (c > 127) { #endif byte [] bIn = Encoding.UTF8.GetBytes (c.ToString ()); for (int i = 0; i < bIn.Length; i++) { result.WriteByte ((byte) '%'); int idx = ((int) bIn [i]) >> 4; result.WriteByte ((byte) hexChars [idx]); idx = ((int) bIn [i]) & 0x0F; result.WriteByte ((byte) hexChars [idx]); } } else if (c == ' ') { result.WriteByte ((byte) '%'); result.WriteByte ((byte) '2'); result.WriteByte ((byte) '0'); } else result.WriteByte ((byte) c); } #endif #if NET_2_0 class HttpQSCollection : NameValueCollection { public override string ToString () { int count = Count; if (count == 0) return ""; StringBuilder sb = new StringBuilder (); string [] keys = AllKeys; for (int i = 0; i < count; i++) { sb.AppendFormat ("{0}={1}&", keys [i], this [keys [i]]); } if (sb.Length > 0) sb.Length--; return sb.ToString (); } } public static NameValueCollection ParseQueryString (string query) { return ParseQueryString (query, Encoding.UTF8); } public static NameValueCollection ParseQueryString (string query, Encoding encoding) { if (query == null) throw new ArgumentNullException ("query"); if (encoding == null) throw new ArgumentNullException ("encoding"); if (query.Length == 0 || (query.Length == 1 && query[0] == '?')) return new NameValueCollection (); if (query[0] == '?') query = query.Substring (1); NameValueCollection result = new HttpQSCollection (); ParseQueryString (query, encoding, result); return result; } #endif internal static void ParseQueryString (string query, Encoding encoding, NameValueCollection result) { if (query.Length == 0) return; string decoded = HtmlDecode (query); int decodedLength = decoded.Length; int namePos = 0; bool first = true; while (namePos <= decodedLength) { int valuePos = -1, valueEnd = -1; for (int q = namePos; q < decodedLength; q++) { if (valuePos == -1 && decoded [q] == '=') { valuePos = q + 1; } else if (decoded [q] == '&') { valueEnd = q; break; } } if (first) { first = false; if (decoded [namePos] == '?') namePos++; } string name, value; if (valuePos == -1) { name = null; valuePos = namePos; } else { name = UrlDecode (decoded.Substring (namePos, valuePos - namePos - 1), encoding); } if (valueEnd < 0) { namePos = -1; valueEnd = decoded.Length; } else { namePos = valueEnd + 1; } value = UrlDecode (decoded.Substring (valuePos, valueEnd - valuePos), encoding); result.Add (name, value); if (namePos == -1) break; } } #endregion // Methods } } f-spot-0.8.2/lib/Hyena/Hyena/System.Web/Helpers.cs0000644000175000017500000000256711420634720022061 0ustar00rubenruben00000000000000// // System.Web.Util.Helpers // // Authors: // Marek Habersack (mhabersack@novell.com) // // (C) 2009 Novell, Inc (http://novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Globalization; namespace System.Web.Util { class Helpers { public static readonly CultureInfo InvariantCulture = CultureInfo.InvariantCulture; } } f-spot-0.8.2/lib/Hyena/Hyena/Makefile.am0000644000175000017500000001061311467745411020166 0ustar00rubenruben00000000000000ASSEMBLY = Hyena TARGET = library LINK = -r:Mono.Posix -r:System -r:System.Core $(GLIBSHARP_LIBS) SOURCES = \ Hyena.Collections/CollectionExtensions.cs \ Hyena.Collections/IntervalHeap.cs \ Hyena.Collections/IStackProvider.cs \ Hyena.Collections/LruCache.cs \ Hyena.Collections/QueuePipeline.cs \ Hyena.Collections/QueuePipelineElement.cs \ Hyena.Collections/RangeCollection.cs \ Hyena.Collections/Selection.cs \ Hyena.Collections/SelectionProxy.cs \ Hyena.Collections/Tests/IntervalHeapTests.cs \ Hyena.Collections/Tests/QueuePipelineTests.cs \ Hyena.Collections/Tests/RangeCollectionTests.cs \ Hyena.Collections/WriteLineElement.cs \ Hyena.CommandLine/CommandLineParser.cs \ Hyena.CommandLine/Layout.cs \ Hyena.CommandLine/LayoutGroup.cs \ Hyena.CommandLine/LayoutOption.cs \ Hyena.Data/ArrayModelCache.cs \ Hyena.Data/BaseListModel.cs \ Hyena.Data/ColumnDescription.cs \ Hyena.Data/DictionaryModelCache.cs \ Hyena.Data/ICacheableItem.cs \ Hyena.Data/ICacheableModel.cs \ Hyena.Data/ICareAboutView.cs \ Hyena.Data/IDataBinder.cs \ Hyena.Data/IFilterable.cs \ Hyena.Data/IListModel.cs \ Hyena.Data/IPropertyStoreExpose.cs \ Hyena.Data/ISelectable.cs \ Hyena.Data/ISortable.cs \ Hyena.Data/ISortableColumn.cs \ Hyena.Data/MemoryListModel.cs \ Hyena.Data/ModelCache.cs \ Hyena.Data/ModelSelection.cs \ Hyena.Data/ObjectBinder.cs \ Hyena.Data/PropertyStore.cs \ Hyena.Data/SortType.cs \ Hyena.Downloader/Buffer.cs \ Hyena.Downloader/DownloadManager.cs \ Hyena.Downloader/DownloadManagerJob.cs \ Hyena.Downloader/HttpDownloader.cs \ Hyena.Downloader/HttpDownloaderState.cs \ Hyena.Downloader/HttpFileDownloader.cs \ Hyena.Downloader/HttpStringDownloader.cs \ Hyena.Downloader/Tests/HttpTestServer.cs \ Hyena.Downloader/Tests/Tests.cs \ Hyena.Jobs/Job.cs \ Hyena.Jobs/JobExtensions.cs \ Hyena.Jobs/PriorityHints.cs \ Hyena.Jobs/Resource.cs \ Hyena.Jobs/Scheduler.cs \ Hyena.Jobs/SimpleAsyncJob.cs \ Hyena.Jobs/Tests/SchedulerTests.cs \ Hyena.Json/Deserializer.cs \ Hyena.Json/IJsonCollection.cs \ Hyena.Json/JsonArray.cs \ Hyena.Json/JsonObject.cs \ Hyena.Json/Serializer.cs \ Hyena.Json/Tests/DeserializerTests.cs \ Hyena.Json/Tests/SerializerTests.cs \ Hyena.Json/Tests/TokenizerTests.cs \ Hyena.Json/Token.cs \ Hyena.Json/Tokenizer.cs \ Hyena.Json/TokenType.cs \ Hyena.Query/AliasedObjectSet.cs \ Hyena.Query/DateQueryValue.cs \ Hyena.Query/EnumQueryValue.cs \ Hyena.Query/ExactStringQueryValue.cs \ Hyena.Query/ExactUriStringQueryValue.cs \ Hyena.Query/FileSizeQueryValue.cs \ Hyena.Query/IntegerKeyedObjectQueryValue.cs \ Hyena.Query/IntegerQueryValue.cs \ Hyena.Query/NullQueryValue.cs \ Hyena.Query/QueryField.cs \ Hyena.Query/QueryFieldSet.cs \ Hyena.Query/QueryLimit.cs \ Hyena.Query/QueryListNode.cs \ Hyena.Query/QueryNode.cs \ Hyena.Query/QueryOperator.cs \ Hyena.Query/QueryOrder.cs \ Hyena.Query/QueryParser.cs \ Hyena.Query/QueryTermNode.cs \ Hyena.Query/QueryToken.cs \ Hyena.Query/QueryValue.cs \ Hyena.Query/RelativeTimeSpanQueryValue.cs \ Hyena.Query/StringQueryValue.cs \ Hyena.Query/Tests/QueryTests.cs \ Hyena.Query/TimeSpanQueryValue.cs \ Hyena.Query/UserQueryParser.cs \ Hyena.Query/XmlQueryParser.cs \ Hyena.SExpEngine/ArithmeticFunctionSet.cs \ Hyena.SExpEngine/CastFunctionSet.cs \ Hyena.SExpEngine/CompareFunctionSet.cs \ Hyena.SExpEngine/ControlFunctionSet.cs \ Hyena.SExpEngine/Evaluator.cs \ Hyena.SExpEngine/EvaluatorBase.cs \ Hyena.SExpEngine/FunctionFunctionSet.cs \ Hyena.SExpEngine/FunctionNode.cs \ Hyena.SExpEngine/FunctionSet.cs \ Hyena.SExpEngine/ListFunctionSet.cs \ Hyena.SExpEngine/Literals.cs \ Hyena.SExpEngine/LogicFunctionSet.cs \ Hyena.SExpEngine/Parser.cs \ Hyena.SExpEngine/StringFunctionSet.cs \ Hyena.SExpEngine/TreeNode.cs \ Hyena.SExpEngine/UtilityFunctionSet.cs \ Hyena/ApplicationContext.cs \ Hyena/ConsoleCrayon.cs \ Hyena/CryptoUtil.cs \ Hyena/DateTimeUtil.cs \ Hyena/Delegates.cs \ Hyena/EventArgs.cs \ Hyena/IUndoAction.cs \ Hyena/Log.cs \ Hyena/Paths.cs \ Hyena/PlatformDetection.cs \ Hyena/SafeUri.cs \ Hyena/StringUtil.cs \ Hyena/Tests/CryptoUtilTests.cs \ Hyena/Tests/DateTimeUtilTests.cs \ Hyena/Tests/StringUtilTests.cs \ Hyena/Tests/TestBase.cs \ Hyena/ThreadAssist.cs \ Hyena/Timer.cs \ Hyena/UndoManager.cs \ Hyena/XdgBaseDirectorySpec.cs \ System.Web/Helpers.cs \ System.Web/HttpUtility.cs include $(top_srcdir)/build/build.mk EXTRA_DIST += Hyena.dll.config module_SCRIPTS += Hyena.dll.config f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Downloader/0000777000175000017500000000000011503407403021261 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Downloader/DownloadManagerJob.cs0000644000175000017500000000707011467745411025322 0ustar00rubenruben00000000000000// // DownloadManagerJob.cs // // Author: // Aaron Bockover // Gabriel Burt // // Copyright 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.IO; using System.Linq; using System.Collections.Generic; using Mono.Unix; using Hyena; namespace Hyena.Downloader { public class DownloadManagerJob : Hyena.Jobs.Job { private DownloadManager manager; private int finished_count = 0; public DownloadManagerJob (DownloadManager manager) { this.manager = manager; manager.Progress += OnDownloaderProgress; manager.Finished += OnDownloaderFinished; } private void OnDownloaderProgress (HttpDownloader downloader) { FreezeUpdate (); lock (manager.SyncRoot) { double weight = 1.0 / (manager.TotalDownloadCount + finished_count); double progress = finished_count * weight; double speed = 0; int count = 0; foreach (var active_downloader in manager.ActiveDownloaders) { progress += weight * active_downloader.State.PercentComplete; speed = active_downloader.State.TransferRate; count++; } Progress = progress; var human_speed = new Hyena.Query.FileSizeQueryValue ((long)Math.Round (speed)).ToUserQuery (); if (manager.PendingDownloadCount == 0) { Status = String.Format ( Catalog.GetPluralString ( "{0} download at {1}/s", "{0} downloads at {1}/s", count), count, human_speed ); } else { Status = String.Format ( Catalog.GetPluralString ( "{0} download at {1}/s ({2} pending)", "{0} downloads at {1}/s ({2} pending)", count), count, human_speed, manager.PendingDownloadCount ); } } ThawUpdate (true); } private void OnDownloaderFinished (HttpDownloader downloader) { lock (manager.SyncRoot) { finished_count++; if (manager.TotalDownloadCount <= 0) { OnFinished (); } } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Downloader/Tests/0000777000175000017500000000000011503407404022364 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Downloader/Tests/HttpTestServer.cs0000644000175000017500000002027411467745411025676 0ustar00rubenruben00000000000000// // HttpTestServer.cs // // Author: // Aaron Bockover // // Copyright 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #if ENABLE_TESTS using System; using System.IO; using System.Net; using System.Text; using System.Collections.Generic; using System.Security.Cryptography; namespace Hyena.Downloader.Tests { internal class HttpTestServer : IDisposable { private class Resource { public string Path; public string Checksum; public long Length; } private List resources = new List (); private bool stop_requested; private bool running; private bool serving; private HttpListener listener; public int ResourceCount { get; set; } public int MinResourceSize { get; set; } public int MaxResourceSize { get; set; } public bool IsServing { get { return serving; } } public bool Debug = true; public string BaseUrl { get { return "http://localhost:8080/"; } } public HttpTestServer () { ResourceCount = 5; MinResourceSize = 5 * 1024 * 1024; MaxResourceSize = 15 * 1024 * 1024; } public void Run () { stop_requested = false; running = true; GenerateStaticContent (); ServeStaticContent (); running = false; serving = false; } public void Dispose () { Stop (); } public void Stop () { lock (this) { if (!running) return; stop_requested = true; listener.Abort (); // busy wait, oh well if (Debug) Console.WriteLine ("waiting for server to stop"); while (running) {} if (Debug) Console.WriteLine (" > done waiting for server to stop"); } } private void ServeStaticContent () { if (Debug) Console.WriteLine (); if (Debug) Console.WriteLine ("Serving static content..."); listener = new HttpListener (); listener.Prefixes.Add (BaseUrl); listener.Start (); serving = true; while (!stop_requested) { var async_result = listener.BeginGetContext (result => { var context = listener.EndGetContext (result); var response = context.Response; var path = context.Request.Url.LocalPath; response.StatusCode = 200; response.StatusDescription = "OK"; response.ProtocolVersion = new Version ("1.1"); try { if (Debug) Console.WriteLine ("Serving: {0}", path); if (path == "/") { ServeString (response, resources.Count.ToString () + "\n"); return; } else if (path == "/shutdown") { ServeString (response, "Goodbye\n"); lock (this) { stop_requested = true; } } var resource = resources[Int32.Parse (path.Substring (1))]; response.ContentType = "application/octet-stream"; response.ContentLength64 = resource.Length; response.AppendHeader ("X-Content-MD5-Sum", resource.Checksum); if (context.Request.HttpMethod == "HEAD") { response.Close (); } using (var resource_stream = File.OpenRead (resource.Path)) { var buffer = new byte[32 << 10]; using (response.OutputStream) { while (true) { var read = resource_stream.Read (buffer, 0, buffer.Length); if (read <= 0) { break; } response.OutputStream.Write (buffer, 0, read); } } } } catch { response.StatusCode = 404; response.StatusDescription = "404 Not Found"; ServeString (response, "Invalid resource: " + path + "\n"); } response.Close (); }, null); async_result.AsyncWaitHandle.WaitOne (); } } private void ServeString (HttpListenerResponse response, string content) { var buffer = Encoding.UTF8.GetBytes (content); response.ContentType = "text/plain"; response.ContentLength64 = buffer.Length; using (var stream = response.OutputStream) { stream.Write (buffer, 0, buffer.Length); } } private void GenerateStaticContent () { resources.Clear (); var random = new Random (); var root = "/tmp/hyena-download-test-server"; try { Directory.Delete (root, true); } catch { } Directory.CreateDirectory (root); for (int i = 0; i < ResourceCount; i++) { var md5 = new MD5CryptoServiceProvider (); var resource = new Resource () { Path = Path.Combine (root, i.ToString ()), Length = random.Next (MinResourceSize, MaxResourceSize + 1) }; if (Debug) Console.WriteLine (); using (var stream = File.OpenWrite (resource.Path)) { var buffer = new byte[32 << 10]; long written = 0; long remaining; while ((remaining = resource.Length - written) > 0) { var buffer_length = remaining > buffer.Length ? (int)buffer.Length : (int)remaining; random.NextBytes (buffer); stream.Write (buffer, 0, buffer_length); written += buffer_length; md5.TransformBlock (buffer, 0, buffer_length, null, 0); if (Debug) Console.Write ("\rCreating resource: {0} ({1:0.00} MB): [{2}/{3}] {4:0.0}% ", resource.Path, resource.Length / 1024.0 / 1024.0, i + 1, ResourceCount, written / (double)resource.Length * 100.0); } md5.TransformFinalBlock (buffer, 0, 0); resource.Checksum = BitConverter.ToString (md5.Hash).Replace ("-", String.Empty).ToLower (); } resources.Add (resource); } } } } #endif f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Downloader/Tests/Tests.cs0000644000175000017500000000544511467745411024035 0ustar00rubenruben00000000000000// // Tests.cs // // Author: // Gabriel Burt // // Copyright (C) 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using System.IO; using System.Linq; using NUnit.Framework; using Hyena; namespace Hyena.Downloader.Tests { [TestFixture] public class Tests { [Test] public void SimpleDownload () { StartServer (); new HttpStringDownloader () { Uri = new Uri (server.BaseUrl), Finished = (d) => { Assert.IsTrue (d.State.Success); Assert.AreEqual (server.ResourceCount.ToString () + "\n", d.Content); } }.StartSync (); var f = new HttpFileDownloader () { Uri = new Uri (server.BaseUrl + "/1") }; f.FileFinished += (d) => { Assert.IsTrue (d.State.Success); var size = new System.IO.FileInfo (d.LocalPath).Length; Assert.IsTrue (size <= server.MaxResourceSize); Assert.IsTrue (size >= server.MinResourceSize); System.IO.File.Delete (d.LocalPath); }; f.StartSync (); } [Test] public void DownloadManager () { } private void StartServer () { server.Stop (); new System.Threading.Thread (server.Run).Start (); while (!server.IsServing) {} } private HttpTestServer server; [TestFixtureSetUp] public void Setup () { server = new HttpTestServer (); server.Debug = false; } [TestFixtureTearDown] public void Teardown () { server.Dispose (); } } } #endif f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Downloader/HttpDownloader.cs0000644000175000017500000002275711422536041024560 0ustar00rubenruben00000000000000// // HttpDownloader.cs // // Author: // Aaron Bockover // // Copyright 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.IO; using System.Net; using System.Threading; namespace Hyena.Downloader { public class HttpDownloader { private object sync_root = new object (); protected object SyncRoot { get { return sync_root; } } private HttpWebRequest request; private HttpWebResponse response; private Stream response_stream; private DateTime last_raised_percent_complete; private IAsyncResult async_begin_result; private ManualResetEvent sync_event; public string UserAgent { get; set; } public Uri Uri { get; set; } public TimeSpan ProgressEventRaiseLimit { get; set; } public HttpDownloaderState State { get; private set; } public string [] AcceptContentTypes { get; set; } private int buffer_size = 8192; public int BufferSize { get { return buffer_size; } set { if (value <= 0) { throw new InvalidOperationException ("Invalid buffer size"); } buffer_size = value; } } private string name; public string Name { get { return name ?? Path.GetFileName (Uri.UnescapeDataString (Uri.LocalPath)); } set { name = value; } } public event Action Started; public event Action Finished; public event Action Progress; public event Action BufferUpdated; public HttpDownloader () { ProgressEventRaiseLimit = TimeSpan.FromSeconds (0.25); } public void StartSync () { sync_event = new ManualResetEvent (false); Start (); sync_event.WaitOne (); sync_event = null; } public void Start () { lock (SyncRoot) { if (request != null || async_begin_result != null) { throw new InvalidOperationException ("HttpDownloader is already active"); } State = new HttpDownloaderState () { Buffer = new Buffer () { Data = new byte[BufferSize] } }; request = CreateRequest (); async_begin_result = request.BeginGetResponse (OnRequestResponse, this); State.StartTime = DateTime.Now; State.Working = true; OnStarted (); } } public void Abort () { lock (SyncRoot) { Close (); OnFinished (); } } private void Close () { lock (SyncRoot) { State.FinishTime = DateTime.Now; State.Working = false; if (response_stream != null) { response_stream.Close (); } if (response != null) { response.Close (); } response_stream = null; response = null; request = null; } } protected virtual HttpWebRequest CreateRequest () { var request = (HttpWebRequest)WebRequest.Create (Uri); request.Method = "GET"; request.AllowAutoRedirect = true; request.UserAgent = UserAgent; request.Timeout = 10000; return request; } private void OnRequestResponse (IAsyncResult asyncResult) { lock (SyncRoot) { async_begin_result = null; if (request == null) { return; } var raise = false; try { response = (HttpWebResponse)request.EndGetResponse (asyncResult); if (response.StatusCode != HttpStatusCode.OK) { State.Success = false; raise = true; return; } else if (AcceptContentTypes != null) { var accepted = false; foreach (var type in AcceptContentTypes) { if (type == response.ContentType) { accepted = true; break; } } if (!accepted) { throw new WebException ("Invalid content type: " + response.ContentType + "; expected one of: " + String.Join (", ", AcceptContentTypes)); } } State.ContentType = response.ContentType; State.CharacterSet = response.CharacterSet; State.TotalBytesExpected = response.ContentLength; response_stream = response.GetResponseStream (); async_begin_result = response_stream.BeginRead (State.Buffer.Data, 0, State.Buffer.Data.Length, OnResponseRead, this); } catch (Exception e) { State.FailureException = e; State.Success = false; raise = true; } finally { if (raise) { Close (); OnFinished (); } } } } private void OnResponseRead (IAsyncResult asyncResult) { lock (SyncRoot) { async_begin_result = null; if (request == null || response == null || response_stream == null) { return; } try { var now = DateTime.Now; State.Buffer.Length = response_stream.EndRead (asyncResult); State.Buffer.TimeStamp = now; State.TotalBytesRead += State.Buffer.Length; State.TransferRate = State.TotalBytesRead / (now - State.StartTime).TotalSeconds; State.PercentComplete = (double)State.TotalBytesRead / (double)State.TotalBytesExpected; OnBufferUpdated (); if (State.Buffer.Length <= 0) { State.Success = true; Close (); OnFinished (); return; } if (State.PercentComplete >= 1 || last_raised_percent_complete == DateTime.MinValue || (now - last_raised_percent_complete >= ProgressEventRaiseLimit)) { last_raised_percent_complete = now; OnProgress (); } async_begin_result = response_stream.BeginRead (State.Buffer.Data, 0, State.Buffer.Data.Length, OnResponseRead, this); } catch (Exception e) { State.FailureException = e; State.Success = false; Close (); OnFinished (); } } } protected virtual void OnStarted () { var handler = Started; if (handler != null) { handler (this); } } protected virtual void OnBufferUpdated () { var handler = BufferUpdated; if (handler != null) { handler (this); } } protected virtual void OnProgress () { var handler = Progress; if (handler != null) { handler (this); } } protected virtual void OnFinished () { var handler = Finished; if (handler != null) { try { handler (this); } catch (Exception e) { Log.Exception (String.Format ("HttpDownloader.Finished handler ({0})", Uri), e); } } if (sync_event != null) { sync_event.Set (); } } public override string ToString () { return Name; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Downloader/HttpStringDownloader.cs0000644000175000017500000000500011422536041025725 0ustar00rubenruben00000000000000// // HttpStringDownloader.cs // // Author: // Aaron Bockover // // Copyright 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Text; namespace Hyena.Downloader { public class HttpStringDownloader : HttpDownloader { private Encoding detected_encoding; public string Content { get; private set; } public Encoding Encoding { get; set; } public new Action Finished { get; set; } protected override void OnBufferUpdated () { var default_encoding = Encoding.UTF8; if (detected_encoding == null && !String.IsNullOrEmpty (State.CharacterSet)) { try { detected_encoding = Encoding.GetEncoding (State.CharacterSet); } catch { } } if (detected_encoding == null) { detected_encoding = default_encoding; } Content += (Encoding ?? detected_encoding).GetString (State.Buffer.Data, 0, State.Buffer.Length); } protected override void OnFinished () { var handler = Finished; if (handler != null) { try { handler (this); } catch (Exception e) { Log.Exception (String.Format ("HttpStringDownloader.Finished handler ({0})", Uri), e); } } base.OnFinished (); } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Downloader/Buffer.cs0000644000175000017500000000257311420634720023026 0ustar00rubenruben00000000000000// // Buffer.cs // // Author: // Aaron Bockover // // Copyright 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Hyena.Downloader { public class Buffer { public int Length { get; set; } public DateTime TimeStamp { get; set; } public byte [] Data { get; set; } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Downloader/HttpFileDownloader.cs0000644000175000017500000000575711422536041025361 0ustar00rubenruben00000000000000// // HttpFileDownloader.cs // // Author: // Aaron Bockover // // Copyright 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.IO; namespace Hyena.Downloader { public class HttpFileDownloader : HttpDownloader { private FileStream file_stream; public string TempPathRoot { get; set; } public string FileExtension { get; set; } public string LocalPath { get; private set; } public event Action FileFinished; public HttpFileDownloader () { TempPathRoot = System.IO.Path.GetTempPath (); } protected override void OnStarted () { Directory.CreateDirectory (TempPathRoot); LocalPath = Path.Combine (TempPathRoot, CryptoUtil.Md5Encode (Uri.AbsoluteUri)); if (!String.IsNullOrEmpty (FileExtension)) { LocalPath += "." + FileExtension; } base.OnStarted (); } protected override void OnBufferUpdated () { if (file_stream == null) { file_stream = new FileStream (LocalPath, FileMode.Create, FileAccess.Write); } file_stream.Write (State.Buffer.Data, 0, (int)State.Buffer.Length); base.OnBufferUpdated (); } protected override void OnFinished () { if (file_stream != null) { try { file_stream.Close (); file_stream = null; OnFileFinished (); } catch (Exception e) { Log.Exception (String.Format ("HttpFileDownloader.OnFinished ({0})", Uri), e); } } base.OnFinished (); } protected virtual void OnFileFinished () { var handler = FileFinished; if (handler != null) { handler (this); } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Downloader/HttpDownloaderState.cs0000644000175000017500000000447411467745411025571 0ustar00rubenruben00000000000000// // HttpDownloaderState.cs // // Author: // Aaron Bockover // // Copyright 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Hyena.Downloader { public class HttpDownloaderState { public DateTime StartTime { get; internal set; } public DateTime FinishTime { get; internal set; } public double PercentComplete { get; internal set; } public double TransferRate { get; internal set; } public Buffer Buffer { get; internal set; } public long TotalBytesRead { get; internal set; } public long TotalBytesExpected { get; internal set; } public bool Success { get; internal set; } public bool Working { get; internal set; } public string ContentType { get; internal set; } public string CharacterSet { get; internal set; } public Exception FailureException { get; internal set; } public override string ToString () { if (Working) { return String.Format ("HttpDownloaderState: working ({0}% complete)", PercentComplete * 100.0); } else { return String.Format ("HttpDownloaderState: finished, {0}", Success ? "successful" : "error: " + FailureException.Message); } } } } f-spot-0.8.2/lib/Hyena/Hyena/Hyena.Downloader/DownloadManager.cs0000644000175000017500000001104311467745411024662 0ustar00rubenruben00000000000000// // DownloadManager.cs // // Author: // Aaron Bockover // // Copyright 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Collections.Generic; namespace Hyena.Downloader { public class DownloadManager { private object sync_root = new object (); internal object SyncRoot { get { return sync_root; } } private Queue pending_downloaders = new Queue (); private List active_downloaders = new List (); protected Queue PendingDownloaders { get { return pending_downloaders; } } internal List ActiveDownloaders { get { return active_downloaders; } } public event Action Started; public event Action Finished; public event Action Progress; public event Action BufferUpdated; public int MaxConcurrentDownloaders { get; set; } public int PendingDownloadCount { get { return pending_downloaders.Count; } } public int ActiveDownloadCount { get { return active_downloaders.Count; } } public int TotalDownloadCount { get { return PendingDownloadCount + ActiveDownloadCount; } } public DownloadManager () { MaxConcurrentDownloaders = 2; } public void QueueDownloader (HttpDownloader downloader) { lock (SyncRoot) { pending_downloaders.Enqueue (downloader); Update (); } } public void WaitUntilFinished () { while (TotalDownloadCount > 0); } private void Update () { lock (SyncRoot) { while (pending_downloaders.Count > 0 && active_downloaders.Count < MaxConcurrentDownloaders) { var downloader = pending_downloaders.Peek (); downloader.Started += OnDownloaderStarted; downloader.Finished += OnDownloaderFinished; downloader.Progress += OnDownloaderProgress; downloader.BufferUpdated += OnDownloaderBufferUpdated; active_downloaders.Add (downloader); pending_downloaders.Dequeue (); downloader.Start (); } } } protected virtual void OnDownloaderStarted (HttpDownloader downloader) { var handler = Started; if (handler != null) { handler (downloader); } } protected virtual void OnDownloaderFinished (HttpDownloader downloader) { lock (SyncRoot) { active_downloaders.Remove (downloader); Update (); } var handler = Finished; if (handler != null) { handler (downloader); } } protected virtual void OnDownloaderProgress (HttpDownloader downloader) { var handler = Progress; if (handler != null) { handler (downloader); } } protected virtual void OnDownloaderBufferUpdated (HttpDownloader downloader) { var handler = BufferUpdated; if (handler != null) { handler (downloader); } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/0000777000175000017500000000000011503407413016644 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/0000777000175000017500000000000011503407413021315 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/SmoothScrolledWindow.cs0000644000175000017500000001076711420634720026005 0ustar00rubenruben00000000000000// SmoothScrolledWindow.cs // // Copyright (c) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using Gdk; using Gtk; using Hyena.Gui.Theatrics; namespace Hyena.Widgets { public class SmoothScrolledWindow : Gtk.ScrolledWindow { private bool ignore_value_changed; private uint timeout; private double value; private double target_value; private double velocity = 0; private double Accelerate (double velocity) { return AccelerateCore (velocity); } private double Decelerate (double velocity) { return Math.Max (DecelerateCore (velocity), 0); } protected virtual double AccelerateCore (double velocity) { return velocity + 8; } protected virtual double DecelerateCore (double velocity) { return velocity - Math.Max (3, 0.2 * velocity); } private double TargetValue { get { return target_value; } set { if (value == target_value) { return; } target_value = value; if (timeout == 0) { timeout = GLib.Timeout.Add (20, OnTimeout); } } } // Smoothly get us to the target value private bool OnTimeout () { double delta = target_value - value; if (delta == 0) { velocity = 0; timeout = 0; return false; } int sign = Math.Sign (delta); delta = Math.Abs (delta); double hypothetical = delta; double v = Accelerate (velocity); while (v > 0 && hypothetical > 0) { hypothetical -= v; v = Decelerate (v); } velocity = hypothetical <= 0 ? Decelerate (velocity) : Accelerate (velocity); // Minimum speed: 2 px / 20 ms = 100px / second value = Math.Round (value + Math.Max (velocity, 2) * sign); // Don't go past the target value value = (sign == 1) ? Math.Min (value, target_value) : Math.Max (value, target_value); ignore_value_changed = true; Vadjustment.Value = Math.Round (value); ignore_value_changed = false; return true; } protected override bool OnScrollEvent (Gdk.EventScroll evnt) { switch (evnt.Direction) { case ScrollDirection.Up: TargetValue = Math.Max (TargetValue - Vadjustment.StepIncrement, 0); break; case ScrollDirection.Down: TargetValue = Math.Min (TargetValue + Vadjustment.StepIncrement, Vadjustment.Upper - Vadjustment.PageSize); break; default: return base.OnScrollEvent (evnt); } return true; } protected override void OnRealized () { base.OnRealized (); Vadjustment.ValueChanged += OnValueChanged; } protected override void OnUnrealized () { Vadjustment.ValueChanged -= OnValueChanged; base.OnUnrealized (); } private void OnValueChanged (object o, EventArgs args) { if (!ignore_value_changed) { value = target_value = Vadjustment.Value; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/MessageBar.cs0000644000175000017500000001340111420634720023651 0ustar00rubenruben00000000000000// // MessageBar.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; using Hyena.Gui; using Hyena.Gui.Theming; namespace Hyena.Widgets { public class MessageBar : Alignment { private HBox box; private HBox button_box; private AnimatedImage image; private WrapLabel label; private Button close_button; private Window win; private Theme theme; public event EventHandler CloseClicked { add { close_button.Clicked += value; } remove { close_button.Clicked -= value; } } public MessageBar () : base (0.0f, 0.5f, 1.0f, 0.0f) { win = new Window (WindowType.Popup); win.Name = "gtk-tooltips"; win.EnsureStyle (); win.StyleSet += delegate { Style = win.Style; }; HBox shell_box = new HBox (); shell_box.Spacing = 10; box = new HBox (); box.Spacing = 10; image = new AnimatedImage (); try { image.Pixbuf = Gtk.IconTheme.Default.LoadIcon ("process-working", 22, IconLookupFlags.NoSvg); image.FrameHeight = 22; image.FrameWidth = 22; Spinning = false; image.Load (); } catch { } label = new WrapLabel (); label.Show (); box.PackStart (image, false, false, 0); box.PackStart (label, true, true, 0); box.Show (); button_box = new HBox (); button_box.Spacing = 3; close_button = new Button (new Image (Stock.Close, IconSize.Menu)); close_button.Relief = ReliefStyle.None; close_button.Clicked += delegate { Hide (); }; close_button.ShowAll (); close_button.Hide (); shell_box.PackStart (box, true, true, 0); shell_box.PackStart (button_box, false, false, 0); shell_box.PackStart (close_button, false, false, 0); shell_box.Show (); Add (shell_box); EnsureStyle (); BorderWidth = 3; } protected override void OnShown () { base.OnShown (); image.Show (); } protected override void OnHidden () { base.OnHidden (); image.Hide (); } protected override void OnRealized () { base.OnRealized (); theme = Hyena.Gui.Theming.ThemeEngine.CreateTheme (this); } protected override void OnSizeAllocated (Gdk.Rectangle allocation) { base.OnSizeAllocated (allocation); QueueDraw (); } protected override bool OnExposeEvent (Gdk.EventExpose evnt) { if (!IsDrawable) { return false; } Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window); try { Gdk.Color color = Style.Background (StateType.Normal); theme.DrawFrame (cr, Allocation, CairoExtensions.GdkColorToCairoColor (color)); return base.OnExposeEvent (evnt); } finally { CairoExtensions.DisposeContext (cr); } } private bool changing_style = false; protected override void OnStyleSet (Gtk.Style previousStyle) { if (changing_style) { return; } changing_style = true; Style = win.Style; label.Style = Style; changing_style = false; } public void RemoveButton (Button button) { button_box.Remove (button); } public void ClearButtons () { foreach (Widget child in button_box.Children) { button_box.Remove (child); } } public void AddButton (Button button) { button_box.Show (); button.Show (); button_box.PackStart (button, false, false, 0); } public bool ShowCloseButton { set { close_button.Visible = value; QueueDraw (); } } public string Message { set { label.Markup = value; QueueDraw (); } } public Gdk.Pixbuf Pixbuf { set { image.InactivePixbuf = value; QueueDraw (); } } public bool Spinning { get { return image.Active; } set { image.Active = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/TextViewEditable.cs0000644000175000017500000001173011420634720025054 0ustar00rubenruben00000000000000// // TextViewEditable.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; namespace Hyena.Widgets { public class TextViewEditable : TextView, Editable { public TextViewEditable () { Buffer.Changed += OnBufferChanged; Buffer.InsertText += OnBufferInsertText; Buffer.DeleteRange += OnBufferDeleteRange; } public event EventHandler Changed; public event TextDeletedHandler TextDeleted; public event TextInsertedHandler TextInserted; private void OnBufferChanged (object o, EventArgs args) { EventHandler handler = Changed; if (handler != null) { handler (this, EventArgs.Empty); } } private void OnBufferInsertText (object o, InsertTextArgs args) { TextInsertedHandler handler = TextInserted; if (handler != null) { TextInsertedArgs raise_args = new TextInsertedArgs (); raise_args.Args = new object [] { args.Text, args.Length, args.Pos.Offset }; handler (this, raise_args); } } private void OnBufferDeleteRange (object o, DeleteRangeArgs args) { TextDeletedHandler handler = TextDeleted; if (handler != null) { TextDeletedArgs raise_args = new TextDeletedArgs (); raise_args.Args = new object [] { args.Start.Offset, args.End.Offset }; handler (this, raise_args); } } void Editable.PasteClipboard () { } void Editable.CutClipboard () { } void Editable.CopyClipboard () { } public void DeleteText (int start_pos, int end_pos) { start_pos--; end_pos--; TextIter start_iter = Buffer.GetIterAtOffset (start_pos); TextIter end_iter = Buffer.GetIterAtOffset (start_pos + (end_pos - start_pos)); Buffer.Delete (ref start_iter, ref end_iter); } public void InsertText (string new_text, ref int position) { TextIter iter = Buffer.GetIterAtOffset (position - 1); Buffer.Insert (ref iter, new_text); position = iter.Offset + 1; } public string GetChars (int start_pos, int end_pos) { start_pos--; end_pos--; TextIter start_iter = Buffer.GetIterAtOffset (start_pos); TextIter end_iter = Buffer.GetIterAtOffset (start_pos + (end_pos - start_pos)); return Buffer.GetText (start_iter, end_iter, true); } public void SelectRegion (int start, int end) { Buffer.SelectRange (Buffer.GetIterAtOffset (start - 1), Buffer.GetIterAtOffset (end - 1)); } public bool GetSelectionBounds (out int start, out int end) { TextIter start_iter, end_iter; start = 0; end = 0; if (Buffer.GetSelectionBounds (out start_iter, out end_iter)) { start = start_iter.Offset + 1; end = end_iter.Offset + 1; return true; } return true; } public void DeleteSelection () { TextIter start, end; if (Buffer.GetSelectionBounds (out start, out end)) { Buffer.Delete (ref start, ref end); } } public int Position { get { return Buffer.CursorPosition; } set { Buffer.PlaceCursor (Buffer.GetIterAtOffset (Position)); } } public bool IsEditable { get { return Editable; } set { Editable = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/AnimatedImage.cs0000644000175000017500000001317111420634720024331 0ustar00rubenruben00000000000000// // AnimatedImage.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; using Hyena.Gui; using Hyena.Gui.Theatrics; namespace Hyena.Widgets { public class AnimatedImage : Image { private Gdk.Pixbuf pixbuf; private Gdk.Pixbuf inactive_pixbuf; private Gdk.Pixbuf [] frames; private int frame_width; private int frame_height; private int max_frames; private bool active_frozen; private SingleActorStage stage = new SingleActorStage (); public AnimatedImage () { stage.Iteration += OnIteration; stage.Reset (); stage.Actor.CanExpire = false; } protected override void OnShown () { base.OnShown (); if (active_frozen && !stage.Playing) { stage.Play (); } } protected override void OnHidden () { base.OnHidden (); active_frozen = Active; if (stage.Playing) { stage.Pause (); } } protected override void OnSizeAllocated (Gdk.Rectangle allocation) { if (allocation != Allocation) { base.OnSizeAllocated (allocation); } } public void Load () { ExtractFrames (); base.Pixbuf = frames[0]; } private void OnIteration (object o, EventArgs args) { if (!Visible) { return; } if (frames == null || frames.Length == 0) { return; } else if (frames.Length == 1) { base.Pixbuf = frames[0]; return; } // The first frame is the idle frame, so skip it when animating int index = (int)Math.Round ((double)(frames.Length - 2) * stage.Actor.Percent) + 1; if (base.Pixbuf != frames[index]) { base.Pixbuf = frames[index]; } } private void ExtractFrames () { if (pixbuf == null) { throw new ApplicationException ("No source pixbuf specified"); } else if (pixbuf.Width % frame_width != 0 || pixbuf.Height % frame_height != 0) { throw new ApplicationException ("Invalid frame dimensions"); } int rows = pixbuf.Height / frame_height; int cols = pixbuf.Width / frame_width; int frame_count = rows * cols; frames = new Gdk.Pixbuf[max_frames > 0 ? max_frames : frame_count]; for (int y = 0, n = 0; y < rows; y++) { for (int x = 0; x < cols; x++, n++) { frames[n] = new Gdk.Pixbuf (pixbuf, x * frame_width, y * frame_height, frame_width, frame_height); if (max_frames > 0 && n >= max_frames - 1) { return; } } } } public bool Active { get { return !Visible ? active_frozen : stage.Playing; } set { if (value) { active_frozen = true; if (Visible) { stage.Play (); } } else { active_frozen = false; if (stage.Playing) { stage.Pause (); } if (inactive_pixbuf != null) { base.Pixbuf = inactive_pixbuf; } else if (frames != null && frames.Length > 1) { base.Pixbuf = frames[0]; } else { base.Pixbuf = null; } } } } public int FrameWidth { get { return frame_width; } set { frame_width = value; } } public int FrameHeight { get { return frame_height; } set { frame_height = value; } } public int MaxFrames { get { return max_frames; } set { max_frames = value; } } public new Gdk.Pixbuf Pixbuf { get { return pixbuf; } set { pixbuf = value; } } public Gdk.Pixbuf InactivePixbuf { get { return inactive_pixbuf; } set { inactive_pixbuf = value; if (!Active) { base.Pixbuf = value; } } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/AnimatedWidget.cs0000644000175000017500000001453011420634720024532 0ustar00rubenruben00000000000000// // AnimatedVboxActor.cs // // Authors: // Scott Peterson // // Copyright (C) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using Gdk; using Gtk; using Hyena.Gui.Theatrics; namespace Hyena.Widgets { internal enum AnimationState { Coming, Idle, IntendingToGo, Going } internal class AnimatedWidget : Container { public event EventHandler WidgetDestroyed; public Widget Widget; public Easing Easing; public Blocking Blocking; public AnimationState AnimationState; public uint Duration; public double Bias = 1.0; public int Width; public int Height; public int StartPadding; public int EndPadding; public LinkedListNode Node; private readonly bool horizontal; private double percent; private Rectangle widget_alloc; private Pixmap canvas; public AnimatedWidget (Widget widget, uint duration, Easing easing, Blocking blocking, bool horizontal) { this.horizontal = horizontal; Widget = widget; Duration = duration; Easing = easing; Blocking = blocking; AnimationState = AnimationState.Coming; Widget.Parent = this; Widget.Destroyed += OnWidgetDestroyed; ShowAll (); } protected AnimatedWidget (IntPtr raw) : base (raw) { } public double Percent { get { return percent; } set { percent = value * Bias; QueueResizeNoRedraw (); } } private void OnWidgetDestroyed (object sender, EventArgs args) { if (!IsRealized) { return; } canvas = new Pixmap (GdkWindow, widget_alloc.Width, widget_alloc.Height); canvas.DrawDrawable (Style.BackgroundGC (State), GdkWindow, widget_alloc.X, widget_alloc.Y, 0, 0, widget_alloc.Width, widget_alloc.Height); if (AnimationState != AnimationState.Going) { WidgetDestroyed (this, args); } } #region Overrides protected override void OnRemoved (Widget widget) { if (widget == Widget) { widget.Unparent (); Widget = null; } } protected override void OnRealized () { WidgetFlags |= WidgetFlags.Realized; Gdk.WindowAttr attributes = new Gdk.WindowAttr (); attributes.WindowType = Gdk.WindowType.Child; attributes.Wclass = Gdk.WindowClass.InputOutput; attributes.EventMask = (int)Gdk.EventMask.ExposureMask; GdkWindow = new Gdk.Window (Parent.GdkWindow, attributes, 0); GdkWindow.UserData = Handle; GdkWindow.Background = Style.Background (State); Style.Attach (GdkWindow); } protected override void OnSizeRequested (ref Requisition requisition) { if (Widget != null) { Requisition req = Widget.SizeRequest (); widget_alloc.Width = req.Width; widget_alloc.Height = req.Height; } if (horizontal) { Width = Choreographer.PixelCompose (percent, widget_alloc.Width + StartPadding + EndPadding, Easing); Height = widget_alloc.Height; } else { Width = widget_alloc.Width; Height = Choreographer.PixelCompose (percent, widget_alloc.Height + StartPadding + EndPadding, Easing); } requisition.Width = Width; requisition.Height = Height; } protected override void OnSizeAllocated (Rectangle allocation) { base.OnSizeAllocated (allocation); if (Widget != null) { if (horizontal) { widget_alloc.Height = allocation.Height; widget_alloc.X = StartPadding; if (Blocking == Blocking.Downstage) { widget_alloc.X += allocation.Width - widget_alloc.Width; } } else { widget_alloc.Width = allocation.Width; widget_alloc.Y = StartPadding; if (Blocking == Blocking.Downstage) { widget_alloc.Y = allocation.Height - widget_alloc.Height; } } if (widget_alloc.Height > 0 && widget_alloc.Width > 0) { Widget.SizeAllocate (widget_alloc); } } } protected override bool OnExposeEvent (EventExpose evnt) { if (canvas != null) { GdkWindow.DrawDrawable (Style.BackgroundGC (State), canvas, 0, 0, widget_alloc.X, widget_alloc.Y, widget_alloc.Width, widget_alloc.Height); return true; } else { return base.OnExposeEvent (evnt); } } protected override void ForAll (bool include_internals, Callback callback) { if (Widget != null) { callback (Widget); } } #endregion } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/AnimatedHBox.cs0000644000175000017500000000267511420634720024156 0ustar00rubenruben00000000000000// // AnimatedHBox.cs // // Authors: // Scott Peterson // // Copyright (C) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gdk; using Gtk; namespace Hyena.Widgets { public class AnimatedHBox : AnimatedBox { public AnimatedHBox () : base (true) { } protected AnimatedHBox (IntPtr raw) : base (raw) { } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/RoundedFrame.cs0000644000175000017500000001446411420634720024225 0ustar00rubenruben00000000000000// // RoundedFrame.cs // // Authors: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; using Cairo; using Hyena.Gui; using Hyena.Gui.Theming; namespace Hyena.Widgets { public class RoundedFrame : Bin { private Theme theme; protected Theme Theme { get { return theme; } } private Widget child; private Gdk.Rectangle child_allocation; private bool fill_color_set; private Cairo.Color fill_color; private bool draw_border = true; private Pattern fill_pattern; private int frame_width; // Ugh, this is to avoid the GLib.MissingIntPtrCtorException seen by some; BGO #552169 protected RoundedFrame (IntPtr ptr) : base (ptr) { } public RoundedFrame () { } public void SetFillColor (Cairo.Color color) { fill_color = color; fill_color_set = true; QueueDraw (); } public void UnsetFillColor () { fill_color_set = false; QueueDraw (); } public Pattern FillPattern { get { return fill_pattern; } set { fill_pattern = value; QueueDraw (); } } public bool DrawBorder { get { return draw_border; } set { draw_border = value; QueueDraw (); } } #region Gtk.Widget Overrides protected override void OnStyleSet (Style previous_style) { base.OnStyleSet (previous_style); theme = Hyena.Gui.Theming.ThemeEngine.CreateTheme (this); frame_width = (int)theme.Context.Radius + 1; } protected override void OnSizeRequested (ref Requisition requisition) { if (child != null && child.Visible) { // Add the child's width/height Requisition child_requisition = child.SizeRequest (); requisition.Width = Math.Max (0, child_requisition.Width); requisition.Height = child_requisition.Height; } else { requisition.Width = 0; requisition.Height = 0; } // Add the frame border requisition.Width += ((int)BorderWidth + frame_width) * 2; requisition.Height += ((int)BorderWidth + frame_width) * 2; } protected override void OnSizeAllocated (Gdk.Rectangle allocation) { base.OnSizeAllocated (allocation); child_allocation = new Gdk.Rectangle (); if (child == null || !child.Visible) { return; } child_allocation.X = (int)BorderWidth + frame_width; child_allocation.Y = (int)BorderWidth + frame_width; child_allocation.Width = (int)Math.Max (1, Allocation.Width - child_allocation.X * 2); child_allocation.Height = (int)Math.Max (1, Allocation.Height - child_allocation.Y - (int)BorderWidth - frame_width); child_allocation.X += Allocation.X; child_allocation.Y += Allocation.Y; child.SizeAllocate (child_allocation); } protected override void OnSetScrollAdjustments (Adjustment hadj, Adjustment vadj) { // This is to satisfy the gtk_widget_set_scroll_adjustments // inside of GtkScrolledWindow so it doesn't complain about // its child not being scrollable. } protected override bool OnExposeEvent (Gdk.EventExpose evnt) { if (!IsDrawable) { return false; } Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window); try { DrawFrame (cr, evnt.Area); if (child != null) { PropagateExpose (child, evnt); } return false; } finally { CairoExtensions.DisposeContext (cr); } } private void DrawFrame (Cairo.Context cr, Gdk.Rectangle clip) { int x = child_allocation.X - frame_width; int y = child_allocation.Y - frame_width; int width = child_allocation.Width + 2 * frame_width; int height = child_allocation.Height + 2 * frame_width; Gdk.Rectangle rect = new Gdk.Rectangle (x, y, width, height); theme.Context.ShowStroke = draw_border; if (fill_color_set) { theme.DrawFrameBackground (cr, rect, fill_color); } else if (fill_pattern != null) { theme.DrawFrameBackground (cr, rect, fill_pattern); } else { theme.DrawFrameBackground (cr, rect, true); theme.DrawFrameBorder (cr, rect); } } #endregion #region Gtk.Container Overrides protected override void OnAdded (Widget widget) { child = widget; base.OnAdded (widget); } protected override void OnRemoved (Widget widget) { if (child == widget) { child = null; } base.OnRemoved (widget); } #endregion } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/EntryPopup.cs0000644000175000017500000001717011420634720023774 0ustar00rubenruben00000000000000// // EntryPopup.cs // // Author: // Neil Loknath // // Copyright (C) 2009 Neil Loknath // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Timers; using Gdk; using Gtk; namespace Hyena.Widgets { public class EntryPopup : Gtk.Window { private Entry text_entry; private HBox hbox; private uint timeout_id = 0; public event EventHandler Changed; public event EventHandler KeyPressed; public EntryPopup (string text) : this () { Text = text; } public EntryPopup () : base (Gtk.WindowType.Popup) { CanFocus = true; Resizable = false; TypeHint = Gdk.WindowTypeHint.Utility; Modal = true; Frame frame = new Frame (); frame.Shadow = ShadowType.EtchedIn; Add (frame); hbox = new HBox () { Spacing = 6 }; text_entry = new Entry(); hbox.PackStart (text_entry, true, true, 0); hbox.BorderWidth = 3; frame.Add (hbox); frame.ShowAll (); text_entry.Text = String.Empty; text_entry.CanFocus = true; //TODO figure out why this event does not get raised text_entry.FocusOutEvent += (o, a) => { if (hide_when_focus_lost) { HidePopup (); } }; text_entry.KeyReleaseEvent += delegate (object o, KeyReleaseEventArgs args) { if (args.Event.Key == Gdk.Key.Escape || args.Event.Key == Gdk.Key.Return || args.Event.Key == Gdk.Key.Tab) { HidePopup (); } InitializeDelayedHide (); }; text_entry.KeyPressEvent += (o, a) => OnKeyPressed (a); text_entry.Changed += (o, a) => { if (GdkWindow.IsVisible) { OnChanged (a); } }; } public new bool HasFocus { get { return text_entry.HasFocus; } set { text_entry.HasFocus = value; } } public string Text { get { return text_entry.Text; } set { text_entry.Text = value; } } public Entry Entry { get { return text_entry; } } public HBox Box { get { return hbox; } } private bool hide_after_timeout = true; public bool HideAfterTimeout { get { return hide_after_timeout; } set { hide_after_timeout = value; } } private uint timeout = 5000; public uint Timeout { get { return timeout; } set { timeout = value; } } private bool hide_when_focus_lost = true; public bool HideOnFocusOut { get { return hide_when_focus_lost; } set { hide_when_focus_lost = value; } } private bool reset_when_hiding = true; public bool ResetOnHide { get { return reset_when_hiding; } set { reset_when_hiding = value; } } public override void Dispose () { text_entry.Dispose (); base.Dispose (); } public new void GrabFocus () { text_entry.GrabFocus (); } public void Position (Gdk.Window eventWindow) { int x, y; int widget_x, widget_y; int widget_height, widget_width; Realize (); Gdk.Window widget_window = eventWindow; Gdk.Screen widget_screen = widget_window.Screen; Gtk.Requisition popup_req; widget_window.GetOrigin (out widget_x, out widget_y); widget_window.GetSize (out widget_width, out widget_height); popup_req = Requisition; if (widget_x + widget_width > widget_screen.Width) { x = widget_screen.Width - popup_req.Width; } else if (widget_x + widget_width - popup_req.Width < 0) { x = 0; } else { x = widget_x + widget_width - popup_req.Width; } if (widget_y + widget_height + popup_req.Height > widget_screen.Height) { y = widget_screen.Height - popup_req.Height; } else if (widget_y + widget_height < 0) { y = 0; } else { y = widget_y + widget_height; } Move (x, y); } private void ResetDelayedHide () { if (timeout_id > 0) { GLib.Source.Remove (timeout_id); timeout_id = 0; } } private void InitializeDelayedHide () { ResetDelayedHide (); timeout_id = GLib.Timeout.Add (timeout, delegate { HidePopup (); return false; }); } private void HidePopup () { ResetDelayedHide (); Hide (); if (reset_when_hiding) { text_entry.Text = String.Empty; } } protected virtual void OnChanged (EventArgs args) { var handler = Changed; if (handler != null) { handler (this, EventArgs.Empty); } } protected virtual void OnKeyPressed (KeyPressEventArgs args) { var handler = KeyPressed; if (handler != null) { handler (this, args); } } //TODO figure out why this event does not get raised protected override bool OnFocusOutEvent (Gdk.EventFocus evnt) { if (hide_when_focus_lost) { HidePopup (); return true; } return base.OnFocusOutEvent (evnt); } protected override bool OnExposeEvent (Gdk.EventExpose evnt) { InitializeDelayedHide (); return base.OnExposeEvent (evnt); } protected override bool OnButtonReleaseEvent (Gdk.EventButton evnt) { if (!text_entry.HasFocus && hide_when_focus_lost) { HidePopup (); return true; } return base.OnButtonReleaseEvent (evnt); } protected override bool OnButtonPressEvent (Gdk.EventButton evnt) { if (!text_entry.HasFocus && hide_when_focus_lost) { HidePopup (); return true; } return base.OnButtonPressEvent (evnt); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/SimpleTable.cs0000644000175000017500000000660111420634720024045 0ustar00rubenruben00000000000000// // SimpleTable.cs // // Author: // Gabriel Burt // // Copyright (C) 2009 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using Gtk; namespace Hyena.Widgets { public class SimpleTable : Table { private bool added_any; private List items = new List (); private Dictionary item_widgets = new Dictionary (); public SimpleTable () : base (1, 2, false) { ColumnSpacing = 5; RowSpacing = 5; } public void AddRow (T item, params Widget [] cols) { InsertRow (item, (uint)items.Count, cols); } public void InsertRow (T item, uint row, params Widget [] cols) { if (!added_any) { added_any = true; } else if (NColumns != cols.Length) { throw new ArgumentException ("cols", String.Format ("Expected {0} column widgets, same as previous calls to Add", NColumns)); } Resize ((uint) items.Count + 1, (uint) cols.Length); for (int y = items.Count - 1; y >= row; y--) { for (uint x = 0; x < NColumns; x++) { var widget = item_widgets[items[y]][x]; Remove (widget); Attach (widget, x, x + 1, (uint) y + 1, (uint) y + 2); } } items.Insert ((int)row, item); item_widgets[item] = cols; for (uint x = 0; x < NColumns; x++) { Attach (cols[x], x, x + 1, row, row + 1); } } public void RemoveRow (T item) { FreezeChildNotify (); foreach (var widget in item_widgets[item]) { Remove (widget); } int index = items.IndexOf (item); for (int y = index + 1; y < items.Count; y++) { for (uint x = 0; x < NColumns; x++) { var widget = item_widgets[items[y]][x]; Remove (widget); Attach (widget, x, x + 1, (uint) y - 1, (uint) y); } } Resize ((uint) Math.Max (1, items.Count - 1), NColumns); ThawChildNotify (); items.Remove (item); item_widgets.Remove (item); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/RatingMenuItem.cs0000644000175000017500000000770711441732606024551 0ustar00rubenruben00000000000000// // RatingMenuItem.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; using Mono.Unix; using Hyena.Gui; namespace Hyena.Widgets { public class RatingMenuItem : ComplexMenuItem { private RatingEntry entry; private bool can_activate = true; private Box box; protected RatingMenuItem (RatingEntry entry) : base () { box = new HBox (); box.Spacing = 5; Label label = new Label (); label.Markup = String.Format ("{0}", GLib.Markup.EscapeText (Catalog.GetString ("Rating:"))); box.PackStart (label, false, false, 0); label.Show (); this.entry = entry; entry.HasFrame = false; entry.PreviewOnHover = true; entry.AlwaysShowEmptyStars = true; entry.Changed += OnEntryChanged; box.PackStart (entry, false, false, 0); box.ShowAll (); Add (box); } public RatingMenuItem () : this (new RatingEntry ()) { } protected RatingMenuItem (IntPtr raw) : base (raw) { } private int TransformX (double inx) { int x = (int)inx - entry.Allocation.X; if (x < 0) { x = 0; } else if (x > entry.Allocation.Width) { x = entry.Allocation.Width; } return x; } protected override bool OnButtonReleaseEvent (Gdk.EventButton evnt) { if (evnt.X == 0 && evnt.Y == 0) { return false; } entry.SetValueFromPosition (TransformX (evnt.X)); return true; } protected override bool OnMotionNotifyEvent (Gdk.EventMotion evnt) { return entry.HandleMotionNotify (evnt.State, TransformX (evnt.X)); } protected override bool OnLeaveNotifyEvent (Gdk.EventCrossing evnt) { return entry.HandleLeaveNotify (evnt); } protected override bool OnScrollEvent (Gdk.EventScroll evnt) { return entry.HandleScroll (evnt); } protected override bool OnKeyPressEvent (Gdk.EventKey evnt) { return entry.HandleKeyPress (evnt); } private void OnEntryChanged (object o, EventArgs args) { if (can_activate) { Activate (); } } public void Reset (int value) { can_activate = false; Value = value; entry.ClearHover (); can_activate = true; } public int Value { get { return entry.Value; } set { entry.Value = value; } } public RatingEntry RatingEntry { get { return entry; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/ComplexMenuItem.cs0000644000175000017500000001263711420634720024725 0ustar00rubenruben00000000000000// // ComplexMenuItem.cs // // Author: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; namespace Hyena.Widgets { public class ComplexMenuItem : MenuItem { private bool is_selected = false; public ComplexMenuItem() : base() { } protected ComplexMenuItem (IntPtr raw) : base (raw) { } // Override OnAdded and OnRemoved so we can work with Gtk.Action/Gtk.UIManager // which otherwise would try to replace our child with a Label. private bool first_add = true; protected override void OnAdded (Widget widget) { if (first_add) { first_add = false; base.OnAdded (widget); } } protected override void OnRemoved (Widget widget) { } protected void ConnectChildExpose(Widget widget) { widget.ExposeEvent += OnChildExposeEvent; } [GLib.ConnectBefore] private void OnChildExposeEvent(object o, ExposeEventArgs args) { // NOTE: This is a little insane, but it allows packing of EventBox based widgets // into a GtkMenuItem without breaking the theme (leaving an unstyled void in the item). // This method is called before the EventBox child does its drawing and the background // is filled in with the proper style. int x, y, width, height; Widget widget = (Widget)o; if(IsSelected) { x = Allocation.X - widget.Allocation.X; y = Allocation.Y - widget.Allocation.Y; width = Allocation.Width; height = Allocation.Height; ShadowType shadow_type = (ShadowType)StyleGetProperty("selected-shadow-type"); Gtk.Style.PaintBox(Style, widget.GdkWindow, StateType.Prelight, shadow_type, args.Event.Area, widget, "menuitem", x, y, width, height); } else { // Fill only the visible area in solid color, to be most efficient widget.GdkWindow.DrawRectangle(Parent.Style.BackgroundGC(StateType.Normal), true, 0, 0, widget.Allocation.Width, widget.Allocation.Height); // FIXME: The above should not be necessary, but Clearlooks-based themes apparently // don't provide any style for the menu background so we have to fill it first with // the correct theme color. Weak. // // Do a complete style paint based on the size of the entire menu to be compatible with // themes that provide a real style for "menu" x = Parent.Allocation.X - widget.Allocation.X; y = Parent.Allocation.Y - widget.Allocation.Y; width = Parent.Allocation.Width; height = Parent.Allocation.Height; Gtk.Style.PaintBox(Style, widget.GdkWindow, StateType.Normal, ShadowType.Out, args.Event.Area, widget, "menu", x, y, width, height); } } protected override void OnSelected() { base.OnSelected(); is_selected = true; } protected override void OnDeselected() { base.OnDeselected(); is_selected = false; } protected override void OnParentSet(Widget previous_parent) { if(previous_parent != null) { previous_parent.KeyPressEvent -= OnKeyPressEventProxy; } if(Parent != null) { Parent.KeyPressEvent += OnKeyPressEventProxy; } } [GLib.ConnectBefore] private void OnKeyPressEventProxy(object o, KeyPressEventArgs args) { if(!IsSelected) { return; } switch(args.Event.Key) { case Gdk.Key.Up: case Gdk.Key.Down: case Gdk.Key.Escape: return; } args.RetVal = OnKeyPressEvent(args.Event); } protected override bool OnKeyPressEvent(Gdk.EventKey evnt) { return false; } protected bool IsSelected { get { return is_selected; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/PulsingButton.cs0000644000175000017500000001012011420634720024450 0ustar00rubenruben00000000000000// // PulsingButton.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; using Hyena.Gui; using Hyena.Gui.Theatrics; namespace Hyena.Widgets { public class PulsingButton : Button { private static Stage default_stage; public static Stage DefaultStage { get { if (default_stage == null) { default_stage = new Stage (); default_stage.DefaultActorDuration = 1250; } return default_stage; } } private Pulsator pulsator = new Pulsator (); public Stage Stage { get { return pulsator.Stage; } set { pulsator.Stage = value; } } public PulsingButton () : base () { Setup (); } public PulsingButton (string stock_id) : base (stock_id) { Setup (); } public PulsingButton (Widget widget) : base (widget) { Setup (); } protected PulsingButton (IntPtr raw) : base (raw) { Setup (); } private void Setup () { Stage = DefaultStage; pulsator.Target = this; pulsator.Pulse += delegate { QueueDraw (); }; } protected override bool OnExposeEvent (Gdk.EventExpose evnt) { if (!pulsator.IsPulsing) { return base.OnExposeEvent (evnt); } Cairo.Context cr = Gdk.CairoHelper.Create (GdkWindow); double x = Allocation.X + Allocation.Width / 2; double y = Allocation.Y + Allocation.Height / 2; double r = Math.Min (Allocation.Width, Allocation.Height) / 2; double alpha = Choreographer.Compose (pulsator.Percent, Easing.Sine); Cairo.Color color = CairoExtensions.GdkColorToCairoColor (Style.Background (StateType.Selected)); Cairo.RadialGradient fill = new Cairo.RadialGradient (x, y, 0, x, y, r); color.A = alpha; fill.AddColorStop (0, color); fill.AddColorStop (0.5, color); color.A = 0; fill.AddColorStop (1, color); cr.Arc (x, y, r, 0, 2 * Math.PI); cr.Pattern = fill; cr.Fill (); fill.Destroy (); CairoExtensions.DisposeContext (cr); return base.OnExposeEvent (evnt); } public void StartPulsing () { if (IsMapped && Sensitive) { pulsator.StartPulsing (); } } public void StopPulsing () { pulsator.StopPulsing (); } protected override void OnStateChanged (StateType previous_state) { base.OnStateChanged (previous_state); if (State == StateType.Insensitive) { StopPulsing (); } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/AnimatedBox.cs0000644000175000017500000004332511420634720024043 0ustar00rubenruben00000000000000// // AnimatedBox.cs // // Authors: // Scott Peterson // // Copyright (C) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Collections.Generic; using Gdk; using Gtk; using Hyena.Gui.Theatrics; namespace Hyena.Widgets { public abstract class AnimatedBox : Container { private readonly Stage stage = new Stage (); private readonly LinkedList children = new LinkedList (); private readonly SingleActorStage border_stage = new Hyena.Gui.Theatrics.SingleActorStage (); private readonly bool horizontal; private uint duration = 500; private Easing easing = Easing.Linear; private Blocking blocking = Blocking.Upstage; private int start_padding; private int end_padding; private int spacing; private int start_spacing; private int end_spacing; private int active_count; private int start_border; private int end_border; private double border_bias; private Easing border_easing; private AnimationState border_state; protected AnimatedBox (bool horizontal) { WidgetFlags |= WidgetFlags.NoWindow; this.horizontal = horizontal; stage.ActorStep += OnActorStep; border_stage.Iteration += OnBorderIteration; } protected AnimatedBox (IntPtr raw) : base (raw) { } #region Private private double Percent { get { return border_stage.Actor.Percent * border_bias + (1.0 - border_bias); } } private bool OnActorStep (Actor actor) { switch (actor.Target.AnimationState) { case AnimationState.Coming: actor.Target.Percent = actor.Percent; if (actor.Expired) { actor.Target.AnimationState = AnimationState.Idle; return false; } break; case AnimationState.IntendingToGo: actor.Target.AnimationState = AnimationState.Going; actor.Target.Bias = actor.Percent; actor.Reset ((uint)(actor.Target.Duration * actor.Percent)); break; case AnimationState.Going: if (actor.Expired) { actor.Target.Unparent (); children.Remove (actor.Target.Node); return false; } else { actor.Target.Percent = 1.0 - actor.Percent; } break; } return true; } private void OnBorderIteration (object sender, EventArgs args) { if (border_stage.Actor == null) { if (border_state == AnimationState.Coming) { start_border = start_padding; end_border = end_padding; } else { start_border = end_border = 0; } border_state = AnimationState.Idle; } else { double percent = border_state == AnimationState.Coming ? Percent : 1.0 - Percent; start_border = Choreographer.PixelCompose (percent, start_padding, border_easing); end_border = Choreographer.PixelCompose (percent, end_padding, border_easing); } QueueResizeNoRedraw (); } private void OnWidgetDestroyed (object sender, EventArgs args) { RemoveCore ((AnimatedWidget)sender); } private void RecalculateSpacings () { int skip_count = 0; foreach (AnimatedWidget animated_widget in Widgets) { animated_widget.QueueResizeNoRedraw (); if (skip_count > 1) { skip_count--; continue; } AnimatedWidget widget = animated_widget; if (skip_count == 0) { widget.StartPadding = start_spacing; } else { skip_count--; } widget.EndPadding = end_spacing; if (widget.Node.Previous == null) { while (true) { widget.StartPadding = 0; if (widget.AnimationState == AnimationState.Coming || widget.AnimationState == AnimationState.Idle || widget.Node.Next == null) { break; } widget.EndPadding = spacing; widget = widget.Node.Next.Value; skip_count++; } } if (widget.Node.Next == null) { while (true) { widget.EndPadding = 0; if (widget.AnimationState == AnimationState.Coming || widget.AnimationState == AnimationState.Idle || widget.Node.Previous == null) { break; } widget.StartPadding = spacing; widget = widget.Node.Previous.Value; } } } } #endregion #region Protected Overrides protected override void OnAdded (Widget widget) { PackStart (widget, duration, easing, blocking); } protected override void OnSizeRequested (ref Requisition requisition) { int width = 0; int height = 0; if (horizontal) { width = start_border + end_border; } else { height = start_border + end_border; } foreach (AnimatedWidget widget in Widgets) { Requisition req = widget.SizeRequest (); if (horizontal) { width += req.Width; height = Math.Max (height, req.Height); } else { width = Math.Max (width, req.Width); height += req.Height; } } requisition.Width = width; requisition.Height = height; } protected override void OnSizeAllocated (Rectangle allocation) { base.OnSizeAllocated (allocation); if (horizontal) { allocation.X += start_border; allocation.Y += (int)BorderWidth; allocation.Height -= (int)BorderWidth * 2; } else { allocation.X += (int)BorderWidth; allocation.Y += start_border; allocation.Width -= (int)BorderWidth * 2; } foreach (AnimatedWidget widget in Widgets) { if (horizontal) { allocation.Width = widget.Width; widget.SizeAllocate (allocation); allocation.X += allocation.Width; } else { allocation.Height = widget.Height; widget.SizeAllocate (allocation); allocation.Y += allocation.Height; } } } protected override void ForAll (bool include_internals, Callback callback) { foreach (AnimatedWidget child in Widgets) { callback (child); } } #endregion #region Public #region Properties public uint Duration { get { return duration; } set { duration = value; } } public Easing Easing { get { return easing; } set { easing = value; } } public Blocking Blocking { get { return blocking; } set { blocking = value; } } public int Spacing { get { return spacing; } set { spacing = value; double half = (double)value / 2.0; start_spacing = (int)Math.Ceiling (half); end_spacing = (int)Math.Floor (half); } } public int StartPadding { get { return start_padding - (int)BorderWidth; } set { start_padding = value + (int)BorderWidth; } } public int EndPadding { get { return end_padding - (int)BorderWidth; } set { end_padding = value + (int)BorderWidth; } } internal IEnumerable Widgets { get { foreach (AnimatedWidget child in children) { yield return child; } } } #endregion #region Pack Methods public void PackStart (Widget widget) { PackStart (widget, duration, easing, blocking); } public void PackStart (Widget widget, uint duration) { PackStart (widget, duration, easing, blocking); } public void PackStart (Widget widget, Easing easing) { PackStart (widget, duration, easing, blocking); } public void PackStart (Widget widget, uint duration, Easing easing) { PackStart (widget, duration, easing, blocking); } public void PackStart (Widget widget, Blocking blocking) { PackStart (widget, duration, easing, blocking); } public void PackStart (Widget widget, uint duration, Blocking blocking) { PackStart (widget, duration, easing, blocking); } public void PackStart (Widget widget, Easing easing, Blocking blocking) { PackStart (widget, duration, easing, blocking); } public void PackStart (Widget widget, uint duration, Easing easing, Blocking blocking) { Pack (widget, duration, easing, blocking, false); } public void PackEnd (Widget widget) { PackEnd (widget, duration, easing, blocking); } public void PackEnd (Widget widget, uint duration) { PackEnd (widget, duration, easing, blocking); } public void PackEnd (Widget widget, Easing easing) { PackEnd (widget, duration, easing, blocking); } public void PackEnd (Widget widget, uint duration, Easing easing) { PackEnd (widget, duration, easing, blocking); } public void PackEnd (Widget widget, Blocking blocking) { PackEnd (widget, duration, easing, blocking); } public void PackEnd (Widget widget, uint duration, Blocking blocking) { PackEnd (widget, duration, easing, blocking); } public void PackEnd (Widget widget, Easing easing, Blocking blocking) { PackEnd (widget, duration, easing, blocking); } public void PackEnd (Widget widget, uint duration, Easing easing, Blocking blocking) { Pack (widget, duration, easing, blocking, true); } private void Pack (Widget widget, uint duration, Easing easing, Blocking blocking, bool end) { if (widget == null) { throw new ArgumentNullException ("widget"); } AnimatedWidget animated_widget = new AnimatedWidget (widget, duration, easing, blocking, horizontal); animated_widget.Parent = this; animated_widget.WidgetDestroyed += OnWidgetDestroyed; stage.Add (animated_widget, duration); animated_widget.Node = end ? children.AddLast (animated_widget) : children.AddFirst (animated_widget); RecalculateSpacings (); if (active_count == 0) { if (border_state == AnimationState.Going) { border_bias = Percent; } else { border_easing = easing; border_bias = 1.0; } border_state = AnimationState.Coming; border_stage.Reset ((uint)(duration * border_bias)); } active_count++; } #endregion #region Remove Methods public new void Remove (Widget widget) { RemoveCore (widget, 0, 0, 0, false, false); } public void Remove (Widget widget, uint duration) { RemoveCore (widget, duration, 0, 0, false, false); } public void Remove (Widget widget, Easing easing) { RemoveCore (widget, 0, easing, 0, true, false); } public void Remove (Widget widget, uint duration, Easing easing) { RemoveCore (widget, duration, easing, 0, true, false); } public void Remove (Widget widget, Blocking blocking) { RemoveCore (widget, 0, 0, blocking, false, true); } public void Remove (Widget widget, uint duration, Blocking blocking) { RemoveCore (widget, duration, 0, blocking, false, true); } public void Remove (Widget widget, Easing easing, Blocking blocking) { RemoveCore (widget, 0, easing, blocking, true, true); } public void Remove (Widget widget, uint duration, Easing easing, Blocking blocking) { RemoveCore (widget, duration, easing, blocking, true, true); } private void RemoveCore (Widget widget, uint duration, Easing easing, Blocking blocking, bool use_easing, bool use_blocking) { if (widget == null) { throw new ArgumentNullException ("widget"); } AnimatedWidget animated_widget = null; foreach (AnimatedWidget child in Widgets) { if (child.Widget == widget) { animated_widget = child; break; } } if (animated_widget == null) { throw new ArgumentException ("Cannot remove the specified widget because it has not been added to this container or it has already been removed.", "widget"); } RemoveCore (animated_widget, duration, easing, blocking, use_easing, use_blocking); RecalculateSpacings (); } private void RemoveCore (AnimatedWidget widget) { RemoveCore (widget, widget.Duration, 0, 0, false, false); } private void RemoveCore (AnimatedWidget widget, uint duration, Easing easing, Blocking blocking, bool use_easing, bool use_blocking) { if (duration > 0) { widget.Duration = duration; } if (use_easing) { widget.Easing = easing; } if (use_blocking) { widget.Blocking = blocking; } if (widget.AnimationState == AnimationState.Coming) { widget.AnimationState = AnimationState.IntendingToGo; } else { if (widget.Easing == Easing.QuadraticIn) { widget.Easing = Easing.QuadraticOut; } else if (widget.Easing == Easing.QuadraticOut) { widget.Easing = Easing.QuadraticIn; } else if (widget.Easing == Easing.ExponentialIn) { widget.Easing = Easing.ExponentialOut; } else if (widget.Easing == Easing.ExponentialOut) { widget.Easing = Easing.ExponentialIn; } widget.AnimationState = AnimationState.Going; stage.Add (widget, widget.Duration); } duration = widget.Duration; easing = widget.Easing; active_count--; if (active_count == 0) { if (border_state == AnimationState.Coming) { border_bias = Percent; } else { border_easing = easing; border_bias = 1.0; } border_state = AnimationState.Going; border_stage.Reset ((uint)(duration * border_bias)); } } public void RemoveAll () { foreach (AnimatedWidget child in Widgets) { if (child.AnimationState != AnimationState.Going) { RemoveCore (child); } } RecalculateSpacings (); } #endregion public bool Contains (Widget widget) { foreach (AnimatedWidget child in Widgets) { if (child.AnimationState != AnimationState.Going && child.Widget == widget) { return true; } } return false; } #endregion } }f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/GenericToolItem.cs0000644000175000017500000000302611420634720024673 0ustar00rubenruben00000000000000// // GenericToolItem.cs // // Author: // Aaron Bockover // // Copyright (C) 2006-2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; namespace Hyena.Widgets { public class GenericToolItem : ToolItem where T : Widget { private T widget; public GenericToolItem (T widget) { this.widget = widget; Add (widget); } public T Widget { get { return widget; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/AnimatedVBox.cs0000644000175000017500000000267511420634720024174 0ustar00rubenruben00000000000000// // AnimatedVBox.cs // // Authors: // Scott Peterson // // Copyright (C) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gdk; using Gtk; namespace Hyena.Widgets { public class AnimatedVBox : AnimatedBox { public AnimatedVBox () : base (false) { } protected AnimatedVBox (IntPtr raw) : base (raw) { } } }f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/WrapLabel.cs0000644000175000017500000001066611420634720023523 0ustar00rubenruben00000000000000// // WrapLabel.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; namespace Hyena.Widgets { public class WrapLabel : Widget { private string text; private bool use_markup = false; private bool wrap = true; private Pango.Layout layout; public WrapLabel () { WidgetFlags |= WidgetFlags.NoWindow; } private void CreateLayout () { if (layout != null) { layout.Dispose (); } layout = new Pango.Layout (PangoContext); layout.Wrap = Pango.WrapMode.Word; } private void UpdateLayout () { if (layout == null) { CreateLayout (); } layout.Ellipsize = wrap ? Pango.EllipsizeMode.None : Pango.EllipsizeMode.End; if (text == null) { text = ""; } if (use_markup) { layout.SetMarkup (text); } else { layout.SetText (text); } QueueResize (); } protected override void OnStyleSet (Style previous_style) { CreateLayout (); UpdateLayout (); base.OnStyleSet (previous_style); } protected override void OnRealized () { GdkWindow = Parent.GdkWindow; base.OnRealized (); } protected override void OnSizeAllocated (Gdk.Rectangle allocation) { int lw, lh; layout.Width = (int)(allocation.Width * Pango.Scale.PangoScale); layout.GetPixelSize (out lw, out lh); TooltipText = layout.IsEllipsized ? text : null; HeightRequest = lh; base.OnSizeAllocated (allocation); } protected override bool OnExposeEvent (Gdk.EventExpose evnt) { if (evnt.Window == GdkWindow) { // Center the text vertically int lw, lh; layout.GetPixelSize (out lw, out lh); int y = Allocation.Y + (Allocation.Height - lh) / 2; Gtk.Style.PaintLayout (Style, GdkWindow, State, false, evnt.Area, this, null, Allocation.X, y, layout); } return true; } public void MarkupFormat (string format, params object [] args) { if (args == null || args.Length == 0) { Markup = format; return; } for (int i = 0; i < args.Length; i++) { if (args[i] is string) { args[i] = GLib.Markup.EscapeText ((string)args[i]); } } Markup = String.Format (format, args); } public bool Wrap { get { return wrap; } set { wrap = value; UpdateLayout (); } } public string Markup { get { return text; } set { use_markup = true; text = value; UpdateLayout (); } } public string Text { get { return text; } set { use_markup = false; text = value; UpdateLayout (); } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/SegmentedBar.cs0000644000175000017500000004747511420634720024222 0ustar00rubenruben00000000000000// // SegmentedBar.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using Gtk; using Cairo; using Hyena.Gui; namespace Hyena.Widgets { public class SegmentedBar : Widget { public delegate string BarValueFormatHandler (Segment segment); public class Segment { private string title; private double percent; private Cairo.Color color; private bool show_in_bar; public Segment (string title, double percent, Cairo.Color color) : this (title, percent, color, true) { } public Segment (string title, double percent, Cairo.Color color, bool showInBar) { this.title = title; this.percent = percent; this.color = color; this.show_in_bar = showInBar; } public string Title { get { return title; } set { title = value; } } public double Percent { get { return percent; } set { percent = value; } } public Cairo.Color Color { get { return color; } set { color = value; } } public bool ShowInBar { get { return show_in_bar; } set { show_in_bar = value; } } internal int LayoutWidth; internal int LayoutHeight; } // State private List segments = new List (); private int layout_width; private int layout_height; // Properties private int bar_height = 26; private int bar_label_spacing = 8; private int segment_label_spacing = 16; private int segment_box_size = 12; private int segment_box_spacing = 6; private int h_padding = 0; private bool show_labels = true; private bool reflect = true; private Color remainder_color = CairoExtensions.RgbToColor (0xeeeeee); private BarValueFormatHandler format_handler; public SegmentedBar () { WidgetFlags |= WidgetFlags.NoWindow; } protected override void OnRealized () { GdkWindow = Parent.GdkWindow; base.OnRealized (); } #region Size Calculations protected override void OnSizeRequested (ref Requisition requisition) { requisition.Width = 200; requisition.Height = 0; } protected override void OnSizeAllocated (Gdk.Rectangle allocation) { int _bar_height = reflect ? (int)Math.Ceiling (bar_height * 1.75) : bar_height; if (show_labels) { ComputeLayoutSize (); HeightRequest = Math.Max (bar_height + bar_label_spacing + layout_height, _bar_height); WidthRequest = layout_width + (2 * h_padding); } else { HeightRequest = _bar_height; WidthRequest = bar_height + (2 * h_padding); } base.OnSizeAllocated (allocation); } private void ComputeLayoutSize () { if (segments.Count == 0) { return; } Pango.Layout layout = null; layout_width = layout_height = 0; for (int i = 0, n = segments.Count; i < n; i++) { int aw, ah, bw, bh; layout = CreateAdaptLayout (layout, false, true); layout.SetText (FormatSegmentText (segments[i])); layout.GetPixelSize (out aw, out ah); layout = CreateAdaptLayout (layout, true, false); layout.SetText (FormatSegmentValue (segments[i])); layout.GetPixelSize (out bw, out bh); int w = Math.Max (aw, bw); int h = ah + bh; segments[i].LayoutWidth = w; segments[i].LayoutHeight = Math.Max (h, segment_box_size * 2); layout_width += segments[i].LayoutWidth + segment_box_size + segment_box_spacing + (i < n - 1 ? segment_label_spacing : 0); layout_height = Math.Max (layout_height, segments[i].LayoutHeight); } layout.Dispose (); } #endregion #region Public Methods public void AddSegmentRgba (string title, double percent, uint rgbaColor) { AddSegment (title, percent, CairoExtensions.RgbaToColor (rgbaColor)); } public void AddSegmentRgb (string title, double percent, uint rgbColor) { AddSegment (title, percent, CairoExtensions.RgbToColor (rgbColor)); } public void AddSegment (string title, double percent, Color color) { AddSegment (new Segment (title, percent, color, true)); } public void AddSegment (string title, double percent, Color color, bool showInBar) { AddSegment (new Segment (title, percent, color, showInBar)); } public void AddSegment (Segment segment) { lock (segments) { segments.Add (segment); QueueDraw (); } } public void UpdateSegment (int index, double percent) { segments[index].Percent = percent; QueueDraw (); } #endregion #region Public Properties public BarValueFormatHandler ValueFormatter { get { return format_handler; } set { format_handler = value; } } public Color RemainderColor { get { return remainder_color; } set { remainder_color = value; QueueDraw (); } } public int BarHeight { get { return bar_height; } set { if (bar_height != value) { bar_height = value; QueueResize (); } } } public bool ShowReflection { get { return reflect; } set { if (reflect != value) { reflect = value; QueueResize (); } } } public bool ShowLabels { get { return show_labels; } set { if (show_labels != value) { show_labels = value; QueueResize (); } } } public int SegmentLabelSpacing { get { return segment_label_spacing; } set { if (segment_label_spacing != value) { segment_label_spacing = value; QueueResize (); } } } public int SegmentBoxSize { get { return segment_box_size; } set { if (segment_box_size != value) { segment_box_size = value; QueueResize (); } } } public int SegmentBoxSpacing { get { return segment_box_spacing; } set { if (segment_box_spacing != value) { segment_box_spacing = value; QueueResize (); } } } public int BarLabelSpacing { get { return bar_label_spacing; } set { if (bar_label_spacing != value) { bar_label_spacing = value; QueueResize (); } } } public int HorizontalPadding { get { return h_padding; } set { if (h_padding != value) { h_padding = value; QueueResize (); } } } #endregion #region Rendering protected override bool OnExposeEvent (Gdk.EventExpose evnt) { if (evnt.Window != GdkWindow) { return base.OnExposeEvent (evnt); } Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window); if (reflect) { CairoExtensions.PushGroup (cr); } cr.Operator = Operator.Over; cr.Translate (Allocation.X + h_padding, Allocation.Y); cr.Rectangle (0, 0, Allocation.Width - h_padding, Math.Max (2 * bar_height, bar_height + bar_label_spacing + layout_height)); cr.Clip (); Pattern bar = RenderBar (Allocation.Width - 2 * h_padding, bar_height); cr.Save (); cr.Source = bar; cr.Paint (); cr.Restore (); if (reflect) { cr.Save (); cr.Rectangle (0, bar_height, Allocation.Width - h_padding, bar_height); cr.Clip (); Matrix matrix = new Matrix (); matrix.InitScale (1, -1); matrix.Translate (0, -(2 * bar_height) + 1); cr.Transform (matrix); cr.Pattern = bar; LinearGradient mask = new LinearGradient (0, 0, 0, bar_height); mask.AddColorStop (0.25, new Color (0, 0, 0, 0)); mask.AddColorStop (0.5, new Color (0, 0, 0, 0.125)); mask.AddColorStop (0.75, new Color (0, 0, 0, 0.4)); mask.AddColorStop (1.0, new Color (0, 0, 0, 0.7)); cr.Mask (mask); mask.Destroy (); cr.Restore (); CairoExtensions.PopGroupToSource (cr); cr.Paint (); } if (show_labels) { cr.Translate ((reflect ? Allocation.X : -h_padding) + (Allocation.Width - layout_width) / 2, (reflect ? Allocation.Y : 0) + bar_height + bar_label_spacing); RenderLabels (cr); } bar.Destroy (); CairoExtensions.DisposeContext (cr); return true; } private Pattern RenderBar (int w, int h) { ImageSurface s = new ImageSurface (Format.Argb32, w, h); Context cr = new Context (s); RenderBar (cr, w, h, h / 2); // TODO Implement the new ctor - see http://bugzilla.gnome.org/show_bug.cgi?id=561394 #pragma warning disable 0618 Pattern pattern = new Pattern (s); #pragma warning restore 0618 s.Destroy (); ((IDisposable)cr).Dispose (); return pattern; } private void RenderBar (Context cr, int w, int h, int r) { RenderBarSegments (cr, w, h, r); RenderBarStrokes (cr, w, h, r); } private void RenderBarSegments (Context cr, int w, int h, int r) { LinearGradient grad = new LinearGradient (0, 0, w, 0); double last = 0.0; foreach (Segment segment in segments) { if (segment.Percent > 0) { grad.AddColorStop (last, segment.Color); grad.AddColorStop (last += segment.Percent, segment.Color); } } CairoExtensions.RoundedRectangle (cr, 0, 0, w, h, r); cr.Pattern = grad; cr.FillPreserve (); cr.Pattern.Destroy (); grad = new LinearGradient (0, 0, 0, h); grad.AddColorStop (0.0, new Color (1, 1, 1, 0.125)); grad.AddColorStop (0.35, new Color (1, 1, 1, 0.255)); grad.AddColorStop (1, new Color (0, 0, 0, 0.4)); cr.Pattern = grad; cr.Fill (); cr.Pattern.Destroy (); } private void RenderBarStrokes (Context cr, int w, int h, int r) { LinearGradient stroke = MakeSegmentGradient (h, CairoExtensions.RgbaToColor (0x00000040)); LinearGradient seg_sep_light = MakeSegmentGradient (h, CairoExtensions.RgbaToColor (0xffffff20)); LinearGradient seg_sep_dark = MakeSegmentGradient (h, CairoExtensions.RgbaToColor (0x00000020)); cr.LineWidth = 1; double seg_w = 20; double x = seg_w > r ? seg_w : r; while (x <= w - r) { cr.MoveTo (x - 0.5, 1); cr.LineTo (x - 0.5, h - 1); cr.Pattern = seg_sep_light; cr.Stroke (); cr.MoveTo (x + 0.5, 1); cr.LineTo (x + 0.5, h - 1); cr.Pattern = seg_sep_dark; cr.Stroke (); x += seg_w; } CairoExtensions.RoundedRectangle (cr, 0.5, 0.5, w - 1, h - 1, r); cr.Pattern = stroke; cr.Stroke (); stroke.Destroy (); seg_sep_light.Destroy (); seg_sep_dark.Destroy (); } private LinearGradient MakeSegmentGradient (int h, Color color) { return MakeSegmentGradient (h, color, false); } private LinearGradient MakeSegmentGradient (int h, Color color, bool diag) { LinearGradient grad = new LinearGradient (0, 0, 0, h); grad.AddColorStop (0, CairoExtensions.ColorShade (color, 1.1)); grad.AddColorStop (0.35, CairoExtensions.ColorShade (color, 1.2)); grad.AddColorStop (1, CairoExtensions.ColorShade (color, 0.8)); return grad; } private void RenderLabels (Context cr) { if (segments.Count == 0) { return; } Pango.Layout layout = null; Color text_color = CairoExtensions.GdkColorToCairoColor (Style.Foreground (State)); Color box_stroke_color = new Color (0, 0, 0, 0.6); int x = 0; foreach (Segment segment in segments) { cr.LineWidth = 1; cr.Rectangle (x + 0.5, 2 + 0.5, segment_box_size - 1, segment_box_size - 1); LinearGradient grad = MakeSegmentGradient (segment_box_size, segment.Color, true); cr.Pattern = grad; cr.FillPreserve (); cr.Color = box_stroke_color; cr.Stroke (); grad.Destroy (); x += segment_box_size + segment_box_spacing; int lw, lh; layout = CreateAdaptLayout (layout, false, true); layout.SetText (FormatSegmentText (segment)); layout.GetPixelSize (out lw, out lh); cr.MoveTo (x, 0); text_color.A = 0.9; cr.Color = text_color; PangoCairoHelper.ShowLayout (cr, layout); cr.Fill (); layout = CreateAdaptLayout (layout, true, false); layout.SetText (FormatSegmentValue (segment)); cr.MoveTo (x, lh); text_color.A = 0.75; cr.Color = text_color; PangoCairoHelper.ShowLayout (cr, layout); cr.Fill (); x += segment.LayoutWidth + segment_label_spacing; } layout.Dispose (); } #endregion #region Utilities private int pango_size_normal; private Pango.Layout CreateAdaptLayout (Pango.Layout layout, bool small, bool bold) { if (layout == null) { Pango.Context context = CreatePangoContext (); layout = new Pango.Layout (context); layout.FontDescription = context.FontDescription; pango_size_normal = layout.FontDescription.Size; } layout.FontDescription.Size = small ? (int)(layout.FontDescription.Size * Pango.Scale.Small) : pango_size_normal; layout.FontDescription.Weight = bold ? Pango.Weight.Bold : Pango.Weight.Normal; return layout; } private string FormatSegmentText (Segment segment) { return segment.Title; } private string FormatSegmentValue (Segment segment) { return format_handler == null ? String.Format ("{0}%", segment.Percent * 100.0) : format_handler (segment); } #endregion } #region Test Module [TestModule ("Segmented Bar")] internal class SegmentedBarTestModule : Window { private SegmentedBar bar; private VBox box; public SegmentedBarTestModule () : base ("Segmented Bar") { BorderWidth = 10; AppPaintable = true; box = new VBox (); box.Spacing = 10; Add (box); int space = 55; bar = new SegmentedBar (); bar.HorizontalPadding = bar.BarHeight / 2; bar.AddSegmentRgb ("Audio", 0.00187992456702332, 0x3465a4); bar.AddSegmentRgb ("Other", 0.0788718162651326, 0xf57900); bar.AddSegmentRgb ("Video", 0.0516869922033282, 0x73d216); bar.AddSegment ("Free Space", 0.867561266964516, bar.RemainderColor, false); bar.ValueFormatter = delegate (SegmentedBar.Segment segment) { return String.Format ("{0} GB", space * segment.Percent); }; HBox controls = new HBox (); controls.Spacing = 5; Label label = new Label ("Height:"); controls.PackStart (label, false, false, 0); SpinButton height = new SpinButton (new Adjustment (bar.BarHeight, 5, 100, 1, 1, 1), 1, 0); height.Activated += delegate { bar.BarHeight = height.ValueAsInt; }; height.Changed += delegate { bar.BarHeight = height.ValueAsInt; bar.HorizontalPadding = bar.BarHeight / 2; }; controls.PackStart (height, false, false, 0); CheckButton reflect = new CheckButton ("Reflection"); reflect.Active = bar.ShowReflection; reflect.Toggled += delegate { bar.ShowReflection = reflect.Active; }; controls.PackStart (reflect, false, false, 0); CheckButton labels = new CheckButton ("Labels"); labels.Active = bar.ShowLabels; labels.Toggled += delegate { bar.ShowLabels = labels.Active; }; controls.PackStart (labels, false, false, 0); box.PackStart (controls, false, false, 0); box.PackStart (new HSeparator (), false, false, 0); box.PackStart (bar, false, false, 0); box.ShowAll (); SetSizeRequest (350, -1); Gdk.Geometry limits = new Gdk.Geometry (); limits.MinWidth = SizeRequest ().Width; limits.MaxWidth = Gdk.Screen.Default.Width; limits.MinHeight = -1; limits.MaxHeight = -1; SetGeometryHints (this, limits, Gdk.WindowHints.MaxSize | Gdk.WindowHints.MinSize); } } #endregion } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/MenuButton.cs0000644000175000017500000001332611467745411023761 0ustar00rubenruben00000000000000// // MenuButton.cs // // Author: // Scott Peterson // // Copyright (c) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // using System; using Gtk; using Gdk; namespace Hyena.Widgets { public class MenuButton : Container { private ToggleButton toggle_button = new ToggleButton (); private HBox box = new HBox (); private Alignment alignment; private Arrow arrow; private Widget button_widget; private Menu menu; private Widget size_widget; protected MenuButton (IntPtr ptr) : base (ptr) {} public MenuButton () { } public MenuButton (Widget buttonWidget, Menu menu, bool showArrow) { Construct (buttonWidget, menu, showArrow); } protected void Construct (Widget buttonWidget, Menu menu, bool showArrow) { WidgetFlags |= WidgetFlags.NoWindow; button_widget = buttonWidget; Menu = menu; toggle_button.Parent = this; toggle_button.FocusOnClick = false; toggle_button.Relief = ReliefStyle.None; toggle_button.Pressed += delegate { ShowMenu (); toggle_button.Active = true; }; toggle_button.Activated += delegate { ShowMenu (); }; box.Parent = this; if (showArrow) { box.PackStart (button_widget, true, true, 0); alignment = new Alignment (0f, 0.5f, 0f, 0f); arrow = new Arrow (ArrowType.Down, ShadowType.None); alignment.Add (arrow); box.PackStart (alignment, false, false, 5); size_widget = box; FocusChain = new Widget[] {toggle_button, box}; alignment.ShowAll (); alignment.NoShowAll = true; } else { toggle_button.Add (button_widget); size_widget = toggle_button; } ShowAll (); } public Widget ButtonWidget { get { return button_widget; } } public Menu Menu { get { return menu; } set { if (menu == value) return; if (menu != null) menu.Deactivated -= OnMenuDeactivated; menu = value; menu.Deactivated += OnMenuDeactivated; } } private void OnMenuDeactivated (object o, EventArgs args) { toggle_button.Active = false; } public ToggleButton ToggleButton { get { return toggle_button; } } public Arrow Arrow { get { return arrow; } } public bool ArrowVisible { get { return alignment.Visible; } set { alignment.Visible = value; } } protected override void OnSizeRequested (ref Requisition requisition) { requisition = size_widget.SizeRequest (); } protected override void OnSizeAllocated (Rectangle allocation) { box.SizeAllocate (allocation); toggle_button.SizeAllocate (allocation); base.OnSizeAllocated (allocation); } protected override void ForAll (bool include_internals, Callback callback) { callback (toggle_button); callback (box); } protected override void OnAdded (Widget widget) { } protected override void OnRemoved (Widget widget) { } protected void ShowMenu () { menu.Popup (null, null, PositionMenu, 1, Gtk.Global.CurrentEventTime); } private void PositionMenu (Menu menu, out int x, out int y, out bool push_in) { Gtk.Requisition menu_req = menu.SizeRequest (); int monitor_num = Screen.GetMonitorAtWindow (GdkWindow); Gdk.Rectangle monitor = Screen.GetMonitorGeometry (monitor_num < 0 ? 0 : monitor_num); GdkWindow.GetOrigin (out x, out y); y += Allocation.Y; x += Allocation.X + (Direction == TextDirection.Ltr ? Math.Max (Allocation.Width - menu_req.Width, 0) : - (menu_req.Width - Allocation.Width)); if (y + Allocation.Height + menu_req.Height <= monitor.Y + monitor.Height) { y += Allocation.Height; } else if (y - menu_req.Height >= monitor.Y) { y -= menu_req.Height; } else if (monitor.Y + monitor.Height - (y + Allocation.Height) > y) { y += Allocation.Height; } else { y -= menu_req.Height; } push_in = false; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/GrabHandle.cs0000644000175000017500000000603011467745411023642 0ustar00rubenruben00000000000000// // GrabHandle.cs // // Author: // Gabriel Burt // // Copyright (C) 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; namespace Hyena.Widgets { public class GrabHandle : EventBox { Gtk.DrawingArea da; public GrabHandle () : this (5, 28) {} public GrabHandle (int w, int h) { da = new DrawingArea (); da.SetSizeRequest (w, h); Orientation = Gtk.Orientation.Vertical; Child = da; ShowAll (); ButtonPressEvent += (o, a) => Dragging = true; ButtonReleaseEvent += (o, a) => Dragging = false; EnterNotifyEvent += (o, a) => Inside = true; LeaveNotifyEvent += (o, a) => Inside = false; da.ExposeEvent += (o, a) => { if (da.IsDrawable) { Gtk.Style.PaintHandle (da.Style, da.GdkWindow, da.State, ShadowType.In, a.Event.Area, this, "entry", 0, 0, da.Allocation.Width, da.Allocation.Height, Orientation); } }; } public void ControlWidthOf (Widget widget, int min, int max, bool grabberOnRight) { MotionNotifyEvent += (o, a) => { var x = a.Event.X; var w = Math.Min (max, Math.Max (min, widget.WidthRequest + (grabberOnRight ? 1 : -1 ) * x)); widget.WidthRequest = (int)w; }; } public Gtk.Orientation Orientation { get; set; } private bool inside, dragging; private bool Inside { set { inside = value; GdkWindow.Cursor = dragging || inside ? resize_cursor : null; } } private bool Dragging { set { dragging = value; GdkWindow.Cursor = dragging || inside ? resize_cursor : null; } } private static Gdk.Cursor resize_cursor = new Gdk.Cursor (Gdk.CursorType.SbHDoubleArrow); } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/ScrolledWindow.cs0000644000175000017500000000725711420634720024613 0ustar00rubenruben00000000000000// // ScrolledWindow.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Reflection; using Gtk; using Gdk; using Cairo; using Hyena.Gui; using Hyena.Data.Gui; namespace Hyena.Widgets { public class ScrolledWindow : Gtk.ScrolledWindow { private Widget adjustable; private RoundedFrame rounded_frame; public ScrolledWindow () { } public void AddWithFrame (Widget widget) { RoundedFrame frame = new RoundedFrame (); frame.Add (widget); frame.Show (); Add (frame); ProbeAdjustable (widget); } protected override void OnAdded (Widget widget) { if (widget is RoundedFrame) { rounded_frame = (RoundedFrame)widget; rounded_frame.Added += OnFrameWidgetAdded; rounded_frame.Removed += OnFrameWidgetRemoved; } base.OnAdded (widget); } protected override void OnRemoved (Widget widget) { if (widget == rounded_frame) { rounded_frame.Added -= OnFrameWidgetAdded; rounded_frame.Removed -= OnFrameWidgetRemoved; rounded_frame = null; } base.OnRemoved (widget); } private void OnFrameWidgetAdded (object o, AddedArgs args) { if (rounded_frame != null) { ProbeAdjustable (args.Widget); } } private void OnFrameWidgetRemoved (object o, RemovedArgs args) { if (adjustable != null && adjustable == args.Widget) { Hadjustment = null; Vadjustment = null; adjustable = null; } } private void ProbeAdjustable (Widget widget) { Type type = widget.GetType (); PropertyInfo hadj_prop = type.GetProperty ("Hadjustment"); PropertyInfo vadj_prop = type.GetProperty ("Vadjustment"); if (hadj_prop == null || vadj_prop == null) { return; } object hadj_value = hadj_prop.GetValue (widget, null); object vadj_value = vadj_prop.GetValue (widget, null); if (hadj_value == null || vadj_value == null || hadj_value.GetType () != typeof (Adjustment) || vadj_value.GetType () != typeof (Adjustment)) { return; } Hadjustment = (Adjustment)hadj_value; Vadjustment = (Adjustment)vadj_value; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/ImageButton.cs0000644000175000017500000000461411420634720024064 0ustar00rubenruben00000000000000// // ImageButton.cs // // Authors: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; namespace Hyena.Widgets { public class ImageButton : Button { private Image image; private Label label; private HBox hbox; public Image ImageWidget { get { return image; } } public Label LabelWidget { get { return label; } } public uint InnerPadding { get { return hbox.BorderWidth; } set { hbox.BorderWidth = value; } } public int Spacing { get { return hbox.Spacing; } set { hbox.Spacing = value; } } public ImageButton (string text, string iconName) : this (text, iconName, Gtk.IconSize.Button) { } public ImageButton (string text, string iconName, Gtk.IconSize iconSize) : base () { image = new Image (); image.IconName = iconName; image.IconSize = (int) iconSize; label = new Label (); label.MarkupWithMnemonic = text; hbox = new HBox (); hbox.Spacing = 2; hbox.PackStart (image, false, false, 0); hbox.PackStart (label, true, true, 0); Child = hbox; CanDefault = true; ShowAll (); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/HigMessageDialog.cs0000644000175000017500000002025311420634720024777 0ustar00rubenruben00000000000000// // HigMessageDialog.cs // // Authors: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Widgets { public class HigMessageDialog : Gtk.Dialog { private Gtk.Image image; private Gtk.VBox inner_vbox; private Gtk.VBox label_vbox; private Gtk.Label message_label; public HigMessageDialog(Gtk.Window parent, Gtk.DialogFlags flags, Gtk.MessageType type, Gtk.ButtonsType buttons, string header, string msg) : base() { HasSeparator = false; BorderWidth = 5; Resizable = false; Title = ""; SkipTaskbarHint = true; VBox.Spacing = 12; ActionArea.Layout = Gtk.ButtonBoxStyle.End; Gtk.HBox hbox = new Gtk.HBox (false, 12); hbox.BorderWidth = 5; hbox.Show (); VBox.PackStart (hbox, false, false, 0); image = null; switch (type) { case Gtk.MessageType.Error: image = new Gtk.Image (Gtk.Stock.DialogError, Gtk.IconSize.Dialog); break; case Gtk.MessageType.Question: image = new Gtk.Image (Gtk.Stock.DialogQuestion, Gtk.IconSize.Dialog); break; case Gtk.MessageType.Info: image = new Gtk.Image (Gtk.Stock.DialogInfo, Gtk.IconSize.Dialog); break; case Gtk.MessageType.Warning: image = new Gtk.Image (Gtk.Stock.DialogWarning, Gtk.IconSize.Dialog); break; } image.Yalign = 0.1f; image.Show (); hbox.PackStart (image, false, false, 0); inner_vbox = new Gtk.VBox (false, 12); inner_vbox.Show (); hbox.PackStart (inner_vbox, true, true, 0); label_vbox = new Gtk.VBox (false, 0); label_vbox.Show (); inner_vbox.PackStart (label_vbox, true, true, 0); string title = String.Format ("{0}" + "\n", header); Gtk.Label label; label = new Gtk.Label (title); label.UseMarkup = true; label.Justify = Gtk.Justification.Left; label.LineWrap = true; label.SetAlignment (0.0f, 0.5f); label.Show (); label_vbox.PackStart (label, false, false, 0); message_label = label = new Gtk.Label (); label.Markup = msg; label.UseMarkup = true; label.Justify = Gtk.Justification.Left; label.LineWrap = true; label.SetAlignment (0.0f, 0.5f); label.Show (); label_vbox.PackStart (label, false, false, 0); switch (buttons) { case Gtk.ButtonsType.None: break; case Gtk.ButtonsType.Ok: AddButton (Gtk.Stock.Ok, Gtk.ResponseType.Ok, true); break; case Gtk.ButtonsType.Close: AddButton (Gtk.Stock.Close, Gtk.ResponseType.Close, true); break; case Gtk.ButtonsType.Cancel: AddButton (Gtk.Stock.Cancel, Gtk.ResponseType.Cancel, true); break; case Gtk.ButtonsType.YesNo: AddButton (Gtk.Stock.No, Gtk.ResponseType.No, false); AddButton (Gtk.Stock.Yes, Gtk.ResponseType.Yes, true); break; case Gtk.ButtonsType.OkCancel: AddButton (Gtk.Stock.Cancel, Gtk.ResponseType.Cancel, false); AddButton (Gtk.Stock.Ok, Gtk.ResponseType.Ok, true); break; } if (parent != null) TransientFor = parent; if ((int) (flags & Gtk.DialogFlags.Modal) != 0) Modal = true; if ((int) (flags & Gtk.DialogFlags.DestroyWithParent) != 0) DestroyWithParent = true; } // constructor for a HIG confirmation alert with two buttons public HigMessageDialog (Gtk.Window parent, Gtk.DialogFlags flags, Gtk.MessageType type, string header, string msg, string ok_caption) : this (parent, flags, type, Gtk.ButtonsType.Cancel, header, msg) { AddButton (ok_caption, Gtk.ResponseType.Ok, false); } public Gtk.Button AddCustomButton (string message, Gtk.ResponseType response, bool isDefault) { Gtk.Button button = new Gtk.Button (); button.Label = message; button.CanDefault = true; button.Show (); AddButton (button, response, isDefault); return button; } public void AddButton (string stock_id, Gtk.ResponseType response, bool isDefault) { Gtk.Button button = new Gtk.Button (stock_id); button.CanDefault = true; button.Show (); AddButton (button, response, isDefault); } private void AddButton (Gtk.Button button, Gtk.ResponseType response, bool isDefault) { AddActionWidget (button, response); if (isDefault) { Default = button; DefaultResponse = response; button.GrabDefault (); } } //run and destroy a standard dialog public static Gtk.ResponseType RunHigMessageDialog(Gtk.Window parent, Gtk.DialogFlags flags, Gtk.MessageType type, Gtk.ButtonsType buttons, string header, string msg) { HigMessageDialog hmd = new HigMessageDialog(parent, flags, type, buttons, header, msg); try { return (Gtk.ResponseType)hmd.Run(); } finally { hmd.Destroy(); } } //Run and destroy a standard confirmation dialog public static Gtk.ResponseType RunHigConfirmation(Gtk.Window parent, Gtk.DialogFlags flags, Gtk.MessageType type, string header, string msg, string ok_caption) { HigMessageDialog hmd = new HigMessageDialog(parent, flags, type, header, msg, ok_caption); try { return (Gtk.ResponseType)hmd.Run(); } finally { hmd.Destroy(); } } public Gdk.Pixbuf Image { set { image.Pixbuf = value; } get { return image.Pixbuf; } } public Gtk.Label MessageLabel { get { return message_label; } } public Gtk.VBox LabelVBox { get { return inner_vbox; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Widgets/RatingEntry.cs0000644000175000017500000003653511441732606024130 0ustar00rubenruben00000000000000// // RatingEntry.cs // // Authors: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2006-2008 Novell, Inc. // Copyright (C) 2006 Gabriel Burt // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using Gtk; using System; using Hyena.Gui; namespace Hyena.Widgets { public class RatingEntry : Widget { private RatingRenderer renderer; private Gdk.Rectangle event_alloc; private int hover_value = -1; private bool interior_focus; private int focus_width; private Gdk.Window event_window; public event EventHandler Changing; public event EventHandler Changed; static RatingEntry () { #if ENABLE_ATK RatingAccessibleFactory.Init (); #endif } public RatingEntry () : this (0) { WidgetFlags |= Gtk.WidgetFlags.NoWindow; } public RatingEntry (int rating) : this (rating, new RatingRenderer ()) { } protected RatingEntry (int rating, RatingRenderer renderer) { this.renderer = renderer; this.renderer.Value = rating; CanFocus = true; Name = "GtkEntry"; } protected virtual void OnChanging () { EventHandler handler = Changing; if (handler != null) { handler (this, new EventArgs ()); } } protected virtual void OnChanged () { QueueDraw (); EventHandler handler = Changed; if (handler != null) { handler (this, new EventArgs ()); } } internal void SetValueFromPosition (int x) { Value = renderer.RatingFromPosition (event_alloc, x); } #region Public Properties private bool always_show_empty_stars = false; public bool AlwaysShowEmptyStars { get { return always_show_empty_stars; } set { always_show_empty_stars = value; } } private bool preview_on_hover = true; public bool PreviewOnHover { get { return preview_on_hover; } set { preview_on_hover = value; } } private bool has_frame = true; public bool HasFrame { get { return has_frame; } set { has_frame = value; QueueResize (); } } public int Value { get { return renderer.Value; } set { if (renderer.Value != value && renderer.Value >= renderer.MinRating && value <= renderer.MaxRating) { renderer.Value = value; OnChanging (); OnChanged (); } } } public int MaxRating { get { return renderer.MaxRating; } set { renderer.MaxRating = value; } } public int MinRating { get { return renderer.MinRating; } set { renderer.MinRating = value; } } public int RatingLevels { get { return renderer.RatingLevels; } } private object rated_object; public object RatedObject { get { return rated_object; } set { rated_object = value; } } #endregion #region Protected Gtk.Widget Overrides protected override void OnRealized () { WidgetFlags |= WidgetFlags.Realized | WidgetFlags.NoWindow; GdkWindow = Parent.GdkWindow; Gdk.WindowAttr attributes = new Gdk.WindowAttr (); attributes.WindowType = Gdk.WindowType.Child; attributes.X = Allocation.X; attributes.Y = Allocation.Y; attributes.Width = Allocation.Width; attributes.Height = Allocation.Height; attributes.Wclass = Gdk.WindowClass.InputOnly; attributes.EventMask = (int)( Gdk.EventMask.PointerMotionMask | Gdk.EventMask.EnterNotifyMask | Gdk.EventMask.LeaveNotifyMask | Gdk.EventMask.KeyPressMask | Gdk.EventMask.KeyReleaseMask | Gdk.EventMask.ButtonPressMask | Gdk.EventMask.ButtonReleaseMask | Gdk.EventMask.ExposureMask); Gdk.WindowAttributesType attributes_mask = Gdk.WindowAttributesType.X | Gdk.WindowAttributesType.Y | Gdk.WindowAttributesType.Wmclass; event_window = new Gdk.Window (GdkWindow, attributes, attributes_mask); event_window.UserData = Handle; Style = Gtk.Rc.GetStyleByPaths (Settings, "*.GtkEntry", "*.GtkEntry", GType); base.OnRealized (); } protected override void OnUnrealized () { WidgetFlags &= ~WidgetFlags.Realized; event_window.UserData = IntPtr.Zero; Hyena.Gui.GtkWorkarounds.WindowDestroy (event_window); event_window = null; base.OnUnrealized (); } protected override void OnMapped () { WidgetFlags |= WidgetFlags.Mapped; event_window.Show (); } protected override void OnUnmapped () { WidgetFlags &= ~WidgetFlags.Mapped; event_window.Hide (); } private bool changing_style; protected override void OnStyleSet (Style previous_style) { if (changing_style) { return; } base.OnStyleSet (previous_style); changing_style = true; focus_width = (int)StyleGetProperty ("focus-line-width"); interior_focus = (bool)StyleGetProperty ("interior-focus"); changing_style = false; } protected override void OnSizeAllocated (Gdk.Rectangle allocation) { base.OnSizeAllocated (allocation); event_alloc = new Gdk.Rectangle (0, 0, allocation.Width, allocation.Height); if (IsRealized) { event_window.MoveResize (allocation); } } protected override void OnSizeRequested (ref Gtk.Requisition requisition) { EnsureStyle (); Pango.FontMetrics metrics = PangoContext.GetMetrics (Style.FontDescription, PangoContext.Language); renderer.Size = ((int)(metrics.Ascent + metrics.Descent) + 512) >> 10; // PANGO_PIXELS(d) metrics.Dispose (); if (HasFrame) { renderer.Xpad = Style.Xthickness + (interior_focus ? focus_width : 0) + 2; renderer.Ypad = Style.Ythickness + (interior_focus ? focus_width : 0) + 2; } else { renderer.Xpad = 0; renderer.Ypad = 0; } requisition.Width = renderer.Width; requisition.Height = renderer.Height; } protected override bool OnExposeEvent (Gdk.EventExpose evnt) { if (evnt.Window != GdkWindow) { return true; } if (HasFrame) { int y_mid = (int)Math.Round ((Allocation.Height - renderer.Height) / 2.0); Gtk.Style.PaintFlatBox (Style, GdkWindow, State, ShadowType.None, evnt.Area, this, "entry", Allocation.X, Allocation.Y + y_mid, Allocation.Width, renderer.Height); Gtk.Style.PaintShadow (Style, GdkWindow, State, ShadowType.In, evnt.Area, this, "entry", Allocation.X, Allocation.Y + y_mid, Allocation.Width, renderer.Height); } Cairo.Context cr = Gdk.CairoHelper.Create (GdkWindow); renderer.Render (cr, Allocation, CairoExtensions.GdkColorToCairoColor (HasFrame ? Parent.Style.Text (State) : Parent.Style.Foreground (State)), AlwaysShowEmptyStars, PreviewOnHover && hover_value >= renderer.MinRating, hover_value, State == StateType.Insensitive ? 1 : 0.90, State == StateType.Insensitive ? 1 : 0.55, State == StateType.Insensitive ? 1 : 0.45); CairoExtensions.DisposeContext (cr); return true; } protected override bool OnButtonPressEvent (Gdk.EventButton evnt) { if (evnt.Button != 1) { return false; } HasFocus = true; Value = renderer.RatingFromPosition (event_alloc, evnt.X); return true; } protected override bool OnEnterNotifyEvent (Gdk.EventCrossing evnt) { hover_value = renderer.MinRating; QueueDraw (); return true; } protected override bool OnLeaveNotifyEvent (Gdk.EventCrossing crossing) { return HandleLeaveNotify (crossing); } protected override bool OnMotionNotifyEvent (Gdk.EventMotion motion) { return HandleMotionNotify (motion.State, motion.X); } protected override bool OnKeyPressEvent (Gdk.EventKey evnt) { switch (evnt.Key) { case Gdk.Key.Up: case Gdk.Key.Right: case Gdk.Key.plus: case Gdk.Key.equal: Value++; return true; case Gdk.Key.Down: case Gdk.Key.Left: case Gdk.Key.minus: Value--; return true; } if (evnt.KeyValue >= (48 + MinRating) && evnt.KeyValue <= (48 + MaxRating) && evnt.KeyValue <= 59) { Value = (int)evnt.KeyValue - 48; return true; } return false; } protected override bool OnScrollEvent (Gdk.EventScroll args) { return HandleScroll (args); } #endregion #region Internal API, primarily for RatingMenuItem internal void ClearHover () { hover_value = renderer.MinRating - 1; } internal bool HandleKeyPress (Gdk.EventKey evnt) { return this.OnKeyPressEvent (evnt); } internal bool HandleScroll (Gdk.EventScroll args) { switch (args.Direction) { case Gdk.ScrollDirection.Up: case Gdk.ScrollDirection.Right: Value++; return true; case Gdk.ScrollDirection.Down: case Gdk.ScrollDirection.Left: Value--; return true; } return false; } internal bool HandleMotionNotify (Gdk.ModifierType state, double x) { hover_value = renderer.RatingFromPosition (event_alloc, x); /*if ((state & Gdk.ModifierType.Button1Mask) != 0) { Value = hover_value; }*/ QueueDraw (); return true; } internal bool HandleLeaveNotify (Gdk.EventCrossing crossing) { ClearHover (); QueueDraw (); return true; } #endregion } #region Test Module #if ENABLE_ATK public class RatingAccessible : Atk.Object, Atk.Value, Atk.ValueImplementor { private RatingEntry rating; public RatingAccessible (IntPtr raw) : base (raw) { Hyena.Log.Information ("RatingAccessible raw ctor.."); } public RatingAccessible (GLib.Object widget): base () { rating = widget as RatingEntry; Name = "Rating entry"; Description = "Rating entry, from 0 to 5 stars"; Role = Atk.Role.Slider; } public void GetMaximumValue (ref GLib.Value val) { val = new GLib.Value (5); } public void GetMinimumIncrement (ref GLib.Value val) { val = new GLib.Value (1); } public void GetMinimumValue (ref GLib.Value val) { val = new GLib.Value (0); } public void GetCurrentValue (ref GLib.Value val) { val = new GLib.Value (rating.Value); } public bool SetCurrentValue (GLib.Value val) { int r = (int) val.Val; if (r <= 0 || r > 5) { return false; } rating.Value = (int) val.Val; return true; } } #endif #if ENABLE_ATK internal class RatingAccessibleFactory : Atk.ObjectFactory { public static void Init () { new RatingAccessibleFactory (); Atk.Global.DefaultRegistry.SetFactoryType ((GLib.GType)typeof (RatingEntry), (GLib.GType)typeof (RatingAccessibleFactory)); } protected override Atk.Object OnCreateAccessible (GLib.Object obj) { return new RatingAccessible (obj); } protected override GLib.GType OnGetAccessibleType () { return RatingAccessible.GType; } } #endif [Hyena.Gui.TestModule ("Rating Entry")] internal class RatingEntryTestModule : Gtk.Window { public RatingEntryTestModule () : base ("Rating Entry") { VBox pbox = new VBox (); Add (pbox); Menu m = new Menu (); MenuBar b = new MenuBar (); MenuItem item = new MenuItem ("Rate Me!"); item.Submenu = m; b.Append (item); m.Append (new MenuItem ("Apples")); m.Append (new MenuItem ("Pears")); m.Append (new RatingMenuItem ()); m.Append (new ImageMenuItem ("gtk-remove", null)); m.ShowAll (); pbox.PackStart (b, false, false, 0); VBox box = new VBox (); box.BorderWidth = 10; box.Spacing = 10; pbox.PackStart (box, true, true, 0); RatingEntry entry1 = new RatingEntry (); box.PackStart (entry1, true, true, 0); RatingEntry entry2 = new RatingEntry (); box.PackStart (entry2, false, false, 0); box.PackStart (new Entry ("Normal GtkEntry"), false, false, 0); RatingEntry entry3 = new RatingEntry (); Pango.FontDescription fd = entry3.PangoContext.FontDescription.Copy (); fd.Size = (int)(fd.Size * Pango.Scale.XXLarge); entry3.ModifyFont (fd); fd.Dispose (); box.PackStart (entry3, true, true, 0); pbox.ShowAll (); } } #endregion } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Theatrics/0000777000175000017500000000000011503407410022355 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Theatrics/Pulsator.cs0000644000175000017500000000640011420634720024515 0ustar00rubenruben00000000000000// // Pulsator.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Gui.Theatrics { public class Pulsator where T : class { private Stage stage; public Stage Stage { get { return stage; } set { if (stage == value) { return; } if (stage != null) { stage.ActorStep -= OnActorStep; } stage = value; if (stage != null) { stage.ActorStep += OnActorStep; } } } private T target; public T Target { get { return target; } set { target = value; } } public double Percent { get { return IsPulsing ? stage[Target].Percent : 0; } } public bool IsPulsing { get { return stage != null && stage.Contains (Target); } } public bool Stopping { get { return !IsPulsing ? true : stage[Target].CanExpire; } } #pragma warning disable 0067 // FIXME: This is to mute gmcs: https://bugzilla.novell.com/show_bug.cgi?id=360455 public event EventHandler Pulse; #pragma warning restore 0067 public Pulsator () { } public Pulsator (Stage stage) { Stage = stage; } public void StartPulsing () { if (!Stage.Contains (Target)) { Stage.Add (Target); } Stage[Target].CanExpire = false; } public void StopPulsing () { if (Stage.Contains (Target)) { Stage[Target].CanExpire = true; } } private bool OnActorStep (Actor actor) { if (actor.Target == target) { OnPulse (); } return true; } protected virtual void OnPulse () { EventHandler handler = Pulse; if (handler != null) { handler (this, EventArgs.Empty); } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Theatrics/Choreographer.cs0000644000175000017500000000646511420634720025507 0ustar00rubenruben00000000000000// // Choreographer.cs // // Authors: // Scott Peterson // // Copyright (C) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Hyena.Widgets; namespace Hyena.Widgets { public enum Blocking { Upstage, Downstage } } namespace Hyena.Gui.Theatrics { public enum Easing { Linear, QuadraticIn, QuadraticOut, QuadraticInOut, ExponentialIn, ExponentialOut, ExponentialInOut, Sine, } public static class Choreographer { public static int PixelCompose (double percent, int size, Easing easing) { return (int)Math.Round (Compose (percent, size, easing)); } public static double Compose (double percent, double scale, Easing easing) { return scale * Compose (percent, easing); } public static double Compose (double percent, Easing easing) { if (percent < 0.0 || percent > 1.0) { throw new ArgumentOutOfRangeException ("percent", "must be between 0 and 1 inclusive"); } switch (easing) { case Easing.QuadraticIn: return percent * percent; case Easing.QuadraticOut: return -1.0 * percent * (percent - 2.0); case Easing.QuadraticInOut: percent *= 2.0; return percent < 1.0 ? percent * percent * 0.5 : -0.5 * (--percent * (percent - 2.0) - 1.0); case Easing.ExponentialIn: return Math.Pow (2.0, 10.0 * (percent - 1.0)); case Easing.ExponentialOut: return -Math.Pow (2.0, -10.0 * percent) + 1.0; case Easing.ExponentialInOut: percent *= 2.0; return percent < 1.0 ? 0.5 * Math.Pow (2.0, 10.0 * (percent - 1.0)) : 0.5 * (-Math.Pow (2.0, -10.0 * --percent) + 2.0); case Easing.Sine: return Math.Sin (percent * Math.PI); case Easing.Linear: default: return percent; } } } }f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Theatrics/Actor.cs0000644000175000017500000000575711420634720023772 0ustar00rubenruben00000000000000// // Actor.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Gui.Theatrics { public class Actor { private DateTime start_time; private DateTime last_step_time; public Actor (T target, double duration) { Target = target; Duration = duration; CanExpire = true; Reset (); } public void Reset () { Reset (Duration); } public void Reset (double duration) { start_time = DateTime.Now; last_step_time = DateTime.Now; Frames = 0.0; Percent = 0.0; Duration = duration; } public virtual void Step () { if (!CanExpire && Percent >= 1.0) { Reset (); } StepDelta = (DateTime.Now - last_step_time).TotalMilliseconds; last_step_time = DateTime.Now; Percent = PClamp ((last_step_time - start_time).TotalMilliseconds / Duration); StepDeltaPercent = PClamp (StepDelta / Duration); Frames++; } private static double PClamp (double value) { return Math.Max (0.1, Math.Min (1.0, value)); } public bool CanExpire { get; set; } public T Target { get; private set; } public double Duration { get; private set; } public DateTime StartTime { get; private set; } public double StepDelta { get; private set; } public double StepDeltaPercent { get; private set; } public double Percent { get; private set; } public double Frames { get; private set; } public double FramesPerSecond { get { return Frames / ((double)Duration / 1000.0); } } public bool Expired { get { return CanExpire && Percent >= 1.0; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Theatrics/Tests/0000777000175000017500000000000011503407411023460 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Theatrics/Tests/ChoreographerTests.cs0000644000175000017500000000730211420634720027623 0ustar00rubenruben00000000000000// // ChoreographerTests.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if ENABLE_TESTS using System; using NUnit.Framework; using Hyena; using Hyena.Gui.Theatrics; namespace Hyena.Gui.Theatrics.Tests { [TestFixture] public class ChoreographerTests { private void _TestComposeRange (int [] values, Easing easing) { for (double i = 0, n = 100, p = 0, j = 0; i <= n; i += 5, p = i / n, j++) { int value = Choreographer.PixelCompose (p, (int)n, easing); Assert.AreEqual (values[(int)j], value); } } [Test] public void QuadraticInCompose () { _TestComposeRange (new int [] { 0, 0, 1, 2, 4, 6, 9, 12, 16, 20, 25, 30, 36, 42, 49, 56, 64, 72, 81, 90, 100 }, Easing.QuadraticIn); } [Test] public void QuadraticOutCompose () { _TestComposeRange (new int [] { 0, 10, 19, 28, 36, 44, 51, 58, 64, 70, 75, 80, 84, 88, 91, 94, 96, 98, 99, 100, 100 }, Easing.QuadraticOut); } [Test] public void QuadraticInOutCompose () { _TestComposeRange (new int [] { 0, 1, 2, 4, 8, 12, 18, 24, 32, 40, 50, 60, 68, 76, 82, 88, 92, 96, 98, 100, 100 }, Easing.QuadraticInOut); } [Test] public void ExponentialInCompose () { _TestComposeRange (new int [] { 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 6, 9, 12, 18, 25, 35, 50, 71, 100 }, Easing.ExponentialIn); } [Test] public void ExponentialOutCompose () { _TestComposeRange (new int [] { 0, 29, 50, 65, 75, 82, 88, 91, 94, 96, 97, 98, 98, 99, 99, 99, 100, 100, 100, 100, 100 }, Easing.ExponentialOut); } [Test] public void ExponentialInOutCompose () { _TestComposeRange (new int [] { 0, 0, 0, 0, 1, 2, 3, 6, 13, 25, 50, 75, 88, 94, 97, 98, 99, 100, 100, 100, 100 }, Easing.ExponentialInOut); } [Test] public void LinearCompose () { _TestComposeRange (new int [] { 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100 }, Easing.Linear); } [Test] public void SineCompose () { _TestComposeRange (new int [] { 0, 16, 31, 45, 59, 71, 81, 89, 95, 99, 100, 99, 95, 89, 81, 71, 59, 45, 31, 16, 0 }, Easing.Sine); } } } #endif f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Theatrics/Stage.cs0000644000175000017500000001661111420634720023754 0ustar00rubenruben00000000000000// // Stage.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; namespace Hyena.Gui.Theatrics { public class Stage { public delegate bool ActorStepHandler (Actor actor); private Dictionary> actors = new Dictionary> (); private uint timeout_id; private uint update_frequency = 30; private uint default_duration = 1000; private bool playing = true; public event ActorStepHandler ActorStep; #pragma warning disable 0067 // FIXME: This is to mute gmcs: https://bugzilla.novell.com/show_bug.cgi?id=360455 public event EventHandler Iteration; #pragma warning restore 0067 public Stage () { } public Stage (uint actorDuration) { default_duration = actorDuration; } public Actor this[T target] { get { if (actors.ContainsKey (target)) { return actors[target]; } return null; } } public bool Contains (T target) { return actors.ContainsKey (target); } public Actor Add (T target) { lock (this) { return Add (target, default_duration); } } public Actor Add (T target, uint duration) { lock (this) { if (Contains (target)) { throw new InvalidOperationException ("Stage already contains this actor"); } Actor actor = new Actor (target, duration); actors.Add (target, actor); CheckTimeout (); return actor; } } public Actor AddOrReset (T target) { lock (this) { return AddOrResetCore (target, null); } } public Actor AddOrReset (T target, uint duration) { lock (this) { return AddOrResetCore (target, duration); } } private Actor AddOrResetCore (T target, uint? duration) { lock (this) { if (Contains (target)) { Actor actor = this[target]; if (duration == null) { actor.Reset (); } else { actor.Reset (duration.Value); } CheckTimeout (); return actor; } return Add (target); } } public void Reset (T target) { lock (this) { ResetCore (target, null); } } public void Reset (T target, uint duration) { lock (this) { ResetCore (target, duration); } } private void ResetCore (T target, uint? duration) { lock (this) { if (!Contains (target)) { throw new InvalidOperationException ("Stage does not contain this actor"); } CheckTimeout (); if (duration == null) { this [target].Reset (); } else { this [target].Reset (duration.Value); } } } private void CheckTimeout () { if ((!Playing || actors.Count == 0) && timeout_id > 0) { GLib.Source.Remove (timeout_id); timeout_id = 0; return; } else if (Playing && actors.Count > 0 && timeout_id <= 0) { timeout_id = GLib.Timeout.Add (update_frequency, OnTimeout); return; } } private bool OnTimeout () { if (!Playing || this.actors.Count == 0) { timeout_id = 0; return false; } Queue> actors = new Queue> (this.actors.Values); while (actors.Count > 0) { Actor actor = actors.Dequeue (); actor.Step (); if (!OnActorStep (actor) || actor.Expired) { this.actors.Remove (actor.Target); } } OnIteration (); return true; } protected virtual bool OnActorStep (Actor actor) { ActorStepHandler handler = ActorStep; if (handler != null) { bool result = true; foreach (ActorStepHandler del in handler.GetInvocationList ()) { result &= del (actor); } return result; } return false; } protected virtual void OnIteration () { EventHandler handler = Iteration; if (handler != null) { handler (this, EventArgs.Empty); } } public void Play () { lock (this) { Playing = true; } } public void Pause () { lock (this) { Playing = false; } } public void Exeunt () { lock (this) { actors.Clear (); CheckTimeout (); } } public uint DefaultActorDuration { get { return default_duration; } set { lock (this) { default_duration = value; } } } public bool Playing { get { return playing; } set { lock (this) { if (playing == value) { return; } playing = value; CheckTimeout (); } } } public uint UpdateFrequency { get { return update_frequency; } set { lock (this) { bool _playing = Playing; update_frequency = value; Playing = _playing; } } } public int ActorCount { get { return actors.Count; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Theatrics/SingleActorStage.cs0000644000175000017500000000357211420634720026111 0ustar00rubenruben00000000000000// // SingleActorStage.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Gui.Theatrics { public class SingleActorStage : Stage { private object target = new object (); public SingleActorStage () : base () { } public SingleActorStage (uint actorDuration) : base (actorDuration) { } protected override bool OnActorStep (Actor actor) { return true; } public void Reset () { AddOrReset (target); } public void Reset (uint duration) { AddOrReset (target, duration); } public Actor Actor { get { return this[target]; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.dll.config0000644000175000017500000000247611467745411022415 0ustar00rubenruben00000000000000 f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/0000777000175000017500000000000011503407412020432 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/PangoCairoHelper.cs0000644000175000017500000000630211420634720024142 0ustar00rubenruben00000000000000// // CairoHelper.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Runtime.InteropServices; namespace Hyena.Gui { public static class PangoCairoHelper { [DllImport ("libpangocairo-1.0-0.dll")] private static extern void pango_cairo_show_layout (IntPtr cr, IntPtr layout); public static void ShowLayout (Cairo.Context cr, Pango.Layout layout) { pango_cairo_show_layout (cr == null ? IntPtr.Zero : cr.Handle, layout == null ? IntPtr.Zero : layout.Handle); } [DllImport ("libpangocairo-1.0-0.dll")] private static extern IntPtr pango_cairo_create_layout (IntPtr cr); public static Pango.Layout CreateLayout (Cairo.Context cr) { IntPtr raw_ret = pango_cairo_create_layout (cr == null ? IntPtr.Zero : cr.Handle); return GLib.Object.GetObject (raw_ret) as Pango.Layout; } [DllImport ("libpangocairo-1.0-0.dll")] private static extern void pango_cairo_layout_path (IntPtr cr, IntPtr layout); public static void LayoutPath (Cairo.Context cr, Pango.Layout layout, bool iUnderstandThePerformanceImplications) { pango_cairo_layout_path (cr == null ? IntPtr.Zero : cr.Handle, layout == null ? IntPtr.Zero : layout.Handle); } [DllImport ("libpangocairo-1.0-0.dll")] private static extern void pango_cairo_context_set_resolution (IntPtr pango_context, double dpi); public static void ContextSetResolution (Pango.Context context, double dpi) { pango_cairo_context_set_resolution (context == null ? IntPtr.Zero : context.Handle, dpi); } [DllImport ("libpangocairo-1.0-0.dll")] private static extern IntPtr pango_layout_get_context (IntPtr layout); public static Pango.Context LayoutGetContext (Pango.Layout layout) { IntPtr handle = pango_layout_get_context (layout.Handle); return handle.Equals (IntPtr.Zero) ? null : GLib.Object.GetObject (handle) as Pango.Context; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/DragDropList.cs0000644000175000017500000000550211420634720023317 0ustar00rubenruben00000000000000// // DragDropList.cs // // Author: // Aaron Bockover // // Copyright (C) 2005-2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Text; using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using Gtk; namespace Hyena.Gui { public class DragDropList : List { public DragDropList() : base() { } public DragDropList(T o) : base() { Add(o); } public DragDropList(T o, Gtk.SelectionData selectionData, Gdk.Atom target) : base() { Add(o); AssignToSelection(selectionData, target); } public void AssignToSelection(Gtk.SelectionData selectionData, Gdk.Atom target) { byte [] data = this; selectionData.Set(target, 8, data, data.Length); } public static implicit operator byte [](DragDropList transferrable) { IntPtr handle = (IntPtr)GCHandle.Alloc(transferrable); return System.Text.Encoding.ASCII.GetBytes(Convert.ToString(handle)); } public static implicit operator DragDropList(byte [] transferrable) { try { string str_handle = System.Text.Encoding.ASCII.GetString(transferrable); IntPtr handle_ptr = (IntPtr)Convert.ToInt64(str_handle); GCHandle handle = (GCHandle)handle_ptr; DragDropList o = (DragDropList)handle.Target; handle.Free(); return o; } catch { return null; } } public static implicit operator DragDropList(Gtk.SelectionData transferrable) { return transferrable.Data; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/BaseWidgetAccessible.cs0000644000175000017500000002023111420634720024751 0ustar00rubenruben00000000000000// // BaseWidgetAccessible.cs // // Author: // Gabriel Burt // // Copyright (C) 2009 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Linq; using System.Collections.Generic; using Atk; namespace Hyena.Gui { #if ENABLE_ATK public class BaseWidgetAccessible : Gtk.Accessible, Atk.ComponentImplementor { private Gtk.Widget widget; private uint focus_id = 0; private Dictionary focus_handlers = new Dictionary (); public BaseWidgetAccessible (Gtk.Widget widget) { this.widget = widget; widget.SizeAllocated += OnAllocated; widget.Mapped += OnMap; widget.Unmapped += OnMap; widget.FocusInEvent += OnFocus; widget.FocusOutEvent += OnFocus; widget.AddNotification ("sensitive", (o, a) => NotifyStateChange (StateType.Sensitive, widget.Sensitive)); widget.AddNotification ("visible", (o, a) => NotifyStateChange (StateType.Visible, widget.Visible)); } public virtual new Atk.Layer Layer { get { return Layer.Widget; } } protected override Atk.StateSet OnRefStateSet () { var s = base.OnRefStateSet (); AddStateIf (s, widget.CanFocus, StateType.Focusable); AddStateIf (s, widget.HasFocus, StateType.Focused); AddStateIf (s, widget.Sensitive, StateType.Sensitive); AddStateIf (s, widget.Sensitive, StateType.Enabled); AddStateIf (s, widget.HasDefault, StateType.Default); AddStateIf (s, widget.Visible, StateType.Visible); AddStateIf (s, widget.Visible && widget.IsMapped, StateType.Showing); return s; } private static void AddStateIf (StateSet s, bool condition, StateType t) { if (condition) { s.AddState (t); } } private void OnFocus (object o, EventArgs args) { NotifyStateChange (StateType.Focused, widget.HasFocus); var handler = FocusChanged; if (handler != null) { handler (this, widget.HasFocus); } } private void OnMap (object o, EventArgs args) { NotifyStateChange (StateType.Showing, widget.Visible && widget.IsMapped); } private void OnAllocated (object o, EventArgs args) { var a = widget.Allocation; var bounds = new Atk.Rectangle () { X = a.X, Y = a.Y, Width = a.Width, Height = a.Height }; GLib.Signal.Emit (this, "bounds_changed", bounds); /*var handler = BoundsChanged; if (handler != null) { handler (this, new BoundsChangedArgs () { Args = new object [] { bounds } }); }*/ } private event FocusHandler FocusChanged; #region Atk.Component public uint AddFocusHandler (Atk.FocusHandler handler) { if (!focus_handlers.ContainsValue (handler)) { FocusChanged += handler; focus_handlers[++focus_id] = handler; return focus_id; } return 0; } public bool Contains (int x, int y, Atk.CoordType coordType) { int x_extents, y_extents, w, h; GetExtents (out x_extents, out y_extents, out w, out h, coordType); Gdk.Rectangle extents = new Gdk.Rectangle (x_extents, y_extents, w, h); return extents.Contains (x, y); } public virtual Atk.Object RefAccessibleAtPoint (int x, int y, Atk.CoordType coordType) { return new NoOpObject (widget); } public void GetExtents (out int x, out int y, out int w, out int h, Atk.CoordType coordType) { w = widget.Allocation.Width; h = widget.Allocation.Height; GetPosition (out x, out y, coordType); } public void GetPosition (out int x, out int y, Atk.CoordType coordType) { Gdk.Window window = null; if (!widget.IsDrawable) { x = y = Int32.MinValue; return; } if (widget.Parent != null) { x = widget.Allocation.X; y = widget.Allocation.Y; window = widget.ParentWindow; } else { x = 0; y = 0; window = widget.GdkWindow; } int x_window, y_window; window.GetOrigin (out x_window, out y_window); x += x_window; y += y_window; if (coordType == Atk.CoordType.Window) { window = widget.GdkWindow.Toplevel; int x_toplevel, y_toplevel; window.GetOrigin (out x_toplevel, out y_toplevel); x -= x_toplevel; y -= y_toplevel; } } public void GetSize (out int w, out int h) { w = widget.Allocation.Width; h = widget.Allocation.Height; } public bool GrabFocus () { if (!widget.CanFocus) { return false; } widget.GrabFocus (); var toplevel_window = widget.Toplevel as Gtk.Window; if (toplevel_window != null) { toplevel_window.Present (); } return true; } public void RemoveFocusHandler (uint handlerId) { if (focus_handlers.ContainsKey (handlerId)) { FocusChanged -= focus_handlers[handlerId]; focus_handlers.Remove (handlerId); } } public bool SetExtents (int x, int y, int w, int h, Atk.CoordType coordType) { return SetSizeAndPosition (x, y, w, h, coordType, true); } public bool SetPosition (int x, int y, Atk.CoordType coordType) { return SetSizeAndPosition (x, y, 0, 0, coordType, false); } private bool SetSizeAndPosition (int x, int y, int w, int h, Atk.CoordType coordType, bool setSize) { if (!widget.IsTopLevel) { return false; } if (coordType == CoordType.Window) { int x_off, y_off; widget.GdkWindow.GetOrigin (out x_off, out y_off); x += x_off; y += y_off; if (x < 0 || y < 0) { return false; } } #pragma warning disable 0612 widget.SetUposition (x, y); #pragma warning restore 0612 if (setSize) { widget.SetSizeRequest (w, h); } return true; } public bool SetSize (int w, int h) { if (widget.IsTopLevel) { widget.SetSizeRequest (w, h); return true; } else { return false; } } public double Alpha { get { return 1.0; } } #endregion Atk.Component } #endif } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/GtkWorkarounds.cs0000644000175000017500000000650411420634720023750 0ustar00rubenruben00000000000000// // GtkWorkarounds.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Reflection; namespace Hyena.Gui { public static class GtkWorkarounds { private static bool toggle_ref_supported; private static MethodInfo g_object_ref; private static MethodInfo gdk_window_destroy; private static object [] invoke_args; static GtkWorkarounds () { if (!(toggle_ref_supported = Assembly.GetAssembly (typeof (GLib.Object)).GetType ( "GLib.ToggleRef") != null)) { return; } // Find the P/Invoke signatures we need so we can avoid a dllmap g_object_ref = typeof (GLib.Object).GetMethod ("g_object_ref", BindingFlags.NonPublic | BindingFlags.Static); gdk_window_destroy = typeof (Gdk.Window).GetMethod ("gdk_window_destroy", BindingFlags.NonPublic | BindingFlags.Static); } public static void WindowDestroy (Gdk.Window window) { // There is a bug in GDK, and subsequently in Gdk# 2.8.5 through 2.12.1 // where the managed Gdk.Window.Destroy function does not obtain a // normal reference (non-toggle) on the GdkWindow before calling // _destroy on it, which the native function apparently expects. // https://bugzilla.novell.com/show_bug.cgi?id=382186 // http://anonsvn.mono-project.com/viewcvs/trunk/gtk-sharp/gdk/Window.custom?rev=101734&r1=42529&r2=101734 if (window == null) { return; } if (!toggle_ref_supported) { window.Destroy (); return; } // If this ever happens I will move out west and start farming... if (g_object_ref == null || gdk_window_destroy == null) { window.Destroy (); return; } if (invoke_args == null) { invoke_args = new object[1]; } invoke_args[0] = window.Handle; g_object_ref.Invoke (null, invoke_args); gdk_window_destroy.Invoke (null, invoke_args); window.Dispose (); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/TestModuleAttribute.cs0000644000175000017500000000300711420634720024730 0ustar00rubenruben00000000000000// // TestModuleAttribute.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Gui { internal class TestModuleAttribute : Attribute { private string name; public string Name { get { return name; } set { name = value; } } public TestModuleAttribute (string name) { this.name = name; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/ActionManager.cs0000644000175000017500000001357011467745411023510 0ustar00rubenruben00000000000000// // ActionManager.cs // // Author: // Aaron Bockover // // Copyright (C) 2006-2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.IO; using System.Reflection; using System.Collections.Generic; using Gtk; using Action = Gtk.Action; using Hyena; namespace Hyena.Gui { public class ActionManager { private UIManager ui_manager; private Dictionary action_groups = new Dictionary (); public ActionManager () { ui_manager = new UIManager (); } public virtual void Initialize () { } private void InnerAddActionGroup (ActionGroup group) { action_groups.Add (group.Name, group); ui_manager.InsertActionGroup (group, 0); } public void AddActionGroup (string name) { lock (this) { if (action_groups.ContainsKey (name)) { throw new ApplicationException ("Group already exists"); } InnerAddActionGroup (new ActionGroup (name)); } } public void AddActionGroup (ActionGroup group) { lock (this) { if (action_groups.ContainsKey (group.Name)) { throw new ApplicationException ("Group already exists"); } InnerAddActionGroup (group); } } public void RemoveActionGroup (string name) { lock (this) { if (action_groups.ContainsKey (name)) { ActionGroup group = action_groups[name]; ui_manager.RemoveActionGroup (group); action_groups.Remove (name); } } } public void RemoveActionGroup (ActionGroup group) { RemoveActionGroup (group.Name); } public ActionGroup FindActionGroup (string actionGroupId) { foreach (ActionGroup group in action_groups.Values) { if (group.Name == actionGroupId) { return group; } } return null; } public Gtk.Action FindAction (string actionId) { string [] parts = actionId.Split ('.'); if (parts == null || parts.Length < 2) { return null; } string group_name = parts[0]; string action_name = parts[1]; ActionGroup group = FindActionGroup (group_name); return group == null ? null : group.GetAction (action_name); } public void PopulateToolbarPlaceholder (Toolbar toolbar, string path, Widget item) { PopulateToolbarPlaceholder (toolbar, path, item, false); } public void PopulateToolbarPlaceholder (Toolbar toolbar, string path, Widget item, bool expand) { ToolItem placeholder = (ToolItem)UIManager.GetWidget (path); int position = toolbar.GetItemIndex (placeholder); toolbar.Remove (placeholder); if (item is ToolItem) { ((ToolItem)item).Expand = expand; toolbar.Insert ((ToolItem)item, position); } else { ToolItem container_item = new Hyena.Widgets.GenericToolItem (item); container_item.Expand = expand; container_item.Show (); container_item.ToolbarReconfigured += (o, a) => { SetItemSize (container_item, container_item.IconSize); }; toolbar.Insert (container_item, position); } } private void SetItemSize (Gtk.Widget widget, Gtk.IconSize size) { var container = widget as Container; if (container != null) { foreach (var child in container.Children) { SetItemSize (child, size); } } var img = widget as Image; if (img != null) { img.IconSize = (int)size; } } public uint AddUiFromFileInCurrentAssembly (string ui_file) { return AddUiFromFile (ui_file, Assembly.GetCallingAssembly ()); } public uint AddUiFromFile (string ui_file, Assembly assembly) { if (ui_file != null) { using (StreamReader reader = new StreamReader (assembly.GetManifestResourceStream (ui_file))) { return ui_manager.AddUiFromString (reader.ReadToEnd ()); } } return 0; } public Gtk.Action this[string actionId] { get { return FindAction (actionId); } } public UIManager UIManager { get { return ui_manager; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/EditableEraseAction.cs0000644000175000017500000000665011420634720024615 0ustar00rubenruben00000000000000// // EditableEraseAction.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; using Hyena; namespace Hyena.Gui { internal class EditableEraseAction : IUndoAction { private Editable editable; private string text; private int start; private int end; private bool is_forward; private bool is_cut; public EditableEraseAction (Editable editable, int start, int end) { this.editable = editable; this.text = editable.GetChars (start, end); this.start = start; this.end = end; this.is_cut = end - start > 1; this.is_forward = editable.Position < start; } public void Undo () { int start_r = start; editable.InsertText (text, ref start_r); editable.Position = is_forward ? start_r : end; } public void Redo () { editable.DeleteText (start, end); editable.Position = start; } public void Merge (IUndoAction action) { EditableEraseAction erase = (EditableEraseAction)action; if (start == erase.start) { text += erase.text; end += erase.end - erase.start; } else { text = erase.text + text; start = erase.start; } } public bool CanMerge (IUndoAction action) { EditableEraseAction erase = action as EditableEraseAction; if (erase == null) { return false; } return !( is_cut || erase.is_cut || // don't group separate text cuts start != (is_forward ? erase.start : erase.end) || // must meet eachother is_forward != erase.is_forward || // don't group deletes with backspaces text[0] == '\n' || // don't group more than one line (inclusive) erase.text[0] == ' ' || erase.text[0] == '\t' // don't group more than one word (exclusive) ); } public override string ToString () { return String.Format ("Erased: [{0}] ({1},{2})", text, start, end); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/Contrast.cs0000644000175000017500000002777711420634720022600 0ustar00rubenruben00000000000000// // Contrast.cs // // Authors: // David Trowbridge // Sebastian Dröge // // Copyright (C) 2006-2007 David Trowbridge // Copyright (C) 2008 Sebastian Dröge // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Cairo; namespace Hyena.Gui { /* Defined colors. Keep this list alphabetized if you add new ones, * but set the enum value to be at the end of the color_regions table * in contrast.c to maintain binary compatibility */ public enum ContrastPaletteColor { Aqua = 0, Black = 1, Blue = 2, Brown = 3, Cyan = 4, DarkBlue = 5, DarkGreen = 6, DarkGrey = 7, DarkRed = 8, Green = 9, Grey = 10, LightBlue = 11, LightBrown = 12, LightGreen = 13, LightGrey = 14, LightRed = 15, Magenta = 16, Orange = 17, Purple = 18, Red = 19, Violet = 20, White = 21, Yellow = 22, Last = 23 }; public static class Contrast { /* Data for color palette optimization. * * These numbers are completely arbitrary decisions, uninformed by the experts * at crayola. These colors are defined as boxes within the CIE L*a*b* color * space -- while they're not fully inclusive, they are "safe" in that anywhere * within a given region is guaranteed to be the expected color. The data here * are endpoints in each dimension of CIELAB, from which the 8 corners of the * region are created to test. * * Add new entries to the end of this list. */ private static readonly float[,] color_regions = { {40.0f, 60.0f, -100.0f, -80.0f, -10.0f, 20.0f}, /* Aqua */ { 0.0f, 30.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* Black */ {25.0f, 35.0f, -100.0f, 0.0f, -100.0f, -50.0f}, /* Blue */ {30.0f, 60.0f, 30.0f, 50.0f, 70.0f, 100.0f}, /* Brown */ {50.0f, 65.0f, -100.0f, -30.0f, -100.0f, -50.0f}, /* Cyan */ { 0.0f, 20.0f, -40.0f, 50.0f, -100.0f, -60.0f}, /* Dark Blue */ {20.0f, 35.0f, -100.0f, -70.0f, 60.0f, 100.0f}, /* Dark Green */ {20.0f, 40.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* Dark Grey */ {10.0f, 40.0f, 90.0f, 100.0f, 70.0f, 100.0f}, /* Dark Red */ {15.0f, 40.0f, -100.0f, -80.0f, 80.0f, 100.0f}, /* Green */ {35.0f, 60.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* Grey */ {40.0f, 50.0f, -100.0f, 0.0f, -100.0f, -60.0f}, /* Light Blue */ {60.0f, 75.0f, 30.0f, 50.0f, 80.0f, 100.0f}, /* Light Brown */ {80.0f, 90.0f, -100.0f, -70.0f, 70.0f, 100.0f}, /* Light Green */ {50.0f, 80.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* Light Grey */ {55.0f, 65.0f, 80.0f, 90.0f, 75.0f, 100.0f}, /* Light Red */ {40.0f, 55.0f, 90.0f, 100.0f, -50.0f, 0.0f}, /* Magenta */ {65.0f, 80.0f, 20.0f, 65.0f, 90.0f, 100.0f}, /* Orange */ {35.0f, 45.0f, 85.0f, 100.0f, -90.0f, -80.0f}, /* Purple */ {40.0f, 50.0f, 80.0f, 100.0f, 75.0f, 100.0f}, /* Red */ {70.0f, 95.0f, 90.0f, 100.0f, -100.0f, 0.0f}, /* Violet */ {75.0f, 100.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* White */ {90.0f, 100.0f, 5.0f, 15.0f, 92.5f, 105.0f}, /* Yellow */ }; /* This performs the non-linear transformation that accounts for the gamma curve * in sRGB, but avoids numerical problems. */ private static float srgb_to_xyz_g (float K) { const float a = 0.055f; const float gamma = 2.4f; if (K > 0.04045f) return (float) Math.Pow((K + a) / (1 + a), gamma); else return K / 12.92f; } private static float xyz_to_lab_f(float t) { if (t > 0.008856f) return (float) Math.Pow(t, 1.0f/3.0f); else return 7.787f*t + 16.0f/116.0f; } private static void rgb_to_lab(ushort R, ushort G, ushort B, out float L, out float a, out float b) { float x, y, z, gr, gg, gb, fy; /* This is the reference white point. Since we're treating "RGB" as * sRGB, this is the D65 point. */ const float Xn = 0.93819f; const float Yn = 0.98705f; const float Zn = 1.07475f; gr = srgb_to_xyz_g(R / 65535.0f); gg = srgb_to_xyz_g(G / 65535.0f); gb = srgb_to_xyz_g(B / 65535.0f); x = 0.412424f * gr + 0.357579f * gg + 0.180464f * gb; y = 0.212656f * gr + 0.715158f * gg + 0.072186f * gb; z = 0.019332f * gr + 0.119193f * gg + 0.950444f * gb; fy = xyz_to_lab_f(y / Yn); L = 116.0f * fy - 16.0f; a = 500.0f * (xyz_to_lab_f(x / Xn) - fy); b = 200.0f * (fy - xyz_to_lab_f(z / Zn)); } private static float xyz_to_srgb_C(float K) { const float a = 0.055f; const float gamma = 2.4f; if (K > 0.00304f) return (1.0f + a) * ((float) Math.Pow(K, (1.0f / gamma))) - a; else return K * 12.92f; } private static void lab_to_rgb(float L, float a, float b, out ushort R, out ushort G, out ushort B) { float x, y, z, fy, fx, fz, delta, delta2, rs, gs, bs; const float Xn = 0.93819f; const float Yn = 0.98705f; const float Zn = 1.07475f; fy = (L + 16.0f) / 116.0f; fx = fy + a / 500.0f; fz = fy - b / 200.0f; delta = 6.0f / 29.0f; delta2 = (float) Math.Pow(delta, 2.0f); if (fx > delta) x = Xn * ((float) Math.Pow(fx, 3.0f)); else x = (fx - 16.0f/116.0f) * 3.0f * delta2 * Xn; if (fy > delta) y = Yn * ((float) Math.Pow(fy, 3.0f)); else y = (fy - 16.0f/116.0f) * 3.0f * delta2 * Yn; if (fz > delta) z = Zn * ((float) Math.Pow(fz, 3.0f)); else z = (fz - 16.0f/116.0f) * 3.0f * delta2 * Zn; rs = 3.2410f * x - 1.5374f * y - 0.4986f * z; gs = -0.9692f * x + 1.8760f * y + 0.0416f * z; bs = 0.0556f * x - 0.2040f * y + 1.0570f * z; float tmp; tmp = (float) Math.Floor(xyz_to_srgb_C(rs) * 65535.0f + 0.5f); if (tmp < 0.0f) R = 0; else if (tmp > 65535.0f) R = 65535; else R = (ushort) tmp; tmp = (float) Math.Floor(xyz_to_srgb_C(gs) * 65535.0f + 0.5f); if (tmp < 0.0f) G = 0; else if (tmp > 65535.0f) G = 65535; else G = (ushort) tmp; tmp = (float) Math.Floor(xyz_to_srgb_C(bs) * 65535.0f + 0.5f); if (tmp < 0.0f) B = 0; else if (tmp > 65535.0f) B = 65535; else B = (ushort) tmp; } private static float lab_distance(float La, float aa, float ba, float Lb, float ab, float bb) { float dL, da, db; dL = Math.Abs(Lb - La); da = Math.Abs(ab - aa); db = Math.Abs(bb - ba); return (float) Math.Sqrt(dL*dL + da*da + db*db); } /* Creates a specific color value for a foreground color, optimizing for * maximum readability against the background. */ public static Color RenderForegroundColor(Color background, ContrastPaletteColor color) { float L, a, b; int max_color; float max_dist; float[,] points = new float[8,3]; float ld, cd; int i; rgb_to_lab((ushort)(background.R * 255), (ushort)(background.G * 255), (ushort)(background.B * 255), out L, out a, out b); points[0,0] = color_regions[(int)color,0]; points[0,1] = color_regions[(int)color,2]; points[0,2] = color_regions[(int)color,4]; points[1,0] = color_regions[(int)color,0]; points[1,1] = color_regions[(int)color,2]; points[1,2] = color_regions[(int)color,5]; points[2,0] = color_regions[(int)color,0]; points[2,1] = color_regions[(int)color,3]; points[2,2] = color_regions[(int)color,4]; points[3,0] = color_regions[(int)color,0]; points[3,1] = color_regions[(int)color,3]; points[3,2] = color_regions[(int)color,5]; points[4,0] = color_regions[(int)color,1]; points[4,1] = color_regions[(int)color,2]; points[4,2] = color_regions[(int)color,4]; points[5,0] = color_regions[(int)color,1]; points[5,1] = color_regions[(int)color,2]; points[5,2] = color_regions[(int)color,5]; points[6,0] = color_regions[(int)color,1]; points[6,1] = color_regions[(int)color,3]; points[6,2] = color_regions[(int)color,4]; points[7,0] = color_regions[(int)color,1]; points[7,1] = color_regions[(int)color,3]; points[7,2] = color_regions[(int)color,5]; max_dist = 0; max_color = 0; for (i = 0; i < 8; i++) { float dist = lab_distance(L, a, b, points[i,0], points[i,1], points[i,2]); if (dist > max_dist) { max_dist = dist; max_color = i; } } /* If the luminosity distance is really short, extend the vector further * out. This may push it outside the bounds of the region that a color * is specified in, but it keeps things readable when the background and * foreground are really close. */ ld = Math.Abs(L - points[max_color,0]); cd = (float) Math.Sqrt (Math.Pow (Math.Abs (a - points[max_color,1]), 2.0f) + Math.Pow (Math.Abs (b - points[max_color,2]), 2.0f)); if ((ld < 10.0f) && (cd < 60.0f)) { float dL, da, db; dL = points[max_color,0] - L; da = points[max_color,1] - a; db = points[max_color,2] - b; points[max_color,0] = L + (dL * 4.0f); points[max_color,1] = a + (da * 1.5f); points[max_color,2] = b + (db * 1.5f); } ushort red, green, blue; lab_to_rgb(points[max_color,0], points[max_color,1], points[max_color,2], out red, out green, out blue); return new Color (red / 255.0, green / 255.0, blue / 255.0); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/PixbufImageSurface.cs0000644000175000017500000001623111420634720024473 0ustar00rubenruben00000000000000// // PixbufImageSurface.cs // // Author: // Aaron Bockover // // Copyright 2008-2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Runtime.InteropServices; using Cairo; namespace Hyena.Gui { public class PixbufImageSurface : ImageSurface, IDisposable { private delegate void cairo_destroy_func_t (IntPtr userdata); private static bool is_le = BitConverter.IsLittleEndian; private static int user_data_key = 0; private static cairo_destroy_func_t destroy_func; private static void DestroyPixelData (IntPtr data) { Marshal.FreeHGlobal (data); } static PixbufImageSurface () { destroy_func = new cairo_destroy_func_t (DestroyPixelData); } public static ImageSurface Create (Gdk.Pixbuf pixbuf) { return Create (pixbuf, false); } public static ImageSurface Create (Gdk.Pixbuf pixbuf, bool disposePixbuf) { if (pixbuf == null || pixbuf.Handle == IntPtr.Zero) { return null; } if (!PlatformDetection.IsWindows) { try { return new PixbufImageSurface (pixbuf, disposePixbuf); } catch { return null; } } else { // FIXME: // Windows has some trouble running the PixbufImageSurface, so as a // workaround a slower but working version of this factory method is // implemented. One day we can come back and optimize this by finding // out what's causing the PixbufImageSurface to result in access // violations when the object is disposed. ImageSurface target = new ImageSurface (Format.ARGB32, pixbuf.Width, pixbuf.Height); Context context = new Context (target); try { Gdk.CairoHelper.SetSourcePixbuf (context, pixbuf, 0, 0); context.Paint (); } finally { ((IDisposable)context).Dispose (); if (disposePixbuf) { ((IDisposable)pixbuf).Dispose (); } } return target; } } private IntPtr data; public PixbufImageSurface (Gdk.Pixbuf pixbuf) : this (pixbuf, false) { } public PixbufImageSurface (Gdk.Pixbuf pixbuf, bool disposePixbuf) : this (disposePixbuf ? pixbuf : null, pixbuf.Width, pixbuf.Height, pixbuf.NChannels, pixbuf.Rowstride, pixbuf.Pixels) { } // This ctor is to avoid multiple queries against the GdkPixbuf for width/height private PixbufImageSurface (Gdk.Pixbuf pixbuf, int width, int height, int channels, int rowstride, IntPtr pixels) : this (pixbuf, Marshal.AllocHGlobal (width * height * 4), width, height, channels, rowstride, pixels) { } private PixbufImageSurface (Gdk.Pixbuf pixbuf, IntPtr data, int width, int height, int channels, int rowstride, IntPtr pixels) : base (data, channels == 3 ? Format.Rgb24 : Format.Argb32, width, height, width * 4) { this.data = data; CreateSurface (width, height, channels, rowstride, pixels); SetDestroyFunc (); if (pixbuf != null && pixbuf.Handle != IntPtr.Zero) { pixbuf.Dispose (); } } private unsafe void CreateSurface (int width, int height, int channels, int gdk_rowstride, IntPtr pixels) { byte *gdk_pixels = (byte *)pixels; byte *cairo_pixels = (byte *)data; for (int i = height; i > 0; i--) { byte *p = gdk_pixels; byte *q = cairo_pixels; if (channels == 3) { byte *end = p + 3 * width; while (p < end) { if (is_le) { q[0] = p[2]; q[1] = p[1]; q[2] = p[0]; } else { q[1] = p[0]; q[2] = p[1]; q[3] = p[2]; } p += 3; q += 4; } } else { byte *end = p + 4 * width; while (p < end) { if (is_le) { q[0] = Mult (p[2], p[3]); q[1] = Mult (p[1], p[3]); q[2] = Mult (p[0], p[3]); q[3] = p[3]; } else { q[0] = p[3]; q[1] = Mult (p[0], p[3]); q[2] = Mult (p[1], p[3]); q[3] = Mult (p[2], p[3]); } p += 4; q += 4; } } gdk_pixels += gdk_rowstride; cairo_pixels += 4 * width; } } private static byte Mult (byte c, byte a) { int t = c * a + 0x7f; return (byte)(((t >> 8) + t) >> 8); } [DllImport ("libcairo-2.dll")] private static extern Cairo.Status cairo_surface_set_user_data (IntPtr surface, ref int key, IntPtr userdata, cairo_destroy_func_t destroy); private void SetDestroyFunc () { try { Status status = cairo_surface_set_user_data (Handle, ref user_data_key, data, destroy_func); if (status != Status.Success) { throw new ApplicationException (String.Format ( "cairo_surface_set_user_data returned {0}", status)); } } catch (Exception e) { Console.Error.WriteLine ("WARNING: Image data will be leaked! ({0} bytes)", Width * Height * 4); Console.Error.WriteLine (e); } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/TestModuleRunner.cs0000644000175000017500000000674411467745411024264 0ustar00rubenruben00000000000000// // TestModuleRunner.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Reflection; using Gtk; namespace Hyena.Gui { public class TestModuleRunner : Window { public static void Run () { Application.Init (); Hyena.ThreadAssist.InitializeMainThread (); TestModuleRunner runner = new TestModuleRunner (); runner.DeleteEvent += delegate { Application.Quit (); }; runner.ShowAll (); Application.Run (); } private TreeStore store; public TestModuleRunner () : base ("Hyena.Gui Module Tester") { SetSizeRequest (-1, 300); Move (100, 100); BuildModuleList (); BuildView (); } private void BuildModuleList () { store = new TreeStore (typeof (string), typeof (Type)); foreach (Type type in Assembly.GetExecutingAssembly ().GetTypes ()) { foreach (TestModuleAttribute attr in type.GetCustomAttributes (typeof (TestModuleAttribute), false)) { store.AppendValues (attr.Name, type); } } } private void BuildView () { VBox box = new VBox (); Add (box); ScrolledWindow sw = new ScrolledWindow (); sw.HscrollbarPolicy = PolicyType.Never; TreeView view = new TreeView (); view.RowActivated += delegate (object o, RowActivatedArgs args) { TreeIter iter; if (store.GetIter (out iter, args.Path)) { Type type = (Type)store.GetValue (iter, 1); Window window = (Window)Activator.CreateInstance (type); window.WindowPosition = WindowPosition.Center; window.DeleteEvent += delegate { window.Destroy (); }; window.Show (); } }; view.Model = store; view.AppendColumn ("Module", new CellRendererText (), "text", 0); sw.Add (view); box.PackStart (sw, true, true, 0); sw.ShowAll (); Button button = new Button (Stock.Quit); button.Clicked += delegate { Destroy (); Application.Quit (); }; box.PackStart (button, false, false, 0); box.ShowAll (); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/ShadingTestWindow.cs0000644000175000017500000000566311420634720024376 0ustar00rubenruben00000000000000// // ShadingTestWindow.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; namespace Hyena.Gui { public class ShadingTestWindow : Window { private int steps = 16; public ShadingTestWindow () : base ("Shading Test") { SetSizeRequest (512, 512); } protected override bool OnExposeEvent (Gdk.EventExpose evnt) { Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window); double step_width = Allocation.Width / (double)steps; double step_height = Allocation.Height / (double)steps; double h = 1.0; double s = 0.0; for (int xi = 0, i = 0; xi < steps; xi++) { for (int yi = 0; yi < steps; yi++, i++) { double bg_b = (double)(i / 255.0); double fg_b = 1.0 - bg_b; double x = Allocation.X + xi * step_width; double y = Allocation.Y + yi * step_height; cr.Rectangle (x, y, step_width, step_height); cr.Color = CairoExtensions.ColorFromHsb (h, s, bg_b); cr.Fill (); int tw, th; Pango.Layout layout = new Pango.Layout (PangoContext); layout.SetText (((int)(bg_b * 255.0)).ToString ()); layout.GetPixelSize (out tw, out th); cr.Translate (0.5, 0.5); cr.MoveTo (x + (step_width - tw) / 2.0, y + (step_height - th) / 2.0); cr.Color = CairoExtensions.ColorFromHsb (h, s, fg_b); PangoCairoHelper.ShowLayout (cr, layout); cr.Translate (-0.5, -0.5); } } CairoExtensions.DisposeContext (cr); return true; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/RatingRenderer.cs0000644000175000017500000001352411441732606023704 0ustar00rubenruben00000000000000// // RatingRenderer.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; using Cairo; namespace Hyena.Gui { public class RatingRenderer { private static double [,] star_plot = new double[,] { { 0, 0.425 }, { 0.375, 0.375 }, { 0.5, 0.05 }, { 0.625, 0.375 }, { 1, 0.425 }, { 0.75, 0.625 }, { 0.8, 0.95 }, { 0.5, 0.75 }, { 0.2, 0.95 }, { 0.25, 0.625 }, { 0, 0.425 }, }; public RatingRenderer () { } public virtual void Render (Context cr, Gdk.Rectangle area, Color color, bool showEmptyStars, bool isHovering, int hoverValue, double fillOpacity, double hoverFillOpacity, double strokeOpacity) { if (Value == MinRating && !isHovering && !showEmptyStars) { return; } Cairo.Color fill_color = color; fill_color.A = fillOpacity; Cairo.Color stroke_color = fill_color; stroke_color.A = strokeOpacity; Cairo.Color hover_fill_color = fill_color; hover_fill_color.A = hoverFillOpacity; double x, y; ComputePosition (area, out x, out y); cr.LineWidth = 1.0; cr.Translate (0.5, 0.5); for (int i = MinRating + 1, s = isHovering || showEmptyStars ? MaxRating : Value; i <= s; i++, x += Size) { bool fill = i <= Value && Value > MinRating; bool hover_fill = i <= hoverValue && hoverValue > MinRating; double scale = fill || hover_fill ? Size : Size - 2; double ofs = fill || hover_fill ? 0 : 1; for (int p = 0, n = star_plot.GetLength (0); p < n; p++) { double px = x + ofs + star_plot[p, 0] * scale; double py = y + ofs + star_plot[p, 1] * scale; if (p == 0) { cr.MoveTo (px, py); } else { cr.LineTo (px, py); } } cr.ClosePath (); if (fill || hover_fill) { if (!isHovering || hoverValue >= Value) { cr.Color = fill ? fill_color : hover_fill_color; } else { cr.Color = hover_fill ? fill_color : hover_fill_color; } cr.Fill (); } else { cr.Color = stroke_color; cr.Stroke (); } } } protected void ComputePosition (Gdk.Rectangle area, out double x, out double y) { double cell_width = area.Width - 2 * Xpad; double cell_height = area.Height - 2 * Ypad; double stars_width = MaxRating * Size; double stars_height = Size; x = area.X + Xpad + (cell_width - stars_width) / 2.0; y = area.Y + Ypad + (cell_height - stars_height) / 2.0; } public int RatingFromPosition (Gdk.Rectangle area, double x) { double r_x, r_y; ComputePosition (area, out r_x, out r_y); return x <= r_x ? 0 : Clamp (MinRating, MaxRating, (int)Math.Ceiling ((x - r_x) / Size) + MinRating); } private static int Clamp (int min, int max, int value) { return Math.Max (min, Math.Min (max, value)); } public int ClampValue (int value) { return Clamp (MinRating, MaxRating, value); } private int value; public int Value { get { return ClampValue (this.value); } set { this.value = ClampValue (value); } } private int size = 14; public int Size { get { return size; } set { size = value; } } private int min_rating = 0; public int MinRating { get { return min_rating; } set { min_rating = value; } } private int max_rating = 5; public int MaxRating { get { return max_rating; } set { max_rating = value; } } public int RatingLevels { get { return MaxRating - MinRating + 1; } } private int xpad = 2; public int Xpad { get { return xpad; } set { xpad = value; } } public int ypad = 2; public int Ypad { get { return ypad; } set { ypad = value; } } public int Width { get { return Xpad * 2 + RatingLevels * Size; } } public int Height { get { return Ypad * 2 + Size; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/EditableInsertAction.cs0000644000175000017500000000565711420634720025030 0ustar00rubenruben00000000000000// // EditableInsertAction.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; using Hyena; namespace Hyena.Gui { internal class EditableInsertAction : IUndoAction { private Editable editable; private string text; private int index; private bool is_paste; public EditableInsertAction (Editable editable, int start, string text, int length) { this.editable = editable; this.text = text; this.index = start; this.is_paste = length > 1; } public void Undo () { editable.DeleteText (index, index + text.Length); editable.Position = index; } public void Redo () { int index_r = index; editable.InsertText (text, ref index_r); editable.Position = index_r; } public void Merge (IUndoAction action) { text += ((EditableInsertAction)action).text; } public bool CanMerge (IUndoAction action) { EditableInsertAction insert = action as EditableInsertAction; if (insert == null || String.IsNullOrEmpty (text)) { return false; } return !( is_paste || insert.is_paste || // Don't group text pastes insert.index != index + text.Length || // Must meet eachother text[0] == '\n' || // Don't group more than one line (inclusive) insert.text[0] == ' ' || insert.text[0] == '\t' // Don't group more than one word (exclusive) ); } public override string ToString () { return String.Format ("Inserted: [{0}] ({1})", text, index); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/CairoDamageDebugger.cs0000644000175000017500000000406011420634720024560 0ustar00rubenruben00000000000000// // CairoDamageDebugger.cs // // Author: // Aaron Bockover // // Copyright 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Cairo; namespace Hyena.Gui { public static class CairoDamageDebugger { private static Random rand = new Random (); public static void RenderDamage (this Context cr, Gdk.Rectangle damage) { RenderDamage (cr, damage.X, damage.Y, damage.Width, damage.Height); } public static void RenderDamage (this Context cr, Cairo.Rectangle damage) { RenderDamage (cr, damage.X, damage.Y, damage.Width, damage.Height); } public static void RenderDamage (this Context cr, double x, double y, double w, double h) { cr.Save (); cr.LineWidth = 1.0; cr.Color = CairoExtensions.RgbToColor ((uint)rand.Next (0, 0xffffff)); cr.Rectangle (x + 0.5, y + 0.5, w - 1, h - 1); cr.Stroke (); cr.Restore (); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/GtkUtilities.cs0000644000175000017500000001606311467745411023421 0ustar00rubenruben00000000000000// // GtkUtilities.cs // // Author: // Aaron Bockover // // Copyright 2007-2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; namespace Hyena.Gui { public delegate void WidgetAction (T widget) where T : class; public static class GtkUtilities { private static Gdk.ModifierType [] important_modifiers = new Gdk.ModifierType [] { Gdk.ModifierType.ControlMask, Gdk.ModifierType.ShiftMask }; public static bool NoImportantModifiersAreSet () { return NoImportantModifiersAreSet (important_modifiers); } public static bool NoImportantModifiersAreSet (params Gdk.ModifierType [] modifiers) { Gdk.ModifierType state; if (Global.CurrentEvent is Gdk.EventKey) { state = ((Gdk.EventKey)Global.CurrentEvent).State; } else if (Global.CurrentEvent is Gdk.EventButton) { state = ((Gdk.EventButton)Global.CurrentEvent).State; } else { return false; } foreach (Gdk.ModifierType modifier in modifiers) { if ((state & modifier) == modifier) { return false; } } return true; } public static FileFilter GetFileFilter (string name, System.Collections.Generic.IEnumerable extensions) { FileFilter filter = new FileFilter (); filter.Name = name; foreach (string extension in extensions) { filter.AddPattern (String.Format ("*.{0}", extension.ToLower ())); filter.AddPattern (String.Format ("*.{0}", extension.ToUpper ())); } return filter; } public static void SetChooserShortcuts (Gtk.FileChooserDialog chooser, params string [] shortcuts) { foreach (string shortcut in shortcuts) { if (shortcut != null) { try { chooser.AddShortcutFolder (shortcut); } catch {} } } } public static Gdk.Color ColorBlend (Gdk.Color a, Gdk.Color b) { // at some point, might be nice to allow any blend? double blend = 0.5; if (blend < 0.0 || blend > 1.0) { throw new ApplicationException ("blend < 0.0 || blend > 1.0"); } double blendRatio = 1.0 - blend; int aR = a.Red >> 8; int aG = a.Green >> 8; int aB = a.Blue >> 8; int bR = b.Red >> 8; int bG = b.Green >> 8; int bB = b.Blue >> 8; double mR = aR + bR; double mG = aG + bG; double mB = aB + bB; double blR = mR * blendRatio; double blG = mG * blendRatio; double blB = mB * blendRatio; Gdk.Color color = new Gdk.Color ((byte)blR, (byte)blG, (byte)blB); Gdk.Colormap.System.AllocColor (ref color, true, true); return color; } public static void AdaptGtkRcStyle (Widget adaptee, Type adapter) { GLib.GType type = (GLib.GType)adapter; string path = String.Format ("*.{0}", type); AdaptGtkRcStyle (adaptee, type, path, path); } public static void AdaptGtkRcStyle (Widget adaptee, GLib.GType adapter, string widgetPath, string classPath) { Style style = Gtk.Rc.GetStyleByPaths (adaptee.Settings, widgetPath, classPath, adapter); if (style == null) { return; } foreach (StateType state in Enum.GetValues (typeof (StateType))) { adaptee.ModifyBase (state, style.Base (state)); adaptee.ModifyBg (state, style.Background (state)); adaptee.ModifyFg (state, style.Foreground (state)); adaptee.ModifyText (state, style.Text (state)); } } public static T StyleGetProperty (Widget widget, string property, T default_value) { object result = null; try { result = widget.StyleGetProperty (property); } catch {} return result != null && result.GetType () == typeof (T) ? (T)result : default_value; } public static void ForeachWidget (Container container, WidgetAction action) where T : class { if (container == null) { return; } foreach (Widget child in container.Children) { T widget = child as T; if (widget != null) { action (widget); } else { Container child_container = child as Container; if (child_container != null) { ForeachWidget (child_container, action); } } } } public static bool ShowUri (string uri) { return ShowUri (null, uri); } public static bool ShowUri (Gdk.Screen screen, string uri) { return ShowUri (screen, uri, Gtk.Global.CurrentEventTime); } [System.Runtime.InteropServices.DllImport ("libgtk-win32-2.0-0.dll")] private static extern unsafe bool gtk_show_uri (IntPtr screen, IntPtr uri, uint timestamp, out IntPtr error); public static bool ShowUri (Gdk.Screen screen, string uri, uint timestamp) { var native_uri = GLib.Marshaller.StringToPtrGStrdup (uri); var native_error = IntPtr.Zero; try { return gtk_show_uri (screen == null ? IntPtr.Zero : screen.Handle, native_uri, timestamp, out native_error); } finally { GLib.Marshaller.Free (native_uri); if (native_error != IntPtr.Zero) { throw new GLib.GException (native_error); } } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/PangoExtensions.cs0000644000175000017500000000522411467745411024121 0ustar00rubenruben00000000000000// // PangoExtensions.cs // // Author: // Aaron Bockover // // Copyright 2009 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. using System; using System.Runtime.InteropServices; using System.Linq; using Pango; namespace Hyena.Gui { public static class PangoExtensions { public static int MeasureTextHeight (this FontDescription description, Context context) { return MeasureTextHeight (description, context, context.Language); } public static int MeasureTextHeight (this FontDescription description, Context context, Language language) { using (var metrics = context.GetMetrics (description, language)) { return ((int)(metrics.Ascent + metrics.Descent) + 512) >> 10; // PANGO_PIXELS (d) } } [DllImport("libpango-1.0-0.dll")] static extern int pango_layout_get_height(IntPtr raw); public static int GetHeight (this Pango.Layout layout) { int raw_ret = pango_layout_get_height(layout.Handle); int ret = raw_ret; return ret; } [DllImport("libpango-1.0-0.dll")] static extern void pango_layout_set_height(IntPtr raw, int height); public static void SetHeight (this Pango.Layout layout, int height) { pango_layout_set_height (layout.Handle, height); } public static string FormatEscaped (this string format, params object [] args) { return String.Format (format, args.Select (a => a == null ? "" : GLib.Markup.EscapeText (a.ToString ())).ToArray ()); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/CompositeUtils.cs0000644000175000017500000001400411420634720023741 0ustar00rubenruben00000000000000// // CompositeUtils.cs // // Author: // Larry Ewing // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Runtime.InteropServices; using Gdk; using Gtk; namespace Hyena.Gui { public static class CompositeUtils { [DllImport ("libgdk-win32-2.0-0.dll")] private static extern IntPtr gdk_screen_get_rgba_visual (IntPtr screen); [DllImport ("libgtk-win32-2.0-0.dll")] private static extern void gtk_widget_input_shape_combine_mask (IntPtr raw, IntPtr shape_mask, int offset_x, int offset_y); [DllImport ("libgdk-win32-2.0-0.dll")] private static extern IntPtr gdk_screen_get_rgba_colormap (IntPtr screen); public static Colormap GetRgbaColormap (Screen screen) { try { IntPtr raw_ret = gdk_screen_get_rgba_colormap (screen.Handle); Gdk.Colormap ret = GLib.Object.GetObject(raw_ret) as Gdk.Colormap; return ret; } catch { Gdk.Visual visual = Gdk.Visual.GetBestWithDepth (32); if (visual != null) { Gdk.Colormap cmap = new Gdk.Colormap (visual, false); return cmap; } } return null; } public static bool SetRgbaColormap (Widget w) { Gdk.Colormap cmap = GetRgbaColormap (w.Screen); if (cmap != null) { w.Colormap = cmap; return true; } return false; } public static Visual GetRgbaVisual (Screen screen) { try { IntPtr raw_ret = gdk_screen_get_rgba_visual (screen.Handle); Gdk.Visual ret = GLib.Object.GetObject (raw_ret) as Gdk.Visual; return ret; } catch { Gdk.Visual visual = Gdk.Visual.GetBestWithDepth (32); if (visual != null) { return visual; } } return null; } [DllImport ("libgdk-win32-2.0-0.dll")] private static extern void gdk_property_change (IntPtr window, IntPtr property, IntPtr type, int format, int mode, uint [] data, int nelements); [DllImport ("libgdk-win32-2.0-0.dll")] private static extern void gdk_property_change (IntPtr window, IntPtr property, IntPtr type, int format, int mode, byte [] data, int nelements); public static void ChangeProperty (Gdk.Window win, Atom property, Atom type, PropMode mode, uint [] data) { gdk_property_change (win.Handle, property.Handle, type.Handle, 32, (int)mode, data, data.Length * 4); } public static void ChangeProperty (Gdk.Window win, Atom property, Atom type, PropMode mode, byte [] data) { gdk_property_change (win.Handle, property.Handle, type.Handle, 8, (int)mode, data, data.Length); } [DllImport ("libgdk-win32-2.0-0.dll")] private static extern bool gdk_x11_screen_supports_net_wm_hint (IntPtr screen, IntPtr property); public static bool SupportsHint (Screen screen, string name) { try { Atom atom = Atom.Intern (name, false); return gdk_x11_screen_supports_net_wm_hint (screen.Handle, atom.Handle); } catch { return false; } } [DllImport ("libgdk-win32-2.0-0.dll")] private static extern bool gdk_screen_is_composited (IntPtr screen); public static bool IsComposited (Screen screen) { bool composited; try { composited = gdk_screen_is_composited (screen.Handle); } catch (EntryPointNotFoundException) { Atom atom = Atom.Intern (String.Format ("_NET_WM_CM_S{0}", screen.Number), false); composited = Gdk.Selection.OwnerGetForDisplay (screen.Display, atom) != null; } // FIXME check for WINDOW_OPACITY so that we support compositing on older composite manager // versions before they started supporting the real check given above if (!composited) { composited = CompositeUtils.SupportsHint (screen, "_NET_WM_WINDOW_OPACITY"); } return composited; } public static void SetWinOpacity (Gtk.Window win, double opacity) { CompositeUtils.ChangeProperty (win.GdkWindow, Atom.Intern ("_NET_WM_WINDOW_OPACITY", false), Atom.Intern ("CARDINAL", false), PropMode.Replace, new uint [] { (uint) (0xffffffff * opacity) } ); } public static void InputShapeCombineMask (Widget w, Pixmap shape_mask, int offset_x, int offset_y) { gtk_widget_input_shape_combine_mask (w.Handle, shape_mask == null ? IntPtr.Zero : shape_mask.Handle, offset_x, offset_y); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/CairoExtensions.cs0000644000175000017500000003247211420634720024104 0ustar00rubenruben00000000000000// // CairoExtensions.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Reflection; using System.Runtime.InteropServices; using Gdk; using Cairo; namespace Hyena.Gui { [Flags] public enum CairoCorners { None = 0, TopLeft = 1, TopRight = 2, BottomLeft = 4, BottomRight = 8, All = 15 } public static class CairoExtensions { public static Pango.Layout CreateLayout (Gtk.Widget widget, Cairo.Context cairo_context) { Pango.Layout layout = PangoCairoHelper.CreateLayout (cairo_context); layout.FontDescription = widget.PangoContext.FontDescription; double resolution = widget.Screen.Resolution; if (resolution != -1) { Pango.Context context = PangoCairoHelper.LayoutGetContext (layout); PangoCairoHelper.ContextSetResolution (context, resolution); context.Dispose (); } Log.Debug ("Creating Pango.Layout, configuring Cairo.Context"); return layout; } public static Surface CreateSurfaceForPixbuf (Cairo.Context cr, Gdk.Pixbuf pixbuf) { Surface surface = cr.Target.CreateSimilar (cr.Target.Content, pixbuf.Width, pixbuf.Height); Cairo.Context surface_cr = new Context (surface); Gdk.CairoHelper.SetSourcePixbuf (surface_cr, pixbuf, 0, 0); surface_cr.Paint (); ((IDisposable)surface_cr).Dispose (); return surface; } public static Cairo.Color AlphaBlend (Cairo.Color ca, Cairo.Color cb, double alpha) { return new Cairo.Color ( (1.0 - alpha) * ca.R + alpha * cb.R, (1.0 - alpha) * ca.G + alpha * cb.G, (1.0 - alpha) * ca.B + alpha * cb.B); } public static Cairo.Color GdkColorToCairoColor(Gdk.Color color) { return GdkColorToCairoColor(color, 1.0); } public static Cairo.Color GdkColorToCairoColor(Gdk.Color color, double alpha) { return new Cairo.Color( (double)(color.Red >> 8) / 255.0, (double)(color.Green >> 8) / 255.0, (double)(color.Blue >> 8) / 255.0, alpha); } public static Cairo.Color RgbToColor (uint rgbColor) { return RgbaToColor ((rgbColor << 8) | 0x000000ff); } public static Cairo.Color RgbaToColor (uint rgbaColor) { return new Cairo.Color ( (byte)(rgbaColor >> 24) / 255.0, (byte)(rgbaColor >> 16) / 255.0, (byte)(rgbaColor >> 8) / 255.0, (byte)(rgbaColor & 0x000000ff) / 255.0); } public static bool ColorIsDark (Cairo.Color color) { double h, s, b; HsbFromColor (color, out h, out s, out b); return b < 0.5; } public static void HsbFromColor(Cairo.Color color, out double hue, out double saturation, out double brightness) { double min, max, delta; double red = color.R; double green = color.G; double blue = color.B; hue = 0; saturation = 0; brightness = 0; if(red > green) { max = Math.Max(red, blue); min = Math.Min(green, blue); } else { max = Math.Max(green, blue); min = Math.Min(red, blue); } brightness = (max + min) / 2; if(Math.Abs(max - min) < 0.0001) { hue = 0; saturation = 0; } else { saturation = brightness <= 0.5 ? (max - min) / (max + min) : (max - min) / (2 - max - min); delta = max - min; if(red == max) { hue = (green - blue) / delta; } else if(green == max) { hue = 2 + (blue - red) / delta; } else if(blue == max) { hue = 4 + (red - green) / delta; } hue *= 60; if(hue < 0) { hue += 360; } } } private static double Modula(double number, double divisor) { return ((int)number % divisor) + (number - (int)number); } public static Cairo.Color ColorFromHsb(double hue, double saturation, double brightness) { int i; double [] hue_shift = { 0, 0, 0 }; double [] color_shift = { 0, 0, 0 }; double m1, m2, m3; m2 = brightness <= 0.5 ? brightness * (1 + saturation) : brightness + saturation - brightness * saturation; m1 = 2 * brightness - m2; hue_shift[0] = hue + 120; hue_shift[1] = hue; hue_shift[2] = hue - 120; color_shift[0] = color_shift[1] = color_shift[2] = brightness; i = saturation == 0 ? 3 : 0; for(; i < 3; i++) { m3 = hue_shift[i]; if(m3 > 360) { m3 = Modula(m3, 360); } else if(m3 < 0) { m3 = 360 - Modula(Math.Abs(m3), 360); } if(m3 < 60) { color_shift[i] = m1 + (m2 - m1) * m3 / 60; } else if(m3 < 180) { color_shift[i] = m2; } else if(m3 < 240) { color_shift[i] = m1 + (m2 - m1) * (240 - m3) / 60; } else { color_shift[i] = m1; } } return new Cairo.Color(color_shift[0], color_shift[1], color_shift[2]); } public static Cairo.Color ColorShade (Cairo.Color @base, double ratio) { double h, s, b; HsbFromColor (@base, out h, out s, out b); b = Math.Max (Math.Min (b * ratio, 1), 0); s = Math.Max (Math.Min (s * ratio, 1), 0); Cairo.Color color = ColorFromHsb (h, s, b); color.A = @base.A; return color; } public static Cairo.Color ColorAdjustBrightness(Cairo.Color @base, double br) { double h, s, b; HsbFromColor(@base, out h, out s, out b); b = Math.Max(Math.Min(br, 1), 0); return ColorFromHsb(h, s, b); } public static string ColorGetHex (Cairo.Color color, bool withAlpha) { if (withAlpha) { return String.Format("#{0:x2}{1:x2}{2:x2}{3:x2}", (byte)(color.R * 255), (byte)(color.G * 255), (byte)(color.B * 255), (byte)(color.A * 255)); } else { return String.Format("#{0:x2}{1:x2}{2:x2}", (byte)(color.R * 255), (byte)(color.G * 255), (byte)(color.B * 255)); } } public static void RoundedRectangle(Cairo.Context cr, double x, double y, double w, double h, double r) { RoundedRectangle(cr, x, y, w, h, r, CairoCorners.All, false); } public static void RoundedRectangle(Cairo.Context cr, double x, double y, double w, double h, double r, CairoCorners corners) { RoundedRectangle(cr, x, y, w, h, r, corners, false); } public static void RoundedRectangle(Cairo.Context cr, double x, double y, double w, double h, double r, CairoCorners corners, bool topBottomFallsThrough) { if(topBottomFallsThrough && corners == CairoCorners.None) { cr.MoveTo(x, y - r); cr.LineTo(x, y + h + r); cr.MoveTo(x + w, y - r); cr.LineTo(x + w, y + h + r); return; } else if(r < 0.0001 || corners == CairoCorners.None) { cr.Rectangle(x, y, w, h); return; } if((corners & (CairoCorners.TopLeft | CairoCorners.TopRight)) == 0 && topBottomFallsThrough) { y -= r; h += r; cr.MoveTo(x + w, y); } else { if((corners & CairoCorners.TopLeft) != 0) { cr.MoveTo(x + r, y); } else { cr.MoveTo(x, y); } if((corners & CairoCorners.TopRight) != 0) { cr.Arc(x + w - r, y + r, r, Math.PI * 1.5, Math.PI * 2); } else { cr.LineTo(x + w, y); } } if((corners & (CairoCorners.BottomLeft | CairoCorners.BottomRight)) == 0 && topBottomFallsThrough) { h += r; cr.LineTo(x + w, y + h); cr.MoveTo(x, y + h); cr.LineTo(x, y + r); cr.Arc(x + r, y + r, r, Math.PI, Math.PI * 1.5); } else { if((corners & CairoCorners.BottomRight) != 0) { cr.Arc(x + w - r, y + h - r, r, 0, Math.PI * 0.5); } else { cr.LineTo(x + w, y + h); } if((corners & CairoCorners.BottomLeft) != 0) { cr.Arc(x + r, y + h - r, r, Math.PI * 0.5, Math.PI); } else { cr.LineTo(x, y + h); } if((corners & CairoCorners.TopLeft) != 0) { cr.Arc(x + r, y + r, r, Math.PI, Math.PI * 1.5); } else { cr.LineTo(x, y); } } } public static void DisposeContext (Cairo.Context cr) { ((IDisposable)cr.Target).Dispose (); ((IDisposable)cr).Dispose (); } private struct CairoInteropCall { public string Name; public MethodInfo ManagedMethod; public bool CallNative; public CairoInteropCall (string name) { Name = name; ManagedMethod = null; CallNative = false; } } private static bool CallCairoMethod (Cairo.Context cr, ref CairoInteropCall call) { if (call.ManagedMethod == null && !call.CallNative) { MemberInfo [] members = typeof (Cairo.Context).GetMember (call.Name, MemberTypes.Method, BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public); if (members != null && members.Length > 0 && members[0] is MethodInfo) { call.ManagedMethod = (MethodInfo)members[0]; } else { call.CallNative = true; } } if (call.ManagedMethod != null) { call.ManagedMethod.Invoke (cr, null); return true; } return false; } private static bool native_push_pop_exists = true; [DllImport ("libcairo-2.dll")] private static extern void cairo_push_group (IntPtr ptr); private static CairoInteropCall cairo_push_group_call = new CairoInteropCall ("PushGroup"); public static void PushGroup (Cairo.Context cr) { if (!native_push_pop_exists) { return; } try { if (!CallCairoMethod (cr, ref cairo_push_group_call)) { cairo_push_group (cr.Handle); } } catch { native_push_pop_exists = false; } } [DllImport ("libcairo-2.dll")] private static extern void cairo_pop_group_to_source (IntPtr ptr); private static CairoInteropCall cairo_pop_group_to_source_call = new CairoInteropCall ("PopGroupToSource"); public static void PopGroupToSource (Cairo.Context cr) { if (!native_push_pop_exists) { return; } try { if (!CallCairoMethod (cr, ref cairo_pop_group_to_source_call)) { cairo_pop_group_to_source (cr.Handle); } } catch (EntryPointNotFoundException) { native_push_pop_exists = false; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/CleanRoomStartup.cs0000644000175000017500000000431611420634720024225 0ustar00rubenruben00000000000000// // CleanRoomStartup.cs // // Author: // Aaron Bockover // // Copyright (C) 2006-2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Gui { public static class CleanRoomStartup { public delegate void StartupInvocationHandler(); public static void Startup(StartupInvocationHandler startup) { bool disable_clean_room = false; foreach(string arg in Environment.GetCommandLineArgs ()) { if(arg == "--disable-clean-room") { disable_clean_room = true; break; } } if(disable_clean_room) { startup(); return; } try { startup(); } catch(Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e); Gtk.Application.Init(); Hyena.Gui.Dialogs.ExceptionDialog dialog = new Hyena.Gui.Dialogs.ExceptionDialog(e); dialog.Run(); dialog.Destroy(); System.Environment.Exit(1); } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/EditableUndoAdapter.cs0000644000175000017500000001220111420634720024613 0ustar00rubenruben00000000000000// // EditableUndoAdapter.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Reflection; using Gtk; using Hyena; namespace Hyena.Gui { public class EditableUndoAdapter where T : Widget, Editable { private T editable; private UndoManager undo_manager = new UndoManager (); private AccelGroup accel_group = new AccelGroup (); private EventInfo popup_event_info; private Delegate populate_popup_handler; public EditableUndoAdapter (T editable) { this.editable = editable; popup_event_info = editable.GetType ().GetEvent ("PopulatePopup"); if (popup_event_info != null) { populate_popup_handler = new PopulatePopupHandler (OnPopulatePopup); } } public void Connect () { editable.KeyPressEvent += OnKeyPressEvent; editable.TextDeleted += OnTextDeleted; editable.TextInserted += OnTextInserted; TogglePopupConnection (true); } public void Disconnect () { editable.KeyPressEvent -= OnKeyPressEvent; editable.TextDeleted -= OnTextDeleted; editable.TextInserted -= OnTextInserted; TogglePopupConnection (false); } private void TogglePopupConnection (bool connect) { // Ugh, stupid Gtk+/Gtk# and lack of interfaces if (popup_event_info != null && populate_popup_handler != null) { if (connect) { popup_event_info.AddEventHandler (editable, populate_popup_handler); } else { popup_event_info.RemoveEventHandler (editable, populate_popup_handler); } } } private void OnKeyPressEvent (object o, KeyPressEventArgs args) { if ((args.Event.State & Gdk.ModifierType.ControlMask) != 0) { switch (args.Event.Key) { case Gdk.Key.z: undo_manager.Undo (); args.RetVal = true; break; case Gdk.Key.Z: case Gdk.Key.y: undo_manager.Redo (); args.RetVal = true; break; } } args.RetVal = false; } [GLib.ConnectBefore] private void OnTextDeleted (object o, TextDeletedArgs args) { if (args.StartPos != args.EndPos) { undo_manager.AddUndoAction (new EditableEraseAction (editable, args.StartPos, args.EndPos)); } } [GLib.ConnectBefore] private void OnTextInserted (object o, TextInsertedArgs args) { undo_manager.AddUndoAction (new EditableInsertAction (editable, args.Position, args.Text, args.Length)); } private void OnPopulatePopup (object o, PopulatePopupArgs args) { Menu menu = args.Menu; MenuItem item; item = new SeparatorMenuItem (); item.Show (); menu.Prepend (item); item = new ImageMenuItem (Stock.Redo, null); item.Sensitive = undo_manager.CanRedo; item.Activated += delegate { undo_manager.Redo (); }; item.AddAccelerator ("activate", accel_group, (uint)Gdk.Key.z, Gdk.ModifierType.ControlMask | Gdk.ModifierType.ShiftMask, AccelFlags.Visible); item.Show (); menu.Prepend (item); item = new ImageMenuItem (Stock.Undo, null); item.Sensitive = undo_manager.CanUndo; item.Activated += delegate { undo_manager.Undo (); }; item.AddAccelerator ("activate", accel_group, (uint)Gdk.Key.z, Gdk.ModifierType.ControlMask, AccelFlags.Visible); item.Show (); menu.Prepend (item); } public UndoManager UndoManager { get { return undo_manager; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/TooltipSetter.cs0000644000175000017500000000625411420634720023607 0ustar00rubenruben00000000000000// // TooltipSetter.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Reflection; using Gtk; namespace Hyena.Gui { public static class TooltipSetter { private static Type host_type; private static MethodInfo host_set_tip_method; private static PropertyInfo tooltip_text_property; private static bool reflected; public static object CreateHost () { if (tooltip_text_property != null) { return null; } Type type = reflected ? null : typeof (Widget); if (type != null) { tooltip_text_property = type.GetProperty ("TooltipText", BindingFlags.Instance | BindingFlags.Public); if (tooltip_text_property != null) { reflected = true; return null; } } if (host_set_tip_method == null && !reflected) { reflected = true; host_type = Type.GetType (String.Format ("Gtk.Tooltips, {0}", type.Assembly.FullName)); if (type == null) { return null; } host_set_tip_method = host_type.GetMethod ("SetTip", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod); if (host_set_tip_method == null) { return null; } } return host_set_tip_method != null ? Activator.CreateInstance (host_type) : null; } public static void Set (object host, Widget widget, string textTip) { if (tooltip_text_property != null) { tooltip_text_property.SetValue (widget, textTip, null); } else if (host != null && host_set_tip_method != null) { host_set_tip_method.Invoke (host, new object [] { widget, textTip, null }); } else { throw new ApplicationException ("You must call TooltipSetter.CreateHost before calling TooltipSetter.Set"); } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui/HyenaActionGroup.cs0000644000175000017500000001323211441732606024204 0ustar00rubenruben00000000000000// // HyenaActionGroup.cs // // Author: // Gabriel Burt // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using Gtk; namespace Hyena.Gui { public class HyenaActionGroup : ActionGroup { private List ui_merge_ids = new List (); private ActionManager action_manager; private bool important_by_default = true; protected bool ImportantByDefault { get { return important_by_default; } set { important_by_default = value; } } public HyenaActionGroup (ActionManager action_manager, string name) : base (name) { this.action_manager = action_manager; } public void AddUiFromFile (string ui_file) { Hyena.ThreadAssist.AssertInMainThread (); ui_merge_ids.Add (ActionManager.AddUiFromFile (ui_file, System.Reflection.Assembly.GetCallingAssembly ())); } public void AddUiFromString (string ui_string) { Hyena.ThreadAssist.AssertInMainThread (); ui_merge_ids.Add (ActionManager.UIManager.AddUiFromString (ui_string)); } public void Register () { if (ActionManager.FindActionGroup (this.Name) == null) { ActionManager.AddActionGroup (this); } } public void UnRegister () { if (ActionManager.FindActionGroup (this.Name) != null) { ActionManager.RemoveActionGroup (this); } } public override void Dispose () { Hyena.ThreadAssist.ProxyToMain (delegate { UnRegister (); foreach (uint merge_id in ui_merge_ids) { if (merge_id > 0) { ActionManager.UIManager.RemoveUi (merge_id); } } ui_merge_ids.Clear (); base.Dispose (); }); } public new void Add (params ActionEntry [] action_entries) { if (ImportantByDefault) { AddImportant (action_entries); } else { base.Add (action_entries); } } public void AddImportant (params ActionEntry [] action_entries) { base.Add (action_entries); foreach (ActionEntry entry in action_entries) { this[entry.name].IsImportant = true; } } public void AddImportant (params ToggleActionEntry [] action_entries) { base.Add (action_entries); foreach (ToggleActionEntry entry in action_entries) { this[entry.name].IsImportant = true; } } public void Remove (string actionName) { Gtk.Action action = this[actionName]; if (action != null) { Remove (action); } } public void UpdateActions (bool visible, bool sensitive, params string [] action_names) { foreach (string name in action_names) { UpdateAction (this[name], visible, sensitive); } } public void UpdateAction (string action_name, bool visible_and_sensitive) { UpdateAction (this[action_name], visible_and_sensitive, visible_and_sensitive); } public void UpdateAction (string action_name, bool visible, bool sensitive) { UpdateAction (this[action_name], visible, sensitive); } public static void UpdateAction (Gtk.Action action, bool visible_and_sensitive) { UpdateAction (action, visible_and_sensitive, visible_and_sensitive); } public static void UpdateAction (Gtk.Action action, bool visible, bool sensitive) { action.Visible = visible; action.Sensitive = visible && sensitive; } protected void ShowContextMenu (string menu_name) { Gtk.Menu menu = ActionManager.UIManager.GetWidget (menu_name) as Menu; if (menu == null || menu.Children.Length == 0) { return; } int visible_children = 0; foreach (Widget child in menu) if (child.Visible) visible_children++; if (visible_children == 0) { return; } menu.Show (); menu.Popup (null, null, null, 0, Gtk.Global.CurrentEventTime); } public ActionManager ActionManager { get { return action_manager; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/0000777000175000017500000000000011503407410021642 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/CanvasHost.cs0000644000175000017500000002306511467745411024263 0ustar00rubenruben00000000000000// // CanvasHost.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using Gtk; using Gdk; using Hyena.Gui.Theming; namespace Hyena.Gui.Canvas { public class CanvasHost : Widget, ICanvasHost { private Gdk.Window event_window; private CanvasItem canvas_child; private Theme theme; private CanvasManager manager; private bool debug = false; private FpsCalculator fps = new FpsCalculator (); private Hyena.Data.Gui.CellContext context = new Hyena.Data.Gui.CellContext (); public CanvasHost () { WidgetFlags |= WidgetFlags.NoWindow; manager = new CanvasManager (this); } protected CanvasHost (IntPtr native) : base (native) { } protected override void OnRealized () { base.OnRealized (); WindowAttr attributes = new WindowAttr (); attributes.WindowType = Gdk.WindowType.Child; attributes.X = Allocation.X; attributes.Y = Allocation.Y; attributes.Width = Allocation.Width; attributes.Height = Allocation.Height; attributes.Wclass = WindowClass.InputOnly; attributes.EventMask = (int)( EventMask.PointerMotionMask | EventMask.ButtonPressMask | EventMask.ButtonReleaseMask | EventMask.EnterNotifyMask | EventMask.LeaveNotifyMask | EventMask.ExposureMask); WindowAttributesType attributes_mask = WindowAttributesType.X | WindowAttributesType.Y | WindowAttributesType.Wmclass; event_window = new Gdk.Window (GdkWindow, attributes, attributes_mask); event_window.UserData = Handle; AllocateChild (); QueueResize (); } protected override void OnUnrealized () { WidgetFlags ^= WidgetFlags.Realized; event_window.UserData = IntPtr.Zero; Hyena.Gui.GtkWorkarounds.WindowDestroy (event_window); event_window = null; base.OnUnrealized (); } protected override void OnMapped () { event_window.Show (); base.OnMapped (); } protected override void OnUnmapped () { event_window.Hide (); base.OnUnmapped (); } protected override void OnSizeAllocated (Gdk.Rectangle allocation) { base.OnSizeAllocated (allocation); if (IsRealized) { event_window.MoveResize (allocation); AllocateChild (); } } protected override void OnSizeRequested (ref Gtk.Requisition requisition) { if (canvas_child != null) { Size size = canvas_child.Measure (Size.Empty); if (size.Width > 0) { requisition.Width = (int)Math.Ceiling (size.Width); } if (size.Height > 0) { requisition.Height = (int)Math.Ceiling (size.Height); } } } private Random rand; protected override bool OnExposeEvent (Gdk.EventExpose evnt) { if (canvas_child == null || !canvas_child.Visible || !Visible || !IsMapped) { return true; } Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window); context.Context = cr; foreach (Gdk.Rectangle damage in evnt.Region.GetRectangles ()) { cr.Rectangle (damage.X, damage.Y, damage.Width, damage.Height); cr.Clip (); cr.Translate (Allocation.X, Allocation.Y); canvas_child.Render (context); cr.Translate (-Allocation.X, -Allocation.Y); if (Debug) { cr.LineWidth = 1.0; cr.Color = CairoExtensions.RgbToColor ( (uint)(rand = rand ?? new Random ()).Next (0, 0xffffff)); cr.Rectangle (damage.X + 0.5, damage.Y + 0.5, damage.Width - 1, damage.Height - 1); cr.Stroke (); } cr.ResetClip (); } CairoExtensions.DisposeContext (cr); if (fps.Update ()) { // Console.WriteLine ("FPS: {0}", fps.FramesPerSecond); } return true; } private void AllocateChild () { if (canvas_child != null) { canvas_child.Allocation = new Rect (0, 0, Allocation.Width, Allocation.Height); canvas_child.Measure (new Size (Allocation.Width, Allocation.Height)); canvas_child.Arrange (); } } public void QueueRender (CanvasItem item, Rect rect) { double x = Allocation.X; double y = Allocation.Y; double w, h; if (rect.IsEmpty) { w = item.Allocation.Width; h = item.Allocation.Height; } else { x += rect.X; y += rect.Y; w = rect.Width; h = rect.Height; } while (item != null) { x += item.ContentAllocation.X; y += item.ContentAllocation.Y; item = item.Parent; } QueueDrawArea ( (int)Math.Floor (x), (int)Math.Floor (y), (int)Math.Ceiling (w), (int)Math.Ceiling (h) ); } private bool changing_style = false; protected override void OnStyleSet (Style old_style) { if (changing_style) { return; } changing_style = true; theme = new GtkTheme (this); if (canvas_child != null) { canvas_child.Theme = theme; } changing_style = false; base.OnStyleSet (old_style); } protected override bool OnButtonPressEvent (Gdk.EventButton press) { if (canvas_child != null) { canvas_child.ButtonEvent (new Point (press.X, press.Y), true, press.Button); } return true; } protected override bool OnButtonReleaseEvent (Gdk.EventButton press) { if (canvas_child != null) { canvas_child.ButtonEvent (new Point (press.X, press.Y), false, press.Button); } return true; } protected override bool OnMotionNotifyEvent (EventMotion evnt) { if (canvas_child != null) { canvas_child.CursorMotionEvent (new Point (evnt.X, evnt.Y)); } return true; } public void Add (CanvasItem child) { if (Child != null) { throw new InvalidOperationException ("Child is already set, remove it first"); } Child = child; } public void Remove (CanvasItem child) { if (Child != child) { throw new InvalidOperationException ("child does not already belong to host"); } Child = null; } private void OnCanvasChildLayoutUpdated (object o, EventArgs args) { QueueDraw (); } private void OnCanvasChildSizeChanged (object o, EventArgs args) { QueueResize (); } public CanvasItem Child { get { return canvas_child; } set { if (canvas_child == value) { return; } else if (canvas_child != null) { canvas_child.Theme = null; canvas_child.Manager = null; canvas_child.LayoutUpdated -= OnCanvasChildLayoutUpdated; canvas_child.SizeChanged -= OnCanvasChildSizeChanged; } canvas_child = value; if (canvas_child != null) { canvas_child.Theme = theme; canvas_child.Manager = manager; canvas_child.LayoutUpdated += OnCanvasChildLayoutUpdated; canvas_child.SizeChanged += OnCanvasChildSizeChanged; } AllocateChild (); } } public bool Debug { get { return debug; } set { debug = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/Slider.cs0000644000175000017500000001757311467745411023443 0ustar00rubenruben00000000000000// // Slider.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using Cairo; using Hyena.Gui; using Hyena.Gui.Theming; namespace Hyena.Gui.Canvas { public class Slider : CanvasItem { private uint value_changed_inhibit_ref = 0; public event EventHandler ValueChanged; public event EventHandler PendingValueChanged; public Slider () { Margin = new Thickness (3); MarginStyle = new ShadowMarginStyle { ShadowSize = 3, ShadowOpacity = 0.25 }; } protected virtual void OnValueChanged () { if (value_changed_inhibit_ref != 0) { return; } var handler = ValueChanged; if (handler != null) { handler (this, EventArgs.Empty); } } protected virtual void OnPendingValueChanged () { var handler = PendingValueChanged; if (handler != null) { handler (this, EventArgs.Empty); } } public void InhibitValueChangeEvent () { value_changed_inhibit_ref++; } public void UninhibitValueChangeEvent () { value_changed_inhibit_ref--; } private void SetPendingValueFromX (double x) { IsValueUpdatePending = true; PendingValue = Math.Max (0, Math.Min ((x - ThrobberSize / 2) / RenderSize.Width, 1)); } public override bool ButtonEvent (Point cursor, bool pressed, uint button) { if (pressed && button == 1) { GrabPointer (); SetPendingValueFromX (cursor.X); return true; } else if (!pressed && IsPointerGrabbed) { ReleasePointer (); Value = PendingValue; IsValueUpdatePending = false; return true; } return false; } public override bool CursorMotionEvent (Point cursor) { if (IsPointerGrabbed) { SetPendingValueFromX (cursor.X); return true; } return false; } //private double last_invalidate_value = -1; /*private void Invalidate () { double current_value = (IsValueUpdatePending ? PendingValue : Value); // FIXME: Something is wrong with the updating below causing an // invalid region when IsValueUpdatePending is true, so when // that is the case for now, we trigger a full invalidation if (last_invalidate_value < 0 || IsValueUpdatePending) { last_invalidate_value = current_value; InvalidateRender (); return; } double max = Math.Max (last_invalidate_value, current_value) * RenderSize.Width; double min = Math.Min (last_invalidate_value, current_value) * RenderSize.Width; Rect region = new Rect ( InvalidationRect.X + min, InvalidationRect.Y, (max - min) + 2 * ThrobberSize, InvalidationRect.Height ); last_invalidate_value = current_value; InvalidateRender (region); }*/ /*protected override Rect InvalidationRect { get { return new Rect ( -Margin.Left - ThrobberSize / 2, -Margin.Top, Allocation.Width + ThrobberSize, Allocation.Height); } }*/ protected override void ClippedRender (Cairo.Context cr) { double throbber_r = ThrobberSize / 2.0; double throbber_x = Math.Round (RenderSize.Width * (IsValueUpdatePending ? PendingValue : Value)); double throbber_y = (Allocation.Height - ThrobberSize) / 2.0 - Margin.Top + throbber_r; double bar_w = RenderSize.Width * Value; cr.Color = Theme.Colors.GetWidgetColor (GtkColorClass.Base, Gtk.StateType.Normal); cr.Rectangle (0, 0, RenderSize.Width, RenderSize.Height); cr.Fill (); Color color = Theme.Colors.GetWidgetColor (GtkColorClass.Dark, Gtk.StateType.Active); Color fill_color = CairoExtensions.ColorShade (color, 0.4); Color light_fill_color = CairoExtensions.ColorShade (color, 0.3); fill_color.A = 1.0; light_fill_color.A = 1.0; LinearGradient fill = new LinearGradient (0, 0, 0, RenderSize.Height); fill.AddColorStop (0, light_fill_color); fill.AddColorStop (0.5, fill_color); fill.AddColorStop (1, light_fill_color); cr.Rectangle (0, 0, bar_w, RenderSize.Height); cr.Pattern = fill; cr.Fill (); cr.Color = fill_color; cr.Arc (throbber_x, throbber_y, throbber_r, 0, Math.PI * 2); cr.Fill (); } public override Size Measure (Size available) { Height = BarSize; return DesiredSize = new Size (base.Measure (available).Width, Height + Margin.Top + Margin.Bottom); } private double bar_size = 3; public virtual double BarSize { get { return bar_size; } set { bar_size = value; } } private double throbber_size = 7; public virtual double ThrobberSize { get { return throbber_size; } set { throbber_size = value; } } private double value; public virtual double Value { get { return this.value; } set { if (value < 0.0 || value > 1.0) { throw new ArgumentOutOfRangeException ("Value", "Must be between 0.0 and 1.0 inclusive"); } else if (this.value == value) { return; } this.value = value; Invalidate (); OnValueChanged (); } } private bool is_value_update_pending; public virtual bool IsValueUpdatePending { get { return is_value_update_pending; } set { is_value_update_pending = value; } } private double pending_value; public virtual double PendingValue { get { return pending_value; } set { if (value < 0.0 || value > 1.0) { throw new ArgumentOutOfRangeException ("Value", "Must be between 0.0 and 1.0 inclusive"); } else if (pending_value == value) { return; } pending_value = value; Invalidate (); OnPendingValueChanged (); } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/TextWrap.cs0000644000175000017500000000246511467745411023771 0ustar00rubenruben00000000000000// // TextWrap.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Hyena.Gui.Canvas { public enum TextWrap { None, Word, Char, WordChar } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/Size.cs0000644000175000017500000000635011467745411023122 0ustar00rubenruben00000000000000// // Size.cs // // Author: // Aaron Bockover // // Copyright 2009-2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Gui.Canvas { public struct Size { private double width; private double height; public Size (double width, double height) : this () { Width = width; Height = height; } public override bool Equals (object o) { if (!(o is Size)) { return false; } return Equals ((Size)o); } public bool Equals (Size value) { return value.width == width && value.height == height; } public override int GetHashCode () { return ((int)width) ^ ((int)height); } public static bool operator == (Size size1, Size size2) { return size1.width == size2.width && size1.height == size2.height; } public static bool operator != (Size size1, Size size2) { return size1.width != size2.width || size1.height != size2.height; } public double Height { get { return height; } set { if (value < 0) { throw new ArgumentException (); } height = value; } } public double Width { get { return width; } set { if (value < 0) { throw new ArgumentException (); } width = value; } } public bool IsEmpty { get { return width == Double.NegativeInfinity && height == Double.NegativeInfinity; } } public static Size Empty { get { Size size = new Size (); size.width = Double.NegativeInfinity; size.height = Double.NegativeInfinity; return size; } } public override string ToString () { if (IsEmpty) { return "Empty"; } return String.Format ("{0}x{1}", width, height); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/Brush.cs0000644000175000017500000000457111467745411023276 0ustar00rubenruben00000000000000// // Brush.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Hyena.Gui.Canvas { public class Brush { private Cairo.Color color; public Brush () { } public Brush (byte r, byte g, byte b) : this (r, g, b, 255) { } public Brush (byte r, byte g, byte b, byte a) : this ((double)r / 255.0, (double)g / 255.0, (double)b / 255.0, (double)a / 255.0) { } public Brush (double r, double g, double b) : this (r, g, b, 1) { } public Brush (double r, double g, double b, double a) : this (new Cairo.Color (r, g, b, a)) { } public Brush (Cairo.Color color) { this.color = color; } public virtual bool IsValid { get { return true; } } public virtual void Apply (Cairo.Context cr) { cr.Color = color; } public static readonly Brush Black = new Brush (0.0, 0.0, 0.0); public static readonly Brush White = new Brush (1.0, 1.0, 1.0); public virtual double Width { get { return Double.NaN; } } public virtual double Height { get { return Double.NaN; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/Thickness.cs0000644000175000017500000000727211467745411024147 0ustar00rubenruben00000000000000// // Thickness.cs // // Author: // Aaron Bockover // // Copyright 2009-2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Gui.Canvas { public struct Thickness { private double left; private double top; private double right; private double bottom; public static readonly Thickness Zero = new Thickness (0); public Thickness (double thickness) : this (thickness, thickness, thickness, thickness) { } public Thickness (double xthickness, double ythickness) : this (xthickness, ythickness, xthickness, ythickness) { } public Thickness (double left, double top, double right, double bottom) { this.left = left; this.top = top; this.right = right; this.bottom = bottom; } public override string ToString () { return string.Format ("{0},{1},{2},{3}", Double.IsNaN (left) ? "Auto" : left.ToString (), Double.IsNaN (top) ? "Auto" : top.ToString (), Double.IsNaN (right) ? "Auto" : right.ToString (), Double.IsNaN (bottom) ? "Auto" : bottom.ToString ()); } public override bool Equals (object o) { if (!(o is Thickness)) { return false; } return this == (Thickness)o; } public bool Equals (Thickness thickness) { return this == thickness; } public override int GetHashCode () { return left.GetHashCode () ^ top.GetHashCode () ^ right.GetHashCode () ^ bottom.GetHashCode (); } public static bool operator == (Thickness t1, Thickness t2) { return t1.left == t2.left && t1.right == t2.right && t1.top == t2.top && t1.bottom == t2.bottom; } public static bool operator != (Thickness t1, Thickness t2) { return !(t1 == t2); } public double Left { get { return left; } set { left = value; } } public double Top { get { return top; } set { top = value; } } public double Right { get { return right; } set { right = value; } } public double Bottom { get { return bottom; } set { bottom = value; } } public double X { get { return Left + Right; } } public double Y { get { return Top + Bottom; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/Point.cs0000644000175000017500000000461611420634720023271 0ustar00rubenruben00000000000000// // Point.cs // // Author: // Aaron Bockover // // Copyright 2009-2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Gui.Canvas { public struct Point { public double X { get; set; } public double Y { get; set; } public Point (double x, double y) : this () { X = x; Y = y; } public void Offset (double dx, double dy) { X += dx; Y += dy; } public void Offset (Point delta) { X += delta.X; Y += delta.Y; } public override bool Equals (object o) { return o is Point ? Equals ((Point)o) : false; } public bool Equals (Point value) { return value.X == X && value.Y == Y; } public static bool operator == (Point point1, Point point2) { return point1.X == point2.X && point1.Y == point2.Y; } public static bool operator != (Point point1, Point point2) { return !(point1 == point2); } public override int GetHashCode () { return X.GetHashCode () ^ Y.GetHashCode (); } public override string ToString () { return String.Format ("{0},{1}", X, Y); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/ShadowMarginStyle.cs0000644000175000017500000000545511467745411025621 0ustar00rubenruben00000000000000// // ShadowMarginStyle.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using Cairo; namespace Hyena.Gui.Canvas { public class ShadowMarginStyle : MarginStyle { private int shadow_size; private double shadow_opacity = 0.75; private Brush fill; public ShadowMarginStyle () { } public override void Apply (CanvasItem item, Context cr) { int steps = ShadowSize; double opacity_step = ShadowOpacity / ShadowSize; Color color = new Color (0, 0, 0); double width = Math.Round (item.Allocation.Width); double height = Math.Round (item.Allocation.Height); if (Fill != null) { cr.Rectangle (shadow_size, shadow_size, width - ShadowSize * 2, height - ShadowSize * 2); Fill.Apply (cr); cr.Fill (); } cr.LineWidth = 1.0; for (int i = 0; i < steps; i++) { CairoExtensions.RoundedRectangle (cr, i + 0.5, i + 0.5, (width - 2 * i) - 1, (height - 2 * i) - 1, steps - i); color.A = opacity_step * (i + 1); cr.Color = color; cr.Stroke (); } } public double ShadowOpacity { get { return shadow_opacity; } set { shadow_opacity = value; } } public int ShadowSize { get { return shadow_size; } set { shadow_size = value; } } public Brush Fill { get { return fill; } set { fill = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/Image.cs0000644000175000017500000000417311467745411023233 0ustar00rubenruben00000000000000// // Image.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Hyena.Gui.Canvas { public class Image : CanvasItem { public Image () { } protected override void ClippedRender (Cairo.Context cr) { Brush brush = Background; if (!brush.IsValid) { return; } double x = Double.IsNaN (brush.Width) ? 0 : (RenderSize.Width - brush.Width) * XAlign; double y = Double.IsNaN (brush.Height) ? 0 : (RenderSize.Height - brush.Height) * YAlign; cr.Rectangle (0, 0, RenderSize.Width, RenderSize.Height); cr.ClipPreserve (); if (x != 0 || y != 0) { cr.Translate (x, y); } cr.Antialias = Cairo.Antialias.None; brush.Apply (cr); cr.Fill (); } public double XAlign { get; set; } public double YAlign { get; set; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/StackPanel.cs0000644000175000017500000001254211467745411024235 0ustar00rubenruben00000000000000// // StackPanel.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Hyena.Gui.Canvas { public class StackPanel : Panel { private Orientation orientation; public double spacing; public StackPanel () { } public override Size Measure (Size available) { Size result = new Size (0, 0); int visible_children = 0; foreach (var child in Children) { if (!child.Visible) { continue; } Size size = child.Measure (available); if (Orientation == Orientation.Vertical) { result.Height += size.Height; result.Width = Math.Max (result.Width, size.Width); } else { result.Width += size.Width; result.Height = Math.Max (result.Height, size.Height); } visible_children++; } if (!Double.IsNaN (Width)) { result.Width = Width; } if (!Double.IsNaN (Height)) { result.Height = Height; } result.Width += Margin.X; result.Height += Margin.Y; if (!available.IsEmpty) { result.Width = Math.Min (result.Width, available.Width); result.Height = Math.Min (result.Height, available.Height); } if (Orientation == Orientation.Vertical) { result.Height += Spacing * (visible_children - 1); } else { result.Width += Spacing * (visible_children - 1); } return DesiredSize = result; } public override void Arrange () { int visible_child_count = 0; int flex_count = 0; double offset = 0; double static_space = 0; double flex_space = 0; foreach (var child in Children) { if (!child.Visible) { continue; } child.Measure (ContentSize); visible_child_count++; if (Orientation == Orientation.Vertical) { static_space += Double.IsNaN (child.Height) ? 0 : child.DesiredSize.Height; flex_count += Double.IsNaN (child.Height) ? 1 : 0; } else { static_space += Double.IsNaN (child.Width) ? 0 : child.DesiredSize.Width; flex_count += Double.IsNaN (child.Width) ? 1 : 0; } } flex_space = (Orientation == Orientation.Vertical ? ContentAllocation.Height : ContentAllocation.Width) - static_space - (visible_child_count - 1) * Spacing; if (flex_space < 0) { flex_space = 0; } foreach (var child in Children) { if (!child.Visible) { continue; } double variable_size = 0; if ((Orientation == Orientation.Vertical && Double.IsNaN (child.Height)) || (Orientation == Orientation.Horizontal && Double.IsNaN (child.Width))) { variable_size = flex_space / flex_count--; flex_space -= variable_size; if (flex_count == 0) { variable_size += flex_space; } } else if (Orientation == Orientation.Vertical) { variable_size = child.DesiredSize.Height; } else { variable_size = child.DesiredSize.Width; } child.Allocation = Orientation == Orientation.Vertical ? new Rect (0, offset, ContentAllocation.Width, variable_size) : new Rect (offset, 0, variable_size, ContentAllocation.Height); child.Arrange (); offset += variable_size + Spacing; } } public Orientation Orientation { get { return orientation; } set { orientation = value; } } public double Spacing { get { return spacing; } set { spacing = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/MarginStyle.cs0000644000175000017500000000272511467745411024450 0ustar00rubenruben00000000000000// // MarginStyle.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Hyena.Gui.Canvas { public class MarginStyle { public MarginStyle () { } public virtual void Apply (CanvasItem item, Cairo.Context cr) { } public static readonly MarginStyle None = new MarginStyle (); } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/ICanvasHost.cs0000644000175000017500000000254011467745411024367 0ustar00rubenruben00000000000000// // ICanvasHost.cs // // Author: // Gabriel Burt // // Copyright 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using Gtk; using Gdk; using Hyena.Gui.Theming; namespace Hyena.Gui.Canvas { public interface ICanvasHost { void QueueRender (CanvasItem item, Rect rect); } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/FixedPanel.cs0000644000175000017500000000247011467745411024226 0ustar00rubenruben00000000000000// // FixedPanel.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Hyena.Gui.Canvas { public class FixedPanel : Panel { public FixedPanel () { } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/Prelight.cs0000644000175000017500000000405211467745411023763 0ustar00rubenruben00000000000000// // Prelight.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using Hyena.Gui.Theming; using Hyena.Gui.Theatrics; using Hyena.Gui.Canvas; namespace Hyena.Gui.Canvas { public static class Prelight { public static void Gradient (Cairo.Context cr, Theme theme, Rect rect, double opacity) { cr.Save (); cr.Translate (rect.X, rect.Y); var x = rect.Width / 2.0; var y = rect.Height / 2.0; var grad = new Cairo.RadialGradient (x, y, 0, x, y, rect.Width / 2.0); grad.AddColorStop (0, new Cairo.Color (0, 0, 0, 0.1 * opacity)); grad.AddColorStop (1, new Cairo.Color (0, 0, 0, 0.35 * opacity)); cr.Pattern = grad; CairoExtensions.RoundedRectangle (cr, rect.X, rect.Y, rect.Width, rect.Height, theme.Context.Radius); cr.Fill (); grad.Destroy (); cr.Restore (); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/CanvasItem.cs0000644000175000017500000003076411467745411024250 0ustar00rubenruben00000000000000// // CanvasItem.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Collections.Generic; using Hyena.Gui.Theming; namespace Hyena.Gui.Canvas { public class CanvasItem { private CanvasManager manager; private Hyena.Data.IDataBinder binder; private Theme theme; private bool prelight_in; private double prelight_opacity; #region Public API public event EventHandler SizeChanged; public event EventHandler LayoutUpdated; public CanvasItem () { Visible = true; Opacity = 1.0; Width = Double.NaN; Height = Double.NaN; Margin = new Thickness (0); Padding = new Thickness (0); Foreground = Brush.Black; Background = Brush.White; MarginStyle = MarginStyle.None; } public void InvalidateArrange () { CanvasItem root = RootAncestor; if (root != null && root.Manager != null) { root.Manager.QueueArrange (this); } } public void InvalidateMeasure () { CanvasItem root = RootAncestor; if (root != null && root.Manager != null) { root.Manager.QueueMeasure (this); } } public void InvalidateRender () { InvalidateRender (InvalidationRect); } public void Invalidate (Rect area) { InvalidateRender (area); } public Hyena.Data.IDataBinder Binder { get { return binder ?? (binder = new MemoryDataBinder ()); } set { binder = value; } } public virtual void Bind (object o) { Binder.Bind (o); } public virtual void Arrange () { } public Action PrelightRenderer { get; set; } public virtual Size Measure (Size available) { double m_x = Margin.X; double m_y = Margin.Y; double a_w = available.Width - m_x; double a_h = available.Height - m_y; return DesiredSize = new Size ( Math.Max (0, Math.Min (a_w, Double.IsNaN (Width) ? a_w : Width + m_x)), Math.Max (0, Math.Min (a_h, Double.IsNaN (Height) ? a_h : Height + m_y)) ); } public void Render (Hyena.Data.Gui.CellContext context) { var alloc = ContentAllocation; var cr = context.Context; double opacity = Opacity; if (alloc.Width <= 0 || alloc.Height <= 0 || opacity <= 0) { return; } cr.Save (); if (opacity < 1.0) { cr.PushGroup (); } MarginStyle margin_style = MarginStyle; if (margin_style != null && margin_style != MarginStyle.None) { cr.Translate (Math.Round (Allocation.X), Math.Round (Allocation.Y)); cr.Save (); margin_style.Apply (this, cr); cr.Restore (); cr.Translate (Math.Round (Margin.Left), Math.Round (Margin.Top)); } else { cr.Translate (Math.Round (alloc.X), Math.Round (alloc.Y)); } cr.Antialias = Cairo.Antialias.Default; //cr.Rectangle (0, 0, alloc.Width, alloc.Height); //cr.Clip (); ClippedRender (context); if (PrelightRenderer != null && prelight_opacity > 0) { PrelightRenderer (context.Context, context.Theme, new Rect (0, 0, ContentAllocation.Width, ContentAllocation.Height), prelight_opacity); } //cr.ResetClip (); if (opacity < 1.0) { cr.PopGroupToSource (); cr.PaintWithAlpha (Opacity); } cr.Restore (); } public CanvasItem RootAncestor { get { CanvasItem root = this; while (root.Parent != null) { root = root.Parent; } return root; } } public CanvasItem Parent { get; set; } public Theme Theme { get { return theme ?? (Parent != null ? Parent.Theme : null); } set { theme = value; } } public virtual bool GetTooltipMarkupAt (Point pt, out string markup, out Rect area) { markup = TooltipMarkup; area = TopLevelAllocation; return markup != null; } protected string TooltipMarkup { get; set; } public bool Visible { get; set; } public double Opacity { get; set; } public Brush Foreground { get; set; } public Brush Background { get; set; } public Thickness Padding { get; set; } public MarginStyle MarginStyle { get; set; } public Size DesiredSize { get; protected set; } // FIXME need this? public Rect VirtualAllocation { get; set; } private double min_width, max_width; public double MinWidth { get { return min_width; } set { min_width = value; if (value > max_width) { max_width = value; } } } public double MaxWidth { get { return max_width; } set { max_width = value; if (value < min_width) { min_width = value; } } } public double Width { get; set; } public double Height { get; set; } private Thickness margin; public Thickness Margin { get { return margin; } set { margin = value; // Refresh the ContentAllocation etc values Allocation = allocation; } } private Rect allocation; public Rect Allocation { get { return allocation; } set { allocation = value; ContentAllocation = new Rect ( Allocation.X + Margin.Left, Allocation.Y + Margin.Top, Math.Max (0, Allocation.Width - Margin.X), Math.Max (0, Allocation.Height - Margin.Y) ); ContentSize = new Size (ContentAllocation.Width, ContentAllocation.Height); RenderSize = new Size (Math.Round (ContentAllocation.Width), Math.Round (ContentAllocation.Height)); } } public Rect ContentAllocation { get; private set; } public Size ContentSize { get; private set; } protected Size RenderSize { get; private set; } protected virtual Rect InvalidationRect { //get { return Rect.Empty; } get { return Allocation; } } #endregion public void Invalidate () { InvalidateMeasure (); InvalidateArrange (); InvalidateRender (); } protected void InvalidateRender (Rect area) { if (Parent == null) { OnInvalidate (area); } else { var alloc = Parent.ContentAllocation; area.Offset (alloc.X, alloc.Y); Parent.Invalidate (area); } } private void OnInvalidate (Rect area) { CanvasItem root = RootAncestor; if (root != null && root.Manager != null) { root.Manager.QueueRender (this, area); } else { Hyena.Log.WarningFormat ("Asked to invalidate {0} for {1} but no CanvasManager!", area, this); } } protected object BoundObject { get { return Binder.BoundObject; } set { Binder.BoundObject = value; } } private Rect TopLevelAllocation { get { var alloc = ContentAllocation; var top = this; while (top.Parent != null) { alloc.Offset (top.Parent.Allocation); top = top.Parent; } return alloc; } } protected virtual void ClippedRender (Cairo.Context cr) { } protected virtual void ClippedRender (Hyena.Data.Gui.CellContext context) { ClippedRender (context.Context); } protected virtual void OnSizeChanged () { EventHandler handler = SizeChanged; if (handler != null) { handler (this, EventArgs.Empty); } } protected virtual void OnLayoutUpdated () { EventHandler handler = LayoutUpdated; if (handler != null) { handler (this, EventArgs.Empty); } } internal CanvasManager Manager { get { return manager ?? (Parent != null ? Parent.Manager : null); } set { manager = value; } } #region Input Events //public event EventHandler Clicked; private bool pointer_grabbed; public virtual bool IsPointerGrabbed { get { return pointer_grabbed; } } protected void GrabPointer () { pointer_grabbed = true; } protected void ReleasePointer () { pointer_grabbed = false; } public virtual bool ButtonEvent (Point press, bool pressed, uint button) { //GrabPointer (); return false; } /*public virtual void ButtonRelease () { ReleasePointer (); OnClicked (); }*/ public virtual bool CursorMotionEvent (Point cursor) { return false; } public virtual bool CursorEnterEvent () { if (PrelightRenderer != null) { prelight_in = true; prelight_stage.AddOrReset (this); } return false; } public virtual bool CursorLeaveEvent () { if (PrelightRenderer != null) { prelight_in = false; prelight_stage.AddOrReset (this); } return false; } private static Hyena.Gui.Theatrics.Stage prelight_stage = new Hyena.Gui.Theatrics.Stage (250); static CanvasItem () { prelight_stage.ActorStep += actor => { var alpha = actor.Target.prelight_opacity; alpha += actor.Target.prelight_in ? actor.StepDeltaPercent : -actor.StepDeltaPercent; actor.Target.prelight_opacity = alpha = Math.Max (0.0, Math.Min (1.0, alpha)); actor.Target.InvalidateRender (); return alpha > 0 && alpha < 1; }; } /*protected virtual void OnClicked () { var handler = Clicked; if (handler != null) { handler (this, EventArgs.Empty); } }*/ #endregion private class MemoryDataBinder : Hyena.Data.IDataBinder { public void Bind (object o) { BoundObject = o; } public object BoundObject { get; set; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/CanvasItemCollection.cs0000644000175000017500000000605011467745411026253 0ustar00rubenruben00000000000000// // CanvasItemCollection.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Collections.Generic; namespace Hyena.Gui.Canvas { public class CanvasItemCollection : IEnumerable { private CanvasItem parent; private List children = new List (); public CanvasItemCollection (CanvasItem parent) { this.parent = parent; } public void Add (CanvasItem child) { if (!children.Contains (child)) { children.Add (child); child.Parent = parent; parent.InvalidateArrange (); } } private void Unparent (CanvasItem child) { child.Parent = null; } public void Remove (CanvasItem child) { if (children.Remove (child)) { Unparent (child); parent.InvalidateArrange (); } } public void Move (CanvasItem child, int position) { if (children.Remove (child)) { children.Insert (position, child); parent.InvalidateArrange (); } } public void Clear () { foreach (var child in children) { Unparent (child); } children.Clear (); } public IEnumerator GetEnumerator () { foreach (var item in children) { yield return item; } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () { return GetEnumerator (); } public CanvasItem this[int index] { get { return children[index]; } } public CanvasItem Parent { get { return parent; } } public int Count { get { return children.Count; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/Rect.cs0000644000175000017500000001664411467745411023114 0ustar00rubenruben00000000000000// // Rect.cs // // Author: // Aaron Bockover // // Copyright 2009-2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Gui.Canvas { public struct Rect { private double x, y, w, h; public Rect (double x, double y, double width, double height) : this () { X = x; Y = y; Width = width; Height = height; } public Rect (Point point1, Point point2) : this () { X = Math.Min (point1.X, point2.X); Y = Math.Min (point1.Y, point2.Y); Width = Math.Abs (point2.X - point1.X); Height = Math.Abs (point2.Y - point1.Y); } public Rect (Point location, Size size) : this () { X = location.X; Y = location.Y; Width = size.Width; Height = size.Height; } public override string ToString () { if (IsEmpty) { return "Empty"; } return String.Format ("{0}+{1},{2}x{3}", x, y, w, h); } public double X { get { return x; } set { x = value; } } public double Y { get { return y; } set { y = value; } } public double Width { get { return w; } set { if (value < 0) { throw new ArgumentException (); } w = value; } } public double Height { get { return h; } set { if (value < 0) { throw new ArgumentException (); } h = value; } } public bool Contains (double px, double py) { return !(px < x || px > x + w || py < y || py > y + h); } public bool Contains (Point point) { return Contains (point.X, point.Y); } public bool IntersectsWith (Rect rect) { return !(Left > rect.Right || Right < rect.Left || Top > rect.Bottom || Bottom < rect.Top); } public static Rect Empty { get { var empty = new Rect (Double.PositiveInfinity, Double.PositiveInfinity, 0, 0); empty.w = empty.h = Double.NegativeInfinity; return empty; } } public bool IsEmpty { get { return w < 0 && h < 0; } } public double Left { get { return x; } } public double Top { get { return y; } } public double Right { get { return IsEmpty ? Double.NegativeInfinity : x + w; } } public double Bottom { get { return IsEmpty ? Double.NegativeInfinity : y + h; } } public Size Size { get { return new Size (Width, Height); } } public Point Point { get { return new Point (X, Y); } } public void Intersect (Rect rect) { if (IsEmpty || rect.IsEmpty) { this = Rect.Empty; return; } double new_x = Math.Max (x, rect.x); double new_y = Math.Max (y, rect.y); double new_w = Math.Min (Right, rect.Right) - new_x; double new_h = Math.Min (Bottom, rect.Bottom) - new_y; x = new_x; y = new_y; w = new_w; h = new_h; if (w < 0 || h < 0) { this = Rect.Empty; } } public void Union (Rect rect) { if (IsEmpty) { x = rect.x; y = rect.y; h = rect.h; w = rect.w; } else if (!rect.IsEmpty) { double new_x = Math.Min (Left, rect.Left); double new_y = Math.Min (Top, rect.Top); double new_w = Math.Max (Right, rect.Right) - new_x; double new_h = Math.Max (Bottom, rect.Bottom) - new_y; x = new_x; y = new_y; w = new_w; h = new_h; } } public void Union (Point point) { Union (new Rect (point, point)); } public void Offset (Rect rect) { x += rect.X; y += rect.Y; } public void Offset (Point point) { x += point.X; y += point.Y; } public void Offset (double dx, double dy) { x += dx; y += dy; } public static bool operator == (Rect rect1, Rect rect2) { return rect1.x == rect2.x && rect1.y == rect2.y && rect1.w == rect2.w && rect1.h == rect2.h; } public static bool operator != (Rect rect1, Rect rect2) { return !(rect1 == rect2); } public override bool Equals (object o) { if (o is Rect) { return this == (Rect)o; } return false; } public bool Equals (Rect value) { return this == value; } public override int GetHashCode () { return x.GetHashCode () ^ y.GetHashCode () ^ w.GetHashCode () ^ h.GetHashCode (); } #region GDK/Cairo extensions public static explicit operator Rect (Gdk.Rectangle rect) { return new Rect () { X = rect.X, Y = rect.Y, Width = rect.Width, Height = rect.Height }; } public static explicit operator Gdk.Rectangle (Rect rect) { return new Gdk.Rectangle () { X = (int)Math.Floor (rect.X), Y = (int)Math.Floor (rect.Y), Width = (int)Math.Ceiling (rect.Width), Height = (int)Math.Ceiling (rect.Height) }; } public static explicit operator Rect (Cairo.Rectangle rect) { return new Rect (rect.X, rect.Y, rect.Width, rect.Height); } public static explicit operator Cairo.Rectangle (Rect rect) { return new Cairo.Rectangle (rect.X, rect.Y, rect.Width, rect.Height); } #endregion } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/Orientation.cs0000644000175000017500000000244511467745411024504 0ustar00rubenruben00000000000000// // Orientation.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Hyena.Gui.Canvas { public enum Orientation { Horizontal, Vertical } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/CanvasManager.cs0000644000175000017500000000363011467745411024714 0ustar00rubenruben00000000000000// // CanvasHost.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Hyena.Gui.Canvas { public class CanvasManager { private object host; public CanvasManager (object host) { this.host = host; } public void QueueArrange (CanvasItem item) { item.Arrange (); } public void QueueMeasure (CanvasItem item) { item.Measure (item.ContentSize); } public void QueueRender (CanvasItem item, Rect rect) { ICanvasHost host = Host as ICanvasHost; if (host == null) { return; } host.QueueRender (item, rect); } public object Host { get { return host; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/ImageBrush.cs0000644000175000017500000000467611467745411024247 0ustar00rubenruben00000000000000// // ImageBrush.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using Cairo; using Hyena.Gui; namespace Hyena.Gui.Canvas { public class ImageBrush : Brush { private ImageSurface surface; //private bool surface_owner; public ImageBrush () { } public ImageBrush (string path) : this (new Gdk.Pixbuf (path), true) { } public ImageBrush (Gdk.Pixbuf pixbuf, bool disposePixbuf) : this (new PixbufImageSurface (pixbuf, disposePixbuf), true) { } public ImageBrush (ImageSurface surface, bool disposeSurface) { this.surface = surface; //this.surface_owner = disposeSurface; } protected ImageSurface Surface { get { return surface; } set { surface = value; } } public override bool IsValid { get { return surface != null; } } public override void Apply (Cairo.Context cr) { if (surface != null) { cr.SetSource (surface); } } public override double Width { get { return surface == null ? 0 : surface.Width; } } public override double Height { get { return surface == null ? 0 : surface.Height; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/AnimationManager.cs0000644000175000017500000000720111467745411025416 0ustar00rubenruben00000000000000// // AnimationManager.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using Hyena.Gui.Theatrics; namespace Hyena.Gui.Canvas { public class Animation { //private int iterations; internal protected Stage Stage { get; set; } internal protected Actor Actor { get; set; } public Easing Easing { get; set; } public CanvasItem Item { get; set; } public int Repeat { get; set; } public uint Duration { get; set; } public Action Update { get; set; } public Action Finished { get; set; } public double Percent { get; private set; } public Animation () { Duration = 1000; Easing = Easing.Linear; AnimationManager.Instance.Animate (this); } public Animation (double from, double to, Action set) : this () { Update = animation => set (from + animation.Percent * (to - from)); } public void Start () { if (Stage.Contains (this)) { Actor.Reset (); return; } Actor = Stage.Add (this, Duration); Percent = 0; //iterations = 0; Actor.CanExpire = false; } internal bool Step (Actor actor) { bool is_expired = actor.Percent == 1; //bool is_expired = false; /*if (Repeat > 0 && actor.Percent == 1) { if (++iterations >= Repeat) { is_expired = true; } }*/ Percent = Choreographer.Compose (actor.Percent, Easing); Update (this); if (is_expired && Finished != null) { Finished (this); } if (Item != null) { Item.InvalidateRender (); //Item.Invalidate (); } return !is_expired; } } public class AnimationManager { private static AnimationManager instance; public static AnimationManager Instance { get { return instance ?? (instance = new AnimationManager ()); } } private Stage stage = new Stage (); public AnimationManager () { stage.Play (); stage.ActorStep += (actor) => actor.Target.Step (actor); } internal void Animate (Animation animation) { animation.Stage = stage; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/TextBlock.cs0000644000175000017500000002126011467745411024104 0ustar00rubenruben00000000000000// // TextBlock.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Linq; using Cairo; using Hyena.Gui; namespace Hyena.Gui.Canvas { public class TextBlock : CanvasItem { private Pango.Layout layout; private Rect text_alloc = Rect.Empty; private Rect invalidation_rect = Rect.Empty; public TextBlock () { FontWeight = FontWeight.Normal; TextWrap = TextWrap.None; EllipsizeMode = Pango.EllipsizeMode.End; } private bool EnsureLayout () { if (layout != null) { return true; } Gtk.Widget widget = Manager == null ? null : Manager.Host as Gtk.Widget; if (widget == null || widget.GdkWindow == null || !widget.IsRealized) { return false; } using (var cr = Gdk.CairoHelper.Create (widget.GdkWindow)) { layout = CairoExtensions.CreateLayout (widget, cr); } return layout != null; } public override Size Measure (Size available) { if (!EnsureLayout ()) { return new Size (0, 0); } available = base.Measure (available); int text_w, text_h; TextWrap wrap = TextWrap; layout.Width = wrap == TextWrap.None ? -1 : (int)(Pango.Scale.PangoScale * (available.Width - Margin.X)); layout.Wrap = GetPangoWrapMode (wrap); layout.FontDescription.Weight = GetPangoFontWeight (FontWeight); layout.SingleParagraphMode = wrap == TextWrap.None; layout.Ellipsize = EllipsizeMode; last_text = GetFormattedText (GetText ()) ?? ""; if (TextWrap == TextWrap.None && last_text.IndexOfAny (lfcr) >= 0) { last_text = last_text.Replace ("\r\n", "\x20").Replace ('\n', '\x20').Replace ('\r', '\x20'); } if (UseMarkup) { layout.SetMarkup (last_text); } else { layout.SetText (last_text); } layout.GetPixelSize (out text_w, out text_h); double width = text_w; if (!available.IsEmpty && available.Width > 0) { width = available.Width; } //DesiredSize = new Size (width, text_h); var size = new Size (width, text_h); // Hack, as this prevents the TextBlock from // being flexible in a Vertical StackPanel Height = size.Height; if (ForceSize) { Width = DesiredSize.Width; } return size; } private string GetText () { if (TextGenerator != null) { return TextGenerator (BoundObject); } else { var so = BoundObject; return so == null ? Text : so.ToString (); } } private string GetFormattedText (string text) { if (String.IsNullOrEmpty (TextFormat)) { return text; } return String.Format (TextFormat, UseMarkup ? GLib.Markup.EscapeText (text) : text); } public override void Arrange () { if (!EnsureLayout ()) { return; } //int layout_width = TextWrap == TextWrap.None ? -1 : (int)(Pango.Scale.PangoScale * RenderSize.Width); int layout_width = (int)(Pango.Scale.PangoScale * RenderSize.Width); if (layout.Width != layout_width) { layout.Width = layout_width; } int text_width, text_height; if (TextWrap != TextWrap.None) { layout.SetHeight ((int)(Pango.Scale.PangoScale * RenderSize.Height)); } layout.GetPixelSize (out text_width, out text_height); if (layout.IsEllipsized || text_width > RenderSize.Width || text_height > RenderSize.Height) { TooltipMarkup = last_text; } else { TooltipMarkup = null; } Rect new_alloc = new Rect ( Math.Round ((RenderSize.Width - text_width) * HorizontalAlignment), Math.Round ((RenderSize.Height - text_height) * VerticalAlignment), text_width, text_height); if (text_alloc.IsEmpty) { InvalidateRender (text_alloc); } else { invalidation_rect = text_alloc; invalidation_rect.Union (new_alloc); // Some padding, likely because of the pen size for // showing the actual text layout in the render pass invalidation_rect.X -= 2; invalidation_rect.Y -= 2; invalidation_rect.Width += 4; invalidation_rect.Height += 4; InvalidateRender (invalidation_rect); } text_alloc = new_alloc; } protected override void ClippedRender (Context cr) { if (!EnsureLayout ()) { return; } Brush foreground = Foreground; if (!foreground.IsValid) { return; } cr.Rectangle (0, 0, RenderSize.Width, RenderSize.Height); cr.Clip (); bool fade = Fade && text_alloc.Width > RenderSize.Width; if (fade) { cr.PushGroup (); } cr.MoveTo (text_alloc.X, text_alloc.Y); Foreground.Apply (cr); Pango.CairoHelper.ShowLayout (cr, layout); cr.Fill (); if (fade) { LinearGradient mask = new LinearGradient (RenderSize.Width - 20, 0, RenderSize.Width, 0); mask.AddColorStop (0, new Color (0, 0, 0, 1)); mask.AddColorStop (1, new Color (0, 0, 0, 0)); cr.PopGroupToSource (); cr.Mask (mask); mask.Destroy (); } cr.ResetClip (); } private Pango.Weight GetPangoFontWeight (FontWeight weight) { switch (weight) { case FontWeight.Bold: return Pango.Weight.Bold; default: return Pango.Weight.Normal; } } private Pango.WrapMode GetPangoWrapMode (TextWrap wrap) { switch (wrap) { case TextWrap.Char: return Pango.WrapMode.Char; case TextWrap.WordChar: return Pango.WrapMode.WordChar; case TextWrap.None: case TextWrap.Word: default: return Pango.WrapMode.Word; } } protected override Rect InvalidationRect { get { return invalidation_rect; } } public override string ToString () { return String.Format ("", last_text, Allocation); } public string Text { get; set; } public string TextFormat { get; set; } public FontWeight FontWeight { get; set; } public TextWrap TextWrap { get; set; } public bool Fade { get; set; } public bool ForceSize { get; set; } public Pango.EllipsizeMode EllipsizeMode { get; set; } public Func TextGenerator { get; set; } public bool UseMarkup { get; set; } public double HorizontalAlignment { get; set; } public double VerticalAlignment { get; set; } private static char[] lfcr = new char[] {'\n', '\r'}; private string last_text; } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/FpsCalculator.cs0000644000175000017500000000412711467745411024752 0ustar00rubenruben00000000000000// // FpsCalculator.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using Gtk; using Gdk; using Hyena.Gui.Theming; namespace Hyena.Gui.Canvas { public class FpsCalculator { private DateTime last_update; private TimeSpan update_interval; private int frame_count; private double fps; public FpsCalculator () { update_interval = TimeSpan.FromSeconds (0.5); } public bool Update () { bool updated = false; DateTime current_time = DateTime.Now; frame_count++; if (current_time - last_update >= update_interval) { fps = (double)frame_count / (current_time - last_update).TotalSeconds; frame_count = 0; updated = true; last_update = current_time; } return updated; } public double FramesPerSecond { get { return fps; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/FontWeight.cs0000644000175000017500000000243311467745411024264 0ustar00rubenruben00000000000000// // FontWeight.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Hyena.Gui.Canvas { public enum FontWeight { Normal, Bold } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/Panel.cs0000644000175000017500000001217611467745411023252 0ustar00rubenruben00000000000000// // Panel.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Linq; namespace Hyena.Gui.Canvas { public class Panel : CanvasItem { private CanvasItemCollection children; public Panel () { children = new CanvasItemCollection (this); } public override Size Measure (Size available) { Size result = new Size (0, 0); foreach (var child in Children) { if (child.Visible) { Size size = child.Measure (available); result.Width = Math.Max (result.Width, size.Width); result.Height = Math.Max (result.Height, size.Height); } } if (!Double.IsNaN (Width)) { result.Width = Width; } if (!Double.IsNaN (Height)) { result.Height = Height; } if (!available.IsEmpty) { result.Width = Math.Min (result.Width, available.Width); result.Height = Math.Min (result.Height, available.Height); } return DesiredSize = result; } public override void Arrange () { foreach (var child in Children) { if (!child.Visible) { continue; } child.Allocation = new Rect (0, 0, Math.Min (ContentAllocation.Width, child.DesiredSize.Width), Math.Min (ContentAllocation.Height, child.DesiredSize.Height)); child.Arrange (); } } protected override void ClippedRender (Hyena.Data.Gui.CellContext context) { foreach (var child in Children) { if (child.Visible) { child.Render (context); } } } public override void Bind (object o) { foreach (var child in Children) { child.Bind (o); } } protected CanvasItem FindChildAt (Point pt, bool grabHasPriority) { return FindChildAt (pt.X, pt.Y, grabHasPriority); } protected CanvasItem FindChildAt (double x, double y, bool grabHasPriority) { if (grabHasPriority) { var child = Children.FirstOrDefault (c => c.IsPointerGrabbed); if (child != null) return child; } foreach (var child in Children) { if (child.IsPointerGrabbed || (child.Visible && child.Allocation.Contains (x, y))) { return child; } } return null; } public override bool GetTooltipMarkupAt (Point pt, out string markup, out Rect area) { if (base.GetTooltipMarkupAt (pt, out markup, out area)) { return true; } pt = ChildCoord (this, pt); CanvasItem child = FindChildAt (pt, false); return child == null ? false : child.GetTooltipMarkupAt (ChildCoord (child, pt), out markup, out area); } public override bool ButtonEvent (Point cursor, bool pressed, uint button) { var child = FindChildAt (cursor, true); return child == null ? false : child.ButtonEvent (ChildCoord (child, cursor), pressed, button); } public override bool CursorMotionEvent (Point cursor) { var child = FindChildAt (cursor, true); return child == null ? false : child.CursorMotionEvent (ChildCoord (child, cursor)); } private Point ChildCoord (CanvasItem item, Point pt) { return new Point (pt.X - item.Allocation.X, pt.Y - item.Allocation.Y); } public override bool IsPointerGrabbed { get { return base.IsPointerGrabbed || FindChildAt (-1, -1, true) != null; } } public CanvasItemCollection Children { get { return children; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Canvas/TestTile.cs0000644000175000017500000000403511467745411023743 0ustar00rubenruben00000000000000// // TestTile.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using Cairo; using Hyena.Gui; namespace Hyena.Gui.Canvas { public class TestTile : CanvasItem { private static Random rand = new Random (); private Color color; private bool color_set; private bool change_on_render = true; public bool ChangeOnRender { get { return change_on_render; } set { change_on_render = value; } } public TestTile () { } protected override void ClippedRender (Context cr) { if (!color_set || ChangeOnRender) { color = CairoExtensions.RgbToColor ((uint)rand.Next (0, 0xffffff)); color_set = true; } CairoExtensions.RoundedRectangle (cr, 0, 0, RenderSize.Width, RenderSize.Height, 5); cr.Color = color; cr.Fill (); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Makefile.in0000644000175000017500000010041111503407234020703 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = lib/Hyena/Hyena.Gui ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = Hyena.Gui ASSEMBLY_BUILD_FLAGS = -unsafe TARGET = library LINK = -r:ICSharpCode.SharpZipLib -r:Mono.Posix -r:System \ -r:System.Core -r:Mono.Cairo $(GTKSHARP_LIBS) \ $(GLIBSHARP_LIBS) -r:$(DIR_BIN)/Hyena.dll $(am__append_1) SOURCES = \ Hyena.Data.Gui/Accessibility/ColumnCellAccessible.cs \ Hyena.Data.Gui/Accessibility/ColumnCellTextAccessible.cs \ Hyena.Data.Gui/Accessibility/ColumnHeaderCellTextAccessible.cs \ Hyena.Data.Gui/Accessibility/ICellAccessibleParent.cs \ Hyena.Data.Gui/Accessibility/ListViewAccessible.cs \ Hyena.Data.Gui/Accessibility/ListViewAccessible_Selection.cs \ Hyena.Data.Gui/Accessibility/ListViewAccessible_Table.cs \ Hyena.Data.Gui/CellContext.cs \ Hyena.Data.Gui/Column.cs \ Hyena.Data.Gui/ColumnCell.cs \ Hyena.Data.Gui/ColumnCellCheckBox.cs \ Hyena.Data.Gui/ColumnCellRating.cs \ Hyena.Data.Gui/ColumnCellText.cs \ Hyena.Data.Gui/ColumnController.cs \ Hyena.Data.Gui/ColumnHeaderCellText.cs \ Hyena.Data.Gui/DataViewLayout.cs \ Hyena.Data.Gui/DataViewLayoutGrid.cs \ Hyena.Data.Gui/IHeaderCell.cs \ Hyena.Data.Gui/IInteractiveCell.cs \ Hyena.Data.Gui/IListView.cs \ Hyena.Data.Gui/ISizeRequestCell.cs \ Hyena.Data.Gui/ITextCell.cs \ Hyena.Data.Gui/ITooltipCell.cs \ Hyena.Data.Gui/ListView/ListView.cs \ Hyena.Data.Gui/ListView/ListView_Accessible.cs \ Hyena.Data.Gui/ListView/ListView_DragAndDrop.cs \ Hyena.Data.Gui/ListView/ListView_Header.cs \ Hyena.Data.Gui/ListView/ListView_Interaction.cs \ Hyena.Data.Gui/ListView/ListView_Model.cs \ Hyena.Data.Gui/ListView/ListView_Rendering.cs \ Hyena.Data.Gui/ListView/ListView_Windowing.cs \ Hyena.Data.Gui/ListView/ListViewBase.cs \ Hyena.Data.Gui/ListViewTestModule.cs \ Hyena.Data.Gui/ObjectListView.cs \ Hyena.Data.Gui/RowActivatedHandler.cs \ Hyena.Data.Gui/SortableColumn.cs \ Hyena.Gui.Canvas/AnimationManager.cs \ Hyena.Gui.Canvas/Brush.cs \ Hyena.Gui.Canvas/CanvasHost.cs \ Hyena.Gui.Canvas/CanvasItem.cs \ Hyena.Gui.Canvas/CanvasItemCollection.cs \ Hyena.Gui.Canvas/CanvasManager.cs \ Hyena.Gui.Canvas/FixedPanel.cs \ Hyena.Gui.Canvas/FontWeight.cs \ Hyena.Gui.Canvas/FpsCalculator.cs \ Hyena.Gui.Canvas/ICanvasHost.cs \ Hyena.Gui.Canvas/Image.cs \ Hyena.Gui.Canvas/ImageBrush.cs \ Hyena.Gui.Canvas/MarginStyle.cs \ Hyena.Gui.Canvas/Orientation.cs \ Hyena.Gui.Canvas/Panel.cs \ Hyena.Gui.Canvas/Point.cs \ Hyena.Gui.Canvas/Prelight.cs \ Hyena.Gui.Canvas/Rect.cs \ Hyena.Gui.Canvas/ShadowMarginStyle.cs \ Hyena.Gui.Canvas/Size.cs \ Hyena.Gui.Canvas/Slider.cs \ Hyena.Gui.Canvas/StackPanel.cs \ Hyena.Gui.Canvas/TestTile.cs \ Hyena.Gui.Canvas/TextBlock.cs \ Hyena.Gui.Canvas/TextWrap.cs \ Hyena.Gui.Canvas/Thickness.cs \ Hyena.Gui.Dialogs/ExceptionDialog.cs \ Hyena.Gui.Dialogs/VersionInformationDialog.cs \ Hyena.Gui.Theatrics/Actor.cs \ Hyena.Gui.Theatrics/Choreographer.cs \ Hyena.Gui.Theatrics/Pulsator.cs \ Hyena.Gui.Theatrics/SingleActorStage.cs \ Hyena.Gui.Theatrics/Stage.cs \ Hyena.Gui.Theatrics/Tests/ChoreographerTests.cs \ Hyena.Gui.Theming/GtkColors.cs \ Hyena.Gui.Theming/GtkTheme.cs \ Hyena.Gui.Theming/Theme.cs \ Hyena.Gui.Theming/ThemeContext.cs \ Hyena.Gui.Theming/ThemeEngine.cs \ Hyena.Gui.Theming/ThemeTestModule.cs \ Hyena.Gui/ActionManager.cs \ Hyena.Gui/BaseWidgetAccessible.cs \ Hyena.Gui/CairoDamageDebugger.cs \ Hyena.Gui/CairoExtensions.cs \ Hyena.Gui/CleanRoomStartup.cs \ Hyena.Gui/CompositeUtils.cs \ Hyena.Gui/Contrast.cs \ Hyena.Gui/DragDropList.cs \ Hyena.Gui/EditableEraseAction.cs \ Hyena.Gui/EditableInsertAction.cs \ Hyena.Gui/EditableUndoAdapter.cs \ Hyena.Gui/GtkUtilities.cs \ Hyena.Gui/GtkWorkarounds.cs \ Hyena.Gui/HyenaActionGroup.cs \ Hyena.Gui/PangoCairoHelper.cs \ Hyena.Gui/PangoExtensions.cs \ Hyena.Gui/PixbufImageSurface.cs \ Hyena.Gui/RatingRenderer.cs \ Hyena.Gui/ShadingTestWindow.cs \ Hyena.Gui/TestModuleAttribute.cs \ Hyena.Gui/TestModuleRunner.cs \ Hyena.Gui/TooltipSetter.cs \ Hyena.Query.Gui/DateQueryValueEntry.cs \ Hyena.Query.Gui/FileSizeQueryValueEntry.cs \ Hyena.Query.Gui/IntegerQueryValueEntry.cs \ Hyena.Query.Gui/NullQueryValueEntry.cs \ Hyena.Query.Gui/QueryBox.cs \ Hyena.Query.Gui/QueryDebugger.cs \ Hyena.Query.Gui/QueryLimitBox.cs \ Hyena.Query.Gui/QueryTermBox.cs \ Hyena.Query.Gui/QueryTermsBox.cs \ Hyena.Query.Gui/QueryValueEntry.cs \ Hyena.Query.Gui/RelativeTimeSpanQueryValueEntry.cs \ Hyena.Query.Gui/StringQueryValueEntry.cs \ Hyena.Query.Gui/TimeSpanQueryValueEntry.cs \ Hyena.Widgets/AnimatedBox.cs \ Hyena.Widgets/AnimatedHBox.cs \ Hyena.Widgets/AnimatedImage.cs \ Hyena.Widgets/AnimatedVBox.cs \ Hyena.Widgets/AnimatedWidget.cs \ Hyena.Widgets/ComplexMenuItem.cs \ Hyena.Widgets/EntryPopup.cs \ Hyena.Widgets/GenericToolItem.cs \ Hyena.Widgets/GrabHandle.cs \ Hyena.Widgets/HigMessageDialog.cs \ Hyena.Widgets/ImageButton.cs \ Hyena.Widgets/MenuButton.cs \ Hyena.Widgets/MessageBar.cs \ Hyena.Widgets/PulsingButton.cs \ Hyena.Widgets/RatingEntry.cs \ Hyena.Widgets/RatingMenuItem.cs \ Hyena.Widgets/RoundedFrame.cs \ Hyena.Widgets/ScrolledWindow.cs \ Hyena.Widgets/SegmentedBar.cs \ Hyena.Widgets/SimpleTable.cs \ Hyena.Widgets/SmoothScrolledWindow.cs \ Hyena.Widgets/TextViewEditable.cs \ Hyena.Widgets/WrapLabel.cs # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) Hyena.Gui.dll.config EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) \ $(THEME_ICONS_SOURCE) Hyena.Gui.dll.config CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/Hyena/Hyena.Gui/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/Hyena/Hyena.Gui/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Theming/0000777000175000017500000000000011503407411022023 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Theming/Theme.cs0000644000175000017500000002202611467745411023430 0ustar00rubenruben00000000000000// // Theme.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using Gtk; using Gdk; using Cairo; using Hyena.Gui; namespace Hyena.Gui.Theming { public abstract class Theme { private static Cairo.Color black = new Cairo.Color (0, 0, 0); private Stack contexts = new Stack (); private GtkColors colors; private Cairo.Color selection_fill; private Cairo.Color selection_stroke; private Cairo.Color view_fill; private Cairo.Color view_fill_transparent; private Cairo.Color text_mid; public GtkColors Colors { get { return colors; } } public Widget Widget { get; private set; } public Theme (Widget widget) : this (widget, new GtkColors ()) { } public Theme (Widget widget, GtkColors colors) { this.Widget = widget; this.colors = colors; this.colors.Refreshed += delegate { OnColorsRefreshed (); }; this.colors.Widget = widget; PushContext (); } protected virtual void OnColorsRefreshed () { selection_fill = colors.GetWidgetColor (GtkColorClass.Dark, StateType.Active); selection_stroke = colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected); view_fill = colors.GetWidgetColor (GtkColorClass.Base, StateType.Normal); view_fill_transparent = view_fill; view_fill_transparent.A = 0; text_mid = CairoExtensions.AlphaBlend ( colors.GetWidgetColor (GtkColorClass.Base, StateType.Normal), colors.GetWidgetColor (GtkColorClass.Text, StateType.Normal), 0.5); } #region Drawing public abstract void DrawPie (double fraction); public void DrawArrow (Cairo.Context cr, Gdk.Rectangle alloc, Hyena.Data.SortType type) { DrawArrow (cr, alloc, Math.PI / 2.0 * (type == Hyena.Data.SortType.Ascending ? 1 : -1)); } public abstract void DrawArrow (Cairo.Context cr, Gdk.Rectangle alloc, double rotation); public void DrawFrame (Cairo.Context cr, Gdk.Rectangle alloc, bool baseColor) { DrawFrameBackground (cr, alloc, baseColor); DrawFrameBorder (cr, alloc); } public void DrawFrame (Cairo.Context cr, Gdk.Rectangle alloc, Cairo.Color color) { DrawFrameBackground (cr, alloc, color); DrawFrameBorder (cr, alloc); } public void DrawFrameBackground (Cairo.Context cr, Gdk.Rectangle alloc, bool baseColor) { DrawFrameBackground (cr, alloc, baseColor ? colors.GetWidgetColor (GtkColorClass.Base, StateType.Normal) : colors.GetWidgetColor (GtkColorClass.Background, StateType.Normal)); } public void DrawFrameBackground (Cairo.Context cr, Gdk.Rectangle alloc, Cairo.Color color) { DrawFrameBackground (cr, alloc, color, null); } public void DrawFrameBackground (Cairo.Context cr, Gdk.Rectangle alloc, Cairo.Pattern pattern) { DrawFrameBackground (cr, alloc, black , pattern); } public abstract void DrawFrameBackground (Cairo.Context cr, Gdk.Rectangle alloc, Cairo.Color color, Cairo.Pattern pattern); public abstract void DrawFrameBorder (Cairo.Context cr, Gdk.Rectangle alloc); public abstract void DrawHeaderBackground (Cairo.Context cr, Gdk.Rectangle alloc); public abstract void DrawColumnHeaderFocus (Cairo.Context cr, Gdk.Rectangle alloc); public abstract void DrawHeaderSeparator (Cairo.Context cr, Gdk.Rectangle alloc, int x); public void DrawListBackground (Cairo.Context cr, Gdk.Rectangle alloc, bool baseColor) { DrawListBackground (cr, alloc, baseColor ? colors.GetWidgetColor (GtkColorClass.Base, StateType.Normal) : colors.GetWidgetColor (GtkColorClass.Background, StateType.Normal)); } public abstract void DrawListBackground (Cairo.Context cr, Gdk.Rectangle alloc, Cairo.Color color); public void DrawColumnHighlight (Cairo.Context cr, double cellWidth, double cellHeight) { Gdk.Rectangle alloc = new Gdk.Rectangle (); alloc.Width = (int)cellWidth; alloc.Height = (int)cellHeight; DrawColumnHighlight (cr, alloc); } public void DrawColumnHighlight (Cairo.Context cr, Gdk.Rectangle alloc) { DrawColumnHighlight (cr, alloc, colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected)); } public abstract void DrawColumnHighlight (Cairo.Context cr, Gdk.Rectangle alloc, Cairo.Color color); public void DrawRowSelection (Cairo.Context cr, int x, int y, int width, int height) { DrawRowSelection (cr, x, y, width, height, true); } public void DrawRowSelection (Cairo.Context cr, int x, int y, int width, int height, bool filled) { DrawRowSelection (cr, x, y, width, height, filled, true, colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected), CairoCorners.All); } public void DrawRowSelection (Cairo.Context cr, int x, int y, int width, int height, bool filled, bool stroked, Cairo.Color color) { DrawRowSelection (cr, x, y, width, height, filled, stroked, color, CairoCorners.All); } public void DrawRowCursor (Cairo.Context cr, int x, int y, int width, int height) { DrawRowCursor (cr, x, y, width, height, colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected)); } public void DrawRowCursor (Cairo.Context cr, int x, int y, int width, int height, Cairo.Color color) { DrawRowCursor (cr, x, y, width, height, color, CairoCorners.All); } public abstract void DrawRowCursor (Cairo.Context cr, int x, int y, int width, int height, Cairo.Color color, CairoCorners corners); public abstract void DrawRowSelection (Cairo.Context cr, int x, int y, int width, int height, bool filled, bool stroked, Cairo.Color color, CairoCorners corners); public abstract void DrawRowRule (Cairo.Context cr, int x, int y, int width, int height); public Cairo.Color ViewFill { get { return view_fill; } } public Cairo.Color ViewFillTransparent { get { return view_fill_transparent; } } public Cairo.Color SelectionFill { get { return selection_fill; } } public Cairo.Color SelectionStroke { get { return selection_stroke; } } public Cairo.Color TextMidColor { get { return text_mid; } protected set { text_mid = value; } } public virtual int BorderWidth { get { return 1; } } public virtual int InnerBorderWidth { get { return 4; } } public int TotalBorderWidth { get { return BorderWidth + InnerBorderWidth; } } #endregion #region Contexts public virtual void PushContext () { PushContext (new ThemeContext ()); } public virtual void PushContext (ThemeContext context) { lock (this) { contexts.Push (context); } } public virtual ThemeContext PopContext () { lock (this) { return contexts.Pop (); } } public virtual ThemeContext Context { get { lock (this) { return contexts.Peek (); } } } #endregion #region Static Utilities public static double Clamp (double min, double max, double value) { return Math.Max (min, Math.Min (max, value)); } #endregion } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Theming/ThemeTestModule.cs0000644000175000017500000000700311420634720025421 0ustar00rubenruben00000000000000// // ThemeTestModule.cs // // Author: // Aaron Bockover // // Copyright 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using Gtk; using Hyena.Gui; namespace Hyena.Gui.Theming { [TestModule ("Theme")] public class ThemeTestModule : Window { public ThemeTestModule () : base ("Theme") { var align = new Alignment (0.0f, 0.0f, 1.0f, 1.0f); var theme_widget = new ThemeTestWidget (); align.Add (theme_widget); Add (align); ShowAll (); int state = 0; uint[,] borders = { {0, 0, 0, 0}, {10, 0, 0, 0}, {0, 10, 0, 0}, {0, 0, 10, 0}, {0, 0, 0, 10}, {10, 10, 0, 0}, {10, 10, 10, 0}, {10, 10, 10, 10}, {10, 0, 0, 10}, {0, 10, 10, 0} }; GLib.Timeout.Add (2000, delegate { Console.WriteLine (state); align.TopPadding = borders[state, 0]; align.RightPadding = borders[state, 1]; align.BottomPadding = borders[state, 2]; align.LeftPadding = borders[state, 3]; if (++state % borders.GetLength (0) == 0) { state = 0; } return true; }); } private class ThemeTestWidget : DrawingArea { private Theme theme; protected override void OnStyleSet (Style previous_style) { base.OnStyleSet (previous_style); theme = ThemeEngine.CreateTheme (this); theme.Context.Radius = 10; } protected override bool OnExposeEvent (Gdk.EventExpose evnt) { Cairo.Context cr = null; try { var alloc = new Gdk.Rectangle () { X = Allocation.X, Y = Allocation.Y, Width = Allocation.Width, Height = Allocation.Height }; cr = Gdk.CairoHelper.Create (evnt.Window); theme.DrawListBackground (cr, alloc, true); theme.DrawFrameBorder (cr, alloc); } finally { CairoExtensions.DisposeContext (cr); } return true; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Theming/GtkTheme.cs0000644000175000017500000003570411467745411024105 0ustar00rubenruben00000000000000// // GtkTheme.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Cairo; using Gtk; namespace Hyena.Gui.Theming { public class GtkTheme : Theme { private Cairo.Color rule_color; private Cairo.Color border_color; public GtkTheme (Widget widget) : base (widget) { } public static Cairo.Color GetCairoTextMidColor (Widget widget) { Cairo.Color text_color = CairoExtensions.GdkColorToCairoColor (widget.Style.Foreground (StateType.Normal)); Cairo.Color background_color = CairoExtensions.GdkColorToCairoColor (widget.Style.Background (StateType.Normal)); return CairoExtensions.AlphaBlend (text_color, background_color, 0.5); } public static Gdk.Color GetGdkTextMidColor (Widget widget) { Cairo.Color color = GetCairoTextMidColor (widget); Gdk.Color gdk_color = new Gdk.Color ((byte)(color.R * 255), (byte)(color.G * 255), (byte)(color.B * 255)); Gdk.Colormap.System.AllocColor (ref gdk_color, true, true); return gdk_color; } protected override void OnColorsRefreshed () { base.OnColorsRefreshed (); rule_color = CairoExtensions.ColorShade (ViewFill, 0.95); border_color = Colors.GetWidgetColor (GtkColorClass.Dark, StateType.Active); } public override void DrawPie (double fraction) { // Calculate the pie path fraction = Theme.Clamp (0.0, 1.0, fraction); double a1 = 3.0 * Math.PI / 2.0; double a2 = a1 + 2.0 * Math.PI * fraction; if (fraction == 0.0) { return; } Context.Cairo.MoveTo (Context.X, Context.Y); Context.Cairo.Arc (Context.X, Context.Y, Context.Radius, a1, a2); Context.Cairo.LineTo (Context.X, Context.Y); // Fill the pie Color color_a = Colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected); Color color_b = CairoExtensions.ColorShade (color_a, 1.4); RadialGradient fill = new RadialGradient (Context.X, Context.Y, 0, Context.X, Context.Y, 2.0 * Context.Radius); fill.AddColorStop (0, color_a); fill.AddColorStop (1, color_b); Context.Cairo.Pattern = fill; Context.Cairo.FillPreserve (); fill.Destroy (); // Stroke the pie Context.Cairo.Color = CairoExtensions.ColorShade (color_a, 0.8); Context.Cairo.LineWidth = Context.LineWidth; Context.Cairo.Stroke (); } public override void DrawArrow (Context cr, Gdk.Rectangle alloc, double rotation) { rotation -= Math.PI / 2.0; double x1 = alloc.X; double x2 = alloc.Right; double x3 = alloc.X + alloc.Width / 2.0; double y1 = alloc.Y; double y2 = alloc.Bottom; double cx = x3; double cy = alloc.Y + alloc.Height / 2.0; if (rotation != 0) { // Rotate about the center of the arrow cr.Translate (cx, cy); cr.Rotate (rotation); cr.Translate (-cx, -cy); } cr.LineWidth = 1.0; bool hz = (rotation % (Math.PI / 2.0)) == 0; double dx = hz ? 0 : 0.5; double dy = hz ? 0.5 : 0.5; cr.Translate (dx, dy); cr.MoveTo (x1, y1); cr.LineTo (x2, y1); cr.LineTo (x3, y2); cr.LineTo (x1, y1); cr.Color = Colors.GetWidgetColor (GtkColorClass.Base, StateType.Normal); cr.FillPreserve (); cr.Color = Colors.GetWidgetColor (GtkColorClass.Text, StateType.Normal); cr.Stroke (); cr.Translate (-dx, -dy); if (rotation != 0) { cr.Translate (cx, cy); cr.Rotate (-rotation); cr.Translate (-cx, -cy); } } public override void DrawFrameBackground (Cairo.Context cr, Gdk.Rectangle alloc, Cairo.Color color, Cairo.Pattern pattern) { color.A = Context.FillAlpha; if (pattern != null) { cr.Pattern = pattern; } else { cr.Color = color; } CairoExtensions.RoundedRectangle (cr, alloc.X, alloc.Y, alloc.Width, alloc.Height, Context.Radius, CairoCorners.All); cr.Fill (); } public override void DrawFrameBorder (Cairo.Context cr, Gdk.Rectangle alloc) { var corners = CairoCorners.All; double top_extend = 0; double bottom_extend = 0; double left_extend = 0; double right_extend = 0; if (Context.ToplevelBorderCollapse) { if (Widget.Allocation.Top <= Widget.Toplevel.Allocation.Top) { corners &= ~(CairoCorners.TopLeft | CairoCorners.TopRight); top_extend = cr.LineWidth; } if (Widget.Allocation.Bottom >= Widget.Toplevel.Allocation.Bottom) { corners &= ~(CairoCorners.BottomLeft | CairoCorners.BottomRight); bottom_extend = cr.LineWidth; } if (Widget.Allocation.Left <= Widget.Toplevel.Allocation.Left) { corners &= ~(CairoCorners.BottomLeft | CairoCorners.TopLeft); left_extend = cr.LineWidth; } if (Widget.Allocation.Right >= Widget.Toplevel.Allocation.Right) { corners &= ~(CairoCorners.BottomRight | CairoCorners.TopRight); right_extend = cr.LineWidth; } } if (Widget.HasFocus) { cr.LineWidth = BorderWidth * 1.5; cr.Color = CairoExtensions.ColorShade (border_color, 0.8); } else { cr.LineWidth = BorderWidth; cr.Color = border_color; } double offset = (double)cr.LineWidth / 2.0; CairoExtensions.RoundedRectangle (cr, alloc.X + offset - left_extend, alloc.Y + offset - top_extend, alloc.Width - cr.LineWidth + left_extend + right_extend, alloc.Height - cr.LineWidth - top_extend + bottom_extend, Context.Radius, corners); cr.Stroke (); } public override void DrawColumnHighlight (Cairo.Context cr, Gdk.Rectangle alloc, Cairo.Color color) { Cairo.Color light_color = CairoExtensions.ColorShade (color, 1.6); Cairo.Color dark_color = CairoExtensions.ColorShade (color, 1.3); LinearGradient grad = new LinearGradient (alloc.X, alloc.Y, alloc.X, alloc.Bottom - 1); grad.AddColorStop (0, light_color); grad.AddColorStop (1, dark_color); cr.Pattern = grad; cr.Rectangle (alloc.X + 1.5, alloc.Y + 1.5, alloc.Width - 3, alloc.Height - 2); cr.Fill (); grad.Destroy (); } public override void DrawHeaderBackground (Cairo.Context cr, Gdk.Rectangle alloc) { Cairo.Color gtk_background_color = Colors.GetWidgetColor (GtkColorClass.Background, StateType.Normal); Cairo.Color light_color = CairoExtensions.ColorShade (gtk_background_color, 1.1); Cairo.Color dark_color = CairoExtensions.ColorShade (gtk_background_color, 0.95); CairoCorners corners = CairoCorners.TopLeft | CairoCorners.TopRight; LinearGradient grad = new LinearGradient (alloc.X, alloc.Y, alloc.X, alloc.Bottom); grad.AddColorStop (0, light_color); grad.AddColorStop (0.75, dark_color); grad.AddColorStop (0, light_color); cr.Pattern = grad; CairoExtensions.RoundedRectangle (cr, alloc.X, alloc.Y, alloc.Width, alloc.Height, Context.Radius, corners); cr.Fill (); cr.Color = border_color; cr.Rectangle (alloc.X, alloc.Bottom, alloc.Width, BorderWidth); cr.Fill (); grad.Destroy (); } public override void DrawColumnHeaderFocus (Cairo.Context cr, Gdk.Rectangle alloc) { double top_offset = 2.0; double right_offset = 2.0; double margin = 0.5; double line_width = 0.7; Cairo.Color stroke_color = CairoExtensions.ColorShade ( Colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected), 0.8); stroke_color.A = 0.1; cr.Color = stroke_color; CairoExtensions.RoundedRectangle (cr, alloc.X + margin + line_width + right_offset, alloc.Y + margin + line_width + top_offset, alloc.Width - (margin + line_width)*2.0 - right_offset, alloc.Height - (margin + line_width)*2.0 - top_offset, Context.Radius/2.0, CairoCorners.None); cr.Fill (); stroke_color.A = 1.0; cr.LineWidth = line_width; cr.Color = stroke_color; CairoExtensions.RoundedRectangle (cr, alloc.X + margin + line_width + right_offset, alloc.Y + margin + line_width + top_offset, alloc.Width - (line_width + margin)*2.0 - right_offset, alloc.Height - (line_width + margin)*2.0 - right_offset, Context.Radius/2.0, CairoCorners.All); cr.Stroke (); } public override void DrawHeaderSeparator (Cairo.Context cr, Gdk.Rectangle alloc, int x) { Cairo.Color gtk_background_color = Colors.GetWidgetColor (GtkColorClass.Background, StateType.Normal); Cairo.Color dark_color = CairoExtensions.ColorShade (gtk_background_color, 0.80); Cairo.Color light_color = CairoExtensions.ColorShade (gtk_background_color, 1.1); int y_1 = alloc.Top + 4; int y_2 = alloc.Bottom - 3; cr.LineWidth = 1; cr.Antialias = Cairo.Antialias.None; cr.Color = dark_color; cr.MoveTo (x, y_1); cr.LineTo (x, y_2); cr.Stroke (); cr.Color = light_color; cr.MoveTo (x + 1, y_1); cr.LineTo (x + 1, y_2); cr.Stroke (); cr.Antialias = Cairo.Antialias.Default; } public override void DrawListBackground (Context cr, Gdk.Rectangle alloc, Color color) { color.A = Context.FillAlpha; cr.Color = color; cr.Rectangle (alloc.X, alloc.Y, alloc.Width, alloc.Height); cr.Fill (); } public override void DrawRowCursor (Cairo.Context cr, int x, int y, int width, int height, Cairo.Color color, CairoCorners corners) { cr.LineWidth = 1.25; cr.Color = color; CairoExtensions.RoundedRectangle (cr, x + cr.LineWidth/2.0, y + cr.LineWidth/2.0, width - cr.LineWidth, height - cr.LineWidth, Context.Radius, corners, true); cr.Stroke (); } public override void DrawRowSelection (Cairo.Context cr, int x, int y, int width, int height, bool filled, bool stroked, Cairo.Color color, CairoCorners corners) { DrawRowSelection (cr, x, y, width, height, filled, stroked, color, corners, false); } public void DrawRowSelection (Cairo.Context cr, int x, int y, int width, int height, bool filled, bool stroked, Cairo.Color color, CairoCorners corners, bool flat_fill) { Cairo.Color selection_color = color; Cairo.Color selection_highlight = CairoExtensions.ColorShade (selection_color, 1.24); Cairo.Color selection_stroke = CairoExtensions.ColorShade (selection_color, 0.85); selection_highlight.A = 0.5; selection_stroke.A = color.A; LinearGradient grad = null; if (filled) { if (flat_fill) { cr.Color = selection_color; } else { Cairo.Color selection_fill_light = CairoExtensions.ColorShade (selection_color, 1.12); Cairo.Color selection_fill_dark = selection_color; selection_fill_light.A = color.A; selection_fill_dark.A = color.A; grad = new LinearGradient (x, y, x, y + height); grad.AddColorStop (0, selection_fill_light); grad.AddColorStop (0.4, selection_fill_dark); grad.AddColorStop (1, selection_fill_light); cr.Pattern = grad; } CairoExtensions.RoundedRectangle (cr, x, y, width, height, Context.Radius, corners, true); cr.Fill (); if (grad != null) { grad.Destroy (); } } if (filled && stroked) { cr.LineWidth = 1.0; cr.Color = selection_highlight; CairoExtensions.RoundedRectangle (cr, x + 1.5, y + 1.5, width - 3, height - 3, Context.Radius - 1, corners, true); cr.Stroke (); } if (stroked) { cr.LineWidth = 1.0; cr.Color = selection_stroke; CairoExtensions.RoundedRectangle (cr, x + 0.5, y + 0.5, width - 1, height - 1, Context.Radius, corners, true); cr.Stroke (); } } public override void DrawRowRule (Cairo.Context cr, int x, int y, int width, int height) { cr.Color = new Cairo.Color (rule_color.R, rule_color.G, rule_color.B, Context.FillAlpha); cr.Rectangle (x, y, width, height); cr.Fill (); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Theming/GtkColors.cs0000644000175000017500000001111211420634720024254 0ustar00rubenruben00000000000000// // GtkColors.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Cairo; using Gtk; namespace Hyena.Gui.Theming { public enum GtkColorClass { Light, Mid, Dark, Base, Text, Background, Foreground } public class GtkColors { private Cairo.Color [] gtk_colors; private Widget widget; private bool refreshing = false; public event EventHandler Refreshed; public Widget Widget { get { return widget; } set { if (widget == value) { return; } else if (widget != null) { widget.Realized -= OnWidgetRealized; widget.StyleSet -= OnWidgetStyleSet; } widget = value; if (widget.IsRealized) { RefreshColors (); } widget.Realized += OnWidgetRealized; widget.StyleSet += OnWidgetStyleSet; } } public GtkColors () { } private void OnWidgetRealized (object o, EventArgs args) { RefreshColors (); } private void OnWidgetStyleSet (object o, StyleSetArgs args) { RefreshColors (); } public Cairo.Color GetWidgetColor (GtkColorClass @class, StateType state) { if (gtk_colors == null) { RefreshColors (); } return gtk_colors[(int)@class * ((int)StateType.Insensitive + 1) + (int)state]; } public void RefreshColors () { if (refreshing) { return; } refreshing = true; int sn = (int)StateType.Insensitive + 1; int cn = (int)GtkColorClass.Foreground + 1; if (gtk_colors == null) { gtk_colors = new Cairo.Color[sn * cn]; } for (int c = 0, i = 0; c < cn; c++) { for (int s = 0; s < sn; s++, i++) { Gdk.Color color = Gdk.Color.Zero; if (widget != null && widget.IsRealized) { switch ((GtkColorClass)c) { case GtkColorClass.Light: color = widget.Style.LightColors[s]; break; case GtkColorClass.Mid: color = widget.Style.MidColors[s]; break; case GtkColorClass.Dark: color = widget.Style.DarkColors[s]; break; case GtkColorClass.Base: color = widget.Style.BaseColors[s]; break; case GtkColorClass.Text: color = widget.Style.TextColors[s]; break; case GtkColorClass.Background: color = widget.Style.Backgrounds[s]; break; case GtkColorClass.Foreground: color = widget.Style.Foregrounds[s]; break; } } else { color = new Gdk.Color (0, 0, 0); } gtk_colors[c * sn + s] = CairoExtensions.GdkColorToCairoColor (color); } } OnRefreshed (); refreshing = false; } protected virtual void OnRefreshed () { EventHandler handler = Refreshed; if (handler != null) { handler (this, EventArgs.Empty); } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Theming/ThemeContext.cs0000644000175000017500000000457411420634720024772 0ustar00rubenruben00000000000000// // Theme.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Cairo; namespace Hyena.Gui.Theming { public class ThemeContext { public bool ToplevelBorderCollapse { get; set; } private double radius = 0.0; public double Radius { get { return radius; } set { radius = value; } } private double fill_alpha = 1.0; public double FillAlpha { get { return fill_alpha; } set { fill_alpha = Theme.Clamp (0.0, 1.0, value); } } private double line_width = 1.0; public double LineWidth { get { return line_width; } set { line_width = value; } } private bool show_stroke = true; public bool ShowStroke { get { return show_stroke; } set { show_stroke = value; } } private double x; public double X { get { return x; } set { x = value; } } private double y; public double Y { get { return y; } set { y = value; } } private Cairo.Context cairo; public Cairo.Context Cairo { get { return cairo; } set { cairo = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Theming/ThemeEngine.cs0000644000175000017500000000324211420634720024542 0ustar00rubenruben00000000000000// // ThemeEngine.cs // // Author: // Aaron Bockover // // Copyright 2009 Aaron Bockover // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Hyena.Gui.Theming { public static class ThemeEngine { private static Type theme_type; public static void SetCurrentTheme () where T : Theme { theme_type = typeof (T); } public static Theme CreateTheme (Gtk.Widget widget) { return theme_type == null ? new GtkTheme (widget) : (Theme)Activator.CreateInstance (theme_type, new object [] { widget }); } } }f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/0000777000175000017500000000000011503407407021306 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ColumnCell.cs0000644000175000017500000000571411467745411023706 0ustar00rubenruben00000000000000// // ColumnCell.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Reflection; using Gtk; using Cairo; using Hyena.Gui.Canvas; using Hyena.Data.Gui.Accessibility; namespace Hyena.Data.Gui { public abstract class ColumnCell : CanvasItem { public virtual Atk.Object GetAccessible (ICellAccessibleParent parent) { return new ColumnCellAccessible (BoundObject, this, parent); } public virtual string GetTextAlternative (object obj) { return ""; } public ColumnCell (string property, bool expand) { Binder = ObjectBinder = new ObjectBinder () { Property = property }; Expand = expand; } public ObjectBinder ObjectBinder { get; private set; } public object BoundObjectParent { get { return ObjectBinder.BoundObjectParent; } } public string Property { get { return ObjectBinder.Property; } set { ObjectBinder.Property = value; } } public virtual void NotifyThemeChange () { } public virtual Gdk.Size Measure (Widget widget) { return Gdk.Size.Empty; } protected override void ClippedRender (CellContext context) { Render (context, ContentAllocation.Width, ContentAllocation.Height); } public virtual void Render (CellContext context, double cellWidth, double cellHeight) { Render (context, context.State, cellWidth, cellHeight); } public virtual void Render (CellContext context, Gtk.StateType state, double cellWidth, double cellHeight) { } public bool Expand { get; set; } public Size? FixedSize { get; set; } public override void Arrange () { } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ColumnController.cs0000644000175000017500000001304311420634720025131 0ustar00rubenruben00000000000000// // ColumnController.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Collections.Generic; namespace Hyena.Data.Gui { public class ColumnController : IEnumerable { private List columns = new List (); private ISortableColumn default_sort_column; private ISortableColumn sort_column; protected List Columns { get { return columns; } } public event EventHandler Updated; protected virtual void OnVisibilitiesChanged () { OnUpdated (); } protected virtual void OnWidthsChanged () { } protected void OnUpdated () { EventHandler handler = Updated; if (handler != null) { handler (this, EventArgs.Empty); } } public void Clear () { lock (this) { foreach (Column column in columns) { column.VisibilityChanged -= OnColumnVisibilityChanged; column.WidthChanged -= OnColumnWidthChanged; } columns.Clear (); } OnUpdated (); } public void AddRange (params Column [] range) { lock (this) { foreach (Column column in range) { column.VisibilityChanged += OnColumnVisibilityChanged; column.WidthChanged += OnColumnWidthChanged; } columns.AddRange (range); } OnUpdated (); } public void Add (Column column) { lock (this) { column.VisibilityChanged += OnColumnVisibilityChanged; column.WidthChanged += OnColumnWidthChanged; columns.Add (column); } OnUpdated (); } public void Insert (Column column, int index) { lock (this) { column.VisibilityChanged += OnColumnVisibilityChanged; column.WidthChanged += OnColumnWidthChanged; columns.Insert (index, column); } OnUpdated (); } public void Remove (Column column) { lock (this) { column.VisibilityChanged -= OnColumnVisibilityChanged; column.WidthChanged -= OnColumnWidthChanged; columns.Remove (column); } OnUpdated (); } public void Remove (int index) { lock (this) { Column column = columns[index]; column.VisibilityChanged -= OnColumnVisibilityChanged; column.WidthChanged -= OnColumnWidthChanged; columns.RemoveAt (index); } OnUpdated (); } public void Reorder (int index, int newIndex) { lock (this) { Column column = columns[index]; columns.RemoveAt (index); columns.Insert (newIndex, column); } OnUpdated (); } IEnumerator IEnumerable.GetEnumerator () { return columns.GetEnumerator (); } IEnumerator IEnumerable.GetEnumerator () { return columns.GetEnumerator (); } public int IndexOf (Column column) { lock (this) { return columns.IndexOf (column); } } public Column [] ToArray () { return columns.ToArray (); } private void OnColumnVisibilityChanged (object o, EventArgs args) { OnVisibilitiesChanged (); } private void OnColumnWidthChanged (object o, EventArgs args) { OnWidthsChanged (); } public Column this[int index] { get { return columns[index]; } } public ISortableColumn DefaultSortColumn { get { return default_sort_column; } set { default_sort_column = value; } } public virtual ISortableColumn SortColumn { get { return sort_column; } set { sort_column = value;} } public int Count { get { return columns.Count; } } public virtual bool EnableColumnMenu { get { return false; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ISizeRequestCell.cs0000644000175000017500000000262211420634720025025 0ustar00rubenruben00000000000000// // ISizeRequestCell.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Data.Gui { public interface ISizeRequestCell { bool RestrictSize { get; set; } void GetWidthRange (Pango.Layout layout, out int min_width, out int max_width); } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/CellContext.cs0000644000175000017500000000377511467745411024102 0ustar00rubenruben00000000000000// // CellContext.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Hyena.Gui.Theming; namespace Hyena.Data.Gui { public class CellContext { public CellContext () { Opaque = true; } public Cairo.Context Context { get; set; } public Pango.Layout Layout { get; set; } public Gtk.Widget Widget { get; set; } public Gtk.StateType State { get; set; } public Gdk.Drawable Drawable { get; set; } public Theme Theme { get; set; } public Gdk.Rectangle Area { get; set; } public Gdk.Rectangle Clip { get; set; } public bool TextAsForeground { get; set; } public bool Opaque { get; set; } public int ViewRowIndex { get; set; } public int ViewColumnIndex { get; set; } public int ModelRowIndex { get; set; } public bool IsRtl { get; set; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ColumnCellCheckBox.cs0000644000175000017500000001076011467745411025312 0ustar00rubenruben00000000000000// // ColumnCellCheckBox.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; using Hyena.Gui.Canvas; namespace Hyena.Data.Gui { public class ColumnCellCheckBox : ColumnCell, IInteractiveCell, ISizeRequestCell { public event EventHandler Toggled; public ColumnCellCheckBox (string property, bool expand) : base (property, expand) { } public override Size Measure (Size available) { Width = Size + 2 * Xpad; Height = Size + 2 * Ypad; return DesiredSize = new Size (Width + Margin.X, Height + Margin.Y); } public override void Render (CellContext context, double cellWidth, double cellHeight) { int cell_width = (int)cellWidth - 2 * Xpad; int cell_height = (int)cellHeight - 2 * Ypad; int x = context.Area.X + xpad + ((cell_width - Size) / 2); int y = context.Area.Y + ypad + ((cell_height - Size) / 2); if (context.State == StateType.Normal && last_hover_bound == BoundObjectParent) { context.State = StateType.Prelight; } Style.PaintCheck (context.Widget.Style, context.Drawable, context.State, Value ? ShadowType.In : ShadowType.Out, context.Clip, context.Widget, "cellcheck", x, y, Size, Size); } private object last_pressed_bound; private object last_hover_bound; public override bool ButtonEvent (Point press, bool pressed, uint button) { if (pressed) { last_pressed_bound = BoundObjectParent; return false; } if (last_pressed_bound != null && last_pressed_bound.Equals (BoundObjectParent)) { Value = !Value; last_pressed_bound = null; var handler = Toggled; if (handler != null) { handler (BoundObjectParent, EventArgs.Empty); } InvalidateRender (); } return true; } public override bool CursorMotionEvent (Point motion) { if (last_hover_bound == BoundObjectParent) { return false; } last_hover_bound = BoundObjectParent; InvalidateRender (); return true; } public override bool CursorLeaveEvent () { base.CursorLeaveEvent (); last_hover_bound = null; InvalidateRender (); return true; } public void GetWidthRange (Pango.Layout layout, out int min, out int max) { min = max = 2 * Xpad + Size; } private bool restrict_size = true; public bool RestrictSize { get { return restrict_size; } set { restrict_size = value; } } private bool Value { get { return (bool)BoundObject; } set { BoundObject = value; } } private int size = 13; public int Size { get { return size; } set { size = value; } } private int xpad = 2; public int Xpad { get { return xpad; } set { xpad = value; } } public int ypad = 2; public int Ypad { get { return ypad; } set { ypad = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs0000644000175000017500000002170111467745411024545 0ustar00rubenruben00000000000000// // ColumnCellText.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; using Cairo; using Hyena.Gui; using Hyena.Gui.Canvas; using Hyena.Gui.Theming; using Hyena.Data.Gui.Accessibility; namespace Hyena.Data.Gui { public class ColumnCellText : ColumnCell, ISizeRequestCell, ITextCell, ITooltipCell { public delegate string DataHandler (); private Pango.Weight font_weight = Pango.Weight.Normal; private Pango.EllipsizeMode ellipsize_mode = Pango.EllipsizeMode.End; private Pango.Alignment alignment = Pango.Alignment.Left; private int text_width; private int text_height; private string text_format = null; protected string MinString, MaxString; private string last_text = null; private bool use_markup; public ColumnCellText (string property, bool expand) : base (property, expand) { Padding = new Thickness (4, 0); SingleParagraphMode = true; } public override Atk.Object GetAccessible (ICellAccessibleParent parent) { return new ColumnCellTextAccessible (BoundObject, this, parent); } public override string GetTextAlternative (object obj) { return GetText (obj); } public void SetMinMaxStrings (object min_max) { SetMinMaxStrings (min_max, min_max); } public void SetMinMaxStrings (object min, object max) { // Set the min/max strings from the min/max objects MinString = GetText (min); MaxString = GetText (max); RestrictSize = true; } //int? height; //public override Size Measure (Size available) //{ //int min, max; //GetWidthRange (ParentLayout.View.PangoLayout, out min, out max); // /*if (height == null) { using (var layout = new Pango.Layout (ParentLayout.View.PangoContext)) { if (layout.FontDescription == null) { layout.FontDescription = new Pango.FontDescription (); } UpdateText (layout, 100, "Woo Mar"); height = TextHeight; } }*/ //return FixedSize ?? new Size (0, (double)height + Padding.Y); //} public override void Render (CellContext context, double cellWidth, double cellHeight) { UpdateText (context, cellWidth); if (String.IsNullOrEmpty (last_text)) { return; } //context.Context.Rectangle (0, 0, cellWidth, cellHeight); //context.Context.Clip (); context.Context.MoveTo (Padding.Left, ((int)cellHeight - text_height) / 2); Cairo.Color color = context.Theme.Colors.GetWidgetColor ( context.TextAsForeground ? GtkColorClass.Foreground : GtkColorClass.Text, context.State); color.A = Alpha ?? (context.Opaque ? 1.0 : 0.5); context.Context.Color = color; PangoCairoHelper.ShowLayout (context.Context, context.Layout); //context.Context.ResetClip (); } public void UpdateText (CellContext context, double cellWidth) { string text = last_text = GetText (BoundObject); UpdateText (context.Layout, cellWidth, text); } public void UpdateText (Pango.Layout layout, double cellWidth, string text) { if (String.IsNullOrEmpty (text)) { return; } layout.Width = (int)((cellWidth - Padding.X) * Pango.Scale.PangoScale); layout.FontDescription.Weight = font_weight; layout.Ellipsize = EllipsizeMode; layout.Alignment = alignment; layout.SingleParagraphMode = SingleParagraphMode; UpdateLayout (layout, text); layout.GetPixelSize (out text_width, out text_height); is_ellipsized = layout.IsEllipsized; } private static char[] lfcr = new char[] {'\n', '\r'}; private void UpdateLayout (Pango.Layout layout, string text) { string final_text = GetFormattedText (text); if (SingleParagraphMode && final_text.IndexOfAny (lfcr) >= 0) { final_text = final_text.Replace ("\r\n", "\x20").Replace ('\n', '\x20').Replace ('\r', '\x20'); } if (use_markup) { layout.SetMarkup (final_text); } else { layout.SetText (final_text); } } public string GetTooltipMarkup (CellContext cellContext, double columnWidth) { UpdateText (cellContext, columnWidth); return IsEllipsized ? GLib.Markup.EscapeText (Text) : null; } public Func TextGenerator { get; set; } protected virtual string GetText (object obj) { if (TextGenerator != null) { return TextGenerator (obj); } else { return obj == null ? String.Empty : obj.ToString (); } } private string GetFormattedText (string text) { if (text_format == null) { return text; } return String.Format (text_format, UseMarkup ? GLib.Markup.EscapeText (text) : text); } private bool is_ellipsized = false; public bool IsEllipsized { get { return is_ellipsized; } } public string Text { get { return last_text; } } protected int TextWidth { get { return text_width; } } protected int TextHeight { get { return text_height; } } public string TextFormat { get { return text_format; } set { text_format = value; } } public Pango.Alignment Alignment { get { return alignment; } set { alignment = value; } } public virtual Pango.Weight FontWeight { get { return font_weight; } set { font_weight = value; } } public bool SingleParagraphMode { get; set; } public virtual Pango.EllipsizeMode EllipsizeMode { get { return ellipsize_mode; } set { ellipsize_mode = value; } } internal static int ComputeRowHeight (Widget widget) { int w_width, row_height; Pango.Layout layout = new Pango.Layout (widget.PangoContext); layout.SetText ("W"); layout.GetPixelSize (out w_width, out row_height); layout.Dispose (); return row_height + 8; } #region ISizeRequestCell implementation public void GetWidthRange (Pango.Layout layout, out int min, out int max) { int height; min = max = -1; if (!String.IsNullOrEmpty (MinString)) { UpdateLayout (layout, MinString); layout.GetPixelSize (out min, out height); min += (int)Padding.X; //Console.WriteLine ("for {0} got min {1} for {2}", this, min, MinString); } if (!String.IsNullOrEmpty (MaxString)) { UpdateLayout (layout, MaxString); layout.GetPixelSize (out max, out height); max += (int)Padding.X; //Console.WriteLine ("for {0} got max {1} for {2}", this, max, MaxString); } } private bool restrict_size = false; public bool RestrictSize { get { return restrict_size; } set { restrict_size = value; } } public bool UseMarkup { get { return use_markup; } set { use_markup = value; } } public double? Alpha { get; set; } #endregion } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ColumnCellRating.cs0000644000175000017500000001264611467745411025055 0ustar00rubenruben00000000000000// // ColumnCellRating.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; using Hyena.Gui; using Hyena.Gui.Canvas; using Hyena.Gui.Theming; namespace Hyena.Data.Gui { public class ColumnCellRating : ColumnCell, IInteractiveCell, ISizeRequestCell { private object last_pressed_bound; private object hover_bound; private int hover_value; private Gdk.Rectangle actual_area_hack; private RatingRenderer renderer = new RatingRenderer (); public ColumnCellRating (string property, bool expand) : base (property, expand) { Xpad = 0; } public override Size Measure (Size available) { Width = renderer.Width; Height = renderer.Height; return DesiredSize = new Size (Width + Margin.X, Height + Margin.Y); } public override void Render (CellContext context, double cellWidth, double cellHeight) { Gdk.Rectangle area = new Gdk.Rectangle (0, 0, (int)cellWidth, (int)cellHeight); // FIXME: Compute font height and set to renderer.Size renderer.Value = Value; bool is_hovering = hover_bound == BoundObjectParent && hover_bound != null; renderer.Render (context.Context, area, context.Theme.Colors.GetWidgetColor (GtkColorClass.Text, context.State), is_hovering, is_hovering, hover_value, 0.8, 0.45, 0.35); // FIXME: Something is hosed in the view when computing cell dimensions // The cell width request is always smaller than the actual cell, so // this value is preserved once we compute it from rendering so the // input stuff can do its necessary calculations actual_area_hack = area; } public override bool ButtonEvent (Point press, bool pressed, uint button) { if (ReadOnly) { return false; } if (pressed) { last_pressed_bound = BoundObjectParent; return false; } if (last_pressed_bound == BoundObjectParent && last_pressed_bound != null) { Value = RatingFromPosition (press.X); InvalidateRender (); last_pressed_bound = null; } return true; } public override bool CursorMotionEvent (Point motion) { if (ReadOnly) { return false; } int value = RatingFromPosition (motion.X); if (hover_bound == BoundObjectParent && value == hover_value) { return false; } hover_bound = BoundObjectParent; hover_value = value; InvalidateRender (); return true; } public override bool CursorLeaveEvent () { base.CursorLeaveEvent (); hover_bound = null; hover_value = MinRating - 1; InvalidateRender (); return true; } public void GetWidthRange (Pango.Layout layout, out int min, out int max) { min = max = renderer.Width; } private int RatingFromPosition (double x) { return renderer.RatingFromPosition (actual_area_hack, x); } private bool restrict_size = true; public bool RestrictSize { get { return restrict_size; } set { restrict_size = value; } } private int Value { get { return BoundObject == null ? MinRating : renderer.ClampValue ((int)BoundObject); } set { BoundObject = renderer.ClampValue (value); } } public int MaxRating { get { return renderer.MaxRating; } set { renderer.MaxRating = value; } } public int MinRating { get { return renderer.MinRating; } set { renderer.MinRating = value; } } public int RatingLevels { get { return renderer.RatingLevels; } } public int Xpad { get { return renderer.Xpad; } set { renderer.Xpad = value; } } public int Ypad { get { return renderer.Ypad; } set { renderer.Ypad = value; } } public bool ReadOnly { get; set; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ColumnHeaderCellText.cs0000644000175000017500000000636011467745411025662 0ustar00rubenruben00000000000000// // ColumnHeaderCellText.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; using Cairo; using Hyena.Data.Gui.Accessibility; namespace Hyena.Data.Gui { public class ColumnHeaderCellText : ColumnCellText, IHeaderCell { public new delegate Column DataHandler (); private DataHandler data_handler; private bool has_sort; public ColumnHeaderCellText (DataHandler data_handler) : base (null, true) { UseMarkup = true; this.data_handler = data_handler; } public override Atk.Object GetAccessible (ICellAccessibleParent parent) { return new ColumnHeaderCellTextAccessible (BoundObject, this, parent); } public override void Render (CellContext context, double cellWidth, double cellHeight) { if (data_handler == null) { return; } if (!has_sort) { base.Render (context, cellWidth, cellHeight); return; } Gdk.Rectangle arrow_alloc = new Gdk.Rectangle (); arrow_alloc.Width = (int)(cellHeight / 3.0); arrow_alloc.Height = (int)((double)arrow_alloc.Width / 1.6); arrow_alloc.X = (int)cellWidth - arrow_alloc.Width - (int)Padding.Left; arrow_alloc.Y = ((int)cellHeight - arrow_alloc.Height) / 2; double textWidth = arrow_alloc.X - Padding.Left; if (textWidth > 0) { base.Render (context, textWidth, cellHeight); } SortType sort_type = ((ISortableColumn)data_handler ()).SortType; if (sort_type != SortType.None) { context.Theme.DrawArrow (context.Context, arrow_alloc, sort_type); } } protected override string GetText (object obj) { return data_handler ().Title; } public bool HasSort { get { return has_sort; } set { has_sort = value; } } public static int GetArrowWidth (int headerHeight) { return (int)(headerHeight / 3.0) + 4; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ITextCell.cs0000644000175000017500000000245411420634720023471 0ustar00rubenruben00000000000000// // ITextCell.cs // // Author: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Data.Gui { public interface ITextCell { Pango.Weight FontWeight { get; set; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/RowActivatedHandler.cs0000644000175000017500000000331311420634720025521 0ustar00rubenruben00000000000000// // RowActivatedHandler.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Data.Gui { public delegate void RowActivatedHandler (object o, RowActivatedArgs args); public class RowActivatedArgs : EventArgs { private int row; private T row_value; public RowActivatedArgs (int row, T rowValue) { this.row = row; this.row_value = rowValue; } public int Row { get { return row; } } public T RowValue { get { return row_value; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ListViewTestModule.cs0000644000175000017500000002267111467745411025426 0ustar00rubenruben00000000000000// // ListViewTestModule.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using Gtk; using Hyena.Data; using Hyena.Collections; using Hyena.Gui; using Hyena.Gui.Canvas; using Hyena.Data.Gui; using Selection = Hyena.Collections.Selection; namespace Hyena.Data.Gui.Tests { [TestModule ("List View")] public class ListViewTestModule : Window { private View view; private Model model; public ListViewTestModule () : base ("ListView") { WindowPosition = WindowPosition.Center; SetDefaultSize (800, 600); ScrolledWindow scroll = new ScrolledWindow (); scroll.HscrollbarPolicy = PolicyType.Automatic; scroll.VscrollbarPolicy = PolicyType.Automatic; view = new View (); model = new Model (); scroll.Add (view); Add (scroll); ShowAll (); view.SetModel (model); } private class View : ListView { public View () { ColumnController = new ColumnController (); ColumnController.AddRange ( new Column (String.Empty, new ColumnCellCheckBox ("F", true), 1), new Column ("Apples", new ColumnCellText ("B", true), 1), new Column ("Pears", new ColumnCellText ("C", true), 1), new Column ("How Hot", new ColumnCellRating ("G", true), 1), new Column ("Peaches", new ColumnCellText ("D", true), 1), new Column ("Doodle", new ColumnCellDoodle ("E", true), 1), new Column ("GUIDs!OMG", new ColumnCellText ("A", true), 1) ); } } } [TestModule ("Grid View")] public class GridViewTestModule : Window { private View view; private Model model; public GridViewTestModule () : base ("GridView") { WindowPosition = WindowPosition.Center; SetDefaultSize (800, 600); view = new View (); model = new Model (); /*var hbox = new HBox () { Spacing = 6 }; var add_margin_control = new System.Action, System.Action> ((type, get, set) => { var spin = new SpinButton (0, 20, 1); spin.Value = get (); spin.ValueChanged += (o, a) => { set (spin.Value); }; hbox.PackStart (new Label (type + " Margin:"), false, false, 0); hbox.PackStart (spin, false, false, 0); }); add_margin_control ("", () => view.Box.Margin.Left, v => view.Box.Margin = new Thickness (v));*/ var scroll = new ScrolledWindow () { HscrollbarPolicy = PolicyType.Automatic, VscrollbarPolicy = PolicyType.Automatic }; scroll.Add (view); var vbox = new VBox () { Spacing = 12 }; //vbox.PackStart (hbox, true, true, 0); vbox.PackStart (scroll, true, true, 0); Add (vbox); ShowAll (); view.SetModel (model); } private class View : ListView { public View () { ViewLayout = new DataViewLayoutGrid () { ChildAllocator = () => { return new StackPanel () { Orientation = Hyena.Gui.Canvas.Orientation.Vertical, Width = 400, Spacing = 15, //Margin = new Thickness (10), Theme = Theme, Children = { new Slider (), new ColumnCellCheckBox ("F", true), new TextBlock () { Binder = new ObjectBinder () { Property = "A" } }, new TextBlock () { Binder = new ObjectBinder () { Property = "B" } }, //new ColumnCellText ("B", true), //new ColumnCellText ("C", true), new ColumnCellRating ("G", true), //new ColumnCellText ("D", true), new ColumnCellDoodle ("E", true), //new ColumnCellText ("A", true) } }; //return new ColumnCellRating ("G", true); }, View = this }; } } } internal class Model : IListModel { private List store = new List (); private Selection selection = new Selection (); public event EventHandler Cleared; public event EventHandler Reloaded; public Model () { Random random = new Random (0); for (int i = 0; i < 1000; i++) { store.Add (new ModelItem (i, random)); } } public void Clear () { } public void Reload () { } public object GetItem (int index) { return this[index]; } public int Count { get { return store.Count; } } public bool CanReorder { get { return false; } } public ModelItem this[int index] { get { return store[index]; } } public Selection Selection { get { return selection; } } } internal class ModelItem { public ModelItem (int i, Random rand) { a = Guid.NewGuid ().ToString (); b = rand.Next (0, 255); c = rand.NextDouble (); d = String.Format ("Item {0}", i); e = new List (); f = rand.Next (0, 1) == 1; g = rand.Next (0, 5); } string a; public string A { get { return a; } } int b; public int B { get { return b; } } double c; public double C { get { return c; } } string d; public string D { get { return d; } } List e; public List E { get { return e; } } bool f; public bool F { get { return f; } set { f = value; } } int g; public int G { get { return g; } set { g = value; } } } internal class ColumnCellDoodle : ColumnCell, IInteractiveCell { private Random random = new Random (); private bool red = false; public ColumnCellDoodle (string property, bool expand) : base (property, expand) { } public override void Render (CellContext context, double cellWidth, double cellHeight) { red = !red; Cairo.Context cr = context.Context; cr.Rectangle (0, 0, cellWidth, cellHeight); cr.Color = CairoExtensions.RgbaToColor (red ? 0xff000099 : 0x00000099); cr.Fill (); List points = Points; for (int i = 0, n = points.Count; i < n; i++) { if (i == 0) { cr.MoveTo (points[i].X, points[i].Y); } else { cr.LineTo (points[i].X, points[i].Y); } } cr.Color = CairoExtensions.RgbToColor ((uint)random.Next (0xffffff)); cr.LineWidth = 1; cr.Stroke (); } private object last_pressed_bound; public bool ButtonEvent (int x, int y, bool pressed, Gdk.EventButton evnt) { if (!pressed) { last_pressed_bound = null; return false; } last_pressed_bound = BoundObject; Points.Add (new Gdk.Point (x, y)); return true; } public bool MotionEvent (int x, int y, Gdk.EventMotion evnt) { if (last_pressed_bound == BoundObject) { Points.Add (new Gdk.Point (x, y)); return true; } return false; } public bool PointerLeaveEvent () { last_pressed_bound = null; return true; } private List Points { get { return (List)BoundObject; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ITooltipCell.cs0000644000175000017500000000253511420634720024177 0ustar00rubenruben00000000000000// // ITooltipCell.cs // // Author: // Gabriel Burt // // Copyright (C) 2009 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gdk; namespace Hyena.Data.Gui { public interface ITooltipCell { string GetTooltipMarkup (CellContext cellContext, double columnWidth); } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/IListView.cs0000644000175000017500000000321611420634720023510 0ustar00rubenruben00000000000000// // IListView.cs // // Authors: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // namespace Hyena.Data.Gui { public interface IListView { Hyena.Collections.SelectionProxy SelectionProxy { get; } Hyena.Collections.Selection Selection { get; } void ScrollTo (int index); void CenterOn (int index); void GrabFocus (); ColumnController ColumnController { get; set; } } public interface IListView : IListView { void SetModel (IListModel model); IListModel Model { get; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/IHeaderCell.cs0000644000175000017500000000240711420634720023733 0ustar00rubenruben00000000000000// // IHeaderCell.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Data.Gui { public interface IHeaderCell { } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/DataViewLayoutGrid.cs0000644000175000017500000001336611467745411025363 0ustar00rubenruben00000000000000// // DataViewLayoutGrid.cs // // Author: // Aaron Bockover // // Copyright 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using Hyena.Gui.Canvas; namespace Hyena.Data.Gui { public class DataViewLayoutGrid : DataViewLayout { public int Rows { get; private set; } public int Columns { get; private set; } public Func ChildAllocator { get; set; } public event EventHandler> ChildCountChanged; protected override void InvalidateChildSize () { if (Children.Count <= 0) { Children.Add (CreateChild ()); } ChildSize = Children[0].Measure (Size.Empty); } protected override void InvalidateVirtualSize () { double model_rows = Model == null ? 0 : Model.Count; VirtualSize = new Size ( ChildSize.Width * Math.Max (Columns, 1), ChildSize.Height * Math.Ceiling (model_rows / Math.Max (Columns, 1))); } protected override void InvalidateChildCollection () { Rows = ChildSize.Height > 0 ? (int)Math.Ceiling ((ActualAllocation.Height + ChildSize.Height) / (double)ChildSize.Height) : 0; Columns = ChildSize.Width > 0 ? (int)Math.Max (ActualAllocation.Width / ChildSize.Width, 1) : 0; ResizeChildCollection (Rows * Columns); var handler = ChildCountChanged; if (handler != null) { handler (this, new EventArgs (Rows * Columns)); } } protected override void InvalidateChildLayout () { base.InvalidateChildLayout (); if (ChildSize.Width <= 0 || ChildSize.Height <= 0) { // FIXME: empty/reset all child slots here? return; } // Compute where we should start and end in the model double offset = ActualAllocation.Y - YPosition % ChildSize.Height; int first_model_row = (int)Math.Floor (YPosition / ChildSize.Height) * Columns; int last_model_row = first_model_row + Rows * Columns; // Setup for the layout iteration int child_span_width = (int)Math.Floor (ActualAllocation.Width / Columns); int layout_child_index = 0; int view_row_index = 0; int view_column_index = 0; // Allocation of the first child in the layout, this // will change as we iterate the layout children var child_allocation = new Rect () { X = ActualAllocation.X, Y = offset, Width = ChildSize.Width, Height = ChildSize.Height }; // Iterate the layout children and configure them for the current // view state to be consumed by interaction and rendering phases for (int i = first_model_row; i < last_model_row; i++, layout_child_index++) { var child = Children[layout_child_index]; child.Allocation = child_allocation; child.VirtualAllocation = GetChildVirtualAllocation (child_allocation); SetModelIndex (child, i); if (Model != null) { child.Bind (Model.GetItem (i)); } child.Arrange (); // Update the allocation for the next child if (++view_column_index % Columns == 0) { view_row_index++; view_column_index = 0; child_allocation.Y += ChildSize.Height; child_allocation.X = ActualAllocation.X; } else { child_allocation.X += child_span_width; } // FIXME: clear any layout children that go beyond the model } } protected virtual CanvasItem CreateChild () { if (ChildAllocator == null) { throw new InvalidOperationException ("ChildAllocator is unset"); } var child = ChildAllocator (); child.Manager = CanvasManager; //child.ParentLayout = this; return child; } private void ResizeChildCollection (int newChildCount) { int difference = Children.Count - newChildCount; if (difference > 0) { Children.RemoveRange (newChildCount, difference); } else { for (int i=0; i>difference; i--) { Children.Add (CreateChild ()); } } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/Accessibility/0000777000175000017500000000000011503407407024075 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/Accessibility/ICellAccessibleParent.cs0000644000175000017500000000351511420634720030542 0ustar00rubenruben00000000000000// // ICellAccessibleParent.cs // // Author: // Eitan Isaacson // // Copyright (C) 2009 Eitan Isaacson. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Data.Gui.Accessibility { public interface ICellAccessibleParent { Gdk.Rectangle GetCellExtents (ColumnCellAccessible cell, Atk.CoordType coord_type); int GetCellIndex (ColumnCellAccessible cell); bool IsCellShowing (ColumnCellAccessible cell); bool IsCellFocused (ColumnCellAccessible cell); bool IsCellSelected (ColumnCellAccessible cell); bool IsCellActive (ColumnCellAccessible cell); void InvokeColumnHeaderMenu (ColumnCellAccessible column); void ClickColumnHeader (ColumnCellAccessible column); void CellRedrawn (int column, int row); } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/Accessibility/ListViewAccessible_Table.cs0000644000175000017500000001215111420634720031251 0ustar00rubenruben00000000000000// // ListViewAccessible_Table.cs // // Authors: // Eitan Isaacson // Gabriel Burt // // Copyright (C) 2009 Novell, Inc. // Copyright (C) 2009 Eitan Isaacson // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Linq; using System.Collections.Generic; using Hyena.Data.Gui; namespace Hyena.Data.Gui.Accessibility { #if ENABLE_ATK public partial class ListViewAccessible : Atk.TableImplementor { public void ListViewAccessible_Table () { } public Atk.Object Caption { get { return new Atk.NoOpObject (list_view); } set {} } public int NColumns { get { return n_columns; } set {} } public int NRows { get { return n_rows; } set {} } public Atk.Object Summary { get { return new Atk.NoOpObject (list_view); } set {} } public bool AddColumnSelection (int column) { return false; } public bool AddRowSelection (int row) { list_view.Selection.Select (row); return true; } public int GetColumnAtIndex (int index) { return NColumns == 0 ? -1 : (index - NColumns) % NColumns; } public string GetColumnDescription (int column) { var col = list_view.ColumnController.Where (c => c.Visible).ElementAtOrDefault (column); return col == null ? null : col.LongTitle; } public int GetColumnExtentAt (int row, int column) { return 1; } public Atk.Object GetColumnHeader (int column) { if (column >= NColumns) return new Atk.NoOpObject (list_view); else return OnRefChild (column); } public int GetIndexAt (int row, int column) { return row * NColumns + column + NColumns; } public int GetRowAtIndex (int index) { if (NColumns == 0) return -1; return (index - NColumns) / NColumns; } public string GetRowDescription (int row) { return ""; } public int GetRowExtentAt (int row, int column) { return 1; } public Atk.Object GetRowHeader (int row) { return new Atk.NoOpObject (list_view); } // Ensure https://bugzilla.novell.com/show_bug.cgi?id=512477 is fixed #if ENABLE_ATK private static readonly int [] empty_int_array = new int[0]; public int [] SelectedColumns { get { return empty_int_array; } } public int [] SelectedRows { get { return list_view.Selection.ToArray (); } } #else public int GetSelectedRows (out int row) { row = 0; return 0; } public int GetSelectedColumns (out int cols) { cols = 0; return 0; } #endif public bool IsColumnSelected (int column) { return false; } public bool IsRowSelected (int row) { return list_view.Selection.Contains (row); } public bool IsSelected (int row, int column) { return list_view.Selection.Contains (row); } public Atk.Object RefAt (int row, int column) { int index = NColumns * row + column + NColumns; return OnRefChild (index); } public bool RemoveColumnSelection (int column) { return false; } public bool RemoveRowSelection (int row) { list_view.Selection.Unselect (row); return true; } public void SetColumnDescription (int column, string description) { } public void SetColumnHeader (int column, Atk.Object header) { } public void SetRowDescription (int row, string description) { } public void SetRowHeader (int row, Atk.Object header) { } } #endif } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnCellTextAccessible.cs0000644000175000017500000000305511420634720031301 0ustar00rubenruben00000000000000// // ColumnCellTextAccessible.cs // // Author: // Eitan Isaacson // // Copyright (C) 2009 Eitan Isaacson. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Data.Gui.Accessibility { class ColumnCellTextAccessible : ColumnCellAccessible { public ColumnCellTextAccessible (object bound_object, ColumnCellText cell, ICellAccessibleParent parent): base (bound_object, cell as ColumnCell, parent) { Name = cell.GetTextAlternative (bound_object); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnHeaderCellTextAccessible.cs0000644000175000017500000000720211420634720032410 0ustar00rubenruben00000000000000// // ColumnHeaderCellTextAccessible.cs // // Author: // Eitan Isaacson // // Copyright (C) 2009 Eitan Isaacson. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Mono.Unix; namespace Hyena.Data.Gui.Accessibility { class ColumnHeaderCellTextAccessible: ColumnCellTextAccessible, Atk.ActionImplementor { private static string [] action_descriptions = new string[] {"", Catalog.GetString ("open context menu")}; private static string [] action_names_localized = new string[] {Catalog.GetString ("click"), Catalog.GetString ("menu")}; private enum Actions { Click, Menu, Last }; public ColumnHeaderCellTextAccessible (object bound_object, ColumnHeaderCellText cell, ICellAccessibleParent parent) : base (bound_object, cell as ColumnCellText, parent) { Role = Atk.Role.TableColumnHeader; } #if ENABLE_ATK protected override Atk.StateSet OnRefStateSet () { Atk.StateSet states = base.OnRefStateSet (); states.RemoveState (Atk.StateType.Selectable); states.RemoveState (Atk.StateType.Transient); return states; } #endif public string GetLocalizedName (int action) { if (action >= action_names_localized.Length) return ""; return action_names_localized[action]; } public string GetName (int action) { if (action >= (int)Actions.Last) return ""; return ((Actions)action).ToString ().ToLower (); } public string GetDescription (int action) { if (action >= action_descriptions.Length) return ""; return action_descriptions[action]; } public string GetKeybinding (int action) { return ""; } public int NActions { get { return (int)Actions.Last; } } public bool DoAction (int action) { ICellAccessibleParent parent = (ICellAccessibleParent)Parent; switch ((Actions)action) { case Actions.Menu: parent.InvokeColumnHeaderMenu (this); break; case Actions.Click: parent.ClickColumnHeader (this); break; } if (action == (int)Actions.Menu) { ((ICellAccessibleParent)Parent).InvokeColumnHeaderMenu (this); } return true; } public bool SetDescription (int action, string description) { return false; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/Accessibility/ListViewAccessible.cs0000644000175000017500000002111711467745411030157 0ustar00rubenruben00000000000000// // ListViewAccessible.cs // // Authors: // Eitan Isaacson // Gabriel Burt // // Copyright (C) 2009 Novell, Inc. // Copyright (C) 2009 Eitan Isaacson // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Linq; using System.Collections.Generic; using Hyena.Data.Gui; namespace Hyena.Data.Gui.Accessibility { #if ENABLE_ATK public partial class ListViewAccessible : Hyena.Gui.BaseWidgetAccessible, ICellAccessibleParent { private ListView list_view; private Dictionary cell_cache; public ListViewAccessible (GLib.Object widget) : base (widget as Gtk.Widget) { list_view = widget as ListView; // TODO replace with list_view.Name? Name = "ListView"; Description = "ListView"; Role = Atk.Role.Table; Parent = list_view.Parent.RefAccessible (); cell_cache = new Dictionary (); list_view.ModelChanged += OnModelChanged; list_view.ModelReloaded += OnModelChanged; OnModelChanged (null, null); list_view.SelectionProxy.FocusChanged += OnSelectionFocusChanged; list_view.ActiveColumnChanged += OnSelectionFocusChanged; ListViewAccessible_Selection (); ListViewAccessible_Table (); } protected override Atk.StateSet OnRefStateSet () { Atk.StateSet states = base.OnRefStateSet (); states.AddState (Atk.StateType.ManagesDescendants); return states; } protected override int OnGetIndexInParent () { for (int i=0; i < Parent.NAccessibleChildren; i++) { if (Parent.RefAccessibleChild (i) == this) { return i; } } return -1; } protected override int OnGetNChildren () { return n_columns * n_rows + n_columns; } protected override Atk.Object OnRefChild (int index) { ColumnCellAccessible child; if (cell_cache.ContainsKey (index)) { return cell_cache[index]; } // FIXME workaround to prevent crashing on Grid ListViews if (list_view.ColumnController == null) return null; var columns = list_view.ColumnController.Where (c => c.Visible); if (index - n_columns < 0) { child = columns.ElementAtOrDefault (index) .HeaderCell .GetAccessible (this) as ColumnCellAccessible; } else { int column = (index - n_columns) % n_columns; int row = (index - n_columns) / n_columns; var cell = columns.ElementAtOrDefault (column).GetCell (0); cell.Bind (list_view.Model[row]); child = (ColumnCellAccessible) cell.GetAccessible (this); } cell_cache.Add (index, child); return child; } public override Atk.Object RefAccessibleAtPoint (int x, int y, Atk.CoordType coordType) { int row, col; list_view.GetCellAtPoint (x, y, coordType, out row, out col); return RefAt (row, col); } private void OnModelChanged (object o, EventArgs a) { ThreadAssist.ProxyToMain (EmitModelChanged); } private void EmitModelChanged () { GLib.Signal.Emit (this, "model_changed"); cell_cache.Clear (); /*var handler = ModelChanged; if (handler != null) { handler (this, EventArgs.Empty); }*/ } private void OnSelectionFocusChanged (object o, EventArgs a) { ThreadAssist.ProxyToMain (EmitDescendantChanged); } private void EmitDescendantChanged () { var cell = ActiveCell; if (cell != null) { GLib.Signal.Emit (this, "active-descendant-changed", cell.Handle); } } private Atk.Object ActiveCell { get { if (list_view.HeaderFocused) { return OnRefChild (list_view.ActiveColumn); } else { if (list_view.Selection != null) { return RefAt (list_view.Selection.FocusedIndex, list_view.ActiveColumn); } else { return null; } } } } private int n_columns { get { return list_view.ColumnController != null ? list_view.ColumnController.Count (c => c.Visible) : 1; } } private int n_rows { get { return list_view.Model.Count; } } #region ICellAccessibleParent public int GetCellIndex (ColumnCellAccessible cell) { foreach (KeyValuePair kv in cell_cache) { if ((ColumnCellAccessible)kv.Value == cell) return (int)kv.Key; } return -1; } public Gdk.Rectangle GetCellExtents (ColumnCellAccessible cell, Atk.CoordType coord_type) { int cache_index = GetCellIndex (cell); int minval = Int32.MinValue; if (cache_index == -1) return new Gdk.Rectangle (minval, minval, minval, minval); if (cache_index - n_columns >= 0) { int column = (cache_index - NColumns)%NColumns; int row = (cache_index - NColumns)/NColumns; return list_view.GetColumnCellExtents (row, column, true, coord_type); } else { return list_view.GetColumnHeaderCellExtents (cache_index, true, coord_type); } } public bool IsCellShowing (ColumnCellAccessible cell) { Gdk.Rectangle cell_extents = GetCellExtents (cell, Atk.CoordType.Window); if (cell_extents.X == Int32.MinValue && cell_extents.Y == Int32.MinValue) return false; return true; } public bool IsCellFocused (ColumnCellAccessible cell) { int cell_index = GetCellIndex (cell); if (cell_index % NColumns != 0) return false; // Only 0 column cells get focus now. int row = cell_index / NColumns; return row == list_view.Selection.FocusedIndex; } public bool IsCellSelected (ColumnCellAccessible cell) { return IsChildSelected (GetCellIndex (cell)); } public bool IsCellActive (ColumnCellAccessible cell) { return (ActiveCell == (Atk.Object)cell); } public void InvokeColumnHeaderMenu (ColumnCellAccessible cell) { list_view.InvokeColumnHeaderMenu (GetCellIndex (cell)); } public void ClickColumnHeader (ColumnCellAccessible cell) { list_view.ClickColumnHeader (GetCellIndex (cell)); } public void CellRedrawn (int column, int row) { int index; if (row >= 0) index = row * n_columns + column + n_columns; else index = column; if (cell_cache.ContainsKey (index)) { cell_cache[index].Redrawn (); } } #endregion } #endif } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/Accessibility/ColumnCellAccessible.cs0000644000175000017500000001100311420634720030424 0ustar00rubenruben00000000000000// // ColumnCellAccessible.cs // // Author: // Eitan Isaacson // // Copyright (C) 2009 Eitan Isaacson. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Data.Gui.Accessibility { public class ColumnCellAccessible: Atk.Object, Atk.ComponentImplementor { protected ColumnCell cell; protected object bound_object; private ICellAccessibleParent cell_parent; public ColumnCellAccessible (object bound_object, ColumnCell cell, ICellAccessibleParent parent) { Role = Atk.Role.TableCell; this.bound_object = bound_object; this.cell = cell; cell_parent = parent; Parent = (Atk.Object) parent; } #if ENABLE_ATK protected override Atk.StateSet OnRefStateSet () { Atk.StateSet states = base.OnRefStateSet (); states.AddState (Atk.StateType.Transient); states.AddState (Atk.StateType.Focusable); states.AddState (Atk.StateType.Enabled); states.AddState (Atk.StateType.Sensitive); states.AddState (Atk.StateType.Visible); if (cell_parent.IsCellShowing (this)) states.AddState (Atk.StateType.Showing); if (cell_parent.IsCellFocused (this)) states.AddState (Atk.StateType.Focused); if (cell_parent.IsCellSelected (this)) states.AddState (Atk.StateType.Selected); if (cell_parent.IsCellActive (this)) states.AddState (Atk.StateType.Active); return states; } protected override int OnGetIndexInParent () { return cell_parent.GetCellIndex (this); } #endif public double Alpha { get { return 1.0; } } public bool SetSize (int w, int h) { return false; } public bool SetPosition (int x, int y, Atk.CoordType coordType) { return false; } public bool SetExtents (int x, int y, int w, int h, Atk.CoordType coordType) { return false; } public void RemoveFocusHandler (uint handlerId) { } public bool GrabFocus () { return false; } public void GetSize (out int w, out int h) { Gdk.Rectangle rectangle = cell_parent.GetCellExtents(this, Atk.CoordType.Screen); w = rectangle.Width; h = rectangle.Height; } public void GetPosition (out int x, out int y, Atk.CoordType coordType) { Gdk.Rectangle rectangle = cell_parent.GetCellExtents(this, coordType); x = rectangle.X; y = rectangle.Y; } public void GetExtents (out int x, out int y, out int w, out int h, Atk.CoordType coordType) { Gdk.Rectangle rectangle = cell_parent.GetCellExtents(this, coordType); x = rectangle.X; y = rectangle.Y; w = rectangle.Width; h = rectangle.Height; } public virtual Atk.Object RefAccessibleAtPoint (int x, int y, Atk.CoordType coordType) { return null; } public bool Contains (int x, int y, Atk.CoordType coordType) { return false; } public uint AddFocusHandler (Atk.FocusHandler handler) { return 0; } public virtual void Redrawn () { } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/Accessibility/ListViewAccessible_Selection.cs0000644000175000017500000000546311420634720032157 0ustar00rubenruben00000000000000// // ListViewAccessible_Selection.cs // // Authors: // Eitan Isaacson // Gabriel Burt // // Copyright (C) 2009 Novell, Inc. // Copyright (C) 2009 Eitan Isaacson // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Linq; using System.Collections.Generic; using Hyena.Data.Gui; namespace Hyena.Data.Gui.Accessibility { #if ENABLE_ATK public partial class ListViewAccessible : Atk.SelectionImplementor { public void ListViewAccessible_Selection () { list_view.SelectionProxy.Changed += OnSelectionChanged; } public bool AddSelection (int index) { return AddRowSelection (GetRowAtIndex (index)); } public bool ClearSelection () { list_view.Selection.Clear (); return true; } public bool IsChildSelected (int index) { return IsRowSelected (GetRowAtIndex (index)); } public bool RemoveSelection (int index) { int row = list_view.Selection.RangeCollection [index / n_columns]; return RemoveRowSelection (row); } public Atk.Object RefSelection (int index) { int row = list_view.Selection.RangeCollection [index / n_columns]; int column = index % n_columns; return RefAt (row, column); } public int SelectionCount { get { return list_view.Selection.Count * n_columns; } } public bool SelectAllSelection () { list_view.Selection.SelectAll (); return true; } private void OnSelectionChanged (object o, EventArgs a) { GLib.Signal.Emit (this, "selection_changed"); } } #endif } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/DataViewLayout.cs0000644000175000017500000001047211467745411024550 0ustar00rubenruben00000000000000// // DataViewLayout.cs // // Author: // Aaron Bockover // // Copyright 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using Hyena.Data; using Hyena.Gui.Canvas; namespace Hyena.Data.Gui { public abstract class DataViewLayout { private List children = new List (); protected List Children { get { return children; } } private Dictionary model_indices = new Dictionary (); public IListModel Model { get; set; } protected CanvasManager CanvasManager; private ListViewBase view; public ListViewBase View { get { return view; } set { view = value; CanvasManager = new CanvasManager (view); } } public Rect ActualAllocation { get; protected set; } public Size VirtualSize { get; protected set; } public Size ChildSize { get; protected set; } public int XPosition { get; protected set; } public int YPosition { get; protected set; } public int ChildCount { get { return Children.Count; } } public DataViewLayout () { } public CanvasItem this[int index] { get { return Children[index]; } } public void UpdatePosition (int x, int y) { XPosition = x; YPosition = y; InvalidateChildLayout (); } public void ModelUpdated () { InvalidateVirtualSize (); InvalidateChildLayout (); } public virtual void Allocate (Rect actualAllocation) { ActualAllocation = actualAllocation; InvalidateChildSize (); InvalidateChildCollection (); InvalidateVirtualSize (); InvalidateChildLayout (); } public virtual CanvasItem FindChildAtPoint (Point point) { return Children.Find (child => child.Allocation.Contains ( ActualAllocation.X + point.X, ActualAllocation.Y + point.Y)); } public virtual CanvasItem FindChildAtModelRowIndex (int modelRowIndex) { return Children.Find (child => GetModelIndex (child) == modelRowIndex); } protected abstract void InvalidateChildSize (); protected abstract void InvalidateVirtualSize (); protected abstract void InvalidateChildCollection (); protected virtual void InvalidateChildLayout () { model_indices.Clear (); } protected void SetModelIndex (CanvasItem item, int index) { model_indices[item] = index; } public int GetModelIndex (CanvasItem item) { int i; return model_indices.TryGetValue (item, out i) ? i : -1; } protected Rect GetChildVirtualAllocation (Rect childAllocation) { return new Rect () { X = childAllocation.X - ActualAllocation.X, Y = childAllocation.Y - ActualAllocation.Y, Width = childAllocation.Width, Height = childAllocation.Height }; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/Column.cs0000644000175000017500000001507011467745411023102 0ustar00rubenruben00000000000000// // Column.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Collections.Generic; using Gtk; using Hyena; using Hyena.Data; namespace Hyena.Data.Gui { public class Column : ColumnDescription, IEnumerable { private ColumnCell header_cell; private List cells = new List (); private int min_width = 0; private int max_width = Int32.MaxValue; public Column (ColumnDescription description) : this (description, new ColumnCellText (description.Property, true)) { } public Column (ColumnDescription description, ColumnCell cell) : this (description.Title, cell, description.Width, description.Visible) { } public Column (string title, ColumnCell cell, double width) : this (title, cell, width, true) { } public Column (string title, ColumnCell cell, double width, bool visible) : this (null, title, cell, width, visible) { } public Column (ColumnCell headerCell, string title, ColumnCell cell, double width) : this (headerCell, title, cell, width, true) { } public Column (ColumnCell headerCell, string title, ColumnCell cell, double width, bool visible) : this (headerCell, title, cell, width, visible, 0, Int32.MaxValue) { } public Column (ColumnCell headerCell, string title, ColumnCell cell, double width, bool visible, int minWidth, int maxWidth) : base (cell.ObjectBinder.Property, title, width, visible) { min_width = minWidth; max_width = maxWidth; header_cell = headerCell ?? new ColumnHeaderCellText (HeaderCellDataHandler); ColumnCellText header_text = header_cell as ColumnCellText; ColumnCellText cell_text = cell as ColumnCellText; if (header_text != null && cell_text != null) { header_text.Alignment = cell_text.Alignment; } PackStart (cell); } private Column HeaderCellDataHandler () { return this; } public void PackStart (ColumnCell cell) { cells.Insert (0, cell); } public void PackEnd (ColumnCell cell) { cells.Add (cell); } public ColumnCell GetCell (int index) { return cells[index]; } public void RemoveCell (int index) { cells.RemoveAt (index); } public void ClearCells () { cells.Clear (); } IEnumerator IEnumerable.GetEnumerator () { return cells.GetEnumerator (); } IEnumerator IEnumerable.GetEnumerator () { return cells.GetEnumerator (); } public ColumnCell HeaderCell { get { return header_cell; } set { header_cell = value; } } public void CalculateWidths (Pango.Layout layout, bool headerVisible, int headerHeight) { bool min_was_zero = MinWidth == 0; bool was_size_req = false; ISizeRequestCell sr_cell = cells[0] as ISizeRequestCell; if (sr_cell != null && sr_cell.RestrictSize) { int min_w, max_w; sr_cell.GetWidthRange (layout, out min_w, out max_w); MinWidth = min_w == -1 ? MinWidth : min_w; MaxWidth = max_w == -1 ? MaxWidth : max_w; was_size_req = true; } if (headerVisible && (min_was_zero || was_size_req) && !String.IsNullOrEmpty (Title)) { int w, h; layout.SetText (Title); //column_layout.SetText ("\u2026"); // ellipsis char layout.GetPixelSize (out w, out h); // Pretty sure the 3* is needed here only b/c of the " - 8" in ColumnCellText; // See TODO there w += 3 * (int)header_cell.Padding.Left; if (this is ISortableColumn) { w += ColumnHeaderCellText.GetArrowWidth (headerHeight); } MinWidth = Math.Max (MinWidth, w); // If the min/max are sufficiently close (arbitrarily choosen as < 8px) then // make them equal, so that the column doesn't appear resizable but in reality is on barely. if (MaxWidth - MinWidth < 8) { MinWidth = MaxWidth; } } } public int MinWidth { get { return min_width; } set { min_width = value; if (value > max_width) { max_width = value; } } } public int MaxWidth { get { return max_width; } set { max_width = value; if (value < min_width) { min_width = value; } } } private string id; public string Id { get { if (id == null) { id = GetCell (0).ObjectBinder.SubProperty ?? GetCell (0).ObjectBinder.Property; id = StringUtil.CamelCaseToUnderCase (id); } return id; } set { id = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ListView/0000777000175000017500000000000011503407407023054 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_DragAndDrop.cs0000644000175000017500000001526411420634720027360 0ustar00rubenruben00000000000000// // ListView_DragAndDrop.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; namespace Hyena.Data.Gui { public static class ListViewDragDropTarget { public enum TargetType { ModelSelection } public static readonly TargetEntry ModelSelection = new TargetEntry ("application/x-hyena-data-model-selection", TargetFlags.App, (uint)TargetType.ModelSelection); } public partial class ListView : ListViewBase { private static TargetEntry [] drag_drop_dest_entries = new TargetEntry [] { ListViewDragDropTarget.ModelSelection }; protected virtual TargetEntry [] DragDropDestEntries { get { return drag_drop_dest_entries; } } protected virtual TargetEntry [] DragDropSourceEntries { get { return drag_drop_dest_entries; } } private bool is_reorderable = false; public bool IsReorderable { get { return is_reorderable && IsEverReorderable; } set { is_reorderable = value; OnDragSourceSet (); OnDragDestSet (); } } private bool is_ever_reorderable = false; public bool IsEverReorderable { get { return is_ever_reorderable; } set { is_ever_reorderable = value; OnDragSourceSet (); OnDragDestSet (); } } private bool force_drag_source_set = false; protected bool ForceDragSourceSet { get { return force_drag_source_set; } set { force_drag_source_set = true; OnDragSourceSet (); } } private bool force_drag_dest_set = false; protected bool ForceDragDestSet { get { return force_drag_dest_set; } set { force_drag_dest_set = true; OnDragDestSet (); } } protected virtual void OnDragDestSet () { if (ForceDragDestSet || IsReorderable) { Gtk.Drag.DestSet (this, DestDefaults.All, DragDropDestEntries, Gdk.DragAction.Move); } else { Gtk.Drag.DestUnset (this); } } protected virtual void OnDragSourceSet () { if (ForceDragSourceSet || IsReorderable) { Gtk.Drag.SourceSet (this, Gdk.ModifierType.Button1Mask | Gdk.ModifierType.Button3Mask, DragDropSourceEntries, Gdk.DragAction.Copy | Gdk.DragAction.Move); } else { Gtk.Drag.SourceUnset (this); } } private uint drag_scroll_timeout_id; private uint drag_scroll_timeout_duration = 50; private double drag_scroll_velocity; private double drag_scroll_velocity_max = 100.0; private int drag_reorder_row_index = -1; private int drag_reorder_motion_y = -1; private void StopDragScroll () { drag_scroll_velocity = 0.0; if (drag_scroll_timeout_id > 0) { GLib.Source.Remove (drag_scroll_timeout_id); drag_scroll_timeout_id = 0; } } private void OnDragScroll (GLib.TimeoutHandler handler, double threshold, int total, int position) { if (position < threshold) { drag_scroll_velocity = -1.0 + (position / threshold); } else if (position > total - threshold) { drag_scroll_velocity = 1.0 - ((total - position) / threshold); } else { StopDragScroll (); return; } if (drag_scroll_timeout_id == 0) { drag_scroll_timeout_id = GLib.Timeout.Add (drag_scroll_timeout_duration, handler); } } protected override bool OnDragMotion (Gdk.DragContext context, int x, int y, uint time) { if (!IsReorderable) { StopDragScroll (); drag_reorder_row_index = -1; drag_reorder_motion_y = -1; InvalidateList (); return false; } drag_reorder_motion_y = y; DragReorderUpdateRow (); OnDragScroll (OnDragVScrollTimeout, Allocation.Height * 0.3, Allocation.Height, y); return true; } protected override void OnDragLeave (Gdk.DragContext context, uint time) { StopDragScroll (); } protected override void OnDragEnd (Gdk.DragContext context) { StopDragScroll (); drag_reorder_row_index = -1; drag_reorder_motion_y = -1; InvalidateList (); } private bool OnDragVScrollTimeout () { ScrollToY (VadjustmentValue + (drag_scroll_velocity * drag_scroll_velocity_max)); DragReorderUpdateRow (); return true; } private void DragReorderUpdateRow () { int row = GetDragRow (drag_reorder_motion_y); if (row != drag_reorder_row_index) { drag_reorder_row_index = row; InvalidateList (); } } protected int GetDragRow (int y) { y = TranslateToListY (y); int row = GetModelRowAt (0, y); if (row == -1) { return -1; } if (row != GetModelRowAt (0, y + ChildSize.Height / 2)) { row++; } return row; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Windowing.cs0000644000175000017500000001625211420634720027176 0ustar00rubenruben00000000000000// // ListView_Windowing.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gdk; using Gtk; using Hyena.Gui.Theming; namespace Hyena.Data.Gui { public partial class ListView : ListViewBase { private Rectangle list_rendering_alloc; private Rectangle header_rendering_alloc; private Rectangle list_interaction_alloc; private Rectangle header_interaction_alloc; private Gdk.Window event_window; protected Rectangle ListAllocation { get { return list_rendering_alloc; } } protected Gdk.Window EventWindow { get { return event_window; } } protected override void OnRealized () { WidgetFlags |= WidgetFlags.Realized | WidgetFlags.NoWindow; GdkWindow = Parent.GdkWindow; cell_context.Drawable = GdkWindow; WindowAttr attributes = new WindowAttr (); attributes.WindowType = Gdk.WindowType.Child; attributes.X = Allocation.X; attributes.Y = Allocation.Y; attributes.Width = Allocation.Width; attributes.Height = Allocation.Height; attributes.Wclass = WindowClass.InputOnly; attributes.EventMask = (int)( EventMask.PointerMotionMask | EventMask.KeyPressMask | EventMask.KeyReleaseMask | EventMask.ButtonPressMask | EventMask.ButtonReleaseMask | EventMask.LeaveNotifyMask | EventMask.ExposureMask); WindowAttributesType attributes_mask = WindowAttributesType.X | WindowAttributesType.Y | WindowAttributesType.Wmclass; event_window = new Gdk.Window (GdkWindow, attributes, attributes_mask); event_window.UserData = Handle; OnDragSourceSet (); MoveResize (Allocation); base.OnRealized (); } protected override void OnUnrealized () { WidgetFlags &= ~WidgetFlags.Realized; event_window.UserData = IntPtr.Zero; Hyena.Gui.GtkWorkarounds.WindowDestroy (event_window); event_window = null; base.OnUnrealized (); } protected override void OnMapped () { WidgetFlags |= WidgetFlags.Mapped; event_window.Show (); } protected override void OnUnmapped () { WidgetFlags &= ~WidgetFlags.Mapped; event_window.Hide (); } protected int TranslateToListY (int y) { return y - list_interaction_alloc.Y; } private void MoveResize (Rectangle allocation) { if (Theme == null) { return; } header_rendering_alloc = allocation; header_rendering_alloc.Height = HeaderHeight; list_rendering_alloc.X = header_rendering_alloc.X + Theme.TotalBorderWidth; list_rendering_alloc.Y = header_rendering_alloc.Bottom + Theme.TotalBorderWidth; list_rendering_alloc.Width = allocation.Width - Theme.TotalBorderWidth * 2; list_rendering_alloc.Height = allocation.Height - (list_rendering_alloc.Y - allocation.Y) - Theme.TotalBorderWidth; header_interaction_alloc = header_rendering_alloc; header_interaction_alloc.X = list_rendering_alloc.X; header_interaction_alloc.Width = list_rendering_alloc.Width; header_interaction_alloc.Height += Theme.BorderWidth; header_interaction_alloc.Offset (-allocation.X, -allocation.Y); list_interaction_alloc = list_rendering_alloc; list_interaction_alloc.Offset (-allocation.X, -allocation.Y); header_width = header_interaction_alloc.Width; } protected override void OnSizeRequested (ref Requisition requisition) { // TODO give the minimum height of the header if (Theme == null) { return; } requisition.Width = Theme.TotalBorderWidth * 2; requisition.Height = HeaderHeight + Theme.TotalBorderWidth * 2; } protected override void OnSizeAllocated (Rectangle allocation) { base.OnSizeAllocated (allocation); if (IsRealized) { event_window.MoveResize (allocation); } MoveResize (allocation); RecalculateColumnSizes (); RegenerateColumnCache (); if (ViewLayout != null) { ViewLayout.Allocate ((Hyena.Gui.Canvas.Rect)list_rendering_alloc); } if (vadjustment != null) { hadjustment.PageSize = header_interaction_alloc.Width; hadjustment.PageIncrement = header_interaction_alloc.Width; vadjustment.PageSize = list_rendering_alloc.Height; vadjustment.PageIncrement = list_rendering_alloc.Height; UpdateAdjustments (); } ICareAboutView model = Model as ICareAboutView; if (model != null) { model.RowsInView = RowsInView; } OnInvalidateMeasure (); InvalidateList (); } protected int ItemsInView { get { // FIXME hardcoded grid int columns = ViewLayout == null ? 1 : (ViewLayout as DataViewLayoutGrid).Columns; return RowsInView * columns; } } // FIXME: obsolete protected int RowsInView { get { if (ChildSize.Height <= 0) { return 0; } return (int)Math.Ceiling ((list_rendering_alloc.Height + ChildSize.Height) / (double)ChildSize.Height); } } private DataViewLayout view_layout; protected DataViewLayout ViewLayout { get { return view_layout; } set { view_layout = value; QueueResize (); } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Model.cs0000644000175000017500000001647311467745411026311 0ustar00rubenruben00000000000000// // ListView_Model.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Reflection; using Gtk; namespace Hyena.Data.Gui { public partial class ListView : ListViewBase { #pragma warning disable 0067 public event EventHandler ModelChanged; public event EventHandler ModelReloaded; #pragma warning restore 0067 public void SetModel (IListModel model) { SetModel (model, 0.0); } public virtual void SetModel (IListModel value, double vpos) { if (model == value) { return; } if (model != null) { model.Cleared -= OnModelClearedHandler; model.Reloaded -= OnModelReloadedHandler; } model = value; if (model != null) { model.Cleared += OnModelClearedHandler; model.Reloaded += OnModelReloadedHandler; selection_proxy.Selection = model.Selection; IsEverReorderable = model.CanReorder; } ISortable sortable = model as ISortable; if (sortable != null && ColumnController != null) { ISortableColumn sort_column = ColumnController.SortColumn ?? ColumnController.DefaultSortColumn; if (sort_column != null) { sortable.Sort (sort_column); RecalculateColumnSizes (); RegenerateColumnCache (); InvalidateHeader (); IsReorderable = sortable.SortColumn == null || sortable.SortColumn.SortType == SortType.None; } } if (ViewLayout != null) { ViewLayout.Model = Model; } RefreshViewForModel (vpos); var handler = ModelChanged; if (handler != null) { handler (this, EventArgs.Empty); } } private void RefreshViewForModel (double? vpos) { if (Model == null) { UpdateAdjustments (); QueueDraw (); return; } if (ViewLayout != null) { ViewLayout.ModelUpdated (); } UpdateAdjustments (); if (vpos != null) { ScrollToY ((double) vpos); } else if (Model.Count <= ItemsInView) { // If our view fits all rows at once, make sure we're scrolled to the top ScrollToY (0.0); } else if (vadjustment != null) { ScrollToY (vadjustment.Value); } if (Parent is ScrolledWindow) { Parent.QueueDraw (); } } private void OnModelClearedHandler (object o, EventArgs args) { OnModelCleared (); } private void OnModelReloadedHandler (object o, EventArgs args) { OnModelReloaded (); var handler = ModelReloaded; if (handler != null) { handler (this, EventArgs.Empty); } } private void OnColumnControllerUpdatedHandler (object o, EventArgs args) { OnColumnControllerUpdated (); } protected virtual void OnModelCleared () { RefreshViewForModel (null); } protected virtual void OnModelReloaded () { RefreshViewForModel (null); } private IListModel model; public virtual IListModel Model { get { return model; } } private string row_opaque_property_name = "Sensitive"; private PropertyInfo row_opaque_property_info; bool row_opaque_property_invalid = false; public string RowOpaquePropertyName { get { return row_opaque_property_name; } set { if (value == row_opaque_property_name) { return; } row_opaque_property_name = value; row_opaque_property_info = null; row_opaque_property_invalid = false; InvalidateList (); } } private bool IsRowOpaque (object item) { if (item == null || row_opaque_property_invalid) { return true; } if (row_opaque_property_info == null || row_opaque_property_info.ReflectedType != item.GetType ()) { row_opaque_property_info = item.GetType ().GetProperty (row_opaque_property_name); if (row_opaque_property_info == null || row_opaque_property_info.PropertyType != typeof (bool)) { row_opaque_property_info = null; row_opaque_property_invalid = true; return true; } } return (bool)row_opaque_property_info.GetValue (item, null); } private string row_bold_property_name = "IsBold"; private PropertyInfo row_bold_property_info; bool row_bold_property_invalid = false; public string RowBoldPropertyName { get { return row_bold_property_name; } set { if (value == row_bold_property_name) { return; } row_bold_property_name = value; row_bold_property_info = null; row_bold_property_invalid = false; InvalidateList (); } } private bool IsRowBold (object item) { if (item == null || row_bold_property_invalid) { return false; } if (row_bold_property_info == null || row_bold_property_info.ReflectedType != item.GetType ()) { row_bold_property_info = item.GetType ().GetProperty (row_bold_property_name); if (row_bold_property_info == null || row_bold_property_info.PropertyType != typeof (bool)) { row_bold_property_info = null; row_bold_property_invalid = true; return false; } } return (bool)row_bold_property_info.GetValue (item, null); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Accessible.cs0000644000175000017500000001370511420634720027266 0ustar00rubenruben00000000000000// // ListView_Accessible.cs // // Authors: // Gabriel Burt // Eitan Isaacson // // Copyright (C) 2009 Novell, Inc. // Copyright (C) 2009 Eitan Isaacson // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Linq; using System.Collections.Generic; using Gtk; using Hyena.Data.Gui.Accessibility; namespace Hyena.Data.Gui { public partial class ListView : ListViewBase { static ListView () { #if ENABLE_ATK ListViewAccessibleFactory.Init (); #endif } public Gdk.Rectangle GetColumnCellExtents (int row, int column) { return GetColumnCellExtents (row, column, true); } public Gdk.Rectangle GetColumnCellExtents (int row, int column, bool clip) { return GetColumnCellExtents (row, column, clip, Atk.CoordType.Window); } public Gdk.Rectangle GetColumnCellExtents (int row, int column, bool clip, Atk.CoordType coord_type) { int width = GetColumnWidth (column); int height = ChildSize.Height; int y = (int)GetViewPointForModelRow (row).Y - VadjustmentValue + ListAllocation.Y; int x = ListAllocation.X - HadjustmentValue; for (int index=0;index c.Visible).ElementAtOrDefault (column); OnColumnRightClicked (col, rectangle.X + rectangle.Width/2, rectangle.Y + rectangle.Height/2); } public void ClickColumnHeader (int column) { Column col = ColumnController.Where (c => c.Visible).ElementAtOrDefault (column); OnColumnLeftClicked (col); } private void AccessibleCellRedrawn (int column, int row) { var accessible = Accessible as ICellAccessibleParent; if (accessible != null) { accessible.CellRedrawn (column, row); } } } #if ENABLE_ATK internal class ListViewAccessibleFactory : Atk.ObjectFactory { public static void Init () { new ListViewAccessibleFactory (); Atk.Global.DefaultRegistry.SetFactoryType ((GLib.GType)typeof (ListView), (GLib.GType)typeof (ListViewAccessibleFactory)); } protected override Atk.Object OnCreateAccessible (GLib.Object obj) { return new ListViewAccessible (obj); } protected override GLib.GType OnGetAccessibleType () { return ListViewAccessible.GType; } } #endif } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs0000644000175000017500000011027311467745411027521 0ustar00rubenruben00000000000000// // ListView_Interaction.cs // // Authors: // Aaron Bockover // Gabriel Burt // Eitan Isaacson // // Copyright (C) 2007-2009 Novell, Inc. // Copyright (C) 2009 Eitan Isaacson // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; using Hyena.Collections; using Hyena.Gui.Canvas; using Selection = Hyena.Collections.Selection; namespace Hyena.Data.Gui { public partial class ListView : ListViewBase { private bool header_focused = false; public bool HeaderFocused { get { return header_focused; } set { header_focused = value; InvalidateHeader (); InvalidateList (); } } #pragma warning disable 0067 public event EventHandler ActiveColumnChanged; #pragma warning restore 0067 private int active_column = 0; public int ActiveColumn { get { return active_column; } set { active_column = value; var handler = ActiveColumnChanged; if (handler != null) { handler (this, EventArgs.Empty); } } } private Adjustment vadjustment; public Adjustment Vadjustment { get { return vadjustment; } } private Adjustment hadjustment; public Adjustment Hadjustment { get { return hadjustment; } } private SelectionProxy selection_proxy = new SelectionProxy (); public SelectionProxy SelectionProxy { get { return selection_proxy; } } public Selection Selection { get { return model == null ? null : model.Selection; } } private int HadjustmentValue { get { return hadjustment == null ? 0 : (int)hadjustment.Value; } } private int VadjustmentValue { get { return vadjustment == null ? 0 : (int)vadjustment.Value; } } public event RowActivatedHandler RowActivated; #region Row/Selection, Keyboard/Mouse Interaction private bool KeyboardScroll (Gdk.ModifierType modifier, int relative_row, bool align_y) { if (Model == null) { return true; } int row_limit; if (relative_row < 0) { if (Selection.FocusedIndex == -1) { return false; } row_limit = 0; } else { row_limit = Model.Count - 1; } if (Selection.FocusedIndex == row_limit) { return true; } int row_index = Math.Min (Model.Count - 1, Math.Max (0, Selection.FocusedIndex + relative_row)); if (Selection != null) { if ((modifier & Gdk.ModifierType.ControlMask) != 0) { // Don't change the selection } else if ((modifier & Gdk.ModifierType.ShiftMask) != 0) { // Behave like nautilus: if and arrow key + shift is pressed and the currently focused item // is not selected, select it and don't move the focus or vadjustment. // Otherwise, select the new row and scroll etc as necessary. if (relative_row * relative_row != 1) { Selection.SelectFromFirst (row_index, true); } else if (Selection.Contains (Selection.FocusedIndex)) { Selection.SelectFromFirst (row_index, true); } else { Selection.Select (Selection.FocusedIndex); return true; } } else { Selection.Clear (false); Selection.Select (row_index); } } // Scroll if needed double y_at_row = GetViewPointForModelRow (row_index).Y; if (align_y) { if (y_at_row < VadjustmentValue) { ScrollToY (y_at_row); } else if (vadjustment != null) { var bottom_of_item = y_at_row + ChildSize.Height; var bottom_of_view = vadjustment.Value + vadjustment.PageSize; if (bottom_of_item > bottom_of_view) { // Scroll down just enough to put the item fully into view ScrollToY (bottom_of_item - (vadjustment.PageSize)); } } } else if (vadjustment != null) { ScrollToY (vadjustment.Value + y_at_row - GetViewPointForModelRow (Selection.FocusedIndex).Y); } Selection.FocusedIndex = row_index; InvalidateList (); return true; } protected override bool OnKeyPressEvent (Gdk.EventKey press) { bool handled = false; // FIXME: hard-coded grid logic here... bool grid = ViewLayout != null; int items_per_row = grid ? (ViewLayout as DataViewLayoutGrid).Columns : 1; switch (press.Key) { case Gdk.Key.a: if ((press.State & Gdk.ModifierType.ControlMask) != 0 && Model.Count > 0) { SelectionProxy.Selection.SelectAll (); handled = true; } break; case Gdk.Key.A: if ((press.State & Gdk.ModifierType.ControlMask) != 0 && Selection.Count > 0) { SelectionProxy.Selection.Clear (); handled = true; } break; case Gdk.Key.k: case Gdk.Key.K: case Gdk.Key.Up: case Gdk.Key.KP_Up: if (!HeaderFocused) { handled = KeyboardScroll (press.State, -items_per_row, true); } break; case Gdk.Key.j: case Gdk.Key.J: case Gdk.Key.Down: case Gdk.Key.KP_Down: if (!HeaderFocused) { handled = KeyboardScroll (press.State, items_per_row, true); } else { handled = true; HeaderFocused = false; } break; case Gdk.Key.l: case Gdk.Key.L: case Gdk.Key.Right: case Gdk.Key.KP_Right: handled = true; if (grid && !HeaderFocused) { handled = KeyboardScroll (press.State, 1, true); } else if (ActiveColumn + 1 < column_cache.Length) { ActiveColumn++; InvalidateHeader (); } break; case Gdk.Key.h: case Gdk.Key.H: case Gdk.Key.Left: case Gdk.Key.KP_Left: handled = true; if (grid && !HeaderFocused) { handled = KeyboardScroll (press.State, -1, true); } else if (ActiveColumn - 1 >= 0) { ActiveColumn--; InvalidateHeader (); } break; case Gdk.Key.Page_Up: case Gdk.Key.KP_Page_Up: if (!HeaderFocused) handled = vadjustment != null && KeyboardScroll (press.State, (int)(-vadjustment.PageIncrement / (double)ChildSize.Height) * items_per_row, false); break; case Gdk.Key.Page_Down: case Gdk.Key.KP_Page_Down: if (!HeaderFocused) handled = vadjustment != null && KeyboardScroll (press.State, (int)(vadjustment.PageIncrement / (double)ChildSize.Height) * items_per_row, false); break; case Gdk.Key.Home: case Gdk.Key.KP_Home: if (!HeaderFocused) handled = KeyboardScroll (press.State, -10000000, true); break; case Gdk.Key.End: case Gdk.Key.KP_End: if (!HeaderFocused) handled = KeyboardScroll (press.State, 10000000, true); break; case Gdk.Key.Return: case Gdk.Key.KP_Enter: if (!HeaderFocused) { handled = ActivateSelection (); } else if (HeaderFocused && ActiveColumn >= 0) { OnColumnLeftClicked ( column_cache[ActiveColumn].Column); handled = true; } break; case Gdk.Key.Escape: handled = CancelColumnDrag (); break; case Gdk.Key.space: if (Selection != null && Selection.FocusedIndex != 1 && !HeaderFocused) { Selection.ToggleSelect (Selection.FocusedIndex); handled = true; } break; case Gdk.Key.F10: if ((press.State & Gdk.ModifierType.ShiftMask) != 0) goto case Gdk.Key.Menu; break; case Gdk.Key.Menu: // OnPopupMenu() is reserved for list items in derived classes. if (HeaderFocused) { InvokeColumnHeaderMenu (ActiveColumn); handled = true; } break; } if (handled) { return true; } return base.OnKeyPressEvent (press); } protected bool ActivateSelection () { if (Selection != null && Selection.FocusedIndex != -1) { Selection.Clear (false); Selection.Select (Selection.FocusedIndex); OnRowActivated (); return true; } return false; } #region DataViewLayout Interaction Events private CanvasItem last_layout_child; private bool LayoutChildHandlesEvent (Gdk.Event evnt, bool press) { if (ViewLayout == null) { return false; } var point = new Point (0, 0); bool handled = false; var evnt_button = evnt as Gdk.EventButton; var evnt_motion = evnt as Gdk.EventMotion; if (evnt_motion != null) { point = new Point (evnt_motion.X, evnt_motion.Y); } else if (evnt_button != null) { point = new Point (evnt_button.X, evnt_button.Y); } else if (evnt is Gdk.EventCrossing && last_layout_child != null) { last_layout_child.CursorLeaveEvent (); last_layout_child = null; return false; } var child = GetLayoutChildAt (point); if (child == null) { return false; } point.Offset (-list_interaction_alloc.X, -list_interaction_alloc.Y); point.Offset (-child.VirtualAllocation.X, -child.VirtualAllocation.Y); if (evnt_motion != null) { if (last_layout_child != child) { if (last_layout_child != null) { last_layout_child.CursorLeaveEvent (); } last_layout_child = child; child.CursorEnterEvent (); } handled = child.CursorMotionEvent (point); } else if (evnt_button != null) { handled = child.ButtonEvent (point, press, evnt_button.Button); } return handled; } private CanvasItem GetLayoutChildAt (Point point) { point.Offset (-list_interaction_alloc.X, -list_interaction_alloc.Y); return ViewLayout.FindChildAtPoint (point); } #endregion #region Cell Event Proxy (FIXME: THIS ENTIRE SECTION IS OBSOLETE YAY YAY YAY!) private IInteractiveCell last_icell; private Gdk.Rectangle last_icell_area = Gdk.Rectangle.Zero; private void InvalidateLastIcell () { if (last_icell != null && last_icell.CursorLeaveEvent ()) { QueueDirtyRegion (last_icell_area); last_icell = null; last_icell_area = Gdk.Rectangle.Zero; } } private void ProxyEventToCell (Gdk.Event evnt, bool press) { IInteractiveCell icell; Gdk.Rectangle icell_area; bool redraw = ProxyEventToCell (evnt, press, out icell, out icell_area); int xoffset = HadjustmentValue; int yoffset = VadjustmentValue; if (last_icell_area != icell_area) { if (last_icell != null && last_icell.CursorLeaveEvent ()) { QueueDirtyRegion (new Gdk.Rectangle () { X = last_icell_area.X - xoffset, Y = last_icell_area.Y - yoffset, Width = last_icell_area.Width, Height = last_icell_area.Height }); } last_icell = icell; last_icell_area = icell_area; } if (redraw) { QueueDirtyRegion (new Gdk.Rectangle () { X = icell_area.X - xoffset, Y = icell_area.Y - yoffset, Width = icell_area.Width, Height = icell_area.Height }); } } private bool ProxyEventToCell (Gdk.Event evnt, bool press, out IInteractiveCell icell, out Gdk.Rectangle icell_area) { icell = null; icell_area = Gdk.Rectangle.Zero; int evnt_x, evnt_y; int x, y, row_index; x = y = row_index = 0; var evnt_button = evnt as Gdk.EventButton; var evnt_motion = evnt as Gdk.EventMotion; if (evnt_motion != null) { evnt_x = (int)evnt_motion.X; evnt_y = (int)evnt_motion.Y; } else if (evnt_button != null) { evnt_x = (int)evnt_button.X; evnt_y = (int)evnt_button.Y; } else { // Possibly EventCrossing, for the leave event icell = last_icell; return false; } Column column; if (!GetEventCell (evnt_x, evnt_y, out icell, out column, out row_index)) { return false; } x = evnt_x - list_interaction_alloc.X; y = evnt_y - list_interaction_alloc.Y; // Turn the view-absolute coordinates into cell-relative coordinates CachedColumn cached_column = GetCachedColumnForColumn (column); x -= cached_column.X1 - HadjustmentValue; int page_offset = VadjustmentValue % ChildSize.Height; y = (y + page_offset) % ChildSize.Height; var view_point = GetViewPointForModelRow (row_index); icell_area.Y = (int)view_point.Y + list_interaction_alloc.Y + Allocation.Y; icell_area.X = cached_column.X1 + Allocation.X; icell_area.Width = cached_column.Width; icell_area.Height = ChildSize.Height; // Send the cell a synthesized input event if (evnt_motion != null) { return icell.CursorMotionEvent (new Hyena.Gui.Canvas.Point (x, y)); } else { return icell.ButtonEvent (new Hyena.Gui.Canvas.Point (x, y), press, evnt_button.Button); } } #pragma warning disable 0169 private bool GetEventCell (int x, int y, out G icell, out Column column, out int row_index) where G : class { icell = null; column = null; row_index = 0; if (Model == null) { return false; } x -= list_interaction_alloc.X; y -= list_interaction_alloc.Y; row_index = GetModelRowAt (x, y); if (row_index < 0 || row_index >= Model.Count) { return false; } column = GetColumnAt (x); if (column == null) { return false; } ColumnCell cell = column.GetCell (0); icell = cell as G; if (icell == null) { return false; } // Bind the row to the cell cell.Bind (model[row_index]); return true; } #pragma warning restore 0169 #endregion #region OnButtonPress protected override bool OnButtonPressEvent (Gdk.EventButton evnt) { HasFocus = true; if (header_visible && header_interaction_alloc.Contains ((int)evnt.X, (int)evnt.Y)) { HeaderFocused = true; return OnHeaderButtonPressEvent (evnt); } else if (list_interaction_alloc.Contains ((int)evnt.X, (int)evnt.Y) && model != null) { HeaderFocused = false; return OnListButtonPressEvent (evnt); } return true; } private bool OnHeaderButtonPressEvent (Gdk.EventButton evnt) { int x = (int)evnt.X - header_interaction_alloc.X; int y = (int)evnt.Y - header_interaction_alloc.Y; if (evnt.Button == 3 && ColumnController.EnableColumnMenu) { Column menu_column = GetColumnAt (x); if (menu_column != null) { OnColumnRightClicked (menu_column, x + Allocation.X, y + Allocation.Y); } return true; } else if (evnt.Button != 1) { return true; } Gtk.Drag.SourceUnset (this); Column column = GetColumnForResizeHandle (x); if (column != null) { resizing_column_index = GetCachedColumnForColumn (column).Index; } else { column = GetColumnAt (x); if (column != null) { CachedColumn column_c = GetCachedColumnForColumn (column); pressed_column_index = column_c.Index; pressed_column_x_start = x; pressed_column_x_offset = pressed_column_x_start - column_c.X1; pressed_column_x_start_hadjustment = HadjustmentValue; } } return true; } private bool OnListButtonPressEvent (Gdk.EventButton evnt) { if (Model == null) { return true; } int x = (int)evnt.X - list_interaction_alloc.X; int y = (int)evnt.Y - list_interaction_alloc.Y; GrabFocus (); int row_index = GetModelRowAt (x, y); if (row_index < 0 || row_index >= Model.Count) { Gtk.Drag.SourceUnset (this); return true; } if (LayoutChildHandlesEvent (evnt, true)) { return true; } ProxyEventToCell (evnt, true); object item = model[row_index]; if (item == null) { return true; } if (evnt.Button == 1 && evnt.Type == Gdk.EventType.TwoButtonPress) { // Double clicked OnRowActivated (); } else if (Selection != null) { if ((evnt.State & Gdk.ModifierType.ControlMask) != 0) { if (evnt.Button == 3) { // Right clicked with ctrl pressed, so make sure row selected if (!Selection.Contains (row_index)) { Selection.Select (row_index); } } else { // Normal ctrl-click, so toggle Selection.ToggleSelect (row_index); } } else if ((evnt.State & Gdk.ModifierType.ShiftMask) != 0) { // Shift-click, so select from first-row-selected (if any) to the current row Selection.SelectFromFirst (row_index, true); } else { if (evnt.Button == 3) { // Normal right-click, make sure row is only row selected if (!Selection.Contains (row_index)) { Selection.Clear (false); Selection.Select (row_index); } } else { // Normal click, if row not already selected, select only it right now, // but if it's already selected, wait until the Release to unselect any others so that // drag and drop of 2+ items works. if (!Selection.Contains (row_index)) { Selection.Clear (false); Selection.Select (row_index); } } } FocusModelRow (row_index); // Now that we've worked out the selections, open the context menu if (evnt.Button == 3) { OnPopupMenu (); } } InvalidateList (); return true; } #endregion #region OnButtonRelease protected override bool OnButtonReleaseEvent (Gdk.EventButton evnt) { OnDragSourceSet (); StopDragScroll (); if (resizing_column_index >= 0) { pressed_column_index = -1; resizing_column_index = -1; GdkWindow.Cursor = null; return true; } if (pressed_column_drag_started) { CancelColumnDrag (); pressed_column_drag_started = false; return true; } if (header_visible && header_interaction_alloc.Contains ((int)evnt.X, (int)evnt.Y)) { return OnHeaderButtonRelease (evnt); } else if (list_interaction_alloc.Contains ((int)evnt.X, (int)evnt.Y) && model != null && (evnt.State & (Gdk.ModifierType.ShiftMask | Gdk.ModifierType.ControlMask)) == 0) { if (LayoutChildHandlesEvent (evnt, false)) { return true; } ProxyEventToCell (evnt, false); return OnListButtonRelease (evnt); } return true; } private bool OnHeaderButtonRelease (Gdk.EventButton evnt) { if (pressed_column_index >= 0 && pressed_column_index < column_cache.Length) { Column column = column_cache[pressed_column_index].Column; ActiveColumn = pressed_column_index; if (column != null) OnColumnLeftClicked (column); pressed_column_index = -1; return true; } else { return false; } } private bool OnListButtonRelease (Gdk.EventButton evnt) { if (Model == null) { return true; } int x = (int)evnt.X - list_interaction_alloc.X; int y = (int)evnt.Y - list_interaction_alloc.Y; GrabFocus (); int row_index = GetModelRowAt (x, y); if (row_index >= Model.Count) { return true; } object item = model[row_index]; if (item == null) { return true; } //if (Selection != null && Selection.Contains (row_index) && Selection.Count > 1) { if (Selection != null && evnt.Button == 1 && Hyena.Gui.GtkUtilities.NoImportantModifiersAreSet ()) { if (Selection.Count > 1) { Selection.Clear (false); Selection.Select (row_index); FocusModelRow (row_index); InvalidateList (); } } return true; } #endregion protected override bool OnMotionNotifyEvent (Gdk.EventMotion evnt) { int x = (int)evnt.X - header_interaction_alloc.X; if (pressed_column_index >= 0 && !pressed_column_is_dragging && Gtk.Drag.CheckThreshold (this, pressed_column_x_start, 0, x, 0)) { pressed_column_is_dragging = true; pressed_column_drag_started = true; InvalidateHeader (); InvalidateList (); } pressed_column_x = x; if (OnMotionNotifyEvent (x)) { return true; } GdkWindow.Cursor = header_interaction_alloc.Contains ((int)evnt.X, (int)evnt.Y) && (resizing_column_index >= 0 || GetColumnForResizeHandle (x) != null) ? resize_x_cursor : null; if (resizing_column_index >= 0) { ResizeColumn (x); } if (LayoutChildHandlesEvent (evnt, false)) { return true; } ProxyEventToCell (evnt, false); return true; } private bool OnMotionNotifyEvent (int x) { if (!pressed_column_is_dragging) { return false; } OnDragScroll (OnDragHScrollTimeout, header_interaction_alloc.Width * 0.1, header_interaction_alloc.Width, x); GdkWindow.Cursor = drag_cursor; Column swap_column = GetColumnAt (x); if (swap_column != null) { CachedColumn swap_column_c = GetCachedColumnForColumn (swap_column); bool reorder = false; if (swap_column_c.Index < pressed_column_index) { // Moving from right to left reorder = pressed_column_x_drag <= swap_column_c.X1 + swap_column_c.Width / 2; } else if (swap_column_c.Index > pressed_column_index) { if (column_cache.Length > pressed_column_index && pressed_column_index >= 0) { // Moving from left to right reorder = pressed_column_x_drag + column_cache[pressed_column_index].Width >= swap_column_c.X1 + swap_column_c.Width / 2; } } if (reorder) { int actual_pressed_index = ColumnController.IndexOf (column_cache[pressed_column_index].Column); int actual_swap_index = ColumnController.IndexOf (swap_column_c.Column); ColumnController.Reorder (actual_pressed_index, actual_swap_index); pressed_column_index = swap_column_c.Index; RegenerateColumnCache (); } } pressed_column_x_drag = x - pressed_column_x_offset - (pressed_column_x_start_hadjustment - HadjustmentValue); QueueDraw (); return true; } private bool OnDragHScrollTimeout () { ScrollToY (hadjustment, HadjustmentValue + (drag_scroll_velocity * drag_scroll_velocity_max)); OnMotionNotifyEvent (pressed_column_x); return true; } protected override bool OnLeaveNotifyEvent (Gdk.EventCrossing evnt) { if (evnt.Mode == Gdk.CrossingMode.Normal) { GdkWindow.Cursor = null; if (LayoutChildHandlesEvent (evnt, false)) { return true; } ProxyEventToCell (evnt, false); } return base.OnLeaveNotifyEvent (evnt); } protected override bool OnFocused (Gtk.DirectionType directionType) { if (!HeaderVisible) return base.OnFocused (directionType); if (HasFocus) { if (directionType == DirectionType.TabForward && HeaderFocused) HeaderFocused = false; else if (directionType == DirectionType.TabBackward && !HeaderFocused) HeaderFocused = true; else return base.OnFocused (directionType); return true; } else { if (directionType == DirectionType.TabForward ) HeaderFocused = true; else if (directionType == DirectionType.TabBackward) HeaderFocused = false; return base.OnFocused (directionType); } } protected virtual void OnRowActivated () { if (Selection.FocusedIndex != -1) { RowActivatedHandler handler = RowActivated; if (handler != null) { handler (this, new RowActivatedArgs (Selection.FocusedIndex, model[Selection.FocusedIndex])); } } } private bool CancelColumnDrag () { if (pressed_column_index >= 0 && pressed_column_is_dragging) { pressed_column_is_dragging = false; pressed_column_index = -1; GdkWindow.Cursor = null; QueueDirtyRegion (); return true; } return false; } // FIXME: replace all invocations with direct call to ViewLayout protected int GetModelRowAt (int x, int y) { if (ViewLayout != null) { var child = ViewLayout.FindChildAtPoint (new Point (x, y)); return child == null ? -1 : ViewLayout.GetModelIndex (child); } else { if (y < 0 || ChildSize.Height <= 0) { return -1; } int v_page_offset = VadjustmentValue % ChildSize.Height; int first_row = VadjustmentValue / ChildSize.Height; int row_offset = (y + v_page_offset) / ChildSize.Height; return first_row + row_offset; } } protected Gdk.Point GetViewPointForModelRow (int row) { // FIXME: hard-coded grid logic if (ViewLayout != null) { int cols = ((DataViewLayoutGrid)ViewLayout).Columns; if (cols == 0 || row == 0) { return new Gdk.Point (0, 0); } else { return new Gdk.Point ((row % cols) * ChildSize.Width, (int)(Math.Floor ((double)row / (double)cols) * ChildSize.Height)); } } else { return new Gdk.Point (0, ChildSize.Height * row); } } private void FocusModelRow (int index) { Selection.FocusedIndex = index; } #endregion #region Adjustments & Scrolling private void UpdateAdjustments () { UpdateAdjustments (null, null); } private void UpdateAdjustments (Adjustment hadj, Adjustment vadj) { if (hadj != null) { hadjustment = hadj; } if (vadj != null) { vadjustment = vadj; } // FIXME: with ViewLayout, hadj and vadj should be unified // since the layout will take the header into account... if (hadjustment != null) { hadjustment.Upper = header_width; hadjustment.StepIncrement = 10.0; if (hadjustment.Value + hadjustment.PageSize > hadjustment.Upper) { hadjustment.Value = hadjustment.Upper - hadjustment.PageSize; } } if (vadjustment != null && model != null) { // FIXME: hard-coded grid logic if (ViewLayout != null) { vadjustment.Upper = ViewLayout.VirtualSize.Height; vadjustment.StepIncrement = ViewLayout.ChildSize.Height; } else { vadjustment.Upper = ChildSize.Height * model.Count; vadjustment.StepIncrement = ChildSize.Height; } if (vadjustment.Value + vadjustment.PageSize > vadjustment.Upper) { vadjustment.Value = vadjustment.Upper - vadjustment.PageSize; } } else if (vadjustment != null) { // model is null vadjustment.Upper = 0; vadjustment.Lower = 0; } if (hadjustment != null) { hadjustment.Change (); } if (vadjustment != null) { vadjustment.Change (); } } private void OnHadjustmentChanged (object o, EventArgs args) { InvalidateLastIcell (); InvalidateHeader (); InvalidateList (); if (ViewLayout != null) { ViewLayout.UpdatePosition (HadjustmentValue, VadjustmentValue); } } private void OnVadjustmentChanged (object o, EventArgs args) { InvalidateLastIcell (); InvalidateList (); if (ViewLayout != null) { ViewLayout.UpdatePosition (HadjustmentValue, VadjustmentValue); } } public void ScrollToY (double val) { ScrollToY (vadjustment, val); } private void ScrollToY (Adjustment adjustment, double val) { if (adjustment != null) { adjustment.Value = Math.Max (0.0, Math.Min (val, adjustment.Upper - adjustment.PageSize)); } } public void ScrollTo (int index) { ScrollToY (GetViewPointForModelRow (index).Y); } public void CenterOn (int index) { ScrollTo (index - ItemsInView / 2 + 1); } public bool IsRowVisible (int index) { double y = GetViewPointForModelRow (index).Y; return vadjustment.Value <= y && y < vadjustment.Value + vadjustment.PageSize; } protected void CenterOnSelection () { if (Selection != null && Selection.Count > 0 && !Selection.AllSelected) { bool selection_in_view = false; int first_row = GetModelRowAt (0, 0); for (int i = 0; i < ItemsInView; i++) { if (Selection.Contains (first_row + i)) { selection_in_view = true; break; } } if (!selection_in_view) { CenterOn (Selection.Ranges[0].Start); } } } protected override void OnSetScrollAdjustments (Adjustment hadj, Adjustment vadj) { if (hadj == null || vadj == null) { return; } hadj.ValueChanged += OnHadjustmentChanged; vadj.ValueChanged += OnVadjustmentChanged; UpdateAdjustments (hadj, vadj); } #endregion } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ListView/ListView.cs0000644000175000017500000001234511467745411025163 0ustar00rubenruben00000000000000// // ListView.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Hyena.Gui.Canvas; namespace Hyena.Data.Gui { public partial class ListView : ListViewBase, IListView { protected ListView (IntPtr ptr) : base (ptr) { } public ListView () { column_layout = new Pango.Layout (PangoContext); CanFocus = true; selection_proxy.Changed += delegate { InvalidateList (); }; HasTooltip = true; QueryTooltip += OnQueryTooltip; DirectionChanged += (o, a) => SetDirection (); } private void OnQueryTooltip (object o, Gtk.QueryTooltipArgs args) { if (!args.KeyboardTooltip) { if (ViewLayout != null) { var pt = new Point (args.X - list_interaction_alloc.X, args.Y - list_interaction_alloc.Y); var child = ViewLayout.FindChildAtPoint (pt); if (child != null) { string markup; Rect area; pt.Offset (ViewLayout.ActualAllocation.Point); if (child.GetTooltipMarkupAt (pt, out markup, out area)) { area.Offset (-ViewLayout.ActualAllocation.X, -ViewLayout.ActualAllocation.Y); area.Offset (list_interaction_alloc.X, list_interaction_alloc.Y); args.Tooltip.Markup = markup; args.Tooltip.TipArea = (Gdk.Rectangle)area; /*if (!area.Contains (args.X, args.Y)) { Log.WarningFormat ("Tooltip rect {0} does not contain tooltip point {1},{2} -- this will cause excessive requerying", area, args.X, args.Y); }*/ args.RetVal = true; } } } else if (cell_context != null && cell_context.Layout != null) { ITooltipCell cell; Column column; int row_index; if (GetEventCell (args.X, args.Y, out cell, out column, out row_index)) { CachedColumn cached_column = GetCachedColumnForColumn (column); string markup = cell.GetTooltipMarkup (cell_context, cached_column.Width); if (!String.IsNullOrEmpty (markup)) { Gdk.Rectangle rect = new Gdk.Rectangle (); rect.X = list_interaction_alloc.X + cached_column.X1; // get the y of the event in list coords rect.Y = args.Y - list_interaction_alloc.Y; // get the top of the cell pointed to by list_y rect.Y -= VadjustmentValue % ChildSize.Height; rect.Y -= rect.Y % ChildSize.Height; // convert back to widget coords rect.Y += list_interaction_alloc.Y; // TODO is this right even if the list is wide enough to scroll horizontally? rect.Width = cached_column.Width; // TODO not right - could be smaller if at the top/bottom and only partially showing rect.Height = ChildSize.Height; /*if (!rect.Contains (args.X, args.Y)) { Log.WarningFormat ("ListView tooltip rect {0} does not contain tooltip point {1},{2} -- this will cause excessive requerying", rect, args.X, args.Y); }*/ args.Tooltip.Markup = markup; args.Tooltip.TipArea = rect; args.RetVal = true; } } } } // Work around ref counting SIGSEGV, see http://bugzilla.gnome.org/show_bug.cgi?id=478519#c9 if (args.Tooltip != null) { args.Tooltip.Dispose (); } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs0000644000175000017500000005433111420634720026421 0ustar00rubenruben00000000000000// // ListView_Header.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using Mono.Unix; using Gtk; namespace Hyena.Data.Gui { public partial class ListView : ListViewBase { internal struct CachedColumn { public static readonly CachedColumn Zero; public Column Column; public int X1; public int X2; public int Width; public int MinWidth; public int MaxWidth; public int ResizeX1; public int ResizeX2; public int Index; public double ElasticWidth; public double ElasticPercent; } private static Gdk.Cursor resize_x_cursor = new Gdk.Cursor (Gdk.CursorType.SbHDoubleArrow); private static Gdk.Cursor drag_cursor = new Gdk.Cursor (Gdk.CursorType.Fleur); private bool resizable; private int header_width; private double list_width, max_width; private int sort_column_index = -1; private int resizing_column_index = -1; private int pressed_column_index = -1; private int pressed_column_x = -1; private int pressed_column_x_start = -1; private int pressed_column_x_offset = -1; private int pressed_column_x_drag = -1; private int pressed_column_x_start_hadjustment = -1; private bool pressed_column_is_dragging = false; private bool pressed_column_drag_started = false; private Pango.Layout column_layout; private CachedColumn [] column_cache; private List elastic_columns; public int Width { get { return (int)list_width; } } public int MaxWidth { get { return (int)max_width + Theme.TotalBorderWidth*2; } } #region Columns private void InvalidateColumnCache () { column_cache = null; } private void GenerateColumnCache () { column_cache = new CachedColumn[column_controller.Count]; int i = 0; double total = 0.0; foreach (Column column in column_controller) { if (!column.Visible) { continue; } // If we don't already have a MinWidth set, use the width of our Title text column.CalculateWidths (column_layout, HeaderVisible, HeaderHeight); column_cache[i] = new CachedColumn (); column_cache[i].Column = column; column_cache[i].Index = i; total += column.Width; i++; } Array.Resize (ref column_cache, i); double scale_factor = 1.0 / total; for (i = 0; i < column_cache.Length; i++) { column_cache[i].Column.Width *= scale_factor; if (column_cache[i].Column.Width <= 0) { Hyena.Log.Warning ("Overriding 0-computed column cache width"); column_cache[i].Column.Width = 0.01; } } RecalculateColumnSizes (); } private void RegenerateColumnCache () { if (column_controller == null) { return; } if (column_cache == null) { GenerateColumnCache (); } for (int i = 0; i < column_cache.Length; i++) { // Calculate this column's proportional share of the width, and set positions (X1/X2) column_cache[i].Width = (int)Math.Round (((double)header_width * column_cache[i].Column.Width)); column_cache[i].X1 = i == 0 ? 0 : column_cache[i - 1].X2; column_cache[i].X2 = column_cache[i].X1 + column_cache[i].Width; column_cache[i].ResizeX1 = column_cache[i].X2; column_cache[i].ResizeX2 = column_cache[i].ResizeX1 + 2; } // TODO handle max width int index = column_cache.Length - 1; if (index >= 0) { column_cache[index].X2 = header_width; column_cache[index].Width = column_cache[index].X2 - column_cache[index].X1; } } private void RecalculateColumnSizes () { if (column_cache == null) { return; } ISortable sortable = Model as ISortable; sort_column_index = -1; int min_header_width = 0; for (int i = 0; i < column_cache.Length; i++) { if (sortable != null) { ColumnHeaderCellText column_cell = column_cache[i].Column.HeaderCell as ColumnHeaderCellText; if (column_cell != null) { ISortableColumn sort_column = column_cache[i].Column as ISortableColumn; column_cell.HasSort = sort_column != null && sortable.SortColumn == sort_column; if (column_cell.HasSort) { sort_column_index = i; } } } column_cache[i].Column.CalculateWidths (column_layout, HeaderVisible, HeaderHeight); column_cache[i].MaxWidth = column_cache[i].Column.MaxWidth; column_cache[i].MinWidth = column_cache[i].Column.MinWidth; min_header_width += column_cache[i].MinWidth; } if (column_cache.Length == 1) { column_cache[0].Column.Width = 1.0; } else if (min_header_width >= header_interaction_alloc.Width) { header_width = min_header_width; resizable = false; for (int i = 0; i < column_cache.Length; i++) { column_cache[i].Column.Width = (double)column_cache[i].MinWidth / (double)header_width; } } else { header_width = header_interaction_alloc.Width; resizable = true; if (elastic_columns == null) { elastic_columns = new List (column_cache.Length); } elastic_columns.Clear (); for (int i = 0; i < column_cache.Length; i++) { elastic_columns.Add (i); column_cache[i].ElasticWidth = 0.0; column_cache[i].ElasticPercent = column_cache[i].Column.Width * header_width; } double remaining_width = RecalculateColumnSizes (header_width, header_width); while (Math.Round (remaining_width) != 0.0 && elastic_columns.Count > 0) { double total_elastic_width = 0.0; foreach (int i in elastic_columns) { total_elastic_width += column_cache[i].ElasticWidth; } remaining_width = RecalculateColumnSizes (remaining_width, total_elastic_width); } for (int i = 0; i < column_cache.Length; i++) { column_cache[i].Column.Width = column_cache[i].ElasticWidth / (double)header_width; } } double tmp_width = 0.0; double tmp_max = 0.0; foreach (var col in column_cache) { tmp_width += col.ElasticWidth; tmp_max += col.MaxWidth == Int32.MaxValue ? col.MinWidth : col.MaxWidth; } list_width = tmp_width; max_width = tmp_max; } private double RecalculateColumnSizes (double total_width, double total_elastic_width) { double remaining_width = total_width; for (int index = 0; index < elastic_columns.Count; index++) { int i = elastic_columns[index]; double percent = column_cache[i].ElasticPercent / total_elastic_width; double delta = total_width * percent; // TODO handle max widths double width = column_cache[i].ElasticWidth + delta; if (width < column_cache[i].MinWidth) { delta = column_cache[i].MinWidth - column_cache[i].ElasticWidth; elastic_columns.RemoveAt (index); index--; } else if (width > column_cache[i].MaxWidth) { delta = column_cache[i].MaxWidth - column_cache[i].ElasticWidth; elastic_columns.RemoveAt (index); index--; } remaining_width -= delta; column_cache[i].ElasticWidth += delta; } if (Math.Abs (total_width - remaining_width) < 1.0 || remaining_width == Double.NaN) { Hyena.Log.Warning ("Forcefully breaking out of RCS loop b/c change in total_width less than 1.0"); return 0; } return Math.Round (remaining_width); } protected virtual void OnColumnControllerUpdated () { InvalidateColumnCache (); RegenerateColumnCache (); UpdateAdjustments (); QueueDirtyRegion (); } protected virtual void OnColumnLeftClicked (Column clickedColumn) { if (Model is ISortable && clickedColumn is ISortableColumn) { ISortableColumn sort_column = clickedColumn as ISortableColumn; ISortable sortable = Model as ISortable; // Change the sort-type with every click if (sort_column == ColumnController.SortColumn) { switch (sort_column.SortType) { case SortType.Ascending: sort_column.SortType = SortType.Descending; break; case SortType.Descending: sort_column.SortType = SortType.None; break; case SortType.None: sort_column.SortType = SortType.Ascending; break; } } // If we're switching from a different column, or we aren't reorderable, make sure sort type isn't None if ((sort_column != ColumnController.SortColumn || !IsEverReorderable) && sort_column.SortType == SortType.None) { sort_column.SortType = SortType.Ascending; } sortable.Sort (sort_column); ColumnController.SortColumn = sort_column; IsReorderable = sortable.SortColumn == null || sortable.SortColumn.SortType == SortType.None; Model.Reload (); CenterOnSelection (); RecalculateColumnSizes (); RegenerateColumnCache (); InvalidateHeader (); } } protected virtual void OnColumnRightClicked (Column clickedColumn, int x, int y) { Column [] columns = ColumnController.ToArray (); Array.Sort (columns, delegate (Column a, Column b) { // Fully qualified type name to avoid Mono 1.2.4 bug return System.String.Compare (a.Title, b.Title); }); uint items = 0; for (int i = 0; i < columns.Length; i++) { if (columns[i].Id != null) { items++; } } uint max_items_per_column = 15; if (items >= max_items_per_column * 2) { max_items_per_column = (uint)Math.Ceiling (items / 3.0); } else if (items >= max_items_per_column) { max_items_per_column = (uint)Math.Ceiling (items / 2.0); } uint column_count = (uint)Math.Ceiling (items / (double)max_items_per_column); Menu menu = new Menu (); uint row_offset = 2; if (clickedColumn.Id != null) { // FIXME: Also restrict if the column vis can't be changed menu.Attach (new ColumnHideMenuItem (clickedColumn), 0, column_count, 0, 1); menu.Attach (new SeparatorMenuItem (), 0, column_count, 1, 2); } items = 0; for (uint i = 0, n = (uint)columns.Length, column = 0, row = 0; i < n; i++) { if (columns[i].Id == null) { continue; } row = items++ % max_items_per_column; menu.Attach (new ColumnToggleMenuItem (columns[i]), column, column + 1, row + row_offset, row + 1 + row_offset); if (row == max_items_per_column - 1) { column++; } } menu.ShowAll (); menu.Popup (null, null, delegate (Menu popup, out int pos_x, out int pos_y, out bool push_in) { int win_x, win_y; GdkWindow.GetOrigin (out win_x, out win_y); pos_x = win_x + x; pos_y = win_y + y; push_in = true; }, 3, Gtk.Global.CurrentEventTime); } private void ResizeColumn (double x) { CachedColumn resizing_column = column_cache[resizing_column_index]; double resize_delta = x - resizing_column.ResizeX2; // If this column cannot be resized, check the columns to the left. int real_resizing_column_index = resizing_column_index; while (resizing_column.MinWidth == resizing_column.MaxWidth) { if (real_resizing_column_index == 0) { return; } resizing_column = column_cache[--real_resizing_column_index]; } // Make sure the resize_delta won't make us smaller than the min if (resizing_column.Width + resize_delta < resizing_column.MinWidth) { resize_delta = resizing_column.MinWidth - resizing_column.Width; } // Make sure the resize_delta won't make us bigger than the max if (resizing_column.Width + resize_delta > resizing_column.MaxWidth) { resize_delta = resizing_column.MaxWidth - resizing_column.Width; } if (resize_delta == 0) { return; } int sign = Math.Sign (resize_delta); resize_delta = Math.Abs (resize_delta); double total_elastic_width = 0.0; for (int i = real_resizing_column_index + 1; i < column_cache.Length; i++) { total_elastic_width += column_cache[i].ElasticWidth = sign == 1 ? column_cache[i].Width - column_cache[i].MinWidth : column_cache[i].MaxWidth - column_cache[i].Width; } if (total_elastic_width == 0) { return; } if (resize_delta > total_elastic_width) { resize_delta = total_elastic_width; } // Convert to a proprotional width resize_delta = sign * resize_delta / (double)header_width; for (int i = real_resizing_column_index + 1; i < column_cache.Length; i++) { column_cache[i].Column.Width += -resize_delta * (column_cache[i].ElasticWidth / total_elastic_width); } resizing_column.Column.Width += resize_delta; RegenerateColumnCache (); QueueDraw (); } private Column GetColumnForResizeHandle (int x) { if (column_cache == null || !resizable) { return null; } x += HadjustmentValue; for (int i = 0; i < column_cache.Length - 1; i++) { if (x < column_cache[i].ResizeX1 - 2) { // No point in checking other columns since their ResizeX1 are even larger break; } else if (x <= column_cache[i].ResizeX2 + 2 && CanResizeColumn (i)) { return column_cache[i].Column; } } return null; } protected int GetColumnWidth (int column_index) { CachedColumn cached_column = column_cache[column_index]; return cached_column.Width; } private bool CanResizeColumn (int column_index) { // At least one column to the left (including the one being resized) should be resizable. bool found = false; for (int i = column_index; i >= 0 ; i--) { if (column_cache[i].Column.MaxWidth != column_cache[i].Column.MinWidth) { found = true; break; } } if (!found) { return false; } // At least one column to the right should be resizable as well. for (int i = column_index + 1; i < column_cache.Length; i++) { if (column_cache[i].Column.MaxWidth != column_cache[i].Column.MinWidth) { return true; } } return false; } private Column GetColumnAt (int x) { if (column_cache == null) { return null; } x += HadjustmentValue; foreach (CachedColumn column in column_cache) { if (x >= column.X1 && x <= column.X2) { return column.Column; } } return null; } private CachedColumn GetCachedColumnForColumn (Column col) { foreach (CachedColumn ca_col in column_cache) { if (ca_col.Column == col) { return ca_col; } } return CachedColumn.Zero; } private ColumnController column_controller; public ColumnController ColumnController { get { return column_controller; } set { if (column_controller == value) { return; } if (column_controller != null) { column_controller.Updated -= OnColumnControllerUpdatedHandler; } column_controller = value; OnColumnControllerUpdated (); if (column_controller != null) { column_controller.Updated += OnColumnControllerUpdatedHandler; } } } #endregion #region Header private int header_height = 0; private int HeaderHeight { get { // FIXME: ViewLayout should have the header info and never be null if (!header_visible || ViewLayout != null) { return 0; } if (header_height == 0) { int w; int h; column_layout.SetText ("W"); column_layout.GetPixelSize (out w, out h); header_height = h; header_height += 10; } return header_height; } } private bool header_visible = true; public bool HeaderVisible { get { return header_visible; } set { header_visible = value; MoveResize (Allocation); } } #endregion #region Gtk.MenuItem Wrappers for the column context menu private class ColumnToggleMenuItem : CheckMenuItem { private Column column; private bool ready = false; private Label label; public ColumnToggleMenuItem (Column column) : base () { this.column = column; Active = column.Visible; ready = true; label = new Label (); label.Xalign = 0.0f; label.Text = column.LongTitle ?? String.Empty; label.Show (); Add (label); } protected override void OnStyleSet (Style previousStyle) { base.OnStyleSet (previousStyle); label.ModifyFg (StateType.Prelight, Style.Foreground (StateType.Selected)); } protected override void OnActivated () { base.OnActivated (); if (!ready) { return; } column.Visible = Active; } } private class ColumnHideMenuItem : ImageMenuItem { private Column column; private Label label; public ColumnHideMenuItem (Column column) : base () { this.column = column; this.Image = new Image (Stock.Remove, IconSize.Menu); label = new Label (); label.Xalign = 0.0f; label.Markup = String.Format (Catalog.GetString ("Hide {0}"), GLib.Markup.EscapeText (column.LongTitle)); label.Show (); Add (label); } protected override void OnStyleSet (Style previousStyle) { base.OnStyleSet (previousStyle); label.ModifyFg (StateType.Prelight, Style.Foreground (StateType.Selected)); } protected override void OnActivated () { column.Visible = false; } } #endregion } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ListView/ListViewBase.cs0000644000175000017500000000450011467745411025750 0ustar00rubenruben00000000000000// // ListViewBase.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Gtk; using Hyena.Gui.Canvas; namespace Hyena.Data.Gui { public abstract class ListViewBase : Widget, ICanvasHost { protected ListViewBase (IntPtr ptr) : base (ptr) { } public ListViewBase () { } public void QueueDirtyRegion (Gdk.Rectangle region) { region.Intersect (Allocation); QueueDrawArea (region.X, region.Y, region.Width, region.Height); } public void QueueDirtyRegion (Rect region) { QueueDirtyRegion ((Gdk.Rectangle)region); } public void QueueDirtyRegion (Cairo.Rectangle region) { QueueDirtyRegion (new Gdk.Rectangle () { X = (int)Math.Floor (region.X), Y = (int)Math.Floor (region.Y), Width = (int)Math.Ceiling (region.Width), Height = (int)Math.Ceiling (region.Height) }); } public void QueueRender (Hyena.Gui.Canvas.CanvasItem item, Rect rect) { QueueDirtyRegion (rect); } public abstract Pango.Layout PangoLayout { get; } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs0000644000175000017500000005561411467745411027166 0ustar00rubenruben00000000000000// // ListView_Rendering.cs // // Author: // Aaron Bockover // // Copyright (C) 2007-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using Gtk; using Gdk; using Hyena.Gui; using Hyena.Gui.Theming; using Hyena.Gui.Canvas; using GtkColorClass=Hyena.Gui.Theming.GtkColorClass; namespace Hyena.Data.Gui { public delegate int ListViewRowHeightHandler (Widget widget); public partial class ListView : ListViewBase { private Cairo.Context cairo_context; private CellContext cell_context; private Pango.Layout pango_layout; public override Pango.Layout PangoLayout { get { return cell_context.Layout; } } private List selected_rows = new List (); private Theme theme; protected Theme Theme { get { return theme; } } // Using an auto-property here makes the build fail with mono 1.9.1 (bnc#396633) private bool do_not_render_null_model; public bool DoNotRenderNullModel { get { return do_not_render_null_model; } set { do_not_render_null_model = value; } } private bool changing_style = false; protected override void OnStyleSet (Style old_style) { if (changing_style) { return; } changing_style = true; GtkUtilities.AdaptGtkRcStyle (this, typeof (TreeView)); changing_style = false; base.OnStyleSet (old_style); // FIXME: legacy list foo if (ViewLayout == null) { OnInvalidateMeasure (); } theme = Hyena.Gui.Theming.ThemeEngine.CreateTheme (this); // Save the drawable so we can reuse it Gdk.Drawable drawable = cell_context != null ? cell_context.Drawable : null; if (pango_layout != null) { pango_layout.FontDescription.Dispose (); pango_layout.Dispose (); pango_layout = null; } cell_context = new CellContext (); cell_context.Theme = theme; cell_context.Widget = this; cell_context.Drawable = drawable; SetDirection (); } private void SetDirection () { var dir = Direction; if (dir == Gtk.TextDirection.None) { dir = Gtk.Widget.DefaultDirection; } if (cell_context != null) { cell_context.IsRtl = dir == Gtk.TextDirection.Rtl; } } protected override bool OnExposeEvent (EventExpose evnt) { if (DoNotRenderNullModel && Model == null) { return true; } var damage = new Rectangle (); foreach (Rectangle rect in evnt.Region.GetRectangles ()) { damage = damage.Union (rect); } cairo_context = CairoHelper.Create (evnt.Window); if (pango_layout == null) { pango_layout = CairoExtensions.CreateLayout (this, cairo_context); } cell_context.Context = cairo_context; cell_context.Layout = pango_layout; // FIXME: legacy list foo if (ViewLayout == null) { OnMeasure (); } Theme.DrawFrameBackground (cairo_context, Allocation, true); // FIXME: ViewLayout will never be null in the future but we'll need // to deterministically render a header somehow... if (header_visible && ViewLayout == null && column_controller != null) { PaintHeader (damage); } if (Model != null) { // FIXME: ViewLayout will never be null in // the future, PaintList will go away if (ViewLayout == null) { PaintList (damage); } else { PaintView ((Rect)damage); } } Theme.DrawFrameBorder (cairo_context, Allocation); PaintDraggingColumn (damage); CairoExtensions.DisposeContext (cairo_context); return true; } #region Header Rendering private void PaintHeader (Rectangle clip) { Rectangle rect = header_rendering_alloc; rect.Height += Theme.BorderWidth; clip.Intersect (rect); cairo_context.Rectangle (clip.X, clip.Y, clip.Width, clip.Height); cairo_context.Clip (); Theme.DrawHeaderBackground (cairo_context, header_rendering_alloc); Rectangle cell_area = new Rectangle (); cell_area.Y = header_rendering_alloc.Y; cell_area.Height = header_rendering_alloc.Height; cell_context.Clip = clip; cell_context.Opaque = true; cell_context.TextAsForeground = true; bool have_drawn_separator = false; for (int ci = 0; ci < column_cache.Length; ci++) { if (pressed_column_is_dragging && pressed_column_index == ci) { continue; } cell_area.X = column_cache[ci].X1 + Theme.TotalBorderWidth + header_rendering_alloc.X - HadjustmentValue; cell_area.Width = column_cache[ci].Width; PaintHeaderCell (cell_area, ci, false, ref have_drawn_separator); } if (pressed_column_is_dragging && pressed_column_index >= 0) { cell_area.X = pressed_column_x_drag + Allocation.X - HadjustmentValue; cell_area.Width = column_cache[pressed_column_index].Width; PaintHeaderCell (cell_area, pressed_column_index, true, ref have_drawn_separator); } cairo_context.ResetClip (); } private void PaintHeaderCell (Rectangle area, int ci, bool dragging, ref bool have_drawn_separator) { if (ci < 0 || column_cache.Length <= ci) return; if (ci == ActiveColumn && HasFocus && HeaderFocused) { Theme.DrawColumnHeaderFocus (cairo_context, area); } if (dragging) { Theme.DrawColumnHighlight (cairo_context, area, CairoExtensions.ColorShade (Theme.Colors.GetWidgetColor (GtkColorClass.Dark, StateType.Normal), 0.9)); Cairo.Color stroke_color = CairoExtensions.ColorShade (Theme.Colors.GetWidgetColor ( GtkColorClass.Base, StateType.Normal), 0.0); stroke_color.A = 0.3; cairo_context.Color = stroke_color; cairo_context.MoveTo (area.X + 0.5, area.Y + 1.0); cairo_context.LineTo (area.X + 0.5, area.Bottom); cairo_context.MoveTo (area.Right - 0.5, area.Y + 1.0); cairo_context.LineTo (area.Right - 0.5, area.Bottom); cairo_context.Stroke (); } ColumnCell cell = column_cache[ci].Column.HeaderCell; if (cell != null) { cairo_context.Save (); cairo_context.Translate (area.X, area.Y); cell_context.Area = area; cell_context.State = StateType.Normal; cell.Render (cell_context, area.Width, area.Height); cairo_context.Restore (); } if (!dragging && ci < column_cache.Length - 1 && (have_drawn_separator || column_cache[ci].MaxWidth != column_cache[ci].MinWidth)) { have_drawn_separator = true; Theme.DrawHeaderSeparator (cairo_context, area, area.Right); } } #endregion #region List Rendering private void PaintList (Rectangle clip) { if (ChildSize.Height <= 0) { return; } // TODO factor this out? // Render the sort effect to the GdkWindow. if (sort_column_index != -1 && (!pressed_column_is_dragging || pressed_column_index != sort_column_index)) { CachedColumn col = column_cache[sort_column_index]; Theme.DrawRowRule (cairo_context, list_rendering_alloc.X + col.X1 - HadjustmentValue, header_rendering_alloc.Bottom + Theme.BorderWidth, col.Width, list_rendering_alloc.Height + Theme.InnerBorderWidth * 2); } clip.Intersect (list_rendering_alloc); cairo_context.Rectangle (clip.X, clip.Y, clip.Width, clip.Height); cairo_context.Clip (); cell_context.Clip = clip; cell_context.TextAsForeground = false; int vadjustment_value = VadjustmentValue; int first_row = vadjustment_value / ChildSize.Height; int last_row = Math.Min (model.Count, first_row + RowsInView); int offset = list_rendering_alloc.Y - vadjustment_value % ChildSize.Height; Rectangle selected_focus_alloc = Rectangle.Zero; Rectangle single_list_alloc = new Rectangle (); single_list_alloc.X = list_rendering_alloc.X - HadjustmentValue; single_list_alloc.Y = offset; single_list_alloc.Width = list_rendering_alloc.Width + HadjustmentValue; single_list_alloc.Height = ChildSize.Height; int selection_height = 0; int selection_y = 0; selected_rows.Clear (); for (int ri = first_row; ri < last_row; ri++) { if (Selection != null && Selection.Contains (ri)) { if (selection_height == 0) { selection_y = single_list_alloc.Y; } selection_height += single_list_alloc.Height; selected_rows.Add (ri); if (Selection.FocusedIndex == ri) { selected_focus_alloc = single_list_alloc; } } else { if (rules_hint && ri % 2 != 0) { Theme.DrawRowRule (cairo_context, single_list_alloc.X, single_list_alloc.Y, single_list_alloc.Width, single_list_alloc.Height); } PaintReorderLine (ri, single_list_alloc); if (Selection != null && Selection.FocusedIndex == ri && !Selection.Contains (ri) && HasFocus) { CairoCorners corners = CairoCorners.All; if (Selection.Contains (ri - 1)) { corners &= ~(CairoCorners.TopLeft | CairoCorners.TopRight); } if (Selection.Contains (ri + 1)) { corners &= ~(CairoCorners.BottomLeft | CairoCorners.BottomRight); } if (HasFocus && !HeaderFocused) // Cursor out of selection. Theme.DrawRowCursor (cairo_context, single_list_alloc.X, single_list_alloc.Y, single_list_alloc.Width, single_list_alloc.Height, CairoExtensions.ColorShade (Theme.Colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected), 0.85)); } if (selection_height > 0) { Cairo.Color selection_color = Theme.Colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected); if (!HasFocus || HeaderFocused) selection_color = CairoExtensions.ColorShade (selection_color, 1.1); Theme.DrawRowSelection (cairo_context, list_rendering_alloc.X, selection_y, list_rendering_alloc.Width, selection_height, true, true, selection_color, CairoCorners.All); selection_height = 0; } PaintRow (ri, single_list_alloc, StateType.Normal); } single_list_alloc.Y += single_list_alloc.Height; } // In case the user is dragging to the end of the list PaintReorderLine (last_row, single_list_alloc); if (selection_height > 0) { Theme.DrawRowSelection (cairo_context, list_rendering_alloc.X, selection_y, list_rendering_alloc.Width, selection_height); } if (Selection != null && Selection.Count > 1 && !selected_focus_alloc.Equals (Rectangle.Zero) && HasFocus && !HeaderFocused) { // Cursor inside selection. Theme.DrawRowCursor (cairo_context, selected_focus_alloc.X, selected_focus_alloc.Y, selected_focus_alloc.Width, selected_focus_alloc.Height, Theme.Colors.GetWidgetColor (GtkColorClass.Text, StateType.Selected)); } foreach (int ri in selected_rows) { single_list_alloc.Y = offset + ((ri - first_row) * single_list_alloc.Height); PaintRow (ri, single_list_alloc, StateType.Selected); } cairo_context.ResetClip (); } private void PaintReorderLine (int row_index, Rectangle single_list_alloc) { if (row_index == drag_reorder_row_index && IsReorderable) { cairo_context.Save (); cairo_context.LineWidth = 1.0; cairo_context.Antialias = Cairo.Antialias.None; cairo_context.MoveTo (single_list_alloc.Left, single_list_alloc.Top); cairo_context.LineTo (single_list_alloc.Right, single_list_alloc.Top); cairo_context.Color = Theme.Colors.GetWidgetColor (GtkColorClass.Text, StateType.Normal); cairo_context.Stroke (); cairo_context.Restore (); } } private void PaintRow (int row_index, Rectangle area, StateType state) { if (column_cache == null) { return; } object item = model[row_index]; bool opaque = IsRowOpaque (item); bool bold = IsRowBold (item); Rectangle cell_area = new Rectangle (); cell_area.Height = ChildSize.Height; cell_area.Y = area.Y; cell_context.ViewRowIndex = cell_context.ModelRowIndex = row_index; for (int ci = 0; ci < column_cache.Length; ci++) { cell_context.ViewColumnIndex = ci; if (pressed_column_is_dragging && pressed_column_index == ci) { continue; } cell_area.Width = column_cache[ci].Width; cell_area.X = column_cache[ci].X1 + area.X; PaintCell (item, ci, row_index, cell_area, opaque, bold, state, false); } if (pressed_column_is_dragging && pressed_column_index >= 0) { cell_area.Width = column_cache[pressed_column_index].Width; cell_area.X = pressed_column_x_drag + list_rendering_alloc.X - list_interaction_alloc.X - HadjustmentValue; PaintCell (item, pressed_column_index, row_index, cell_area, opaque, bold, state, true); } } private void PaintCell (object item, int column_index, int row_index, Rectangle area, bool opaque, bool bold, StateType state, bool dragging) { ColumnCell cell = column_cache[column_index].Column.GetCell (0); cell.Bind (item); ColumnCellDataProvider (cell, item); ITextCell text_cell = cell as ITextCell; if (text_cell != null) { text_cell.FontWeight = bold ? Pango.Weight.Bold : Pango.Weight.Normal; } if (dragging) { Cairo.Color fill_color = Theme.Colors.GetWidgetColor (GtkColorClass.Base, StateType.Normal); fill_color.A = 0.5; cairo_context.Color = fill_color; cairo_context.Rectangle (area.X, area.Y, area.Width, area.Height); cairo_context.Fill (); } cairo_context.Save (); cairo_context.Translate (area.X, area.Y); cell_context.Area = area; cell_context.Opaque = opaque; cell_context.State = dragging ? StateType.Normal : state; cell.Render (cell_context, area.Width, area.Height); cairo_context.Restore (); AccessibleCellRedrawn (column_index, row_index); } private void PaintDraggingColumn (Rectangle clip) { if (!pressed_column_is_dragging || pressed_column_index < 0) { return; } CachedColumn column = column_cache[pressed_column_index]; int x = pressed_column_x_drag + Allocation.X + 1 - HadjustmentValue; Cairo.Color fill_color = Theme.Colors.GetWidgetColor (GtkColorClass.Base, StateType.Normal); fill_color.A = 0.45; Cairo.Color stroke_color = CairoExtensions.ColorShade (Theme.Colors.GetWidgetColor ( GtkColorClass.Base, StateType.Normal), 0.0); stroke_color.A = 0.3; cairo_context.Rectangle (x, header_rendering_alloc.Bottom + 1, column.Width - 2, list_rendering_alloc.Bottom - header_rendering_alloc.Bottom - 1); cairo_context.Color = fill_color; cairo_context.Fill (); cairo_context.MoveTo (x - 0.5, header_rendering_alloc.Bottom + 0.5); cairo_context.LineTo (x - 0.5, list_rendering_alloc.Bottom + 0.5); cairo_context.LineTo (x + column.Width - 1.5, list_rendering_alloc.Bottom + 0.5); cairo_context.LineTo (x + column.Width - 1.5, header_rendering_alloc.Bottom + 0.5); cairo_context.Color = stroke_color; cairo_context.LineWidth = 1.0; cairo_context.Stroke (); } #endregion #region View Layout Rendering private void PaintView (Rect clip) { clip.Intersect ((Rect)list_rendering_alloc); cairo_context.Rectangle ((Cairo.Rectangle)clip); cairo_context.Clip (); cell_context.Clip = (Gdk.Rectangle)clip; cell_context.TextAsForeground = false; selected_rows.Clear (); for (int layout_index = 0; layout_index < ViewLayout.ChildCount; layout_index++) { var layout_child = ViewLayout[layout_index]; var child_allocation = layout_child.Allocation; if (!child_allocation.IntersectsWith (clip) || ViewLayout.GetModelIndex (layout_child) >= Model.Count) { continue; } if (Selection != null && Selection.Contains (ViewLayout.GetModelIndex (layout_child))) { selected_rows.Add (ViewLayout.GetModelIndex (layout_child)); var selection_color = Theme.Colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected); if (!HasFocus || HeaderFocused) { selection_color = CairoExtensions.ColorShade (selection_color, 1.1); } Theme.DrawRowSelection (cairo_context, (int)child_allocation.X, (int)child_allocation.Y, (int)child_allocation.Width, (int)child_allocation.Height, true, true, selection_color, CairoCorners.All); cell_context.State = StateType.Selected; } else { cell_context.State = StateType.Normal; } //cairo_context.Save (); //cairo_context.Translate (child_allocation.X, child_allocation.Y); //cairo_context.Rectangle (0, 0, child_allocation.Width, child_allocation.Height); //cairo_context.Clip (); layout_child.Render (cell_context); //cairo_context.Restore (); } cairo_context.ResetClip (); } #endregion protected void InvalidateList () { if (IsRealized) { QueueDirtyRegion (list_rendering_alloc); } } private void InvalidateHeader () { if (IsRealized) { QueueDirtyRegion (header_rendering_alloc); } } protected void QueueDirtyRegion () { QueueDirtyRegion (list_rendering_alloc); } protected virtual void ColumnCellDataProvider (ColumnCell cell, object boundItem) { } private bool rules_hint = false; public bool RulesHint { get { return rules_hint; } set { rules_hint = value; InvalidateList (); } } // FIXME: Obsolete all this measure stuff on the view since it's in the layout #region Measuring private Gdk.Size child_size = Gdk.Size.Empty; public Gdk.Size ChildSize { get { return ViewLayout != null ? new Gdk.Size ((int)ViewLayout.ChildSize.Width, (int)ViewLayout.ChildSize.Height) : child_size; } } private bool measure_pending; protected virtual void OnInvalidateMeasure () { measure_pending = true; if (IsMapped && IsRealized) { QueueDirtyRegion (); } } protected virtual Gdk.Size OnMeasureChild () { return ViewLayout != null ? new Gdk.Size ((int)ViewLayout.ChildSize.Width, (int)ViewLayout.ChildSize.Height) : new Gdk.Size (0, ColumnCellText.ComputeRowHeight (this)); } private void OnMeasure () { if (!measure_pending) { return; } measure_pending = false; header_height = 0; child_size = OnMeasureChild (); UpdateAdjustments (); } #endregion } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/ObjectListView.cs0000644000175000017500000000344011420634720024525 0ustar00rubenruben00000000000000// // ObjectListView.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Data.Gui { public class ObjectListView : ListView { public ObjectListView () : base () { ColumnController = new ColumnController(); } protected override void OnModelReloaded () { ColumnController.Clear (); foreach (ColumnDescription column_description in Model.ColumnDescriptions) { ColumnController.Add (new Column (column_description)); } } public new IObjectListModel Model { get { return (IObjectListModel)base.Model; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/IInteractiveCell.cs0000644000175000017500000000271111467745411025031 0ustar00rubenruben00000000000000// // IInteractiveCell.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Hyena.Data.Gui { public interface IInteractiveCell { bool ButtonEvent (Hyena.Gui.Canvas.Point cursor, bool pressed, uint button); bool CursorMotionEvent (Hyena.Gui.Canvas.Point cursor); bool CursorLeaveEvent (); } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Data.Gui/SortableColumn.cs0000644000175000017500000000446011420634720024564 0ustar00rubenruben00000000000000// // SortableColumn.cs // // Author: // Aaron Bockover // // Copyright (C) 2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Collections.Generic; using Gtk; namespace Hyena.Data.Gui { public class SortableColumn : Column, ISortableColumn { private string sort_key; private SortType sort_type = SortType.Ascending; private Hyena.Query.QueryField field; public SortableColumn(string title, ColumnCell cell, double width, string sort_key, bool visible) : base(title, cell, width, visible) { this.sort_key = sort_key; } public SortableColumn(ColumnCell header_cell, string title, ColumnCell cell, double width, string sort_key, bool visible) : base(header_cell, title, cell, width, visible) { this.sort_key = sort_key; } public string SortKey { get { return sort_key; } set { sort_key = value; } } public SortType SortType { get { return sort_type; } set { sort_type = value; } } public Hyena.Query.QueryField Field { get { return field; } set { field = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Query.Gui/0000777000175000017500000000000011503407412021536 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Query.Gui/StringQueryValueEntry.cs0000644000175000017500000000414611420634720026403 0ustar00rubenruben00000000000000// // StringQueryValueEntry.cs // // Authors: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Hyena.Query; using Gtk; namespace Hyena.Query.Gui { public class StringQueryValueEntry : QueryValueEntry { protected Gtk.Entry entry; protected StringQueryValue query_value; public StringQueryValueEntry () : base () { entry = new Entry (); entry.WidthRequest = DefaultWidth; entry.Changed += HandleChanged; Add (entry); } public override QueryValue QueryValue { get { return query_value; } set { entry.Changed -= HandleChanged; query_value = value as StringQueryValue; entry.Text = (query_value.Value as string) ?? String.Empty; entry.Changed += HandleChanged; } } protected void HandleChanged (object o, EventArgs args) { query_value.ParseUserQuery (entry.Text); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Query.Gui/QueryBox.cs0000644000175000017500000001424211420634720023644 0ustar00rubenruben00000000000000// // QueryBox.cs // // Authors: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2005-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.Text; using Mono.Unix; using Gtk; using Hyena; using Hyena.Query; namespace Hyena.Query.Gui { public class QueryBox : VBox { private QueryTermsBox terms_box; private bool complex_query = false; private HBox terms_entry_box; private Entry terms_entry; private QueryLimitBox limit_box; public QueryLimitBox LimitBox { get { return limit_box; } } private ComboBox terms_logic_combo; private CheckButton terms_enabled_checkbox; private Label terms_label; private QueryFieldSet field_set; private Frame matchesFrame; public QueryBox (QueryFieldSet fieldSet, QueryOrder [] orders, QueryLimit [] limits) : base () { //this.sorted_fields = fieldSet.Fields; this.field_set = fieldSet; terms_box = new QueryTermsBox (field_set); limit_box = new QueryLimitBox (orders, limits); BuildInterface (); } private void BuildInterface () { NoShowAll = true; Alignment matchesAlignment = new Alignment (0.0f, 0.0f, 1.0f, 1.0f); matchesAlignment.SetPadding (5, 5, 5, 5); matchesAlignment.Add (terms_box); matchesFrame = new Frame (null); matchesFrame.Add (matchesAlignment); matchesFrame.LabelWidget = BuildMatchHeader (); matchesFrame.ShowAll (); terms_entry_box = new HBox (); terms_entry_box.Spacing = 8; terms_entry_box.PackStart (new Label (Catalog.GetString ("Condition:")), false, false, 0); terms_entry = new Entry (); terms_entry_box.PackStart (terms_entry, true, true, 0); limit_box.ShowAll (); PackStart(matchesFrame, true, true, 0); PackStart(terms_entry_box, false, false, 0); PackStart(limit_box, false, false, 0); //ShowAll (); } private HBox BuildMatchHeader () { HBox header = new HBox (); header.Show (); terms_enabled_checkbox = new CheckButton (Catalog.GetString ("_Match")); terms_enabled_checkbox.Show (); terms_enabled_checkbox.Active = true; terms_enabled_checkbox.Toggled += OnMatchCheckBoxToggled; header.PackStart (terms_enabled_checkbox, false, false, 0); terms_logic_combo = ComboBox.NewText (); terms_logic_combo.AppendText (Catalog.GetString ("all")); terms_logic_combo.AppendText (Catalog.GetString ("any")); terms_logic_combo.Show (); terms_logic_combo.Active = 0; header.PackStart (terms_logic_combo, false, false, 0); terms_label = new Label (Catalog.GetString ("of the following:")); terms_label.Show (); terms_label.Xalign = 0.0f; header.PackStart (terms_label, true, true, 0); header.Spacing = 5; return header; } private void OnMatchCheckBoxToggled (object o, EventArgs args) { terms_box.Sensitive = terms_enabled_checkbox.Active; terms_logic_combo.Sensitive = terms_enabled_checkbox.Active; terms_label.Sensitive = terms_enabled_checkbox.Active; } public QueryNode QueryNode { get { if (!complex_query && !terms_enabled_checkbox.Active) { return null; } if (complex_query) { return UserQueryParser.Parse (terms_entry.Text, field_set); } QueryListNode node = new QueryListNode (terms_logic_combo.Active == 0 ? Keyword.And : Keyword.Or); foreach (QueryNode child in terms_box.QueryNodes) { node.AddChild (child); } return node.Trim (); } set { if (value != null) { terms_enabled_checkbox.Active = true; try { if (value is QueryListNode) { terms_logic_combo.Active = ((value as QueryListNode).Keyword == Keyword.And) ? 0 : 1; terms_box.QueryNodes = (value as QueryListNode).Children; } else { List nodes = new List (); nodes.Add (value); terms_box.QueryNodes = nodes; } } catch (ArgumentException) { complex_query = true; matchesFrame.HideAll (); terms_entry.Text = value.ToUserQuery (); terms_entry_box.ShowAll (); } } else { terms_enabled_checkbox.Active = false; } } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Query.Gui/QueryDebugger.cs0000644000175000017500000001165311420634720024643 0ustar00rubenruben00000000000000// // QueryDebugger.cs // // Author: // Aaron Bockover // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.IO; using System.Xml; using System.Reflection; using Gtk; using Hyena.Gui; using Hyena.Query; namespace Hyena.Query.Gui { [TestModule ("Query Debugger")] public class QueryDebugger : Window { private TextView input; private TextView sql; private TextView xml; private QueryFieldSet query_field_set; public QueryDebugger () : base ("Hyena.Query Debugger") { SetDefaultSize (800, 600); VBox input_box = new VBox (); input_box.Spacing = 8; ScrolledWindow sw = new ScrolledWindow (); sw.ShadowType = ShadowType.In; sw.HscrollbarPolicy = PolicyType.Never; input = new TextView (); input.AcceptsTab = false; input.KeyReleaseEvent += delegate (object o, KeyReleaseEventArgs args) { if (args.Event.Key == Gdk.Key.Return || args.Event.Key == Gdk.Key.KP_Enter) { input.Buffer.Text = input.Buffer.Text.Trim (); OnParseUserQuery (null, EventArgs.Empty); } }; input.WrapMode = WrapMode.Word; sw.Add (input); input_box.PackStart (sw, true, true, 0); HBox button_box = new HBox (); Button parse = new Button ("Parse as User Query"); parse.Clicked += OnParseUserQuery; button_box.PackStart (parse, false, false, 0); input_box.PackStart (button_box, false, false, 0); HBox output_box = new HBox (); output_box.Spacing = 8; sw = new ScrolledWindow (); sw.ShadowType = ShadowType.In; sw.HscrollbarPolicy = PolicyType.Never; sql = new TextView (); sql.WrapMode = WrapMode.Word; sw.Add (sql); output_box.PackStart (sw, true, true, 0); sw = new ScrolledWindow (); sw.ShadowType = ShadowType.In; sw.HscrollbarPolicy = PolicyType.Never; xml = new TextView (); xml.WrapMode = WrapMode.Word; sw.Add (xml); output_box.PackStart (sw, true, true, 0); VPaned pane = new VPaned (); pane.Add1 (input_box); pane.Add2 (output_box); pane.Position = 100; Add (pane); pane.ShowAll (); input.HasFocus = true; LoadQueryFieldSet (); } private void LoadQueryFieldSet () { Assembly asm = Assembly.LoadFile ("Banshee.Services.dll"); Type t = asm.GetType ("Banshee.Query.BansheeQuery"); FieldInfo f = t.GetField ("FieldSet", BindingFlags.Public | BindingFlags.Static); query_field_set = (QueryFieldSet)f.GetValue (null); } private StreamReader StringToStream (string s) { return new StreamReader (new MemoryStream (System.Text.Encoding.UTF8.GetBytes (s))); } private void OnParseUserQuery (object o, EventArgs args) { UserQueryParser parser = new UserQueryParser (); parser.InputReader = StringToStream (input.Buffer.Text); QueryNode node = parser.BuildTree (query_field_set); sql.Buffer.Text = node.ToSql (query_field_set) ?? String.Empty; XmlDocument doc = new XmlDocument (); doc.LoadXml (node.ToXml (query_field_set)); MemoryStream s = new MemoryStream (); XmlTextWriter w = new XmlTextWriter (s, System.Text.Encoding.UTF8); w.Formatting = Formatting.Indented; doc.WriteContentTo (w); w.Flush (); s.Flush (); s.Position = 0; xml.Buffer.Text = new StreamReader (s).ReadToEnd (); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Query.Gui/TimeSpanQueryValueEntry.cs0000644000175000017500000000664611420634720026664 0ustar00rubenruben00000000000000// // TimeSpanQueryValueEntry.cs // // Authors: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Mono.Unix; using Hyena.Query; using Gtk; namespace Hyena.Query.Gui { public class TimeSpanQueryValueEntry : QueryValueEntry { protected SpinButton spin_button; protected ComboBox combo; protected TimeSpanQueryValue query_value; private int set_combo = 1; protected static readonly TimeFactor [] factors = new TimeFactor [] { TimeFactor.Second, TimeFactor.Minute, TimeFactor.Hour, TimeFactor.Day, TimeFactor.Week, TimeFactor.Month, TimeFactor.Year }; public TimeSpanQueryValueEntry () : base () { spin_button = new SpinButton (0.0, 1.0, 1.0); spin_button.Digits = 1; spin_button.WidthChars = 4; spin_button.SetRange (0.0, Double.MaxValue); Add (spin_button); combo = ComboBox.NewText (); combo.AppendText (Catalog.GetString ("seconds")); combo.AppendText (Catalog.GetString ("minutes")); combo.AppendText (Catalog.GetString ("hours")); combo.AppendText (Catalog.GetString ("days")); combo.AppendText (Catalog.GetString ("weeks")); combo.AppendText (Catalog.GetString ("months")); combo.AppendText (Catalog.GetString ("years")); combo.Realized += delegate { combo.Active = set_combo; }; Add (combo); spin_button.ValueChanged += HandleValueChanged; combo.Changed += HandleValueChanged; } public override QueryValue QueryValue { get { return query_value; } set { spin_button.ValueChanged -= HandleValueChanged; combo.Changed -= HandleValueChanged; query_value = value as TimeSpanQueryValue; spin_button.Value = query_value.FactoredValue; combo.Active = set_combo = Array.IndexOf (factors, query_value.Factor); spin_button.ValueChanged += HandleValueChanged; combo.Changed += HandleValueChanged; } } protected virtual void HandleValueChanged (object o, EventArgs args) { query_value.SetRelativeValue (spin_button.Value, factors [combo.Active]); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Query.Gui/IntegerQueryValueEntry.cs0000644000175000017500000000464511420634720026536 0ustar00rubenruben00000000000000// // IntegerQueryValueEntry.cs // // Authors: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Hyena.Query; using Gtk; namespace Hyena.Query.Gui { public class IntegerQueryValueEntry : QueryValueEntry { protected SpinButton spin_button; protected IntegerQueryValue query_value; public IntegerQueryValueEntry () : base () { spin_button = new SpinButton (0.0, 1.0, 1.0); spin_button.Digits = 0; spin_button.WidthChars = 4; spin_button.ValueChanged += HandleValueChanged; Add (spin_button); } public override QueryValue QueryValue { get { return query_value; } set { spin_button.ValueChanged -= HandleValueChanged; query_value = value as IntegerQueryValue; spin_button.SetRange (query_value.MinValue, query_value.MaxValue); spin_button.Value = (double) (query_value.IsEmpty ? query_value.DefaultValue : query_value.IntValue); query_value.SetValue (spin_button.ValueAsInt); spin_button.ValueChanged += HandleValueChanged; } } protected void HandleValueChanged (object o, EventArgs args) { query_value.SetValue (spin_button.ValueAsInt); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs0000644000175000017500000000645411420634720026653 0ustar00rubenruben00000000000000// // FileSizeQueryValueEntry.cs // // Authors: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Mono.Unix; using Hyena.Query; using Gtk; namespace Hyena.Query.Gui { public class FileSizeQueryValueEntry : QueryValueEntry { protected SpinButton spin_button; protected ComboBox combo; protected FileSizeQueryValue query_value; protected static readonly FileSizeFactor [] factors = new FileSizeFactor [] { FileSizeFactor.None, FileSizeFactor.KB, FileSizeFactor.MB, FileSizeFactor.GB }; bool combo_set = false; // Relative: [<|>] [num] [minutes|hours] ago // TODO: Absolute: [>|>=|=|<|<=] [date/time] public FileSizeQueryValueEntry () : base () { spin_button = new SpinButton (0.0, 1.0, 1.0); spin_button.Digits = 1; spin_button.WidthChars = 4; spin_button.SetRange (0.0, Double.MaxValue); Add (spin_button); combo = ComboBox.NewText (); combo.AppendText (Catalog.GetString ("bytes")); combo.AppendText (Catalog.GetString ("KB")); combo.AppendText (Catalog.GetString ("MB")); combo.AppendText (Catalog.GetString ("GB")); combo.Realized += delegate { if (!combo_set) { combo.Active = 2; } }; Add (combo); spin_button.ValueChanged += HandleValueChanged; combo.Changed += HandleValueChanged; } public override QueryValue QueryValue { get { return query_value; } set { spin_button.ValueChanged -= HandleValueChanged; combo.Changed -= HandleValueChanged; query_value = value as FileSizeQueryValue; spin_button.Value = query_value.FactoredValue; combo_set = true; combo.Active = Array.IndexOf (factors, query_value.Factor); spin_button.ValueChanged += HandleValueChanged; combo.Changed += HandleValueChanged; } } protected void HandleValueChanged (object o, EventArgs args) { query_value.SetValue (spin_button.Value, factors [combo.Active]); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Query.Gui/QueryLimitBox.cs0000644000175000017500000001131211420634720024636 0ustar00rubenruben00000000000000// // QueryLimitBox.cs // // Authors: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2005-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Text; using Mono.Unix; using Gtk; using Hyena; using Hyena.Query; namespace Hyena.Query.Gui { public class QueryLimitBox : HBox { private CheckButton enabled_checkbox; private SpinButton count_spin; private ComboBox limit_combo; private ComboBox order_combo; private QueryOrder [] orders; private QueryLimit [] limits; public QueryLimitBox (QueryOrder [] orders, QueryLimit [] limits) : base () { this.orders = orders; this.limits = limits; Spacing = 5; enabled_checkbox = new CheckButton (Catalog.GetString ("_Limit to")); enabled_checkbox.Toggled += OnEnabledToggled; count_spin = new SpinButton (0, Double.MaxValue, 1); count_spin.Numeric = true; count_spin.Digits = 0; count_spin.Value = 25; count_spin.SetSizeRequest (60, -1); limit_combo = ComboBox.NewText (); foreach (QueryLimit limit in limits) { limit_combo.AppendText (limit.Label); } order_combo = ComboBox.NewText (); order_combo.RowSeparatorFunc = IsRowSeparator; foreach (QueryOrder order in orders) { if (order == null) { order_combo.AppendText (String.Empty); } else { order_combo.AppendText (order.Label); } } PackStart (enabled_checkbox, false, false, 0); PackStart (count_spin, false, false, 0); PackStart (limit_combo, false, false, 0); PackStart (new Label (Catalog.GetString ("selected by")), false, false, 0); PackStart (order_combo, false, false, 0); enabled_checkbox.Active = false; limit_combo.Active = 0; order_combo.Active = 0; OnEnabledToggled (null, null); ShowAll (); } private bool IsRowSeparator (TreeModel model, TreeIter iter) { return String.IsNullOrEmpty (model.GetValue (iter, 0) as string); } public QueryLimit Limit { get { return Enabled ? limits [limit_combo.Active] : null; } set { if (value != null) limit_combo.Active = Array.IndexOf (limits, value); } } public IntegerQueryValue LimitValue { get { if (!Enabled) return null; IntegerQueryValue val = new IntegerQueryValue (); val.SetValue (count_spin.ValueAsInt); return val; } set { if (value != null && !value.IsEmpty) count_spin.Value = value.IntValue; } } public QueryOrder Order { get { return Enabled ? orders [order_combo.Active] : null; } set { if (value != null) { order_combo.Active = Array.IndexOf (orders, value); } } } private void OnEnabledToggled (object o, EventArgs args) { count_spin.Sensitive = enabled_checkbox.Active; limit_combo.Sensitive = enabled_checkbox.Active; order_combo.Sensitive = enabled_checkbox.Active; } public bool Enabled { get { return enabled_checkbox.Active; } set { enabled_checkbox.Active = value; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Query.Gui/RelativeTimeSpanQueryValueEntry.cs0000644000175000017500000000327211420634720030350 0ustar00rubenruben00000000000000// // RelativeTimeSpanQueryValueEntry.cs // // Authors: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Mono.Unix; using Hyena.Query; using Gtk; namespace Hyena.Query.Gui { public class RelativeTimeSpanQueryValueEntry : TimeSpanQueryValueEntry { public RelativeTimeSpanQueryValueEntry () : base () { Add (new Label (Catalog.GetString ("ago"))); } protected override void HandleValueChanged (object o, EventArgs args) { query_value.SetRelativeValue (-spin_button.ValueAsInt, factors [combo.Active]); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Query.Gui/QueryTermsBox.cs0000644000175000017500000001342411420634720024660 0ustar00rubenruben00000000000000// // QueryTermsBox.cs // // Authors: // Aaron Bockover // Gabriel Burt // Alexander Kojevnikov // // Copyright (C) 2005-2008 Novell, Inc. // Copyright (C) 2009 Alexander Kojevnikov // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Text; using System.Collections.Generic; using System.Linq; using Gtk; using Hyena; using Hyena.Query; namespace Hyena.Query.Gui { public class QueryTermsBox : Table { private QueryField [] sorted_fields; private List terms = new List (); public QueryTermBox FirstRow { get { return terms.Count > 0 ? terms[0] : null; } } public QueryTermsBox (QueryFieldSet fieldSet) : base (1, 4, false) { // Sort the fields alphabetically by their label sorted_fields = fieldSet.OrderBy (f => f.Label).ToArray (); ColumnSpacing = 5; RowSpacing = 5; CreateRow (false); } public List QueryNodes { get { return terms.Select (t => t.QueryNode).ToList (); } set { ClearRows (); first_add_node = true; foreach (QueryNode child in value) { AddNode (child); } } } private bool first_add_node; protected void AddNode (QueryNode node) { if (node is QueryTermNode) { QueryTermBox box = first_add_node ? FirstRow : CreateRow (true); box.QueryNode = node as QueryTermNode; first_add_node = false; } else { throw new ArgumentException ("Query is too complex for GUI query editor", "node"); } } protected QueryTermBox CreateRow (bool canDelete) { QueryTermBox row = new QueryTermBox (sorted_fields); row.ValueEntry.HeightRequest = 31; row.Buttons.HeightRequest = 31; Resize ((uint) terms.Count + 1, NColumns); Attach (row.FieldChooser, 0, 1, NRows - 1, NRows); Attach (row.OpChooser, 1, 2, NRows - 1, NRows); Attach (row.ValueEntry, 2, 3, NRows - 1, NRows); Attach (row.Buttons, 3, 4, NRows - 1, NRows); if (terms.Count > 0) { row.FieldChooser.Active = terms[terms.Count - 1].FieldChooser.Active; row.OpChooser.Active = terms[terms.Count - 1].OpChooser.Active; } row.Show (); row.CanDelete = canDelete; row.AddRequest += OnRowAddRequest; row.RemoveRequest += OnRowRemoveRequest; if (terms.Count == 0) { //row.FieldBox.GrabFocus (); } terms.Add (row); return row; } protected void OnRowAddRequest (object o, EventArgs args) { CreateRow (true); UpdateCanDelete (); } protected void OnRowRemoveRequest (object o, EventArgs args) { RemoveRow (terms.IndexOf (o as QueryTermBox)); } private void ClearRows () { for (int index = terms.Count - 1; index > 0; index--) { RemoveRow (index); } } private void RemoveRow (int index) { FreezeChildNotify (); QueryTermBox row = terms [index]; Remove (row.FieldChooser); Remove (row.OpChooser); Remove (row.ValueEntry); Remove (row.Buttons); for (int i = index + 1; i < terms.Count; i++) { Remove (terms[i].FieldChooser); Remove (terms[i].OpChooser); Remove (terms[i].ValueEntry); Remove (terms[i].Buttons); Attach (terms[i].FieldChooser, 0, 1, (uint) i - 1, (uint) i); Attach (terms[i].OpChooser, 1, 2, (uint) i - 1, (uint) i); Attach (terms[i].ValueEntry, 2, 3, (uint) i - 1, (uint) i); Attach (terms[i].Buttons, 3, 4, (uint) i - 1, (uint) i); } ThawChildNotify (); terms.Remove (row); UpdateCanDelete (); } protected void UpdateCanDelete () { if (FirstRow != null) { FirstRow.CanDelete = terms.Count > 1; } } private new void Attach (Widget widget, uint left_attach, uint right_attach, uint top_attach, uint bottom_attach) { Attach (widget, left_attach, right_attach, top_attach, bottom_attach, AttachOptions.Expand | AttachOptions.Fill, AttachOptions.Shrink, 0, 0); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Query.Gui/DateQueryValueEntry.cs0000644000175000017500000000713611420634720026014 0ustar00rubenruben00000000000000// // DateQueryValueEntry.cs // // Authors: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Mono.Unix; using Hyena.Query; using Gtk; namespace Hyena.Query.Gui { public class DateQueryValueEntry : QueryValueEntry { protected DateQueryValue query_value; protected SpinButton year_entry = new SpinButton (Double.MinValue, Double.MaxValue, 1.0); protected SpinButton month_entry = new SpinButton (0.0, 12.0, 1.0); protected SpinButton day_entry = new SpinButton (0.0, 31.0, 1.0); public DateQueryValueEntry () : base () { year_entry.MaxLength = year_entry.WidthChars = 4; month_entry.MaxLength = month_entry.WidthChars = 2; day_entry.MaxLength = day_entry.WidthChars = 2; year_entry.Numeric = month_entry.Numeric = day_entry.Numeric = true; month_entry.Wrap = day_entry.Wrap = true; year_entry.Value = (double) DateTime.Now.Year; month_entry.Value = (double) DateTime.Now.Month; day_entry.Value = (double) DateTime.Now.Day; year_entry.Changed += HandleValueChanged; month_entry.Changed += HandleValueChanged; day_entry.Changed += HandleValueChanged; Add (year_entry); Add (new Label ("-")); Add (month_entry); Add (new Label ("-")); Add (day_entry); } public override QueryValue QueryValue { get { return query_value; } set { year_entry.Changed -= HandleValueChanged; month_entry.Changed -= HandleValueChanged; day_entry.Changed -= HandleValueChanged; query_value = value as DateQueryValue; year_entry.Value = (double) query_value.DateTime.Year; month_entry.Value = (double) query_value.DateTime.Month; day_entry.Value = (double) query_value.DateTime.Day; year_entry.Changed += HandleValueChanged; month_entry.Changed += HandleValueChanged; day_entry.Changed += HandleValueChanged; } } protected void HandleValueChanged (object o, EventArgs args) { try { DateTime dt = new DateTime (year_entry.ValueAsInt, month_entry.ValueAsInt, day_entry.ValueAsInt); query_value.SetValue (dt); } catch { Log.Debug ("Caught exception raised because of invalid date"); } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Query.Gui/QueryValueEntry.cs0000644000175000017500000000704611420634720025216 0ustar00rubenruben00000000000000// // QueryValueEntry.cs // // Authors: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using Hyena.Query; using Gtk; namespace Hyena.Query.Gui { public abstract class QueryValueEntry : HBox { private static Dictionary types = new Dictionary (); protected int DefaultWidth { get { return 170; } } public QueryValueEntry () : base () { Spacing = 5; } public abstract QueryValue QueryValue { get; set; } public static QueryValueEntry Create (QueryValue qv) { Type qv_type = qv.GetType (); Type entry_type = null; foreach (KeyValuePair pair in types) { if (pair.Value == qv_type) { entry_type = pair.Key; break; } } // If we don't have an entry type that's exactly for our type, take a more generic one if (entry_type == null) { foreach (KeyValuePair pair in types) { if (qv_type.IsSubclassOf (pair.Value)) { entry_type = pair.Key; break; } } } if (entry_type != null) { QueryValueEntry entry = Activator.CreateInstance (entry_type) as QueryValueEntry; entry.QueryValue = qv; return entry; } return null; } public static void AddSubType (Type entry_type, Type query_value_type) { types[entry_type] = query_value_type; } public static Type GetValueType (QueryValueEntry entry) { return types [entry.GetType ()]; } static QueryValueEntry () { AddSubType (typeof(StringQueryValueEntry), typeof(StringQueryValue)); AddSubType (typeof(IntegerQueryValueEntry), typeof(IntegerQueryValue)); AddSubType (typeof(DateQueryValueEntry), typeof(DateQueryValue)); AddSubType (typeof(FileSizeQueryValueEntry), typeof(FileSizeQueryValue)); AddSubType (typeof(TimeSpanQueryValueEntry), typeof(TimeSpanQueryValue)); AddSubType (typeof(RelativeTimeSpanQueryValueEntry), typeof(RelativeTimeSpanQueryValue)); AddSubType (typeof(NullQueryValueEntry), typeof(NullQueryValue)); } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Query.Gui/QueryTermBox.cs0000644000175000017500000002071711420634720024500 0ustar00rubenruben00000000000000// // QueryTermBox.cs // // Authors: // Aaron Bockover // Gabriel Burt // // Copyright (C) 2005-2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Text; using System.Collections.Generic; using Gtk; using Hyena; using Hyena.Query; namespace Hyena.Query.Gui { public class QueryTermBox { private Button add_button; private Button remove_button; public event EventHandler AddRequest; public event EventHandler RemoveRequest; private QueryField field; private List value_entries = new List (); private List operators = new List (); private Dictionary operator_entries = new Dictionary (); private QueryValueEntry current_value_entry; private Operator op; private QueryField [] sorted_fields; private ComboBox field_chooser; public ComboBox FieldChooser { get { return field_chooser; } } private ComboBox op_chooser; public ComboBox OpChooser { get { return op_chooser; } } private HBox value_box; public HBox ValueEntry { get { return value_box; } } private HBox button_box; public HBox Buttons { get { return button_box; } } public QueryTermBox (QueryField [] sorted_fields) : base () { this.sorted_fields = sorted_fields; BuildInterface (); } private void BuildInterface () { field_chooser = ComboBox.NewText (); field_chooser.Changed += HandleFieldChanged; op_chooser = ComboBox.NewText (); op_chooser.RowSeparatorFunc = IsRowSeparator; op_chooser.Changed += HandleOperatorChanged; value_box = new HBox (); remove_button = new Button (new Image ("gtk-remove", IconSize.Button)); remove_button.Relief = ReliefStyle.None; remove_button.Clicked += OnButtonRemoveClicked; add_button = new Button (new Image ("gtk-add", IconSize.Button)); add_button.Relief = ReliefStyle.None; add_button.Clicked += OnButtonAddClicked; button_box = new HBox (); button_box.PackStart (remove_button, false, false, 0); button_box.PackStart (add_button, false, false, 0); foreach (QueryField field in sorted_fields) { field_chooser.AppendText (field.Label); } Show (); field_chooser.Active = 0; } private bool IsRowSeparator (TreeModel model, TreeIter iter) { return String.IsNullOrEmpty (model.GetValue (iter, 0) as string); } public void Show () { field_chooser.ShowAll (); op_chooser.ShowAll (); value_box.ShowAll (); button_box.ShowAll (); } private bool first = true; private void SetValueEntry (QueryValueEntry entry) { if (first) { first = false; } else { value_box.Remove (value_box.Children [0]); } current_value_entry = entry; value_box.PackStart (current_value_entry, false, true, 0); current_value_entry.ShowAll (); } private void HandleFieldChanged (object o, EventArgs args) { if (field_chooser.Active < 0 || field_chooser.Active >= sorted_fields.Length) return; QueryField field = sorted_fields [field_chooser.Active]; // Leave everything as is unless the new field is a different type if (this.field != null && (field.ValueTypes.Length == 1 && this.field.ValueTypes.Length == 1 && field.ValueTypes[0] == this.field.ValueTypes[0])) { this.field = field; return; } op_chooser.Changed -= HandleOperatorChanged; this.field = field; // Remove old type's operators while (op_chooser.Model.IterNChildren () > 0) { op_chooser.RemoveText (0); } // Add new field's operators int val_count = 0; value_entries.Clear (); operators.Clear (); operator_entries.Clear (); foreach (QueryValue val in this.field.CreateQueryValues ()) { QueryValueEntry entry = QueryValueEntry.Create (val); value_entries.Add (entry); if (val_count++ > 0) { op_chooser.AppendText (String.Empty); operators.Add (null); } foreach (Operator op in val.OperatorSet) { op_chooser.AppendText (op.Label); operators.Add (op); operator_entries [op] = entry; } } SetValueEntry (value_entries[0]); // TODO: If we have the same operator that was previously selected, select it op_chooser.Changed += HandleOperatorChanged; op_chooser.Active = 0; } private void HandleOperatorChanged (object o, EventArgs args) { if (op_chooser.Active < 0 || op_chooser.Active >= operators.Count) { return; } this.op = operators [op_chooser.Active]; if (operator_entries [this.op] != current_value_entry) { SetValueEntry (operator_entries [this.op]); } //value_entry = new QueryValueEntry (); } private void OnButtonAddClicked (object o, EventArgs args) { EventHandler handler = AddRequest; if (handler != null) handler (this, new EventArgs ()); } private void OnButtonRemoveClicked (object o, EventArgs args) { EventHandler handler = RemoveRequest; if (handler != null) handler (this, new EventArgs ()); } public bool CanDelete { get { return remove_button.Sensitive; } set { remove_button.Sensitive = value; } } public QueryTermNode QueryNode { get { QueryTermNode node = new QueryTermNode (); node.Field = field; node.Operator = op; node.Value = current_value_entry.QueryValue; return node; } set { QueryTermNode node = value; if (node == null) { return; } field_chooser.Active = Array.IndexOf (sorted_fields, node.Field); op_chooser.Active = operators.IndexOf (node.Operator); current_value_entry.QueryValue = node.Value; /*foreach (QueryValueEntry entry in value_entries) { if (QueryValueEntry.GetValueType (entry) == node.Value.GetType ()) { Console.WriteLine ("In QueryTermBox, setting QueryNode, got matching value types, value is {0}, empty? {1}", node.Value.ToString (), node.Value.IsEmpty); entry.QueryValue = node.Value; SetValueEntry (entry); break; } }*/ } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Query.Gui/NullQueryValueEntry.cs0000644000175000017500000000312111420634720026037 0ustar00rubenruben00000000000000// // NullQueryValueEntry.cs // // Authors: // Gabriel Burt // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using Hyena.Query; using Gtk; namespace Hyena.Query.Gui { public class NullQueryValueEntry : QueryValueEntry { protected NullQueryValue query_value; public NullQueryValueEntry () : base () { } public override QueryValue QueryValue { get { return query_value; } set { query_value = value as NullQueryValue; } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Makefile.am0000644000175000017500000001233311467745411020712 0ustar00rubenruben00000000000000ASSEMBLY = Hyena.Gui ASSEMBLY_BUILD_FLAGS = -unsafe TARGET = library LINK = -r:ICSharpCode.SharpZipLib -r:Mono.Posix -r:System -r:System.Core -r:Mono.Cairo \ $(GTKSHARP_LIBS) $(GLIBSHARP_LIBS) \ -r:$(DIR_BIN)/Hyena.dll SOURCES = \ Hyena.Data.Gui/Accessibility/ColumnCellAccessible.cs \ Hyena.Data.Gui/Accessibility/ColumnCellTextAccessible.cs \ Hyena.Data.Gui/Accessibility/ColumnHeaderCellTextAccessible.cs \ Hyena.Data.Gui/Accessibility/ICellAccessibleParent.cs \ Hyena.Data.Gui/Accessibility/ListViewAccessible.cs \ Hyena.Data.Gui/Accessibility/ListViewAccessible_Selection.cs \ Hyena.Data.Gui/Accessibility/ListViewAccessible_Table.cs \ Hyena.Data.Gui/CellContext.cs \ Hyena.Data.Gui/Column.cs \ Hyena.Data.Gui/ColumnCell.cs \ Hyena.Data.Gui/ColumnCellCheckBox.cs \ Hyena.Data.Gui/ColumnCellRating.cs \ Hyena.Data.Gui/ColumnCellText.cs \ Hyena.Data.Gui/ColumnController.cs \ Hyena.Data.Gui/ColumnHeaderCellText.cs \ Hyena.Data.Gui/DataViewLayout.cs \ Hyena.Data.Gui/DataViewLayoutGrid.cs \ Hyena.Data.Gui/IHeaderCell.cs \ Hyena.Data.Gui/IInteractiveCell.cs \ Hyena.Data.Gui/IListView.cs \ Hyena.Data.Gui/ISizeRequestCell.cs \ Hyena.Data.Gui/ITextCell.cs \ Hyena.Data.Gui/ITooltipCell.cs \ Hyena.Data.Gui/ListView/ListView.cs \ Hyena.Data.Gui/ListView/ListView_Accessible.cs \ Hyena.Data.Gui/ListView/ListView_DragAndDrop.cs \ Hyena.Data.Gui/ListView/ListView_Header.cs \ Hyena.Data.Gui/ListView/ListView_Interaction.cs \ Hyena.Data.Gui/ListView/ListView_Model.cs \ Hyena.Data.Gui/ListView/ListView_Rendering.cs \ Hyena.Data.Gui/ListView/ListView_Windowing.cs \ Hyena.Data.Gui/ListView/ListViewBase.cs \ Hyena.Data.Gui/ListViewTestModule.cs \ Hyena.Data.Gui/ObjectListView.cs \ Hyena.Data.Gui/RowActivatedHandler.cs \ Hyena.Data.Gui/SortableColumn.cs \ Hyena.Gui.Canvas/AnimationManager.cs \ Hyena.Gui.Canvas/Brush.cs \ Hyena.Gui.Canvas/CanvasHost.cs \ Hyena.Gui.Canvas/CanvasItem.cs \ Hyena.Gui.Canvas/CanvasItemCollection.cs \ Hyena.Gui.Canvas/CanvasManager.cs \ Hyena.Gui.Canvas/FixedPanel.cs \ Hyena.Gui.Canvas/FontWeight.cs \ Hyena.Gui.Canvas/FpsCalculator.cs \ Hyena.Gui.Canvas/ICanvasHost.cs \ Hyena.Gui.Canvas/Image.cs \ Hyena.Gui.Canvas/ImageBrush.cs \ Hyena.Gui.Canvas/MarginStyle.cs \ Hyena.Gui.Canvas/Orientation.cs \ Hyena.Gui.Canvas/Panel.cs \ Hyena.Gui.Canvas/Point.cs \ Hyena.Gui.Canvas/Prelight.cs \ Hyena.Gui.Canvas/Rect.cs \ Hyena.Gui.Canvas/ShadowMarginStyle.cs \ Hyena.Gui.Canvas/Size.cs \ Hyena.Gui.Canvas/Slider.cs \ Hyena.Gui.Canvas/StackPanel.cs \ Hyena.Gui.Canvas/TestTile.cs \ Hyena.Gui.Canvas/TextBlock.cs \ Hyena.Gui.Canvas/TextWrap.cs \ Hyena.Gui.Canvas/Thickness.cs \ Hyena.Gui.Dialogs/ExceptionDialog.cs \ Hyena.Gui.Dialogs/VersionInformationDialog.cs \ Hyena.Gui.Theatrics/Actor.cs \ Hyena.Gui.Theatrics/Choreographer.cs \ Hyena.Gui.Theatrics/Pulsator.cs \ Hyena.Gui.Theatrics/SingleActorStage.cs \ Hyena.Gui.Theatrics/Stage.cs \ Hyena.Gui.Theatrics/Tests/ChoreographerTests.cs \ Hyena.Gui.Theming/GtkColors.cs \ Hyena.Gui.Theming/GtkTheme.cs \ Hyena.Gui.Theming/Theme.cs \ Hyena.Gui.Theming/ThemeContext.cs \ Hyena.Gui.Theming/ThemeEngine.cs \ Hyena.Gui.Theming/ThemeTestModule.cs \ Hyena.Gui/ActionManager.cs \ Hyena.Gui/BaseWidgetAccessible.cs \ Hyena.Gui/CairoDamageDebugger.cs \ Hyena.Gui/CairoExtensions.cs \ Hyena.Gui/CleanRoomStartup.cs \ Hyena.Gui/CompositeUtils.cs \ Hyena.Gui/Contrast.cs \ Hyena.Gui/DragDropList.cs \ Hyena.Gui/EditableEraseAction.cs \ Hyena.Gui/EditableInsertAction.cs \ Hyena.Gui/EditableUndoAdapter.cs \ Hyena.Gui/GtkUtilities.cs \ Hyena.Gui/GtkWorkarounds.cs \ Hyena.Gui/HyenaActionGroup.cs \ Hyena.Gui/PangoCairoHelper.cs \ Hyena.Gui/PangoExtensions.cs \ Hyena.Gui/PixbufImageSurface.cs \ Hyena.Gui/RatingRenderer.cs \ Hyena.Gui/ShadingTestWindow.cs \ Hyena.Gui/TestModuleAttribute.cs \ Hyena.Gui/TestModuleRunner.cs \ Hyena.Gui/TooltipSetter.cs \ Hyena.Query.Gui/DateQueryValueEntry.cs \ Hyena.Query.Gui/FileSizeQueryValueEntry.cs \ Hyena.Query.Gui/IntegerQueryValueEntry.cs \ Hyena.Query.Gui/NullQueryValueEntry.cs \ Hyena.Query.Gui/QueryBox.cs \ Hyena.Query.Gui/QueryDebugger.cs \ Hyena.Query.Gui/QueryLimitBox.cs \ Hyena.Query.Gui/QueryTermBox.cs \ Hyena.Query.Gui/QueryTermsBox.cs \ Hyena.Query.Gui/QueryValueEntry.cs \ Hyena.Query.Gui/RelativeTimeSpanQueryValueEntry.cs \ Hyena.Query.Gui/StringQueryValueEntry.cs \ Hyena.Query.Gui/TimeSpanQueryValueEntry.cs \ Hyena.Widgets/AnimatedBox.cs \ Hyena.Widgets/AnimatedHBox.cs \ Hyena.Widgets/AnimatedImage.cs \ Hyena.Widgets/AnimatedVBox.cs \ Hyena.Widgets/AnimatedWidget.cs \ Hyena.Widgets/ComplexMenuItem.cs \ Hyena.Widgets/EntryPopup.cs \ Hyena.Widgets/GenericToolItem.cs \ Hyena.Widgets/GrabHandle.cs \ Hyena.Widgets/HigMessageDialog.cs \ Hyena.Widgets/ImageButton.cs \ Hyena.Widgets/MenuButton.cs \ Hyena.Widgets/MessageBar.cs \ Hyena.Widgets/PulsingButton.cs \ Hyena.Widgets/RatingEntry.cs \ Hyena.Widgets/RatingMenuItem.cs \ Hyena.Widgets/RoundedFrame.cs \ Hyena.Widgets/ScrolledWindow.cs \ Hyena.Widgets/SegmentedBar.cs \ Hyena.Widgets/SimpleTable.cs \ Hyena.Widgets/SmoothScrolledWindow.cs \ Hyena.Widgets/TextViewEditable.cs \ Hyena.Widgets/WrapLabel.cs include $(top_srcdir)/build/build.mk EXTRA_DIST += Hyena.Gui.dll.config module_SCRIPTS += Hyena.Gui.dll.config f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Dialogs/0000777000175000017500000000000011503407410022011 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Dialogs/ExceptionDialog.cs0000644000175000017500000002006211420634720025416 0ustar00rubenruben00000000000000// // ExceptionDialog.cs // // Author: // Aaron Bockover // // Copyright (C) 2005-2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Reflection; using System.Resources; using System.Diagnostics; using System.Collections.Generic; using System.IO; using Mono.Unix; using Gtk; namespace Hyena.Gui.Dialogs { public class ExceptionDialog : Dialog { private AccelGroup accel_group; private string debugInfo; public ExceptionDialog(Exception e) : base() { debugInfo = BuildExceptionMessage(e); HasSeparator = false; BorderWidth = 5; Resizable = false; //Translators: {0} is substituted with the application name Title = String.Format(Catalog.GetString("{0} Encountered a Fatal Error"), ApplicationContext.ApplicationName); VBox.Spacing = 12; ActionArea.Layout = ButtonBoxStyle.End; accel_group = new AccelGroup(); AddAccelGroup(accel_group); HBox hbox = new HBox(false, 12); hbox.BorderWidth = 5; VBox.PackStart(hbox, false, false, 0); Image image = new Image(Stock.DialogError, IconSize.Dialog); image.Yalign = 0.0f; hbox.PackStart(image, true, true, 0); VBox label_vbox = new VBox(false, 0); label_vbox.Spacing = 12; hbox.PackStart(label_vbox, false, false, 0); Label label = new Label(String.Format("{0}", GLib.Markup.EscapeText(Title))); label.UseMarkup = true; label.Justify = Justification.Left; label.LineWrap = true; label.SetAlignment(0.0f, 0.5f); label_vbox.PackStart(label, false, false, 0); label = new Label(e.Message); label.UseMarkup = true; label.UseUnderline = false; label.Justify = Gtk.Justification.Left; label.LineWrap = true; label.Selectable = true; label.SetAlignment(0.0f, 0.5f); label_vbox.PackStart(label, false, false, 0); Label details_label = new Label(String.Format("{0}", GLib.Markup.EscapeText(Catalog.GetString("Error Details")))); details_label.UseMarkup = true; Expander details_expander = new Expander("Details"); details_expander.LabelWidget = details_label; label_vbox.PackStart(details_expander, true, true, 0); ScrolledWindow scroll = new ScrolledWindow(); TextView view = new TextView(); scroll.HscrollbarPolicy = PolicyType.Automatic; scroll.VscrollbarPolicy = PolicyType.Automatic; scroll.AddWithViewport(view); scroll.SetSizeRequest(450, 250); view.Editable = false; view.Buffer.Text = debugInfo; details_expander.Add(scroll); hbox.ShowAll(); AddButton(Stock.Close, ResponseType.Close, true); } private void AddButton(string stock_id, Gtk.ResponseType response, bool is_default) { Button button = new Button(stock_id); button.CanDefault = true; button.Show (); AddActionWidget(button, response); if(is_default) { DefaultResponse = response; button.AddAccelerator("activate", accel_group, (uint)Gdk.Key.Return, 0, AccelFlags.Visible); } } private string BuildExceptionMessage(Exception e) { System.Text.StringBuilder msg = new System.Text.StringBuilder(); msg.Append(Catalog.GetString("An unhandled exception was thrown: ")); Stack exception_chain = new Stack (); while (e != null) { exception_chain.Push (e); e = e.InnerException; } while (exception_chain.Count > 0) { e = exception_chain.Pop (); msg.AppendFormat ("{0}\n\n{1}\n", e.Message, e.StackTrace); }; msg.Append("\n"); msg.AppendFormat(".NET Version: {0}\n", Environment.Version); msg.AppendFormat("OS Version: {0}\n", Environment.OSVersion); msg.Append("\nAssembly Version Information:\n\n"); foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { AssemblyName name = asm.GetName(); msg.AppendFormat("{0} ({1})\n", name.Name, name.Version); } if(Environment.OSVersion.Platform != PlatformID.Unix) { return msg.ToString(); } try { msg.AppendFormat("\nPlatform Information: {0}", BuildPlatformString()); msg.Append("\n\nDisribution Information:\n\n"); Dictionary lsb = LsbVersionInfo.Harvest; foreach(string lsbfile in lsb.Keys) { msg.AppendFormat("[{0}]\n", lsbfile); msg.AppendFormat("{0}\n", lsb[lsbfile]); } } catch { } return msg.ToString(); } private string BuildPlatformString() { ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.Arguments = "-sirom"; startInfo.RedirectStandardOutput = true; startInfo.RedirectStandardError = true; startInfo.UseShellExecute = false; foreach(string unameprog in new string [] { "/usr/bin/uname", "/bin/uname", "/usr/local/bin/uname", "/sbin/uname", "/usr/sbin/uname", "/usr/local/sbin/uname"}) { try { startInfo.FileName = unameprog; Process uname = Process.Start(startInfo); return uname.StandardOutput.ReadLine().Trim(); } catch(Exception) { continue; } } return null; } private class LsbVersionInfo { private string [] filesToCheck = { "*-release", "slackware-version", "debian_version" }; private Dictionary harvest = new Dictionary(); public LsbVersionInfo() { foreach(string pattern in filesToCheck) { foreach(string filename in Directory.GetFiles("/etc/", pattern)) { using(FileStream fs = File.OpenRead(filename)) { harvest[filename] = (new StreamReader(fs)).ReadToEnd(); } } } } public Dictionary Findings { get { return harvest; } } public static Dictionary Harvest { get { return (new LsbVersionInfo()).Findings; } } } } } f-spot-0.8.2/lib/Hyena/Hyena.Gui/Hyena.Gui.Dialogs/VersionInformationDialog.cs0000644000175000017500000001043511420634720027316 0ustar00rubenruben00000000000000// // VersionInformationDialog.cs // // Author: // Aaron Bockover // // Copyright (C) 2005-2007 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Reflection; using Gtk; using Mono.Unix; namespace Hyena.Gui.Dialogs { public class VersionInformationDialog : Dialog { private Label path_label; private TreeView version_tree; private TreeStore version_store; public VersionInformationDialog() : base() { AccelGroup accel_group = new AccelGroup(); AddAccelGroup(accel_group); Modal = true; Button button = new Button("gtk-close"); button.CanDefault = true; button.UseStock = true; button.Show(); DefaultResponse = ResponseType.Close; button.AddAccelerator("activate", accel_group, (uint)Gdk.Key.Escape, 0, Gtk.AccelFlags.Visible); AddActionWidget(button, ResponseType.Close); Title = Catalog.GetString("Assembly Version Information"); BorderWidth = 10; version_tree = new TreeView(); version_tree.RulesHint = true; version_tree.AppendColumn(Catalog.GetString("Assembly Name"), new CellRendererText(), "text", 0); version_tree.AppendColumn(Catalog.GetString("Version"), new CellRendererText(), "text", 1); version_tree.Model = FillStore(); version_tree.CursorChanged += OnCursorChanged; ScrolledWindow scroll = new ScrolledWindow(); scroll.Add(version_tree); scroll.ShadowType = ShadowType.In; scroll.SetSizeRequest(420, 200); VBox.PackStart(scroll, true, true, 0); VBox.Spacing = 5; path_label = new Label(); path_label.Ellipsize = Pango.EllipsizeMode.End; path_label.Hide(); path_label.Xalign = 0.0f; path_label.Yalign = 1.0f; VBox.PackStart(path_label, false, true, 0); scroll.ShowAll(); } private void OnCursorChanged(object o, EventArgs args) { TreeIter iter; if(!version_tree.Selection.GetSelected(out iter)) { path_label.Hide(); return; } object path = version_store.GetValue(iter, 2); if(path == null) { path_label.Hide(); return; } path_label.Text = path as string; path_label.Show(); } private TreeStore FillStore() { version_store = new TreeStore(typeof(string), typeof(string), typeof(string)); foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { string loc; AssemblyName name = asm.GetName(); try { loc = System.IO.Path.GetFullPath(asm.Location); } catch(Exception) { loc = "dynamic"; } version_store.AppendValues(name.Name, name.Version.ToString(), loc); } version_store.SetSortColumnId(0, SortType.Ascending); return version_store; } } } f-spot-0.8.2/lib/Hyena/build/0000777000175000017500000000000011503407401016151 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/build/GConfSchemaExtractor.cs0000644000175000017500000001275611377757710022544 0ustar00rubenruben00000000000000using System; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Collections.Generic; using System.Reflection; public class GConfSchemaExtractor { private static Dictionary entries = new Dictionary(); private static int schema_count = 0; public static void Main(string [] args) { Assembly asm = Assembly.LoadFrom(args[0]); foreach(Type type in asm.GetTypes()) { foreach(FieldInfo field in type.GetFields()) { if(field.FieldType.IsGenericType && field.FieldType.GetGenericTypeDefinition().Name.StartsWith("SchemaEntry")) { if(field.Name == "Zero") { continue; } object schema = field.GetValue(null); AddSchemaEntry(schema.GetType().GetField("DefaultValue").GetValue(schema), GetString(schema, "Namespace"), GetString(schema, "Key"), GetString(schema, "ShortDescription"), GetString(schema, "LongDescription") ); } } } if(schema_count > 0) { StringBuilder final = new StringBuilder(); final.Append("\n"); final.Append("\n"); final.Append(" \n"); List keys = new List(entries.Keys); keys.Sort(); foreach(string key in keys) { final.Append(entries[key]); } final.Append(" \n"); final.Append("\n"); using(StreamWriter writer = new StreamWriter(args[1])) { writer.Write(final.ToString()); } } } private static string GetString(object o, string name) { FieldInfo field = o.GetType().GetField(name); return (string)field.GetValue(o); } private static string GetValueString(Type type, object o, out string gctype) { if(type == typeof(bool)) { gctype = "bool"; return o == null ? null : o.ToString().ToLower(); } else if(type == typeof(int)) { gctype = "int"; } else if(type == typeof(float) || type == typeof(double)) { gctype = "float"; } else if(type == typeof(string)) { gctype = "string"; } else { throw new Exception("Unsupported type '" + type + "'"); } return o == null ? null : o.ToString(); } private static void AddSchemaEntry(object value, string namespce, string key, string short_desc, string long_desc) { schema_count++; string full_key = CreateKey(namespce, key); bool list = value.GetType().IsArray; Type type = list ? Type.GetTypeArray((object [])value)[0] : value.GetType(); string str_val = null; string str_type = null; if(list) { if(value == null || ((object [])value).Length == 0) { GetValueString(type, null, out str_type); str_val = "[]"; } else { str_val = "["; object [] arr = (object [])value; for(int i = 0; i < arr.Length; i++) { str_val += GetValueString(type, arr[i], out str_type).Replace(",", "\\,"); if(i < arr.Length - 1) { str_val += ","; } } str_val += "]"; } } else { str_val = GetValueString(type, value, out str_type); } StringBuilder builder = new StringBuilder(); builder.AppendFormat(" \n"); builder.AppendFormat(" /schemas{0}\n", full_key); builder.AppendFormat(" {0}\n", full_key); builder.AppendFormat(" banshee\n"); if(!list) { builder.AppendFormat(" {0}\n", str_type); } else { builder.AppendFormat(" list\n"); builder.AppendFormat(" {0}\n", str_type); } builder.AppendFormat(" {0}\n", str_val); builder.AppendFormat(" \n"); builder.AppendFormat(" {0}\n", short_desc); builder.AppendFormat(" {0}\n", long_desc); builder.AppendFormat(" \n"); builder.AppendFormat(" \n"); entries.Add(full_key, builder); } private static string CamelCaseToUnderCase(string s) { string undercase = String.Empty; string [] tokens = Regex.Split(s, "([A-Z]{1}[a-z]+)"); for(int i = 0; i < tokens.Length; i++) { if(tokens[i] == String.Empty) { continue; } undercase += tokens[i].ToLower(); if(i < tokens.Length - 2) { undercase += "_"; } } return undercase; } private static string CreateKey(string namespce, string key) { return namespce == null ? "/apps/banshee/" + CamelCaseToUnderCase(key) : "/apps/banshee/" + CamelCaseToUnderCase(namespce.Replace(".", "/")) + "/" + CamelCaseToUnderCase(key); } } f-spot-0.8.2/lib/Hyena/build/DllMapVerifier.cs0000644000175000017500000002017611377757710021373 0ustar00rubenruben00000000000000using System; using System.IO; using System.Xml; using System.Text; using System.Collections.Generic; public static class DllMapVerifier { private struct DllImportRef { public DllImportRef (string name, int line, int column) { Name = name; Line = line; Column = column; } public string Name; public int Line; public int Column; } private static Dictionary> dll_imports = new Dictionary> (); private static List ignore_dlls = new List (); private static List config_dlls = null; public static int Main (string [] args) { LoadConfigDlls (args[0]); foreach (string file in args) { LoadDllImports (file); } return VerifyDllImports (args[0]) ? 0 : 1; } private static bool VerifyDllImports (string configFile) { int total_unmapped_count = 0; foreach (KeyValuePair> dll_import in dll_imports) { int file_unmapped_count = 0; foreach (DllImportRef dll_import_ref in dll_import.Value) { if (config_dlls != null && config_dlls.Contains (dll_import_ref.Name)) { continue; } if (file_unmapped_count++ == 0) { Console.Error.WriteLine ("Unmapped DLLs in file: {0}", dll_import.Key); } Console.Error.WriteLine (" + {0} : {1},{2}", dll_import_ref.Name, dll_import_ref.Line, dll_import_ref.Column); } total_unmapped_count += file_unmapped_count; } if (total_unmapped_count > 0) { Console.Error.WriteLine (); Console.Error.WriteLine (" If any DllImport above is explicitly allowed to be unmapped,"); Console.Error.WriteLine (" add an 'willfully unmapped' comment to the inside of the attribute:"); Console.Error.WriteLine (); Console.Error.WriteLine (" [DllImport (\"libX11.so.6\") /* willfully unmapped */]"); Console.Error.WriteLine (); } if (total_unmapped_count > 0 && config_dlls == null) { Console.Error.WriteLine ("No config file for DLL mapping was found ({0})", configFile); } return total_unmapped_count == 0; } private static void LoadDllImports (string csFile) { if (csFile.StartsWith ("-i")) { ignore_dlls.Add (csFile.Substring (2)); return; } if (Path.GetExtension (csFile) == ".cs" && File.Exists (csFile)) { List dll_import_refs = null; foreach (DllImportRef dll_import in ParseFileForDllImports (csFile)) { if (ignore_dlls.Contains (dll_import.Name)) { continue; } if (dll_import_refs == null) { dll_import_refs = new List (); } dll_import_refs.Add (dll_import); } if (dll_import_refs != null) { dll_imports.Add (csFile, dll_import_refs); } } } private static void LoadConfigDlls (string configFile) { try { XmlTextReader config = new XmlTextReader (configFile); config_dlls = new List (); while (config.Read ()) { if (config.NodeType == XmlNodeType.Element && config.Name == "dllmap") { string dll = config.GetAttribute ("dll"); if (!config_dlls.Contains (dll)) { config_dlls.Add (dll); } } } } catch { } } #region DllImport parser private static StreamReader reader; private static int reader_line; private static int reader_col; private static IEnumerable ParseFileForDllImports (string file) { reader_line = 1; reader_col = 1; using (reader = new StreamReader (file)) { char c; bool in_paren = false; bool in_attr = false; bool in_dll_attr = false; bool in_string = false; bool in_comment = false; int dll_line = 1, dll_col = 1; string dll_string = null; string dll_comment = null; while ((c = (char)reader.Peek ()) != Char.MaxValue) { switch (c) { case ' ': case '\t': Read (); break; case '[': in_attr = true; dll_string = null; dll_comment = null; dll_line = reader_line; dll_col = reader_col; Read (); break; case '(': Read (); in_paren = true; break; case ')': Read (); in_paren = false; break; case '"': Read (); if (dll_string == null && in_dll_attr && in_paren && !in_string) { in_string = true; } break; case '/': Read (); if ((char)reader.Peek () == '*') { Read (); if (in_dll_attr && !in_comment) { in_comment = true; } } break; case ']': if (in_dll_attr && dll_string != null && dll_comment != "willfully unmapped") { yield return new DllImportRef (dll_string, dll_line, dll_col); } in_attr = false; in_dll_attr = false; Read (); break; default: if (!in_dll_attr && in_attr && ReadDllAttribute ()) { in_dll_attr = true; } else if (in_dll_attr && in_string) { dll_string = ReadDllString (); in_string = false; } else if (in_dll_attr && in_comment) { dll_comment = ReadDllComment (); in_comment = false; } else { Read (); } break; } } } } private static bool ReadDllAttribute () { return Read () == 'D' && Read () == 'l' && Read () == 'l' && Read () == 'I' && Read () == 'm' && Read () == 'p' && Read () == 'o' && Read () == 'r' && Read () == 't'; } private static string ReadDllString () { StringBuilder builder = new StringBuilder (32); while (true) { char c = Read (); if (Char.IsLetterOrDigit (c) || c == '.' || c == '-' || c == '_') { builder.Append (c); } else { break; } } return builder.ToString (); } private static string ReadDllComment () { StringBuilder builder = new StringBuilder (); char lc = Char.MaxValue; while (true) { char c = Read (); if (c == Char.MaxValue || (c == '/' && lc == '*')) { break; } else if (lc != Char.MaxValue) { builder.Append (lc); } lc = c; } return builder.ToString ().Trim (); } private static char Read () { char c = (char)reader.Read (); if (c == '\n') { reader_line++; reader_col = 1; } else { reader_col++; } return c; } #endregion } f-spot-0.8.2/lib/Hyena/build/gconf-schema-rules0000644000175000017500000000106711377757710021602 0ustar00rubenruben00000000000000schema_in_files = $(ASSEMBLY_GCONF_SCHEMA) schemadir = $(GCONF_SCHEMA_FILE_DIR) schema_DATA = $(schema_in_files:.schemas.in=.schemas) $(srcdir)/$(ASSEMBLY_GCONF_SCHEMA): $(ASSEMBLY) if test -w $@ -o \( ! -e $@ -a -w $(srcdir) \); then \ BANSHEE_DISABLE_GCONF=1 MONO_PATH=$(MONO_BASE_PATH) $(MONO) $(top_builddir)/build/gconf-schema-extractor.exe $< $(srcdir)/$@; \ fi @INTLTOOL_SCHEMAS_RULE@ if GCONF_SCHEMAS_INSTALL install-data-local: if [ -z "$(DESTDIR)" ]; then \ GCONF_CONFIG_SOURCE="" $(GCONFTOOL) --makefile-install-rule $(schema_DATA); \ fi endif f-spot-0.8.2/lib/Hyena/build/AddinXmlStringExtractor.cs0000644000175000017500000000261711377757710023311 0ustar00rubenruben00000000000000using System; using System.Xml.XPath; using System.Collections.Generic; public static class AddinXmlStringExtract { public static void Main (string [] args) { var queries = new [] { "/Addin/@name", "/Addin/@description", "/Addin/@category" }; Console.WriteLine (@"// Generated - Do Not Edit! internal static class AddinXmlStringCatalog { private static void Strings () {"); var paths = new List (args); paths.Sort (); foreach (var path in paths) { Console.WriteLine (" // {0}", path); var xpath = new XPathDocument (path); var nav = xpath.CreateNavigator (); foreach (var query in queries) { var iter = nav.Select (query); while (iter.MoveNext ()) { var value = iter.Current.Value.Trim (); if (String.IsNullOrEmpty (value) || value[0] == '@' || (iter.Current.Name == "category" && value.StartsWith ("required:"))) { continue; } Console.WriteLine (@" Catalog.GetString (@""{0}"");", value.Replace (@"""", @"""""")); } } Console.WriteLine (); } Console.WriteLine (" }\n}"); } } f-spot-0.8.2/lib/Hyena/build/icon-theme-installer0000755000175000017500000001217511377757710022150 0ustar00rubenruben00000000000000#!/usr/bin/env bash # icon-theme-installer # Copyright (C) 2006 Novell, Inc. # Written by Aaron Bockover # Licensed under the MIT/X11 license # # This script is meant to be invoked from within a Makefile/Makefile.am # in the install-data-local and uninstall-data sections. It handles the # task of properly installing icons into the icon theme. It requires a # few arguments to set up its environment, and a list of files to be # installed. The format of the file list is critical: # # , # # apps,music-player-banshee.svg # apps,music-player-banshee-16.png # apps,music-player-banshee-22.png # # is the icon theme category, for instance, apps, devices, # actions, emblems... # # must have a basename in the form of: # # proper-theme-name[-]. # # Where should be either nothing, which will default to scalable # or \-[0-9]{2}, which will expand to x. For example: # # music-player-banshee-16.png # # The here is -16 and will expand to 16x16 per the icon theme spec # # What follows is an example Makefile.am for icon theme installation: # # --------------- # theme=hicolor # themedir=$(datadir)/icons/$(theme) # theme_icons = \ # apps,music-player-banshee.svg \ # apps,music-player-banshee-16.png \ # apps,music-player-banshee-22.png \ # apps,music-player-banshee-24.png \ # apps,music-player-banshee-32.png # # install_icon_exec = $(top_srcdir)/build/icon-theme-installer -t $(theme) -s $(srcdir) -d "x$(DESTDIR)" -b $(themedir) -m "$(mkinstalldirs)" -x "$(INSTALL_DATA)" # install-data-local: # $(install_icon_exec) -i $(theme_icons) # # uninstall-hook: # $(install_icon_exec) -u $(theme_icons) # # MAINTAINERCLEANFILES = Makefile.in # EXTRA_DIST = $(wildcard *.svg *.png) # --------------- # # Arguments to this program: # # -i : Install # -u : Uninstall # -t : Theme name (hicolor) # -b : Theme installation dest directory [x$(DESTDIR)] - Always prefix # this argument with x; it will be stripped but will act as a # placeholder for zero $DESTDIRs (only set by packagers) # -d : Theme installation directory [$(hicolordir)] # -s : Source directory [$(srcdir)] # -m : Command to exec for directory creation [$(mkinstalldirs)] # -x : Command to exec for single file installation [$(INSTALL_DATA)] # : All remainging should be category,filename pairs while getopts "iut:b:d:s:m:x:" flag; do case "$flag" in i) INSTALL=yes ;; u) UNINSTALL=yes ;; t) THEME_NAME=$OPTARG ;; d) INSTALL_DEST_DIR=${OPTARG##x} ;; b) INSTALL_BASE_DIR=$OPTARG ;; s) SRC_DIR=$OPTARG ;; m) MKINSTALLDIRS_EXEC=$OPTARG ;; x) INSTALL_DATA_EXEC=$OPTARG ;; esac done shift $(($OPTIND - 1)) if test "x$INSTALL" = "xyes" -a "x$UNINSTALL" = "xyes"; then echo "Cannot pass both -i and -u" exit 1 elif test "x$INSTALL" = "x" -a "x$UNINSTALL" = "x"; then echo "Must path either -i or -u" exit 1 fi if test -z "$THEME_NAME"; then echo "Theme name required (-t hicolor)" exit 1 fi if test -z "$INSTALL_BASE_DIR"; then echo "Base theme directory required [-d \$(hicolordir)]" exit 1 fi if test ! -x $(echo "$MKINSTALLDIRS_EXEC" | cut -f1 -d' '); then echo "Cannot find '$MKINSTALLDIRS_EXEC'; You probably want to pass -m \$(mkinstalldirs)" exit 1 fi if test ! -x $(echo "$INSTALL_DATA_EXEC" | cut -f1 -d' '); then echo "Cannot find '$INSTALL_DATA_EXEC'; You probably want to pass -x \$(INSTALL_DATA)" exit 1 fi if test -z "$SRC_DIR"; then SRC_DIR=. fi for icon in $@; do size=$(echo $icon | sed s/[^0-9]*//g) category=$(echo $icon | cut -d, -f1) build_name=$(echo $icon | cut -d, -f2) install_name=$(echo $build_name | sed "s/[0-9]//g; s/-\././") install_name=$(basename $install_name) if test -z $size; then size=scalable; else size=${size}x${size}; fi install_dir=${INSTALL_DEST_DIR}${INSTALL_BASE_DIR}/$size/$category install_path=$install_dir/$install_name if test "x$INSTALL" = "xyes"; then echo "Installing $size $install_name into $THEME_NAME icon theme" $($MKINSTALLDIRS_EXEC $install_dir) || { echo "Failed to create directory $install_dir" exit 1 } $($INSTALL_DATA_EXEC $SRC_DIR/$build_name $install_path) || { echo "Failed to install $SRC_DIR/$build_name into $install_path" exit 1 } if test ! -e $install_path; then echo "Failed to install $SRC_DIR/$build_name into $install_path" exit 1 fi else if test -e $install_path; then echo "Removing $size $install_name from $THEME_NAME icon theme" rm $install_path || { echo "Failed to remove $install_path" exit 1 } fi fi done gtk_update_icon_cache_bin="$((which gtk-update-icon-cache || echo /opt/gnome/bin/gtk-update-icon-cache)2>/dev/null)" gtk_update_icon_cache="$gtk_update_icon_cache_bin -f -t $INSTALL_BASE_DIR" if test -z "$INSTALL_DEST_DIR"; then if test -x $gtk_update_icon_cache_bin; then echo "Updating GTK icon cache" $gtk_update_icon_cache else echo "*** Icon cache not updated. Could not execute $gtk_update_icon_cache_bin" fi else echo "*** Icon cache not updated. After (un)install, run this:" echo "*** $gtk_update_icon_cache" fi f-spot-0.8.2/lib/Hyena/build/GObjectIntPtrCtorVerifier.cs0000644000175000017500000000207111377757710023522 0ustar00rubenruben00000000000000using System; using System.Reflection; public static class GObjectIntPtrCtorVerifier { public static void Main (string [] args) { foreach (var path in args) { Verify (path); } } private static void Verify (string path) { foreach (var type in Assembly.LoadFrom (path).GetTypes ()) { if (!type.IsSubclassOf (typeof (GLib.Object))) { continue; } bool safe = false; foreach (var ctor in type.GetConstructors (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) { var args = ctor.GetParameters (); if ((safe = (ctor.Attributes & (MethodAttributes.Public | MethodAttributes.Family)) != 0 && args != null && args.Length == 1 && args[0].ParameterType == typeof (IntPtr))) { break; } } if (!safe) { Console.WriteLine (type); } } } } f-spot-0.8.2/lib/Hyena/build/m4/0000777000175000017500000000000011503407401016471 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/build/m4/shamrock/0000777000175000017500000000000011503407401020300 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/build/m4/shamrock/mono.m40000644000175000017500000000256211377757710021537 0ustar00rubenruben00000000000000AC_DEFUN([SHAMROCK_FIND_MONO_1_0_COMPILER], [ SHAMROCK_FIND_PROGRAM_OR_BAIL(MCS, mcs) ]) AC_DEFUN([SHAMROCK_FIND_MONO_2_0_COMPILER], [ SHAMROCK_FIND_PROGRAM_OR_BAIL(MCS, gmcs) ]) AC_DEFUN([SHAMROCK_FIND_MONO_4_0_COMPILER], [ SHAMROCK_FIND_PROGRAM_OR_BAIL(MCS, dmcs) ]) AC_DEFUN([SHAMROCK_FIND_MONO_RUNTIME], [ SHAMROCK_FIND_PROGRAM_OR_BAIL(MONO, mono) ]) AC_DEFUN([SHAMROCK_CHECK_MONO_MODULE], [ PKG_CHECK_MODULES(MONO_MODULE, mono >= $1) ]) AC_DEFUN([SHAMROCK_CHECK_MONO_MODULE_NOBAIL], [ PKG_CHECK_MODULES(MONO_MODULE, mono >= $1, HAVE_MONO_MODULE=yes, HAVE_MONO_MODULE=no) AC_SUBST(HAVE_MONO_MODULE) ]) AC_DEFUN([_SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES], [ for asm in $(echo "$*" | cut -d, -f2- | sed 's/\,/ /g') do AC_MSG_CHECKING([for Mono $1 GAC for $asm.dll]) if test \ -e "$($PKG_CONFIG --variable=libdir mono)/mono/$1/$asm.dll" -o \ -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/$1/$asm.dll"; \ then \ AC_MSG_RESULT([found]) else AC_MSG_RESULT([not found]) AC_MSG_ERROR([missing required Mono $1 assembly: $asm.dll]) fi done ]) AC_DEFUN([SHAMROCK_CHECK_MONO_1_0_GAC_ASSEMBLIES], [ _SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES(1.0, $*) ]) AC_DEFUN([SHAMROCK_CHECK_MONO_2_0_GAC_ASSEMBLIES], [ _SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES(2.0, $*) ]) AC_DEFUN([SHAMROCK_CHECK_MONO_4_0_GAC_ASSEMBLIES], [ _SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES(4.0, $*) ]) f-spot-0.8.2/lib/Hyena/build/m4/shamrock/expansions.m40000644000175000017500000000146611377757710022760 0ustar00rubenruben00000000000000AC_DEFUN([SHAMROCK_EXPAND_LIBDIR], [ expanded_libdir=`( case $prefix in NONE) prefix=$ac_default_prefix ;; *) ;; esac case $exec_prefix in NONE) exec_prefix=$prefix ;; *) ;; esac eval echo $libdir )` AC_SUBST(expanded_libdir) ]) AC_DEFUN([SHAMROCK_EXPAND_BINDIR], [ expanded_bindir=`( case $prefix in NONE) prefix=$ac_default_prefix ;; *) ;; esac case $exec_prefix in NONE) exec_prefix=$prefix ;; *) ;; esac eval echo $bindir )` AC_SUBST(expanded_bindir) ]) AC_DEFUN([SHAMROCK_EXPAND_DATADIR], [ case $prefix in NONE) prefix=$ac_default_prefix ;; *) ;; esac case $exec_prefix in NONE) exec_prefix=$prefix ;; *) ;; esac expanded_datadir=`(eval echo $datadir)` expanded_datadir=`(eval echo $expanded_datadir)` AC_SUBST(expanded_datadir) ]) f-spot-0.8.2/lib/Hyena/build/m4/shamrock/util.m40000644000175000017500000000024311377757710021536 0ustar00rubenruben00000000000000AC_DEFUN([SHAMROCK_CONCAT], [ $1="$$1 $$2" ]) AC_DEFUN([SHAMROCK_CONCAT_MODULE], [ SHAMROCK_CONCAT($1_CFLAGS, $2_CFLAGS) SHAMROCK_CONCAT($1_LIBS, $2_LIBS) ]) f-spot-0.8.2/lib/Hyena/build/m4/shamrock/programs.m40000644000175000017500000000036111377757710022414 0ustar00rubenruben00000000000000AC_DEFUN([SHAMROCK_FIND_PROGRAM], [ AC_PATH_PROG($1, $2, $3) AC_SUBST($1) ]) AC_DEFUN([SHAMROCK_FIND_PROGRAM_OR_BAIL], [ SHAMROCK_FIND_PROGRAM($1, $2, no) if test "x$$1" = "xno"; then AC_MSG_ERROR([You need to install '$2']) fi ]) f-spot-0.8.2/lib/Hyena/build/m4/shamrock/monodoc.m40000644000175000017500000000146511377757710022226 0ustar00rubenruben00000000000000AC_DEFUN([SHAMROCK_CHECK_MONODOC], [ AC_ARG_ENABLE(docs, AC_HELP_STRING([--disable-docs], [Do not build documentation]), , enable_docs=yes) if test "x$enable_docs" = "xyes"; then AC_PATH_PROG(MONODOCER, monodocer, no) if test "x$MONODOCER" = "xno"; then AC_MSG_ERROR([You need to install monodoc, or pass --disable-docs to configure to skip documentation installation]) fi AC_PATH_PROG(MDASSEMBLER, mdassembler, no) if test "x$MDASSEMBLER" = "xno"; then AC_MSG_ERROR([You need to install mdassembler, or pass --disable-docs to configure to skip documentation installation]) fi DOCDIR=`$PKG_CONFIG monodoc --variable=sourcesdir` AC_SUBST(DOCDIR) AM_CONDITIONAL(BUILD_DOCS, true) else AC_MSG_NOTICE([not building ${PACKAGE} API documentation]) AM_CONDITIONAL(BUILD_DOCS, false) fi ]) f-spot-0.8.2/lib/Hyena/build/m4/shamrock/i18n.m40000644000175000017500000000053611377757710021345 0ustar00rubenruben00000000000000AC_DEFUN([SHAMROCK_CONFIGURE_I18N], [ ALL_LINGUAS=`grep -v '^#' $srcdir/po/LINGUAS | $SED ':a;N;$!ba;s/\n/ /g; s/[ ]+/ /g' | xargs` GETTEXT_PACKAGE=$1 AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Gettext Package]) AM_GLIB_GNU_GETTEXT AC_SUBST([CONFIG_STATUS_DEPENDENCIES],['$(top_srcdir)/po/LINGUAS']) ]) f-spot-0.8.2/lib/Hyena/build/m4/shamrock/nunit.m40000644000175000017500000000141511377757710021720 0ustar00rubenruben00000000000000AC_DEFUN([SHAMROCK_CHECK_NUNIT], [ NUNIT_REQUIRED=2.4.7 AC_ARG_ENABLE(tests, AC_HELP_STRING([--enable-tests], [Enable NUnit tests]), enable_tests=$enableval, enable_tests="no") if test "x$enable_tests" = "xno"; then do_tests=no AM_CONDITIONAL(ENABLE_TESTS, false) else PKG_CHECK_MODULES(NUNIT, nunit >= $NUNIT_REQUIRED, do_tests="yes", do_tests="no") AC_SUBST(NUNIT_LIBS) AM_CONDITIONAL(ENABLE_TESTS, test "x$do_tests" = "xyes") if test "x$do_tests" = "xno"; then PKG_CHECK_MODULES(NUNIT, mono-nunit >= 2.4, do_tests="yes", do_tests="no") AC_SUBST(NUNIT_LIBS) AM_CONDITIONAL(ENABLE_TESTS, test "x$do_tests" = "xyes") if test "x$do_tests" = "xno"; then AC_MSG_WARN([Could not find nunit: tests will not be available]) fi fi fi ]) f-spot-0.8.2/lib/Hyena/build/m4/Makefile.in0000644000175000017500000003406011503407236020543 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib/Hyena/build/m4 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ $(srcdir)/shamrock/*.m4 MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/Hyena/build/m4/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/Hyena/build/m4/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/lib/Hyena/build/m4/Makefile.am0000644000175000017500000000011511377757710020542 0ustar00rubenruben00000000000000EXTRA_DIST = \ $(srcdir)/shamrock/*.m4 MAINTAINERCLEANFILES = Makefile.in f-spot-0.8.2/lib/Hyena/build/TranslatorExtractor.cs0000644000175000017500000001104111377757710022542 0ustar00rubenruben00000000000000// // Licensed under same license as Banshee // Copyright (C) 2006 Novell, Inc. // Written by Aaron Bockover // // This tool extracts translator information from .po files // to generate information for display in the about dialog // using System; using System.IO; using System.Collections.Generic; using System.Text.RegularExpressions; public class TranslatorExtractor { public static void Main(string [] args) { Console.WriteLine(""); Console.WriteLine(""); Console.WriteLine(""); foreach(string filename in Directory.GetFiles(args.Length == 0 ? "." : args[0], "*.po")) { using(FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read)) { using(StreamReader reader = new StreamReader(stream)) { ParseFile(filename, reader); } } } Console.WriteLine(""); } private static void ParseFile(string file, TextReader reader) { Dictionary names = new Dictionary(); string language_code = Path.GetFileNameWithoutExtension(file); string language_name = null; bool past_plural_forms = false; while(true) { string line = reader.ReadLine(); if(line == null || (line.StartsWith("#:") && past_plural_forms)) { break; } else if(line.StartsWith("\"Plural-Forms:")) { past_plural_forms = true; } try { Match match = Regex.Match(line, ".*#(.*)<(.*)>(.*,.*|[ \n]*$)"); if(!match.Success) { match = Regex.Match(line, ".*\\\"Last-Translator:(.*)<(.*)>.*"); if(!match.Success) { match = Regex.Match(line, ".*\\\"Language-Team:(.*)<.*>.*"); if(!match.Success) { continue; } language_name = match.Groups[1].Value.Trim(); int pos = language_name.IndexOf('('); if(pos > 0) { language_name = language_name.Substring(0, pos).Trim(); } pos = language_name.IndexOf("GNOME"); if(pos > 0) { language_name = language_name.Substring(0, pos).Trim(); } } } string name = match.Groups[1].Value.Trim(); string email = match.Groups[2].Value.Trim(); if(name == String.Empty || email == String.Empty || name == "FIRST AUTHOR") { continue; } else if(name.StartsWith("Maintainer:")) { name = name.Substring(11).Trim(); } if(!names.ContainsKey(email)) { bool skip = false; foreach(string iter_name in names.Values) { if(String.Compare(iter_name, name, true) == 0) { skip = true; break; } } if(!skip) { names.Add(email, name); } } } catch { continue; } } // hack for banshee, remove if used elsewhere if(language_code == "sr") { return; } else if(language_code == "sr@latin") { language_code = "sr"; } // end special // override language names from extracted switch(language_code) { case "ca": language_name = "Catalan"; break; case "zh_CN": language_name = "Simplified Chinese"; break; case "es": language_name = "Spanish"; break; case "fr": language_name = "French"; break; default: break; } Console.WriteLine(" ", language_code, language_name); List sorted_names = new List (names.Values); sorted_names.Sort (); foreach(string name in sorted_names) { Console.WriteLine(" {0}", name.Replace("\"", """)); } Console.WriteLine(" "); } } f-spot-0.8.2/lib/Hyena/build/dll-map-makefile-verifier0000755000175000017500000000040511377757710023030 0ustar00rubenruben00000000000000#!/usr/bin/env bash if [ -f $2 ]; then # Lame, but better than nothing grep $(basename $2) $1 | grep module_SCRIPTS &>/dev/null || { echo "Assembly has corresponding .config file, but it was not found in module_SCRIPTS in Makefile.am" 2>&1 exit 1 } fi f-spot-0.8.2/lib/Hyena/build/pkg-config/0000777000175000017500000000000011503407401020175 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Hyena/build/pkg-config/Makefile.in0000644000175000017500000004112611503407237022251 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib/Hyena/build/pkg-config DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(pkgconfigdir)" DATA = $(pkgconfig_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @HYENA_PKG_CONFIG_TRUE@pkgconfigdir = $(libdir)/pkgconfig @HYENA_PKG_CONFIG_TRUE@pkgconfig_in_files = $(wildcard hyena*.pc.in) @HYENA_PKG_CONFIG_TRUE@pkgconfig_DATA = $(pkgconfig_in_files:.pc.in=.pc) @HYENA_PKG_CONFIG_TRUE@EXTRA_DIST = $(pkgconfig_in_files) @HYENA_PKG_CONFIG_TRUE@CLEANFILES = $(pkgconfig_DATA) @HYENA_PKG_CONFIG_TRUE@MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/Hyena/build/pkg-config/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/Hyena/build/pkg-config/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(pkgconfigdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgconfigDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgconfigDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-pkgconfigDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am uninstall-pkgconfigDATA @HYENA_PKG_CONFIG_TRUE@%.pc: %.pc.in @HYENA_PKG_CONFIG_TRUE@ sed "s,\@VERSION\@,$(VERSION),g; s,\@prefix\@,$(prefix),g; s,\@libdir\@,$(libdir),g; s,\@PACKAGE\@,$(PACKAGE),g" < $< > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/lib/Hyena/build/pkg-config/Makefile.am0000644000175000017500000000061711420634721022236 0ustar00rubenruben00000000000000if HYENA_PKG_CONFIG pkgconfigdir = $(libdir)/pkgconfig pkgconfig_in_files = $(wildcard hyena*.pc.in) pkgconfig_DATA = $(pkgconfig_in_files:.pc.in=.pc) %.pc: %.pc.in sed "s,\@VERSION\@,$(VERSION),g; s,\@prefix\@,$(prefix),g; s,\@libdir\@,$(libdir),g; s,\@PACKAGE\@,$(PACKAGE),g" < $< > $@ EXTRA_DIST = $(pkgconfig_in_files) CLEANFILES = $(pkgconfig_DATA) MAINTAINERCLEANFILES = Makefile.in endif f-spot-0.8.2/lib/Hyena/build/private-icon-theme-installer0000755000175000017500000000115111377757710023610 0ustar00rubenruben00000000000000#!/usr/bin/env bash mkinstalldirs=$1; shift install_data=$1; shift action=$1; shift dest_dir=$1; shift src_dir=$1; shift for icon in $@; do dest_dir_build="${dest_dir}/icons/hicolor/$(dirname ${icon})" if [[ ${action} == "-i" || ${action} == "-il" ]]; then src_file="${src_dir}/ThemeIcons/${icon}" $mkinstalldirs "${dest_dir_build}" &>/dev/null if [[ ${action} == "-i" ]]; then echo "Installing private icon theme icon: ${icon}" fi $install_data "${src_file}" "${dest_dir_build}" else echo "Uninstalling private icon theme icon: ${icon}" rm -f "${dest_dir_build}/$(basename ${icon})" fi done f-spot-0.8.2/lib/Hyena/build/Makefile.in0000644000175000017500000006270411503407236020231 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @GCONF_SCHEMAS_INSTALL_TRUE@am__append_1 = $(GCONF_SCHEMA_EXTRACTOR_ASSEMBLY) subdir = lib/Hyena/build DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(bansheedir)" SCRIPTS = $(banshee_SCRIPTS) SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = m4 pkg-config GCONF_SCHEMA_EXTRACTOR_ASSEMBLY = gconf-schema-extractor.exe TRANSLATOR_EXTRACTOR_ASSEMBLY = translator-extractor.exe DLL_MAP_VERIFIER_ASSEMBLY = dll-map-verifier.exe ADDIN_XML_STRING_EXTRACTOR_ASSEMBLY = addin-xml-string-extractor.exe GOBJECT_INTPTR_CTOR_VERIFIER_ASSEMBLY = gobject-intptr-ctor-verifier.exe ALL_TARGETS = $(DLL_MAP_VERIFIER_ASSEMBLY) \ $(ADDIN_XML_STRING_EXTRACTOR_ASSEMBLY) \ $(GOBJECT_INTPTR_CTOR_VERIFIER_ASSEMBLY) $(am__append_1) #ALL_TARGETS += $(TRANSLATOR_EXTRACTOR_ASSEMBLY) @GCONF_SCHEMAS_INSTALL_TRUE@bansheedir = $(pkglibdir) @GCONF_SCHEMAS_INSTALL_TRUE@banshee_SCRIPTS = $(GCONF_SCHEMA_EXTRACTOR_ASSEMBLY) EXTRA_DIST = \ icon-theme-installer \ private-icon-theme-installer \ GConfSchemaExtractor.cs \ TranslatorExtractor.cs \ DllMapVerifier.cs \ AddinXmlStringExtractor.cs \ GObjectIntPtrCtorVerifier.cs \ dll-map-makefile-verifier \ gconf-schema-rules CLEANFILES = *.exe *.mdb MAINTAINERCLEANFILES = Makefile.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/Hyena/build/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/Hyena/build/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-bansheeSCRIPTS: $(banshee_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(bansheedir)" || $(MKDIR_P) "$(DESTDIR)$(bansheedir)" @list='$(banshee_SCRIPTS)'; test -n "$(bansheedir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bansheedir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bansheedir)$$dir" || exit $$?; \ } \ ; done uninstall-bansheeSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(banshee_SCRIPTS)'; test -n "$(bansheedir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bansheedir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bansheedir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(SCRIPTS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bansheedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-bansheeSCRIPTS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-bansheeSCRIPTS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-bansheeSCRIPTS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am \ uninstall-bansheeSCRIPTS @GCONF_SCHEMAS_INSTALL_TRUE@$(GCONF_SCHEMA_EXTRACTOR_ASSEMBLY): GConfSchemaExtractor.cs @GCONF_SCHEMAS_INSTALL_TRUE@ $(MCS) -out:$@ $< all: $(ALL_TARGETS) # $(TRANSLATOR_EXTRACTOR_ASSEMBLY): TranslatorExtractor.cs # if [ "x$(top_srcdir)" = "x$(top_builddir)" ]; then \ # $(MCS) -out:$@ $< && LC_ALL=en_US.UTF-8 $(MONO) $@ $(top_builddir)/po > \ # $(top_srcdir)/src/Core/Banshee.Core/Resources/translators.xml; \ # fi; $(DLL_MAP_VERIFIER_ASSEMBLY): DllMapVerifier.cs $(MCS) -out:$@ $< $(ADDIN_XML_STRING_EXTRACTOR_ASSEMBLY): AddinXmlStringExtractor.cs $(MCS) -r:System.Xml -out:$@ $< $(GOBJECT_INTPTR_CTOR_VERIFIER_ASSEMBLY): GObjectIntPtrCtorVerifier.cs $(MCS) $(GLIBSHARP_LIBS) -out:$@ $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/lib/Hyena/build/Makefile.am0000644000175000017500000000314011441732606020210 0ustar00rubenruben00000000000000SUBDIRS = m4 pkg-config GCONF_SCHEMA_EXTRACTOR_ASSEMBLY = gconf-schema-extractor.exe TRANSLATOR_EXTRACTOR_ASSEMBLY = translator-extractor.exe DLL_MAP_VERIFIER_ASSEMBLY = dll-map-verifier.exe ADDIN_XML_STRING_EXTRACTOR_ASSEMBLY = addin-xml-string-extractor.exe GOBJECT_INTPTR_CTOR_VERIFIER_ASSEMBLY = gobject-intptr-ctor-verifier.exe ALL_TARGETS = $(DLL_MAP_VERIFIER_ASSEMBLY) $(ADDIN_XML_STRING_EXTRACTOR_ASSEMBLY) $(GOBJECT_INTPTR_CTOR_VERIFIER_ASSEMBLY) #ALL_TARGETS += $(TRANSLATOR_EXTRACTOR_ASSEMBLY) if GCONF_SCHEMAS_INSTALL bansheedir = $(pkglibdir) banshee_SCRIPTS = $(GCONF_SCHEMA_EXTRACTOR_ASSEMBLY) ALL_TARGETS += $(GCONF_SCHEMA_EXTRACTOR_ASSEMBLY) $(GCONF_SCHEMA_EXTRACTOR_ASSEMBLY): GConfSchemaExtractor.cs $(MCS) -out:$@ $< endif all: $(ALL_TARGETS) # $(TRANSLATOR_EXTRACTOR_ASSEMBLY): TranslatorExtractor.cs # if [ "x$(top_srcdir)" = "x$(top_builddir)" ]; then \ # $(MCS) -out:$@ $< && LC_ALL=en_US.UTF-8 $(MONO) $@ $(top_builddir)/po > \ # $(top_srcdir)/src/Core/Banshee.Core/Resources/translators.xml; \ # fi; $(DLL_MAP_VERIFIER_ASSEMBLY): DllMapVerifier.cs $(MCS) -out:$@ $< $(ADDIN_XML_STRING_EXTRACTOR_ASSEMBLY): AddinXmlStringExtractor.cs $(MCS) -r:System.Xml -out:$@ $< $(GOBJECT_INTPTR_CTOR_VERIFIER_ASSEMBLY): GObjectIntPtrCtorVerifier.cs $(MCS) $(GLIBSHARP_LIBS) -out:$@ $< EXTRA_DIST = \ icon-theme-installer \ private-icon-theme-installer \ GConfSchemaExtractor.cs \ TranslatorExtractor.cs \ DllMapVerifier.cs \ AddinXmlStringExtractor.cs \ GObjectIntPtrCtorVerifier.cs \ dll-map-makefile-verifier \ gconf-schema-rules CLEANFILES = *.exe *.mdb MAINTAINERCLEANFILES = Makefile.in f-spot-0.8.2/lib/Hyena/Makefile.in0000644000175000017500000005433311503407235017130 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib/Hyena DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ COPYING NEWS ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = \ build \ Hyena \ Hyena.Data.Sqlite \ Hyena.Gui @ENABLE_TESTS_TRUE@TEST_ASSEMBLIES = \ @ENABLE_TESTS_TRUE@ Hyena.dll \ @ENABLE_TESTS_TRUE@ Hyena.Data.Sqlite.dll \ @ENABLE_TESTS_TRUE@ Hyena.Gui.dll @ENABLE_TESTS_TRUE@ENV_OPTIONS = TZ=America/Chicago LC_ALL=it_IT LANG=it_IT @ENABLE_TESTS_TRUE@NUNIT_CONSOLE = $$(echo $$(which nunit-console2 || which nunit-console)) @ENABLE_TESTS_TRUE@RUNNER = for asm in $${TEST_ASSEMBLIES}; do echo -e "\033[1mRunning tests on $${asm}...\033[0m"; $(ENV_OPTIONS) $(NUNIT_CONSOLE) -nologo -noshadow $$asm; done MAINTAINERCLEANFILES = \ compile \ INSTALL \ config.h.in \ aclocal.m4 \ ltmain.sh \ Makefile.in \ depcomp \ missing \ install-sh \ configure \ config.sub \ config.guess \ intltool-extract.in \ intltool-merge.in \ intltool-update.in \ mkinstalldirs all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/Hyena/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/Hyena/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ clean-local ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am clean-local: rm -rf $(top_builddir)/bin @ENABLE_TESTS_TRUE@test: @ENABLE_TESTS_TRUE@ @pushd bin &>/dev/null; \ @ENABLE_TESTS_TRUE@ export TEST_ASSEMBLIES="$(TEST_ASSEMBLIES)"; $(RUNNER); \ @ENABLE_TESTS_TRUE@ popd &>/dev/null; @ENABLE_TESTS_FALSE@test: @ENABLE_TESTS_FALSE@ echo "Tests not enabled. Pass --enable-tests to configure or ./autogen.sh" # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/lib/Hyena/NEWS0000644000175000017500000000435011467745411015566 0ustar00rubenruben00000000000000========================== Version 0.5 - Oct 6, 2010 ========================== Add .config file to hyena.pc's Files variable ========================== Version 0.4 - Oct 5, 2010 ========================== General: * Update to build on Windows with MonoDevelop 2.2.1 * Disable CheckForOverflowUnderflow in many .csproj * Can now include hyena as a git submodule within other projects Hyena: * Bind gtk_show_uri (bgo#587320) * Add StringUtil.EscapeLike * Add stream based hashing * Add an ApplicationName property to ApplicationContext * New SafeUri class * New Hyena.Downloader namespace/API * New Paths class (bgo#605891) * Handle bad indices in MemoryListModel * Fix LruCache item expiration * Add thread id to Hyena.Log when debugging. * Fix file location queries (bgo#612152) * Make CryptoUtil.Md5Encode thread-safe * [Json] Add serializer * New Hyena.Metrics classes for instrumenting apps * More extensive platform detection probing * Bundle HttpUtility; dependency on System.Web (bgo#607713) Hyena.Gui * New ListView grid mode * Fix ListView a11y crasher (bgo#615892). * [Hyena.Gui] Fix ActionManager toolitem icon sizing bgo#609265 Hyena.Data.Sqlite: * Add HYENA_MD5 method * Extend SqliteConnection to handle double and nullable values. * Case-insensitive column checks * Add BinaryFunction class; Lets extensions etc call custom methods from SQL even if they're not loaded initially * Fix exception handling (bgo#609799) Contributors: Aaron Bockover, Alan McGovern, Alexander Kojevnikov, Anders Petersson, Andrés G. Aragoneses, Bertrand Lorentz, David Nielsen, Gabriel Burt, Ján Sokoly, Jeroen Budts, Mike Gemünde, Paul Lange, Pete Johanson, Ruben Vermeersch, Sandy Armstrong ========================== Version 0.3 - May 6, 2010 ========================== Synced with Banshee ========================== Version 0.2 - Sept 9, 2009 ========================== Contributors: Romain Tartière Bugs Fixed: * Build fix for *bsd * Fix dll mappings for *bsd ========================== Version 0.1 - Aug 18, 2009 ========================== * Initial release * Hyena, Hyena.Gui, and Hyena.Data.Sqlite built as separate assemblies and each with their own .pc file for convenient copying into your project. See README for details on using Hyena in your app. f-spot-0.8.2/lib/Hyena/Makefile.am0000644000175000017500000000170611467745411017125 0ustar00rubenruben00000000000000 SUBDIRS = \ build \ Hyena \ Hyena.Data.Sqlite \ Hyena.Gui clean-local: rm -rf $(top_builddir)/bin if ENABLE_TESTS TEST_ASSEMBLIES = \ Hyena.dll \ Hyena.Data.Sqlite.dll \ Hyena.Gui.dll ENV_OPTIONS = TZ=America/Chicago LC_ALL=it_IT LANG=it_IT NUNIT_CONSOLE = $$(echo $$(which nunit-console2 || which nunit-console)) RUNNER = for asm in $${TEST_ASSEMBLIES}; do echo -e "\033[1mRunning tests on $${asm}...\033[0m"; $(ENV_OPTIONS) $(NUNIT_CONSOLE) -nologo -noshadow $$asm; done test: @pushd bin &>/dev/null; \ export TEST_ASSEMBLIES="$(TEST_ASSEMBLIES)"; $(RUNNER); \ popd &>/dev/null; else test: echo "Tests not enabled. Pass --enable-tests to configure or ./autogen.sh" endif MAINTAINERCLEANFILES = \ compile \ INSTALL \ config.h.in \ aclocal.m4 \ ltmain.sh \ Makefile.in \ depcomp \ missing \ install-sh \ configure \ config.sub \ config.guess \ intltool-extract.in \ intltool-merge.in \ intltool-update.in \ mkinstalldirs f-spot-0.8.2/lib/Hyena/README0000644000175000017500000000345611420634721015743 0ustar00rubenruben00000000000000This is a library of useful GUI and non-GUI C# code, originally used in Banshee. NOTE ** It is not API stable, and so is not installed to the GAC.** There are three ways to use Hyena in your app: 1) Require it as an external dep; copy its .dll files into your project Applications using it should make a local copy of whatever components you use. That is, you should consider Hyena a build-time dependency, not a run-time, since at run-time your app will contain a copy of Hyena. There are variables defined in the pkg-config files that contain assemblies and files needed for a given component of Hyena (eg hyena, hyena.data.sqlite, and hyena.gui). pkg-config --variable=Assemblies hyena pkg-config --variable=Files hyena You can look at PDF Mod for an example of how to use Hyena: http://git.gnome.org/cgit/pdfmod/tree/configure.ac http://git.gnome.org/cgit/pdfmod/tree/Makefile.am http://git.gnome.org/cgit/pdfmod/tree/src/Makefile.am 2) Include it as a submodule in your git repo This is advantageous if you want to closely track and maybe contribute back to Hyena. It also means developers don't have to install Hyena themselves from packages or git. git submodule add git://git.gnome.org/hyena lib/Hyena git submodule update --init git add .gitmodules Then you'll need to add Hyena to your build system. See Banshee's setup: http://git.gnome.org/cgit/banshee/tree/configure.ac http://git.gnome.org/cgit/banshee/tree/Makefile.am You can also include the appropriate .csproj in your .sln. Set them to build under the 'Submodule' configuration, and the binaries will get outputted to ../../bin from the Hyena checkout directory. 3) Bundle the .dll files in your project It's an expedient, but not good form for FOSS projects. f-spot-0.8.2/lib/Hyena/COPYING0000644000175000017500000000204511377757710016126 0ustar00rubenruben00000000000000Copyright (C) 2005-2010 Novell, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. f-spot-0.8.2/lib/GKeyFile/0000777000175000017500000000000011503407375015457 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/GKeyFile/GKeyFile.custom0000644000175000017500000001126411417267577020366 0ustar00rubenruben00000000000000/* * GKeyFile.custom * * Author(s): * Stephane Delcroix (stephane@delcroix.org) * * Copyright (c) 2008 Novell, Inc. * * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ public GKeyFile (string file, KeyFile.Flags flags) : this () { LoadFromFile (file, flags); } public GKeyFile (string file) : this (file, KeyFile.Flags.KeepComments) { } public string ToData () { ulong length; return ToData (out length); } public void Save (string filename) { byte [] content = System.Text.Encoding.Default.GetBytes (ToData ()); System.IO.FileStream stream = System.IO.File.Create (filename); stream.Write (content, 0, content.Length); stream.Close (); } public string [] GetKeys (string group_name) { ulong length; return GetKeys (group_name, out length); } public string [] GetGroups () { ulong length; return GetGroups (out length); } public string[] GetStringList(string group_name, string key) { ulong length; return GetStringList (group_name, key, out length); } [DllImport("libglib-2.0.dll")] static extern unsafe IntPtr g_key_file_get_boolean_list(IntPtr raw, IntPtr group_name, IntPtr key, out UIntPtr length, out IntPtr error); public unsafe bool[] GetBooleanList(string group_name, string key) { IntPtr native_group_name = GLib.Marshaller.StringToPtrGStrdup (group_name); IntPtr native_key = GLib.Marshaller.StringToPtrGStrdup (key); UIntPtr native_length; IntPtr error = IntPtr.Zero; IntPtr raw_ret = g_key_file_get_boolean_list(Handle, native_group_name, native_key, out native_length, out error); ulong length = (ulong) native_length; bool[] ret = new bool [(int)length]; int[] b_ret = new int [(int)length]; GLib.Marshaller.Free (native_group_name); GLib.Marshaller.Free (native_key); if (error != IntPtr.Zero) throw new GLib.GException (error); Marshal.Copy (raw_ret, b_ret, 0, (int)length); GLib.Marshaller.Free (raw_ret); for (int i=0; i < (int)length; i++) ret[i] = b_ret[i] != 0; return ret; } [DllImport("libglib-2.0.dll")] static extern unsafe IntPtr g_key_file_get_integer_list(IntPtr raw, IntPtr group_name, IntPtr key, out UIntPtr length, out IntPtr error); public unsafe int[] GetIntegerList(string group_name, string key) { IntPtr native_group_name = GLib.Marshaller.StringToPtrGStrdup (group_name); IntPtr native_key = GLib.Marshaller.StringToPtrGStrdup (key); UIntPtr native_length; IntPtr error = IntPtr.Zero; IntPtr raw_ret = g_key_file_get_integer_list(Handle, native_group_name, native_key, out native_length, out error); ulong length = (ulong) native_length; int[] ret = new int[(int)length]; GLib.Marshaller.Free (native_group_name); GLib.Marshaller.Free (native_key); if (error != IntPtr.Zero) throw new GLib.GException (error); Marshal.Copy (raw_ret, ret, 0, (int)length); GLib.Marshaller.Free (raw_ret); return ret; } [DllImport("libglib-2.0.dll")] static extern unsafe IntPtr g_key_file_get_double_list(IntPtr raw, IntPtr group_name, IntPtr key, out UIntPtr length, out IntPtr error); public unsafe double[] GetDoubleList(string group_name, string key) { IntPtr native_group_name = GLib.Marshaller.StringToPtrGStrdup (group_name); IntPtr native_key = GLib.Marshaller.StringToPtrGStrdup (key); UIntPtr native_length; IntPtr error = IntPtr.Zero; IntPtr raw_ret = g_key_file_get_double_list(Handle, native_group_name, native_key, out native_length, out error); ulong length = (ulong)native_length; double[] ret = new double[(int)length]; GLib.Marshaller.Free (native_group_name); GLib.Marshaller.Free (native_key); if (error != IntPtr.Zero) throw new GLib.GException (error); Marshal.Copy (raw_ret, ret, 0, (int)length); GLib.Marshaller.Free (raw_ret); return ret; } f-spot-0.8.2/lib/GKeyFile/gkeyfile-sharp-sources.xml0000644000175000017500000000037111417267577022605 0ustar00rubenruben00000000000000 /usr/include/glib-2.0/glib/gkeyfile.h f-spot-0.8.2/lib/GKeyFile/GKeyFile.metadata0000644000175000017500000000421711417267577020634 0ustar00rubenruben00000000000000 private n_list n_list n_list n_list private 1 private 1 private 1 1 1 1 1 f-spot-0.8.2/lib/GKeyFile/gkeyfile-api.xml0000644000175000017500000003464711503362442020554 0ustar00rubenruben00000000000000 f-spot-0.8.2/lib/GKeyFile/Makefile.in0000644000175000017500000004260711503407232017521 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile.include # FSpot wide helper # Directories VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/Makefile.include subdir = lib/GKeyFile ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(assemblydir)" DATA = $(assembly_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio LINK_GIOSHARP = -r:$(DIR_GIOSHARP)/gio-sharp.dll CSC_FLAGS = -debug CSC = $(MCS) $(CSC_FLAGS) -target:exe CSC_LIB = $(MCS) $(CSC_FLAGS) -target:library MONO_DEBUGFLAGS = --debug RUNTIME = mono $(MONO_DEBUGFLAGS) CUSTOMS = \ $(srcdir)/GKeyFile.custom ASSEMBLIES = \ -pkg:glib-sharp-2.0 assemblydir = $(pkglibdir) assembly_DATA = \ gkeyfile-sharp.dll CLEANFILES = \ gkeyfile-sharp.dll \ gkeyfile-sharp.dll.mdb \ gkeyfile-api.xml DISTCLEANFILES = \ generated/*.cs EXTRA_DIST = \ $(CUSTOMS) \ gkeyfile-api.raw \ GKeyFile.metadata \ gkeyfile-api.xml \ gkeyfile-sharp-sources.xml all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/GKeyFile/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/GKeyFile/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-assemblyDATA: $(assembly_DATA) @$(NORMAL_INSTALL) test -z "$(assemblydir)" || $(MKDIR_P) "$(DESTDIR)$(assemblydir)" @list='$(assembly_DATA)'; test -n "$(assemblydir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(assemblydir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(assemblydir)" || exit $$?; \ done uninstall-assemblyDATA: @$(NORMAL_UNINSTALL) @list='$(assembly_DATA)'; test -n "$(assemblydir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(assemblydir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(assemblydir)" && rm -f $$files tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(assemblydir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-assemblyDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-assemblyDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-assemblyDATA install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am uninstall-assemblyDATA all: gkeyfile-sharp.dll gkeyfile-api.raw: gkeyfile-sharp-sources.xml $(GAPI2PARSER) gkeyfile-sharp-sources.xml gkeyfile-api.xml: gkeyfile-api.raw GKeyFile.metadata @echo -e "\n*** Massaging the raw api into $@" cp gkeyfile-api.raw gkeyfile-api.xml chmod +w gkeyfile-api.xml $(GAPI2FIXUP) --api=gkeyfile-api.xml --metadata=GKeyFile.metadata generated/GKeyFile.cs: gkeyfile-api.xml $(CUSTOMS) $(GAPI2CODEGEN) @echo -e "\n*** Generating C# code" $(GAPI2CODEGEN) --outdir=generated --customdir=$(srcdir) --generate $(srcdir)/gkeyfile-api.xml gkeyfile-sharp.dll: generated/GKeyFile.cs $(CUSTOMS) $(CSC_LIB) -unsafe -out:$@ $(PKGS) $(ASSEMBLIES) $(builddir)/generated/*.cs # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/lib/GKeyFile/gkeyfile-api.raw0000644000175000017500000003432611417267577020560 0ustar00rubenruben00000000000000 f-spot-0.8.2/lib/GKeyFile/Makefile.am0000644000175000017500000000214211417267636017516 0ustar00rubenruben00000000000000include $(top_srcdir)/Makefile.include CUSTOMS = \ $(srcdir)/GKeyFile.custom ASSEMBLIES = \ -pkg:glib-sharp-2.0 all: gkeyfile-sharp.dll gkeyfile-api.raw: gkeyfile-sharp-sources.xml $(GAPI2PARSER) gkeyfile-sharp-sources.xml gkeyfile-api.xml: gkeyfile-api.raw GKeyFile.metadata @echo -e "\n*** Massaging the raw api into $@" cp gkeyfile-api.raw gkeyfile-api.xml chmod +w gkeyfile-api.xml $(GAPI2FIXUP) --api=gkeyfile-api.xml --metadata=GKeyFile.metadata generated/GKeyFile.cs: gkeyfile-api.xml $(CUSTOMS) $(GAPI2CODEGEN) @echo -e "\n*** Generating C# code" $(GAPI2CODEGEN) --outdir=generated --customdir=$(srcdir) --generate $(srcdir)/gkeyfile-api.xml gkeyfile-sharp.dll: generated/GKeyFile.cs $(CUSTOMS) $(CSC_LIB) -unsafe -out:$@ $(PKGS) $(ASSEMBLIES) $(builddir)/generated/*.cs assemblydir = $(pkglibdir) assembly_DATA = \ gkeyfile-sharp.dll CLEANFILES = \ gkeyfile-sharp.dll \ gkeyfile-sharp.dll.mdb \ gkeyfile-api.xml DISTCLEANFILES = \ generated/*.cs EXTRA_DIST = \ $(CUSTOMS) \ gkeyfile-api.raw \ GKeyFile.metadata \ gkeyfile-api.xml \ gkeyfile-sharp-sources.xml f-spot-0.8.2/lib/gtk-sharp-beans/0000777000175000017500000000000011503407400016773 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/gtk-sharp-beans/Priority.cs0000644000175000017500000000164211417267577021171 0ustar00rubenruben00000000000000// GLib.Priority.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the Lesser GNU General // Public License as published by the Free Software Foundation. // // 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this program; if not, write to the // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GLib { public enum Priority { High = -100, Default = 0, HighIdle = 100, DefaultIdle = 200, Low = 300, } } f-spot-0.8.2/lib/gtk-sharp-beans/Gtk.metadata0000644000175000017500000000025011417267577021242 0ustar00rubenruben00000000000000 GetIsShowing f-spot-0.8.2/lib/gtk-sharp-beans/PixbufFormat.cs0000644000175000017500000000227611417267577021762 0ustar00rubenruben00000000000000// Gdk.PixbufFormat.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the Lesser GNU General // Public License as published by the Free Software Foundation. // // 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this program; if not, write to the // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. using System; using System.Collections; using System.Runtime.InteropServices; namespace Gdk { public static class PixbufFormatExtensions { [DllImport("libgdk_pixbuf-2.0-0.dll")] static extern void gdk_pixbuf_format_set_disabled(IntPtr raw, bool disabled); public static void SetDisabled (this PixbufFormat format, bool value) { gdk_pixbuf_format_set_disabled(format.Handle, value); } } } f-spot-0.8.2/lib/gtk-sharp-beans/gtkbeans-api.raw0000644000175000017500000001365411417267577022107 0ustar00rubenruben00000000000000 f-spot-0.8.2/lib/gtk-sharp-beans/Format.cs0000644000175000017500000000225211417267577020576 0ustar00rubenruben00000000000000// Format.cs: Wrapper for the g_format code in Glib // // Authors: // Stephane Delcroix (stephane@delcroix.org) // // Copyright (c) 2008 Novell, Inc. // // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the Lesser GNU General // Public License as published by the Free Software Foundation. // // 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this program; if not, write to the // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. using System; using System.Runtime.InteropServices; namespace GLib { public class Format { [DllImport("libglib-2.0-0.dll")] static extern IntPtr g_format_size_for_display (long size); static public string SizeForDisplay (long size) { string result = Marshaller.PtrToStringGFree (g_format_size_for_display (size)); return result; } } } f-spot-0.8.2/lib/gtk-sharp-beans/PixbufLoader.cs0000644000175000017500000000253211417267577021733 0ustar00rubenruben00000000000000// Gdk.PixbufLoader.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the Lesser GNU General // Public License as published by the Free Software Foundation. // // 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this program; if not, write to the // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. using System; using System.Collections; using System.Runtime.InteropServices; namespace Gdk { public static class PixbufLoaderExtensions { [DllImport("libgdk_pixbuf-2.0-0.dll")] static extern unsafe bool gdk_pixbuf_loader_close(IntPtr raw, out IntPtr error); public static unsafe bool Close(this PixbufLoader loader, bool force) { IntPtr error = IntPtr.Zero; bool raw_ret = gdk_pixbuf_loader_close(loader.Handle, out error); bool ret = raw_ret; if (!force && error != IntPtr.Zero) throw new GLib.GException (error); return ret; } } } f-spot-0.8.2/lib/gtk-sharp-beans/ImageMenuItem.cs0000644000175000017500000000320211417267577022030 0ustar00rubenruben00000000000000// Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) // // Authors: // Sandy Armstrong // #if GTK_2_16 using System; using System.Runtime.InteropServices; namespace GtkBeans { public static class ImageMenuItemExtensions { [DllImport("libgtk-win32-2.0-0.dll")] static extern void gtk_image_menu_item_set_always_show_image(IntPtr raw, bool always_show); public static void SetAlwaysShowImage (this Gtk.ImageMenuItem item, bool always_show) { gtk_image_menu_item_set_always_show_image (item.Handle, always_show); } } } #endif f-spot-0.8.2/lib/gtk-sharp-beans/GtkBeans.metadata0000644000175000017500000000051411417267577022216 0ustar00rubenruben00000000000000 Builder BuilderError BuilderConnectFunc f-spot-0.8.2/lib/gtk-sharp-beans/Image.cs0000644000175000017500000000233311417267577020370 0ustar00rubenruben00000000000000// Gtk.Image.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the Lesser GNU General // Public License as published by the Free Software Foundation. // // 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this program; if not, write to the // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. using System; using System.Collections; using System.Runtime.InteropServices; using Gtk; namespace GtkBeans { public class Image { [DllImport("libgtk-win32-2.0-0.dll")] static extern IntPtr gtk_image_new_from_gicon(IntPtr icon, int size); public static Gtk.Image NewFromIcon (GLib.Icon icon, Gtk.IconSize size) { return new Gtk.Image (gtk_image_new_from_gicon(icon == null ? IntPtr.Zero : icon.Handle, (int) size)); } } } f-spot-0.8.2/lib/gtk-sharp-beans/Shell.cs0000644000175000017500000000237211417267577020420 0ustar00rubenruben00000000000000// GLib.Shell.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the Lesser GNU General // Public License as published by the Free Software Foundation. // // 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this program; if not, write to the // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. using System; using System.Runtime.InteropServices; namespace GLib { public class Shell { [DllImport ("libglib-2.0-0.dll")] static extern IntPtr g_shell_quote (IntPtr unquoted_string); public static string Quote (string unquoted) { IntPtr native_string = GLib.Marshaller.StringToPtrGStrdup (unquoted); string quoted = GLib.Marshaller.PtrToStringGFree (g_shell_quote (native_string)); GLib.Marshaller.Free (native_string); return quoted; } } } f-spot-0.8.2/lib/gtk-sharp-beans/Timeout.cs0000644000175000017500000000214011417267577020770 0ustar00rubenruben00000000000000// GLib.Timeout.cs - Timeout class implementation // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the Lesser GNU General // Public License as published by the Free Software Foundation. // // 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this program; if not, write to the // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. using System; using System.Collections; using System.Runtime.InteropServices; namespace GLib { static class TimeoutExtensions { public static uint AddSeconds (this Timeout timeout, uint interval, TimeoutHandler hndlr) { return Timeout.Add (1000 * interval, hndlr); } } } f-spot-0.8.2/lib/gtk-sharp-beans/Drawable.cs0000644000175000017500000000300711417267577021066 0ustar00rubenruben00000000000000// Gdk.Drawable.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the Lesser GNU General // Public License as published by the Free Software Foundation. // // 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this program; if not, write to the // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. using System; using System.Collections; using System.Runtime.InteropServices; namespace Gdk { public static class DrawableExtensions { [DllImport("libgdk-win32-2.0-0.dll")] static unsafe extern void gdk_draw_rgb_image_dithalign(IntPtr raw, IntPtr gc, int x, int y, int width, int height, int dith, byte* rgb_buf, int rowstride, int xdith, int ydith); public unsafe static void DrawRgbImageDithalign(this Drawable drawable, Gdk.GC gc, int x, int y, int width, int height, Gdk.RgbDither dith, byte* rgb_buf, int rowstride, int xdith, int ydith) { gdk_draw_rgb_image_dithalign(drawable.Handle, gc == null ? IntPtr.Zero : gc.Handle, x, y, width, height, (int) dith, rgb_buf, rowstride, xdith, ydith); } } } f-spot-0.8.2/lib/gtk-sharp-beans/gtk-api.raw0000644000175000017500000000344711417267577021075 0ustar00rubenruben00000000000000 f-spot-0.8.2/lib/gtk-sharp-beans/AssemblyInfo.cs0000644000175000017500000000027611417267577021745 0ustar00rubenruben00000000000000using System.Reflection; using System.Runtime.CompilerServices; [assembly:AssemblyVersion("2.14.0.0")] [assembly:AssemblyDelaySign(false)] [assembly:AssemblyKeyFile("gtk-sharp-beans.snk")] f-spot-0.8.2/lib/gtk-sharp-beans/gtk-sharp-beans.dll.config0000644000175000017500000000066511417267577023754 0ustar00rubenruben00000000000000 f-spot-0.8.2/lib/gtk-sharp-beans/Builder.custom0000644000175000017500000002727211417267577021652 0ustar00rubenruben00000000000000// Builder.custom - customizations to Gtk.Builder // // Authors: Stephane Delcroix // The biggest part of this code is adapted from glade#, by // Ricardo Fernández Pascual // Rachel Hestilow // // Copyright (c) 2008, 2009 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the Lesser GNU General // Public License as published by the Free Software Foundation. // // 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this program; if not, write to the // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. [System.Serializable] public class HandlerNotFoundException : SystemException { string handler_name; string signal_name; System.Reflection.EventInfo evnt; Type delegate_type; public HandlerNotFoundException (string handler_name, string signal_name, System.Reflection.EventInfo evnt, Type delegate_type) : this (handler_name, signal_name, evnt, delegate_type, null) { } public HandlerNotFoundException (string handler_name, string signal_name, System.Reflection.EventInfo evnt, Type delegate_type, Exception inner) : base ("No handler " + handler_name + " found for signal " + signal_name, inner) { this.handler_name = handler_name; this.signal_name = signal_name; this.evnt = evnt; this.delegate_type = delegate_type; } public HandlerNotFoundException (string message, string handler_name, string signal_name, System.Reflection.EventInfo evnt, Type delegate_type) : base ((message != null) ? message : "No handler " + handler_name + " found for signal " + signal_name, null) { this.handler_name = handler_name; this.signal_name = signal_name; this.evnt = evnt; this.delegate_type = delegate_type; } protected HandlerNotFoundException (System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base (info, context) { handler_name = info.GetString ("HandlerName"); signal_name = info.GetString ("SignalName"); evnt = info.GetValue ("Event", typeof (System.Reflection.EventInfo)) as System.Reflection.EventInfo; delegate_type = info.GetValue ("DelegateType", typeof (Type)) as Type; } public string HandlerName { get { return handler_name; } } public string SignalName { get { return signal_name; } } public System.Reflection.EventInfo Event { get { return evnt; } } public Type DelegateType { get { return delegate_type; } } public override void GetObjectData (System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) { base.GetObjectData (info, context); info.AddValue ("HandlerName", handler_name); info.AddValue ("SignalName", signal_name); info.AddValue ("Event", evnt); info.AddValue ("DelegateType", delegate_type); } } [AttributeUsage (AttributeTargets.Field)] public class ObjectAttribute : Attribute { private string name; private bool specified; public ObjectAttribute (string name) { specified = true; this.name = name; } public ObjectAttribute () { specified = false; } public string Name { get { return name; } } public bool Specified { get { return specified; } } } public IntPtr GetRawObject(string name) { IntPtr native_name = GLib.Marshaller.StringToPtrGStrdup (name); IntPtr raw_ret = gtk_builder_get_object(Handle, native_name); GLib.Marshaller.Free (native_name); return raw_ret; } public Builder (System.IO.Stream s) : this (s, null) { } public Builder (System.IO.Stream s, string translation_domain) { if (s == null) throw new ArgumentNullException ("s"); int size = (int) s.Length; byte[] buffer = new byte[size]; s.Read (buffer, 0, size); s.Close (); AddFromString(System.Text.Encoding.UTF8.GetString (buffer)); TranslationDomain = translation_domain; } public Builder (string resource_name) : this (resource_name, null) { } public Builder (string resource_name, string translation_domain) : this (System.Reflection.Assembly.GetEntryAssembly (), resource_name, translation_domain) { } public Builder (System.Reflection.Assembly assembly, string resource_name, string translation_domain) : this () { if (GetType() != typeof (Builder)) throw new InvalidOperationException ("Cannot chain to this constructor from subclasses."); if (assembly == null) assembly = System.Reflection.Assembly.GetCallingAssembly (); System.IO.Stream s = assembly.GetManifestResourceStream (resource_name); if (s == null) throw new ArgumentException ("Cannot get resource file '" + resource_name + "'", "resource_name"); int size = (int) s.Length; byte[] buffer = new byte[size]; s.Read (buffer, 0, size); s.Close (); AddFromString(System.Text.Encoding.UTF8.GetString (buffer)); TranslationDomain = translation_domain; } public void Autoconnect (object handler) { BindFields (handler); (new SignalConnector (this, handler)).ConnectSignals (); } public void Autoconnect (Type handler_class) { BindFields (handler_class); (new SignalConnector (this, handler_class)).ConnectSignals (); } class SignalConnector { Builder builder; Type handler_type; object handler; public SignalConnector (Builder builder, object handler) { this.builder = builder; this.handler = handler; handler_type = handler.GetType (); } public SignalConnector (Builder builder, Type handler_type) { this.builder = builder; this.handler = null; this.handler_type = handler_type; } [DllImport("libgtk-win32-2.0-0.dll")] static extern void gtk_builder_connect_signals_full(IntPtr raw, GtkBeansSharp.BuilderConnectFuncNative func, IntPtr user_data); public void ConnectSignals() { GtkBeansSharp.BuilderConnectFuncWrapper func_wrapper = new GtkBeansSharp.BuilderConnectFuncWrapper (new GtkBeans.BuilderConnectFunc (ConnectFunc)); gtk_builder_connect_signals_full(builder.Handle, func_wrapper.NativeDelegate, IntPtr.Zero); } public void ConnectFunc (Builder builder, GLib.Object objekt, string signal_name, string handler_name, GLib.Object connect_object, GLib.ConnectFlags flags) { /* search for the event to connect */ System.Reflection.MemberInfo[] evnts = objekt.GetType (). FindMembers (System.Reflection.MemberTypes.Event, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic, new System.Reflection.MemberFilter (SignalFilter), signal_name); foreach (System.Reflection.EventInfo ei in evnts) { bool connected = false; System.Reflection.MethodInfo add = ei.GetAddMethod (); System.Reflection.ParameterInfo[] addpi = add.GetParameters (); if (addpi.Length == 1) { /* this should be always true, unless there's something broken */ Type delegate_type = addpi[0].ParameterType; /* look for an instance method */ if (connect_object != null || handler != null) try { Delegate d = Delegate.CreateDelegate (delegate_type, connect_object != null ? connect_object : handler, handler_name); add.Invoke (objekt, new object[] { d } ); connected = true; } catch (ArgumentException) { /* ignore if there is not such instance method */ } /* look for a static method if no instance method has been found */ if (!connected && handler_type != null) try { Delegate d = Delegate.CreateDelegate (delegate_type, handler_type, handler_name); add.Invoke (objekt, new object[] { d } ); connected = true; } catch (ArgumentException) { /* ignore if there is not such static method */ } if (!connected) { string msg = ExplainError (ei.Name, delegate_type, handler_type, handler_name); throw new HandlerNotFoundException (msg, handler_name, signal_name, ei, delegate_type); } } } } static bool SignalFilter (System.Reflection.MemberInfo m, object filterCriteria) { string signame = (filterCriteria as string); object[] attrs = m.GetCustomAttributes (typeof (GLib.SignalAttribute), false); if (attrs.Length > 0) { foreach (GLib.SignalAttribute a in attrs) { if (signame == a.CName) { return true; } } return false; } else { /* this tries to match the names when no attibutes are present. It is only a fallback. */ signame = signame.ToLower ().Replace ("_", ""); string evname = m.Name.ToLower (); return signame == evname; } } static string GetSignature (System.Reflection.MethodInfo method) { if (method == null) return null; System.Reflection.ParameterInfo [] parameters = method.GetParameters (); System.Text.StringBuilder sb = new System.Text.StringBuilder (); sb.Append ('('); foreach (System.Reflection.ParameterInfo info in parameters) { sb.Append (info.ParameterType.ToString ()); sb.Append (','); } if (sb.Length != 0) sb.Length--; sb.Append (')'); return sb.ToString (); } static string GetSignature (Type delegate_type) { System.Reflection.MethodInfo method = delegate_type.GetMethod ("Invoke"); return GetSignature (method); } const System.Reflection.BindingFlags flags = System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Instance; static string GetSignature (Type klass, string method_name) { try { System.Reflection.MethodInfo method = klass.GetMethod (method_name, flags); return GetSignature (method); } catch { // May be more than one method with that name and none matches return null; } } static string ExplainError (string event_name, Type deleg, Type klass, string method) { if (deleg == null || klass == null || method == null) return null; System.Text.StringBuilder sb = new System.Text.StringBuilder (); string expected = GetSignature (deleg); string actual = GetSignature (klass, method); if (actual == null) return null; sb.AppendFormat ("The handler for the event {0} should take '{1}', " + "but the signature of the provided handler ('{2}') is '{3}'\n", event_name, expected, method, actual); return sb.ToString (); } } void BindFields (object target) { BindFields (target, target.GetType ()); } void BindFields (Type type) { BindFields (null, type); } void BindFields (object target, Type type) { System.Reflection.BindingFlags flags = System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.DeclaredOnly; if (target != null) flags |= System.Reflection.BindingFlags.Instance; else flags |= System.Reflection.BindingFlags.Static; do { System.Reflection.FieldInfo[] fields = type.GetFields (flags); if (fields == null) return; foreach (System.Reflection.FieldInfo field in fields) { object[] attrs = field.GetCustomAttributes (typeof (ObjectAttribute), false); if (attrs == null || attrs.Length == 0) continue; // The widget to field binding must be 1:1, so only check // the first attribute. ObjectAttribute attr = (ObjectAttribute) attrs[0]; GLib.Object gobject; if (attr.Specified) gobject = GetObject (attr.Name); else gobject = GetObject (field.Name); if (gobject != null) try { field.SetValue (target, gobject, flags, null, null); } catch (Exception e) { Console.WriteLine ("Unable to set value for field " + field.Name); throw e; } } type = type.BaseType; } while (type != typeof(object) && type != null); } f-spot-0.8.2/lib/gtk-sharp-beans/snk0000644000175000017500000000112411417267577017532 0ustar00rubenruben00000000000000$RSA2¯mÀ„ü«LÐ#ù kî ¬lFmCyЏÁ—(ZŠÇ§áØ &ºg `&msWM/¸_ÿÑ}RcR‹XÍÜYlDÆ*i-H‚H§9ã·Á]ÊÙ_”i=GF‹,¡rD|ŽÔMÔ=#RûÄñ¡–»ØQK‡L¢U¤ ÚÀ¥[kˆ¼ÚÛs=ŽvÈ ½%Xü>›#W; // // Copyright (c) 2009 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the Lesser GNU General // Public License as published by the Free Software Foundation. // // 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this program; if not, write to the // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. using System; using System.Collections; using System.Runtime.InteropServices; namespace GtkBeans { public static class Global { [DllImport("libgtk-win32-2.0-0.dll")] static extern unsafe bool gtk_show_uri(IntPtr screen, IntPtr uri, uint timestamp, out IntPtr error); public static unsafe bool ShowUri(Gdk.Screen screen, string uri, uint timestamp) { IntPtr native_uri = GLib.Marshaller.StringToPtrGStrdup (uri); IntPtr error = IntPtr.Zero; bool raw_ret = gtk_show_uri(screen == null ? IntPtr.Zero : screen.Handle, native_uri, timestamp, out error); bool ret = raw_ret; GLib.Marshaller.Free (native_uri); if (error != IntPtr.Zero) throw new GLib.GException (error); return ret; } public static bool ShowUri (Gdk.Screen screen, string uri) { return ShowUri (screen, uri, Gdk.EventHelper.GetTime (new Gdk.Event(IntPtr.Zero))); } } } f-spot-0.8.2/lib/gtk-sharp-beans/Style.cs0000644000175000017500000000413011417267577020443 0ustar00rubenruben00000000000000// Gtk.Style.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the Lesser GNU General // Public License as published by the Free Software Foundation. // // 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this program; if not, write to the // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. using System; using System.Collections; using System.Runtime.InteropServices; using Gtk; namespace GtkBeans { public class Style { [DllImport("libgtk-win32-2.0-0.dll")] static extern void gtk_paint_flat_box(IntPtr style, IntPtr window, int state_type, int shadow_type, IntPtr area, IntPtr widget, IntPtr detail, int x, int y, int width, int height); public static void PaintFlatBox(Gtk.Style style, Gdk.Drawable window, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gdk.Rectangle? area, Gtk.Widget widget, string detail, int x, int y, int width, int height) { IntPtr native_area = area == null ? IntPtr.Zero : GLib.Marshaller.StructureToPtrAlloc (area); IntPtr native_detail = GLib.Marshaller.StringToPtrGStrdup (detail); gtk_paint_flat_box(style == null ? IntPtr.Zero : style.Handle, window == null ? IntPtr.Zero : window.Handle, (int) state_type, (int) shadow_type, native_area, widget == null ? IntPtr.Zero : widget.Handle, native_detail, x, y, width, height); if (area != null) { area = Gdk.Rectangle.New (native_area); Marshal.FreeHGlobal (native_area); } GLib.Marshaller.Free (native_detail); } } } f-spot-0.8.2/lib/gtk-sharp-beans/Dialog.cs0000644000175000017500000000306611417267577020551 0ustar00rubenruben00000000000000// Gtk.Dialog.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the Lesser GNU General // Public License as published by the Free Software Foundation. // // 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this program; if not, write to the // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. using System; using System.Collections; using System.Runtime.InteropServices; namespace Gtk { public static class DialogExtensions { [DllImport("libgtk-win32-2.0-0.dll")] static extern IntPtr gtk_dialog_get_action_area (IntPtr raw); public static HButtonBox GetActionArea (this Dialog dialog) { IntPtr raw_ret = gtk_dialog_get_action_area (dialog.Handle); Gtk.HButtonBox ret = GLib.Object.GetObject (raw_ret) as Gtk.HButtonBox; return ret; } [DllImport("libgtk-win32-2.0-0.dll")] static extern IntPtr gtk_dialog_get_content_area (IntPtr raw); public static Widget GetContentArea (this Dialog dialog) { IntPtr raw_ret = gtk_dialog_get_content_area (dialog.Handle); Gtk.Widget ret = GLib.Object.GetObject (raw_ret) as Gtk.Widget; return ret; } } } f-spot-0.8.2/lib/gtk-sharp-beans/Makefile.am0000644000175000017500000000474211417267577021061 0ustar00rubenruben00000000000000include $(top_srcdir)/Makefile.include SRCS = \ $(srcdir)/Dialog.cs \ $(srcdir)/Drawable.cs \ $(srcdir)/Global.cs \ $(srcdir)/Image.cs \ $(srcdir)/ImageMenuItem.cs \ $(srcdir)/Widget.cs \ $(srcdir)/Format.cs \ $(srcdir)/Priority.cs \ $(srcdir)/Shell.cs \ $(srcdir)/Sources.cs \ $(srcdir)/Style.cs \ $(srcdir)/Timeout.cs \ $(srcdir)/PixbufFormat.cs \ $(srcdir)/PixbufLoader.cs \ $(srcdir)/AssemblyInfo.cs CUSTOMS = \ $(srcdir)/Builder.custom ASSEMBLIES = \ -pkg:glib-sharp-2.0 \ $(LINK_GIOSHARP) \ -pkg:gtk-sharp-2.0 SNK = snk all: gtk-sharp-beans.dll gtkbeans-api.xml: $(srcdir)/gtkbeans-api.raw $(srcdir)/GtkBeans.metadata @echo -e "\n*** Massaging the raw api into $@" cp $(srcdir)/gtkbeans-api.raw gtkbeans-api.xml chmod +w gtkbeans-api.xml $(GAPI2FIXUP) --api=gtkbeans-api.xml --metadata=$(srcdir)/GtkBeans.metadata gtk-api.xml: $(srcdir)/gtk-api.raw $(srcdir)/Gtk.metadata @echo -e "\n*** Massaging the raw api into $@" cp $(srcdir)/gtk-api.raw gtk-api.xml chmod +w gtk-api.xml $(GAPI2FIXUP) --api=gtk-api.xml --metadata=$(srcdir)/Gtk.metadata gtk_generated/Builder.cs: gtk-api.xml gtkbeans-api.xml $(GTK_CUSTOMS) @echo -e "\n*** Generating C# code" $(GAPI2CODEGEN) $(GLIBSHARP_CFLAGS) --outdir=gtk_generated --customdir=$(srcdir) --generate gtkbeans-api.xml $(GAPI2CODEGEN) $(GLIBSHARP_CFLAGS) $(GTKSHARP_CFLAGS) -I:$(top_builddir)/lib/gio-sharp/gio/gio-api.xml --outdir=gtk_generated --customdir=$(srcdir) --generate gtk-api.xml gtk-sharp-beans.snk: $(SNK) cp $< $@ gtk-sharp-beans.dll: gtk_generated/Builder.cs $(SRCS) gtk-sharp-beans.snk @echo -e "\n*** Building $@" $(CSC) -target:library -out:$@ $(CSC_DEFINES) -unsafe $(ASSEMBLIES) $(SRCS) gtk_generated/*.cs CLEANFILES = \ gtk-sharp-beans.dll \ gtk-sharp-beans.dll.mdb \ gtkbeans-api.xml \ gtk-api.xml DISTCLEANFILES = \ gtk_generated/*.cs \ gtk-sharp-beans.snk EXTRA_DIST = \ $(SRCS) \ $(CUSTOMS) \ $(SNK) \ gtk-sharp-beans.dll.config \ Gtk.metadata \ GtkBeans.metadata \ gtkbeans-api.raw \ gtk-api.raw assemblydir = $(pkglibdir) assembly_DATA = \ gtk-sharp-beans.dll \ gtk-sharp-beans.dll.config fetch: rm -rf fetch git clone git://gitorious.org/gtk-sharp-beans/mainline.git fetch update: cp fetch/*.cs \ fetch/gtk-api.raw \ fetch/gtkbeans-api.raw \ fetch/Gdk.Sources/*.cs \ fetch/GLib.Sources/*.cs \ fetch/Gtk.Customs/*.custom \ fetch/Gtk.Sources/*.cs \ fetch/Gtk.metadata \ fetch/GtkBeans.metadata \ . .PHONY: fetch update f-spot-0.8.2/lib/gtk-sharp-beans/Widget.cs0000644000175000017500000000271511417267577020575 0ustar00rubenruben00000000000000// Gtk.Widget.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the Lesser GNU General // Public License as published by the Free Software Foundation. // // 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this program; if not, write to the // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. using System; using System.Collections; using System.Runtime.InteropServices; namespace Gtk { public static class WidgetExtensions { [DllImport("libgtk-win32-2.0-0.dll")] static extern IntPtr gtk_widget_get_snapshot(IntPtr raw, IntPtr clip_rect); public static Gdk.Pixmap GetSnapshot(this Widget widget, Gdk.Rectangle clip_rect) { IntPtr native_clip_rect = GLib.Marshaller.StructureToPtrAlloc (clip_rect); IntPtr raw_ret = gtk_widget_get_snapshot(widget.Handle, native_clip_rect); Gdk.Pixmap ret = GLib.Object.GetObject(raw_ret) as Gdk.Pixmap; clip_rect = Gdk.Rectangle.New (native_clip_rect); Marshal.FreeHGlobal (native_clip_rect); return ret; } } } f-spot-0.8.2/lib/gtk-sharp-beans/Sources.cs0000644000175000017500000000247511417267577021000 0ustar00rubenruben00000000000000// GLib.SourceExtensions // // Author(s): // Stephane Delcroix // // Copyright (c) 2009 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the Lesser GNU General // Public License as published by the Free Software Foundation. // // 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this program; if not, write to the // Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. using System; using System.Runtime.InteropServices; using GLib; namespace GLibBeans { public class Sources { [DllImport("libglib-2.0-0.dll")] static extern void g_source_set_priority (IntPtr source, int priority); [DllImport("libglib-2.0-0.dll")] static extern IntPtr g_main_context_find_source_by_id (IntPtr context, uint source_id); public static void SetPriority (uint source_id, Priority priority) { g_source_set_priority (g_main_context_find_source_by_id (IntPtr.Zero, source_id), (int)priority); } } } f-spot-0.8.2/lib/Mono.Tabblo/0000777000175000017500000000000011503407426016127 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Mono.Tabblo/Mono.Tabblo/0000777000175000017500000000000011503407426020241 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/Mono.Tabblo/Mono.Tabblo/MultipartRequest.cs0000644000175000017500000001222111430555233024113 0ustar00rubenruben00000000000000// // Mono.Tabblo.MultipartRequest // // Authors: // Gonzalo Paniagua Javier (gonzalo@ximian.com) // Stephane Delcroix (stephane@delcroix.org) // Wojciech Dzierzanowski (wojciech.dzierzanowski@gmail.com) // // (C) Copyright 2006 Novell, Inc. (http://www.novell.com) // (C) Copyright 2007 S. Delcroix // (C) Copyright 2009 Wojciech Dzierzanowski // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Diagnostics; using System.Globalization; using System.IO; using System.Net; using System.Text; namespace Mono.Tabblo { class MultipartRequest { private const string VerboseSymbol = "FSPOT_TABBLO_EXPORT_VERBOSE"; private static readonly byte [] CRLF = { 13, 10 }; private const string SeparatorString = "PART_SEPARATOR"; private const string Separator = "--" + SeparatorString + "\r\n"; private const string SeparatorEnd = "--" + SeparatorString + "--\r\n"; private static readonly byte [] SeparatorBytes = Encoding.ASCII.GetBytes (Separator); private static readonly byte [] SeparatorEndBytes = Encoding.ASCII.GetBytes (SeparatorEnd); private HttpWebRequest request; private Stream output_stream; bool output_set; public MultipartRequest (HttpWebRequest http_request) { request = http_request; request.ContentType = "multipart/form-data; boundary=" + SeparatorString; } public HttpWebRequest Request { get { return request; } } public Stream OutputStream { get { return output_stream; } set { output_set = true; output_stream = value; } } public void BeginPart () { BeginPart (false); } public void BeginPart (bool first) { if (!first) { return; } LogBeginPart (); InitContent (); AppendContent (SeparatorBytes, 0, SeparatorBytes.Length); } public void AddHeader (string name, string val) { AddHeader (name, val, false); } public void AddHeader (string name, string val, bool last) { AddHeader (String.Format ("{0}: {1}", name, val), last); } public void AddHeader (string header) { AddHeader (header, false); } public void AddHeader (string header, bool last) { bool need_crlf = !header.EndsWith ("\r\n"); byte [] bytes = Encoding.UTF8.GetBytes (header); AppendContent (bytes, 0, bytes.Length); if (need_crlf) { AppendContent (CRLF, 0, CRLF.Length); } if (last) { AppendContent (CRLF, 0, CRLF.Length); } } public void WriteContent (string content) { WriteContent (Encoding.UTF8.GetBytes (content)); } public void WriteContent (byte [] content) { AppendContent (content, 0, content.Length); AppendContent (CRLF, 0, CRLF.Length); } public void WritePartialContent (byte [] content, int offset, int nbytes) { AppendContent (content, offset, nbytes); } public void EndPartialContent () { AppendContent (CRLF, 0, CRLF.Length); } public void EndPart (bool last) { if (last) { LogEndPart (); AppendContent (SeparatorEndBytes, 0, SeparatorEndBytes.Length); CloseContent (); } else { AppendContent (SeparatorBytes, 0, SeparatorBytes.Length); } } private void InitContent () { if (output_stream == null) { output_stream = request.GetRequestStream (); } } private void CloseContent () { if (!output_set) { output_stream.Close (); } } private void AppendContent (byte [] content, int offset, int length) { LogContent (content, offset, length); output_stream.Write (content, offset, length); } [Conditional (VerboseSymbol)] private static void LogBeginPart () { Debug.WriteLine (">>>START MultipartRequest content"); } [Conditional (VerboseSymbol)] private static void LogEndPart () { Debug.WriteLine ("<< /// Overriden by subclasses to display upload progress. /// /// /// The default implementation does nothing. /// protected virtual void ShowProgress (string title, long bytes_sent) { } private static ulong GetTotalFileSize (Picture [] pictures) { Debug.Assert (null != pictures, "No pictures!"); ulong size = 0; foreach (Picture picture in pictures) { FileInfo info = new FileInfo ( picture.Uri.LocalPath); size += (ulong) info.Length; } return size; } } } f-spot-0.8.2/lib/Mono.Tabblo/Mono.Tabblo/TabbloException.cs0000644000175000017500000000311411430555233023644 0ustar00rubenruben00000000000000// // Mono.Tabblo.TabbloException // // Authors: // Wojciech Dzierzanowski (wojciech.dzierzanowski@gmail.com) // // (C) Copyright 2008 Wojciech Dzierzanowski // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Mono.Tabblo { public class TabbloException : ApplicationException { public TabbloException () { } public TabbloException (string message) : base (message) { } public TabbloException (Exception cause) : base ("", cause) { } public TabbloException (string message, Exception cause) : base (message, cause) { } } } f-spot-0.8.2/lib/Mono.Tabblo/Mono.Tabblo/IPreferences.cs0000644000175000017500000000311111430555233023131 0ustar00rubenruben00000000000000// // Mono.Tabblo.IPreferences // // Authors: // Wojciech Dzierzanowski (wojciech.dzierzanowski@gmail.com) // // (C) Copyright 2008 Wojciech Dzierzanowski // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Mono.Tabblo { /// /// Interface for a set of Tabblo user preferences. /// public interface IPreferences { string Username { get; } string Password { get; } // FIXME: It _should_ be possible to set a photo's privacy when // uploading, but that's not implemented yet. string Privacy { get; } } } f-spot-0.8.2/lib/Mono.Tabblo/Mono.Tabblo/Uploader.cs0000644000175000017500000000474111430555233022344 0ustar00rubenruben00000000000000// // Mono.Tabblo.Uploader // // Authors: // Wojciech Dzierzanowski (wojciech.dzierzanowski@gmail.com) // // (C) Copyright 2009 Wojciech Dzierzanowski // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Diagnostics; using System.IO; namespace Mono.Tabblo { public class Uploader { private readonly Connection connection; private readonly IPreferences preferences; public Uploader (IPreferences preferences) { if (null == preferences) { throw new ArgumentNullException ("preferences"); } connection = new Connection (preferences); this.preferences = preferences; } public event UploadProgressEventHandler ProgressChanged { add { connection.UploadProgressChanged += value; } remove { connection.UploadProgressChanged -= value; } } public void Upload (Picture picture) { if (null == picture) { throw new ArgumentNullException ("picture"); } string tags = GetTagsAsString (picture); string [,] arguments = { {"security", preferences.Privacy}, {"tags", tags}, }; using (Stream data_stream = File.OpenRead (picture.Uri.LocalPath)) { Debug.WriteLine ("NEW UPLOAD: " + picture.Uri.LocalPath); connection.UploadFile (picture.Name, data_stream, picture.MimeType, arguments); } } private static string GetTagsAsString (Picture picture) { Debug.Assert (null != picture); return String.Join (",", picture.Tags); } } } f-spot-0.8.2/lib/Mono.Tabblo/Mono.Tabblo/Picture.cs0000644000175000017500000000473311430555233022205 0ustar00rubenruben00000000000000// // Mono.Tabblo.Picture // // Authors: // Wojciech Dzierzanowski (wojciech.dzierzanowski@gmail.com) // // (C) Copyright 2009 Wojciech Dzierzanowski // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; namespace Mono.Tabblo { public class Picture { private readonly string name; private readonly Uri uri; private readonly string mime_type; private readonly string privacy; private List tags = new List (); public Picture (string name, Uri uri, string mime_type, string privacy) { if (null == name) { throw new ArgumentNullException ("name"); } if (null == uri) { throw new ArgumentNullException ("uri"); } if (null == mime_type) { throw new ArgumentNullException ("mime_type"); } if (null == privacy) { throw new ArgumentNullException ("privacy"); } this.name = name; this.uri = uri; this.mime_type = mime_type; this.privacy = privacy; } public string Name { get { return name; } } public Uri Uri { get { return uri; } } public string MimeType { get { return mime_type; } } public string Privacy { get { return privacy; } } public string[] Tags { get { return tags.ToArray (); } } public void AddTag (string tag) { if (null == tag) { throw new ArgumentNullException ("tag"); } if (!tags.Contains (tag)) { tags.Add (tag); } } } } f-spot-0.8.2/lib/Mono.Tabblo/Mono.Tabblo/Connection.cs0000644000175000017500000003153611430555233022672 0ustar00rubenruben00000000000000// // Mono.Tabblo.Connection // // Authors: // Wojciech Dzierzanowski (wojciech.dzierzanowski@gmail.com) // // (C) Copyright 2009 Wojciech Dzierzanowski // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using Mono.Unix; using System; using System.Diagnostics; using System.IO; using System.Net; using System.Text; using System.Web; namespace Mono.Tabblo { class Connection { private const string LoginUrl = "https://store.tabblo.com:443/studio/authtoken"; private const string AuthorizeUrl = "https://store.tabblo.com" + ":443/studio/upload/getposturl"; private const string RedirUrl = "http://www.tabblo.com/studio" + "/token/{0}/?url=/studio" + "/report_upload_session"; private const string ContentTypeUrlEncoded = "application/x-www-form-urlencoded; " + "charset=UTF-8"; private readonly IPreferences preferences; private string auth_token = null; private string session_upload_url = null; private CookieCollection cookies; internal Connection (IPreferences preferences) { Debug.Assert (null != preferences); this.preferences = preferences; this.cookies = new CookieCollection (); } internal void UploadFile (string name, Stream data_stream, string mime_type, string [,] arguments) { if (!IsAuthenticated ()) { Login (); } Debug.WriteLine ("Uploading " + mime_type + " file " + name); DoUploadFile (name, data_stream, mime_type, arguments); } private void DoUploadFile (string name, Stream data_stream, string mime_type, string [,] arguments) { string upload_url = GetUploadUrl (arguments); HttpWebRequest http_request = CreateHttpRequest ( upload_url, "POST", true); MultipartRequest request = new MultipartRequest (http_request); MemoryStream mem_stream = null; if (null != UploadProgressChanged) { // "Manual buffering" using a MemoryStream. request.Request.AllowWriteStreamBuffering = false; mem_stream = new MemoryStream (); request.OutputStream = mem_stream; } request.BeginPart (true); request.AddHeader ("Content-Disposition", "form-data; name=\"filename0\"; " + "filename=\"" + name + GetFileNameExtension ( mime_type) + '"', false); request.AddHeader ("Content-Type", mime_type, true); byte [] data_buffer = new byte [8192]; int read_count; while ((read_count = data_stream.Read ( data_buffer, 0, data_buffer.Length)) > 0) { request.WritePartialContent ( data_buffer, 0, read_count); } request.EndPartialContent (); request.EndPart (true); if (null != UploadProgressChanged) { int total = (int) request.OutputStream.Length; request.Request.ContentLength = total; string progress_title = String.Format ( Catalog.GetString ("Uploading " + "photo " + "\"{0}\""), name); using (Stream request_stream = request.Request .GetRequestStream ()) { byte [] buffer = mem_stream.GetBuffer (); int write_count = 0; for (int offset = 0; offset < total; offset += write_count) { FireUploadProgress ( progress_title, offset, total); write_count = System.Math.Min ( 16384, total - offset); request_stream.Write (buffer, offset, write_count); } FireUploadProgress (progress_title, total, total); } } SendRequest ("upload", request.Request, true); } private static string GetFileNameExtension(string mime_type) { switch (mime_type) { case "image/jpeg": return ".jpeg"; case "image/png": return ".png"; default: Debug.WriteLine ( "Unexpected MIME type: " + mime_type); return ".jpeg"; } } internal event UploadProgressEventHandler UploadProgressChanged; private void FireUploadProgress (string title, int sent, int total) { if (null != UploadProgressChanged) { UploadProgressEventArgs args = new UploadProgressEventArgs ( title, sent, total); UploadProgressChanged (this, args); } } private bool IsAuthenticated () { return null != auth_token; } private void Login () { FireUploadProgress (Catalog.GetString ( "Logging into Tabblo"), 0, 0); auth_token = null; HttpWebRequest request = CreateHttpRequest ( LoginUrl, "POST"); request.ContentType = ContentTypeUrlEncoded; string [,] arguments = { {"username", preferences.Username}, {"password", preferences.Password} }; try { WriteRequestContent (request, arguments); string response = SendRequest ( "login", request); if ("BAD".Equals (response)) { Debug.WriteLine ( "Invalid username or password"); throw new TabbloException ( "Login failed: Invalid username" + " or password"); } auth_token = response; } catch (TabbloException e) { // Here's us trying to produce a more // descriptive message when we have... trust // issues. This doesn't work, though, at least // as long as Mono bug #346635 is not fixed. // // TODO: When it _starts_ to work, we should // think about doing the same for // `GetUploadUrl()'. WebException we = e.InnerException as WebException; if (null != we) { Debug.WriteLine ("Caught a WebException," + " status=" + we.Status); if (WebExceptionStatus.TrustFailure == we.Status) { throw new TabbloException ( "Trust failure", we); } } throw; } Debug.WriteLineIf (null != auth_token, "Login successful. Token: " + auth_token); } private string GetUploadUrl (string [,] arguments) { FireUploadProgress (Catalog.GetString ( "Obtaining URL for upload"), 0, 0); Debug.Assert (IsAuthenticated (), "Not authenticated"); if (null == session_upload_url) { string [,] auth_arguments = { {"auth_token", auth_token} }; string url = AuthorizeUrl + "/?" + FormatRequestArguments ( auth_arguments); HttpWebRequest request = CreateHttpRequest (url, "GET"); string response = SendRequest ( "getposturl", request); if (response.StartsWith ("@")) { session_upload_url = response.Substring (1); } else { throw new TabbloException ( "Session upload URL " + "retrieval failed"); } } string upload_url = session_upload_url; upload_url += "&redir=" + String.Format ( RedirUrl, auth_token); if (null != arguments && arguments.GetLength (0) > 0) { upload_url += '&' + FormatRequestArguments ( arguments); } Debug.WriteLine ("Upload URL: " + upload_url); return upload_url; } private HttpWebRequest CreateHttpRequest (string url, string method) { return CreateHttpRequest (url, method, false); } private HttpWebRequest CreateHttpRequest (string url, string method, bool with_cookies) { HttpWebRequest request = (HttpWebRequest) WebRequest.Create (url); // For some reason, POST requests are _really_ slow with // HTTP 1.1. request.ProtocolVersion = HttpVersion.Version10; request.Method = method; if (with_cookies) { HandleRequestCookies (request); } return request; } private void HandleRequestCookies (HttpWebRequest request) { request.CookieContainer = new CookieContainer (); // Instead of just doing a // `request.CookieContainer.Add(cookies)', add cookies // mannually to work around the fact that some cookies // are not properly formatted as they are received from // the server. foreach (Cookie c in cookies) { Cookie new_cookie = new Cookie (c.Name, c.Value, "/", ".tabblo.com"); request.CookieContainer.Add (new_cookie); } string cookie_header = request.CookieContainer .GetCookieHeader (request.RequestUri); Debug.WriteLineIf (cookie_header.Length > 0, "Cookie: " + cookie_header); } private static void WriteRequestContent (HttpWebRequest request, string [,] arguments) { WriteRequestContent (request, FormatRequestArguments (arguments)); } private static void WriteRequestContent (HttpWebRequest request, string content) { byte [] content_bytes = Encoding.UTF8.GetBytes (content); request.ContentLength = content_bytes.Length; try { using (Stream request_stream = request.GetRequestStream ()) { request_stream.Write (content_bytes, 0, content_bytes.Length); } } catch (WebException e) { Debug.WriteLine ( "Error writing request content", "ERROR"); throw new TabbloException ( "HTTP request failure: " + e.Message, e); } char [] content_chars = new char [content_bytes.Length]; content_bytes.CopyTo (content_chars, 0); Debug.WriteLine ("Request content: " + new string (content_chars)); } private static string FormatRequestArguments ( string [,] arguments) { StringBuilder content = new StringBuilder (); for (int i = 0; i < arguments.GetLength (0); ++i) { content.AppendFormat( "{0}={1}&", HttpUtility.UrlEncode ( arguments [i, 0]), HttpUtility.UrlEncode ( arguments [i, 1])); } if (content.Length > 0) { content.Remove (content.Length - 1, 1); } return content.ToString (); } private string SendRequest (string description, HttpWebRequest request) { return SendRequest (description, request, false); } /// /// Sends an HTTP request. /// /// /// /// the HTTP response as string private string SendRequest (string description, HttpWebRequest request, bool keep_cookies) { Debug.WriteLine ("Sending " + description + ' ' + request.Method + " request to " + request.Address); HttpWebResponse response = null; try { response = (HttpWebResponse) request.GetResponse (); if (keep_cookies) { cookies.Add (response.Cookies); Debug.WriteLine (response.Cookies.Count + " cookie(s)"); foreach (Cookie c in response.Cookies) { Debug.WriteLine ("Set-Cookie: " + c.Name + '=' + c.Value + "; Domain=" + c.Domain + "; expires=" + c.Expires); } } return GetResponseAsString (response); } catch (WebException e) { Debug.WriteLine (description + " failed: " + e); HttpWebResponse error_response = e.Response as HttpWebResponse; string response_string = null != error_response ? GetResponseAsString ( error_response) : "reason unknown"; throw new TabbloException (description + " failed: " + response_string, e); } finally { if (null != response) { response.Close (); } } } private static string GetResponseAsString ( HttpWebResponse response) { Debug.Write ("Response: "); Encoding encoding = Encoding.UTF8; if (response.ContentEncoding.Length > 0) { try { encoding = Encoding.GetEncoding ( response .ContentEncoding); } catch (ArgumentException) { // Swallow invalid encoding exception // and use the default one. } } string response_string = null; using (Stream stream = response.GetResponseStream ()) { StreamReader reader = new StreamReader ( stream, encoding); response_string = reader.ReadToEnd (); stream.Close (); } Debug.WriteLineIf (null != response_string, response_string); return response_string; } } } f-spot-0.8.2/lib/Mono.Tabblo/Mono.Tabblo/UploadProgressEventHandler.cs0000644000175000017500000000271611430555233026042 0ustar00rubenruben00000000000000// // Mono.abblo.UploadProgressEventHandler // // Authors: // Gonzalo Paniagua Javier (gonzalo@ximian.com) // Wojciech Dzierzanowski (wojciech.dzierzanowski@gmail.com) // // (C) Copyright 2006 Novell, Inc. (http://www.novell.com) // (C) Copyright 2008 Wojciech Dzierzanowski // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // namespace Mono.Tabblo { public delegate void UploadProgressEventHandler ( object sender, UploadProgressEventArgs args); } f-spot-0.8.2/lib/Mono.Tabblo/Mono.Tabblo/UploadProgressEventArgs.cs0000644000175000017500000000370311430555233025356 0ustar00rubenruben00000000000000// // Mono.Tabblo.UploadProgressEventArgs // // Authors: // Gonzalo Paniagua Javier (gonzalo@ximian.com) // Wojciech Dzierzanowski (wojciech.dzierzanowski@gmail.com) // // (C) Copyright 2006 Novell, Inc. (http://www.novell.com) // (C) Copyright 2008 Wojciech Dzierzanowski // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace Mono.Tabblo { public sealed class UploadProgressEventArgs : EventArgs { private readonly string title; private readonly long bytes_sent; private readonly long bytes_total; internal UploadProgressEventArgs (string title, long bytes_sent, long bytes_total) { this.title = title; this.bytes_sent = bytes_sent; this.bytes_total = bytes_total; } public string Title { get { return title; } } public long BytesSent { get { return bytes_sent; } } public long BytesTotal { get { return bytes_total; } } } } f-spot-0.8.2/lib/Mono.Tabblo/AssemblyInfo.cs0000644000175000017500000000214511430555233021046 0ustar00rubenruben00000000000000#region Using directives using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; #endregion // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle ("Mono.Tabblo")] [assembly: AssemblyDescription ("A library implementing photo upload to Tabblo" + " over HTTP")] [assembly: AssemblyConfiguration ("")] [assembly: AssemblyCompany ("")] [assembly: AssemblyProduct ("Mono.Tabblo")] [assembly: AssemblyCopyright ("")] [assembly: AssemblyTrademark ("")] [assembly: AssemblyCulture ("")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. [assembly: ComVisible (false)] // The assembly version has following format : // // Major.Minor.Build.Revision // // You can specify all the values or you can use the default the Revision and // Build Numbers by using the '*' as shown below: [assembly: AssemblyVersion ("0.3.*")] f-spot-0.8.2/lib/Mono.Tabblo/Makefile.in0000644000175000017500000006710711503407240020175 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = lib/Mono.Tabblo ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = Mono.Tabblo TARGET = library LINK = $(REF_MONO_TABBLO) $(am__append_1) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ Mono.Tabblo/Connection.cs \ Mono.Tabblo/IPreferences.cs \ Mono.Tabblo/MultipartRequest.cs \ Mono.Tabblo/Picture.cs \ Mono.Tabblo/TabbloException.cs \ Mono.Tabblo/TotalUploadProgress.cs \ Mono.Tabblo/Uploader.cs \ Mono.Tabblo/UploadProgressEventArgs.cs \ Mono.Tabblo/UploadProgressEventHandler.cs RESOURCES = ASSEMBLY_INFO_SOURCE = AssemblyInfo.cs # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/Mono.Tabblo/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/Mono.Tabblo/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/lib/Mono.Tabblo/Makefile.am0000644000175000017500000000100411430555233020151 0ustar00rubenruben00000000000000ASSEMBLY = Mono.Tabblo TARGET = library LINK = $(REF_MONO_TABBLO) INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR) SOURCES = \ Mono.Tabblo/Connection.cs \ Mono.Tabblo/IPreferences.cs \ Mono.Tabblo/MultipartRequest.cs \ Mono.Tabblo/Picture.cs \ Mono.Tabblo/TabbloException.cs \ Mono.Tabblo/TotalUploadProgress.cs \ Mono.Tabblo/Uploader.cs \ Mono.Tabblo/UploadProgressEventArgs.cs \ Mono.Tabblo/UploadProgressEventHandler.cs RESOURCES = ASSEMBLY_INFO_SOURCE = AssemblyInfo.cs include $(top_srcdir)/build/build.mk f-spot-0.8.2/lib/gio-sharp/0000777000175000017500000000000011503407376015712 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/gio-sharp/Makefile.in0000644000175000017500000005250011503407242017745 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib/gio-sharp DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = \ generator \ gio all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/gio-sharp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/gio-sharp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am fetch: rm -rf fetch git clone git://gitorious.org/gio-sharp/mainline.git fetch update: cp fetch/generator/*.cs generator/ cp fetch/gio/*.custom \ fetch/gio/*.cs \ fetch/gio/gio-api-2.22.raw \ fetch/gio/Gio.metadata \ fetch/gio/gtk-sharp.snk \ gio mv gio/gio-api-2.22.raw gio/gio-api.raw .PHONY: fetch update # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/lib/gio-sharp/gio/0000777000175000017500000000000011503407377016471 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/gio-sharp/gio/FileEnumerator.custom0000644000175000017500000000345511417267577022663 0ustar00rubenruben00000000000000// FileEnumerator.custom - customizations to GLib.FileEnumerator // // Authors: Stephane Delcroix // // Copyright (c) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // public IEnumerator GetEnumerator () { return new Enumerator (this); } public FileInfo NextFile () { return NextFile ((Cancellable) null); } class Enumerator : IEnumerator { FileEnumerator file_enumerator; public Enumerator (FileEnumerator file_enumerator) { this.file_enumerator = file_enumerator; } FileInfo current=null; public object Current { get { return current; } } public bool MoveNext () { current = file_enumerator.NextFile (); if (current == null) return false; return true; } public void Reset () { throw new NotImplementedException (); } } f-spot-0.8.2/lib/gio-sharp/gio/FileInfo.custom0000644000175000017500000000230411417267577021425 0ustar00rubenruben00000000000000// FileInfo.custom - customizations to GLib.FileInfo // // Authors: Ruben Vermeersch // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // ~FileInfo () { Dispose (); } f-spot-0.8.2/lib/gio-sharp/gio/FileFactory.cs0000644000175000017500000000422611417267577021241 0ustar00rubenruben00000000000000// // FileFactory.cs // // Author(s): // Stephane Delcroix // // Copyright (c) 2008 Stephane Delcroix // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Runtime.InteropServices; namespace GLib { public class FileFactory { [DllImport ("libgio-2.0-0.dll")] private static extern IntPtr g_file_new_for_uri (string uri); public static File NewForUri (string uri) { return GLib.FileAdapter.GetObject (g_file_new_for_uri (uri), false) as File; } public static File NewForUri (Uri uri) { return GLib.FileAdapter.GetObject (g_file_new_for_uri (uri.ToString ()), false) as File; } [DllImport ("libgio-2.0-0.dll")] private static extern IntPtr g_file_new_for_path (string path); public static File NewForPath (string path) { return GLib.FileAdapter.GetObject (g_file_new_for_path (path), false) as File; } [DllImport ("libgio-2.0-0.dll")] private static extern IntPtr g_file_new_for_commandline_arg (string arg); public static File NewFromCommandlineArg (string arg) { return GLib.FileAdapter.GetObject (g_file_new_for_commandline_arg (arg), false) as File; } } } f-spot-0.8.2/lib/gio-sharp/gio/AppInfoAdapter.custom0000644000175000017500000000277311417267577022601 0ustar00rubenruben00000000000000// // AppInfoAdapter.custom // // Author: // Stephane Delcroix // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // [DllImport("libgio-2.0-0.dll")] static extern IntPtr g_app_info_get_all(); public static GLib.AppInfo[] GetAll() { IntPtr raw_ret = g_app_info_get_all(); GLib.AppInfo[] ret = (GLib.AppInfo[]) GLib.Marshaller.ListPtrToArray (raw_ret, typeof(GLib.List), true, false, typeof(GLib.AppInfo)); return ret; } f-spot-0.8.2/lib/gio-sharp/gio/AssemblyInfo.cs0000644000175000017500000000034211417267577021420 0ustar00rubenruben00000000000000using System.Reflection; using System.Runtime.CompilerServices; [assembly:AssemblyVersion("2.14.0.0")] [assembly:AssemblyDelaySign(false)] [assembly:AssemblyKeyFile("./gtk-sharp.snk")] [assembly:GLib.IgnoreClassInitializers] f-spot-0.8.2/lib/gio-sharp/gio/Gio.metadata0000644000175000017500000002142311417267577020721 0ustar00rubenruben00000000000000 GLib 1 GetCanRemoveSupportsType 1 GAppInfo* true GetShouldShow GetSupportsFiles GetSupportsUris 1 GetParsedName async async 1 GetCanUnmount GetCanSeek GetPosition 1 GetMountInstance async GetAttributeLong SetAttributeLong GetAttributeULong SetAttributeULong GetAttributeInt SetAttributeInt GetAttributeUInt SetAttributeUInt 1 1 guchar* 1 guchar* 1 guchar* 1 1 EmitReply guchar* 1 guchar* 1 guchar* 1 1 1 1 GetDefault GMount* true GVolume* true GDrive* true 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 f-spot-0.8.2/lib/gio-sharp/gio/FileAdapter.custom0000644000175000017500000000257411417267577022123 0ustar00rubenruben00000000000000// FileAdapter.custom - customizations to GLib.FileAdapter // // Author: // Stephane Delcroix // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // public override string ToString () { return Uri; } public bool Exists { get { return QueryExists (null); } } public bool Delete () { return Delete (null); } f-spot-0.8.2/lib/gio-sharp/gio/snk0000755000175000017500000000112411417267577017216 0ustar00rubenruben00000000000000$RSA2qëlUuRœ¿rD÷¦êb„ùêà;ÏòÌ,œI ³ ê°µkÎDõÙÀ¨R…;pâûCK¬úb"¨˜·¡§³¯™A#$»C%ö¸e»dëöÑÂÕs-ß¼p§8žå> $n2ytÐä˜Bá›ó{‹@!&Ë6‰Âêd–¤|´¿‘•аõpRUšuCIÉã[ë2ï/n«“”Ί'8HgC®IFXD+ÑUÿá½;_—|0ªŠ‚õ(íÃ]–÷TÜÏn$W´µƒÕ3gOœ¦]B]Gðš=7¾›ôò½¦,ã˜ãè=4´(òüÍ_ â‘ Qál{Ü¡¤ú”6j L„š[Ãr;Ï!Äfæñ%]Û=ËO3Ø–¨ñù·ŠòJFt€} Ut ÖqÚ¼évTüv~°˜6E¶j¾I¦lB,Àÿÿ7a‚n´é~Î+ K§Ûb®•# ‹LôD>d¢úSŽâk?Vv&áƒ.{‘lÇó_5{¿ãj.U›»£Üä,aøVqâê&rbòúÎUxý‡/f-spot-0.8.2/lib/gio-sharp/gio/Makefile.in0000644000175000017500000004356711503407243020541 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile.include # FSpot wide helper # Directories VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/Makefile.include subdir = lib/gio-sharp/gio ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(assemblydir)" DATA = $(assembly_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio LINK_GIOSHARP = -r:$(DIR_GIOSHARP)/gio-sharp.dll CSC_FLAGS = -debug CSC = $(MCS) $(CSC_FLAGS) -target:exe CSC_LIB = $(MCS) $(CSC_FLAGS) -target:library MONO_DEBUGFLAGS = --debug RUNTIME = mono $(MONO_DEBUGFLAGS) UNSAFE = -unsafe DEBUG = -debug SRCS = \ $(srcdir)/AssemblyInfo.cs \ $(srcdir)/FileFactory.cs \ $(srcdir)/GioStream.cs CUSTOMS = \ $(srcdir)/AppInfoAdapter.custom \ $(srcdir)/FileAdapter.custom \ $(srcdir)/File.custom \ $(srcdir)/FileEnumerator.custom \ $(srcdir)/FileInfo.custom SNK = $(srcdir)/snk ASSEMBLIES = \ -pkg:glib-sharp-2.0 assemblydir = $(pkglibdir) assembly_DATA = \ gio-sharp.dll \ gio-sharp.dll.config CLEANFILES = \ gio-sharp.dll \ gio-sharp.dll.mdb \ gio-api.xml DISTCLEANFILES = \ generated/*.cs \ gtk-sharp.snk EXTRA_DIST = \ $(SRCS) \ $(CUSTOMS) \ Gio.metadata \ $(SNK) \ gio-sharp.dll.config \ gio-api.raw all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/gio-sharp/gio/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/gio-sharp/gio/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-assemblyDATA: $(assembly_DATA) @$(NORMAL_INSTALL) test -z "$(assemblydir)" || $(MKDIR_P) "$(DESTDIR)$(assemblydir)" @list='$(assembly_DATA)'; test -n "$(assemblydir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(assemblydir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(assemblydir)" || exit $$?; \ done uninstall-assemblyDATA: @$(NORMAL_UNINSTALL) @list='$(assembly_DATA)'; test -n "$(assemblydir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(assemblydir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(assemblydir)" && rm -f $$files tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(assemblydir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-assemblyDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-assemblyDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-assemblyDATA install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am uninstall-assemblyDATA all: gio-sharp.dll gio-api.xml: $(srcdir)/gio-api.raw $(srcdir)/Gio.metadata @echo -e "\n*** Massaging the raw api into $@" cp $(srcdir)/gio-api.raw gio-api.xml chmod +w gio-api.xml $(GAPI2FIXUP) --api=gio-api.xml --metadata=$(srcdir)/Gio.metadata $(top_builddir)/gio-sharp/generator/gapi_codegen.exe: $(MAKE) -C $(top_builddir)/lib/gio-sharp/generator generated/File.cs: gio-api.xml $(CUSTOMS) $(builddir)/../generator/gapi_codegen.exe @echo -e "\n*** Generating C# code" $(MONO) $(top_builddir)/lib/gio-sharp/generator/gapi_codegen.exe $(GLIBSHARP_CFLAGS) --outdir=generated --customdir=$(srcdir) --generate gio-api.xml gtk-sharp.snk: $(SNK) cp $< $@ gio-sharp.dll: generated/File.cs $(SRCS) gtk-sharp.snk @echo -e "\n*** Building $@" $(CSC) -d:GIO_SHARP_2_22 -target:library -out:$@ $(UNSAFE) $(DEBUG) $(ASSEMBLIES) $(SRCS) generated/*.cs # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/lib/gio-sharp/gio/GioStream.cs0000644000175000017500000001644711417267577020734 0ustar00rubenruben00000000000000// // GioStream.cs - provide a System.IO.Stream api to [Input|Output]Streams // // Author(s): // Stephane Delcroix // Gabriel Burt // // Copyright (c) 2008 Stephane Delcroix // Copyright (c) 2010 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace GLib { public class GioStream : System.IO.Stream { object stream; bool can_read; bool can_seek; bool can_write; bool is_disposed; public GioStream (Uri uri, System.IO.FileMode mode) { throw new NotImplementedException (); } public GioStream (string filename, System.IO.FileMode mode) { throw new NotImplementedException (); } public GioStream (InputStream stream) { this.stream = stream; can_read = true; can_seek = stream is Seekable && (stream as Seekable).CanSeek; } public GioStream (OutputStream stream) { this.stream = stream; can_write = true; can_seek = stream is Seekable && (stream as Seekable).CanSeek; } #if GIO_SHARP_2_22 public GioStream (IOStream stream) { this.stream = stream; can_read = true; can_write = true; can_seek = stream is Seekable && (stream as Seekable).CanSeek; } #endif public override bool CanSeek { get { return can_seek; } } public override bool CanRead { get { return can_read; } } public override bool CanWrite { get { return can_write; } } public override long Length { get { if (!CanSeek) throw new NotSupportedException ("This stream doesn't support seeking"); if (is_disposed) throw new ObjectDisposedException ("The stream is closed"); if (stream is FileInputStream) { FileInfo info = (stream as FileInputStream).QueryInfo ("standard::size", null); return info.Size; } if (stream is FileOutputStream) { FileInfo info = (stream as FileOutputStream).QueryInfo ("standard::size", null); return info.Size; } #if GIO_SHARP_2_22 if (stream is FileIOStream) { FileInfo info = (stream as FileIOStream).QueryInfo ("standard::size", null); return info.Size; } #endif throw new NotImplementedException (String.Format ("not implemented for {0} streams", stream.GetType())); } } public override long Position { get { if (!CanSeek) throw new NotSupportedException ("This stream doesn't support seeking"); if (is_disposed) throw new ObjectDisposedException ("The stream is closed"); return (stream as Seekable).Position; } set { Seek (value, System.IO.SeekOrigin.Begin); } } public override void Flush () { if (is_disposed) throw new ObjectDisposedException ("The stream is closed"); } public override int Read (byte[] buffer, int offset, int count) { if (buffer == null) throw new ArgumentNullException ("buffer"); if (offset + count - 1 > buffer.Length) throw new ArgumentException ("(offset + count - 1) is greater than the length of buffer"); if (offset < 0) throw new ArgumentOutOfRangeException ("offset"); if (count < 0) throw new ArgumentOutOfRangeException ("count"); if (!CanRead) throw new NotSupportedException ("The stream does not support reading"); if (is_disposed) throw new ObjectDisposedException ("The stream is closed"); InputStream input_stream = null; if (stream is InputStream) input_stream = stream as InputStream; #if GIO_SHARP_2_22 else if (stream is IOStream) input_stream = (stream as IOStream).InputStream; #endif if (input_stream == null) throw new System.Exception ("this shouldn't happen"); if (offset == 0) return (int)input_stream.Read (buffer, (ulong)count, null); else { byte[] buf = new byte[count]; int ret = (int)input_stream.Read (buf, (ulong)count, null); buf.CopyTo (buffer, offset); return ret; } } public override void Write (byte[] buffer, int offset, int count) { if (buffer == null) throw new ArgumentNullException ("buffer"); if (offset + count > buffer.Length) throw new ArgumentException ("(offset + count) is greater than the length of buffer"); if (offset < 0) throw new ArgumentOutOfRangeException ("offset"); if (count < 0) throw new ArgumentOutOfRangeException ("count"); if (!CanWrite) throw new NotSupportedException ("The stream does not support writing"); if (is_disposed) throw new ObjectDisposedException ("The stream is closed"); OutputStream output_stream = null; if (stream is OutputStream) output_stream = stream as OutputStream; #if GIO_SHARP_2_22 else if (stream is IOStream) output_stream = (stream as IOStream).OutputStream; #endif if (output_stream == null) throw new System.Exception ("this shouldn't happen"); if (offset == 0) { output_stream.Write (buffer, (ulong)count, null); return; } else { byte[] buf = new byte[count]; Array.Copy (buffer, offset, buf, 0, count); output_stream.Write (buf, (ulong)count, null); return; } } public override long Seek (long offset, System.IO.SeekOrigin origin) { if (!CanSeek) throw new NotSupportedException ("This stream doesn't support seeking"); if (is_disposed) throw new ObjectDisposedException ("The stream is closed"); Seekable seekable = stream as Seekable; SeekType seek_type; switch (origin) { case System.IO.SeekOrigin.Current: seek_type = SeekType.Cur; break; case System.IO.SeekOrigin.End: seek_type = SeekType.End; break; case System.IO.SeekOrigin.Begin: default: seek_type = SeekType.Set; break; } seekable.Seek (offset, seek_type, null); return Position; } public override void SetLength (long value) { if (!CanSeek || !CanWrite) throw new NotSupportedException ("This stream doesn't support seeking"); var seekable = stream as Seekable; if (!seekable.CanTruncate ()) throw new NotSupportedException ("This stream doesn't support truncating"); if (is_disposed) throw new ObjectDisposedException ("The stream is closed"); seekable.Truncate (value, null); } public override void Close () { if (stream is InputStream) (stream as InputStream).Close (null); if (stream is OutputStream) (stream as OutputStream).Close (null); #if GIO_SHARP_2_22 if (stream is IOStream) (stream as IOStream).Close (null); #endif is_disposed = true; } } } f-spot-0.8.2/lib/gio-sharp/gio/gio-sharp.dll.config0000644000175000017500000000044311417267577022332 0ustar00rubenruben00000000000000 f-spot-0.8.2/lib/gio-sharp/gio/gio-api.raw0000644000175000017500000105411111417267577020542 0ustar00rubenruben00000000000000 f-spot-0.8.2/lib/gio-sharp/gio/Makefile.am0000644000175000017500000000311711417267577020535 0ustar00rubenruben00000000000000include $(top_srcdir)/Makefile.include UNSAFE = -unsafe DEBUG = -debug SRCS = \ $(srcdir)/AssemblyInfo.cs \ $(srcdir)/FileFactory.cs \ $(srcdir)/GioStream.cs CUSTOMS = \ $(srcdir)/AppInfoAdapter.custom \ $(srcdir)/FileAdapter.custom \ $(srcdir)/File.custom \ $(srcdir)/FileEnumerator.custom \ $(srcdir)/FileInfo.custom SNK = $(srcdir)/snk ASSEMBLIES = \ -pkg:glib-sharp-2.0 all: gio-sharp.dll gio-api.xml: $(srcdir)/gio-api.raw $(srcdir)/Gio.metadata @echo -e "\n*** Massaging the raw api into $@" cp $(srcdir)/gio-api.raw gio-api.xml chmod +w gio-api.xml $(GAPI2FIXUP) --api=gio-api.xml --metadata=$(srcdir)/Gio.metadata $(top_builddir)/gio-sharp/generator/gapi_codegen.exe: $(MAKE) -C $(top_builddir)/lib/gio-sharp/generator generated/File.cs: gio-api.xml $(CUSTOMS) $(builddir)/../generator/gapi_codegen.exe @echo -e "\n*** Generating C# code" $(MONO) $(top_builddir)/lib/gio-sharp/generator/gapi_codegen.exe $(GLIBSHARP_CFLAGS) --outdir=generated --customdir=$(srcdir) --generate gio-api.xml gtk-sharp.snk: $(SNK) cp $< $@ gio-sharp.dll: generated/File.cs $(SRCS) gtk-sharp.snk @echo -e "\n*** Building $@" $(CSC) -d:GIO_SHARP_2_22 -target:library -out:$@ $(UNSAFE) $(DEBUG) $(ASSEMBLIES) $(SRCS) generated/*.cs assemblydir = $(pkglibdir) assembly_DATA = \ gio-sharp.dll \ gio-sharp.dll.config CLEANFILES = \ gio-sharp.dll \ gio-sharp.dll.mdb \ gio-api.xml DISTCLEANFILES = \ generated/*.cs \ gtk-sharp.snk EXTRA_DIST = \ $(SRCS) \ $(CUSTOMS) \ Gio.metadata \ $(SNK) \ gio-sharp.dll.config \ gio-api.raw f-spot-0.8.2/lib/gio-sharp/gio/File.custom0000644000175000017500000000235511417267577020617 0ustar00rubenruben00000000000000// File.custom - customizations to GLib.File // // Authors: Stephane Delcroix // // Copyright (C) 2008 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // bool Exists { get; } bool Delete(); f-spot-0.8.2/lib/gio-sharp/generator/0000777000175000017500000000000011503407377017701 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/gio-sharp/generator/Parameters.cs0000644000175000017500000004127211417267577022347 0ustar00rubenruben00000000000000// GtkSharp.Generation.Parameters.cs - The Parameters Generation Class. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // Copyright (c) 2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Xml; public class Parameter { private XmlElement elem; public Parameter (XmlElement e) { elem = e; } string call_name; public string CallName { get { if (call_name == null) return Name; else return call_name; } set { call_name = value; } } public string CType { get { string type = elem.GetAttribute("type"); if (type == "void*") type = "gpointer"; return type; } } public string CSType { get { string cstype = SymbolTable.Table.GetCSType( elem.GetAttribute("type")); if (cstype == "void") cstype = "System.IntPtr"; if (IsArray) { if (IsParams) cstype = "params " + cstype; cstype += "[]"; cstype = cstype.Replace ("ref ", ""); } return cstype; } } public IGeneratable Generatable { get { return SymbolTable.Table[CType]; } } public bool IsArray { get { return elem.HasAttribute("array") || elem.HasAttribute("null_term_array"); } } public bool IsEllipsis { get { return elem.HasAttribute("ellipsis"); } } public bool IsCount { get { if (Name.StartsWith("n_")) switch (CSType) { case "int": case "uint": case "long": case "ulong": case "short": case "ushort": return true; default: return false; } else return false; } } public bool IsDestroyNotify { get { return CType == "GDestroyNotify"; } } public bool IsLength { get { if (Name.EndsWith("len") || Name.EndsWith("length")) switch (CSType) { case "int": case "uint": case "long": case "ulong": case "short": case "ushort": return true; default: return false; } else return false; } } public bool IsParams { get { return elem.HasAttribute("params"); } } public bool IsString { get { return (CSType == "string"); } } public bool IsUserData { get { return CSType == "IntPtr" && (Name.EndsWith ("data") || Name.EndsWith ("data_or_owner")); } } public virtual string MarshalType { get { string type = SymbolTable.Table.GetMarshalType( elem.GetAttribute("type")); if (type == "void" || Generatable is IManualMarshaler) type = "IntPtr"; if (IsArray) { type += "[]"; type = type.Replace ("ref ", ""); } return type; } } public string Name { get { return SymbolTable.Table.MangleName (elem.GetAttribute("name")); } } public bool Owned { get { return elem.GetAttribute ("owned") == "true"; } } public virtual string NativeSignature { get { string sig = MarshalType + " " + Name; if (PassAs != String.Empty) sig = PassAs + " " + sig; return sig; } } public string PropertyName { get { return elem.GetAttribute("property_name"); } } string pass_as; public string PassAs { get { if (pass_as != null) return pass_as; if (elem.HasAttribute ("pass_as")) return elem.GetAttribute ("pass_as"); if (IsArray || CSType.EndsWith ("IntPtr")) return ""; if (CType.EndsWith ("*") && (Generatable is SimpleGen || Generatable is EnumGen)) return "out"; return ""; } set { pass_as = value; } } string scope; public string Scope { get { if (scope == null) scope = elem.GetAttribute ("scope"); return scope; } set { scope = value; } } public virtual string[] Prepare { get { IGeneratable gen = Generatable; if (gen is IManualMarshaler) { string result = "IntPtr native_" + CallName; if (PassAs != "out") result += " = " + (gen as IManualMarshaler).AllocNative (CallName); return new string [] { result + ";" }; } else if (PassAs == "out" && CSType != MarshalType) return new string [] { gen.MarshalType + " native_" + CallName + ";" }; return new string [0]; } } public virtual string CallString { get { string call_parm; IGeneratable gen = Generatable; if (gen is CallbackGen) return SymbolTable.Table.CallByName (CType, CallName + "_wrapper"); else if (PassAs != String.Empty) { call_parm = PassAs + " "; if (CSType != MarshalType) call_parm += "native_"; call_parm += CallName; } else if (gen is IManualMarshaler) call_parm = "native_" + CallName; else call_parm = SymbolTable.Table.CallByName(CType, CallName); return call_parm; } } public virtual string[] Finish { get { IGeneratable gen = Generatable; if (gen is IManualMarshaler) { string[] result = new string [PassAs == "ref" ? 2 : 1]; int i = 0; if (PassAs != String.Empty) result [i++] = CallName + " = " + Generatable.FromNative ("native_" + CallName) + ";"; if (PassAs != "out") result [i] = (gen as IManualMarshaler).ReleaseNative ("native_" + CallName) + ";"; return result; } else if (PassAs != String.Empty && MarshalType != CSType) return new string [] { CallName + " = " + gen.FromNative ("native_" + CallName) + ";" }; return new string [0]; } } public string FromNative (string var) { if (Generatable == null) return String.Empty; else if (Generatable is HandleBase) return ((HandleBase)Generatable).FromNative (var, Owned); else return Generatable.FromNative (var); } public string StudlyName { get { string name = elem.GetAttribute("name"); string[] segs = name.Split('_'); string studly = ""; foreach (string s in segs) { if (s.Trim () == "") continue; studly += (s.Substring(0,1).ToUpper() + s.Substring(1)); } return studly; } } } public class ArrayParameter : Parameter { bool null_terminated; public ArrayParameter (XmlElement elem) : base (elem) { null_terminated = elem.HasAttribute ("null_term_array"); } public override string MarshalType { get { if (Generatable is StructBase) return CSType; else return base.MarshalType; } } bool NullTerminated { get { return null_terminated; } } public override string[] Prepare { get { if (CSType == MarshalType) return new string [0]; ArrayList result = new ArrayList (); result.Add (String.Format ("int cnt_{0} = {0} == null ? 0 : {0}.Length;", CallName)); result.Add (String.Format ("{0}[] native_{1} = new {0} [cnt_{1}" + (NullTerminated ? " + 1" : "") + "];", MarshalType.TrimEnd('[', ']'), CallName)); result.Add (String.Format ("for (int i = 0; i < cnt_{0}; i++)", CallName)); IGeneratable gen = Generatable; if (gen is IManualMarshaler) result.Add (String.Format ("\tnative_{0} [i] = {1};", CallName, (gen as IManualMarshaler).AllocNative (CallName + "[i]"))); else result.Add (String.Format ("\tnative_{0} [i] = {1};", CallName, gen.CallByName (CallName + "[i]"))); if (NullTerminated) result.Add (String.Format ("native_{0} [cnt_{0}] = IntPtr.Zero;", CallName)); return (string[]) result.ToArray (typeof (string)); } } public override string CallString { get { if (CSType != MarshalType) return "native_" + CallName; else return CallName; } } public override string[] Finish { get { if (CSType == MarshalType) return new string [0]; IGeneratable gen = Generatable; if (gen is IManualMarshaler) { string [] result = new string [4]; result [0] = "for (int i = 0; i < native_" + CallName + ".Length" + (NullTerminated ? " - 1" : "") + "; i++) {"; result [1] = "\t" + CallName + " [i] = " + Generatable.FromNative ("native_" + CallName + "[i]") + ";"; result [2] = "\t" + (gen as IManualMarshaler).ReleaseNative ("native_" + CallName + "[i]") + ";"; result [3] = "}"; return result; } return new string [0]; } } } public class ArrayCountPair : ArrayParameter { XmlElement count_elem; bool invert; public ArrayCountPair (XmlElement array_elem, XmlElement count_elem, bool invert) : base (array_elem) { this.count_elem = count_elem; this.invert = invert; } string CountNativeType { get { return SymbolTable.Table.GetMarshalType(count_elem.GetAttribute("type")); } } string CountType { get { return SymbolTable.Table.GetCSType(count_elem.GetAttribute("type")); } } string CountCast { get { if (CountType == "int") return String.Empty; else return "(" + CountType + ") "; } } string CountName { get { return SymbolTable.Table.MangleName (count_elem.GetAttribute("name")); } } string CallCount (string name) { string result = CountCast + "(" + name + " == null ? 0 : " + name + ".Length)"; IGeneratable gen = SymbolTable.Table[count_elem.GetAttribute("type")]; return gen.CallByName (result); } public override string CallString { get { if (invert) return CallCount (CallName) + ", " + base.CallString; else return base.CallString + ", " + CallCount (CallName); } } public override string NativeSignature { get { if (invert) return CountNativeType + " " + CountName + ", " + MarshalType + " " + Name; else return MarshalType + " " + Name + ", " + CountNativeType + " " + CountName; } } } public class ErrorParameter : Parameter { public ErrorParameter (XmlElement elem) : base (elem) { PassAs = "out"; } public override string CallString { get { return "out error"; } } } public class StructParameter : Parameter { public StructParameter (XmlElement elem) : base (elem) {} public override string MarshalType { get { return "IntPtr"; } } public override string[] Prepare { get { if (PassAs == "out") return new string [] { "IntPtr native_" + CallName + " = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (" + Generatable.QualifiedName + ")));"}; else return new string [] { "IntPtr native_" + CallName + " = " + (Generatable as IManualMarshaler).AllocNative (CallName) + ";"}; } } public override string CallString { get { return "native_" + CallName; } } public override string[] Finish { get { string[] result = new string [2]; result [0] = CallName + " = " + FromNative ("native_" + CallName) + ";"; result [1] = (Generatable as IManualMarshaler).ReleaseNative ("native_" + CallName) + ";"; return result; } } public override string NativeSignature { get { return "IntPtr " + CallName; } } } public class Parameters : IEnumerable { ArrayList param_list = new ArrayList (); XmlElement elem; public Parameters (XmlElement elem) { if (elem == null) valid = true; this.elem = elem; } public int Count { get { return param_list.Count; } } public int VisibleCount { get { int visible = 0; foreach (Parameter p in this) { if (!IsHidden (p)) visible++; } return visible; } } public Parameter this [int idx] { get { return param_list [idx] as Parameter; } } public bool IsHidden (Parameter p) { int idx = param_list.IndexOf (p); if (idx > 0 && p.IsLength && p.PassAs == String.Empty && this [idx - 1].IsString) return true; if (p.IsCount && ((idx > 0 && this [idx - 1].IsArray) || (idx < Count - 1 && this [idx + 1].IsArray))) return true; if (p.CType == "GError**") return true; if (HasCB || HideData) { if (p.IsUserData && (idx == Count - 1)) return true; if (p.IsUserData && (idx == Count - 2) && this [Count - 1] is ErrorParameter) return true; if (p.IsUserData && idx > 0 && this [idx - 1].Generatable is CallbackGen) return true; if (p.IsDestroyNotify && (idx == Count - 1) && this [idx - 1].IsUserData) return true; } return false; } bool has_cb; public bool HasCB { get { return has_cb; } set { has_cb = value; } } public bool HasOutParam { get { foreach (Parameter p in this) if (p.PassAs == "out") return true; return false; } } bool hide_data; public bool HideData { get { return hide_data; } set { hide_data = value; } } bool is_static; public bool Static { get { return is_static; } set { is_static = value; } } void Clear () { elem = null; param_list.Clear (); param_list = null; } public IEnumerator GetEnumerator () { return param_list.GetEnumerator (); } bool valid = false; public bool Validate () { if (valid) return true; if (elem == null) return false; for (int i = 0; i < elem.ChildNodes.Count; i++) { XmlElement parm = elem.ChildNodes [i] as XmlElement; if (parm == null || parm.Name != "parameter") continue; Parameter p = new Parameter (parm); if (p.IsEllipsis) { Console.Write("Ellipsis parameter "); Clear (); return false; } if ((p.CSType == "") || (p.Name == "") || (p.MarshalType == "") || (SymbolTable.Table.CallByName(p.CType, p.Name) == "")) { Console.Write("Name: " + p.Name + " Type: " + p.CType + " "); Clear (); return false; } IGeneratable gen = p.Generatable; if (p.IsArray) { p = new ArrayParameter (parm); if (i < elem.ChildNodes.Count - 1) { XmlElement next = elem.ChildNodes [i + 1] as XmlElement; if (next != null || next.Name == "parameter") { Parameter c = new Parameter (next); if (c.IsCount) { p = new ArrayCountPair (parm, next, false); i++; } } } } else if (p.IsCount && i < elem.ChildNodes.Count - 1) { XmlElement next = elem.ChildNodes [i + 1] as XmlElement; if (next != null || next.Name == "parameter") { Parameter a = new Parameter (next); if (a.IsArray) { p = new ArrayCountPair (next, parm, true); i++; } } } else if (p.CType == "GError**") p = new ErrorParameter (parm); else if (gen is StructBase || gen is ByRefGen) { p = new StructParameter (parm); } else if (gen is CallbackGen) { has_cb = true; } param_list.Add (p); } if (has_cb && Count > 2 && this [Count - 3].Generatable is CallbackGen && this [Count - 2].IsUserData && this [Count - 1].IsDestroyNotify) this [Count - 3].Scope = "notified"; valid = true; return true; } public bool IsAccessor { get { return VisibleCount == 1 && AccessorParam.PassAs == "out"; } } public Parameter AccessorParam { get { foreach (Parameter p in this) { if (!IsHidden (p)) return p; } return null; } } public string AccessorReturnType { get { Parameter p = AccessorParam; if (p != null) return p.CSType; else return null; } } public string AccessorName { get { Parameter p = AccessorParam; if (p != null) return p.Name; else return null; } } public string ImportSignature { get { if (Count == 0) return String.Empty; string[] result = new string [Count]; for (int i = 0; i < Count; i++) result [i] = this [i].NativeSignature; return String.Join (", ", result); } } } } f-spot-0.8.2/lib/gio-sharp/generator/ObjectBase.cs0000644000175000017500000000221511417267577022237 0ustar00rubenruben00000000000000// ObjectBase.cs - Base class for Object types // // Authors: Mike Kestner // // Copyright (c) 2005 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Xml; public abstract class ObjectBase : HandleBase { protected ObjectBase (XmlElement ns, XmlElement elem) : base (ns, elem) {} public override string FromNative (string var, bool owned) { return "GLib.Object.GetObject(" + var + (owned ? ", true" : "") + ") as " + QualifiedName; } } } f-spot-0.8.2/lib/gio-sharp/generator/IAccessor.cs0000644000175000017500000000171011417267577022110 0ustar00rubenruben00000000000000// IAccessor.cs - Interface to generate property accessors. // // Author: Mike Kestner // // Copyright (c) 2005 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { public interface IAccessor { void WriteAccessors (System.IO.StreamWriter sw, string indentation, string field_name); } } f-spot-0.8.2/lib/gio-sharp/generator/GenerationInfo.cs0000644000175000017500000001201211417267577023141 0ustar00rubenruben00000000000000// GtkSharp.Generation.GenerationInfo.cs - Generation information class. // // Author: Mike Kestner // // Copyright (c) 2003-2008 Novell Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Xml; public class GenerationInfo { string dir; string custom_dir; string assembly_name; string gluelib_name; bool glue_enabled; StreamWriter sw; StreamWriter glue_sw; public GenerationInfo (XmlElement ns) { string ns_name = ns.GetAttribute ("name"); char sep = Path.DirectorySeparatorChar; dir = ".." + sep + ns_name.ToLower () + sep + "generated"; custom_dir = ".." + sep + ns_name.ToLower (); assembly_name = ns_name.ToLower () + "-sharp"; } public GenerationInfo (string dir, string assembly_name) : this (dir, dir, assembly_name, "", "", "") {} public GenerationInfo (string dir, string custom_dir, string assembly_name, string glue_filename, string glue_includes, string gluelib_name) { this.dir = dir; this.custom_dir = custom_dir; this.assembly_name = assembly_name; this.gluelib_name = gluelib_name; InitializeGlue (glue_filename, glue_includes, gluelib_name); } void InitializeGlue (string glue_filename, string glue_includes, string gluelib_name) { if (gluelib_name != String.Empty && glue_filename != String.Empty) { FileStream stream; try { stream = new FileStream (glue_filename, FileMode.Create, FileAccess.Write); } catch (Exception) { Console.Error.WriteLine ("Unable to create specified glue file. Glue will not be generated."); return; } glue_sw = new StreamWriter (stream); glue_sw.WriteLine ("// This file was generated by the Gtk# code generator."); glue_sw.WriteLine ("// Any changes made will be lost if regenerated."); glue_sw.WriteLine (); if (glue_includes != "") { foreach (string header in glue_includes.Split (new char[] {',', ' '})) { if (header != "") glue_sw.WriteLine ("#include <{0}>", header); } glue_sw.WriteLine (""); } glue_sw.WriteLine ("const gchar *__prefix = \"__gtksharp_\";\n"); glue_sw.WriteLine ("#define HAS_PREFIX(a) (*((guint64 *)(a)) == *((guint64 *) __prefix))\n"); glue_sw.WriteLine ("static GObjectClass *"); glue_sw.WriteLine ("get_threshold_class (GObject *obj)"); glue_sw.WriteLine ("{"); glue_sw.WriteLine ("\tGType gtype = G_TYPE_FROM_INSTANCE (obj);"); glue_sw.WriteLine ("\twhile (HAS_PREFIX (g_type_name (gtype)))"); glue_sw.WriteLine ("\t\tgtype = g_type_parent (gtype);"); glue_sw.WriteLine ("\tGObjectClass *klass = g_type_class_peek (gtype);"); glue_sw.WriteLine ("\tif (klass == NULL) klass = g_type_class_ref (gtype);"); glue_sw.WriteLine ("\treturn klass;"); glue_sw.WriteLine ("}\n"); glue_enabled = true; } } public string AssemblyName { get { return assembly_name; } } public string CustomDir { get { return custom_dir; } } public string Dir { get { return dir; } } public string GluelibName { get { return gluelib_name; } } public bool GlueEnabled { get { return glue_enabled; } } public StreamWriter GlueWriter { get { return glue_sw; } } public StreamWriter Writer { get { return sw; } set { sw = value; } } public void CloseGlueWriter () { if (glue_sw != null) glue_sw.Close (); } string member; public string CurrentMember { get { return typename + "." + member; } set { member = value; } } string typename; public string CurrentType { get { return typename; } set { typename = value; } } public StreamWriter OpenStream (string name) { char sep = Path.DirectorySeparatorChar; if (!Directory.Exists(dir)) Directory.CreateDirectory(dir); string filename = dir + sep + name + ".cs"; FileStream stream = new FileStream (filename, FileMode.Create, FileAccess.Write); StreamWriter sw = new StreamWriter (stream); sw.WriteLine ("// This file was generated by the Gtk# code generator."); sw.WriteLine ("// Any changes made will be lost if regenerated."); sw.WriteLine (); return sw; } } } f-spot-0.8.2/lib/gio-sharp/generator/ChildProperty.cs0000644000175000017500000000264411417267577023034 0ustar00rubenruben00000000000000// GtkSharp.Generation.ChildProperty.cs - GtkContainer child properties // // Copyright (c) 2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Xml; public class ChildProperty : Property { public ChildProperty (XmlElement elem, ClassBase container_type) : base (elem, container_type) {} protected override string PropertyAttribute (string qpname) { return "[Gtk.ChildProperty (" + qpname + ")]"; } protected override string RawGetter (string qpname) { return "parent.ChildGetProperty (child, " + qpname + ")"; } protected override string RawSetter (string qpname) { return "parent.ChildSetProperty(child, " + qpname + ", val)"; } } } f-spot-0.8.2/lib/gio-sharp/generator/MethodBase.cs0000644000175000017500000000766011417267577022262 0ustar00rubenruben00000000000000// GtkSharp.Generation.MethodBase.cs - function element base class. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // Copyright (c) 2004-2005 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Xml; public abstract class MethodBase { XmlElement elem; protected ClassBase container_type; Parameters parms; bool is_static = false; string mods = String.Empty; string name; private string protection = "public"; protected MethodBase (XmlElement elem, ClassBase container_type) { this.elem = elem; this.container_type = container_type; this.name = elem.GetAttribute ("name"); parms = new Parameters (elem ["parameters"]); IsStatic = elem.GetAttribute ("shared") == "true"; if (elem.HasAttribute ("new_flag")) mods = "new "; if (elem.HasAttribute ("accessibility")) { string attr = elem.GetAttribute ("accessibility"); switch (attr) { case "public": case "protected": case "internal": case "private": case "protected internal": protection = attr; break; } } } protected string BaseName { get { string name = Name; int idx = Name.LastIndexOf ("."); if (idx > 0) name = Name.Substring (idx + 1); return name; } } MethodBody body; public MethodBody Body { get { if (body == null) body = new MethodBody (parms); return body; } } public string CName { get { return SymbolTable.Table.MangleName (elem.GetAttribute ("cname")); } } protected bool HasGetterName { get { string name = BaseName; if (name.Length <= 3) return false; if (name.StartsWith ("Get") || name.StartsWith ("Has")) return Char.IsUpper (name [3]); else if (name.StartsWith ("Is")) return Char.IsUpper (name [2]); else return false; } } protected bool HasSetterName { get { string name = BaseName; if (name.Length <= 3) return false; return name.StartsWith ("Set") && Char.IsUpper (name [3]); } } public bool IsStatic { get { return is_static; } set { is_static = value; parms.Static = value; } } public string LibraryName { get { if (elem.HasAttribute ("library")) return elem.GetAttribute ("library"); return container_type.LibraryName; } } public string Modifiers { get { return mods; } set { mods = value; } } public string Name { get { return name; } set { name = value; } } public Parameters Parameters { get { return parms; } } public string Protection { get { return protection; } set { protection = value; } } protected string Safety { get { return Body.ThrowsException && !(container_type is InterfaceGen) ? "unsafe " : ""; } } Signature sig; public Signature Signature { get { if (sig == null) sig = new Signature (parms); return sig; } } public virtual bool Validate () { if (!parms.Validate ()) { Console.Write("in " + CName + " "); Statistics.ThrottledCount++; return false; } return true; } } } f-spot-0.8.2/lib/gio-sharp/generator/ObjectGen.cs0000644000175000017500000003101111417267577022072 0ustar00rubenruben00000000000000// GtkSharp.Generation.ObjectGen.cs - The Object Generatable. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // Copyright (c) 2003-2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Text; using System.Xml; public class ObjectGen : ObjectBase { private ArrayList custom_attrs = new ArrayList(); private ArrayList strings = new ArrayList(); private ArrayList vm_nodes = new ArrayList(); private Hashtable childprops = new Hashtable(); private static Hashtable dirs = new Hashtable (); public ObjectGen (XmlElement ns, XmlElement elem) : base (ns, elem) { foreach (XmlNode node in elem.ChildNodes) { string name; if (!(node is XmlElement)) continue; XmlElement member = (XmlElement) node; switch (node.Name) { case "callback": Statistics.IgnoreCount++; break; case "custom-attribute": custom_attrs.Add (member.InnerXml); break; case "virtual_method": Statistics.IgnoreCount++; break; case "static-string": strings.Add (node); break; case "childprop": name = member.GetAttribute ("name"); while (childprops.ContainsKey (name)) name += "mangled"; childprops.Add (name, new ChildProperty (member, this)); break; default: if (!IsNodeNameHandled (node.Name)) Console.WriteLine ("Unexpected node " + node.Name + " in " + CName); break; } } } public override bool Validate () { ArrayList invalids = new ArrayList (); foreach (ChildProperty prop in childprops.Values) { if (!prop.Validate ()) { Console.WriteLine ("in Object " + QualifiedName); invalids.Add (prop); } } foreach (ChildProperty prop in invalids) childprops.Remove (prop); return base.Validate (); } private bool DisableVoidCtor { get { return Elem.HasAttribute ("disable_void_ctor"); } } private bool DisableGTypeCtor { get { return Elem.HasAttribute ("disable_gtype_ctor"); } } private class DirectoryInfo { public string assembly_name; public Hashtable objects; public DirectoryInfo (string assembly_name) { this.assembly_name = assembly_name; objects = new Hashtable (); } } private static DirectoryInfo GetDirectoryInfo (string dir, string assembly_name) { DirectoryInfo result; if (dirs.ContainsKey (dir)) { result = dirs [dir] as DirectoryInfo; if (result.assembly_name != assembly_name) { Console.WriteLine ("Can't put multiple assemblies in one directory."); return null; } return result; } result = new DirectoryInfo (assembly_name); dirs.Add (dir, result); return result; } public override void Generate (GenerationInfo gen_info) { gen_info.CurrentType = Name; string asm_name = gen_info.AssemblyName.Length == 0 ? NS.ToLower () + "-sharp" : gen_info.AssemblyName; DirectoryInfo di = GetDirectoryInfo (gen_info.Dir, asm_name); StreamWriter sw = gen_info.Writer = gen_info.OpenStream (Name); sw.WriteLine ("namespace " + NS + " {"); sw.WriteLine (); sw.WriteLine ("\tusing System;"); sw.WriteLine ("\tusing System.Collections;"); sw.WriteLine ("\tusing System.Runtime.InteropServices;"); sw.WriteLine (); SymbolTable table = SymbolTable.Table; sw.WriteLine ("#region Autogenerated code"); if (IsDeprecated) sw.WriteLine ("\t[Obsolete]"); foreach (string attr in custom_attrs) sw.WriteLine ("\t" + attr); sw.Write ("\t{0} {1}class " + Name, IsInternal ? "internal" : "public", IsAbstract ? "abstract " : ""); string cs_parent = table.GetCSType(Elem.GetAttribute("parent")); if (cs_parent != "") { di.objects.Add (CName, QualifiedName); sw.Write (" : " + cs_parent); } foreach (string iface in interfaces) { if (Parent != null && Parent.Implements (iface)) continue; sw.Write (", " + table.GetCSType (iface)); } foreach (string iface in managed_interfaces) { if (Parent != null && Parent.Implements (iface)) continue; sw.Write (", " + iface); } sw.WriteLine (" {"); sw.WriteLine (); GenCtors (gen_info); GenProperties (gen_info, null); GenFields (gen_info); GenChildProperties (gen_info); bool has_sigs = (sigs != null && sigs.Count > 0); if (!has_sigs) { foreach (string iface in interfaces) { ClassBase igen = table.GetClassGen (iface); if (igen != null && igen.Signals != null) { has_sigs = true; break; } } } if (has_sigs && Elem.HasAttribute("parent")) { GenSignals (gen_info, null); } if (vm_nodes.Count > 0) { if (gen_info.GlueEnabled) { GenVirtualMethods (gen_info); } else { Statistics.VMIgnored = true; Statistics.ThrottledCount += vm_nodes.Count; } } GenMethods (gen_info, null, null); if (interfaces.Count != 0) { Hashtable all_methods = new Hashtable (); foreach (Method m in Methods.Values) all_methods[m.Name] = m; Hashtable collisions = new Hashtable (); foreach (string iface in interfaces) { ClassBase igen = table.GetClassGen (iface); foreach (Method m in igen.Methods.Values) { Method collision = all_methods[m.Name] as Method; if (collision != null && collision.Signature.Types == m.Signature.Types) collisions[m.Name] = true; else all_methods[m.Name] = m; } } foreach (string iface in interfaces) { if (Parent != null && Parent.Implements (iface)) continue; ClassBase igen = table.GetClassGen (iface); igen.GenMethods (gen_info, collisions, this); igen.GenProperties (gen_info, this); igen.GenSignals (gen_info, this); } } foreach (XmlElement str in strings) { sw.Write ("\t\tpublic static string " + str.GetAttribute ("name")); sw.WriteLine (" {\n\t\t\t get { return \"" + str.GetAttribute ("value") + "\"; }\n\t\t}"); } if (cs_parent != String.Empty && GetExpected (CName) != QualifiedName) { sw.WriteLine (); sw.WriteLine ("\t\tstatic " + Name + " ()"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tGtkSharp." + Studlify (asm_name) + ".ObjectManager.Initialize ();"); sw.WriteLine ("\t\t}"); } sw.WriteLine ("#endregion"); AppendCustom (sw, gen_info.CustomDir); sw.WriteLine ("\t}"); sw.WriteLine ("}"); sw.Close (); gen_info.Writer = null; Statistics.ObjectCount++; } protected override void GenCtors (GenerationInfo gen_info) { if (!Elem.HasAttribute("parent")) return; if (!DisableGTypeCtor) { gen_info.Writer.WriteLine("\t\t[Obsolete]"); gen_info.Writer.WriteLine("\t\tprotected " + Name + "(GLib.GType gtype) : base(gtype) {}"); } gen_info.Writer.WriteLine("\t\tpublic " + Name + "(IntPtr raw) : base(raw) {}"); if (ctors.Count == 0 && !DisableVoidCtor) { gen_info.Writer.WriteLine(); gen_info.Writer.WriteLine("\t\tprotected " + Name + "() : base(IntPtr.Zero)"); gen_info.Writer.WriteLine("\t\t{"); gen_info.Writer.WriteLine("\t\t\tCreateNativeObject (new string [0], new GLib.Value [0]);"); gen_info.Writer.WriteLine("\t\t}"); } gen_info.Writer.WriteLine(); base.GenCtors (gen_info); } protected void GenChildProperties (GenerationInfo gen_info) { if (childprops.Count == 0) return; StreamWriter sw = gen_info.Writer; ObjectGen child_ancestor = Parent as ObjectGen; while (child_ancestor.CName != "GtkContainer" && child_ancestor.childprops.Count == 0) child_ancestor = child_ancestor.Parent as ObjectGen; sw.WriteLine ("\t\tpublic class " + Name + "Child : " + child_ancestor.NS + "." + child_ancestor.Name + "." + child_ancestor.Name + "Child {"); sw.WriteLine ("\t\t\tprotected internal " + Name + "Child (Gtk.Container parent, Gtk.Widget child) : base (parent, child) {}"); sw.WriteLine (""); foreach (ChildProperty prop in childprops.Values) prop.Generate (gen_info, "\t\t\t", null); sw.WriteLine ("\t\t}"); sw.WriteLine (""); sw.WriteLine ("\t\tpublic override Gtk.Container.ContainerChild this [Gtk.Widget child] {"); sw.WriteLine ("\t\t\tget {"); sw.WriteLine ("\t\t\t\treturn new " + Name + "Child (this, child);"); sw.WriteLine ("\t\t\t}"); sw.WriteLine ("\t\t}"); sw.WriteLine (""); } private void GenVMGlue (GenerationInfo gen_info, XmlElement elem) { StreamWriter sw = gen_info.GlueWriter; string vm_name = elem.GetAttribute ("cname"); string method = gen_info.GluelibName + "_" + NS + Name + "_override_" + vm_name; sw.WriteLine (); sw.WriteLine ("void " + method + " (GType type, gpointer cb);"); sw.WriteLine (); sw.WriteLine ("void"); sw.WriteLine (method + " (GType type, gpointer cb)"); sw.WriteLine ("{"); sw.WriteLine ("\t{0} *klass = ({0} *) g_type_class_peek (type);", NS + Name + "Class"); sw.WriteLine ("\tklass->" + vm_name + " = cb;"); sw.WriteLine ("}"); } static bool vmhdrs_needed = true; private void GenVirtualMethods (GenerationInfo gen_info) { if (vmhdrs_needed) { gen_info.GlueWriter.WriteLine ("#include "); gen_info.GlueWriter.WriteLine ("#include \"vmglueheaders.h\""); gen_info.GlueWriter.WriteLine (); vmhdrs_needed = false; } foreach (XmlElement elem in vm_nodes) { GenVMGlue (gen_info, elem); } } /* Keep this in sync with the one in glib/GType.cs */ private static string GetExpected (string cname) { for (int i = 1; i < cname.Length; i++) { if (Char.IsUpper (cname[i])) { if (i == 1 && cname[0] == 'G') return "GLib." + cname.Substring (1); else return cname.Substring (0, i) + "." + cname.Substring (i); } } throw new ArgumentException ("cname doesn't follow the NamespaceType capitalization style: " + cname); } private static bool NeedsMap (Hashtable objs, string assembly_name) { foreach (string key in objs.Keys) if (GetExpected (key) != ((string) objs[key])) return true; return false; } private static string Studlify (string name) { string result = ""; string[] subs = name.Split ('-'); foreach (string sub in subs) result += Char.ToUpper (sub[0]) + sub.Substring (1); return result; } public static void GenerateMappers () { foreach (string dir in dirs.Keys) { DirectoryInfo di = dirs[dir] as DirectoryInfo; if (!NeedsMap (di.objects, di.assembly_name)) continue; GenerationInfo gen_info = new GenerationInfo (dir, di.assembly_name); GenerateMapper (di, gen_info); } } private static void GenerateMapper (DirectoryInfo dir_info, GenerationInfo gen_info) { StreamWriter sw = gen_info.OpenStream ("ObjectManager"); sw.WriteLine ("namespace GtkSharp." + Studlify (dir_info.assembly_name) + " {"); sw.WriteLine (); sw.WriteLine ("\tpublic class ObjectManager {"); sw.WriteLine (); sw.WriteLine ("\t\tstatic bool initialized = false;"); sw.WriteLine ("\t\t// Call this method from the appropriate module init function."); sw.WriteLine ("\t\tpublic static void Initialize ()"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tif (initialized)"); sw.WriteLine ("\t\t\t\treturn;"); sw.WriteLine (""); sw.WriteLine ("\t\t\tinitialized = true;"); foreach (string key in dir_info.objects.Keys) { if (GetExpected(key) != ((string) dir_info.objects[key])) sw.WriteLine ("\t\t\tGLib.GType.Register ({0}.GType, typeof ({0}));", dir_info.objects [key]); } sw.WriteLine ("\t\t}"); sw.WriteLine ("\t}"); sw.WriteLine ("}"); sw.Close (); } } } f-spot-0.8.2/lib/gio-sharp/generator/VMSignature.cs0000644000175000017500000000371311417267577022446 0ustar00rubenruben00000000000000// GtkSharp.Generation.VMSignature.cs - The Virtual Method Signature Generation Class. // // Author: Mike Kestner // // Copyright (c) 2003-2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.Xml; public class VMSignature { private ArrayList parms = new ArrayList (); public VMSignature (Parameters parms) { bool has_cb = parms.HideData; for (int i = 1; i < parms.Count; i++) { Parameter p = parms [i]; if (i > 1 && p.IsLength && parms [i - 1].IsString) continue; if (p.IsCount && ((i > 1 && parms [i - 1].IsArray) || (i < parms.Count - 1 && parms [i + 1].IsArray))) continue; has_cb = has_cb || p.Generatable is CallbackGen; if (p.IsUserData && has_cb) continue; if (p.CType == "GError**") continue; if (p.Scope == "notified") i += 2; this.parms.Add (p); } } public override string ToString () { if (parms.Count == 0) return ""; string[] result = new string [parms.Count]; int i = 0; foreach (Parameter p in parms) { result [i] = p.PassAs != "" ? p.PassAs + " " : ""; result [i++] += p.CSType + " " + p.Name; } return String.Join (", ", result); } } } f-spot-0.8.2/lib/gio-sharp/generator/ManualGen.cs0000644000175000017500000000311511417267577022105 0ustar00rubenruben00000000000000// GtkSharp.Generation.ManualGen.cs - Ungenerated handle type Generatable. // // Author: Mike Kestner // // Copyright (c) 2003 Mike Kestner // Copyright (c) 2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; public class ManualGen : SimpleBase { string from_fmt; public ManualGen (string ctype, string type) : base (ctype, type, "null") { from_fmt = "new " + QualifiedName + "({0})"; } public ManualGen (string ctype, string type, string from_fmt) : base (ctype, type, "null") { this.from_fmt = from_fmt; } public override string MarshalType { get { return "IntPtr"; } } public override string CallByName (string var_name) { return var_name + " == null ? IntPtr.Zero : " + var_name + ".Handle"; } public override string FromNative(string var) { return String.Format (from_fmt, var); } } } f-spot-0.8.2/lib/gio-sharp/generator/StructField.cs0000644000175000017500000001022111417267577022462 0ustar00rubenruben00000000000000// GtkSharp.Generation.StructField.cs - The Structure Field generation // Class. // // Author: Mike Kestner // // Copyright (c) 2004-2005 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.IO; using System.Xml; public class StructField : FieldBase { public static int bitfields; public StructField (XmlElement elem, ClassBase container_type) : base (elem, container_type) {} protected override string DefaultAccess { get { if (IsPadding) return "private"; return "public"; } } int ArrayLength { get { if (!IsArray) return 0; int result; try { result = Int32.Parse (elem.GetAttribute("array_len")); } catch (Exception) { Console.Write ("Non-numeric array_len: " + elem.GetAttribute("array_len")); Console.WriteLine (" warning: array field {0} incorrectly generated", Name); result = 0; } return result; } } public new string CSType { get { string type = base.CSType; if (IsArray) type += "[]"; else if ((IsPointer || SymbolTable.Table.IsOpaque (CType)) && type != "string") type = "IntPtr"; return type; } } bool IsPadding { get { return (CName.StartsWith ("dummy") || CName.StartsWith ("padding")); } } public bool IsPointer { get { return (CType.EndsWith ("*") || CType.EndsWith ("pointer")); } } public new string Name { get { string result = ""; if ((IsPointer || SymbolTable.Table.IsOpaque (CType)) && CSType != "string") result = "_"; result += SymbolTable.Table.MangleName (CName); return result; } } string StudlyName { get { string studly = base.Name; if (studly == "") throw new Exception ("API file must be regenerated with a current version of the GAPI parser. It is incompatible with this version of the GAPI code generator."); return studly; } } public override void Generate (GenerationInfo gen_info, string indent) { if (Hidden) return; StreamWriter sw = gen_info.Writer; SymbolTable table = SymbolTable.Table; string wrapped = table.GetCSType (CType); string wrapped_name = SymbolTable.Table.MangleName (CName); IGeneratable gen = table [CType]; if (IsArray) { sw.WriteLine (indent + "[MarshalAs (UnmanagedType.ByValArray, SizeConst=" + ArrayLength + ")]"); sw.WriteLine (indent + "{0} {1} {2};", Access, CSType, StudlyName); } else if (IsBitfield) { base.Generate (gen_info, indent); } else if (gen is IAccessor) { sw.WriteLine (indent + "private {0} {1};", gen.MarshalType, Name); if (Access != "private") { IAccessor acc = table [CType] as IAccessor; sw.WriteLine (indent + Access + " " + wrapped + " " + StudlyName + " {"); acc.WriteAccessors (sw, indent + "\t", Name); sw.WriteLine (indent + "}"); } } else if (IsPointer && (gen is StructGen || gen is BoxedGen)) { sw.WriteLine (indent + "private {0} {1};", CSType, Name); sw.WriteLine (); if (Access != "private") { sw.WriteLine (indent + Access + " " + wrapped + " " + wrapped_name + " {"); sw.WriteLine (indent + "\tget { return " + table.FromNativeReturn (CType, Name) + "; }"); sw.WriteLine (indent + "}"); } } else if (IsPointer && CSType != "string") { // FIXME: probably some fields here which should be visible. sw.WriteLine (indent + "private {0} {1};", CSType, Name); } else { sw.WriteLine (indent + "{0} {1} {2};", Access, CSType, Access == "public" ? StudlyName : Name); } } } } f-spot-0.8.2/lib/gio-sharp/generator/CodeGenerator.cs0000644000175000017500000000712211417267577022761 0ustar00rubenruben00000000000000// GtkSharp.Generation.CodeGenerator.cs - The main code generation engine. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // Copyright (c) 2003-2004 Novell Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.Xml; public class CodeGenerator { public static int Main (string[] args) { if (args.Length < 2) { Console.WriteLine ("Usage: codegen --generate "); return 0; } bool generate = false; string dir = ""; string custom_dir = ""; string assembly_name = ""; string glue_filename = ""; string glue_includes = ""; string gluelib_name = ""; SymbolTable table = SymbolTable.Table; ArrayList gens = new ArrayList (); foreach (string arg in args) { string filename = arg; if (arg == "--generate") { generate = true; continue; } else if (arg == "--include") { generate = false; continue; } else if (arg.StartsWith ("-I:")) { generate = false; filename = filename.Substring (3); } else if (arg.StartsWith ("--outdir=")) { generate = false; dir = arg.Substring (9); continue; } else if (arg.StartsWith ("--customdir=")) { generate = false; custom_dir = arg.Substring (12); continue; } else if (arg.StartsWith ("--assembly-name=")) { generate = false; assembly_name = arg.Substring (16); continue; } else if (arg.StartsWith ("--glue-filename=")) { generate = false; glue_filename = arg.Substring (16); continue; } else if (arg.StartsWith ("--glue-includes=")) { generate = false; glue_includes = arg.Substring (16); continue; } else if (arg.StartsWith ("--gluelib-name=")) { generate = false; gluelib_name = arg.Substring (15); continue; } Parser p = new Parser (); IGeneratable[] curr_gens = p.Parse (filename); table.AddTypes (curr_gens); if (generate) gens.AddRange (curr_gens); } // Now that everything is loaded, validate all the to-be- // generated generatables and then remove the invalid ones. ArrayList invalids = new ArrayList (); foreach (IGeneratable gen in gens) { if (!gen.Validate ()) invalids.Add (gen); } foreach (IGeneratable gen in invalids) gens.Remove (gen); GenerationInfo gen_info = null; if (dir != "" || assembly_name != "" || glue_filename != "" || glue_includes != "" || gluelib_name != "") gen_info = new GenerationInfo (dir, custom_dir, assembly_name, glue_filename, glue_includes, gluelib_name); foreach (IGeneratable gen in gens) { if (gen_info == null) gen.Generate (); else gen.Generate (gen_info); } ObjectGen.GenerateMappers (); if (gen_info != null) gen_info.CloseGlueWriter (); Statistics.Report(); return 0; } } } f-spot-0.8.2/lib/gio-sharp/generator/GenBase.cs0000644000175000017500000000626711417267577021555 0ustar00rubenruben00000000000000// GtkSharp.Generation.GenBase.cs - The Generatable base class. // // Author: Mike Kestner // // Copyright (c) 2001-2002 Mike Kestner // Copyright (c) 2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.IO; using System.Xml; public abstract class GenBase : IGeneratable { private XmlElement ns; private XmlElement elem; protected GenBase (XmlElement ns, XmlElement elem) { this.ns = ns; this.elem = elem; } public string CName { get { return elem.GetAttribute ("cname"); } } public XmlElement Elem { get { return elem; } } public bool IsInternal { get { if (elem.HasAttribute ("internal")) { string attr = elem.GetAttribute ("internal"); return attr == "1" || attr == "true"; } return false; } } public string LibraryName { get { return ns.GetAttribute ("library"); } } public virtual string MarshalReturnType { get { return MarshalType; } } public abstract string MarshalType { get; } public string Name { get { return elem.GetAttribute ("name"); } } public string NS { get { return ns.GetAttribute ("name"); } } public abstract string DefaultValue { get; } public string QualifiedName { get { return NS + "." + Name; } } public virtual string ToNativeReturnType { get { return MarshalType; } } protected void AppendCustom (StreamWriter sw, string custom_dir) { char sep = Path.DirectorySeparatorChar; string custom = custom_dir + sep + Name + ".custom"; if (File.Exists(custom)) { sw.WriteLine ("#region Customized extensions"); sw.WriteLine ("#line 1 \"" + Name + ".custom\""); FileStream custstream = new FileStream(custom, FileMode.Open, FileAccess.Read); StreamReader sr = new StreamReader(custstream); sw.WriteLine (sr.ReadToEnd ()); sw.WriteLine ("#endregion"); sr.Close (); } } public abstract string CallByName (string var); public abstract string FromNative (string var); public virtual string FromNativeReturn (string var) { return FromNative (var); } public virtual string ToNativeReturn (string var) { return CallByName (var); } public abstract bool Validate (); public void Generate () { GenerationInfo geninfo = new GenerationInfo (ns); Generate (geninfo); } public abstract void Generate (GenerationInfo geninfo); } } f-spot-0.8.2/lib/gio-sharp/generator/ConstStringGen.cs0000644000175000017500000000330411417267577023145 0ustar00rubenruben00000000000000// GtkSharp.Generation.ConstStringGen.cs - The Const String type Generatable. // // Author: Rachel Hestilow // Mike Kestner // // Copyright (c) 2003 Rachel Hestilow // Copyright (c) 2005 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; public class ConstStringGen : SimpleBase, IManualMarshaler { public ConstStringGen (string ctype) : base (ctype, "string", "null") {} public override string MarshalType { get { return "IntPtr"; } } public override string FromNative (string var) { return "GLib.Marshaller.Utf8PtrToString (" + var + ")"; } public override string ToNativeReturn (string var) { return "GLib.Marshaller.StringToPtrGStrdup (" + var + ")"; } public string AllocNative (string managed_var) { return "GLib.Marshaller.StringToPtrGStrdup (" + managed_var + ")"; } public string ReleaseNative (string native_var) { return "GLib.Marshaller.Free (" + native_var + ")"; } } } f-spot-0.8.2/lib/gio-sharp/generator/OpaqueGen.cs0000644000175000017500000001605511417267577022131 0ustar00rubenruben00000000000000// GtkSharp.Generation.OpaqueGen.cs - The Opaque Generatable. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Xml; public class OpaqueGen : HandleBase { public OpaqueGen (XmlElement ns, XmlElement elem) : base (ns, elem) {} public override string FromNative(string var, bool owned) { return var + " == IntPtr.Zero ? null : (" + QualifiedName + ") GLib.Opaque.GetOpaque (" + var + ", typeof (" + QualifiedName + "), " + (owned ? "true" : "false") + ")"; } private bool DisableRawCtor { get { return Elem.HasAttribute ("disable_raw_ctor"); } } public override void Generate (GenerationInfo gen_info) { gen_info.CurrentType = Name; StreamWriter sw = gen_info.Writer = gen_info.OpenStream (Name); sw.WriteLine ("namespace " + NS + " {"); sw.WriteLine (); sw.WriteLine ("\tusing System;"); sw.WriteLine ("\tusing System.Collections;"); sw.WriteLine ("\tusing System.Runtime.InteropServices;"); sw.WriteLine (); sw.WriteLine ("#region Autogenerated code"); SymbolTable table = SymbolTable.Table; Method ref_, unref, dispose; GetSpecialMethods (out ref_, out unref, out dispose); if (IsDeprecated) sw.WriteLine ("\t[Obsolete]"); sw.Write ("\t{0} class " + Name, IsInternal ? "internal" : "public"); string cs_parent = table.GetCSType(Elem.GetAttribute("parent")); if (cs_parent != "") sw.Write (" : " + cs_parent); else sw.Write (" : GLib.Opaque"); sw.WriteLine (" {"); sw.WriteLine (); GenFields (gen_info); GenMethods (gen_info, null, null); GenCtors (gen_info); if (ref_ != null) { ref_.GenerateImport (sw); sw.WriteLine ("\t\tprotected override void Ref (IntPtr raw)"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tif (!Owned) {"); sw.WriteLine ("\t\t\t\t" + ref_.CName + " (raw);"); sw.WriteLine ("\t\t\t\tOwned = true;"); sw.WriteLine ("\t\t\t}"); sw.WriteLine ("\t\t}"); sw.WriteLine (); if (ref_.IsDeprecated) { sw.WriteLine ("\t\t[Obsolete(\"" + QualifiedName + " is now refcounted automatically\")]"); if (ref_.ReturnType == "void") sw.WriteLine ("\t\tpublic void Ref () {}"); else sw.WriteLine ("\t\tpublic " + Name + " Ref () { return this; }"); sw.WriteLine (); } } bool finalizer_needed = false; if (unref != null) { unref.GenerateImport (sw); sw.WriteLine ("\t\tprotected override void Unref (IntPtr raw)"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tif (Owned) {"); sw.WriteLine ("\t\t\t\t" + unref.CName + " (raw);"); sw.WriteLine ("\t\t\t\tOwned = false;"); sw.WriteLine ("\t\t\t}"); sw.WriteLine ("\t\t}"); sw.WriteLine (); if (unref.IsDeprecated) { sw.WriteLine ("\t\t[Obsolete(\"" + QualifiedName + " is now refcounted automatically\")]"); sw.WriteLine ("\t\tpublic void Unref () {}"); sw.WriteLine (); } finalizer_needed = true; } if (dispose != null) { dispose.GenerateImport (sw); sw.WriteLine ("\t\tprotected override void Free (IntPtr raw)"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\t" + dispose.CName + " (raw);"); sw.WriteLine ("\t\t}"); sw.WriteLine (); if (dispose.IsDeprecated) { sw.WriteLine ("\t\t[Obsolete(\"" + QualifiedName + " is now freed automatically\")]"); sw.WriteLine ("\t\tpublic void " + dispose.Name + " () {}"); sw.WriteLine (); } finalizer_needed = true; } if (finalizer_needed) { sw.WriteLine ("\t\tclass FinalizerInfo {"); sw.WriteLine ("\t\t\tIntPtr handle;"); sw.WriteLine (); sw.WriteLine ("\t\t\tpublic FinalizerInfo (IntPtr handle)"); sw.WriteLine ("\t\t\t{"); sw.WriteLine ("\t\t\t\tthis.handle = handle;"); sw.WriteLine ("\t\t\t}"); sw.WriteLine (); sw.WriteLine ("\t\t\tpublic bool Handler ()"); sw.WriteLine ("\t\t\t{"); if (dispose != null) sw.WriteLine ("\t\t\t\t{0} (handle);", dispose.CName); else if (unref != null) sw.WriteLine ("\t\t\t\t{0} (handle);", unref.CName); sw.WriteLine ("\t\t\t\treturn false;"); sw.WriteLine ("\t\t\t}"); sw.WriteLine ("\t\t}"); sw.WriteLine (); sw.WriteLine ("\t\t~{0} ()", Name); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tif (!Owned)"); sw.WriteLine ("\t\t\t\treturn;"); sw.WriteLine ("\t\t\tFinalizerInfo info = new FinalizerInfo (Handle);"); sw.WriteLine ("\t\t\tGLib.Timeout.Add (50, new GLib.TimeoutHandler (info.Handler));"); sw.WriteLine ("\t\t}"); sw.WriteLine (); } #if false Method copy = Methods ["Copy"] as Method; if (copy != null && copy.Parameters.Count == 0) { sw.WriteLine ("\t\tprotected override GLib.Opaque Copy (IntPtr raw)"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tGLib.Opaque result = new " + QualifiedName + " (" + copy.CName + " (raw));"); sw.WriteLine ("\t\t\tresult.Owned = true;"); sw.WriteLine ("\t\t\treturn result;"); sw.WriteLine ("\t\t}"); sw.WriteLine (); } #endif sw.WriteLine ("#endregion"); AppendCustom(sw, gen_info.CustomDir); sw.WriteLine ("\t}"); sw.WriteLine ("}"); sw.Close (); gen_info.Writer = null; Statistics.OpaqueCount++; } void GetSpecialMethods (out Method ref_, out Method unref, out Method dispose) { ref_ = CheckSpecialMethod (GetMethod ("Ref")); unref = CheckSpecialMethod (GetMethod ("Unref")); dispose = GetMethod ("Free"); if (dispose == null) { dispose = GetMethod ("Destroy"); if (dispose == null) dispose = GetMethod ("Dispose"); } dispose = CheckSpecialMethod (dispose); } Method CheckSpecialMethod (Method method) { if (method == null) return null; if (method.ReturnType != "void" && method.ReturnType != QualifiedName) return null; if (method.Signature.ToString () != "") return null; methods.Remove (method.Name); return method; } protected override void GenCtors (GenerationInfo gen_info) { if (!DisableRawCtor) { gen_info.Writer.WriteLine("\t\tpublic " + Name + "(IntPtr raw) : base(raw) {}"); gen_info.Writer.WriteLine(); } base.GenCtors (gen_info); } } } f-spot-0.8.2/lib/gio-sharp/generator/ManagedCallString.cs0000644000175000017500000001033011417267577023552 0ustar00rubenruben00000000000000// GtkSharp.Generation.ManagedCallString.cs - The ManagedCallString Class. // // Author: Mike Kestner // // Copyright (c) 2003 Mike Kestner // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; public class ManagedCallString { ArrayList parms = new ArrayList (); ArrayList special = new ArrayList (); string error_param = null; string user_data_param = null; string destroy_param = null; public ManagedCallString (Parameters parms, bool drop_first) { for (int i = drop_first ? 1 : 0; i < parms.Count; i ++) { Parameter p = parms [i]; if (p.IsLength && i > 0 && parms [i-1].IsString) continue; else if (p.Scope == "notified") { user_data_param = parms[i+1].Name; destroy_param = parms[i+2].Name; i += 2; } else if (p.IsUserData && parms.IsHidden (p)) { user_data_param = p.Name; continue; } else if (p is ErrorParameter) { error_param = p.Name; continue; } this.parms.Add (p); if (p.PassAs != String.Empty && (p.Name != p.FromNative (p.Name))) this.special.Add (true); else if (p.Generatable is CallbackGen) this.special.Add (true); else this.special.Add (false); } } public bool HasOutParam { get { foreach (Parameter p in parms) { if (p.PassAs == "out") return true; } return false; } } public string Unconditional (string indent) { string ret = ""; if (error_param != null) ret = indent + error_param + " = IntPtr.Zero;\n"; return ret; } public string Setup (string indent) { string ret = ""; for (int i = 0; i < parms.Count; i ++) { if ((bool)special[i] == false) continue; Parameter p = parms [i] as Parameter; IGeneratable igen = p.Generatable; if (igen is CallbackGen) { if (user_data_param == null) ret += indent + String.Format ("{0} {1}_invoker = new {0} ({1});\n", (igen as CallbackGen).InvokerName, p.Name); else if (destroy_param == null) ret += indent + String.Format ("{0} {1}_invoker = new {0} ({1}, {2});\n", (igen as CallbackGen).InvokerName, p.Name, user_data_param); else ret += indent + String.Format ("{0} {1}_invoker = new {0} ({1}, {2}, {3});\n", (igen as CallbackGen).InvokerName, p.Name, user_data_param, destroy_param); } else { ret += indent + igen.QualifiedName + " my" + p.Name; if (p.PassAs == "ref") ret += " = " + p.FromNative (p.Name); ret += ";\n"; } } return ret; } public override string ToString () { if (parms.Count < 1) return ""; string[] result = new string [parms.Count]; for (int i = 0; i < parms.Count; i ++) { Parameter p = parms [i] as Parameter; result [i] = p.PassAs == "" ? "" : p.PassAs + " "; if (p.Generatable is CallbackGen) result [i] += p.Name + "_invoker.Handler"; else result [i] += ((bool)special[i]) ? "my" + p.Name : p.FromNative (p.Name); } return String.Join (", ", result); } public string Finish (string indent) { string ret = ""; for (int i = 0; i < parms.Count; i ++) { if ((bool)special[i] == false) continue; Parameter p = parms [i] as Parameter; IGeneratable igen = p.Generatable; if (igen is CallbackGen) continue; else if (igen is StructBase || igen is ByRefGen) ret += indent + String.Format ("if ({0} != IntPtr.Zero) System.Runtime.InteropServices.Marshal.StructureToPtr (my{0}, {0}, false);\n", p.Name); else ret += indent + p.Name + " = " + igen.ToNativeReturn ("my" + p.Name) + ";\n"; } return ret; } } } f-spot-0.8.2/lib/gio-sharp/generator/Parser.cs0000644000175000017500000001135411417267577021476 0ustar00rubenruben00000000000000// GtkSharp.Generation.Parser.cs - The XML Parsing engine. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // Copyright (c) 2003 Ximian Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Xml; public class Parser { private XmlDocument Load (string filename) { XmlDocument doc = new XmlDocument (); try { Stream stream = File.OpenRead (filename); doc.Load (stream); stream.Close (); } catch (XmlException e) { Console.WriteLine ("Invalid XML file."); Console.WriteLine (e); doc = null; } return doc; } public IGeneratable[] Parse (string filename) { XmlDocument doc = Load (filename); if (doc == null) return null; XmlElement root = doc.DocumentElement; if ((root == null) || !root.HasChildNodes) { Console.WriteLine ("No Namespaces found."); return null; } ArrayList gens = new ArrayList (); foreach (XmlNode child in root.ChildNodes) { XmlElement elem = child as XmlElement; if (elem == null) continue; switch (child.Name) { case "namespace": gens.AddRange (ParseNamespace (elem)); break; case "symbol": gens.Add (ParseSymbol (elem)); break; default: Console.WriteLine ("Parser::Parse - Unexpected child node: " + child.Name); break; } } return (IGeneratable[]) gens.ToArray (typeof (IGeneratable)); } private ArrayList ParseNamespace (XmlElement ns) { ArrayList result = new ArrayList (); foreach (XmlNode def in ns.ChildNodes) { XmlElement elem = def as XmlElement; if (elem == null) continue; if (elem.HasAttribute("hidden")) continue; bool is_opaque = false; if (elem.GetAttribute ("opaque") == "true" || elem.GetAttribute ("opaque") == "1") is_opaque = true; switch (def.Name) { case "alias": string aname = elem.GetAttribute("cname"); string atype = elem.GetAttribute("type"); if ((aname == "") || (atype == "")) continue; result.Add (new AliasGen (aname, atype)); break; case "boxed": result.Add (is_opaque ? new OpaqueGen (ns, elem) as object : new BoxedGen (ns, elem) as object); break; case "callback": result.Add (new CallbackGen (ns, elem)); break; case "enum": result.Add (new EnumGen (ns, elem)); break; case "interface": result.Add (new InterfaceGen (ns, elem)); break; case "object": result.Add (new ObjectGen (ns, elem)); break; case "class": result.Add (new ClassGen (ns, elem)); break; case "struct": result.Add (is_opaque ? new OpaqueGen (ns, elem) as object : new StructGen (ns, elem) as object); break; default: Console.WriteLine ("Parser::ParseNamespace - Unexpected node: " + def.Name); break; } } return result; } private IGeneratable ParseSymbol (XmlElement symbol) { string type = symbol.GetAttribute ("type"); string cname = symbol.GetAttribute ("cname"); string name = symbol.GetAttribute ("name"); IGeneratable result = null; if (type == "simple") { if (symbol.HasAttribute ("default_value")) result = new SimpleGen (cname, name, symbol.GetAttribute ("default_value")); else { Console.WriteLine ("Simple type element " + cname + " has no specified default value"); result = new SimpleGen (cname, name, String.Empty); } } else if (type == "manual") result = new ManualGen (cname, name); else if (type == "alias") result = new AliasGen (cname, name); else if (type == "marshal") { string mtype = symbol.GetAttribute ("marshal_type"); string call = symbol.GetAttribute ("call_fmt"); string from = symbol.GetAttribute ("from_fmt"); result = new MarshalGen (cname, name, mtype, call, from); } else Console.WriteLine ("Parser::ParseSymbol - Unexpected symbol type " + type); return result; } } } f-spot-0.8.2/lib/gio-sharp/generator/MarshalGen.cs0000644000175000017500000000266611417267577022271 0ustar00rubenruben00000000000000// GtkSharp.Generation.MarshalGen.cs - Simple marshaling Generatable. // // Author: Mike Kestner // // Copyright (c) 2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; public class MarshalGen : SimpleBase { string mtype; string call_fmt; string from_fmt; public MarshalGen (string ctype, string type, string mtype, string call_fmt, string from_fmt) : base (ctype, type, "null") { this.mtype = mtype; this.call_fmt = call_fmt; this.from_fmt = from_fmt; } public override string MarshalType { get { return mtype; } } public override string CallByName (string var) { return String.Format (call_fmt, var); } public override string FromNative (string var) { return String.Format (from_fmt, var); } } } f-spot-0.8.2/lib/gio-sharp/generator/IManualMarshaler.cs0000644000175000017500000000200011417267577023413 0ustar00rubenruben00000000000000// GtkSharp.Generation.IManualMarshaler.cs - Interface for manual marshaling. // // Author: Mike Kestner // // Copyright (c) 2005 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { public interface IManualMarshaler { string AllocNative (string managed_var); string ReleaseNative (string native_var); } } f-spot-0.8.2/lib/gio-sharp/generator/ConstFilenameGen.cs0000644000175000017500000000274211417267577023424 0ustar00rubenruben00000000000000// ConstFilenameGen.cs - The Const Filename type Generatable. // // Author: Mike Kestner // // Copyright (c) 2005 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; public class ConstFilenameGen : SimpleBase, IManualMarshaler { public ConstFilenameGen (string ctype) : base (ctype, "string", "null") {} public override string MarshalType { get { return "IntPtr"; } } public override string FromNative (string var) { return "GLib.Marshaller.FilenamePtrToString (" + var + ")"; } public string AllocNative (string managed_var) { return "GLib.Marshaller.StringToFilenamePtr (" + managed_var + ")"; } public string ReleaseNative (string native_var) { return "GLib.Marshaller.Free (" + native_var + ")"; } } } f-spot-0.8.2/lib/gio-sharp/generator/InterfaceGen.cs0000644000175000017500000003013611417267577022573 0ustar00rubenruben00000000000000// GtkSharp.Generation.InterfaceGen.cs - The Interface Generatable. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // Copyright (c) 2004, 2007 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Xml; public class InterfaceGen : ObjectBase { bool consume_only; ArrayList vms = new ArrayList (); ArrayList members = new ArrayList (); public InterfaceGen (XmlElement ns, XmlElement elem) : base (ns, elem) { consume_only = elem.HasAttribute ("consume_only"); foreach (XmlNode node in elem.ChildNodes) { switch (node.Name) { case "virtual_method": VirtualMethod vm = new VirtualMethod (node as XmlElement, this); vms.Add (vm); members.Add (vm); break; case "signal": object sig = sigs [(node as XmlElement).GetAttribute ("name")]; if (sig == null) sig = new Signal (node as XmlElement, this); members.Add (sig); break; default: if (!IsNodeNameHandled (node.Name)) Console.WriteLine ("Unexpected node " + node.Name + " in " + CName); break; } } } public bool IsConsumeOnly { get { return consume_only; } } public override string FromNative (string var, bool owned) { return QualifiedName + "Adapter.GetObject (" + var + ", " + (owned ? "true" : "false") + ")"; } public override bool ValidateForSubclass () { ArrayList invalids = new ArrayList (); foreach (Method method in methods.Values) { if (!method.Validate ()) { Console.WriteLine ("in type " + QualifiedName); invalids.Add (method); } } foreach (Method method in invalids) methods.Remove (method.Name); invalids.Clear (); return base.ValidateForSubclass (); } string IfaceName { get { return Name + "Iface"; } } void GenerateIfaceStruct (StreamWriter sw) { sw.WriteLine ("\t\tstatic " + IfaceName + " iface;"); sw.WriteLine (); sw.WriteLine ("\t\tstruct " + IfaceName + " {"); sw.WriteLine ("\t\t\tpublic IntPtr gtype;"); sw.WriteLine ("\t\t\tpublic IntPtr itype;"); sw.WriteLine (); foreach (object member in members) { if (member is Signal) { Signal sig = member as Signal; sw.WriteLine ("\t\t\tpublic IntPtr {0};", sig.CName.Replace ("\"", "").Replace ("-", "_")); } else if (member is VirtualMethod) { VirtualMethod vm = member as VirtualMethod; bool has_target = methods [vm.Name] != null; if (!has_target) Console.WriteLine ("Interface " + QualifiedName + " virtual method " + vm.Name + " has no matching method to invoke."); string type = has_target && vm.IsValid ? vm.Name + "Delegate" : "IntPtr"; sw.WriteLine ("\t\t\tpublic " + type + " " + vm.CName + ";"); } } sw.WriteLine ("\t\t}"); sw.WriteLine (); } void GenerateStaticCtor (StreamWriter sw) { sw.WriteLine ("\t\tstatic " + Name + "Adapter ()"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tGLib.GType.Register (_gtype, typeof({0}Adapter));", Name); foreach (VirtualMethod vm in vms) { bool has_target = methods [vm.Name] != null; if (has_target && vm.IsValid) sw.WriteLine ("\t\t\tiface.{0} = new {1}Delegate ({1}Callback);", vm.CName, vm.Name); } sw.WriteLine ("\t\t}"); sw.WriteLine (); } void GenerateInitialize (StreamWriter sw) { sw.WriteLine ("\t\tstatic void Initialize (IntPtr ifaceptr, IntPtr data)"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\t" + IfaceName + " native_iface = (" + IfaceName + ") Marshal.PtrToStructure (ifaceptr, typeof (" + IfaceName + "));"); foreach (VirtualMethod vm in vms) sw.WriteLine ("\t\t\tnative_iface." + vm.CName + " = iface." + vm.CName + ";"); sw.WriteLine ("\t\t\tMarshal.StructureToPtr (native_iface, ifaceptr, false);"); sw.WriteLine ("\t\t\tGCHandle gch = (GCHandle) data;"); sw.WriteLine ("\t\t\tgch.Free ();"); sw.WriteLine ("\t\t}"); sw.WriteLine (); } void GenerateCallbacks (StreamWriter sw) { foreach (VirtualMethod vm in vms) { if (methods [vm.Name] != null) { sw.WriteLine (); vm.GenerateCallback (sw); } } } void GenerateCtors (StreamWriter sw) { if (!IsConsumeOnly) { sw.WriteLine ("\t\tpublic " + Name + "Adapter ()"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tInitHandler = new GLib.GInterfaceInitHandler (Initialize);"); sw.WriteLine ("\t\t}"); sw.WriteLine (); sw.WriteLine ("\t\t{0}Implementor implementor;", Name); sw.WriteLine (); sw.WriteLine ("\t\tpublic {0}Adapter ({0}Implementor implementor)", Name); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tif (implementor == null)"); sw.WriteLine ("\t\t\t\tthrow new ArgumentNullException (\"implementor\");"); sw.WriteLine ("\t\t\tthis.implementor = implementor;"); sw.WriteLine ("\t\t}"); sw.WriteLine (); } sw.WriteLine ("\t\tpublic " + Name + "Adapter (IntPtr handle)"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tthis.handle = handle;"); sw.WriteLine ("\t\t}"); sw.WriteLine (); } void GenerateGType (StreamWriter sw) { Method m = GetMethod ("GetType"); m.GenerateImport (sw); sw.WriteLine ("\t\tprivate static GLib.GType _gtype = new GLib.GType ({0} ());", m.CName); sw.WriteLine (); sw.WriteLine ("\t\tpublic override GLib.GType GType {"); sw.WriteLine ("\t\t\tget {"); sw.WriteLine ("\t\t\t\treturn _gtype;"); sw.WriteLine ("\t\t\t}"); sw.WriteLine ("\t\t}"); sw.WriteLine (); } void GenerateHandleProp (StreamWriter sw) { sw.WriteLine ("\t\tIntPtr handle;"); sw.WriteLine ("\t\tpublic override IntPtr Handle {"); sw.WriteLine ("\t\t\tget {"); if (IsConsumeOnly) { sw.WriteLine ("\t\t\t\treturn handle;"); } else { sw.WriteLine ("\t\t\t\tif (handle != IntPtr.Zero)"); sw.WriteLine ("\t\t\t\t\treturn handle;"); sw.WriteLine ("\t\t\t\treturn implementor == null ? IntPtr.Zero : implementor.Handle;"); } sw.WriteLine ("\t\t\t}"); sw.WriteLine ("\t\t}"); sw.WriteLine (); } void GenerateGetObject (StreamWriter sw) { sw.WriteLine ("\t\tpublic static " + Name + " GetObject (IntPtr handle, bool owned)"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tGLib.Object obj = GLib.Object.GetObject (handle, owned);"); sw.WriteLine ("\t\t\treturn GetObject (obj);"); sw.WriteLine ("\t\t}"); sw.WriteLine (); sw.WriteLine ("\t\tpublic static " + Name + " GetObject (GLib.Object obj)"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tif (obj == null)"); sw.WriteLine ("\t\t\t\treturn null;"); if (!IsConsumeOnly) { sw.WriteLine ("\t\t\telse if (obj is " + Name + "Implementor)"); sw.WriteLine ("\t\t\t\treturn new {0}Adapter (obj as {0}Implementor);", Name); } sw.WriteLine ("\t\t\telse if (obj as " + Name + " == null)"); sw.WriteLine ("\t\t\t\treturn new {0}Adapter (obj.Handle);", Name); sw.WriteLine ("\t\t\telse"); sw.WriteLine ("\t\t\t\treturn obj as {0};", Name); sw.WriteLine ("\t\t}"); sw.WriteLine (); } void GenerateImplementorProp (StreamWriter sw) { sw.WriteLine ("\t\tpublic " + Name + "Implementor Implementor {"); sw.WriteLine ("\t\t\tget {"); sw.WriteLine ("\t\t\t\treturn implementor;"); sw.WriteLine ("\t\t\t}"); sw.WriteLine ("\t\t}"); sw.WriteLine (); } void GenerateAdapter (GenerationInfo gen_info) { StreamWriter sw = gen_info.Writer = gen_info.OpenStream (Name + "Adapter"); sw.WriteLine ("namespace " + NS + " {"); sw.WriteLine (); sw.WriteLine ("\tusing System;"); sw.WriteLine ("\tusing System.Runtime.InteropServices;"); sw.WriteLine (); sw.WriteLine ("#region Autogenerated code"); sw.WriteLine ("\tpublic class " + Name + "Adapter : GLib.GInterfaceAdapter, " + QualifiedName + " {"); sw.WriteLine (); if (!IsConsumeOnly) { GenerateIfaceStruct (sw); GenerateStaticCtor (sw); GenerateCallbacks (sw); GenerateInitialize (sw); } GenerateCtors (sw); GenerateGType (sw); GenerateHandleProp (sw); GenerateGetObject (sw); if (!IsConsumeOnly) GenerateImplementorProp (sw); GenProperties (gen_info, null); foreach (Signal sig in sigs.Values) sig.GenEvent (sw, null, "GLib.Object.GetObject (Handle)"); Method temp = methods ["GetType"] as Method; if (temp != null) methods.Remove ("GetType"); GenMethods (gen_info, new Hashtable (), this); if (temp != null) methods ["GetType"] = temp; sw.WriteLine ("#endregion"); string custom = Path.Combine (gen_info.CustomDir, Name + "Adapter.custom"); if (File.Exists (custom)) { sw.WriteLine ("#region Customized extensions"); sw.WriteLine ("#line 1 \"" + Name + "Adapter.custom\""); using (StreamReader sr = new StreamReader(new FileStream (custom, FileMode.Open, FileAccess.Read))) sw.WriteLine (sr.ReadToEnd ()); sw.WriteLine ("#endregion"); } sw.WriteLine ("\t}"); sw.WriteLine ("}"); sw.Close (); gen_info.Writer = null; } void GenerateImplementorIface (StreamWriter sw) { if (IsConsumeOnly) return; sw.WriteLine (); sw.WriteLine ("\t[GLib.GInterface (typeof (" + Name + "Adapter))]"); string access = IsInternal ? "internal" : "public"; sw.WriteLine ("\t" + access + " interface " + Name + "Implementor : GLib.IWrapper {"); sw.WriteLine (); Hashtable vm_table = new Hashtable (); foreach (VirtualMethod vm in vms) vm_table [vm.Name] = vm; foreach (VirtualMethod vm in vms) { if (vm_table [vm.Name] == null) continue; else if (!vm.IsValid) { vm_table.Remove (vm.Name); continue; } else if (vm.IsGetter || vm.IsSetter) { string cmp_name = (vm.IsGetter ? "Set" : "Get") + vm.Name.Substring (3); VirtualMethod cmp = vm_table [cmp_name] as VirtualMethod; if (cmp != null && (cmp.IsGetter || cmp.IsSetter)) { if (vm.IsSetter) cmp.GenerateDeclaration (sw, vm); else vm.GenerateDeclaration (sw, cmp); vm_table.Remove (cmp.Name); } else vm.GenerateDeclaration (sw, null); vm_table.Remove (vm.Name); } else { vm.GenerateDeclaration (sw, null); vm_table.Remove (vm.Name); } } sw.WriteLine ("\t}"); } public override void Generate (GenerationInfo gen_info) { GenerateAdapter (gen_info); StreamWriter sw = gen_info.Writer = gen_info.OpenStream (Name); sw.WriteLine ("namespace " + NS + " {"); sw.WriteLine (); sw.WriteLine ("\tusing System;"); sw.WriteLine (); sw.WriteLine ("#region Autogenerated code"); string access = IsInternal ? "internal" : "public"; sw.WriteLine ("\t" + access + " interface " + Name + " : GLib.IWrapper {"); sw.WriteLine (); foreach (Signal sig in sigs.Values) { sig.GenerateDecl (sw); sig.GenEventHandler (gen_info); } foreach (Method method in methods.Values) { if (IgnoreMethod (method, this)) continue; method.GenerateDecl (sw, true); } foreach (Property prop in props.Values) prop.GenerateDecl (sw, "\t\t"); AppendCustom (sw, gen_info.CustomDir); sw.WriteLine ("\t}"); GenerateImplementorIface (sw); sw.WriteLine ("#endregion"); sw.WriteLine ("}"); sw.Close (); gen_info.Writer = null; Statistics.IFaceCount++; } } } f-spot-0.8.2/lib/gio-sharp/generator/FieldBase.cs0000644000175000017500000002162311417267577022060 0ustar00rubenruben00000000000000// GtkSharp.Generation.FieldBase.cs - base class for struct and object // fields // // Copyright (c) 2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Xml; public abstract class FieldBase : PropertyBase { public FieldBase (XmlElement elem, ClassBase container_type) : base (elem, container_type) {} public bool Validate () { if (!Ignored && !Hidden && CSType == "") { Console.Write("Field {0} has unknown Type {1} ", Name, CType); Statistics.ThrottledCount++; return false; } return true; } protected virtual bool Readable { get { return elem.GetAttribute ("readable") != "false"; } } protected virtual bool Writable { get { return elem.GetAttribute ("writeable") != "false"; } } protected abstract string DefaultAccess { get; } protected string Access { get { return elem.HasAttribute ("access") ? elem.GetAttribute ("access") : DefaultAccess; } } public bool IsArray { get { return elem.HasAttribute("array_len") || elem.HasAttribute("array"); } } public bool IsBitfield { get { return elem.HasAttribute("bits"); } } public bool Ignored { get { if (container_type.GetProperty (Name) != null) return true; if (IsArray) return true; if (Access == "private" && (Getter == null) && (Setter == null)) return true; return false; } } string getterName, setterName; string getOffsetName, offsetName; void CheckGlue () { getterName = setterName = getOffsetName = null; if (Access != "public") return; string prefix = (container_type.NS + "Sharp_" + container_type.NS + "_" + container_type.Name).ToLower (); if (IsBitfield) { if (Readable && Getter == null) getterName = prefix + "_get_" + CName; if (Writable && Setter == null) setterName = prefix + "_set_" + CName; } else { if ((Readable && Getter == null) || (Writable && Setter == null)) { offsetName = CName + "_offset"; getOffsetName = prefix + "_get_" + offsetName; } } } protected override void GenerateImports (GenerationInfo gen_info, string indent) { StreamWriter sw = gen_info.Writer; SymbolTable table = SymbolTable.Table; if (getterName != null) { sw.WriteLine (indent + "[DllImport (\"{0}\")]", gen_info.GluelibName); sw.WriteLine (indent + "extern static {0} {1} ({2} raw);", table.GetMarshalReturnType (CType), getterName, container_type.MarshalType); } if (setterName != null) { sw.WriteLine (indent + "[DllImport (\"{0}\")]", gen_info.GluelibName); sw.WriteLine (indent + "extern static void {0} ({1} raw, {2} value);", setterName, container_type.MarshalType, table.GetMarshalType (CType)); } if (getOffsetName != null) { sw.WriteLine (indent + "[DllImport (\"{0}\")]", gen_info.GluelibName); sw.WriteLine (indent + "extern static uint {0} ();", getOffsetName); sw.WriteLine (); sw.WriteLine (indent + "static uint " + offsetName + " = " + getOffsetName + " ();"); } base.GenerateImports (gen_info, indent); } public virtual void Generate (GenerationInfo gen_info, string indent) { if (Ignored || Hidden) return; CheckGlue (); if ((getterName != null || setterName != null || getOffsetName != null) && gen_info.GlueWriter == null) { Console.WriteLine ("No glue-filename specified, can't create glue for {0}.{1}", container_type.Name, Name); return; } GenerateImports (gen_info, indent); SymbolTable table = SymbolTable.Table; StreamWriter sw = gen_info.Writer; string modifiers = elem.HasAttribute ("new_flag") ? "new " : ""; bool is_struct = table.IsStruct (CType) || table.IsBoxed (CType); sw.WriteLine (indent + "public " + modifiers + CSType + " " + Name + " {"); if (Getter != null) { sw.Write (indent + "\tget "); Getter.GenerateBody (gen_info, container_type, "\t"); sw.WriteLine (""); } else if (getterName != null) { sw.WriteLine (indent + "\tget {"); container_type.Prepare (sw, indent + "\t\t"); sw.WriteLine (indent + "\t\t" + CSType + " result = " + table.FromNativeReturn (ctype, getterName + " (" + container_type.CallByName () + ")") + ";"); container_type.Finish (sw, indent + "\t\t"); sw.WriteLine (indent + "\t\treturn result;"); sw.WriteLine (indent + "\t}"); } else if (Readable && offsetName != null) { sw.WriteLine (indent + "\tget {"); sw.WriteLine (indent + "\t\tunsafe {"); if (is_struct) { sw.WriteLine (indent + "\t\t\t" + CSType + "* raw_ptr = (" + CSType + "*)(((byte*)" + container_type.CallByName () + ") + " + offsetName + ");"); sw.WriteLine (indent + "\t\t\treturn *raw_ptr;"); } else { sw.WriteLine (indent + "\t\t\t" + table.GetMarshalReturnType (CType) + "* raw_ptr = (" + table.GetMarshalReturnType (CType) + "*)(((byte*)" + container_type.CallByName () + ") + " + offsetName + ");"); sw.WriteLine (indent + "\t\t\treturn " + table.FromNativeReturn (ctype, "(*raw_ptr)") + ";"); } sw.WriteLine (indent + "\t\t}"); sw.WriteLine (indent + "\t}"); } if (Setter != null) { sw.Write (indent + "\tset "); Setter.GenerateBody (gen_info, container_type, "\t"); sw.WriteLine (""); } else if (setterName != null) { sw.WriteLine (indent + "\tset {"); container_type.Prepare (sw, indent + "\t\t"); sw.WriteLine (indent + "\t\t" + setterName + " (" + container_type.CallByName () + ", " + table.CallByName (ctype, "value") + ");"); container_type.Finish (sw, indent + "\t\t"); sw.WriteLine (indent + "\t}"); } else if (Writable && offsetName != null) { sw.WriteLine (indent + "\tset {"); sw.WriteLine (indent + "\t\tunsafe {"); if (is_struct) { sw.WriteLine (indent + "\t\t\t" + CSType + "* raw_ptr = (" + CSType + "*)(((byte*)" + container_type.CallByName () + ") + " + offsetName + ");"); sw.WriteLine (indent + "\t\t\t*raw_ptr = value;"); } else { sw.WriteLine (indent + "\t\t\t" + table.GetMarshalReturnType (CType) + "* raw_ptr = (" + table.GetMarshalReturnType (CType) + "*)(((byte*)" + container_type.CallByName () + ") + " + offsetName + ");"); sw.WriteLine (indent + "\t\t\t*raw_ptr = " + table.ToNativeReturn (ctype, "value") + ";"); } sw.WriteLine (indent + "\t\t}"); sw.WriteLine (indent + "\t}"); } sw.WriteLine (indent + "}"); sw.WriteLine (""); if (getterName != null || setterName != null || getOffsetName != null) GenerateGlue (gen_info); } protected void GenerateGlue (GenerationInfo gen_info) { StreamWriter sw = gen_info.GlueWriter; SymbolTable table = SymbolTable.Table; string FieldCType = CType.Replace ("-", " "); bool byref = table[CType] is ByRefGen || table[CType] is StructGen; string GlueCType = byref ? FieldCType + " *" : FieldCType; string ContainerCType = container_type.CName; string ContainerCName = container_type.Name.ToLower (); if (getterName != null) { sw.WriteLine ("{0} {1} ({2} *{3});", GlueCType, getterName, ContainerCType, ContainerCName); } if (setterName != null) { sw.WriteLine ("void {0} ({1} *{2}, {3} value);", setterName, ContainerCType, ContainerCName, GlueCType); } if (getOffsetName != null) sw.WriteLine ("guint {0} (void);", getOffsetName); sw.WriteLine (""); if (getterName != null) { sw.WriteLine (GlueCType); sw.WriteLine ("{0} ({1} *{2})", getterName, ContainerCType, ContainerCName); sw.WriteLine ("{"); sw.WriteLine ("\treturn ({0}){1}{2}->{3};", GlueCType, byref ? "&" : "", ContainerCName, CName); sw.WriteLine ("}"); sw.WriteLine (""); } if (setterName != null) { sw.WriteLine ("void"); sw.WriteLine ("{0} ({1} *{2}, {3} value)", setterName, ContainerCType, ContainerCName, GlueCType); sw.WriteLine ("{"); sw.WriteLine ("\t{0}->{1} = ({2}){3}value;", ContainerCName, CName, FieldCType, byref ? "*" : ""); sw.WriteLine ("}"); sw.WriteLine (""); } if (getOffsetName != null) { sw.WriteLine ("guint"); sw.WriteLine ("{0} (void)", getOffsetName); sw.WriteLine ("{"); sw.WriteLine ("\treturn (guint)G_STRUCT_OFFSET ({0}, {1});", ContainerCType, CName); sw.WriteLine ("}"); sw.WriteLine (""); } } } } f-spot-0.8.2/lib/gio-sharp/generator/StructGen.cs0000644000175000017500000000324111417267577022154 0ustar00rubenruben00000000000000// GtkSharp.Generation.StructGen.cs - The Structure Generatable. // // Author: Mike Kestner // // Copyright (c) 2001 Mike Kestner // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.IO; using System.Xml; public class StructGen : StructBase { public StructGen (XmlElement ns, XmlElement elem) : base (ns, elem) {} public override void Generate (GenerationInfo gen_info) { gen_info.CurrentType = Name; StreamWriter sw = gen_info.Writer = gen_info.OpenStream (Name); base.Generate (gen_info); if (GetMethod ("GetType") == null && GetMethod ("GetGType") == null) { sw.WriteLine ("\t\tprivate static GLib.GType GType {"); sw.WriteLine ("\t\t\tget { return GLib.GType.Pointer; }"); sw.WriteLine ("\t\t}"); } sw.WriteLine ("#endregion"); AppendCustom (sw, gen_info.CustomDir); sw.WriteLine ("\t}"); sw.WriteLine ("}"); sw.Close (); gen_info.Writer = null; Statistics.StructCount++; } } } f-spot-0.8.2/lib/gio-sharp/generator/HandleBase.cs0000644000175000017500000000407311417267577022230 0ustar00rubenruben00000000000000// HandleBase.cs - Base class for Handle types // // Authors: Mike Kestner // // Copyright (c) 2005 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.IO; using System.Xml; public abstract class HandleBase : ClassBase, IAccessor { protected HandleBase (XmlElement ns, XmlElement elem) : base (ns, elem) {} public override string AssignToName { get { return "Raw"; } } public override string MarshalType { get { return "IntPtr"; } } public override string CallByName (string name) { return name + " == null ? IntPtr.Zero : " + name + ".Handle"; } public override string CallByName () { return "Handle"; } public abstract string FromNative (string var, bool owned); public override string FromNative (string var) { return FromNative (var, false); } public string FromNativeReturn (string var, bool owned) { return FromNative (var, owned); } public override string FromNativeReturn (string var) { return FromNativeReturn (var, false); } public void WriteAccessors (StreamWriter sw, string indent, string var) { sw.WriteLine (indent + "get {"); sw.WriteLine (indent + "\treturn " + FromNative (var, false) + ";"); sw.WriteLine (indent + "}"); sw.WriteLine (indent + "set {"); sw.WriteLine (indent + "\t" + var + " = " + CallByName ("value") + ";"); sw.WriteLine (indent + "}"); } } } f-spot-0.8.2/lib/gio-sharp/generator/EnumGen.cs0000644000175000017500000000675011417267577021604 0ustar00rubenruben00000000000000// GtkSharp.Generation.EnumGen.cs - The Enumeration Generatable. // // Author: Mike Kestner // // Copyright (c) 2001 Mike Kestner // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Xml; public class EnumGen : GenBase { string enum_type = String.Empty; ArrayList members = new ArrayList (); public EnumGen (XmlElement ns, XmlElement elem) : base (ns, elem) { foreach (XmlElement member in elem.ChildNodes) { if (member.Name != "member") continue; string result = "\t\t" + member.GetAttribute("name"); if (member.HasAttribute("value")) { string value = member.GetAttribute("value"); if (value.EndsWith("U")) { enum_type = " : uint"; value = value.TrimEnd('U'); } result += " = " + value; } members.Add (result + ","); } } public override bool Validate () { return true; } public override string DefaultValue { get { return "(" + QualifiedName + ") 0"; } } public override string MarshalType { get { return "int"; } } public override string CallByName (string var_name) { return "(int) " + var_name; } public override string FromNative(string var) { return "(" + QualifiedName + ") " + var; } public override void Generate (GenerationInfo gen_info) { StreamWriter sw = gen_info.OpenStream (Name); sw.WriteLine ("namespace " + NS + " {"); sw.WriteLine (); sw.WriteLine ("\tusing System;"); sw.WriteLine ("\tusing System.Runtime.InteropServices;"); sw.WriteLine (); sw.WriteLine ("#region Autogenerated code"); if (Elem.GetAttribute("type") == "flags") sw.WriteLine ("\t[Flags]"); if (Elem.HasAttribute("gtype")) sw.WriteLine ("\t[GLib.GType (typeof (" + NS + "." + Name + "GType))]"); string access = IsInternal ? "internal" : "public"; sw.WriteLine ("\t" + access + " enum " + Name + enum_type + " {"); sw.WriteLine (); foreach (string member in members) sw.WriteLine (member); sw.WriteLine ("\t}"); if (Elem.HasAttribute ("gtype")) { sw.WriteLine (); sw.WriteLine ("\tinternal class " + Name + "GType {"); sw.WriteLine ("\t\t[DllImport (\"" + LibraryName + "\")]"); sw.WriteLine ("\t\tstatic extern IntPtr " + Elem.GetAttribute ("gtype") + " ();"); sw.WriteLine (); sw.WriteLine ("\t\tpublic static GLib.GType GType {"); sw.WriteLine ("\t\t\tget {"); sw.WriteLine ("\t\t\t\treturn new GLib.GType (" + Elem.GetAttribute ("gtype") + " ());"); sw.WriteLine ("\t\t\t}"); sw.WriteLine ("\t\t}"); sw.WriteLine ("\t}"); } sw.WriteLine ("#endregion"); sw.WriteLine ("}"); sw.Close (); Statistics.EnumCount++; } } } f-spot-0.8.2/lib/gio-sharp/generator/Signal.cs0000644000175000017500000005327611417267577021470 0ustar00rubenruben00000000000000// GtkSharp.Generation.Signal.cs - The Signal Generatable. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // Copyright (c) 2003-2005 Novell, Inc. // Copyright (c) 2007 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Xml; public class Signal { bool marshaled; string name; XmlElement elem; ReturnValue retval; Parameters parms; ClassBase container_type; public Signal (XmlElement elem, ClassBase container_type) { this.elem = elem; name = elem.GetAttribute ("name"); marshaled = elem.GetAttribute ("manual") == "true"; retval = new ReturnValue (elem ["return-type"]); parms = new Parameters (elem["parameters"]); this.container_type = container_type; } bool Marshaled { get { return marshaled; } } public string Name { get { return name; } set { name = value; } } public bool Validate () { if (Name == "") { Console.Write ("Nameless signal "); Statistics.ThrottledCount++; return false; } if (!parms.Validate () || !retval.Validate ()) { Console.Write (" in signal " + Name + " "); Statistics.ThrottledCount++; return false; } return true; } public void GenerateDecl (StreamWriter sw) { if (elem.HasAttribute("new_flag") || (container_type != null && container_type.GetSignalRecursively (Name) != null)) sw.Write("new "); sw.WriteLine ("\t\tevent " + EventHandlerQualifiedName + " " + Name + ";"); } public string CName { get { return "\"" + elem.GetAttribute("cname") + "\""; } } string CallbackSig { get { string result = ""; for (int i = 0; i < parms.Count; i++) { if (i > 0) result += ", "; Parameter p = parms [i]; if (p.PassAs != "" && !(p.Generatable is StructBase)) result += p.PassAs + " "; result += (p.MarshalType + " arg" + i); } return result; } } string CallbackName { get { return Name + "SignalCallback"; } } string DelegateName { get { return Name + "SignalDelegate"; } } private string EventArgsName { get { if (IsEventHandler) return "EventArgs"; else return Name + "Args"; } } private string EventArgsQualifiedName { get { if (IsEventHandler) return "System.EventArgs"; else return container_type.NS + "." + Name + "Args"; } } private string EventHandlerName { get { if (IsEventHandler) return "EventHandler"; else if (SymbolTable.Table [container_type.NS + Name + "Handler"] != null) return Name + "EventHandler"; else return Name + "Handler"; } } private string EventHandlerQualifiedName { get { if (IsEventHandler) return "System.EventHandler"; else return container_type.NS + "." + EventHandlerName; } } string ClassFieldName { get { return elem.HasAttribute ("field_name") ? elem.GetAttribute("field_name") : String.Empty; } } private bool HasOutParams { get { foreach (Parameter p in parms) { if (p.PassAs == "out") return true; } return false; } } private bool IsEventHandler { get { return retval.CSType == "void" && parms.Count == 1 && (parms [0].Generatable is ObjectGen || parms [0].Generatable is InterfaceGen); } } private bool IsVoid { get { return retval.CSType == "void"; } } private string ReturnGType { get { IGeneratable igen = SymbolTable.Table [retval.CType]; if (igen is ObjectGen) return "GLib.GType.Object"; if (igen is BoxedGen) return retval.CSType + ".GType"; if (igen is EnumGen) return retval.CSType + "GType.GType"; switch (retval.CSType) { case "bool": return "GLib.GType.Boolean"; case "string": return "GLib.GType.String"; case "int": return "GLib.GType.Int"; default: throw new Exception (retval.CSType); } } } public string GenArgsInitialization (StreamWriter sw) { if (parms.Count > 1) sw.WriteLine("\t\t\t\targs.Args = new object[" + (parms.Count - 1) + "];"); string finish = ""; for (int idx = 1; idx < parms.Count; idx++) { Parameter p = parms [idx]; IGeneratable igen = p.Generatable; if (p.PassAs != "out") { if (igen is ManualGen) { sw.WriteLine("\t\t\t\tif (arg{0} == IntPtr.Zero)", idx); sw.WriteLine("\t\t\t\t\targs.Args[{0}] = null;", idx - 1); sw.WriteLine("\t\t\t\telse {"); sw.WriteLine("\t\t\t\t\targs.Args[" + (idx - 1) + "] = " + p.FromNative ("arg" + idx) + ";"); sw.WriteLine("\t\t\t\t}"); } else sw.WriteLine("\t\t\t\targs.Args[" + (idx - 1) + "] = " + p.FromNative ("arg" + idx) + ";"); } if (igen is StructBase && p.PassAs == "ref") finish += "\t\t\t\tif (arg" + idx + " != IntPtr.Zero) System.Runtime.InteropServices.Marshal.StructureToPtr (args.Args[" + (idx-1) + "], arg" + idx + ", false);\n"; else if (p.PassAs != "") finish += "\t\t\t\targ" + idx + " = " + igen.ToNativeReturn ("((" + p.CSType + ")args.Args[" + (idx - 1) + "])") + ";\n"; } return finish; } public void GenArgsCleanup (StreamWriter sw, string finish) { if (IsVoid && finish.Length == 0) return; sw.WriteLine("\n\t\t\ttry {"); sw.Write (finish); if (!IsVoid) { if (retval.CSType == "bool") { sw.WriteLine ("\t\t\t\tif (args.RetVal == null)"); sw.WriteLine ("\t\t\t\t\treturn false;"); } sw.WriteLine("\t\t\t\treturn " + SymbolTable.Table.ToNativeReturn (retval.CType, "((" + retval.CSType + ")args.RetVal)") + ";"); } sw.WriteLine("\t\t\t} catch (Exception) {"); sw.WriteLine ("\t\t\t\tException ex = new Exception (\"args.RetVal or 'out' property unset or set to incorrect type in " + EventHandlerQualifiedName + " callback\");"); sw.WriteLine("\t\t\t\tGLib.ExceptionManager.RaiseUnhandledException (ex, true);"); sw.WriteLine ("\t\t\t\t// NOTREACHED: above call doesn't return."); sw.WriteLine ("\t\t\t\tthrow ex;"); sw.WriteLine("\t\t\t}"); } public void GenCallback (StreamWriter sw) { if (IsEventHandler) return; sw.WriteLine ("\t\t[GLib.CDeclCallback]"); sw.WriteLine ("\t\tdelegate " + retval.ToNativeType + " " + DelegateName + " (" + CallbackSig + ", IntPtr gch);"); sw.WriteLine (); sw.WriteLine ("\t\tstatic " + retval.ToNativeType + " " + CallbackName + " (" + CallbackSig + ", IntPtr gch)"); sw.WriteLine("\t\t{"); sw.WriteLine("\t\t\t{0} args = new {0} ();", EventArgsQualifiedName); sw.WriteLine("\t\t\ttry {"); sw.WriteLine("\t\t\t\tGLib.Signal sig = ((GCHandle) gch).Target as GLib.Signal;"); sw.WriteLine("\t\t\t\tif (sig == null)"); sw.WriteLine("\t\t\t\t\tthrow new Exception(\"Unknown signal GC handle received \" + gch);"); sw.WriteLine(); string finish = GenArgsInitialization (sw); sw.WriteLine("\t\t\t\t{0} handler = ({0}) sig.Handler;", EventHandlerQualifiedName); sw.WriteLine("\t\t\t\thandler (GLib.Object.GetObject (arg0), args);"); sw.WriteLine("\t\t\t} catch (Exception e) {"); sw.WriteLine("\t\t\t\tGLib.ExceptionManager.RaiseUnhandledException (e, false);"); sw.WriteLine("\t\t\t}"); GenArgsCleanup (sw, finish); sw.WriteLine("\t\t}"); sw.WriteLine(); } private bool NeedNew (ClassBase implementor) { return elem.HasAttribute ("new_flag") || (container_type != null && container_type.GetSignalRecursively (Name) != null) || (implementor != null && implementor.GetSignalRecursively (Name) != null); } public void GenEventHandler (GenerationInfo gen_info) { if (IsEventHandler) return; string ns = container_type.NS; StreamWriter sw = gen_info.OpenStream (EventHandlerName); sw.WriteLine ("namespace " + ns + " {"); sw.WriteLine (); sw.WriteLine ("\tusing System;"); sw.WriteLine (); sw.WriteLine ("\tpublic delegate void " + EventHandlerName + "(object o, " + EventArgsName + " args);"); sw.WriteLine (); sw.WriteLine ("\tpublic class " + EventArgsName + " : GLib.SignalArgs {"); for (int i = 1; i < parms.Count; i++) { sw.WriteLine ("\t\tpublic " + parms[i].CSType + " " + parms[i].StudlyName + "{"); if (parms[i].PassAs != "out") { sw.WriteLine ("\t\t\tget {"); sw.WriteLine ("\t\t\t\treturn (" + parms[i].CSType + ") Args[" + (i - 1) + "];"); sw.WriteLine ("\t\t\t}"); } if (parms[i].PassAs != "") { sw.WriteLine ("\t\t\tset {"); sw.WriteLine ("\t\t\t\tArgs[" + (i - 1) + "] = (" + parms[i].CSType + ")value;"); sw.WriteLine ("\t\t\t}"); } sw.WriteLine ("\t\t}"); sw.WriteLine (); } sw.WriteLine ("\t}"); sw.WriteLine ("}"); sw.Close (); } private void GenVMDeclaration (StreamWriter sw, ClassBase implementor) { VMSignature vmsig = new VMSignature (parms); sw.WriteLine ("\t\t[GLib.DefaultSignalHandler(Type=typeof(" + (implementor != null ? implementor.QualifiedName : container_type.QualifiedName) + "), ConnectionMethod=\"Override" + Name +"\")]"); sw.Write ("\t\tprotected "); if (NeedNew (implementor)) sw.Write ("new "); sw.WriteLine ("virtual {0} {1} ({2})", retval.CSType, "On" + Name, vmsig.ToString ()); } private string CastFromInt (string type) { return type != "int" ? "(" + type + ") " : ""; } private string GlueCallString { get { string result = "Handle"; for (int i = 1; i < parms.Count; i++) { Parameter p = parms [i]; IGeneratable igen = p.Generatable; if (i > 1 && parms [i - 1].IsString && p.IsLength && p.PassAs == String.Empty) { string string_name = parms [i - 1].Name; result += ", " + igen.CallByName (CastFromInt (p.CSType) + "System.Text.Encoding.UTF8.GetByteCount (" + string_name + ")"); continue; } p.CallName = p.Name; string call_parm = p.CallString; if (p.IsUserData && parms.IsHidden (p) && !parms.HideData && (i == 1 || parms [i - 1].Scope != "notified")) { call_parm = "IntPtr.Zero"; } result += ", " + call_parm; } return result; } } private string GlueSignature { get { string result = String.Empty; for (int i = 0; i < parms.Count; i++) result += parms[i].CType.Replace ("const-", "const ") + " " + parms[i].Name + (i == parms.Count-1 ? "" : ", "); return result; } } private string DefaultGlueValue { get { string val = retval.DefaultValue; switch (val) { case "null": return "NULL"; case "false": return "FALSE"; case "true": return "TRUE"; default: return val; } } } private void GenGlueVirtualMethod (GenerationInfo gen_info) { StreamWriter glue = gen_info.GlueWriter; string glue_name = String.Format ("{0}sharp_{1}_base_{2}", container_type.NS.ToLower ().Replace (".", "_"), container_type.Name.ToLower (), ClassFieldName); glue.WriteLine ("{0} {1} ({2});\n", retval.CType, glue_name, GlueSignature); glue.WriteLine ("{0}\n{1} ({2})", retval.CType, glue_name, GlueSignature); glue.WriteLine ("{"); glue.WriteLine ("\t{0}Class *klass = ({0}Class *) get_threshold_class (G_OBJECT ({1}));", container_type.CName, parms[0].Name); glue.Write ("\tif (klass->{0})\n\t\t", ClassFieldName); if (!IsVoid) glue.Write ("return "); glue.Write ("(* klass->{0}) (", ClassFieldName); for (int i = 0; i < parms.Count; i++) glue.Write (parms[i].Name + (i == parms.Count - 1 ? "" : ", ")); glue.WriteLine (");"); if (!IsVoid) glue.WriteLine ("\treturn " + DefaultGlueValue + ";"); glue.WriteLine ("}"); StreamWriter sw = gen_info.Writer; sw.WriteLine ("\t\t[DllImport (\"{0}\")]", gen_info.GluelibName); sw.WriteLine ("\t\tstatic extern {0} {1} ({2});\n", retval.MarshalType, glue_name, parms.ImportSignature); GenVMDeclaration (sw, null); sw.WriteLine ("\t\t{"); MethodBody body = new MethodBody (parms); body.Initialize (gen_info, false, false, String.Empty); sw.WriteLine ("\t\t\t{0}{1} ({2});", IsVoid ? "" : retval.MarshalType + " __ret = ", glue_name, GlueCallString); body.Finish (sw, ""); if (!IsVoid) sw.WriteLine ("\t\t\treturn {0};", retval.FromNative ("__ret")); sw.WriteLine ("\t\t}\n"); } private void GenChainVirtualMethod (StreamWriter sw, ClassBase implementor) { GenVMDeclaration (sw, implementor); sw.WriteLine ("\t\t{"); if (IsVoid) sw.WriteLine ("\t\t\tGLib.Value ret = GLib.Value.Empty;"); else sw.WriteLine ("\t\t\tGLib.Value ret = new GLib.Value (" + ReturnGType + ");"); sw.WriteLine ("\t\t\tGLib.ValueArray inst_and_params = new GLib.ValueArray (" + parms.Count + ");"); sw.WriteLine ("\t\t\tGLib.Value[] vals = new GLib.Value [" + parms.Count + "];"); sw.WriteLine ("\t\t\tvals [0] = new GLib.Value (this);"); sw.WriteLine ("\t\t\tinst_and_params.Append (vals [0]);"); string cleanup = ""; for (int i = 1; i < parms.Count; i++) { Parameter p = parms [i]; if (p.PassAs != "") { if (SymbolTable.Table.IsBoxed (p.CType)) { if (p.PassAs == "ref") sw.WriteLine ("\t\t\tvals [" + i + "] = new GLib.Value (" + p.Name + ");"); else sw.WriteLine ("\t\t\tvals [" + i + "] = new GLib.Value ((GLib.GType)typeof (" + p.CSType + "));"); cleanup += "\t\t\t" + p.Name + " = (" + p.CSType + ") vals [" + i + "];\n"; } else { if (p.PassAs == "ref") sw.WriteLine ("\t\t\tIntPtr " + p.Name + "_ptr = GLib.Marshaller.StructureToPtrAlloc (" + p.Generatable.CallByName (p.Name) + ");"); else sw.WriteLine ("\t\t\tIntPtr " + p.Name + "_ptr = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (" + p.MarshalType + ")));"); sw.WriteLine ("\t\t\tvals [" + i + "] = new GLib.Value (" + p.Name + "_ptr);"); cleanup += "\t\t\t" + p.Name + " = " + p.FromNative ("(" + p.MarshalType + ") Marshal.PtrToStructure (" + p.Name + "_ptr, typeof (" + p.MarshalType + "))") + ";\n"; cleanup += "\t\t\tMarshal.FreeHGlobal (" + p.Name + "_ptr);\n"; } } else if (p.IsLength && parms [i - 1].IsString) sw.WriteLine ("\t\t\tvals [" + i + "] = new GLib.Value (System.Text.Encoding.UTF8.GetByteCount (" + parms [i-1].Name + "));"); else sw.WriteLine ("\t\t\tvals [" + i + "] = new GLib.Value (" + p.Name + ");"); sw.WriteLine ("\t\t\tinst_and_params.Append (vals [" + i + "]);"); } sw.WriteLine ("\t\t\tg_signal_chain_from_overridden (inst_and_params.ArrayPtr, ref ret);"); if (cleanup != "") sw.WriteLine (cleanup); sw.WriteLine ("\t\t\tforeach (GLib.Value v in vals)"); sw.WriteLine ("\t\t\t\tv.Dispose ();"); if (!IsVoid) { IGeneratable igen = SymbolTable.Table [retval.CType]; sw.WriteLine ("\t\t\t" + retval.CSType + " result = (" + (igen is EnumGen ? retval.CSType + ") (Enum" : retval.CSType) + ") ret;"); sw.WriteLine ("\t\t\tret.Dispose ();"); sw.WriteLine ("\t\t\treturn result;"); } sw.WriteLine ("\t\t}\n"); } private void GenDefaultHandlerDelegate (GenerationInfo gen_info, ClassBase implementor) { StreamWriter sw = gen_info.Writer; StreamWriter glue; bool use_glue = gen_info.GlueEnabled && implementor == null && ClassFieldName.Length > 0; string glue_name = String.Empty; ManagedCallString call = new ManagedCallString (parms, true); sw.WriteLine ("\t\t[GLib.CDeclCallback]"); sw.WriteLine ("\t\tdelegate " + retval.ToNativeType + " " + Name + "VMDelegate (" + parms.ImportSignature + ");\n"); if (use_glue) { glue = gen_info.GlueWriter; glue_name = String.Format ("{0}sharp_{1}_override_{2}", container_type.NS.ToLower ().Replace (".", "_"), container_type.Name.ToLower (), ClassFieldName); sw.WriteLine ("\t\t[DllImport (\"{0}\")]", gen_info.GluelibName); sw.WriteLine ("\t\tstatic extern void {0} (IntPtr gtype, {1}VMDelegate cb);\n", glue_name, Name); glue.WriteLine ("void {0} (GType gtype, gpointer cb);\n", glue_name); glue.WriteLine ("void\n{0} (GType gtype, gpointer cb)", glue_name); glue.WriteLine ("{"); glue.WriteLine ("\tGObjectClass *klass = g_type_class_peek (gtype);"); glue.WriteLine ("\tif (klass == NULL)"); glue.WriteLine ("\t\tklass = g_type_class_ref (gtype);"); glue.WriteLine ("\t(({0} *)klass)->{1} = cb;", container_type.CName + "Class", ClassFieldName); glue.WriteLine ("}\n"); } sw.WriteLine ("\t\tstatic {0} {1};\n", Name + "VMDelegate", Name + "VMCallback"); sw.WriteLine ("\t\tstatic " + retval.ToNativeType + " " + Name.ToLower() + "_cb (" + parms.ImportSignature + ")"); sw.WriteLine ("\t\t{"); string unconditional = call.Unconditional ("\t\t\t"); if (unconditional.Length > 0) sw.WriteLine (unconditional); sw.WriteLine ("\t\t\ttry {"); sw.WriteLine ("\t\t\t\t{0} {1}_managed = GLib.Object.GetObject ({1}, false) as {0};", implementor != null ? implementor.Name : container_type.Name, parms[0].Name); sw.Write (call.Setup ("\t\t\t\t")); sw.Write ("\t\t\t\t{0}", IsVoid ? "" : retval.CSType == retval.ToNativeType ? "return " : retval.CSType + " raw_ret = "); sw.WriteLine ("{2}_managed.{0} ({1});", "On" + Name, call.ToString (), parms[0].Name); sw.Write (call.Finish ("\t\t\t\t")); if (!IsVoid && retval.CSType != retval.ToNativeType) sw.WriteLine ("\t\t\t\treturn {0};", SymbolTable.Table.ToNativeReturn (retval.CType, "raw_ret")); sw.WriteLine ("\t\t\t} catch (Exception e) {"); bool fatal = HasOutParams || !IsVoid; sw.WriteLine ("\t\t\t\tGLib.ExceptionManager.RaiseUnhandledException (e, " + (fatal ? "true" : "false") + ");"); if (fatal) { sw.WriteLine ("\t\t\t\t// NOTREACHED: above call doesn't return"); sw.WriteLine ("\t\t\t\tthrow e;"); } sw.WriteLine ("\t\t\t}"); sw.WriteLine ("\t\t}\n"); sw.WriteLine ("\t\tprivate static void Override" + Name + " (GLib.GType gtype)"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tif (" + Name + "VMCallback == null)"); sw.WriteLine ("\t\t\t\t" + Name + "VMCallback = new " + Name + "VMDelegate (" + Name.ToLower() + "_cb);"); if (use_glue) sw.WriteLine ("\t\t\t{0} (gtype.Val, {1}VMCallback);", glue_name, Name); else sw.WriteLine ("\t\t\tOverrideVirtualMethod (gtype, " + CName + ", " + Name + "VMCallback);"); sw.WriteLine ("\t\t}\n"); } public void GenEvent (StreamWriter sw, ClassBase implementor, string target) { string args_type = IsEventHandler ? "" : ", typeof (" + EventArgsQualifiedName + ")"; if (Marshaled) { GenCallback (sw); args_type = ", new " + DelegateName + "(" + CallbackName + ")"; } sw.WriteLine("\t\t[GLib.Signal("+ CName + ")]"); sw.Write("\t\tpublic "); if (NeedNew (implementor)) sw.Write("new "); sw.WriteLine("event " + EventHandlerQualifiedName + " " + Name + " {"); sw.WriteLine("\t\t\tadd {"); sw.WriteLine("\t\t\t\tGLib.Signal sig = GLib.Signal.Lookup (" + target + ", " + CName + args_type + ");"); sw.WriteLine("\t\t\t\tsig.AddDelegate (value);"); sw.WriteLine("\t\t\t}"); sw.WriteLine("\t\t\tremove {"); sw.WriteLine("\t\t\t\tGLib.Signal sig = GLib.Signal.Lookup (" + target + ", " + CName + args_type + ");"); sw.WriteLine("\t\t\t\tsig.RemoveDelegate (value);"); sw.WriteLine("\t\t\t}"); sw.WriteLine("\t\t}"); sw.WriteLine(); } public void Generate (GenerationInfo gen_info, ClassBase implementor) { StreamWriter sw = gen_info.Writer; if (implementor == null) GenEventHandler (gen_info); GenDefaultHandlerDelegate (gen_info, implementor); if (gen_info.GlueEnabled && implementor == null && ClassFieldName.Length > 0) GenGlueVirtualMethod (gen_info); else GenChainVirtualMethod (sw, implementor); GenEvent (sw, implementor, "this"); Statistics.SignalCount++; } } } f-spot-0.8.2/lib/gio-sharp/generator/SimpleGen.cs0000644000175000017500000000203311417267577022117 0ustar00rubenruben00000000000000// GtkSharp.Generation.SimpleGen.cs - The Simple type Generatable. // // Author: Mike Kestner // // Copyright (c) 2003 Mike Kestner // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; public class SimpleGen : SimpleBase { public SimpleGen (string ctype, string type, string default_value) : base (ctype, type, default_value) {} } } f-spot-0.8.2/lib/gio-sharp/generator/ClassBase.cs0000644000175000017500000002657411417267577022114 0ustar00rubenruben00000000000000// GtkSharp.Generation.ClassBase.cs - Common code between object // and interface wrappers // // Authors: Rachel Hestilow // Mike Kestner // // Copyright (c) 2002 Rachel Hestilow // Copyright (c) 2001-2003 Mike Kestner // Copyright (c) 2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Xml; public abstract class ClassBase : GenBase { protected Hashtable props = new Hashtable(); protected Hashtable fields = new Hashtable(); protected Hashtable sigs = new Hashtable(); protected Hashtable methods = new Hashtable(); protected ArrayList interfaces = new ArrayList(); protected ArrayList managed_interfaces = new ArrayList(); protected ArrayList ctors = new ArrayList(); private bool ctors_initted = false; private Hashtable clash_map; private bool deprecated = false; private bool isabstract = false; public Hashtable Methods { get { return methods; } } public Hashtable Signals { get { return sigs; } } public ClassBase Parent { get { string parent = Elem.GetAttribute("parent"); if (parent == "") return null; else return SymbolTable.Table.GetClassGen(parent); } } protected ClassBase (XmlElement ns, XmlElement elem) : base (ns, elem) { if (elem.HasAttribute ("deprecated")) { string attr = elem.GetAttribute ("deprecated"); deprecated = attr == "1" || attr == "true"; } if (elem.HasAttribute ("abstract")) { string attr = elem.GetAttribute ("abstract"); isabstract = attr == "1" || attr == "true"; } foreach (XmlNode node in elem.ChildNodes) { if (!(node is XmlElement)) continue; XmlElement member = (XmlElement) node; if (member.HasAttribute ("hidden")) continue; string name; switch (node.Name) { case "method": name = member.GetAttribute("name"); while (methods.ContainsKey(name)) name += "mangled"; methods.Add (name, new Method (member, this)); break; case "property": name = member.GetAttribute("name"); while (props.ContainsKey(name)) name += "mangled"; props.Add (name, new Property (member, this)); break; case "field": name = member.GetAttribute("name"); while (fields.ContainsKey (name)) name += "mangled"; fields.Add (name, new ObjectField (member, this)); break; case "signal": name = member.GetAttribute("name"); while (sigs.ContainsKey(name)) name += "mangled"; sigs.Add (name, new Signal (member, this)); break; case "implements": ParseImplements (member); break; case "constructor": ctors.Add (new Ctor (member, this)); break; default: break; } } } public override bool Validate () { if (Parent != null && !Parent.ValidateForSubclass ()) return false; foreach (string iface in interfaces) { InterfaceGen igen = SymbolTable.Table[iface] as InterfaceGen; if (igen == null) { Console.WriteLine (QualifiedName + " implements unknown GInterface " + iface); return false; } if (!igen.ValidateForSubclass ()) { Console.WriteLine (QualifiedName + " implements invalid GInterface " + iface); return false; } } ArrayList invalids = new ArrayList (); foreach (Property prop in props.Values) { if (!prop.Validate ()) { Console.WriteLine ("in type " + QualifiedName); invalids.Add (prop); } } foreach (Property prop in invalids) props.Remove (prop.Name); invalids.Clear (); foreach (Signal sig in sigs.Values) { if (!sig.Validate ()) { Console.WriteLine ("in type " + QualifiedName); invalids.Add (sig); } } foreach (Signal sig in invalids) sigs.Remove (sig.Name); invalids.Clear (); foreach (ObjectField field in fields.Values) { if (!field.Validate ()) { Console.WriteLine ("in type " + QualifiedName); invalids.Add (field); } } foreach (ObjectField field in invalids) fields.Remove (field.Name); invalids.Clear (); foreach (Method method in methods.Values) { if (!method.Validate ()) { Console.WriteLine ("in type " + QualifiedName); invalids.Add (method); } } foreach (Method method in invalids) methods.Remove (method.Name); invalids.Clear (); foreach (Ctor ctor in ctors) { if (!ctor.Validate ()) { Console.WriteLine ("in type " + QualifiedName); invalids.Add (ctor); } } foreach (Ctor ctor in invalids) ctors.Remove (ctor); invalids.Clear (); return true; } public virtual bool ValidateForSubclass () { ArrayList invalids = new ArrayList (); foreach (Signal sig in sigs.Values) { if (!sig.Validate ()) { Console.WriteLine ("in type " + QualifiedName); invalids.Add (sig); } } foreach (Signal sig in invalids) sigs.Remove (sig.Name); invalids.Clear (); return true; } public bool IsDeprecated { get { return deprecated; } } public bool IsAbstract { get { return isabstract; } } public abstract string AssignToName { get; } public abstract string CallByName (); public override string DefaultValue { get { return "null"; } } protected bool IsNodeNameHandled (string name) { switch (name) { case "method": case "property": case "field": case "signal": case "implements": case "constructor": case "disabledefaultconstructor": return true; default: return false; } } public void GenProperties (GenerationInfo gen_info, ClassBase implementor) { if (props.Count == 0) return; foreach (Property prop in props.Values) prop.Generate (gen_info, "\t\t", implementor); } public void GenSignals (GenerationInfo gen_info, ClassBase implementor) { if (sigs == null) return; foreach (Signal sig in sigs.Values) sig.Generate (gen_info, implementor); } protected void GenFields (GenerationInfo gen_info) { foreach (ObjectField field in fields.Values) field.Generate (gen_info, "\t\t"); } private void ParseImplements (XmlElement member) { foreach (XmlNode node in member.ChildNodes) { if (node.Name != "interface") continue; XmlElement element = (XmlElement) node; if (element.HasAttribute ("hidden")) continue; if (element.HasAttribute ("cname")) interfaces.Add (element.GetAttribute ("cname")); else if (element.HasAttribute ("name")) managed_interfaces.Add (element.GetAttribute ("name")); } } protected bool IgnoreMethod (Method method, ClassBase implementor) { if (implementor != null && implementor.QualifiedName != this.QualifiedName && method.IsStatic) return true; string mname = method.Name; return ((method.IsSetter || (method.IsGetter && mname.StartsWith("Get"))) && ((props != null) && props.ContainsKey(mname.Substring(3)) || (fields != null) && fields.ContainsKey(mname.Substring(3)))); } public void GenMethods (GenerationInfo gen_info, Hashtable collisions, ClassBase implementor) { if (methods == null) return; foreach (Method method in methods.Values) { if (IgnoreMethod (method, implementor)) continue; string oname = null, oprotection = null; if (collisions != null && collisions.Contains (method.Name)) { oname = method.Name; oprotection = method.Protection; method.Name = QualifiedName + "." + method.Name; method.Protection = ""; } method.Generate (gen_info, implementor); if (oname != null) { method.Name = oname; method.Protection = oprotection; } } } public Method GetMethod (string name) { return (Method) methods[name]; } public Property GetProperty (string name) { return (Property) props[name]; } public Signal GetSignal (string name) { return (Signal) sigs[name]; } public Method GetMethodRecursively (string name) { return GetMethodRecursively (name, false); } public virtual Method GetMethodRecursively (string name, bool check_self) { Method p = null; if (check_self) p = GetMethod (name); if (p == null && Parent != null) p = Parent.GetMethodRecursively (name, true); if (check_self && p == null) { foreach (string iface in interfaces) { ClassBase igen = SymbolTable.Table.GetClassGen (iface); if (igen == null) continue; p = igen.GetMethodRecursively (name, true); if (p != null) break; } } return p; } public virtual Property GetPropertyRecursively (string name) { ClassBase klass = this; Property p = null; while (klass != null && p == null) { p = (Property) klass.GetProperty (name); klass = klass.Parent; } return p; } public Signal GetSignalRecursively (string name) { return GetSignalRecursively (name, false); } public virtual Signal GetSignalRecursively (string name, bool check_self) { Signal p = null; if (check_self) p = GetSignal (name); if (p == null && Parent != null) p = Parent.GetSignalRecursively (name, true); if (check_self && p == null) { foreach (string iface in interfaces) { ClassBase igen = SymbolTable.Table.GetClassGen (iface); if (igen == null) continue; p = igen.GetSignalRecursively (name, true); if (p != null) break; } } return p; } public bool Implements (string iface) { if (interfaces.Contains (iface)) return true; else if (Parent != null) return Parent.Implements (iface); else return false; } public ArrayList Ctors { get { return ctors; } } bool HasStaticCtor (string name) { if (Parent != null && Parent.HasStaticCtor (name)) return true; foreach (Ctor ctor in Ctors) if (ctor.StaticName == name) return true; return false; } private void InitializeCtors () { if (ctors_initted) return; if (Parent != null) Parent.InitializeCtors (); ArrayList valid_ctors = new ArrayList(); clash_map = new Hashtable(); foreach (Ctor ctor in ctors) { if (clash_map.Contains (ctor.Signature.Types)) { Ctor clash = clash_map [ctor.Signature.Types] as Ctor; Ctor alter = ctor.Preferred ? clash : ctor; alter.IsStatic = true; if (Parent != null && Parent.HasStaticCtor (alter.StaticName)) alter.Modifiers = "new "; } else clash_map [ctor.Signature.Types] = ctor; valid_ctors.Add (ctor); } ctors = valid_ctors; ctors_initted = true; } protected virtual void GenCtors (GenerationInfo gen_info) { InitializeCtors (); foreach (Ctor ctor in ctors) ctor.Generate (gen_info); } public virtual void Finish (StreamWriter sw, string indent) { } public virtual void Prepare (StreamWriter sw, string indent) { } } } f-spot-0.8.2/lib/gio-sharp/generator/Ctor.cs0000644000175000017500000001232411417267577021147 0ustar00rubenruben00000000000000// GtkSharp.Generation.Ctor.cs - The Constructor Generation Class. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // Copyright (c) 2004-2005 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Xml; public class Ctor : MethodBase { private bool preferred; private string name; private bool needs_chaining = false; public Ctor (XmlElement elem, ClassBase implementor) : base (elem, implementor) { if (elem.HasAttribute ("preferred")) preferred = true; if (implementor is ObjectGen) needs_chaining = true; name = implementor.Name; } public bool Preferred { get { return preferred; } set { preferred = value; } } public string StaticName { get { if (!IsStatic) return String.Empty; string[] toks = CName.Substring(CName.IndexOf("new")).Split ('_'); string result = String.Empty; foreach (string tok in toks) result += tok.Substring(0,1).ToUpper() + tok.Substring(1); return result; } } void GenerateImport (StreamWriter sw) { sw.WriteLine("\t\t[DllImport(\"" + LibraryName + "\")]"); sw.WriteLine("\t\tstatic extern " + Safety + "IntPtr " + CName + "(" + Parameters.ImportSignature + ");"); sw.WriteLine(); } void GenerateStatic (GenerationInfo gen_info) { StreamWriter sw = gen_info.Writer; sw.WriteLine("\t\t" + Protection + " static " + Safety + Modifiers + name + " " + StaticName + "(" + Signature + ")"); sw.WriteLine("\t\t{"); Body.Initialize(gen_info, false, false, ""); sw.Write("\t\t\t" + name + " result = "); if (container_type is StructBase) sw.Write ("{0}.New (", name); else sw.Write ("new {0} (", name); sw.WriteLine (CName + "(" + Body.GetCallString (false) + "));"); Body.Finish (sw, ""); Body.HandleException (sw, ""); sw.WriteLine ("\t\t\treturn result;"); } public void Generate (GenerationInfo gen_info) { if (!Validate ()) return; StreamWriter sw = gen_info.Writer; gen_info.CurrentMember = CName; GenerateImport (sw); if (IsStatic) GenerateStatic (gen_info); else { sw.WriteLine("\t\t{0} {1}{2} ({3}) {4}", Protection, Safety, name, Signature.ToString(), needs_chaining ? ": base (IntPtr.Zero)" : ""); sw.WriteLine("\t\t{"); if (needs_chaining) { sw.WriteLine ("\t\t\tif (GetType () != typeof (" + name + ")) {"); if (Parameters.Count == 0) { sw.WriteLine ("\t\t\t\tCreateNativeObject (new string [0], new GLib.Value[0]);"); sw.WriteLine ("\t\t\t\treturn;"); } else { ArrayList names = new ArrayList (); ArrayList values = new ArrayList (); for (int i = 0; i < Parameters.Count; i++) { Parameter p = Parameters[i]; if (container_type.GetPropertyRecursively (p.StudlyName) != null) { names.Add (p.Name); values.Add (p.Name); } else if (p.PropertyName != String.Empty) { names.Add (p.PropertyName); values.Add (p.Name); } } if (names.Count == Parameters.Count) { sw.WriteLine ("\t\t\t\tArrayList vals = new ArrayList();"); sw.WriteLine ("\t\t\t\tArrayList names = new ArrayList();"); for (int i = 0; i < names.Count; i++) { Parameter p = Parameters [i]; string indent = "\t\t\t\t"; if (p.Generatable is ClassBase && !(p.Generatable is StructBase)) { sw.WriteLine (indent + "if (" + p.Name + " != null) {"); indent += "\t"; } sw.WriteLine (indent + "names.Add (\"" + names [i] + "\");"); sw.WriteLine (indent + "vals.Add (new GLib.Value (" + values[i] + "));"); if (p.Generatable is ClassBase && !(p.Generatable is StructBase)) sw.WriteLine ("\t\t\t\t}"); } sw.WriteLine ("\t\t\t\tCreateNativeObject ((string[])names.ToArray (typeof (string)), (GLib.Value[])vals.ToArray (typeof (GLib.Value)));"); sw.WriteLine ("\t\t\t\treturn;"); } else sw.WriteLine ("\t\t\t\tthrow new InvalidOperationException (\"Can't override this constructor.\");"); } sw.WriteLine ("\t\t\t}"); } Body.Initialize(gen_info, false, false, ""); sw.WriteLine("\t\t\t{0} = {1}({2});", container_type.AssignToName, CName, Body.GetCallString (false)); Body.Finish (sw, ""); Body.HandleException (sw, ""); } sw.WriteLine("\t\t}"); sw.WriteLine(); Statistics.CtorCount++; } } } f-spot-0.8.2/lib/gio-sharp/generator/ObjectField.cs0000644000175000017500000000242111417267577022407 0ustar00rubenruben00000000000000// GtkSharp.Generation.ObjectField.cs - autogenerated field glue // // Copyright (c) 2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Xml; public class ObjectField : FieldBase { public ObjectField (XmlElement elem, ClassBase container_type) : base (elem, container_type) { if (CType == "char*" || CType == "gchar*") ctype = "const-" + CType; } protected override bool Writable { get { return elem.GetAttribute ("writeable") == "true"; } } protected override string DefaultAccess { get { return "private"; } } } } f-spot-0.8.2/lib/gio-sharp/generator/SymbolTable.cs0000644000175000017500000002707011417267577022461 0ustar00rubenruben00000000000000// GtkSharp.Generation.SymbolTable.cs - The Symbol Table Class. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // Copyright (c) 2004-2005 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; public class SymbolTable { static SymbolTable table = null; Hashtable types = new Hashtable (); public static SymbolTable Table { get { if (table == null) table = new SymbolTable (); return table; } } public SymbolTable () { // Simple easily mapped types AddType (new SimpleGen ("void", "void", String.Empty)); AddType (new SimpleGen ("gpointer", "IntPtr", "IntPtr.Zero")); AddType (new SimpleGen ("gboolean", "bool", "false")); AddType (new SimpleGen ("gint", "int", "0")); AddType (new SimpleGen ("guint", "uint", "0")); AddType (new SimpleGen ("int", "int", "0")); AddType (new SimpleGen ("unsigned", "uint", "0")); AddType (new SimpleGen ("unsigned int", "uint", "0")); AddType (new SimpleGen ("unsigned-int", "uint", "0")); AddType (new SimpleGen ("gshort", "short", "0")); AddType (new SimpleGen ("gushort", "ushort", "0")); AddType (new SimpleGen ("short", "short", "0")); AddType (new SimpleGen ("guchar", "byte", "0")); AddType (new SimpleGen ("unsigned char", "byte", "0")); AddType (new SimpleGen ("unsigned-char", "byte", "0")); AddType (new SimpleGen ("guint1", "bool", "false")); AddType (new SimpleGen ("uint1", "bool", "false")); AddType (new SimpleGen ("gint8", "sbyte", "0")); AddType (new SimpleGen ("guint8", "byte", "0")); AddType (new SimpleGen ("gint16", "short", "0")); AddType (new SimpleGen ("guint16", "ushort", "0")); AddType (new SimpleGen ("gint32", "int", "0")); AddType (new SimpleGen ("guint32", "uint", "0")); AddType (new SimpleGen ("gint64", "long", "0")); AddType (new SimpleGen ("guint64", "ulong", "0")); AddType (new SimpleGen ("long long", "long", "0")); AddType (new SimpleGen ("gfloat", "float", "0.0")); AddType (new SimpleGen ("float", "float", "0.0")); AddType (new SimpleGen ("gdouble", "double", "0.0")); AddType (new SimpleGen ("double", "double", "0.0")); AddType (new SimpleGen ("goffset", "long", "0")); AddType (new SimpleGen ("GQuark", "int", "0")); // platform specific integer types. #if WIN64LONGS AddType (new SimpleGen ("long", "int", "0")); AddType (new SimpleGen ("glong", "int", "0")); AddType (new SimpleGen ("ulong", "uint", "0")); AddType (new SimpleGen ("gulong", "uint", "0")); AddType (new SimpleGen ("unsigned long", "uint", "0")); #else AddType (new LPGen ("long")); AddType (new LPGen ("glong")); AddType (new LPUGen ("ulong")); AddType (new LPUGen ("gulong")); AddType (new LPUGen ("unsigned long")); #endif AddType (new LPGen ("ssize_t")); AddType (new LPGen ("gssize")); AddType (new LPUGen ("size_t")); AddType (new LPUGen ("gsize")); #if OFF_T_8 AddType (new AliasGen ("off_t", "long")); #else AddType (new LPGen ("off_t")); #endif // string types AddType (new ConstStringGen ("const-gchar")); AddType (new ConstStringGen ("const-xmlChar")); AddType (new ConstStringGen ("const-char")); AddType (new ConstFilenameGen ("const-gfilename")); AddType (new MarshalGen ("gfilename", "string", "IntPtr", "GLib.Marshaller.StringToFilenamePtr({0})", "GLib.Marshaller.FilenamePtrToStringGFree({0})")); AddType (new MarshalGen ("gchar", "string", "IntPtr", "GLib.Marshaller.StringToPtrGStrdup({0})", "GLib.Marshaller.PtrToStringGFree({0})")); AddType (new MarshalGen ("char", "string", "IntPtr", "GLib.Marshaller.StringToPtrGStrdup({0})", "GLib.Marshaller.PtrToStringGFree({0})")); AddType (new SimpleGen ("GStrv", "string[]", "null")); // manually wrapped types requiring more complex marshaling AddType (new ManualGen ("GInitiallyUnowned", "GLib.InitiallyUnowned", "GLib.Object.GetObject ({0})")); AddType (new ManualGen ("GObject", "GLib.Object", "GLib.Object.GetObject ({0})")); AddType (new ManualGen ("GList", "GLib.List")); AddType (new ManualGen ("GPtrArray", "GLib.PtrArray")); AddType (new ManualGen ("GSList", "GLib.SList")); AddType (new MarshalGen ("gunichar", "char", "uint", "GLib.Marshaller.CharToGUnichar ({0})", "GLib.Marshaller.GUnicharToChar ({0})")); AddType (new MarshalGen ("time_t", "System.DateTime", "IntPtr", "GLib.Marshaller.DateTimeTotime_t ({0})", "GLib.Marshaller.time_tToDateTime ({0})")); AddType (new MarshalGen ("GString", "string", "IntPtr", "new GLib.GString ({0}).Handle", "GLib.GString.PtrToString ({0})")); AddType (new MarshalGen ("GType", "GLib.GType", "IntPtr", "{0}.Val", "new GLib.GType({0})")); AddType (new ByRefGen ("GValue", "GLib.Value")); AddType (new SimpleGen ("GDestroyNotify", "GLib.DestroyNotify", "null")); // FIXME: These ought to be handled properly. AddType (new SimpleGen ("GC", "IntPtr", "IntPtr.Zero")); AddType (new SimpleGen ("GError", "IntPtr", "IntPtr.Zero")); AddType (new SimpleGen ("GMemChunk", "IntPtr", "IntPtr.Zero")); AddType (new SimpleGen ("GTimeVal", "IntPtr", "IntPtr.Zero")); AddType (new SimpleGen ("GClosure", "IntPtr", "IntPtr.Zero")); AddType (new SimpleGen ("GArray", "IntPtr", "IntPtr.Zero")); AddType (new SimpleGen ("GByteArray", "IntPtr", "IntPtr.Zero")); AddType (new SimpleGen ("GData", "IntPtr", "IntPtr.Zero")); AddType (new SimpleGen ("GIOChannel", "IntPtr", "IntPtr.Zero")); AddType (new SimpleGen ("GTypeModule", "GLib.Object", "null")); AddType (new SimpleGen ("GHashTable", "System.IntPtr", "IntPtr.Zero")); AddType (new SimpleGen ("va_list", "IntPtr", "IntPtr.Zero")); AddType (new SimpleGen ("GParamSpec", "IntPtr", "IntPtr.Zero")); AddType (new SimpleGen ("gconstpointer", "IntPtr", "IntPtr.Zero")); } public void AddType (IGeneratable gen) { types [gen.CName] = gen; } public void AddTypes (IGeneratable[] gens) { foreach (IGeneratable gen in gens) types [gen.CName] = gen; } public int Count { get { return types.Count; } } public IEnumerable Generatables { get { return types.Values; } } public IGeneratable this [string ctype] { get { return DeAlias (ctype) as IGeneratable; } } private bool IsConstString (string type) { switch (type) { case "const-gchar": case "const-char": case "const-xmlChar": case "const-gfilename": return true; default: return false; } } private string Trim(string type) { // HACK: If we don't detect this here, there is no // way of indicating it in the symbol table if (type == "void*" || type == "const-void*") return "gpointer"; string trim_type = type.TrimEnd('*'); if (IsConstString (trim_type)) return trim_type; if (trim_type.StartsWith("const-")) return trim_type.Substring(6); return trim_type; } private object DeAlias (string type) { type = Trim (type); while (types [type] is AliasGen) { IGeneratable igen = types [type] as AliasGen; types [type] = types [igen.Name]; type = igen.Name; } return types [type]; } public string FromNativeReturn(string c_type, string val) { IGeneratable gen = this[c_type]; if (gen == null) return ""; return gen.FromNativeReturn (val); } public string ToNativeReturn(string c_type, string val) { IGeneratable gen = this[c_type]; if (gen == null) return ""; return gen.ToNativeReturn (val); } public string FromNative(string c_type, string val) { IGeneratable gen = this[c_type]; if (gen == null) return ""; return gen.FromNative (val); } public string GetCSType(string c_type) { IGeneratable gen = this[c_type]; if (gen == null) return ""; return gen.QualifiedName; } public string GetName(string c_type) { IGeneratable gen = this[c_type]; if (gen == null) return ""; return gen.Name; } public string GetMarshalReturnType(string c_type) { IGeneratable gen = this[c_type]; if (gen == null) return ""; return gen.MarshalReturnType; } public string GetToNativeReturnType(string c_type) { IGeneratable gen = this[c_type]; if (gen == null) return ""; return gen.ToNativeReturnType; } public string GetMarshalType(string c_type) { IGeneratable gen = this[c_type]; if (gen == null) return ""; return gen.MarshalType; } public string CallByName(string c_type, string var_name) { IGeneratable gen = this[c_type]; if (gen == null) return ""; return gen.CallByName(var_name); } public bool IsOpaque(string c_type) { if (this[c_type] is OpaqueGen) return true; return false; } public bool IsBoxed(string c_type) { if (this[c_type] is BoxedGen) return true; return false; } public bool IsStruct(string c_type) { if (this[c_type] is StructGen) return true; return false; } public bool IsEnum(string c_type) { if (this[c_type] is EnumGen) return true; return false; } public bool IsEnumFlags(string c_type) { EnumGen gen = this [c_type] as EnumGen; return (gen != null && gen.Elem.GetAttribute ("type") == "flags"); } public bool IsInterface(string c_type) { if (this[c_type] is InterfaceGen) return true; return false; } public ClassBase GetClassGen(string c_type) { return this[c_type] as ClassBase; } public bool IsObject(string c_type) { if (this[c_type] is ObjectGen) return true; return false; } public bool IsCallback(string c_type) { if (this[c_type] is CallbackGen) return true; return false; } public bool IsManuallyWrapped(string c_type) { if (this[c_type] is ManualGen) return true; return false; } public string MangleName(string name) { switch (name) { case "string": return "str1ng"; case "event": return "evnt"; case "null": return "is_null"; case "object": return "objekt"; case "params": return "parms"; case "ref": return "reference"; case "in": return "in_param"; case "out": return "out_param"; case "fixed": return "mfixed"; case "byte": return "_byte"; case "new": return "_new"; case "base": return "_base"; case "lock": return "_lock"; case "callback": return "cb"; case "readonly": return "read_only"; case "interface": return "iface"; case "internal": return "_internal"; case "where": return "wh3r3"; case "foreach": return "for_each"; case "remove": return "_remove"; default: break; } return name; } } } f-spot-0.8.2/lib/gio-sharp/generator/Method.cs0000644000175000017500000002156211417267577021464 0ustar00rubenruben00000000000000// GtkSharp.Generation.Method.cs - The Method Generatable. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // Copyright (c) 2003-2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Xml; public class Method : MethodBase { private ReturnValue retval; private string call; private bool is_get, is_set; private bool deprecated = false; public Method (XmlElement elem, ClassBase container_type) : base (elem, container_type) { this.retval = new ReturnValue (elem["return-type"]); if (!container_type.IsDeprecated && elem.HasAttribute ("deprecated")) { string attr = elem.GetAttribute ("deprecated"); deprecated = attr == "1" || attr == "true"; } if (Name == "GetType") Name = "GetGType"; } public bool IsDeprecated { get { return deprecated; } } public bool IsGetter { get { return is_get; } } public bool IsSetter { get { return is_set; } } public string ReturnType { get { return retval.CSType; } } public override bool Validate () { if (!retval.Validate () || !base.Validate ()) { Console.Write(" in method " + Name + " "); return false; } Parameters parms = Parameters; is_get = ((((parms.IsAccessor && retval.IsVoid) || (parms.Count == 0 && !retval.IsVoid)) || (parms.Count == 0 && !retval.IsVoid)) && HasGetterName); is_set = ((parms.IsAccessor || (parms.VisibleCount == 1 && retval.IsVoid)) && HasSetterName); call = "(" + (IsStatic ? "" : container_type.CallByName () + (parms.Count > 0 ? ", " : "")) + Body.GetCallString (is_set) + ")"; return true; } private Method GetComplement () { char complement; if (is_get) complement = 'S'; else complement = 'G'; return container_type.GetMethod (complement + BaseName.Substring (1)); } public string Declaration { get { return retval.CSType + " " + Name + " (" + (Signature != null ? Signature.ToString() : "") + ");"; } } private void GenerateDeclCommon (StreamWriter sw, ClassBase implementor) { GenerateDeclCommon (sw, implementor, false); } private void GenerateDeclCommon (StreamWriter sw, ClassBase implementor, bool is_interface) { if (IsStatic) sw.Write("static "); sw.Write (Safety); Method dup = null; if (container_type != null) dup = container_type.GetMethodRecursively (Name); if (implementor != null) dup = implementor.GetMethodRecursively (Name); if (Name == "ToString" && Parameters.Count == 0 && !is_interface) sw.Write("override "); else if (Name == "GetGType" && container_type is ObjectGen) sw.Write("new "); else if (Modifiers == "new " || (dup != null && ((dup.Signature != null && Signature != null && dup.Signature.ToString() == Signature.ToString()) || (dup.Signature == null && Signature == null)))) sw.Write("new "); if (is_get || is_set) { if (retval.IsVoid) sw.Write (Parameters.AccessorReturnType); else sw.Write(retval.CSType); sw.Write(" "); if (Name.StartsWith ("Get") || Name.StartsWith ("Set")) sw.Write (Name.Substring (3)); else { int dot = Name.LastIndexOf ('.'); if (dot != -1 && (Name.Substring (dot + 1, 3) == "Get" || Name.Substring (dot + 1, 3) == "Set")) sw.Write (Name.Substring (0, dot + 1) + Name.Substring (dot + 4)); else sw.Write (Name); } sw.WriteLine(" { "); } else if (IsAccessor) { sw.Write (Signature.AccessorType + " " + Name + "(" + Signature.AsAccessor + ")"); } else { sw.Write(retval.CSType + " " + Name + "(" + (Signature != null ? Signature.ToString() : "") + ")"); } } public void GenerateDecl (StreamWriter sw) { GenerateDecl (sw, false); } public void GenerateDecl (StreamWriter sw, bool is_interface) { if (IsStatic) return; if (is_get || is_set) { Method comp = GetComplement (); if (comp != null && is_set) return; sw.Write("\t\t"); GenerateDeclCommon (sw, null); sw.Write("\t\t\t"); sw.Write ((is_get) ? "get;" : "set;"); if (comp != null && comp.is_set) sw.WriteLine (" set;"); else sw.WriteLine (); sw.WriteLine ("\t\t}"); } else { sw.Write("\t\t"); GenerateDeclCommon (sw, null, is_interface); sw.WriteLine (";"); } Statistics.MethodCount++; } public void GenerateImport (StreamWriter sw) { string import_sig = IsStatic ? "" : container_type.MarshalType + " raw"; import_sig += !IsStatic && Parameters.Count > 0 ? ", " : ""; import_sig += Parameters.ImportSignature.ToString(); sw.WriteLine("\t\t[DllImport(\"" + LibraryName + "\")]"); if (retval.MarshalType.StartsWith ("[return:")) sw.WriteLine("\t\t" + retval.MarshalType + " static extern " + Safety + retval.CSType + " " + CName + "(" + import_sig + ");"); else sw.WriteLine("\t\tstatic extern " + Safety + retval.MarshalType + " " + CName + "(" + import_sig + ");"); sw.WriteLine(); } public void Generate (GenerationInfo gen_info, ClassBase implementor) { if (!Validate ()) return; Method comp = null; gen_info.CurrentMember = Name; /* we are generated by the get Method, if there is one */ if (is_set || is_get) { if (Modifiers != "new " && container_type.GetPropertyRecursively (Name.Substring (3)) != null) return; comp = GetComplement (); if (comp != null && is_set) { if (Parameters.AccessorReturnType == comp.ReturnType) return; else { is_set = false; call = "(Handle, " + Body.GetCallString (false) + ")"; comp = null; } } /* some setters take more than one arg */ if (comp != null && !comp.is_set) comp = null; } GenerateImport (gen_info.Writer); if (comp != null && retval.CSType == comp.Parameters.AccessorReturnType) comp.GenerateImport (gen_info.Writer); if (IsDeprecated) gen_info.Writer.WriteLine("\t\t[Obsolete]"); gen_info.Writer.Write("\t\t"); if (Protection != "") gen_info.Writer.Write("{0} ", Protection); GenerateDeclCommon (gen_info.Writer, implementor); if (is_get || is_set) { gen_info.Writer.Write ("\t\t\t"); gen_info.Writer.Write ((is_get) ? "get" : "set"); GenerateBody (gen_info, implementor, "\t"); } else GenerateBody (gen_info, implementor, ""); if (is_get || is_set) { if (comp != null && retval.CSType == comp.Parameters.AccessorReturnType) { gen_info.Writer.WriteLine (); gen_info.Writer.Write ("\t\t\tset"); comp.GenerateBody (gen_info, implementor, "\t"); } gen_info.Writer.WriteLine (); gen_info.Writer.WriteLine ("\t\t}"); } else gen_info.Writer.WriteLine(); gen_info.Writer.WriteLine(); Statistics.MethodCount++; } public void GenerateBody (GenerationInfo gen_info, ClassBase implementor, string indent) { StreamWriter sw = gen_info.Writer; sw.WriteLine(" {"); if (!IsStatic && implementor != null) implementor.Prepare (sw, indent + "\t\t\t"); if (IsAccessor) Body.InitAccessor (sw, Signature, indent); Body.Initialize(gen_info, is_get, is_set, indent); sw.Write(indent + "\t\t\t"); if (retval.IsVoid) sw.WriteLine(CName + call + ";"); else { sw.WriteLine(retval.MarshalType + " raw_ret = " + CName + call + ";"); sw.WriteLine(indent + "\t\t\t" + retval.CSType + " ret = " + retval.FromNative ("raw_ret") + ";"); } if (!IsStatic && implementor != null) implementor.Finish (sw, indent + "\t\t\t"); Body.Finish (sw, indent); Body.HandleException (sw, indent); if (is_get && Parameters.Count > 0) sw.WriteLine (indent + "\t\t\treturn " + Parameters.AccessorName + ";"); else if (!retval.IsVoid) sw.WriteLine (indent + "\t\t\treturn ret;"); else if (IsAccessor) Body.FinishAccessor (sw, Signature, indent); sw.Write(indent + "\t\t}"); } bool IsAccessor { get { return retval.IsVoid && Signature.IsAccessor; } } } } f-spot-0.8.2/lib/gio-sharp/generator/LPUGen.cs0000644000175000017500000000323611417267577021334 0ustar00rubenruben00000000000000// GtkSharp.Generation.LPUGen.cs - unsugned long/pointer generatable. // // Author: Mike Kestner // // Copyright (c) 2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.IO; public class LPUGen : SimpleGen, IAccessor { public LPUGen (string ctype) : base (ctype, "ulong", "0") {} public override string MarshalType { get { return "UIntPtr"; } } public override string CallByName (string var_name) { return "new UIntPtr (" + var_name + ")"; } public override string FromNative(string var) { return "(ulong) " + var; } public void WriteAccessors (StreamWriter sw, string indent, string var) { sw.WriteLine (indent + "get {"); sw.WriteLine (indent + "\treturn " + FromNative (var) + ";"); sw.WriteLine (indent + "}"); sw.WriteLine (indent + "set {"); sw.WriteLine (indent + "\t" + var + " = " + CallByName ("value") + ";"); sw.WriteLine (indent + "}"); } } } f-spot-0.8.2/lib/gio-sharp/generator/ClassGen.cs0000644000175000017500000000451411417267577021741 0ustar00rubenruben00000000000000// GtkSharp.Generation.ClassGen.cs - The Class Generatable. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Text; using System.Xml; public class ClassGen : ClassBase { public ClassGen (XmlElement ns, XmlElement elem) : base (ns, elem) {} public override string AssignToName { get { return String.Empty; } } public override string MarshalType { get { return String.Empty; } } public override string CallByName () { return String.Empty; } public override string CallByName (string var) { return String.Empty; } public override string FromNative (string var) { return String.Empty; } public override void Generate (GenerationInfo gen_info) { gen_info.CurrentType = Name; StreamWriter sw = gen_info.Writer = gen_info.OpenStream(Name); sw.WriteLine ("namespace " + NS + " {"); sw.WriteLine (); sw.WriteLine ("\tusing System;"); sw.WriteLine ("\tusing System.Runtime.InteropServices;"); sw.WriteLine (); sw.WriteLine ("#region Autogenerated code"); if (IsDeprecated) sw.WriteLine ("\t[Obsolete]"); sw.Write ("\t{0} class " + Name, IsInternal ? "internal" : "public"); sw.WriteLine (" {"); sw.WriteLine (); GenProperties (gen_info, null); GenMethods (gen_info, null, null); sw.WriteLine ("#endregion"); AppendCustom(sw, gen_info.CustomDir); sw.WriteLine ("\t}"); sw.WriteLine ("}"); sw.Close (); gen_info.Writer = null; } } } f-spot-0.8.2/lib/gio-sharp/generator/StructBase.cs0000644000175000017500000001400311417267577022313 0ustar00rubenruben00000000000000// GtkSharp.Generation.StructBase.cs - The Structure/Boxed Base Class. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Text.RegularExpressions; using System.Xml; public abstract class StructBase : ClassBase, IManualMarshaler { new ArrayList fields = new ArrayList (); bool need_read_native = false; protected StructBase (XmlElement ns, XmlElement elem) : base (ns, elem) { foreach (XmlNode node in elem.ChildNodes) { if (!(node is XmlElement)) continue; XmlElement member = (XmlElement) node; switch (node.Name) { case "field": fields.Add (new StructField (member, this)); break; case "callback": Statistics.IgnoreCount++; break; default: if (!IsNodeNameHandled (node.Name)) Console.WriteLine ("Unexpected node " + node.Name + " in " + CName); break; } } } public override string DefaultValue { get { return QualifiedName + ".Zero"; } } public override string MarshalType { get { return "IntPtr"; } } public override string AssignToName { get { throw new NotImplementedException (); } } public override string CallByName () { return "this_as_native"; } public override string CallByName (string var) { return var + "_as_native"; } public override string FromNative (string var) { if (DisableNew) return var + " == IntPtr.Zero ? " + QualifiedName + ".Zero : (" + QualifiedName + ") System.Runtime.InteropServices.Marshal.PtrToStructure (" + var + ", typeof (" + QualifiedName + "))"; else return QualifiedName + ".New (" + var + ")"; } public string AllocNative (string var) { return "GLib.Marshaller.StructureToPtrAlloc (" + var + ")"; } public string ReleaseNative (string var) { return "Marshal.FreeHGlobal (" +var + ")"; } private bool DisableNew { get { return Elem.HasAttribute ("disable_new"); } } protected new void GenFields (GenerationInfo gen_info) { int bitfields = 0; bool need_field = true; foreach (StructField field in fields) { if (field.IsBitfield) { if (need_field) { StreamWriter sw = gen_info.Writer; sw.WriteLine ("\t\tprivate uint _bitfield{0};\n", bitfields++); need_field = false; } } else need_field = true; field.Generate (gen_info, "\t\t"); } } public override bool Validate () { foreach (StructField field in fields) { if (!field.Validate ()) { Console.WriteLine ("in Struct " + QualifiedName); if (!field.IsPointer) return false; } } return base.Validate (); } public override void Generate (GenerationInfo gen_info) { bool need_close = false; if (gen_info.Writer == null) { gen_info.Writer = gen_info.OpenStream (Name); need_close = true; } StreamWriter sw = gen_info.Writer; sw.WriteLine ("namespace " + NS + " {"); sw.WriteLine (); sw.WriteLine ("\tusing System;"); sw.WriteLine ("\tusing System.Collections;"); sw.WriteLine ("\tusing System.Runtime.InteropServices;"); sw.WriteLine (); sw.WriteLine ("#region Autogenerated code"); if (IsDeprecated) sw.WriteLine ("\t[Obsolete]"); sw.WriteLine ("\t[StructLayout(LayoutKind.Sequential)]"); string access = IsInternal ? "internal" : "public"; sw.WriteLine ("\t" + access + " struct " + Name + " {"); sw.WriteLine (); need_read_native = false; GenFields (gen_info); sw.WriteLine (); GenCtors (gen_info); GenMethods (gen_info, null, this); if (need_read_native) GenReadNative (sw); if (!need_close) return; sw.WriteLine ("#endregion"); AppendCustom(sw, gen_info.CustomDir); sw.WriteLine ("\t}"); sw.WriteLine ("}"); sw.Close (); gen_info.Writer = null; } protected override void GenCtors (GenerationInfo gen_info) { StreamWriter sw = gen_info.Writer; sw.WriteLine ("\t\tpublic static {0} Zero = new {0} ();", QualifiedName); sw.WriteLine(); if (!DisableNew) { sw.WriteLine ("\t\tpublic static " + QualifiedName + " New(IntPtr raw) {"); sw.WriteLine ("\t\t\tif (raw == IntPtr.Zero)"); sw.WriteLine ("\t\t\t\treturn {0}.Zero;", QualifiedName); sw.WriteLine ("\t\t\treturn ({0}) Marshal.PtrToStructure (raw, typeof ({0}));", QualifiedName); sw.WriteLine ("\t\t}"); sw.WriteLine (); } foreach (Ctor ctor in Ctors) ctor.IsStatic = true; base.GenCtors (gen_info); } void GenReadNative (StreamWriter sw) { sw.WriteLine ("\t\tstatic void ReadNative (IntPtr native, ref {0} target)", QualifiedName); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\ttarget = New (native);"); sw.WriteLine ("\t\t}"); sw.WriteLine (); } public override void Prepare (StreamWriter sw, string indent) { sw.WriteLine (indent + "IntPtr this_as_native = System.Runtime.InteropServices.Marshal.AllocHGlobal (System.Runtime.InteropServices.Marshal.SizeOf (this));"); sw.WriteLine (indent + "System.Runtime.InteropServices.Marshal.StructureToPtr (this, this_as_native, false);"); } public override void Finish (StreamWriter sw, string indent) { need_read_native = true; sw.WriteLine (indent + "ReadNative (this_as_native, ref this);"); sw.WriteLine (indent + "System.Runtime.InteropServices.Marshal.FreeHGlobal (this_as_native);"); } } } f-spot-0.8.2/lib/gio-sharp/generator/CallbackGen.cs0000644000175000017500000002351011417267577022365 0ustar00rubenruben00000000000000// GtkSharp.Generation.CallbackGen.cs - The Callback Generatable. // // Author: Mike Kestner // // Copyright (c) 2002-2003 Mike Kestner // Copyright (c) 2007 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.IO; using System.Xml; public class CallbackGen : GenBase, IAccessor { private Parameters parms; private Signature sig = null; private ReturnValue retval; private bool valid = true; public CallbackGen (XmlElement ns, XmlElement elem) : base (ns, elem) { retval = new ReturnValue (elem ["return-type"]); parms = new Parameters (elem ["parameters"]); parms.HideData = true; } public override string DefaultValue { get { return "null"; } } public override bool Validate () { if (!retval.Validate ()) { Console.WriteLine ("rettype: " + retval.CType + " in callback " + CName); Statistics.ThrottledCount++; valid = false; return false; } if (!parms.Validate ()) { Console.WriteLine (" in callback " + CName); Statistics.ThrottledCount++; valid = false; return false; } valid = true; return true; } public string InvokerName { get { if (!valid) return String.Empty; return NS + "Sharp." + Name + "Invoker"; } } public override string MarshalType { get { if (valid) return NS + "Sharp." + Name + "Native"; else return ""; } } public override string CallByName (string var_name) { return var_name + ".NativeDelegate"; } public override string FromNative (string var) { return NS + "Sharp." + Name + "Wrapper.GetManagedDelegate (" + var + ")"; } public void WriteAccessors (StreamWriter sw, string indent, string var) { sw.WriteLine (indent + "get {"); sw.WriteLine (indent + "\treturn " + FromNative (var) + ";"); sw.WriteLine (indent + "}"); } string CastFromInt (string type) { return type != "int" ? "(" + type + ") " : ""; } string InvokeString { get { if (parms.Count == 0) return String.Empty; string[] result = new string [parms.Count]; for (int i = 0; i < parms.Count; i++) { Parameter p = parms [i]; IGeneratable igen = p.Generatable; if (i > 0 && parms [i - 1].IsString && p.IsLength) { string string_name = parms [i - 1].Name; result[i] = igen.CallByName (CastFromInt (p.CSType) + "System.Text.Encoding.UTF8.GetByteCount (" + string_name + ")"); continue; } p.CallName = p.Name; result [i] = p.CallString; if (p.IsUserData) result [i] = "__data"; } return String.Join (", ", result); } } MethodBody body; void GenInvoker (GenerationInfo gen_info, StreamWriter sw) { if (sig == null) sig = new Signature (parms); sw.WriteLine ("\tinternal class " + Name + "Invoker {"); sw.WriteLine (); sw.WriteLine ("\t\t" + Name + "Native native_cb;"); sw.WriteLine ("\t\tIntPtr __data;"); sw.WriteLine ("\t\tGLib.DestroyNotify __notify;"); sw.WriteLine (); sw.WriteLine ("\t\t~" + Name + "Invoker ()"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tif (__notify == null)"); sw.WriteLine ("\t\t\t\treturn;"); sw.WriteLine ("\t\t\t__notify (__data);"); sw.WriteLine ("\t\t}"); sw.WriteLine (); sw.WriteLine ("\t\tinternal " + Name + "Invoker (" + Name + "Native native_cb) : this (native_cb, IntPtr.Zero, null) {}"); sw.WriteLine (); sw.WriteLine ("\t\tinternal " + Name + "Invoker (" + Name + "Native native_cb, IntPtr data) : this (native_cb, data, null) {}"); sw.WriteLine (); sw.WriteLine ("\t\tinternal " + Name + "Invoker (" + Name + "Native native_cb, IntPtr data, GLib.DestroyNotify notify)"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tthis.native_cb = native_cb;"); sw.WriteLine ("\t\t\t__data = data;"); sw.WriteLine ("\t\t\t__notify = notify;"); sw.WriteLine ("\t\t}"); sw.WriteLine (); sw.WriteLine ("\t\tinternal " + QualifiedName + " Handler {"); sw.WriteLine ("\t\t\tget {"); sw.WriteLine ("\t\t\t\treturn new " + QualifiedName + "(InvokeNative);"); sw.WriteLine ("\t\t\t}"); sw.WriteLine ("\t\t}"); sw.WriteLine (); sw.WriteLine ("\t\t" + retval.CSType + " InvokeNative (" + sig + ")"); sw.WriteLine ("\t\t{"); body.Initialize (gen_info); string call = "native_cb (" + InvokeString + ")"; if (retval.IsVoid) sw.WriteLine ("\t\t\t" + call + ";"); else sw.WriteLine ("\t\t\t" + retval.CSType + " result = " + retval.FromNative (call) + ";"); body.Finish (sw, String.Empty); if (!retval.IsVoid) sw.WriteLine ("\t\t\treturn result;"); sw.WriteLine ("\t\t}"); sw.WriteLine ("\t}"); sw.WriteLine (); } public string GenWrapper (GenerationInfo gen_info) { string wrapper = Name + "Native"; string qualname = MarshalType; if (!Validate ()) return String.Empty; body = new MethodBody (parms); StreamWriter save_sw = gen_info.Writer; StreamWriter sw = gen_info.Writer = gen_info.OpenStream (qualname); sw.WriteLine ("namespace " + NS + "Sharp {"); sw.WriteLine (); sw.WriteLine ("\tusing System;"); sw.WriteLine ("\tusing System.Runtime.InteropServices;"); sw.WriteLine (); sw.WriteLine ("#region Autogenerated code"); sw.WriteLine ("\t[GLib.CDeclCallback]"); sw.WriteLine ("\tinternal delegate " + retval.MarshalType + " " + wrapper + "(" + parms.ImportSignature + ");"); sw.WriteLine (); GenInvoker (gen_info, sw); sw.WriteLine ("\tinternal class " + Name + "Wrapper {"); sw.WriteLine (); ManagedCallString call = new ManagedCallString (parms, false); sw.WriteLine ("\t\tpublic " + retval.MarshalType + " NativeCallback (" + parms.ImportSignature + ")"); sw.WriteLine ("\t\t{"); string unconditional = call.Unconditional ("\t\t\t"); if (unconditional.Length > 0) sw.WriteLine (unconditional); sw.WriteLine ("\t\t\ttry {"); string call_setup = call.Setup ("\t\t\t\t"); if (call_setup.Length > 0) sw.WriteLine (call_setup); if (retval.CSType == "void") sw.WriteLine ("\t\t\t\tmanaged ({0});", call); else sw.WriteLine ("\t\t\t\t{0} __ret = managed ({1});", retval.CSType, call); string finish = call.Finish ("\t\t\t\t"); if (finish.Length > 0) sw.WriteLine (finish); sw.WriteLine ("\t\t\t\tif (release_on_call)\n\t\t\t\t\tgch.Free ();"); if (retval.CSType != "void") sw.WriteLine ("\t\t\t\treturn {0};", retval.ToNative ("__ret")); /* If the function expects one or more "out" parameters(error parameters are excluded) or has a return value different from void and bool, exceptions * thrown in the managed function have to be considered fatal meaning that an exception is to be thrown and the function call cannot not return */ bool fatal = (retval.MarshalType != "void" && retval.MarshalType != "bool") || call.HasOutParam; sw.WriteLine ("\t\t\t} catch (Exception e) {"); sw.WriteLine ("\t\t\t\tGLib.ExceptionManager.RaiseUnhandledException (e, " + (fatal ? "true" : "false") + ");"); if (fatal) { sw.WriteLine ("\t\t\t\t// NOTREACHED: Above call does not return."); sw.WriteLine ("\t\t\t\tthrow e;"); } else if (retval.MarshalType == "bool") { sw.WriteLine ("\t\t\t\treturn false;"); } sw.WriteLine ("\t\t\t}"); sw.WriteLine ("\t\t}"); sw.WriteLine (); sw.WriteLine ("\t\tbool release_on_call = false;"); sw.WriteLine ("\t\tGCHandle gch;"); sw.WriteLine (); sw.WriteLine ("\t\tpublic void PersistUntilCalled ()"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\trelease_on_call = true;"); sw.WriteLine ("\t\t\tgch = GCHandle.Alloc (this);"); sw.WriteLine ("\t\t}"); sw.WriteLine (); sw.WriteLine ("\t\tinternal " + wrapper + " NativeDelegate;"); sw.WriteLine ("\t\t" + NS + "." + Name + " managed;"); sw.WriteLine (); sw.WriteLine ("\t\tpublic " + Name + "Wrapper (" + NS + "." + Name + " managed)"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tthis.managed = managed;"); sw.WriteLine ("\t\t\tif (managed != null)"); sw.WriteLine ("\t\t\t\tNativeDelegate = new " + wrapper + " (NativeCallback);"); sw.WriteLine ("\t\t}"); sw.WriteLine (); sw.WriteLine ("\t\tpublic static " + NS + "." + Name + " GetManagedDelegate (" + wrapper + " native)"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tif (native == null)"); sw.WriteLine ("\t\t\t\treturn null;"); sw.WriteLine ("\t\t\t" + Name + "Wrapper wrapper = (" + Name + "Wrapper) native.Target;"); sw.WriteLine ("\t\t\tif (wrapper == null)"); sw.WriteLine ("\t\t\t\treturn null;"); sw.WriteLine ("\t\t\treturn wrapper.managed;"); sw.WriteLine ("\t\t}"); sw.WriteLine ("\t}"); sw.WriteLine ("#endregion"); sw.WriteLine ("}"); sw.Close (); gen_info.Writer = save_sw; return NS + "Sharp." + Name + "Wrapper"; } public override void Generate (GenerationInfo gen_info) { gen_info.CurrentType = Name; sig = new Signature (parms); StreamWriter sw = gen_info.OpenStream (Name); sw.WriteLine ("namespace " + NS + " {"); sw.WriteLine (); sw.WriteLine ("\tusing System;"); sw.WriteLine (); sw.WriteLine ("\t{0} delegate " + retval.CSType + " " + Name + "(" + sig.ToString() + ");", IsInternal ? "internal" : "public"); sw.WriteLine (); sw.WriteLine ("}"); sw.Close (); GenWrapper (gen_info); Statistics.CBCount++; } } } f-spot-0.8.2/lib/gio-sharp/generator/SimpleBase.cs0000644000175000017500000000477311417267577022275 0ustar00rubenruben00000000000000// GtkSharp.Generation.SimpleBase.cs - base class for marshaling non-generated types. // // Author: Mike Kestner // // Copyright (c) 2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; public abstract class SimpleBase : IGeneratable { string type; string ctype; string ns = String.Empty; string default_value = String.Empty; public SimpleBase (string ctype, string type, string default_value) { string[] toks = type.Split('.'); this.ctype = ctype; this.type = toks[toks.Length - 1]; if (toks.Length > 2) this.ns = String.Join (".", toks, 0, toks.Length - 1); else if (toks.Length == 2) this.ns = toks[0]; this.default_value = default_value; } public string CName { get { return ctype; } } public string Name { get { return type; } } public string QualifiedName { get { return ns == String.Empty ? type : ns + "." + type; } } public virtual string MarshalType { get { return QualifiedName; } } public virtual string MarshalReturnType { get { return MarshalType; } } public virtual string DefaultValue { get { return default_value; } } public virtual string ToNativeReturnType { get { return MarshalType; } } public virtual string CallByName (string var) { return var; } public virtual string FromNative(string var) { return var; } public virtual string FromNativeReturn(string var) { return FromNative (var); } public virtual string ToNativeReturn(string var) { return CallByName (var); } public bool Validate () { return true; } public void Generate () { } public void Generate (GenerationInfo gen_info) { } } } f-spot-0.8.2/lib/gio-sharp/generator/VirtualMethod.cs0000644000175000017500000001235311417267577023031 0ustar00rubenruben00000000000000// GtkSharp.Generation.VirtualMethod.cs - The VirtualMethod Generatable. // // Author: Mike Kestner // // Copyright (c) 2003-2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Xml; // FIXME: handle static VMs public class VirtualMethod : MethodBase { XmlElement elem; ReturnValue retval; Parameters parms; public VirtualMethod (XmlElement elem, ClassBase container_type) : base (elem, container_type) { this.elem = elem; retval = new ReturnValue (elem ["return-type"]); parms = new Parameters (elem["parameters"]); parms.HideData = true; } public bool IsGetter { get { return HasGetterName && ((!retval.IsVoid && parms.Count == 1) || (retval.IsVoid && parms.Count == 2 && parms [1].PassAs == "out")); } } public bool IsSetter { get { if (!HasSetterName || !retval.IsVoid) return false; if (parms.Count == 2 || (parms.Count == 4 && parms [1].Scope == "notified")) return true; else return false; } } public string MarshalReturnType { get { return SymbolTable.Table.GetToNativeReturnType (elem["return-type"].GetAttribute("type")); } } public void GenerateCallback (StreamWriter sw) { if (!Validate ()) return; ManagedCallString call = new ManagedCallString (parms, true); string type = parms [0].CSType + "Implementor"; string name = parms [0].Name; string call_string = "__obj." + Name + " (" + call + ")"; if (IsGetter) call_string = "__obj." + (Name.StartsWith ("Get") ? Name.Substring (3) : Name); else if (IsSetter) call_string = "__obj." + Name.Substring (3) + " = " + call; sw.WriteLine ("\t\t[GLib.CDeclCallback]"); sw.WriteLine ("\t\tdelegate " + MarshalReturnType + " " + Name + "Delegate (" + parms.ImportSignature + ");"); sw.WriteLine (); sw.WriteLine ("\t\tstatic " + MarshalReturnType + " " + Name + "Callback (" + parms.ImportSignature + ")"); sw.WriteLine ("\t\t{"); string unconditional = call.Unconditional ("\t\t\t"); if (unconditional.Length > 0) sw.WriteLine (unconditional); sw.WriteLine ("\t\t\ttry {"); sw.WriteLine ("\t\t\t\t" + type + " __obj = GLib.Object.GetObject (" + name + ", false) as " + type + ";"); sw.Write (call.Setup ("\t\t\t\t")); if (retval.IsVoid) { if (IsGetter) { Parameter p = parms [1]; string out_name = p.Name; if (p.MarshalType != p.CSType) out_name = "my" + out_name; sw.WriteLine ("\t\t\t\t" + out_name + " = " + call_string + ";"); } else sw.WriteLine ("\t\t\t\t" + call_string + ";"); } else sw.WriteLine ("\t\t\t\t" + retval.CSType + " __result = " + call_string + ";"); bool fatal = parms.HasOutParam || !retval.IsVoid; sw.Write (call.Finish ("\t\t\t\t")); if (!retval.IsVoid) sw.WriteLine ("\t\t\t\treturn " + retval.ToNative ("__result") + ";"); sw.WriteLine ("\t\t\t} catch (Exception e) {"); sw.WriteLine ("\t\t\t\tGLib.ExceptionManager.RaiseUnhandledException (e, " + (fatal ? "true" : "false") + ");"); if (fatal) { sw.WriteLine ("\t\t\t\t// NOTREACHED: above call does not return."); sw.WriteLine ("\t\t\t\tthrow e;"); } sw.WriteLine ("\t\t\t}"); sw.WriteLine ("\t\t}"); } public void GenerateDeclaration (StreamWriter sw, VirtualMethod complement) { VMSignature vmsig = new VMSignature (parms); if (IsGetter) { string name = Name.StartsWith ("Get") ? Name.Substring (3) : Name; string type = retval.IsVoid ? parms [1].CSType : retval.CSType; if (complement != null && complement.parms [1].CSType == type) sw.WriteLine ("\t\t" + type + " " + name + " { get; set; }"); else { sw.WriteLine ("\t\t" + type + " " + name + " { get; }"); if (complement != null) sw.WriteLine ("\t\t" + complement.retval.CSType + " " + complement.Name + " (" + (new VMSignature (complement.parms)) + ");"); } } else if (IsSetter) sw.WriteLine ("\t\t" + parms[1].CSType + " " + Name.Substring (3) + " { set; }"); else sw.WriteLine ("\t\t" + retval.CSType + " " + Name + " (" + vmsig + ");"); } enum ValidState { Unvalidated, Invalid, Valid } ValidState vstate = ValidState.Unvalidated; public bool IsValid { get { if (vstate == ValidState.Unvalidated) return Validate (); else return vstate == ValidState.Valid; } } public override bool Validate () { if (!parms.Validate () || !retval.Validate ()) { Console.Write ("in virtual method " + Name + " "); vstate = ValidState.Invalid; return false; } vstate = ValidState.Valid; return true; } } } f-spot-0.8.2/lib/gio-sharp/generator/Statistics.cs0000644000175000017500000000770311417267577022377 0ustar00rubenruben00000000000000// Statistics.cs : Generation statistics class implementation // // Author: Mike Kestner // // Copyright (c) 2002 Mike Kestner // Copyright (c) 2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; public class Statistics { static int cbs = 0; static int enums = 0; static int objects = 0; static int structs = 0; static int boxed = 0; static int opaques = 0; static int interfaces = 0; static int methods = 0; static int ctors = 0; static int props = 0; static int sigs = 0; static int throttled = 0; static int ignored = 0; static bool vm_ignored = false; public static int CBCount { get { return cbs; } set { cbs = value; } } public static int EnumCount { get { return enums; } set { enums = value; } } public static int ObjectCount { get { return objects; } set { objects = value; } } public static int StructCount { get { return structs; } set { structs = value; } } public static int BoxedCount { get { return boxed; } set { boxed = value; } } public static int OpaqueCount { get { return opaques; } set { opaques = value; } } public static int CtorCount { get { return ctors; } set { ctors = value; } } public static int MethodCount { get { return methods; } set { methods = value; } } public static int PropCount { get { return props; } set { props = value; } } public static int SignalCount { get { return sigs; } set { sigs = value; } } public static int IFaceCount { get { return interfaces; } set { interfaces = value; } } public static int ThrottledCount { get { return throttled; } set { throttled = value; } } public static int IgnoreCount { get { return ignored; } set { ignored = value; } } public static bool VMIgnored { get { return vm_ignored; } set { if (value) vm_ignored = value; } } public static void Report() { if (VMIgnored) { Console.WriteLine(); Console.WriteLine("Warning: Generation throttled for Virtual Methods."); Console.WriteLine(" Consider regenerating with --gluelib-name and --glue-filename."); } Console.WriteLine(); Console.WriteLine("Generation Summary:"); Console.Write(" Enums: " + enums); Console.Write(" Structs: " + structs); Console.Write(" Boxed: " + boxed); Console.Write(" Opaques: " + opaques); Console.Write(" Interfaces: " + interfaces); Console.Write(" Objects: " + objects); Console.WriteLine(" Callbacks: " + cbs); Console.Write(" Properties: " + props); Console.Write(" Signals: " + sigs); Console.Write(" Methods: " + methods); Console.Write(" Constructors: " + ctors); Console.WriteLine(" Throttled: " + throttled); Console.WriteLine("Total Nodes: " + (enums+structs+boxed+opaques+interfaces+cbs+objects+props+sigs+methods+ctors+throttled)); Console.WriteLine(); } } } f-spot-0.8.2/lib/gio-sharp/generator/BoxedGen.cs0000644000175000017500000000573411417267577021742 0ustar00rubenruben00000000000000// GtkSharp.Generation.BoxedGen.cs - The Boxed Generatable. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // Copyright (c) 2003-2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.IO; using System.Xml; public class BoxedGen : StructBase { public BoxedGen (XmlElement ns, XmlElement elem) : base (ns, elem) {} public override void Generate (GenerationInfo gen_info) { Method copy = methods["Copy"] as Method; methods.Remove ("Copy"); methods.Remove ("Free"); gen_info.CurrentType = Name; StreamWriter sw = gen_info.Writer = gen_info.OpenStream (Name); base.Generate (gen_info); sw.WriteLine ("\t\t[DllImport(\"glibsharpglue-2\")]"); sw.WriteLine ("\t\tstatic extern IntPtr glibsharp_value_get_boxed (ref GLib.Value val);"); sw.WriteLine (); sw.WriteLine ("\t\t[DllImport(\"glibsharpglue-2\")]"); sw.WriteLine ("\t\tstatic extern void glibsharp_value_set_boxed (ref GLib.Value val, ref " + QualifiedName + " boxed);"); sw.WriteLine (); sw.WriteLine ("\t\tpublic static explicit operator GLib.Value (" + QualifiedName + " boxed)"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tGLib.Value val = GLib.Value.Empty;"); sw.WriteLine ("\t\t\tval.Init (" + QualifiedName + ".GType);"); sw.WriteLine ("\t\t\tglibsharp_value_set_boxed (ref val, ref boxed);"); sw.WriteLine ("\t\t\treturn val;"); sw.WriteLine ("\t\t}"); sw.WriteLine (); sw.WriteLine ("\t\tpublic static explicit operator " + QualifiedName + " (GLib.Value val)"); sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t\tIntPtr boxed_ptr = glibsharp_value_get_boxed (ref val);"); sw.WriteLine ("\t\t\treturn New (boxed_ptr);"); sw.WriteLine ("\t\t}"); if (copy != null && copy.IsDeprecated) { sw.WriteLine (); sw.WriteLine ("\t\t[Obsolete(\"This is a no-op\")]"); sw.WriteLine ("\t\tpublic " + QualifiedName + " Copy() {"); sw.WriteLine ("\t\t\treturn this;"); sw.WriteLine ("\t\t}"); } sw.WriteLine ("#endregion"); AppendCustom(sw, gen_info.CustomDir); sw.WriteLine ("\t}"); sw.WriteLine ("}"); sw.Close (); gen_info.Writer = null; Statistics.BoxedCount++; } } } f-spot-0.8.2/lib/gio-sharp/generator/ReturnValue.cs0000644000175000017500000001105611417267577022515 0ustar00rubenruben00000000000000// GtkSharp.Generation.ReturnValue.cs - The ReturnValue Generatable. // // Author: Mike Kestner // // Copyright (c) 2004-2005 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Xml; public class ReturnValue { bool is_null_term; bool is_array; bool elements_owned; bool owned; string ctype = String.Empty; string element_ctype = String.Empty; public ReturnValue (XmlElement elem) { if (elem != null) { is_null_term = elem.HasAttribute ("null_term_array"); is_array = elem.HasAttribute ("array"); elements_owned = elem.GetAttribute ("elements_owned") == "true"; owned = elem.GetAttribute ("owned") == "true"; ctype = elem.GetAttribute("type"); element_ctype = elem.GetAttribute ("element_type"); } } public string CType { get { return ctype; } } public string CSType { get { if (IGen == null) return String.Empty; if (ElementType != String.Empty) return ElementType + "[]"; return IGen.QualifiedName + (is_array || is_null_term ? "[]" : String.Empty); } } public string DefaultValue { get { if (IGen == null) return String.Empty; return IGen.DefaultValue; } } string ElementType { get { if (element_ctype.Length > 0) return SymbolTable.Table.GetCSType (element_ctype); return String.Empty; } } IGeneratable igen; IGeneratable IGen { get { if (igen == null) igen = SymbolTable.Table [CType]; return igen; } } public bool IsVoid { get { return CSType == "void"; } } public string MarshalType { get { if (IGen == null) return String.Empty; else if (is_null_term) return "IntPtr"; return IGen.MarshalReturnType + (is_array ? "[]" : String.Empty); } } public string ToNativeType { get { if (IGen == null) return String.Empty; else if (is_null_term) return "IntPtr"; //FIXME return IGen.ToNativeReturnType + (is_array ? "[]" : String.Empty); } } public string FromNative (string var) { if (IGen == null) return String.Empty; if (ElementType != String.Empty) { string args = (owned ? "true" : "false") + ", " + (elements_owned ? "true" : "false"); if (IGen.QualifiedName == "GLib.PtrArray") return String.Format ("({0}[]) GLib.Marshaller.PtrArrayToArray ({1}, {2}, typeof({0}))", ElementType, var, args); else return String.Format ("({0}[]) GLib.Marshaller.ListPtrToArray ({1}, typeof({2}), {3}, typeof({0}))", ElementType, var, IGen.QualifiedName, args); } else if (IGen is HandleBase) return ((HandleBase)IGen).FromNative (var, owned); else if (is_null_term) return String.Format ("GLib.Marshaller.NullTermPtrToStringArray ({0}, {1})", var, owned ? "true" : "false"); else return IGen.FromNativeReturn (var); } public string ToNative (string var) { if (IGen == null) return String.Empty; if (ElementType.Length > 0) { string args = ", typeof (" + ElementType + "), " + (owned ? "true" : "false") + ", " + (elements_owned ? "true" : "false"); var = "new " + IGen.QualifiedName + "(" + var + args + ")"; } else if (is_null_term) return String.Format ("GLib.Marshaller.StringArrayToNullTermPtr ({0})", var); if (IGen is IManualMarshaler) return (IGen as IManualMarshaler).AllocNative (var); else if (IGen is ObjectGen && owned) return var + " == null ? IntPtr.Zero : " + var + ".OwnedHandle"; else if (IGen is OpaqueGen && owned) return var + " == null ? IntPtr.Zero : " + var + ".OwnedCopy"; else return IGen.ToNativeReturn (var); } public bool Validate () { if (MarshalType == "" || CSType == "") { Console.Write("rettype: " + CType); return false; } return true; } } } f-spot-0.8.2/lib/gio-sharp/generator/Makefile.in0000644000175000017500000003704511503407243021743 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile.include # FSpot wide helper # Directories VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/Makefile.include subdir = lib/gio-sharp/generator ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio LINK_GIOSHARP = -r:$(DIR_GIOSHARP)/gio-sharp.dll CSC_FLAGS = -debug CSC = $(MCS) $(CSC_FLAGS) -target:exe CSC_LIB = $(MCS) $(CSC_FLAGS) -target:library MONO_DEBUGFLAGS = --debug RUNTIME = mono $(MONO_DEBUGFLAGS) CLEANFILES = \ gapi_codegen.exe \ gapi_codegen.exe.mdb sources = \ AliasGen.cs \ BoxedGen.cs \ ByRefGen.cs \ CallbackGen.cs \ ChildProperty.cs \ ClassBase.cs \ ClassGen.cs \ CodeGenerator.cs \ ConstFilenameGen.cs \ ConstStringGen.cs \ Ctor.cs \ EnumGen.cs \ FieldBase.cs \ GenBase.cs \ GenerationInfo.cs \ HandleBase.cs \ IAccessor.cs \ IGeneratable.cs \ IManualMarshaler.cs \ InterfaceGen.cs \ LPGen.cs \ LPUGen.cs \ ManagedCallString.cs \ ManualGen.cs \ MarshalGen.cs \ MethodBase.cs \ MethodBody.cs \ Method.cs \ ObjectField.cs \ ObjectBase.cs \ ObjectGen.cs \ OpaqueGen.cs \ Parameters.cs \ Parser.cs \ Property.cs \ PropertyBase.cs \ ReturnValue.cs \ Signal.cs \ Signature.cs \ SimpleBase.cs \ SimpleGen.cs \ Statistics.cs \ StructBase.cs \ StructField.cs \ StructGen.cs \ SymbolTable.cs \ VirtualMethod.cs \ VMSignature.cs build_sources = $(addprefix $(srcdir)/, $(sources)) dist_sources = $(sources) EXTRA_DIST = \ $(dist_sources) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/gio-sharp/generator/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/gio-sharp/generator/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am all: gapi_codegen.exe gapi_codegen.exe: $(build_sources) @echo -e "\n*** Building the generator" $(CSC) /out:gapi_codegen.exe $(build_sources) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/lib/gio-sharp/generator/AliasGen.cs0000644000175000017500000000200011417267577021711 0ustar00rubenruben00000000000000// GtkSharp.Generation.AliasGen.cs - The Alias type Generatable. // // Author: Mike Kestner // // Copyright (c) 2003 Mike Kestner // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; public class AliasGen : SimpleBase { public AliasGen (string ctype, string type) : base (ctype, type, String.Empty) {} } } f-spot-0.8.2/lib/gio-sharp/generator/Property.cs0000644000175000017500000001320611417267577022064 0ustar00rubenruben00000000000000// GtkSharp.Generation.Property.cs - The Property Generatable. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // Copyright (c) 2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; using System.Xml; public class Property : PropertyBase { public Property (XmlElement elem, ClassBase container_type) : base (elem, container_type) {} public bool Validate () { if (CSType == "" && !Hidden) { Console.Write("Property has unknown Type {0} ", CType); Statistics.ThrottledCount++; return false; } return true; } bool Readable { get { return elem.GetAttribute ("readable") == "true"; } } bool Writable { get { return elem.GetAttribute ("writeable") == "true" && !elem.HasAttribute ("construct-only"); } } bool IsDeprecated { get { return !container_type.IsDeprecated && (elem.GetAttribute ("deprecated") == "1" || elem.GetAttribute ("deprecated") == "true"); } } protected virtual string PropertyAttribute (string qpname) { return "[GLib.Property (" + qpname + ")]"; } protected virtual string RawGetter (string qpname) { return "GetProperty (" + qpname + ")"; } protected virtual string RawSetter (string qpname) { return "SetProperty(" + qpname + ", val)"; } public void GenerateDecl (StreamWriter sw, string indent) { if (Hidden || (!Readable && !Writable)) return; string name = Name; if (name == container_type.Name) name += "Prop"; sw.WriteLine (indent + CSType + " " + name + " {"); sw.Write (indent + "\t"); if (Readable || Getter != null) sw.Write ("get; "); if (Writable || Setter != null) sw.Write ("set;"); sw.WriteLine (); sw.WriteLine (indent + "}"); } public void Generate (GenerationInfo gen_info, string indent, ClassBase implementor) { SymbolTable table = SymbolTable.Table; StreamWriter sw = gen_info.Writer; if (Hidden || (!Readable && !Writable)) return; string modifiers = ""; if (IsNew || (container_type.Parent != null && container_type.Parent.GetPropertyRecursively (Name) != null)) modifiers = "new "; else if (implementor != null && implementor.Parent != null && implementor.Parent.GetPropertyRecursively (Name) != null) modifiers = "new "; string name = Name; if (name == container_type.Name) { name += "Prop"; } string qpname = "\"" + CName + "\""; string v_type = ""; if (table.IsInterface (CType)) { v_type = "(GLib.Object)"; } else if (table.IsOpaque (CType)) { v_type = "(GLib.Opaque)"; } else if (table.IsEnum (CType)) { v_type = "(Enum)"; } GenerateImports (gen_info, indent); if (IsDeprecated || (Getter != null && Getter.IsDeprecated) || (Setter != null && Setter.IsDeprecated)) sw.WriteLine (indent + "[Obsolete]"); sw.WriteLine (indent + PropertyAttribute (qpname)); sw.WriteLine (indent + "public " + modifiers + CSType + " " + name + " {"); indent += "\t"; if (Getter != null) { sw.Write(indent + "get "); Getter.GenerateBody(gen_info, implementor, "\t"); sw.WriteLine(); } else if (Readable) { sw.WriteLine(indent + "get {"); sw.WriteLine(indent + "\tGLib.Value val = " + RawGetter (qpname) + ";"); if (table.IsOpaque (CType) || table.IsBoxed (CType)) { sw.WriteLine(indent + "\t" + CSType + " ret = (" + CSType + ") val;"); } else if (table.IsInterface (CType)) { // Do we have to dispose the GLib.Object from the GLib.Value? sw.WriteLine (indent + "\t{0} ret = {0}Adapter.GetObject ((GLib.Object) val);", CSType); } else { sw.Write(indent + "\t" + CSType + " ret = "); sw.Write ("(" + CSType + ") "); if (v_type != "") { sw.Write(v_type + " "); } sw.WriteLine("val;"); } sw.WriteLine(indent + "\tval.Dispose ();"); sw.WriteLine(indent + "\treturn ret;"); sw.WriteLine(indent + "}"); } if (Setter != null) { sw.Write(indent + "set "); Setter.GenerateBody(gen_info, implementor, "\t"); sw.WriteLine(); } else if (Writable) { sw.WriteLine(indent + "set {"); sw.Write(indent + "\tGLib.Value val = "); if (table.IsBoxed (CType)) { sw.WriteLine("(GLib.Value) value;"); } else if (table.IsOpaque (CType)) { sw.WriteLine("new GLib.Value(value, \"{0}\");", CType); } else { sw.Write("new GLib.Value("); if (v_type != "" && !(table.IsObject (CType) || table.IsInterface (CType) || table.IsOpaque (CType))) { sw.Write(v_type + " "); } sw.WriteLine("value);"); } sw.WriteLine(indent + "\t" + RawSetter (qpname) + ";"); sw.WriteLine(indent + "\tval.Dispose ();"); sw.WriteLine(indent + "}"); } sw.WriteLine(indent.Substring (1) + "}"); sw.WriteLine(); Statistics.PropCount++; } } } f-spot-0.8.2/lib/gio-sharp/generator/ByRefGen.cs0000644000175000017500000000342311417267577021701 0ustar00rubenruben00000000000000// GtkSharp.Generation.ByRefGen.cs - The ByRef type Generatable. // // Author: Mike Kestner // // Copyright (c) 2003 Mike Kestner // Copyright (c) 2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; public class ByRefGen : SimpleBase, IManualMarshaler { public ByRefGen (string ctype, string type) : base (ctype, type, type + ".Empty") {} public override string MarshalType { get { return "IntPtr"; } } public override string CallByName (string var_name) { return "native_" + var_name; } public string AllocNative () { return "Marshal.AllocHGlobal (Marshal.SizeOf (typeof (" + QualifiedName + ")))"; } public string AllocNative (string var_name) { return "GLib.Marshaller.StructureToPtrAlloc (" + var_name + ")"; } public override string FromNative (string var_name) { return String.Format ("({0}) Marshal.PtrToStructure ({1}, typeof ({0}))", QualifiedName, var_name); } public string ReleaseNative (string var_name) { return "Marshal.FreeHGlobal (" + var_name + ")"; } } } f-spot-0.8.2/lib/gio-sharp/generator/IGeneratable.cs0000644000175000017500000000452211417267577022563 0ustar00rubenruben00000000000000// GtkSharp.Generation.IGeneratable.cs - Interface to generate code for a type. // // Author: Mike Kestner // // Copyright (c) 2001 Mike Kestner // Copyright (c) 2007 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { public interface IGeneratable { // The C name of the generatable string CName {get;} // The (short) C# name of the generatable string Name {get;} // The fully-qualified C# name of the generatable string QualifiedName {get;} // The type (possibly including "ref" or "out") to use in the import // signature when passing this generatable to unmanaged code string MarshalType {get;} // The type to use as the return type in an import signature when // receiving this generatable back from unmanaged code string MarshalReturnType {get;} // The type to use in a managed callback signature when returning this // generatable to unmanaged code string ToNativeReturnType {get;} // The value returned by callbacks that are interrupted prematurely // by managed exceptions or other conditions where an appropriate // value can't be otherwise obtained. string DefaultValue {get;} // Generates an expression to convert var_name to MarshalType string CallByName (string var_name); // Generates an expression to convert var from MarshalType string FromNative (string var); // Generates an expression to convert var from MarshalReturnType string FromNativeReturn (string var); // Generates an expression to convert var to ToNativeReturnType string ToNativeReturn (string var); bool Validate (); void Generate (); void Generate (GenerationInfo gen_info); } } f-spot-0.8.2/lib/gio-sharp/generator/Signature.cs0000644000175000017500000000525611417267577022207 0ustar00rubenruben00000000000000// GtkSharp.Generation.Signature.cs - The Signature Generation Class. // // Author: Mike Kestner // // Copyright (c) 2003-2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.Xml; public class Signature { private ArrayList parms = new ArrayList (); public Signature (Parameters parms) { foreach (Parameter p in parms) { if (!parms.IsHidden (p)) this.parms.Add (p); } } public override string ToString () { if (parms.Count == 0) return ""; string[] result = new string [parms.Count]; int i = 0; foreach (Parameter p in parms) { result [i] = p.PassAs != "" ? p.PassAs + " " : ""; result [i++] += p.CSType + " " + p.Name; } return String.Join (", ", result); } public string Types { get { if (parms.Count == 0) return ""; string[] result = new string [parms.Count]; int i = 0; foreach (Parameter p in parms) result [i++] = p.CSType; return String.Join (":", result); } } public bool IsAccessor { get { int count = 0; foreach (Parameter p in parms) { if (p.PassAs == "out") count++; if (count > 1) return false; } return count == 1; } } public string AccessorType { get { foreach (Parameter p in parms) if (p.PassAs == "out") return p.CSType; return null; } } public string AccessorName { get { foreach (Parameter p in parms) if (p.PassAs == "out") return p.Name; return null; } } public string AsAccessor { get { string[] result = new string [parms.Count - 1]; int i = 0; foreach (Parameter p in parms) { if (p.PassAs == "out") continue; result [i] = p.PassAs != "" ? p.PassAs + " " : ""; result [i++] += p.CSType + " " + p.Name; } return String.Join (", ", result); } } } } f-spot-0.8.2/lib/gio-sharp/generator/PropertyBase.cs0000644000175000017500000000521511417267577022660 0ustar00rubenruben00000000000000// GtkSharp.Generation.PropertyBase.cs - base class for properties and // fields // // Copyright (c) 2005 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Xml; public abstract class PropertyBase { protected XmlElement elem; protected ClassBase container_type; public PropertyBase (XmlElement elem, ClassBase container_type) { this.elem = elem; this.container_type = container_type; } public string Name { get { return elem.GetAttribute ("name"); } } public string CName { get { return elem.GetAttribute ("cname"); } } protected string ctype; public string CType { get { if (ctype == null) { if (elem.GetAttribute("bits") == "1") ctype = "gboolean"; else ctype = elem.GetAttribute("type"); } return ctype; } } protected string cstype; public string CSType { get { if (cstype == null) cstype = SymbolTable.Table.GetCSType (CType); return cstype; } } public bool Hidden { get { return elem.HasAttribute("hidden"); } } protected bool IsNew { get { return elem.HasAttribute("new_flag"); } } Method getter; protected Method Getter { get { if (getter == null) { getter = container_type.GetMethod ("Get" + Name); if (getter != null && getter.Name == "Get" + Name && getter.IsGetter) cstype = getter.ReturnType; else getter = null; } return getter; } } Method setter; protected Method Setter { get { if (setter == null) { setter = container_type.GetMethod ("Set" + Name); if (setter != null && setter.Name == "Set" + Name && setter.IsSetter) cstype = setter.Signature.Types; else setter = null; } return setter; } } protected virtual void GenerateImports (GenerationInfo gen_info, string indent) { if (Getter != null) Getter.GenerateImport (gen_info.Writer); if (Setter != null) Setter.GenerateImport (gen_info.Writer); } } } f-spot-0.8.2/lib/gio-sharp/generator/Makefile.am0000644000175000017500000000237711417267577021754 0ustar00rubenruben00000000000000include $(top_srcdir)/Makefile.include CLEANFILES = \ gapi_codegen.exe \ gapi_codegen.exe.mdb sources = \ AliasGen.cs \ BoxedGen.cs \ ByRefGen.cs \ CallbackGen.cs \ ChildProperty.cs \ ClassBase.cs \ ClassGen.cs \ CodeGenerator.cs \ ConstFilenameGen.cs \ ConstStringGen.cs \ Ctor.cs \ EnumGen.cs \ FieldBase.cs \ GenBase.cs \ GenerationInfo.cs \ HandleBase.cs \ IAccessor.cs \ IGeneratable.cs \ IManualMarshaler.cs \ InterfaceGen.cs \ LPGen.cs \ LPUGen.cs \ ManagedCallString.cs \ ManualGen.cs \ MarshalGen.cs \ MethodBase.cs \ MethodBody.cs \ Method.cs \ ObjectField.cs \ ObjectBase.cs \ ObjectGen.cs \ OpaqueGen.cs \ Parameters.cs \ Parser.cs \ Property.cs \ PropertyBase.cs \ ReturnValue.cs \ Signal.cs \ Signature.cs \ SimpleBase.cs \ SimpleGen.cs \ Statistics.cs \ StructBase.cs \ StructField.cs \ StructGen.cs \ SymbolTable.cs \ VirtualMethod.cs \ VMSignature.cs build_sources = $(addprefix $(srcdir)/, $(sources)) dist_sources = $(sources) EXTRA_DIST = \ $(dist_sources) all: gapi_codegen.exe gapi_codegen.exe: $(build_sources) @echo -e "\n*** Building the generator" $(CSC) /out:gapi_codegen.exe $(build_sources) f-spot-0.8.2/lib/gio-sharp/generator/MethodBody.cs0000644000175000017500000001270111417267577022275 0ustar00rubenruben00000000000000// GtkSharp.Generation.MethodBody.cs - The MethodBody Generation Class. // // Author: Mike Kestner // // Copyright (c) 2001-2003 Mike Kestner // Copyright (c) 2003-2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.Collections; using System.IO; public class MethodBody { Parameters parameters; public MethodBody (Parameters parms) { parameters = parms; } private string CastFromInt (string type) { return type != "int" ? "(" + type + ") " : ""; } public string GetCallString (bool is_set) { if (parameters.Count == 0) return String.Empty; string[] result = new string [parameters.Count]; for (int i = 0; i < parameters.Count; i++) { Parameter p = parameters [i]; IGeneratable igen = p.Generatable; bool is_prop = is_set && i == 0; if (i > 0 && parameters [i - 1].IsString && p.IsLength && p.PassAs == String.Empty) { string string_name = (i == 1 && is_set) ? "value" : parameters [i - 1].Name; result[i] = igen.CallByName (CastFromInt (p.CSType) + "System.Text.Encoding.UTF8.GetByteCount (" + string_name + ")"); continue; } if (is_prop) p.CallName = "value"; else p.CallName = p.Name; string call_parm = p.CallString; if (p.IsUserData && parameters.IsHidden (p) && !parameters.HideData && (i == 0 || parameters [i - 1].Scope != "notified")) { call_parm = "IntPtr.Zero"; } result [i] += call_parm; } return String.Join (", ", result); } public void Initialize (GenerationInfo gen_info) { Initialize (gen_info, false, false, String.Empty); } public void Initialize (GenerationInfo gen_info, bool is_get, bool is_set, string indent) { if (parameters.Count == 0) return; StreamWriter sw = gen_info.Writer; for (int i = 0; i < parameters.Count; i++) { Parameter p = parameters [i]; IGeneratable gen = p.Generatable; string name = p.Name; if (is_set) name = "value"; p.CallName = name; foreach (string prep in p.Prepare) sw.WriteLine (indent + "\t\t\t" + prep); if (gen is CallbackGen) { CallbackGen cbgen = gen as CallbackGen; string wrapper = cbgen.GenWrapper(gen_info); switch (p.Scope) { case "notified": sw.WriteLine (indent + "\t\t\t{0} {1}_wrapper = new {0} ({1});", wrapper, name); sw.WriteLine (indent + "\t\t\tIntPtr {0};", parameters [i + 1].Name); sw.WriteLine (indent + "\t\t\t{0} {1};", parameters [i + 2].CSType, parameters [i + 2].Name); sw.WriteLine (indent + "\t\t\tif ({0} == null) {{", name); sw.WriteLine (indent + "\t\t\t\t{0} = IntPtr.Zero;", parameters [i + 1].Name); sw.WriteLine (indent + "\t\t\t\t{0} = null;", parameters [i + 2].Name); sw.WriteLine (indent + "\t\t\t} else {"); sw.WriteLine (indent + "\t\t\t\t{0} = (IntPtr) GCHandle.Alloc ({1}_wrapper);", parameters [i + 1].Name, name); sw.WriteLine (indent + "\t\t\t\t{0} = GLib.DestroyHelper.NotifyHandler;", parameters [i + 2].Name, parameters [i + 2].CSType); sw.WriteLine (indent + "\t\t\t}"); break; case "async": sw.WriteLine (indent + "\t\t\t{0} {1}_wrapper = new {0} ({1});", wrapper, name); sw.WriteLine (indent + "\t\t\t{0}_wrapper.PersistUntilCalled ();", name); break; case "call": default: if (p.Scope == String.Empty) Console.WriteLine ("Defaulting " + gen.Name + " param to 'call' scope in method " + gen_info.CurrentMember); sw.WriteLine (indent + "\t\t\t{0} {1}_wrapper = new {0} ({1});", wrapper, name); break; } } } if (ThrowsException) sw.WriteLine (indent + "\t\t\tIntPtr error = IntPtr.Zero;"); } public void InitAccessor (StreamWriter sw, Signature sig, string indent) { sw.WriteLine (indent + "\t\t\t" + sig.AccessorType + " " + sig.AccessorName + ";"); } public void Finish (StreamWriter sw, string indent) { foreach (Parameter p in parameters) foreach (string s in p.Finish) sw.WriteLine(indent + "\t\t\t" + s); } public void FinishAccessor (StreamWriter sw, Signature sig, string indent) { sw.WriteLine (indent + "\t\t\treturn " + sig.AccessorName + ";"); } public void HandleException (StreamWriter sw, string indent) { if (!ThrowsException) return; sw.WriteLine (indent + "\t\t\tif (error != IntPtr.Zero) throw new GLib.GException (error);"); } public bool ThrowsException { get { int idx = parameters.Count - 1; while (idx >= 0) { if (parameters [idx].IsUserData) idx--; else if (parameters [idx].CType == "GError**") return true; else break; } return false; } } } } f-spot-0.8.2/lib/gio-sharp/generator/LPGen.cs0000644000175000017500000000321711417267577021206 0ustar00rubenruben00000000000000// GtkSharp.Generation.LPGen.cs - long/pointer Generatable. // // Author: Mike Kestner // // Copyright (c) 2004 Novell, Inc. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // 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., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. namespace GtkSharp.Generation { using System; using System.IO; public class LPGen : SimpleGen, IAccessor { public LPGen (string ctype) : base (ctype, "long", "0L") {} public override string MarshalType { get { return "IntPtr"; } } public override string CallByName (string var_name) { return "new IntPtr (" + var_name + ")"; } public override string FromNative(string var) { return "(long) " + var; } public void WriteAccessors (StreamWriter sw, string indent, string var) { sw.WriteLine (indent + "get {"); sw.WriteLine (indent + "\treturn " + FromNative (var) + ";"); sw.WriteLine (indent + "}"); sw.WriteLine (indent + "set {"); sw.WriteLine (indent + "\t" + var + " = " + CallByName ("value") + ";"); sw.WriteLine (indent + "}"); } } } f-spot-0.8.2/lib/gio-sharp/Makefile.am0000644000175000017500000000056211417267577017760 0ustar00rubenruben00000000000000SUBDIRS = \ generator \ gio fetch: rm -rf fetch git clone git://gitorious.org/gio-sharp/mainline.git fetch update: cp fetch/generator/*.cs generator/ cp fetch/gio/*.custom \ fetch/gio/*.cs \ fetch/gio/gio-api-2.22.raw \ fetch/gio/Gio.metadata \ fetch/gio/gtk-sharp.snk \ gio mv gio/gio-api-2.22.raw gio/gio-api.raw .PHONY: fetch update f-spot-0.8.2/lib/Makefile.in0000644000175000017500000005501511503407237016064 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Note the list below is sorted by alphabet. Dpap-sharp isn't built. SUBDIRS = \ GKeyFile \ gio-sharp \ gtk-sharp-beans \ Hyena \ libfspot \ TagLib \ unique-sharp \ Mono.Google \ Mono.Tabblo \ SmugMugNet ### The stuff below takes care of embedding libraries. Build system hacks! ### TMPDIR_TAGLIB = /tmp/fetch_taglib all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am clone-taglib: mkdir $(TMPDIR_TAGLIB) git clone --depth 1 git://gitorious.org/taglib-sharp/mainline.git $(TMPDIR_TAGLIB) pushd $(TMPDIR_TAGLIB); git checkout -b photo-support origin/photo-support; popd update-taglib: rm -rf TagLib/TagLib cp -r $(TMPDIR_TAGLIB)/src/TagLib TagLib echo "# This file is autogenerated, do not edit!" > TagLib/Makefile.am echo "include \$$(top_srcdir)/Makefile.include" >> TagLib/Makefile.am echo "ASSEMBLY_NAME = TagLib" >> TagLib/Makefile.am echo >> TagLib/Makefile.am echo "ASSEMBLY_SOURCES = \\" >> TagLib/Makefile.am tail -n+2 TagLib/TagLib/TagLib.sources | sed s/\$$\(srcdir\)\\/// >> TagLib/Makefile.am echo >> TagLib/Makefile.am echo "ASSEMBLY = \$$(ASSEMBLY_NAME).dll" >> TagLib/Makefile.am echo "all: \$$(ASSEMBLY)" >> TagLib/Makefile.am echo "\$$(ASSEMBLY): \$$(ASSEMBLY_SOURCES)" >> TagLib/Makefile.am echo " \$$(CSC_LIB) \$$(CSC_DEFINES) -out:\$$@ \$$(ASSEMBLY_SOURCES)" >> TagLib/Makefile.am echo >> TagLib/Makefile.am echo "assemblydir = \$$(pkglibdir)" >> TagLib/Makefile.am echo "assembly_DATA = \$$(ASSEMBLY)" >> TagLib/Makefile.am echo "EXTRA_DIST = \$$(ASSEMBLY_SOURCES)" >> TagLib/Makefile.am echo "CLEANFILES = \$$(ASSEMBLY) \$$(ASSEMBLY).mdb" >> TagLib/Makefile.am .PHONY: clone-taglib update-taglib # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/lib/Makefile.am0000644000175000017500000000313211430555233016043 0ustar00rubenruben00000000000000# Note the list below is sorted by alphabet. Dpap-sharp isn't built. SUBDIRS = \ GKeyFile \ gio-sharp \ gtk-sharp-beans \ Hyena \ libfspot \ TagLib \ unique-sharp \ Mono.Google \ Mono.Tabblo \ SmugMugNet ### The stuff below takes care of embedding libraries. Build system hacks! ### TMPDIR_TAGLIB = /tmp/fetch_taglib clone-taglib: mkdir $(TMPDIR_TAGLIB) git clone --depth 1 git://gitorious.org/taglib-sharp/mainline.git $(TMPDIR_TAGLIB) pushd $(TMPDIR_TAGLIB); git checkout -b photo-support origin/photo-support; popd update-taglib: rm -rf TagLib/TagLib cp -r $(TMPDIR_TAGLIB)/src/TagLib TagLib echo "# This file is autogenerated, do not edit!" > TagLib/Makefile.am echo "include \$$(top_srcdir)/Makefile.include" >> TagLib/Makefile.am echo "ASSEMBLY_NAME = TagLib" >> TagLib/Makefile.am echo >> TagLib/Makefile.am echo "ASSEMBLY_SOURCES = \\" >> TagLib/Makefile.am tail -n+2 TagLib/TagLib/TagLib.sources | sed s/\$$\(srcdir\)\\/// >> TagLib/Makefile.am echo >> TagLib/Makefile.am echo "ASSEMBLY = \$$(ASSEMBLY_NAME).dll" >> TagLib/Makefile.am echo "all: \$$(ASSEMBLY)" >> TagLib/Makefile.am echo "\$$(ASSEMBLY): \$$(ASSEMBLY_SOURCES)" >> TagLib/Makefile.am echo " \$$(CSC_LIB) \$$(CSC_DEFINES) -out:\$$@ \$$(ASSEMBLY_SOURCES)" >> TagLib/Makefile.am echo >> TagLib/Makefile.am echo "assemblydir = \$$(pkglibdir)" >> TagLib/Makefile.am echo "assembly_DATA = \$$(ASSEMBLY)" >> TagLib/Makefile.am echo "EXTRA_DIST = \$$(ASSEMBLY_SOURCES)" >> TagLib/Makefile.am echo "CLEANFILES = \$$(ASSEMBLY) \$$(ASSEMBLY).mdb" >> TagLib/Makefile.am .PHONY: clone-taglib update-taglib f-spot-0.8.2/lib/TagLib/0000777000175000017500000000000011503407416015156 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/sources.mk0000644000175000017500000002277011462351712017177 0ustar00rubenruben00000000000000# This file is autogenerated, do not edit! SOURCES = \ TagLib/src/TagLib/Aac/AudioHeader.cs \ TagLib/src/TagLib/Aac/BitStream.cs \ TagLib/src/TagLib/Aac/File.cs \ TagLib/src/TagLib/Aiff/File.cs \ TagLib/src/TagLib/Aiff/StreamHeader.cs \ TagLib/src/TagLib/Ape/Tag.cs \ TagLib/src/TagLib/Ape/Item.cs \ TagLib/src/TagLib/Ape/Footer.cs \ TagLib/src/TagLib/Ape/File.cs \ TagLib/src/TagLib/Ape/StreamHeader.cs \ TagLib/src/TagLib/Asf/Guid.cs \ TagLib/src/TagLib/Asf/StreamPropertiesObject.cs \ TagLib/src/TagLib/Asf/UnknownObject.cs \ TagLib/src/TagLib/Asf/Tag.cs \ TagLib/src/TagLib/Asf/Object.cs \ TagLib/src/TagLib/Asf/ExtendedContentDescriptionObject.cs \ TagLib/src/TagLib/Asf/ContentDescriptionObject.cs \ TagLib/src/TagLib/Asf/MetadataLibraryObject.cs \ TagLib/src/TagLib/Asf/HeaderObject.cs \ TagLib/src/TagLib/Asf/HeaderExtensionObject.cs \ TagLib/src/TagLib/Asf/File.cs \ TagLib/src/TagLib/Asf/FilePropertiesObject.cs \ TagLib/src/TagLib/Asf/PaddingObject.cs \ TagLib/src/TagLib/Asf/ContentDescriptor.cs \ TagLib/src/TagLib/Asf/DescriptionRecord.cs \ TagLib/src/TagLib/Mpc/StreamHeader.cs \ TagLib/src/TagLib/Mpc/File.cs \ TagLib/src/TagLib/Ogg/GroupedComment.cs \ TagLib/src/TagLib/Ogg/Bitstream.cs \ TagLib/src/TagLib/Ogg/Paginator.cs \ TagLib/src/TagLib/Ogg/Codec.cs \ TagLib/src/TagLib/Ogg/Codecs/Vorbis.cs \ TagLib/src/TagLib/Ogg/Codecs/Theora.cs \ TagLib/src/TagLib/Ogg/Page.cs \ TagLib/src/TagLib/Ogg/XiphComment.cs \ TagLib/src/TagLib/Ogg/PageHeader.cs \ TagLib/src/TagLib/Ogg/File.cs \ TagLib/src/TagLib/Png/Codec.cs \ TagLib/src/TagLib/Png/File.cs \ TagLib/src/TagLib/Png/PngTag.cs \ TagLib/src/TagLib/Flac/Block.cs \ TagLib/src/TagLib/Flac/BlockHeader.cs \ TagLib/src/TagLib/Flac/StreamHeader.cs \ TagLib/src/TagLib/Flac/Picture.cs \ TagLib/src/TagLib/Flac/File.cs \ TagLib/src/TagLib/Gif/Codec.cs \ TagLib/src/TagLib/Gif/File.cs \ TagLib/src/TagLib/Gif/GifCommentTag.cs \ TagLib/src/TagLib/Image/Codec.cs \ TagLib/src/TagLib/Image/CombinedImageTag.cs \ TagLib/src/TagLib/Image/File.cs \ TagLib/src/TagLib/Image/ImageBlockFile.cs \ TagLib/src/TagLib/Image/ImageTag.cs \ TagLib/src/TagLib/Image/ImageOrientation.cs \ TagLib/src/TagLib/Image/NoMetadata/File.cs \ TagLib/src/TagLib/Jpeg/Codec.cs \ TagLib/src/TagLib/Jpeg/File.cs \ TagLib/src/TagLib/Jpeg/JpegCommentTag.cs \ TagLib/src/TagLib/Jpeg/Marker.cs \ TagLib/src/TagLib/Jpeg/Table.cs \ TagLib/src/TagLib/Mpeg/XingHeader.cs \ TagLib/src/TagLib/Mpeg/VBRIHeader.cs \ TagLib/src/TagLib/Mpeg/File.cs \ TagLib/src/TagLib/Mpeg/AudioFile.cs \ TagLib/src/TagLib/Mpeg/AudioHeader.cs \ TagLib/src/TagLib/Mpeg/VideoHeader.cs \ TagLib/src/TagLib/NonContainer/EndTag.cs \ TagLib/src/TagLib/NonContainer/File.cs \ TagLib/src/TagLib/NonContainer/StartTag.cs \ TagLib/src/TagLib/NonContainer/Tag.cs \ TagLib/src/TagLib/Id3v1/Tag.cs \ TagLib/src/TagLib/Id3v1/StringHandler.cs \ TagLib/src/TagLib/Id3v2/Frames/PopularimeterFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/PlayCountFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/PrivateFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/RelativeVolumeFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/UniqueFileIdentifierFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/UnknownFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/CommentsFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/TextIdentificationFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/AttachedPictureFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/GeneralEncapsulatedObjectFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/UnsynchronisedLyricsFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/SynchronizedLyricsFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/MusicCdIdentifierFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/TermsOfUseFrame.cs \ TagLib/src/TagLib/Id3v2/FrameFactory.cs \ TagLib/src/TagLib/Id3v2/Frame.cs \ TagLib/src/TagLib/Id3v2/FrameTypes.cs \ TagLib/src/TagLib/Id3v2/Tag.cs \ TagLib/src/TagLib/Id3v2/FrameHeader.cs \ TagLib/src/TagLib/Id3v2/ExtendedHeader.cs \ TagLib/src/TagLib/Id3v2/SynchData.cs \ TagLib/src/TagLib/Id3v2/Header.cs \ TagLib/src/TagLib/Id3v2/Footer.cs \ TagLib/src/TagLib/IFD/Entries/ByteIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/ByteVectorIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/LongArrayIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/LongIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/MakernoteIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/RationalArrayIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/RationalIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/Rational.cs \ TagLib/src/TagLib/IFD/Entries/SByteIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/ShortArrayIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/ShortIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SLongArrayIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SLongIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SRationalArrayIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SRationalIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SShortArrayIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SShortIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SRational.cs \ TagLib/src/TagLib/IFD/Entries/StringIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/StripOffsetsIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SubIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SubIFDArrayEntry.cs \ TagLib/src/TagLib/IFD/Entries/ThumbnailDataIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/UserCommentIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/UndefinedIFDEntry.cs \ TagLib/src/TagLib/IFD/IFDEntry.cs \ TagLib/src/TagLib/IFD/IFDEntryType.cs \ TagLib/src/TagLib/IFD/IFDTag.cs \ TagLib/src/TagLib/IFD/IFDDirectory.cs \ TagLib/src/TagLib/IFD/IFDStructure.cs \ TagLib/src/TagLib/IFD/IFDReader.cs \ TagLib/src/TagLib/IFD/IFDRenderer.cs \ TagLib/src/TagLib/IFD/Makernotes/Nikon3MakernoteReader.cs \ TagLib/src/TagLib/IFD/Tags/CanonFileInfoEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/CanonMakerNoteEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/CanonPictureInfoEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/ExifEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/GPSEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/IFDEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/IOPEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/PentaxMakerNoteEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/OlympusMakerNoteEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/Nikon3MakerNoteEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/NikonLensData3EntryTag.cs \ TagLib/src/TagLib/IFD/Tags/NikonIsoInfoEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/NikonPreviewMakerNoteEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/NikonPictureControlEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/NikonShotInfoEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/NikonVibrationReductionEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/NikonWorldTimeEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/PanasonicMakerNoteEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/SonyMakerNoteEntryTag.cs \ TagLib/src/TagLib/Mpeg4/AppleTag.cs \ TagLib/src/TagLib/Mpeg4/Box.cs \ TagLib/src/TagLib/Mpeg4/BoxFactory.cs \ TagLib/src/TagLib/Mpeg4/BoxHeader.cs \ TagLib/src/TagLib/Mpeg4/BoxTypes.cs \ TagLib/src/TagLib/Mpeg4/File.cs \ TagLib/src/TagLib/Mpeg4/FileParser.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoFreeSpaceBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/UnknownBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoUserDataBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoChunkOffsetBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoChunkLargeOffsetBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/AppleItemListBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/AppleAnnotationBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoSampleTableBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoSampleEntry.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoAudioSampleEntry.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoVisualSampleEntry.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoMetaBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoSampleDescriptionBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/AppleAdditionalInfoBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoHandlerBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoMovieHeaderBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/FullBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/AppleElementaryStreamDescriptor.cs \ TagLib/src/TagLib/Mpeg4/Boxes/AppleDataBox.cs \ TagLib/src/TagLib/Riff/AviHeaderList.cs \ TagLib/src/TagLib/Riff/AviStream.cs \ TagLib/src/TagLib/Riff/WaveFormatEx.cs \ TagLib/src/TagLib/Riff/BitmapInfoHeader.cs \ TagLib/src/TagLib/Riff/DivXTag.cs \ TagLib/src/TagLib/Riff/File.cs \ TagLib/src/TagLib/Riff/InfoTag.cs \ TagLib/src/TagLib/Riff/List.cs \ TagLib/src/TagLib/Riff/ListTag.cs \ TagLib/src/TagLib/Riff/MovieIdTag.cs \ TagLib/src/TagLib/Tiff/BaseTiffFile.cs \ TagLib/src/TagLib/Tiff/Codec.cs \ TagLib/src/TagLib/Tiff/File.cs \ TagLib/src/TagLib/Tiff/Arw/File.cs \ TagLib/src/TagLib/Tiff/Cr2/File.cs \ TagLib/src/TagLib/Tiff/Dng/File.cs \ TagLib/src/TagLib/Tiff/Nef/File.cs \ TagLib/src/TagLib/Tiff/Pef/File.cs \ TagLib/src/TagLib/Tiff/Rw2/File.cs \ TagLib/src/TagLib/Tiff/Rw2/IFDReader.cs \ TagLib/src/TagLib/Tiff/Rw2/IFDTag.cs \ TagLib/src/TagLib/WavPack/File.cs \ TagLib/src/TagLib/WavPack/StreamHeader.cs \ TagLib/src/TagLib/Xmp/XmlNodeExtensions.cs \ TagLib/src/TagLib/Xmp/XmpTag.cs \ TagLib/src/TagLib/Xmp/XmpNode.cs \ TagLib/src/TagLib/Xmp/XmpNodeType.cs \ TagLib/src/TagLib/Xmp/XmpNodeVisitor.cs \ TagLib/src/TagLib/ICodec.cs \ TagLib/src/TagLib/Tag.cs \ TagLib/src/TagLib/ReadOnlyByteVector.cs \ TagLib/src/TagLib/ByteVector.cs \ TagLib/src/TagLib/ByteVectorList.cs \ TagLib/src/TagLib/CombinedTag.cs \ TagLib/src/TagLib/Genres.cs \ TagLib/src/TagLib/Properties.cs \ TagLib/src/TagLib/File.cs \ TagLib/src/TagLib/StringList.cs \ TagLib/src/TagLib/SupportedMimeType.cs \ TagLib/src/TagLib/UnsupportedFormatException.cs \ TagLib/src/TagLib/Picture.cs \ TagLib/src/TagLib/ListBase.cs \ TagLib/src/TagLib/FileTypes.cs \ TagLib/src/TagLib/CorruptFileException.cs f-spot-0.8.2/lib/TagLib/Makefile.in0000644000175000017500000011200111503407242017207 0ustar00rubenruben00000000000000# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/sources.mk $(top_srcdir)/build/build.environment.mk \ $(top_srcdir)/build/build.mk \ $(top_srcdir)/build/build.rules.mk @ENABLE_TESTS_TRUE@am__append_1 = " $(NUNIT_LIBS)" subdir = lib/TagLib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/m4/shave/shave.m4 \ $(top_srcdir)/build/m4/f-spot/flickrnet.m4 \ $(top_srcdir)/build/m4/f-spot/gnome-keyring-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/gtk-sharp.m4 \ $(top_srcdir)/build/m4/f-spot/libfspot.m4 \ $(top_srcdir)/build/m4/f-spot/mono-addins.m4 \ $(top_srcdir)/build/m4/shamrock/expansions.m4 \ $(top_srcdir)/build/m4/shamrock/gnome-doc.m4 \ $(top_srcdir)/build/m4/shamrock/mono.m4 \ $(top_srcdir)/build/m4/shamrock/nunit.m4 \ $(top_srcdir)/build/m4/shamrock/programs.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_MAKEFLAGS = @AM_MAKEFLAGS@ API_VERSION = @API_VERSION@ AR = @AR@ ASM_VERSION = @ASM_VERSION@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HOST_CPU = @BUILD_HOST_CPU@ BUILD_HOST_OS = @BUILD_HOST_OS@ BUILD_TIME = @BUILD_TIME@ BUILD_VENDOR_ID = @BUILD_VENDOR_ID@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC_DEFINES = @CSC_DEFINES@ CXX = @CXX@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISPLAY_VERSION = @DISPLAY_VERSION@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DOC_USER_FORMATS = @DOC_USER_FORMATS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FGREP = @FGREP@ FLICKRNET_CFLAGS = @FLICKRNET_CFLAGS@ FLICKRNET_LIBS = @FLICKRNET_LIBS@ F_CFLAGS = @F_CFLAGS@ F_LIBS = @F_LIBS@ GAPI2CODEGEN = @GAPI2CODEGEN@ GAPI2FIXUP = @GAPI2FIXUP@ GAPI2PARSER = @GAPI2PARSER@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCONF_SHARP_CFLAGS = @GCONF_SHARP_CFLAGS@ GCONF_SHARP_LIBS = @GCONF_SHARP_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIBSHARP_2_12_7_CFLAGS = @GLIBSHARP_2_12_7_CFLAGS@ GLIBSHARP_2_12_7_LIBS = @GLIBSHARP_2_12_7_LIBS@ GLIBSHARP_CFLAGS = @GLIBSHARP_CFLAGS@ GLIBSHARP_LIBS = @GLIBSHARP_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ GLIB_MKENUMS = @GLIB_MKENUMS@ GMCS_FLAGS = @GMCS_FLAGS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GNOME_DOC_UTILS_CFLAGS = @GNOME_DOC_UTILS_CFLAGS@ GNOME_DOC_UTILS_LIBS = @GNOME_DOC_UTILS_LIBS@ GNOME_ICON_THEME_PREFIX = @GNOME_ICON_THEME_PREFIX@ GNOME_SCREENSAVER_SAVERDIR = @GNOME_SCREENSAVER_SAVERDIR@ GNOME_SCREENSAVER_THEMESDIR = @GNOME_SCREENSAVER_THEMESDIR@ GNOME_SHARP_CFLAGS = @GNOME_SHARP_CFLAGS@ GNOME_SHARP_LIBS = @GNOME_SHARP_LIBS@ GOBJECT_QUERY = @GOBJECT_QUERY@ GREP = @GREP@ GTKSHARP_A11Y_CFLAGS = @GTKSHARP_A11Y_CFLAGS@ GTKSHARP_A11Y_LIBS = @GTKSHARP_A11Y_LIBS@ GTKSHARP_CFLAGS = @GTKSHARP_CFLAGS@ GTKSHARP_LIBS = @GTKSHARP_LIBS@ HELP_DIR = @HELP_DIR@ ICONS_DIRECTORY = @ICONS_DIRECTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ KEYRINGSHARP_CFLAGS = @KEYRINGSHARP_CFLAGS@ KEYRINGSHARP_LIBS = @KEYRINGSHARP_LIBS@ LCMS_CFLAGS = @LCMS_CFLAGS@ LCMS_LIBS = @LCMS_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBJPEG = @LIBJPEG@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEFLAGS = @MAKEFLAGS@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONO = @MONO@ MONO_ADDINS_CFLAGS = @MONO_ADDINS_CFLAGS@ MONO_ADDINS_GUI_CFLAGS = @MONO_ADDINS_GUI_CFLAGS@ MONO_ADDINS_GUI_LIBS = @MONO_ADDINS_GUI_LIBS@ MONO_ADDINS_LIBS = @MONO_ADDINS_LIBS@ MONO_ADDINS_SETUP_CFLAGS = @MONO_ADDINS_SETUP_CFLAGS@ MONO_ADDINS_SETUP_LIBS = @MONO_ADDINS_SETUP_LIBS@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ NUNIT_CFLAGS = @NUNIT_CFLAGS@ NUNIT_LIBS = @NUNIT_LIBS@ OBJC = @OBJC@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OMF_DIR = @OMF_DIR@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ Q = @Q@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TURTLEDIR = @TURTLEDIR@ UNIQUE_CFLAGS = @UNIQUE_CFLAGS@ UNIQUE_LIBS = @UNIQUE_LIBS@ USE_NLS = @USE_NLS@ V = @V@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_bindir = @expanded_bindir@ expanded_datadir = @expanded_datadir@ expanded_libdir = @expanded_libdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ shavedir = @shavedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASSEMBLY = TagLib TARGET = library LINK = $(REF_TAGLIB) $(am__append_1) RESOURCES = # This file is autogenerated, do not edit! SOURCES = \ TagLib/src/TagLib/Aac/AudioHeader.cs \ TagLib/src/TagLib/Aac/BitStream.cs \ TagLib/src/TagLib/Aac/File.cs \ TagLib/src/TagLib/Aiff/File.cs \ TagLib/src/TagLib/Aiff/StreamHeader.cs \ TagLib/src/TagLib/Ape/Tag.cs \ TagLib/src/TagLib/Ape/Item.cs \ TagLib/src/TagLib/Ape/Footer.cs \ TagLib/src/TagLib/Ape/File.cs \ TagLib/src/TagLib/Ape/StreamHeader.cs \ TagLib/src/TagLib/Asf/Guid.cs \ TagLib/src/TagLib/Asf/StreamPropertiesObject.cs \ TagLib/src/TagLib/Asf/UnknownObject.cs \ TagLib/src/TagLib/Asf/Tag.cs \ TagLib/src/TagLib/Asf/Object.cs \ TagLib/src/TagLib/Asf/ExtendedContentDescriptionObject.cs \ TagLib/src/TagLib/Asf/ContentDescriptionObject.cs \ TagLib/src/TagLib/Asf/MetadataLibraryObject.cs \ TagLib/src/TagLib/Asf/HeaderObject.cs \ TagLib/src/TagLib/Asf/HeaderExtensionObject.cs \ TagLib/src/TagLib/Asf/File.cs \ TagLib/src/TagLib/Asf/FilePropertiesObject.cs \ TagLib/src/TagLib/Asf/PaddingObject.cs \ TagLib/src/TagLib/Asf/ContentDescriptor.cs \ TagLib/src/TagLib/Asf/DescriptionRecord.cs \ TagLib/src/TagLib/Mpc/StreamHeader.cs \ TagLib/src/TagLib/Mpc/File.cs \ TagLib/src/TagLib/Ogg/GroupedComment.cs \ TagLib/src/TagLib/Ogg/Bitstream.cs \ TagLib/src/TagLib/Ogg/Paginator.cs \ TagLib/src/TagLib/Ogg/Codec.cs \ TagLib/src/TagLib/Ogg/Codecs/Vorbis.cs \ TagLib/src/TagLib/Ogg/Codecs/Theora.cs \ TagLib/src/TagLib/Ogg/Page.cs \ TagLib/src/TagLib/Ogg/XiphComment.cs \ TagLib/src/TagLib/Ogg/PageHeader.cs \ TagLib/src/TagLib/Ogg/File.cs \ TagLib/src/TagLib/Png/Codec.cs \ TagLib/src/TagLib/Png/File.cs \ TagLib/src/TagLib/Png/PngTag.cs \ TagLib/src/TagLib/Flac/Block.cs \ TagLib/src/TagLib/Flac/BlockHeader.cs \ TagLib/src/TagLib/Flac/StreamHeader.cs \ TagLib/src/TagLib/Flac/Picture.cs \ TagLib/src/TagLib/Flac/File.cs \ TagLib/src/TagLib/Gif/Codec.cs \ TagLib/src/TagLib/Gif/File.cs \ TagLib/src/TagLib/Gif/GifCommentTag.cs \ TagLib/src/TagLib/Image/Codec.cs \ TagLib/src/TagLib/Image/CombinedImageTag.cs \ TagLib/src/TagLib/Image/File.cs \ TagLib/src/TagLib/Image/ImageBlockFile.cs \ TagLib/src/TagLib/Image/ImageTag.cs \ TagLib/src/TagLib/Image/ImageOrientation.cs \ TagLib/src/TagLib/Image/NoMetadata/File.cs \ TagLib/src/TagLib/Jpeg/Codec.cs \ TagLib/src/TagLib/Jpeg/File.cs \ TagLib/src/TagLib/Jpeg/JpegCommentTag.cs \ TagLib/src/TagLib/Jpeg/Marker.cs \ TagLib/src/TagLib/Jpeg/Table.cs \ TagLib/src/TagLib/Mpeg/XingHeader.cs \ TagLib/src/TagLib/Mpeg/VBRIHeader.cs \ TagLib/src/TagLib/Mpeg/File.cs \ TagLib/src/TagLib/Mpeg/AudioFile.cs \ TagLib/src/TagLib/Mpeg/AudioHeader.cs \ TagLib/src/TagLib/Mpeg/VideoHeader.cs \ TagLib/src/TagLib/NonContainer/EndTag.cs \ TagLib/src/TagLib/NonContainer/File.cs \ TagLib/src/TagLib/NonContainer/StartTag.cs \ TagLib/src/TagLib/NonContainer/Tag.cs \ TagLib/src/TagLib/Id3v1/Tag.cs \ TagLib/src/TagLib/Id3v1/StringHandler.cs \ TagLib/src/TagLib/Id3v2/Frames/PopularimeterFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/PlayCountFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/PrivateFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/RelativeVolumeFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/UniqueFileIdentifierFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/UnknownFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/CommentsFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/TextIdentificationFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/AttachedPictureFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/GeneralEncapsulatedObjectFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/UnsynchronisedLyricsFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/SynchronizedLyricsFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/MusicCdIdentifierFrame.cs \ TagLib/src/TagLib/Id3v2/Frames/TermsOfUseFrame.cs \ TagLib/src/TagLib/Id3v2/FrameFactory.cs \ TagLib/src/TagLib/Id3v2/Frame.cs \ TagLib/src/TagLib/Id3v2/FrameTypes.cs \ TagLib/src/TagLib/Id3v2/Tag.cs \ TagLib/src/TagLib/Id3v2/FrameHeader.cs \ TagLib/src/TagLib/Id3v2/ExtendedHeader.cs \ TagLib/src/TagLib/Id3v2/SynchData.cs \ TagLib/src/TagLib/Id3v2/Header.cs \ TagLib/src/TagLib/Id3v2/Footer.cs \ TagLib/src/TagLib/IFD/Entries/ByteIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/ByteVectorIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/LongArrayIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/LongIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/MakernoteIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/RationalArrayIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/RationalIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/Rational.cs \ TagLib/src/TagLib/IFD/Entries/SByteIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/ShortArrayIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/ShortIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SLongArrayIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SLongIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SRationalArrayIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SRationalIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SShortArrayIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SShortIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SRational.cs \ TagLib/src/TagLib/IFD/Entries/StringIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/StripOffsetsIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SubIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/SubIFDArrayEntry.cs \ TagLib/src/TagLib/IFD/Entries/ThumbnailDataIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/UserCommentIFDEntry.cs \ TagLib/src/TagLib/IFD/Entries/UndefinedIFDEntry.cs \ TagLib/src/TagLib/IFD/IFDEntry.cs \ TagLib/src/TagLib/IFD/IFDEntryType.cs \ TagLib/src/TagLib/IFD/IFDTag.cs \ TagLib/src/TagLib/IFD/IFDDirectory.cs \ TagLib/src/TagLib/IFD/IFDStructure.cs \ TagLib/src/TagLib/IFD/IFDReader.cs \ TagLib/src/TagLib/IFD/IFDRenderer.cs \ TagLib/src/TagLib/IFD/Makernotes/Nikon3MakernoteReader.cs \ TagLib/src/TagLib/IFD/Tags/CanonFileInfoEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/CanonMakerNoteEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/CanonPictureInfoEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/ExifEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/GPSEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/IFDEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/IOPEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/PentaxMakerNoteEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/OlympusMakerNoteEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/Nikon3MakerNoteEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/NikonLensData3EntryTag.cs \ TagLib/src/TagLib/IFD/Tags/NikonIsoInfoEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/NikonPreviewMakerNoteEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/NikonPictureControlEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/NikonShotInfoEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/NikonVibrationReductionEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/NikonWorldTimeEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/PanasonicMakerNoteEntryTag.cs \ TagLib/src/TagLib/IFD/Tags/SonyMakerNoteEntryTag.cs \ TagLib/src/TagLib/Mpeg4/AppleTag.cs \ TagLib/src/TagLib/Mpeg4/Box.cs \ TagLib/src/TagLib/Mpeg4/BoxFactory.cs \ TagLib/src/TagLib/Mpeg4/BoxHeader.cs \ TagLib/src/TagLib/Mpeg4/BoxTypes.cs \ TagLib/src/TagLib/Mpeg4/File.cs \ TagLib/src/TagLib/Mpeg4/FileParser.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoFreeSpaceBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/UnknownBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoUserDataBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoChunkOffsetBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoChunkLargeOffsetBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/AppleItemListBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/AppleAnnotationBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoSampleTableBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoSampleEntry.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoAudioSampleEntry.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoVisualSampleEntry.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoMetaBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoSampleDescriptionBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/AppleAdditionalInfoBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoHandlerBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/IsoMovieHeaderBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/FullBox.cs \ TagLib/src/TagLib/Mpeg4/Boxes/AppleElementaryStreamDescriptor.cs \ TagLib/src/TagLib/Mpeg4/Boxes/AppleDataBox.cs \ TagLib/src/TagLib/Riff/AviHeaderList.cs \ TagLib/src/TagLib/Riff/AviStream.cs \ TagLib/src/TagLib/Riff/WaveFormatEx.cs \ TagLib/src/TagLib/Riff/BitmapInfoHeader.cs \ TagLib/src/TagLib/Riff/DivXTag.cs \ TagLib/src/TagLib/Riff/File.cs \ TagLib/src/TagLib/Riff/InfoTag.cs \ TagLib/src/TagLib/Riff/List.cs \ TagLib/src/TagLib/Riff/ListTag.cs \ TagLib/src/TagLib/Riff/MovieIdTag.cs \ TagLib/src/TagLib/Tiff/BaseTiffFile.cs \ TagLib/src/TagLib/Tiff/Codec.cs \ TagLib/src/TagLib/Tiff/File.cs \ TagLib/src/TagLib/Tiff/Arw/File.cs \ TagLib/src/TagLib/Tiff/Cr2/File.cs \ TagLib/src/TagLib/Tiff/Dng/File.cs \ TagLib/src/TagLib/Tiff/Nef/File.cs \ TagLib/src/TagLib/Tiff/Pef/File.cs \ TagLib/src/TagLib/Tiff/Rw2/File.cs \ TagLib/src/TagLib/Tiff/Rw2/IFDReader.cs \ TagLib/src/TagLib/Tiff/Rw2/IFDTag.cs \ TagLib/src/TagLib/WavPack/File.cs \ TagLib/src/TagLib/WavPack/StreamHeader.cs \ TagLib/src/TagLib/Xmp/XmlNodeExtensions.cs \ TagLib/src/TagLib/Xmp/XmpTag.cs \ TagLib/src/TagLib/Xmp/XmpNode.cs \ TagLib/src/TagLib/Xmp/XmpNodeType.cs \ TagLib/src/TagLib/Xmp/XmpNodeVisitor.cs \ TagLib/src/TagLib/ICodec.cs \ TagLib/src/TagLib/Tag.cs \ TagLib/src/TagLib/ReadOnlyByteVector.cs \ TagLib/src/TagLib/ByteVector.cs \ TagLib/src/TagLib/ByteVectorList.cs \ TagLib/src/TagLib/CombinedTag.cs \ TagLib/src/TagLib/Genres.cs \ TagLib/src/TagLib/Properties.cs \ TagLib/src/TagLib/File.cs \ TagLib/src/TagLib/StringList.cs \ TagLib/src/TagLib/SupportedMimeType.cs \ TagLib/src/TagLib/UnsupportedFormatException.cs \ TagLib/src/TagLib/Picture.cs \ TagLib/src/TagLib/ListBase.cs \ TagLib/src/TagLib/FileTypes.cs \ TagLib/src/TagLib/CorruptFileException.cs # Initializers MONO_BASE_PATH = MONO_ADDINS_PATH = # Install Paths DEFAULT_INSTALL_DIR = $(pkglibdir) BACKENDS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Backends EXTENSIONS_INSTALL_DIR = $(DEFAULT_INSTALL_DIR)/Extensions DIR_DOCS = $(top_builddir)/docs DIR_EXTENSIONS = $(top_builddir)/extensions DIR_ICONS = $(top_builddir)/icons DIR_LIBFSPOT = $(top_builddir)/lib/libfspot DIR_SRC = $(top_builddir)/src DIR_GIOSHARP = $(top_builddir)/lib/gio-sharp/gio DIR_GTKSHARPBEANS = $(top_builddir)/lib/gtk-sharp-beans DIR_UNIQUESHARP = $(top_builddir)/lib/unique-sharp/unique DIR_TAGLIB = $(top_builddir)/lib/TagLib DIR_BIN = $(top_builddir)/bin # External libraries to link against, generated from configure LINK_SYSTEM = -r:System LINK_SYSTEMDATA = -r:System.Data LINK_SYSTEM_WEB = -r:System.Web LINK_MONO_POSIX = -r:Mono.Posix LINK_MONO_CAIRO = -r:Mono.Cairo LINK_MONO_SIMD = -r:Mono.Simd LINK_ICSHARP_ZIP_LIB = -r:ICSharpCode.SharpZipLib LINK_KEYRING = $(KEYRINGSHARP_LIBS) LINK_GLIB = $(GLIBSHARP_LIBS) LINK_GTK = $(GTKSHARP_LIBS) LINK_GNOME = $(GNOME_SHARP_LIBS) LINK_GCONF = $(GCONF_SHARP_LIBS) LINK_FLICKRNET = -pkg:flickrnet LINK_DBUS = $(NDESK_DBUS_LIBS) $(NDESK_DBUS_GLIB_LIBS) LINK_DBUS_NO_GLIB = $(NDESK_DBUS_LIBS) LINK_MONO_ADDINS_DEPS = $(MONO_ADDINS_LIBS) LINK_MONO_ADDINS_SETUP_DEPS = $(MONO_ADDINS_SETUP_LIBS) LINK_MONO_ADDINS_GUI_DEPS = $(MONO_ADDINS_GUI_LIBS) # GIO REF_GIO = LINK_GIO = -r:$(DIR_GIOSHARP)/gio-sharp.dll LINK_GIO_DEPS = $(REF_GIO) $(LINK_GIO) # Gtk Beans REF_GTK_BEANS = $(LINK_GIO_DEPS) LINK_GTK_BEANS = -r:$(DIR_GTKSHARPBEANS)/gtk-sharp-beans.dll LINK_GTK_BEANS_DEPS = $(REF_GTK_BEANS) $(LINK_GTK_BEANS) # Uniqe REF_UNIQUE = LINK_UNIQUE = -r:$(DIR_UNIQUESHARP)/unique-sharp.dll LINK_UNIQUE_DEPS = $(REF_UNIQUE) $(LINK_UNIQUE) # Hyena REF_HYENA = $(LINK_SYSTEM) $(LINK_MONO_POSIX) LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA) # TagLib REF_TAGLIB = LINK_TAGLIB = -r:$(DIR_BIN)/TagLib.dll LINK_TAGLIB_DEPS = $(REF_TAGLIB) $(LINK_TAGLIB) # Hyena.Data.Sqlite REF_HYENA_DATA_SQLITE = $(LINK_SQLITE) LINK_HYENA_DATA_SQLITE = -r:$(DIR_BIN)/Hyena.Data.Sqlite.dll LINK_HYENA_DATA_SQLITE_DEPS = $(REF_HYENA_DATA_SQLITE) $(LINK_HYENA_DATA_SQLITE) # Hyena.Gui REF_HYENA_GUI = $(LINK_HYENA_DEPS) LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI) # FSpot.Cms REF_FSPOT_CMS = $(LINK_GTK) LINK_FSPOT_CMS = -r:$(DIR_BIN)/FSpot.Cms.dll LINK_FSPOT_CMS_DEPS = $(REF_FSPOT_CMS) $(LINK_FSPOT_CMS) # FSpot.Utils REF_FSPOT_UTILS = $(LINK_HYENA_DEPS) $(LINK_GTK) $(LINK_GIO) $(LINK_MONO_CAIRO) $(LINK_TAGLIB) LINK_FSPOT_UTILS = -r:$(DIR_BIN)/FSpot.Utils.dll LINK_FSPOT_UTILS_DEPS = $(REF_FSPOT_UTILS) $(LINK_FSPOT_UTILS) # FSpot.Core REF_FSPOT_CORE = $(LINK_FSPOT_UTILS_DEPS) $(LINK_FSPOT_CMS_DEPS) $(LINK_HYENA_DATA_SQLITE_DEPS) LINK_FSPOT_CORE = -r:$(DIR_BIN)/FSpot.Core.dll LINK_FSPOT_CORE_DEPS = $(REF_FSPOT_CORE) $(LINK_FSPOT_CORE) # FSpot.Query REF_FSPOT_QUERY = $(LINK_FSPOT_CORE_DEPS) LINK_FSPOT_QUERY = -r:$(DIR_BIN)/FSpot.Query.dll LINK_FSPOT_QUERY_DEPS = $(REF_FSPOT_QUERY) $(LINK_FSPOT_QUERY) # FSpot.Database REF_FSPOT_DATABASE = $(LINK_HYENA_DATA_SQLITE_DEPS) $(LINK_FSPOT_CORE_DEPS) $(LINK_SYSTEMDATA) $(LINK_FSPOT_QUERY_DEPS) LINK_FSPOT_DATABASE_DEPS = $(REF_FSPOT_DATABASE) # FSpot.JobScheduler REF_FSPOT_JOB_SCHEDULER = $(LINK_HYENA_DEPS) LINK_FSPOT_JOB_SCHEDULER = -r:$(DIR_BIN)/FSpot.JobScheduler.dll LINK_FSPOT_JOB_SCHEDULER_DEPS = $(REF_FSPOT_JOB_SCHEDULER) $(LINK_FSPOT_JOB_SCHEDULER) # FSpot.Bling REF_FSPOT_BLING = $(LINK_GTK_BEANS_DEPS) $(LINK_GLIB) LINK_FSPOT_BLING = -r:$(DIR_BIN)/FSpot.Bling.dll LINK_FSPOT_BLING_DEPS = $(REF_FSPOT_BLING) $(LINK_FSPOT_BLING) # FSpot.Platform REF_FSPOT_PLATFORM = $(LINK_GCONF) $(LINK_GTK) $(LINK_FSPOT_CORE_DEPS) $(LINK_DBUS) LINK_FSPOT_PLATFORM = -r:$(DIR_BIN)/FSpot.Platform.dll LINK_FSPOT_PLATFORM_DEPS = $(REF_FSPOT_PLATFORM) $(LINK_FSPOT_PLATFORM) # FSpot.Gui REF_FSPOT_GUI = $(LINK_FSPOT_CORE_DEPS) $(LINK_FSPOT_BLING_DEPS) $(LINK_HYENA_GUI_DEPS) LINK_FSPOT_GUI = -r:$(DIR_BIN)/FSpot.Gui.dll LINK_FSPOT_GUI_DEPS = $(REF_FSPOT_GUI) $(LINK_FSPOT_GUI) $(LINK_HENA_GUI_DEPS) # FSpot (executable) REF_FSPOT = $(LINK_FSPOT_GUI_DEPS) $(LINK_FSPOT_PLATFORM_DEPS) $(LINK_FSPOT_QUERY_DEPS) \ $(LINK_GLIB) $(LINK_MONO_ADDINS_DEPS) $(LINK_UNIQUE_DEPS) $(LINK_MONO_ADDINS_SETUP_DEPS) \ $(LINK_MONODATA) \ $(LINK_MONO_ADDINS_GUI_DEPS) $(LINK_FSPOT_JOB_SCHEDULER_DEPS) $(LINK_ICSHARP_ZIP_LIB) \ $(LINK_GNOME) $(LINK_HYENA_GUI_DEPS) $(LINK_TAGLIB) $(LINK_FSPOT_DATABASE_DEPS) # FIXME: do not link executables LINK_FSPOT = -r:$(DIR_BIN)/f-spot.exe LINK_FSPOT_DEPS = $(REF_FSPOT) $(LINK_FSPOT) # Extensions REF_FSPOT_EXTENSION_BLACKOUTEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_BWEDITOR = $(LINK_FSPOT_DEPS) $(LINK_MONO_SIMD) REF_FSPOT_EXTENSION_FLIPEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_PIXELATEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RESIZEEDITOR = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CDEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_FACEBOOKEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) REF_FSPOT_EXTENSION_FLICKREXPORT = $(LINK_FSPOT_DEPS) $(LINK_FLICKRNET) REF_FSPOT_EXTENSION_FOLDEREXPORT = $(LINK_FSPOT_DEPS) $(LINK_SYSTEM_WEB) REF_FSPOT_EXTENSION_GALLERYEXPORT = $(LINK_FSPOT_DEPS) REF_MONO_GOOGLE = $(LINK_HYENA_DEPS) LINK_MONO_GOOGLE = -r:$(DIR_BIN)/Mono.Google.dll LINK_MONO_GOOGLE_DEPS = $(REF_MONO_GOOGLE) $(LINK_MONO_GOOGLE) REF_FSPOT_EXTENSION_PICASAWEBEXPORT = $(LINK_FSPOT_DEPS) $(LINK_MONO_GOOGLE) $(LINK_KEYRING) REF_SMUGMUGNET = $(LINK_HYENA_DEPS) LINK_SMUGMUGNET = -r:$(DIR_BIN)/SmugMugNet.dll LINK_SMUGMUGNET_DEPS = $(REF_SMUGMUGNET) $(LINK_SMUGMUGNET) REF_FSPOT_EXTENSION_SMUGMUGEXPORT = $(LINK_SMUGMUGNET_DEPS) $(LINK_KEYRING) $(LINK_FSPOT_DEPS) REF_MONO_TABBLO = $(LINK_HYENA_DEPS) LINK_MONO_TABBLO = -r:$(DIR_BIN)/Mono.Tabblo.dll LINK_MONO_TABBLO_DEPS = $(REF_MONO_TABBLO) $(LINK_MONO_TABBLO) REF_FSPOT_EXTENSION_TABBLOEXPORT = $(LINK_FSPOT_DEPS) $(LINK_KEYRING) $(LINK_MONO_TABBLO_DEPS) REF_FSPOT_EXTENSION_ZIPEXPORT = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_CHANGEPHOTOPATH = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_DEVELOPINUFRAW = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_LIVEWEBGALLERY = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_MERGEDB = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RAWPLUSJPEG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_RETROACTIVEROLL = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_SCREENSAVERCONFIG = $(LINK_FSPOT_DEPS) REF_FSPOT_EXTENSION_COVERTRANSITION = $(LINK_FSPOT_DEPS) # Cute hack to replace a space with something colon := : empty := space := $(empty) $(empty) # Build path to allow running uninstalled RUN_PATH = $(subst $(space),$(colon), $(MONO_BASE_PATH)) UNIQUE_FILTER_PIPE = tr [:space:] \\n | sort | uniq BUILD_DATA_DIR = $(top_builddir)/bin/share/$(PACKAGE) # Since all other attempts failed, we currently go this way: # This code adds the file specified in ASSEMBLY_INFO_SOURCE to SOURCES_BUILD. # If no such file is specified, the default AssemblyInfo.cs is used. ASSEMBLY_INFO_SOURCE_REAL = \ $(shell if [ "$(ASSEMBLY_INFO_SOURCE)" ]; \ then \ echo "$(addprefix $(srcdir)/, $(ASSEMBLY_INFO_SOURCE))"; \ else \ echo "$(top_srcdir)/src/AssemblyInfo.cs"; \ fi) SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) \ $(ASSEMBLY_INFO_SOURCE_REAL) RESOURCES_EXPANDED = $(addprefix $(srcdir)/, $(RESOURCES)) RESOURCES_BUILD = $(foreach resource, $(RESOURCES_EXPANDED), \ -resource:$(resource),$(notdir $(resource))) INSTALL_ICONS = $(top_srcdir)/build/private-icon-theme-installer "$(mkinstalldirs)" "$(INSTALL_DATA)" THEME_ICONS_SOURCE = $(wildcard $(srcdir)/ThemeIcons/*/*/*.png) $(wildcard $(srcdir)/ThemeIcons/scalable/*/*.svg) THEME_ICONS_RELATIVE = $(subst $(srcdir)/ThemeIcons/, , $(THEME_ICONS_SOURCE)) ASSEMBLY_EXTENSION = $(strip $(patsubst library, dll, $(TARGET))) ASSEMBLY_FILE = $(top_builddir)/bin/$(ASSEMBLY).$(ASSEMBLY_EXTENSION) INSTALL_DIR_RESOLVED = $(firstword $(subst , $(DEFAULT_INSTALL_DIR), $(INSTALL_DIR))) @ENABLE_TESTS_TRUE@ENABLE_TESTS_FLAG = "-define:ENABLE_TESTS" @ENABLE_ATK_TRUE@ENABLE_ATK_FLAG = "-define:ENABLE_ATK" FILTERED_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE)) DEP_LINK = $(shell echo "$(LINK)" | $(UNIQUE_FILTER_PIPE) | sed s,-r:,,g | grep '$(top_builddir)/bin/') OUTPUT_FILES = \ $(ASSEMBLY_FILE) \ $(ASSEMBLY_FILE).mdb moduledir = $(INSTALL_DIR_RESOLVED) module_SCRIPTS = $(OUTPUT_FILES) EXTRA_DIST = $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(THEME_ICONS_SOURCE) CLEANFILES = $(OUTPUT_FILES) $(ASSEMBLY_FILE).config DISTCLEANFILES = *.pidb MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/sources.mk $(top_srcdir)/build/build.mk $(top_srcdir)/build/build.environment.mk $(top_srcdir)/build/build.rules.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/TagLib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/TagLib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-moduleSCRIPTS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local uninstall-moduleSCRIPTS all-local: theme-icons run: @pushd $(top_builddir); \ make run; \ popd; # uncommented for now. # tests are currently excuted from Makefile in $(top_builddir) #test: # @pushd $(top_builddir)/tests; \ # make $(ASSEMBLY); \ # popd; build-debug: @echo $(DEP_LINK) $(ASSEMBLY_FILE).mdb: $(ASSEMBLY_FILE) $(ASSEMBLY_FILE): $(SOURCES_BUILD) $(RESOURCES_EXPANDED) $(DEP_LINK) @mkdir -p $(top_builddir)/bin @if [ ! "x$(ENABLE_RELEASE)" = "xyes" ]; then \ $(top_srcdir)/build/dll-map-makefile-verifier $(srcdir)/Makefile.am $(srcdir)/$(notdir $@.config) && \ $(MONO) $(top_builddir)/build/dll-map-verifier.exe $(srcdir)/$(notdir $@.config) -iwinmm -ilibbanshee -ilibbnpx11 -ilibc -ilibc.so.6 -iintl -ilibmtp.dll -ilibigemacintegration.dylib -iCFRelease $(SOURCES_BUILD); \ fi; $(MCS) \ $(GMCS_FLAGS) \ $(ASSEMBLY_BUILD_FLAGS) \ -nowarn:0278 -nowarn:0078 $$warn \ -define:HAVE_GTK_2_10 -define:NET_2_0 \ -debug -target:$(TARGET) -out:$@ \ $(BUILD_DEFINES) $(CSC_DEFINES) $(ENABLE_TESTS_FLAG) $(ENABLE_ATK_FLAG) \ $(FILTERED_LINK) $(RESOURCES_BUILD) $(SOURCES_BUILD) @if [ -e $(srcdir)/$(notdir $@.config) ]; then \ cp $(srcdir)/$(notdir $@.config) $(top_builddir)/bin; \ fi; @if [ ! -z "$(EXTRA_BUNDLE)" ]; then \ cp $(EXTRA_BUNDLE) $(top_builddir)/bin; \ fi; theme-icons: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -il "$(BUILD_DATA_DIR)" "$(srcdir)" $(THEME_ICONS_RELATIVE) install-data-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -i "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) uninstall-local: $(THEME_ICONS_SOURCE) @$(INSTALL_ICONS) -u "$(DESTDIR)$(pkgdatadir)" "$(srcdir)" $(THEME_ICONS_RELATIVE) ### The stuff below takes care of embedding libraries. Build system hacks! ### update-taglib: echo "# This file is autogenerated, do not edit!" > sources.mk echo "SOURCES = \\" >> sources.mk tail -n+2 TagLib/src/TagLib/TagLib.sources | sed s/\$$\(srcdir\)\\//TagLib\\/src\\// >> sources.mk .PHONY: update-taglib # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: f-spot-0.8.2/lib/TagLib/Makefile.am0000644000175000017500000000070411417267636017223 0ustar00rubenruben00000000000000ASSEMBLY = TagLib TARGET = library LINK = $(REF_TAGLIB) RESOURCES = include $(srcdir)/sources.mk include $(top_srcdir)/build/build.mk ### The stuff below takes care of embedding libraries. Build system hacks! ### update-taglib: echo "# This file is autogenerated, do not edit!" > sources.mk echo "SOURCES = \\" >> sources.mk tail -n+2 TagLib/src/TagLib/TagLib.sources | sed s/\$$\(srcdir\)\\//TagLib\\/src\\// >> sources.mk .PHONY: update-taglib f-spot-0.8.2/lib/TagLib/TagLib/0000777000175000017500000000000011503407416016320 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/0000777000175000017500000000000011503407416017107 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/0000777000175000017500000000000011503407423020247 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Aac/0000777000175000017500000000000011503407416020735 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Aac/File.cs0000644000175000017500000002202011462100402022120 0ustar00rubenruben00000000000000// // File.cs: Provides tagging and properties support for ADTS AAC files // // Here is the ADTS Header description used for implementation: // http://www.hydrogenaudio.org/forums/lofiversion/index.php/t21617.html // // Copyright (C) 2009 Patrick Dehne // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using System.Text; namespace TagLib.Aac { /// /// This class extends to /// provide tagging and properties support for ADTS AAC audio files. /// /// /// A and will be added automatically to any /// file that doesn't contain one. This change does not effect the /// file until it is saved and can be reversed using the following /// method: /// file.RemoveTags (file.TagTypes & ~file.TagTypesOnDisk); /// [SupportedMimeType("taglib/aac", "aac")] [SupportedMimeType("audio/aac")] public class File : TagLib.NonContainer.File { #region Private Fields /// /// Contains the first audio header. /// private AudioHeader first_header; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local /// file system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : base (path, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local /// file system with an average read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : base (path) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified file abstraction with /// an average read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// public File (File.IFileAbstraction abstraction) : base (abstraction) { } #endregion #region Public Methods /// /// Gets a tag of a specified type from the current instance, /// optionally creating a new tag if possible. /// /// /// A value indicating the /// type of tag to read. /// /// /// A value specifying whether or not to /// try and create the tag if one is not found. /// /// /// A object containing the tag that was /// found in or added to the current instance. If no /// matching tag was found and none was created, is returned. /// /// /// If a is added to the /// current instance, it will be placed at the start of the /// file. On the other hand, /// will be added to the end of /// the file. All other tag types will be ignored. /// public override TagLib.Tag GetTag (TagTypes type, bool create) { Tag t = (Tag as TagLib.NonContainer.Tag).GetTag (type); if (t != null || !create) return t; switch (type) { case TagTypes.Id3v1: return EndTag.AddTag (type, Tag); case TagTypes.Id3v2: return StartTag.AddTag (type, Tag); case TagTypes.Ape: return EndTag.AddTag (type, Tag); default: return null; } } #endregion #region Protected Methods /// /// Reads format specific information at the start of the /// file. /// /// /// A value containing the seek position /// at which the tags end and the media data begins. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// This method only searches for an audio header in the /// first 16384 bytes of code to avoid searching forever in /// corrupt files. /// protected override void ReadStart (long start, ReadStyle propertiesStyle) { // Only check the first 16 bytes so we're not stuck // reading a bad file forever. if (propertiesStyle != ReadStyle.None && !AudioHeader.Find (out first_header, this, start, 0x4000)) throw new CorruptFileException ( "ADTS audio header not found."); } /// /// Reads format specific information at the end of the /// file. /// /// /// A value containing the seek position /// at which the media data ends and the tags begin. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// protected override void ReadEnd (long end, ReadStyle propertiesStyle) { // Make sure we have ID3v1 and ID3v2 tags. GetTag (TagTypes.Id3v1, true); GetTag (TagTypes.Id3v2, true); } /// /// Reads the audio properties from the file represented by /// the current instance. /// /// /// A value containing the seek position /// at which the tags end and the media data begins. /// /// /// A value containing the seek position /// at which the media data ends and the tags begin. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// A object describing the /// media properties of the file represented by the current /// instance. /// protected override Properties ReadProperties (long start, long end, ReadStyle propertiesStyle) { first_header.SetStreamLength (end - start); return new Properties (TimeSpan.Zero, first_header); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Aac/BitStream.cs0000644000175000017500000000524611470571657023175 0ustar00rubenruben00000000000000// // BitStream.cs: Helper to read bits from a byte array. // // Copyright (C) 2009 Patrick Dehne // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using System.Text; using System.Collections; using System.Diagnostics; namespace TagLib.Aac { /// /// This class is used to help reading arbitary number of bits from /// a fixed array of bytes /// public class BitStream { #region Private Fields private BitArray bits; private int bitindex; #endregion #region Constructors /// /// Construct a new . /// /// /// A , must be 7 bytes long. /// public BitStream(byte[] buffer) { Debug.Assert(buffer.Length == 7, "buffer.Length == 7", "buffer size invalid"); if (buffer.Length != 7) throw new ArgumentException("Buffer size must be 7 bytes"); // Reverse bits bits = new BitArray(buffer.Length * 8); for (int i = 0; i < buffer.Length; i++) { for (int y = 0; y < 8; y++) { bits[i * 8 + y] = ((buffer[i] & (1 << (7 - y))) > 0); } } bitindex = 0; } #endregion #region Public Methods /// /// Reads an Int32 from the bitstream /// /// /// A value containing the number /// of bits to read from the bitstream /// public int ReadInt32(int numberOfBits) { Debug.Assert(numberOfBits > 0, "numberOfBits < 1"); Debug.Assert(numberOfBits <= 32, "numberOfBits <= 32"); if (numberOfBits <= 0) throw new ArgumentException("Number of bits to read must be >= 1"); if (numberOfBits > 32) throw new ArgumentException("Number of bits to read must be <= 32"); int value = 0; int start = bitindex + numberOfBits - 1; for (int i = 0; i < numberOfBits; i++) { value += bits[start] ? (1 << i) : 0; bitindex++; start--; } return value; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Aac/AudioHeader.cs0000644000175000017500000002624311470571657023455 0ustar00rubenruben00000000000000// // AudioHeader.cs: Provides information about an ADTS AAC audio stream. // // Copyright (C) 2009 Patrick Dehne // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Aac { /// /// This structure implements and provides /// information about an ADTS AAC audio stream. /// public class AudioHeader : IAudioCodec { #region Private Static Value Arrays /// /// Contains a sample rate table for ADTS AAC audio. /// private static readonly int[] sample_rates = new int[13] { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350 }; /// /// Contains a channel table for ADTS AAC audio. /// private static readonly int[] channels = new int[8] { 0, 1, 2, 3, 4, 5, 6, 8 }; #endregion #region Private Properties /// /// Contains the audio stream length. /// private long stream_length; /// /// Contains the audio stream duration. /// private TimeSpan duration; /// /// Contains the number of channels in the audio /// private int audiochannels; /// /// Contains the bitrate of the audio stream /// private int audiobitrate; /// /// Contains the samplerate of the audio stream /// private int audiosamplerate; #endregion #region Public Fields /// /// An empty and unset header. /// public static readonly AudioHeader Unknown = new AudioHeader(); #endregion #region Constructors /// /// Constructs and initializes a new empty instance of /// private AudioHeader() { this.stream_length = 0; this.duration = TimeSpan.Zero; this.audiochannels = 0; this.audiobitrate = 0; this.audiosamplerate = 0; } /// /// Constructs and initializes a new instance of by populating it with specified /// values. /// /// /// A value indicating the number /// of channels in the audio stream /// /// /// A value indicating the bitrate /// of the audio stream /// /// /// A value indicating the samplerate /// of the audio stream /// /// /// A value indicating the number /// of samples in the audio stream /// /// /// A value indicating the number /// of frames in the audio stream /// private AudioHeader(int channels, int bitrate, int samplerate, int numberofsamples, int numberofframes) { this.duration = TimeSpan.Zero; this.stream_length = 0; this.audiochannels = channels; this.audiobitrate = bitrate; this.audiosamplerate = samplerate; } #endregion #region Public Properties /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public string Description { get { return "ADTS AAC"; } } /// /// Gets the types of media represented by the current /// instance. /// /// /// Always . /// public MediaTypes MediaTypes { get { return MediaTypes.Audio; } } /// /// Gets the duration of the media represented by the current /// instance. /// /// /// A containing the duration of the /// media represented by the current instance. /// /// /// If has not been called, this /// value will not be correct. /// public TimeSpan Duration { get { return duration; } } /// /// Gets the bitrate of the audio represented by the current /// instance. /// /// /// A value containing a bitrate of the /// audio represented by the current instance. /// public int AudioBitrate { get { return audiobitrate; } } /// /// Gets the sample rate of the audio represented by the /// current instance. /// /// /// A value containing the sample rate of /// the audio represented by the current instance. /// public int AudioSampleRate { get { return audiosamplerate; } } /// /// Gets the number of channels in the audio represented by /// the current instance. /// /// /// A value containing the number of /// channels in the audio represented by the current /// instance. /// public int AudioChannels { get { return audiochannels; } } #endregion #region Public Methods /// /// Sets the length of the audio stream represented by the /// current instance. /// /// /// A value specifying the length in /// bytes of the audio stream represented by the current /// instance. /// /// /// The this value has been set, will /// return an incorrect value. /// public void SetStreamLength(long streamLength) { this.stream_length = streamLength; duration = TimeSpan.FromSeconds(((double)this.stream_length) * 8.0 / ((double)this.audiobitrate)); } #endregion #region Public Static Methods /// /// Searches for an audio header in a starting at a specified position and searching through /// a specified number of bytes. /// /// /// A object in which the found /// header will be stored. /// /// /// A object to search. /// /// /// A value specifying the seek position /// in at which to start searching. /// /// /// A value specifying the maximum number /// of bytes to search before aborting. /// /// /// A value indicating whether or not a /// header was found. /// /// /// is . /// public static bool Find(out AudioHeader header, TagLib.File file, long position, int length) { if (file == null) throw new ArgumentNullException("file"); long end = position + length; header = AudioHeader.Unknown; file.Seek(position); ByteVector buffer = file.ReadBlock(3); if (buffer.Count < 3) return false; do { file.Seek(position + 3); buffer = buffer.Mid(buffer.Count - 3); buffer.Add(file.ReadBlock( (int)File.BufferSize)); for (int i = 0; i < buffer.Count - 3 && (length < 0 || position + i < end); i++) if (buffer[i] == 0xFF && buffer[i+1] >= 0xF0) // 0xFFF try { BitStream bits = new BitStream(buffer.Mid(i, 7).Data); // 12 bits sync header bits.ReadInt32(12); // 1 bit mpeg 2/4 bits.ReadInt32(1); // 2 bits layer bits.ReadInt32(2); // 1 bit protection absent bits.ReadInt32(1); // 2 bits profile object type bits.ReadInt32(2); // 4 bits sampling frequency index int samplerateindex = bits.ReadInt32(4); if(samplerateindex >= sample_rates.Length) return false; long samplerate = sample_rates[samplerateindex]; // 1 bit private bit bits.ReadInt32(1); // 3 bits channel configuration int channelconfigindex = bits.ReadInt32(3); if (channelconfigindex >= channels.Length) return false; // 4 copyright bits bits.ReadInt32(4); // 13 bits frame length long framelength = bits.ReadInt32(13); // double check framelength if (framelength < 7) return false; // 11 bits buffer fullness bits.ReadInt32(11); // 2 bits number of raw data blocks in frame int numberofframes = bits.ReadInt32(2) + 1; long numberofsamples = numberofframes * 1024; long bitrate = framelength * 8 * samplerate / numberofsamples; header = new AudioHeader(channels[channelconfigindex], (int)bitrate, (int)samplerate, (int)numberofsamples, numberofframes); return true; } catch (CorruptFileException) { } position += File.BufferSize; } while (buffer.Count > 3 && (length < 0 || position < end)); return false; } /// /// Searches for an audio header in a starting at a specified position and searching to the /// end of the file. /// /// /// A object in which the found /// header will be stored. /// /// /// A object to search. /// /// /// A value specifying the seek position /// in at which to start searching. /// /// /// A value indicating whether or not a /// header was found. /// /// /// Searching to the end of the file can be very, very slow /// especially for corrupt or non-MPEG files. It is /// recommended to use /// instead. /// public static bool Find(out AudioHeader header, TagLib.File file, long position) { return Find(out header, file, position, -1); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/NonContainer/0000777000175000017500000000000011503407420022641 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/NonContainer/StartTag.cs0000644000175000017500000002247611462100402024722 0ustar00rubenruben00000000000000// // StartTag.cs: Provides support for accessing and modifying a collection of // tags appearing at the start of a file. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace TagLib.NonContainer { /// /// This class extends , providing support /// for accessing and modifying a collection of tags appearing at the /// start of a file. /// /// /// This class is used by to read all the tags appearing at the start of the file but /// could be used by other classes. It currently supports ID3v2 /// and APE tags. /// public class StartTag : CombinedTag { #region Private Fields /// /// Contains the file to operate on. /// private TagLib.File file; /// /// Contains the number of bytes that must be read to /// hold all applicable indicators. /// int read_size = (int) Math.Max (TagLib.Ape.Footer.Size, TagLib.Id3v2.Header.Size); #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified . /// /// /// A object on which the new /// instance will perform its operations. /// /// /// Constructing a new instance does not automatically read /// the contents from the disk. must be /// called to read the tags. /// public StartTag (TagLib.File file) : base () { this.file = file; } #endregion #region Public Properties /// /// Gets the total size of the tags located at the end of the /// file by reading from the file. /// public long TotalSize { get { long size = 0; while (ReadTagInfo (ref size) != TagTypes.None) ; return size; } } #endregion #region Public Methods /// /// Reads the tags stored at the start of the file into the /// current instance. /// /// /// A value indicating the seek position /// in the file at which the read tags end. This also /// marks the seek position at which the media begins. /// public long Read () { TagLib.Tag tag; ClearTags (); long end = 0; while ((tag = ReadTag (ref end)) != null) AddTag (tag); return end; } /// /// Renders the tags contained in the current instance. /// /// /// A object containing the /// physical representation of the tags stored in the current /// instance. /// /// /// The tags are rendered in the order that they are stored /// in the current instance. /// public ByteVector Render () { ByteVector data = new ByteVector (); foreach (TagLib.Tag t in Tags) { if (t is TagLib.Ape.Tag) data.Add ((t as TagLib.Ape.Tag).Render ()); else if (t is TagLib.Id3v2.Tag) data.Add ((t as TagLib.Id3v2.Tag).Render ()); } return data; } /// /// Writes the tags contained in the current instance to the /// beginning of the file that created it, overwriting the /// existing tags. /// /// /// A value indicating the seek position /// in the file at which the written tags end. This also /// marks the seek position at which the media begins. /// public long Write () { ByteVector data = Render (); file.Insert (data, 0, TotalSize); return data.Count; } /// /// Removes a set of tag types from the current instance. /// /// /// A bitwise combined value /// containing tag types to be removed from the file. /// /// /// In order to remove all tags from a file, pass as . /// public void RemoveTags (TagTypes types) { for (int i = Tags.Length - 1; i >= 0; i--) { var tag = Tags[i]; if (types == TagTypes.AllTags || (tag.TagTypes & types) == tag.TagTypes) { RemoveTag (tag); } } } /// /// Adds a tag of a specified type to the current instance, /// optionally copying values from an existing type. /// /// /// A value specifying the type of /// tag to add to the current instance. At the time of this /// writing, this is limited to /// and . /// /// /// A to copy values from using /// , or if no tag is to be copied. /// /// /// The object added to the current /// instance, or if it couldn't be /// created. /// /// /// ID3v2 tags are added at the end of the current instance, /// while other tags are added to the beginning. /// public TagLib.Tag AddTag (TagTypes type, TagLib.Tag copy) { TagLib.Tag tag = null; if (type == TagTypes.Id3v2) { tag = new TagLib.Id3v2.Tag (); } else if (type == TagTypes.Ape) { tag = new TagLib.Ape.Tag (); (tag as Ape.Tag).HeaderPresent = true; } if (tag != null) { if (copy != null) copy.CopyTo (tag, true); AddTag (tag); } return tag; } #endregion #region Private Methods /// /// Reads a tag starting at a specified position and moves the /// cursor to its start position. /// /// /// A value reference specifying at what /// position the potential tag starts. If a tag is found, /// this value will be updated to the position at which the /// found tag ends. /// /// /// A object representing the tag /// found at the specified position, or if no tag was found. /// private TagLib.Tag ReadTag (ref long start) { long end = start; TagTypes type = ReadTagInfo (ref end); TagLib.Tag tag = null; try { switch (type) { case TagTypes.Ape: tag = new TagLib.Ape.Tag (file, start); break; case TagTypes.Id3v2: tag = new TagLib.Id3v2.Tag (file, start); break; } } catch (CorruptFileException e) { Console.Error.WriteLine ("taglib-sharp caught exception creating tag: {0}", e); } start = end; return tag; } /// /// Looks for a tag starting at a specified position and moves /// the cursor to its start position. /// /// /// A value reference specifying at what /// position the potential tag starts. If a tag is found, /// this value will be updated to the position at which the /// found tag ends. /// /// /// A value specifying the /// type of tag found at the specified position, or if no tag was found. /// private TagTypes ReadTagInfo (ref long position) { file.Seek (position); ByteVector data = file.ReadBlock (read_size); try { if (data.StartsWith (TagLib.Ape.Footer.FileIdentifier)) { TagLib.Ape.Footer footer = new TagLib.Ape.Footer (data); position += footer.CompleteTagSize; return TagTypes.Ape; } if (data.StartsWith (TagLib.Id3v2.Header.FileIdentifier)) { TagLib.Id3v2.Header header = new TagLib.Id3v2.Header (data); position += header.CompleteTagSize; return TagTypes.Id3v2; } } catch (CorruptFileException) { } return TagTypes.None; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/NonContainer/File.cs0000644000175000017500000003142111462100402024036 0ustar00rubenruben00000000000000// // File.cs: Provides tagging and properties for files that contain an // indeterminite number of tags at their beginning or end. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace TagLib.NonContainer { /// /// This abstract class extends to provide /// tagging and properties for files that contain an indeterminite /// number of tags at their beginning or end. /// /// /// When extending this class, , , and should be /// overrided methods that read the format specific information from /// the file. /// The file is read upon construction in the following /// manner: /// /// The file is opened for reading. /// The tags at the start of the file are /// read. /// is called. /// The tags at the end of the file are /// read. /// is called. /// If reading with a style other than , is /// called. /// The file is closed. /// /// public abstract class File : TagLib.File { #region Private Fields /// /// Contains the tags. /// private TagLib.NonContainer.Tag tag; /// /// Contains the media properties. /// private Properties properties; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// protected File (string path, ReadStyle propertiesStyle) : base (path) { Read (propertiesStyle); } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system with an average read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// protected File (string path) : this (path, ReadStyle.Average) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// protected File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction) { Read (propertiesStyle); } /// /// Constructs and initializes a new instance of for a specified file abstraction with an /// average read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// protected File (File.IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) { } #endregion #region Public Properties /// /// Gets a abstract representation of all tags stored in the /// current instance. /// /// /// A object representing all tags /// stored in the current instance. /// public override TagLib.Tag Tag { get {return tag;} } /// /// Gets the media properties of the file represented by the /// current instance. /// /// /// A object containing the /// media properties of the file represented by the current /// instance. /// public override TagLib.Properties Properties { get {return properties;} } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { long start, end; Mode = AccessMode.Write; try { tag.Write (out start, out end); InvariantStartPosition = start; InvariantEndPosition = end; TagTypesOnDisk = TagTypes; } finally { Mode = AccessMode.Closed; } } /// /// Removes a set of tag types from the current instance. /// /// /// A bitwise combined value /// containing tag types to be removed from the file. /// /// /// In order to remove all tags from a file, pass as . /// public override void RemoveTags (TagTypes types) { tag.RemoveTags (types); } #endregion #region Protected Properties /// /// Gets the collection of tags appearing at the start of the /// file. /// /// /// A storing the /// tags for the start of the file. /// protected StartTag StartTag { get {return tag.StartTag;} } /// /// Gets the collection of tags appearing at the end of the /// file. /// /// /// A storing the /// tags for the end of the file. /// protected EndTag EndTag { get {return tag.EndTag;} } #endregion #region Protected Methods /// /// Reads format specific information at the start of the /// file. /// /// /// A value containing the seek position /// at which the tags end and the media data begins. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// This method is called by the constructor immediately /// after the tags at the start of the file have been read /// and as such (so the internal seek mechanism is close to /// the start). It should be used for reading any content /// specific information, such as an audio header from the /// start of the file. /// protected virtual void ReadStart (long start, ReadStyle propertiesStyle) { } /// /// Reads format specific information at the end of the /// file. /// /// /// A value containing the seek position /// at which the media data ends and the tags begin. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// This method is called by the constructor immediately /// after the tags at the end of the file have been read /// and as such (so the internal seek mechanism is close to /// the end). It should be used for reading any content /// specific information, such as an audio header from the /// end of the file. /// protected virtual void ReadEnd (long end, ReadStyle propertiesStyle) { } /// /// Reads the audio properties from the file represented by /// the current instance. /// /// /// A value containing the seek position /// at which the tags end and the media data begins. /// /// /// A value containing the seek position /// at which the media data ends and the tags begin. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// A object describing the /// media properties of the file represented by the current /// instance. /// /// /// This method is called ONLY IF the file is constructed /// with a read style other than , and as such MUST NOT return . /// It is guaranteed that and will have been called first and this /// method should be strictly used to perform final /// processing on already read data. /// protected abstract Properties ReadProperties (long start, long end, ReadStyle propertiesStyle); #endregion #region Private Methods /// /// Reads the file with a specified read style. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// private void Read (ReadStyle propertiesStyle) { Mode = AccessMode.Read; try { tag = new Tag (this); // Read the tags and property data at the beginning of // the file. InvariantStartPosition = tag.ReadStart (); TagTypesOnDisk |= StartTag.TagTypes; ReadStart (InvariantStartPosition, propertiesStyle); // Read the tags and property data at the end of the // file. InvariantEndPosition = (InvariantStartPosition == Length) ? Length : tag.ReadEnd (); TagTypesOnDisk |= EndTag.TagTypes; ReadEnd (InvariantEndPosition, propertiesStyle); // Read the audio properties. properties = (propertiesStyle != ReadStyle.None) ? ReadProperties (InvariantStartPosition, InvariantEndPosition, propertiesStyle) : null; } finally { Mode = AccessMode.Closed; } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/NonContainer/Tag.cs0000644000175000017500000001741411462100402023700 0ustar00rubenruben00000000000000// // Tag.cs: Combines StartTag and EndTag in such a way as their children appear // as its children. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; namespace TagLib.NonContainer { /// /// This class extends , combining and in such a way as /// their children appear as its children. /// public class Tag : CombinedTag { #region Private Fields /// /// Contains the tags appearing at the start of the file. /// private StartTag start_tag; /// /// Contains the tags appearing at the end of the file. /// private EndTag end_tag; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified . /// /// /// A object on which the new /// instance will perform its operations. /// /// /// Constructing a new instance does not automatically read /// the contents from the disk. must be /// called to read the tags. /// public Tag (File file) : base () { start_tag = new StartTag (file); end_tag = new EndTag (file); AddTag (start_tag); AddTag (end_tag); } #endregion #region Public Properties /// /// Gets the collection of tags appearing at the start of the /// file. /// /// /// A storing the /// tags for the start of the file. /// public StartTag StartTag { get {return start_tag;} } /// /// Gets the collection of tags appearing at the end of the /// file. /// /// /// A storing the /// tags for the end of the file. /// public EndTag EndTag { get {return end_tag;} } /// /// Gets the tag types contained in the current instance. /// /// /// A bitwise combined /// containing the tag types contained in the current /// instance. /// public override TagTypes TagTypes { get {return start_tag.TagTypes | end_tag.TagTypes;} } /// /// Gets the tags combined in the current instance. /// /// /// A containing the tags combined in /// the current instance. /// /// /// This contains the combined children of and . /// public override TagLib.Tag [] Tags { get { List tags = new List (); tags.AddRange (start_tag.Tags); tags.AddRange (end_tag.Tags); return tags.ToArray (); } } #endregion #region Public Methods /// /// Gets a tag of a specified type from the current instance. /// /// /// A value indicating the /// type of tag to read. /// /// /// A object containing the tag that was /// found in the current instance. If no /// matching tag was found and none was created, is returned. /// public TagLib.Tag GetTag (TagTypes type) { foreach (TagLib.Tag t in Tags) { if (type == TagTypes.Id3v1 && t is TagLib.Id3v1.Tag) return t; if (type == TagTypes.Id3v2 && t is TagLib.Id3v2.Tag) return t; if (type == TagTypes.Ape && t is TagLib.Ape.Tag) return t; } return null; } /// /// Removes a set of tag types from the current instance. /// /// /// A bitwise combined value /// containing tag types to be removed from the file. /// /// /// In order to remove all tags from a file, pass as . /// public void RemoveTags (TagTypes types) { start_tag.RemoveTags (types); end_tag.RemoveTags (types); } /// /// Reads the tags at the start and end of the file. /// /// /// A value reference which will be set /// to contain the seek position in the file at which the /// tags at the start end. This also marks the seek position /// at which the media begins. /// /// /// A value reference which will be set /// to contain the seek position in the file at which the /// tags at the end begin. This also marks the seek position /// at which the media ends. /// public void Read (out long start, out long end) { start = ReadStart (); end = ReadEnd (); } /// /// Reads the tags stored at the start of the file into the /// current instance. /// /// /// A value indicating the seek position /// in the file at which the read tags end. This also /// marks the seek position at which the media begins. /// public long ReadStart () { return start_tag.Read (); } /// /// Reads the tags stored at the end of the file into the /// current instance. /// /// /// A value indicating the seek position /// in the file at which the read tags begin. This also /// marks the seek position at which the media ends. /// public long ReadEnd () { return end_tag.Read (); } /// /// Writes the tags to the start and end of the file. /// /// /// A value reference which will be set /// to contain the new seek position in the file at which the /// tags at the start end. This also marks the seek position /// at which the media begins. /// /// /// A value reference which will be set /// to contain the new seek position in the file at which the /// tags at the end begin. This also marks the seek position /// at which the media ends. /// public void Write (out long start, out long end) { start = start_tag.Write (); end = end_tag.Write (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/NonContainer/EndTag.cs0000644000175000017500000002472011462100402024325 0ustar00rubenruben00000000000000// // EndTag.cs: Provides support for accessing and modifying a collection of tags // appearing at the end of a file. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace TagLib.NonContainer { /// /// This class extends , providing support /// for accessing and modifying a collection of tags appearing at the /// end of a file. /// /// /// This class is used by to read all the tags appearing at the end of the file but /// could be used by other classes. It currently supports ID3v1, /// ID3v2, and APE tags. /// public class EndTag : CombinedTag { #region Private Fields /// /// Contains the file to operate on. /// private TagLib.File file; /// /// Contains the number of bytes that must be read to /// hold all applicable indicators. /// private static int read_size = (int) Math.Max (Math.Max ( TagLib.Ape.Footer.Size, TagLib.Id3v2.Footer.Size), TagLib.Id3v1.Tag.Size); #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified . /// /// /// A object on which the new /// instance will perform its operations. /// /// /// Constructing a new instance does not automatically read /// the contents from the disk. must be /// called to read the tags. /// public EndTag (TagLib.File file) : base () { this.file = file; } #endregion #region Public Properties /// /// Gets the total size of the tags located at the end of the /// file by reading from the file. /// public long TotalSize { get { long start = file.Length; while (ReadTagInfo (ref start) != TagTypes.None) ; return file.Length - start; } } #endregion #region Public Methods /// /// Reads the tags stored at the end of the file into the /// current instance. /// /// /// A value indicating the seek position /// in the file at which the read tags begin. This also /// marks the seek position at which the media ends. /// public long Read () { TagLib.Tag tag; ClearTags (); long start = file.Length; while ((tag = ReadTag (ref start)) != null) InsertTag (0, tag); return start; } /// /// Renders the tags contained in the current instance. /// /// /// A object containing the /// physical representation of the tags stored in the current /// instance. /// /// /// The tags are rendered in the order that they are stored /// in the current instance. /// public ByteVector Render () { ByteVector data = new ByteVector (); foreach (TagLib.Tag t in Tags) { if (t is TagLib.Ape.Tag) data.Add ((t as TagLib.Ape.Tag).Render ()); else if (t is TagLib.Id3v2.Tag) data.Add ((t as TagLib.Id3v2.Tag).Render ()); else if (t is TagLib.Id3v1.Tag) data.Add ((t as TagLib.Id3v1.Tag).Render ()); } return data; } /// /// Writes the tags contained in the current instance to the /// end of the file that created it, overwriting the existing /// tags. /// /// /// A value indicating the seek position /// in the file at which the written tags begin. This also /// marks the seek position at which the media ends. /// public long Write () { long total_size = TotalSize; ByteVector data = Render (); file.Insert (data, file.Length - total_size, total_size); return file.Length - data.Count; } /// /// Removes a set of tag types from the current instance. /// /// /// A bitwise combined value /// containing tag types to be removed from the file. /// /// /// In order to remove all tags from a file, pass as . /// public void RemoveTags (TagTypes types) { for (int i = Tags.Length - 1; i >= 0; i--) { var tag = Tags[i]; if (types == TagTypes.AllTags || (tag.TagTypes & types) == tag.TagTypes) { RemoveTag (tag); } } } /// /// Adds a tag of a specified type to the current instance, /// optionally copying values from an existing type. /// /// /// A value specifying the type of /// tag to add to the current instance. At the time of this /// writing, this is limited to , /// , and . /// /// /// A to copy values from using /// , or if no tag is to be copied. /// /// /// The object added to the current /// instance, or if it couldn't be /// created. /// /// /// ID3v2 tags are added at the end of the current instance, /// while other tags are added to the beginning. /// public TagLib.Tag AddTag (TagTypes type, TagLib.Tag copy) { TagLib.Tag tag = null; if (type == TagTypes.Id3v1) { tag = new TagLib.Id3v1.Tag (); } else if (type == TagTypes.Id3v2) { Id3v2.Tag tag32 = new Id3v2.Tag (); tag32.Version = 4; tag32.Flags |= Id3v2.HeaderFlags.FooterPresent; tag = tag32; } else if (type == TagTypes.Ape) { tag = new TagLib.Ape.Tag (); } if (tag != null) { if (copy != null) copy.CopyTo (tag, true); if (type == TagTypes.Id3v1) AddTag (tag); else InsertTag (0, tag); } return tag; } #endregion #region Private Methods /// /// Reads a tag ending at a specified position and moves the /// cursor to its start position. /// /// /// A value reference specifying at what /// position the potential tag ends at. If a tag is found, /// this value will be updated to the position at which the /// found tag starts. /// /// /// A object representing the tag /// found at the specified position, or if no tag was found. /// private TagLib.Tag ReadTag (ref long end) { long start = end; TagTypes type = ReadTagInfo (ref start); TagLib.Tag tag = null; try { switch (type) { case TagTypes.Ape: tag = new TagLib.Ape.Tag (file, end - TagLib.Ape.Footer.Size); break; case TagTypes.Id3v2: tag = new TagLib.Id3v2.Tag (file, start); break; case TagTypes.Id3v1: tag = new TagLib.Id3v1.Tag (file, start); break; } end = start; } catch (CorruptFileException) { } return tag; } /// /// Looks for a tag ending at a specified position and moves /// the cursor to its start position. /// /// /// A value reference specifying at what /// position the potential tag ends. If a tag is found, /// this value will be updated to the position at which the /// found tag starts. /// /// /// A value specifying the /// type of tag found at the specified position, or if no tag was found. /// private TagTypes ReadTagInfo (ref long position) { if (position - read_size < 0) return TagTypes.None; file.Seek (position - read_size); ByteVector data = file.ReadBlock (read_size); try { int offset = (int) (data.Count - TagLib.Ape.Footer.Size); if (data.ContainsAt (TagLib.Ape.Footer.FileIdentifier, offset)) { TagLib.Ape.Footer footer = new TagLib.Ape.Footer ( data.Mid (offset)); // If the complete tag size is zero or // the tag is a header, this indicates // some sort of corruption. if (footer.CompleteTagSize == 0 || (footer.Flags & TagLib.Ape.FooterFlags.IsHeader) != 0) return TagTypes.None; position -= footer.CompleteTagSize; return TagTypes.Ape; } offset = (int) (data.Count - TagLib.Id3v2.Footer.Size); if (data.ContainsAt (TagLib.Id3v2.Footer.FileIdentifier, offset)) { TagLib.Id3v2.Footer footer = new TagLib.Id3v2.Footer ( data.Mid (offset)); position -= footer.CompleteTagSize; return TagTypes.Id3v2; } if (data.StartsWith ( TagLib.Id3v1.Tag.FileIdentifier)) { position -= TagLib.Id3v1.Tag.Size; return TagTypes.Id3v1; } } catch (CorruptFileException) { } return TagTypes.None; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/0000777000175000017500000000000011503407422021222 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/AppleTag.cs0000644000175000017500000012524611462100402023244 0ustar00rubenruben00000000000000// // AppleTag.cs: Provides support for processing Apple "ilst" tags. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections; using System.Collections.Generic; using System.Globalization; namespace TagLib.Mpeg4 { /// /// This class extends to provide support /// for processing Apple "ilst" tags. /// public class AppleTag : TagLib.Tag, IEnumerable { #region Private Fields /// /// Contains the ISO meta box in which that tag will be /// stored. /// private IsoMetaBox meta_box; /// /// Contains the ILST box which holds all the values. /// private AppleItemListBox ilst_box; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified ISO user data box. /// /// /// A from which the tag is to /// be read. /// public AppleTag (IsoUserDataBox box) { if (box == null) throw new ArgumentNullException ("box"); meta_box = box.GetChild (BoxType.Meta) as IsoMetaBox; if (meta_box == null) { meta_box = new IsoMetaBox ("mdir", null); box.AddChild (meta_box); } ilst_box = meta_box.GetChild (BoxType.Ilst) as AppleItemListBox; if (ilst_box == null) { ilst_box = new AppleItemListBox (); meta_box.AddChild (ilst_box); } } #endregion #region Public Methods /// /// Gets and sets whether or not the album described by the /// current instance is a compilation. /// /// /// A value indicating whether or not the /// album described by the current instance is a compilation. /// /// /// This property is implemented using the "cpil" data box. /// public bool IsCompilation { get { foreach (AppleDataBox box in DataBoxes ( BoxType.Cpil)) return box.Data.ToUInt () != 0; return false; } set { SetData (BoxType.Cpil, new ByteVector( (byte) (value ? 1 : 0)), (uint) AppleDataBox.FlagType.ForTempo); } } #endregion #region Public Methods /// /// Gets all data boxes that match any of the provided types. /// /// /// A object enumerating a list /// of box types to match. /// /// /// A object enumerating the /// matching boxes. /// public IEnumerable DataBoxes (IEnumerable types) { // Check each box to see if the match any of the // provided types. If a match is found, loop through the // children and add any data box. foreach (Box box in ilst_box.Children) foreach (ByteVector v in types) { if (FixId (v) != box.BoxType) continue; foreach (Box data_box in box.Children) { AppleDataBox adb = data_box as AppleDataBox; if (adb != null) yield return adb; } } } /// /// Gets all data boxes that match any of the provided types. /// /// /// A containing list of box /// types to match. /// /// /// A object enumerating the /// matching boxes. /// public IEnumerable DataBoxes (params ByteVector [] types) { return DataBoxes (types as IEnumerable); } /// /// Gets all custom data boxes that match the specified mean /// and name pair. /// /// /// A object containing the "mean" to /// match. /// /// /// A object containing the name to /// match. /// /// /// A object enumerating the /// matching boxes. /// public IEnumerable DataBoxes (string mean, string name) { // These children will have a box type of "----" foreach (Box box in ilst_box.Children) { if (box.BoxType != BoxType.DASH) continue; // Get the mean and name boxes, make sure // they're legit, and make sure that they match // what we want. Then loop through and add all // the data box children to our output. AppleAdditionalInfoBox mean_box = (AppleAdditionalInfoBox) box.GetChild (BoxType.Mean); AppleAdditionalInfoBox name_box = (AppleAdditionalInfoBox) box.GetChild (BoxType.Name); if (mean_box == null || name_box == null || mean_box.Text != mean || name_box.Text != name) continue; foreach (Box data_box in box.Children) { AppleDataBox adb = data_box as AppleDataBox; if (adb != null) yield return adb; } } } /// /// Gets all text values contained in a specified box type. /// /// /// A object containing the box /// type to match. /// /// /// A containing text from all /// matching boxes. /// public string [] GetText (ByteVector type) { List result = new List (); foreach (AppleDataBox box in DataBoxes (type)) { if (box.Text == null) continue; foreach (string text in box.Text.Split (';')) result.Add (text.Trim ()); } return result.ToArray (); } /// /// Sets the data for a specified box type to a collection of /// boxes. /// /// /// A object containing the type to /// add to the new instance. /// /// /// A containing boxes to add /// for the specified type. /// public void SetData (ByteVector type, AppleDataBox [] boxes) { // Fix the type. type = FixId (type); bool added = false; foreach (Box box in ilst_box.Children) if (type == box.BoxType) { // Clear the box's children. box.ClearChildren (); // If we've already added new childen, // continue. if (added) continue; added = true; // Add the children. foreach (AppleDataBox b in boxes) box.AddChild (b); } if (added) return; Box box2 = new AppleAnnotationBox (type); ilst_box.AddChild (box2); foreach (AppleDataBox b in boxes) box2.AddChild (b); } /// /// Sets the data for a specified box type using values from /// a object. /// /// /// A object containing the type to /// add to the new instance. /// /// /// A object containing /// data to add for the specified type. /// /// /// A value containing flags to use for /// the added boxes. /// public void SetData (ByteVector type, ByteVectorCollection data, uint flags) { if (data == null || data.Count == 0) { ClearData (type); return; } AppleDataBox [] boxes = new AppleDataBox [data.Count]; for (int i = 0; i < data.Count; i ++) boxes [i] = new AppleDataBox (data [i], flags); SetData (type, boxes); } /// /// Sets the data for a specified box type using a single /// object. /// /// /// A object containing the type to /// add to the new instance. /// /// /// A object containing data to add /// for the specified type. /// /// /// A value containing flags to use for /// the added box. /// public void SetData (ByteVector type, ByteVector data, uint flags) { if (data == null || data.Count == 0) ClearData (type); else SetData (type, new ByteVectorCollection (data), flags); } /// /// Sets the text for a specified box type. /// /// /// A object containing the type to /// add to the new instance. /// /// /// A containing text to store. /// public void SetText (ByteVector type, string [] text) { // Remove empty data and return. if (text == null) { ilst_box.RemoveChild (FixId (type)); return; } SetText (type, string.Join ("; ", text)); } /// /// Sets the text for a specified box type. /// /// /// A object containing the type to /// add to the new instance. /// /// /// A object containing text to store. /// public void SetText (ByteVector type, string text) { // Remove empty data and return. if (string.IsNullOrEmpty (text)) { ilst_box.RemoveChild (FixId (type)); return; } ByteVectorCollection l = new ByteVectorCollection (); l.Add (ByteVector.FromString (text, StringType.UTF8)); SetData (type, l, (uint) AppleDataBox.FlagType.ContainsText); } /// /// Clears all data for a specified box type. /// /// /// A object containing the type of /// box to remove from the current instance. /// public void ClearData (ByteVector type) { ilst_box.RemoveChild (FixId (type)); } /// /// Detaches the internal "ilst" box from its parent element. /// public void DetachIlst () { meta_box.RemoveChild (ilst_box); } /// /// Gets the text string from a specific data box in a Dash (----) atom /// /// String specifying text from mean box /// String specifying text from name box /// Text string from data box public string GetDashBox(string meanstring, string namestring) { AppleDataBox data_box = GetDashAtoms(meanstring, namestring); if (data_box != null) { return data_box.Text; } else { return null; } } /// /// Sets a specific strings in Dash (----) atom. This method updates /// and existing atom, or creates a new one. If an empty datastring is /// specified, the Dash box and its children are removed. /// /// String specifying text for mean box /// String specifying text for name box /// String specifying text for data box public void SetDashBox(string meanstring, string namestring, string datastring) { AppleDataBox data_box = GetDashAtoms(meanstring, namestring); // If we did find a data_box and we have an empty datastring we should // remove the entire dash box. if (data_box != null && string.IsNullOrEmpty(datastring)) { AppleAnnotationBox dash_box = GetParentDashBox(meanstring, namestring); dash_box.ClearChildren(); ilst_box.RemoveChild(dash_box); return; } if (data_box != null) { data_box.Text = datastring; } else { //Create the new boxes, should use 1 for text as a flag AppleAdditionalInfoBox amean_box = new AppleAdditionalInfoBox(BoxType.Mean, 0, 1); AppleAdditionalInfoBox aname_box = new AppleAdditionalInfoBox(BoxType.Name, 0, 1); AppleDataBox adata_box = new AppleDataBox(BoxType.Data, 1); amean_box.Text = meanstring; aname_box.Text = namestring; adata_box.Text = datastring; AppleAnnotationBox whole_box = new AppleAnnotationBox(BoxType.DASH); whole_box.AddChild(amean_box); whole_box.AddChild(aname_box); whole_box.AddChild(adata_box); ilst_box.AddChild(whole_box); } } /// /// Gets the AppleDataBox that corresponds to the specified mean and name values. /// /// String specifying text for mean box /// String specifying text for name box /// Existing AppleDataBox or null if one does not exist private AppleDataBox GetDashAtoms(string meanstring, string namestring) { foreach (Box box in ilst_box.Children) { if (box.BoxType != BoxType.DASH) continue; // Get the mean and name boxes, make sure // they're legit, check the Text fields for // a match. If we have a match return // the AppleDatabox containing the data AppleAdditionalInfoBox mean_box = (AppleAdditionalInfoBox) box.GetChild(BoxType.Mean); AppleAdditionalInfoBox name_box = (AppleAdditionalInfoBox) box.GetChild(BoxType.Name); if (mean_box == null || name_box == null || mean_box.Text != meanstring || name_box.Text != namestring) { continue; } else { return (AppleDataBox)box.GetChild(BoxType.Data); } } // If we haven't returned the found box yet, there isn't one, return null return null; } /// /// Returns the Parent Dash box object for a given mean/name combination /// /// String specifying text for mean box /// String specifying text for name box /// AppleAnnotationBox object that is the parent for the mean/name combination private AppleAnnotationBox GetParentDashBox(string meanstring, string namestring) { foreach (Box box in ilst_box.Children) { if (box.BoxType != BoxType.DASH) continue; // Get the mean and name boxes, make sure // they're legit, check the Text fields for // a match. If we have a match return // the AppleAnnotationBox that is the Parent AppleAdditionalInfoBox mean_box = (AppleAdditionalInfoBox) box.GetChild(BoxType.Mean); AppleAdditionalInfoBox name_box = (AppleAdditionalInfoBox) box.GetChild(BoxType.Name); if (mean_box == null || name_box == null || mean_box.Text != meanstring || name_box.Text != namestring) { continue; } else { return (AppleAnnotationBox)box; } } // If we haven't returned the found box yet, there isn't one, return null return null; } #endregion #region Internal Methods /// /// Converts the provided ID into a readonly ID and fixes a /// 3 byte ID. /// /// /// A object containing an ID to /// fix. /// /// /// A fixed or if the ID could not be fixed. /// internal static ReadOnlyByteVector FixId (ByteVector id) { if (id.Count == 4) { ReadOnlyByteVector roid = id as ReadOnlyByteVector; if (roid != null) return roid; return new ReadOnlyByteVector (id); } if (id.Count == 3) return new ReadOnlyByteVector ( 0xa9, id [0], id [1], id [2]); return null; } #endregion #region IEnumerable /// /// Gets an enumerator for enumerating through the tag's data /// boxes. /// /// /// A for /// enumerating through the tag's data boxes. /// public IEnumerator GetEnumerator() { return ilst_box.Children.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return ilst_box.Children.GetEnumerator(); } #endregion #region TagLib.Tag /// /// Gets the tag types contained in the current instance. /// /// /// Always . /// public override TagTypes TagTypes { get {return TagTypes.Apple;} } /// /// Gets and sets the title for the media described by the /// current instance. /// /// /// A object containing the title for /// the media described by the current instance or if no value is present. /// /// /// This property is implemented using the "@nam" data box. /// public override string Title { get { string [] text = GetText (BoxType.Nam); return text.Length == 0 ? null : text [0]; } set { SetText (BoxType.Nam, value); } } /// /// Gets and sets the performers or artists who performed in /// the media described by the current instance. /// /// /// A containing the performers or /// artists who performed in the media described by the /// current instance or an empty array if no value is /// present. /// /// /// This property is implemented using the "@ART" data box. /// public override string [] Performers { get {return GetText (BoxType.Art);} set {SetText (BoxType.Art, value);} } /// /// Gets and sets the band or artist who is credited in the /// creation of the entire album or collection containing the /// media described by the current instance. /// /// /// A containing the band or artist /// who is credited in the creation of the entire album or /// collection containing the media described by the current /// instance or an empty array if no value is present. /// /// /// This property is implemented using the "aART" data box. /// public override string [] AlbumArtists { get {return GetText (BoxType.Aart);} set {SetText(BoxType.Aart, value);} } /// /// Gets and sets the composers of the media represented by /// the current instance. /// /// /// A containing the composers of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This property is implemented using the "@wrt" data box. /// public override string [] Composers { get {return GetText (BoxType.Wrt);} set {SetText (BoxType.Wrt, value);} } /// /// Gets and sets the album of the media represented by the /// current instance. /// /// /// A object containing the album of /// the media represented by the current instance or if no value is present. /// /// /// This property is implemented using the "@alb" data box. /// public override string Album { get { string [] text = GetText (BoxType.Alb); return text.Length == 0 ? null : text [0]; } set {SetText (BoxType.Alb, value);} } /// /// Gets and sets a user comment on the media represented by /// the current instance. /// /// /// A object containing user comments /// on the media represented by the current instance or if no value is present. /// /// /// This property is implemented using the "@cmt" data box. /// public override string Comment { get { string [] text = GetText (BoxType.Cmt); return text.Length == 0 ? null : text [0]; } set {SetText (BoxType.Cmt, value);} } /// /// Gets and sets the genres of the media represented by the /// current instance. /// /// /// A containing the genres of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This property is implemented using the "@gen" and "gnre" /// data boxes. /// public override string [] Genres { get { string [] text = GetText (BoxType.Gen); if (text.Length > 0) return text; foreach (AppleDataBox box in DataBoxes (BoxType.Gnre)) { if (box.Flags != (int) AppleDataBox .FlagType.ContainsData) continue; // iTunes stores genre's in the GNRE box // as (ID3# + 1). ushort index = box.Data.ToUShort (true); if (index == 0) continue; string str = TagLib.Genres .IndexToAudio ((byte) (index - 1)); if (str == null) continue; text = new string [] {str}; break; } return text; } set { ClearData (BoxType.Gnre); SetText (BoxType.Gen, value); } } /// /// Gets and sets the year that the media represented by the /// current instance was recorded. /// /// /// A containing the year that the media /// represented by the current instance was created or zero /// if no value is present. /// /// /// This property is implemented using the "@day" data box. /// public override uint Year { get { uint value; foreach (AppleDataBox box in DataBoxes (BoxType.Day)) if (box.Text != null && (uint.TryParse ( box.Text, out value) || uint.TryParse ( box.Text.Length > 4 ? box.Text.Substring (0, 4) : box.Text, out value))) return value; return 0; } set { if (value == 0) ClearData (BoxType.Day); else SetText (BoxType.Day, value.ToString ( CultureInfo.InvariantCulture)); } } /// /// Gets and sets the position of the media represented by /// the current instance in its containing album. /// /// /// A containing the position of the /// media represented by the current instance in its /// containing album or zero if not specified. /// /// /// This property is implemented using the "trkn" data box. /// public override uint Track { get { foreach (AppleDataBox box in DataBoxes (BoxType.Trkn)) if (box.Flags == (int) AppleDataBox.FlagType.ContainsData && box.Data.Count >= 4) return box.Data.Mid (2, 2).ToUShort (); return 0; } set { uint count = TrackCount; if (value == 0 && count == 0) { ClearData (BoxType.Trkn); return; } ByteVector v = ByteVector.FromUShort (0); v.Add (ByteVector.FromUShort ((ushort) value)); v.Add (ByteVector.FromUShort ((ushort) count)); v.Add (ByteVector.FromUShort (0)); SetData (BoxType.Trkn, v, (int) AppleDataBox.FlagType.ContainsData); } } /// /// Gets and sets the number of tracks in the album /// containing the media represented by the current instance. /// /// /// A containing the number of tracks in /// the album containing the media represented by the current /// instance or zero if not specified. /// /// /// This property is implemented using the "trkn" data box. /// public override uint TrackCount { get { foreach (AppleDataBox box in DataBoxes (BoxType.Trkn)) if (box.Flags == (int) AppleDataBox.FlagType.ContainsData && box.Data.Count >= 6) return box.Data.Mid (4, 2).ToUShort (); return 0; } set { uint track = Track; if (value == 0 && track == 0) { ClearData (BoxType.Trkn); return; } ByteVector v = ByteVector.FromUShort (0); v.Add (ByteVector.FromUShort ((ushort) track)); v.Add (ByteVector.FromUShort ((ushort) value)); v.Add (ByteVector.FromUShort (0)); SetData (BoxType.Trkn, v, (int) AppleDataBox.FlagType.ContainsData); } } /// /// Gets and sets the number of the disc containing the media /// represented by the current instance in the boxed set. /// /// /// A containing the number of the disc /// containing the media represented by the current instance /// in the boxed set. /// /// /// This property is implemented using the "disk" data box. /// public override uint Disc { get { foreach (AppleDataBox box in DataBoxes (BoxType.Disk)) if (box.Flags == (int) AppleDataBox.FlagType.ContainsData && box.Data.Count >= 4) return box.Data.Mid (2, 2).ToUShort (); return 0; } set { uint count = DiscCount; if (value == 0 && count == 0) { ClearData (BoxType.Disk); return; } ByteVector v = ByteVector.FromUShort (0); v.Add (ByteVector.FromUShort ((ushort) value)); v.Add (ByteVector.FromUShort ((ushort) count)); v.Add (ByteVector.FromUShort (0)); SetData (BoxType.Disk, v, (int) AppleDataBox.FlagType.ContainsData); } } /// /// Gets and sets the number of discs in the boxed set /// containing the media represented by the current instance. /// /// /// A containing the number of discs in /// the boxed set containing the media represented by the /// current instance or zero if not specified. /// /// /// This property is implemented using the "disk" data box. /// public override uint DiscCount { get { foreach (AppleDataBox box in DataBoxes (BoxType.Disk)) if (box.Flags == (int) AppleDataBox.FlagType.ContainsData && box.Data.Count >= 6) return box.Data.Mid (4, 2).ToUShort (); return 0; } set { uint disc = Disc; if (value == 0 && disc == 0) { ClearData (BoxType.Disk); return; } ByteVector v = ByteVector.FromUShort (0); v.Add (ByteVector.FromUShort ((ushort) disc)); v.Add (ByteVector.FromUShort ((ushort) value)); v.Add (ByteVector.FromUShort (0)); SetData (BoxType.Disk, v, (int) AppleDataBox.FlagType.ContainsData); } } /// /// Gets and sets the lyrics or script of the media /// represented by the current instance. /// /// /// A object containing the lyrics or /// script of the media represented by the current instance /// or if no value is present. /// /// /// This property is implemented using the "@lyr" data box. /// public override string Lyrics { get { foreach (AppleDataBox box in DataBoxes (BoxType.Lyr)) return box.Text; return null; } set { SetText (BoxType.Lyr, value); } } /// /// Gets and sets the grouping on the album which the media /// in the current instance belongs to. /// /// /// A object containing the grouping on /// the album which the media in the current instance belongs /// to or if no value is present. /// /// /// This property is implemented using the "@grp" data box. /// public override string Grouping { get { foreach (AppleDataBox box in DataBoxes(BoxType.Grp)) return box.Text; return null; } set {SetText(BoxType.Grp, value);} } /// /// Gets and sets the number of beats per minute in the audio /// of the media represented by the current instance. /// /// /// A containing the number of beats per /// minute in the audio of the media represented by the /// current instance, or zero if not specified. /// /// /// This property is implemented using the "tmpo" data box. /// public override uint BeatsPerMinute { get { foreach (AppleDataBox box in DataBoxes (BoxType.Tmpo)) if (box.Flags == (uint) AppleDataBox.FlagType.ForTempo) return box.Data.ToUInt (); return 0; } set { if (value == 0) { ClearData (BoxType.Tmpo); return; } SetData (BoxType.Tmpo, ByteVector.FromUShort ((ushort)value), (uint) AppleDataBox.FlagType.ForTempo); } } /// /// Gets and sets the conductor or director of the media /// represented by the current instance. /// /// /// A object containing the conductor /// or director of the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "cond" data box. /// public override string Conductor { get { foreach (AppleDataBox box in DataBoxes(BoxType.Cond)) return box.Text; return null; } set {SetText(BoxType.Cond, value);} } /// /// Gets and sets the copyright information for the media /// represented by the current instance. /// /// /// A object containing the copyright /// information for the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "cprt" data box. /// public override string Copyright { get { foreach (AppleDataBox box in DataBoxes(BoxType.Cprt)) return box.Text; return null; } set {SetText(BoxType.Cprt, value);} } /// /// Gets and sets the sort names for the band or artist who /// is credited in the creation of the entire album or /// collection containing the media described by the /// current instance. /// /// /// A containing the sort names /// for the band or artist who is credited in the creation /// of the entire album or collection containing the media /// described by the current instance or an empty array if /// no value is present. /// /// /// This property is implemented using the "soaa" /// Box type. /// http://musicbrainz.org/doc/PicardTagMapping /// http://code.google.com/p/mp4v2/wiki/iTunesMetadata /// public override string [] AlbumArtistsSort { get {return GetText (BoxType.Soaa);} set {SetText (BoxType.Soaa, value);} } /// /// Gets and sets the sort names of the performers or artists /// who performed in the media described by the current instance. /// /// /// A containing the sort names for /// the performers or artists who performed in the media /// described by the current instance, or an empty array if /// no value is present. /// /// /// This property is implemented using the "soar" box type. /// http://musicbrainz.org/doc/PicardTagMapping /// http://code.google.com/p/mp4v2/wiki/iTunesMetadata /// public override string[] PerformersSort { get {return GetText (BoxType.Soar);} set {SetText (BoxType.Soar, value);} } /// /// Gets and sets the sort names of the Composer credited /// in the media described by the current instance. /// /// /// A containing the sort names for /// the Composers in the media described by the current instance, /// or an empty array if no value is present. /// /// /// This property is implemented using the "soar" box type. /// http://musicbrainz.org/doc/PicardTagMapping /// http://code.google.com/p/mp4v2/wiki/iTunesMetadata /// public override string[] ComposersSort { get {return GetText (BoxType.Soco);} set {SetText (BoxType.Soco, value);} } /// /// Gets and sets the sort names of the Album Title of /// the media described by the current instance. /// /// /// A containing the sort names for /// the Album Title in the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "soal" box type. /// http://musicbrainz.org/doc/PicardTagMapping /// http://code.google.com/p/mp4v2/wiki/iTunesMetadata /// public override string AlbumSort { get { string [] text = GetText (BoxType.Soal); return text.Length == 0 ? null : text [0]; } set {SetText (BoxType.Soal, value);} } /// /// Gets and sets the sort names of the Track Title in the /// media described by the current instance. /// /// /// A containing the sort names for /// the Track Title in the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "sonm" box type. /// http://musicbrainz.org/doc/PicardTagMapping /// http://code.google.com/p/mp4v2/wiki/iTunesMetadata /// public override string TitleSort { get { string [] text = GetText (BoxType.Sonm); return text.Length == 0 ? null : text [0]; } set {SetText (BoxType.Sonm, value);} } /// /// Gets and sets the MusicBrainz ArtistID /// /// /// A containing the MusicBrainz /// ArtistID for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "dash"/"----" box type. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzArtistId { get {return GetDashBox("com.apple.iTunes","MusicBrainz Artist Id");} set {SetDashBox("com.apple.iTunes", "MusicBrainz Artist Id", value);} } /// /// Gets and sets the MusicBrainz ReleaseID /// /// /// A containing the MusicBrainz /// ReleaseID for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "dash"/"----" box type. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseId { get {return GetDashBox("com.apple.iTunes","MusicBrainz Album Id");} set {SetDashBox("com.apple.iTunes", "MusicBrainz Album Id",value);} } /// /// Gets and sets the MusicBrainz ReleaseArtistID /// /// /// A containing the MusicBrainz /// ReleaseArtistID for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "dash"/"----" box type. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseArtistId { get {return GetDashBox("com.apple.iTunes","MusicBrainz Album Artist Id");} set {SetDashBox("com.apple.iTunes", "MusicBrainz Album Artist Id",value);} } /// /// Gets and sets the MusicBrainz TrackID /// /// /// A containing the MusicBrainz /// TrackID for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "dash"/"----" box type. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzTrackId { get { return GetDashBox("com.apple.iTunes","MusicIP PUID");} set {SetDashBox("com.apple.iTunes", "MusicIP PUID", value);} } /// /// Gets and sets the MusicBrainz DiscID /// /// /// A containing the MusicBrainz /// DiscID for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "dash"/"----" box type. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzDiscId { get {return GetDashBox("com.apple.iTunes","MusicBrainz Disc Id");} set {SetDashBox("com.apple.iTunes", "MusicBrainz Disc Id",value);} } /// /// Gets and sets the MusicIP PUID /// /// /// A containing the MusicIP Puid /// for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "dash"/"----" box type. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicIpId { get {return GetDashBox("com.apple.iTunes","MusicIP PUID");} set {SetDashBox("com.apple.iTunes", "MusicIP PUID",value);} } /// /// Gets and sets the AmazonID /// /// /// A containing the AmazonID /// for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "dash"/"----" box type. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string AmazonId { get {return GetDashBox("com.apple.iTunes","ASIN");} set {SetDashBox("com.apple.iTunes", "ASIN",value);} } /// /// Gets and sets the MusicBrainz ReleaseStatus /// /// /// A containing the MusicBrainz /// ReleaseStatus for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "dash"/"----" box type. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseStatus { get {return GetDashBox("com.apple.iTunes","MusicBrainz Album Status");} set {SetDashBox("com.apple.iTunes", "MusicBrainz Album Status",value);} } /// /// Gets and sets the MusicBrainz ReleaseType /// /// /// A containing the MusicBrainz /// ReleaseType for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "dash"/"----" box type. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseType { get {return GetDashBox("com.apple.iTunes","MusicBrainz Album Type");} set {SetDashBox("com.apple.iTunes", "MusicBrainz Album Type",value);} } /// /// Gets and sets the MusicBrainz Release Country /// /// /// A containing the MusicBrainz /// ReleaseCountry for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "dash"/"----" box type. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseCountry { get {return GetDashBox("com.apple.iTunes","MusicBrainz Album Release Country");} set {SetDashBox("com.apple.iTunes", "MusicBrainz Album Release Country",value);} } /// /// Gets and sets a collection of pictures associated with /// the media represented by the current instance. /// /// /// A containing a collection of /// pictures associated with the media represented by the /// current instance or an empty array if none are present. /// /// /// This property is implemented using the "covr" data box. /// public override IPicture [] Pictures { get { List l = new List (); foreach (AppleDataBox box in DataBoxes(BoxType.Covr)) { Picture p = new Picture (box.Data); p.Type = PictureType.FrontCover; l.Add (p); } return (Picture []) l.ToArray (); } set { if (value == null || value.Length == 0) { ClearData (BoxType.Covr); return; } AppleDataBox [] boxes = new AppleDataBox [value.Length]; for (int i = 0; i < value.Length; i ++) { uint type = (uint) AppleDataBox.FlagType.ContainsData; if (value [i].MimeType == "image/jpeg") type = (uint) AppleDataBox.FlagType.ContainsJpegData; else if (value [i].MimeType == "image/png") type = (uint) AppleDataBox.FlagType.ContainsPngData; boxes [i] = new AppleDataBox (value [i].Data, type); } SetData(BoxType.Covr, boxes); } } /// /// Gets whether or not the current instance is empty. /// /// /// if the current instance does not /// any values. Otherwise . /// public override bool IsEmpty { get {return !ilst_box.HasChildren;} } /// /// Clears the values stored in the current instance. /// public override void Clear () { ilst_box.ClearChildren (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/FileParser.cs0000644000175000017500000004417711470571657023635 0ustar00rubenruben00000000000000// // FileParser.cs: Provides methods for reading important information from an // MPEG-4 file. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Mpeg4 { /// /// This class provides methods for reading important information /// from an MPEG-4 file. /// public class FileParser { #region Private Fields /// /// Contains the file to read from. /// private TagLib.File file; /// /// Contains the first header found in the file. /// private BoxHeader first_header; /// /// Contains the ISO movie header box. /// private IsoMovieHeaderBox mvhd_box; /// /// Contains the ISO user data boxes. /// private List udta_boxes = new List (); /// /// Contains the box headers from the top of the file to the /// "moov" box. /// private BoxHeader [] moov_tree; /// /// Contains the box headers from the top of the file to the /// "udta" box. /// private BoxHeader [] udta_tree; /// /// Contains the "stco" boxes found in the file. /// private List stco_boxes = new List (); /// /// Contains the "stsd" boxes found in the file. /// private List stsd_boxes = new List (); /// /// Contains the position at which the "mdat" box starts. /// private long mdat_start = -1; /// /// Contains the position at which the "mdat" box ends. /// private long mdat_end = -1; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified file. /// /// /// A object to perform operations /// on. /// /// /// is . /// /// /// does not start with a /// "ftyp" box. /// public FileParser (TagLib.File file) { if (file == null) throw new ArgumentNullException ("file"); this.file = file; first_header = new BoxHeader (file, 0); if (first_header.BoxType != "ftyp") throw new CorruptFileException ( "File does not start with 'ftyp' box."); } #endregion #region Public Properties /// /// Gets the movie header box read by the current instance. /// /// /// A object read by the /// current instance, or if not found. /// /// /// This value will only be set by calling . /// public IsoMovieHeaderBox MovieHeaderBox { get {return mvhd_box;} } /// /// Gets all user data boxes read by the current instance. /// /// /// A array read by the /// current instance. /// /// /// This value will only be set by calling and . /// public IsoUserDataBox [] UserDataBoxes { get {return udta_boxes.ToArray ();} } /// /// Gets the audio sample entry read by the current instance. /// /// /// A object read by the /// current instance, or if not found. /// /// /// This value will only be set by calling . /// public IsoAudioSampleEntry AudioSampleEntry { get { foreach (IsoSampleDescriptionBox box in stsd_boxes) foreach (Box sub in box.Children) { IsoAudioSampleEntry entry = sub as IsoAudioSampleEntry; if (entry != null) return entry; } return null; } } /// /// Gets the visual sample entry read by the current /// instance. /// /// /// A object read by the /// current instance, or if not found. /// /// /// This value will only be set by calling . /// public IsoVisualSampleEntry VisualSampleEntry { get { foreach (IsoSampleDescriptionBox box in stsd_boxes) foreach (Box sub in box.Children) { IsoVisualSampleEntry entry = sub as IsoVisualSampleEntry; if (entry != null) return entry; } return null; } } /// /// Gets the box headers for the first "moov" box and /// all parent boxes up to the top of the file as read by the /// current instance. /// /// /// A containing the headers for /// the first "moov" box and its parent boxes up to /// the top of the file, in the order they appear, or if none is present. /// /// /// This value is useful for overwriting box headers, and is /// only be set by calling . /// public BoxHeader [] MoovTree { get {return moov_tree;} } /// /// Gets the box headers for the first "udta" box and /// all parent boxes up to the top of the file as read by the /// current instance. /// /// /// A containing the headers for /// the first "udta" box and its parent boxes up to /// the top of the file, in the order they appear, or if none is present. /// /// /// This value is useful for overwriting box headers, and is /// only be set by calling . /// public BoxHeader [] UdtaTree { get {return udta_tree;} } /// /// Gets all chunk offset boxes read by the current instance. /// /// /// A containing all chunk offset boxes /// read by the current instance. /// /// /// These boxes contain offset information for media data in /// the current instance and can be devalidated by size /// change operations, in which case they need to be /// corrected. This value will only be set by calling . /// public Box [] ChunkOffsetBoxes { get {return stco_boxes.ToArray ();} } /// /// Gets the position at which the "mdat" box starts. /// /// /// A value containing the seek position /// at which the "mdat" box starts. /// /// /// The "mdat" box contains the media data for the /// file and is used for estimating the invariant data /// portion of the file. /// public long MdatStartPosition { get {return mdat_start;} } /// /// Gets the position at which the "mdat" box ends. /// /// /// A value containing the seek position /// at which the "mdat" box ends. /// /// /// The "mdat" box contains the media data for the /// file and is used for estimating the invariant data /// portion of the file. /// public long MdatEndPosition { get {return mdat_end;} } #endregion #region Public Methods /// /// Parses the file referenced by the current instance, /// searching for box headers that will be useful in saving /// the file. /// public void ParseBoxHeaders () { ResetFields (); ParseBoxHeaders (first_header.TotalBoxSize, file.Length, null); } /// /// Parses the file referenced by the current instance, /// searching for tags. /// public void ParseTag () { ResetFields (); ParseTag (first_header.TotalBoxSize, file.Length, null); } /// /// Parses the file referenced by the current instance, /// searching for tags and properties. /// public void ParseTagAndProperties () { ResetFields (); ParseTagAndProperties (first_header.TotalBoxSize, file.Length, null, null); } /// /// Parses the file referenced by the current instance, /// searching for chunk offset boxes. /// public void ParseChunkOffsets () { ResetFields (); ParseChunkOffsets (first_header.TotalBoxSize, file.Length); } #endregion #region Private Methods /// /// Parses boxes for a specified range, looking for headers. /// /// /// A value specifying the seek position /// at which to start reading. /// /// /// A value specifying the seek position /// at which to stop reading. /// /// /// A object containing all the parent /// handlers that apply to the range. /// private void ParseBoxHeaders (long start, long end, List parents) { BoxHeader header; for (long position = start; position < end; position += header.TotalBoxSize) { header = new BoxHeader (file, position); if (moov_tree == null && header.BoxType == BoxType.Moov) { List new_parents = AddParent ( parents, header); moov_tree = new_parents.ToArray (); ParseBoxHeaders ( header.HeaderSize + position, header.TotalBoxSize + position, new_parents); } else if (header.BoxType == BoxType.Mdia || header.BoxType == BoxType.Minf || header.BoxType == BoxType.Stbl || header.BoxType == BoxType.Trak) { ParseBoxHeaders ( header.HeaderSize + position, header.TotalBoxSize + position, AddParent (parents, header)); } else if (udta_tree == null && header.BoxType == BoxType.Udta) { // For compatibility, we still store the tree to the first udta // block. The proper way to get this info is from the individual // IsoUserDataBox.ParentTree member. udta_tree = AddParent (parents, header).ToArray (); } else if (header.BoxType == BoxType.Mdat) { mdat_start = position; mdat_end = position + header.TotalBoxSize; } if (header.TotalBoxSize == 0) break; } } /// /// Parses boxes for a specified range, looking for tags. /// /// /// A value specifying the seek position /// at which to start reading. /// /// /// A value specifying the seek position /// at which to stop reading. /// private void ParseTag (long start, long end, List parents) { BoxHeader header; for (long position = start; position < end; position += header.TotalBoxSize) { header = new BoxHeader (file, position); if (header.BoxType == BoxType.Moov) { ParseTag (header.HeaderSize + position, header.TotalBoxSize + position, AddParent (parents, header)); } else if (header.BoxType == BoxType.Mdia || header.BoxType == BoxType.Minf || header.BoxType == BoxType.Stbl || header.BoxType == BoxType.Trak) { ParseTag (header.HeaderSize + position, header.TotalBoxSize + position, AddParent (parents, header)); } else if (header.BoxType == BoxType.Udta) { IsoUserDataBox udtaBox = BoxFactory.CreateBox (file, header) as IsoUserDataBox; // Since we can have multiple udta boxes, save the parent for each one List new_parents = AddParent ( parents, header); udtaBox.ParentTree = new_parents.ToArray (); udta_boxes.Add(udtaBox); } else if (header.BoxType == BoxType.Mdat) { mdat_start = position; mdat_end = position + header.TotalBoxSize; } if (header.TotalBoxSize == 0) break; } } /// /// Parses boxes for a specified range, looking for tags and /// properties. /// /// /// A value specifying the seek position /// at which to start reading. /// /// /// A value specifying the seek position /// at which to stop reading. /// /// /// A object that applied to the /// range being searched. /// private void ParseTagAndProperties (long start, long end, IsoHandlerBox handler, List parents) { BoxHeader header; for (long position = start; position < end; position += header.TotalBoxSize) { header = new BoxHeader (file, position); ByteVector type = header.BoxType; if (type == BoxType.Moov) { ParseTagAndProperties (header.HeaderSize + position, header.TotalBoxSize + position, handler, AddParent (parents, header)); } else if (type == BoxType.Mdia || type == BoxType.Minf || type == BoxType.Stbl || type == BoxType.Trak) { ParseTagAndProperties ( header.HeaderSize + position, header.TotalBoxSize + position, handler, AddParent (parents, header)); } else if (type == BoxType.Stsd) { stsd_boxes.Add (BoxFactory.CreateBox ( file, header, handler)); } else if (type == BoxType.Hdlr) { handler = BoxFactory.CreateBox (file, header, handler) as IsoHandlerBox; } else if (mvhd_box == null && type == BoxType.Mvhd) { mvhd_box = BoxFactory.CreateBox (file, header, handler) as IsoMovieHeaderBox; } else if (type == BoxType.Udta) { IsoUserDataBox udtaBox = BoxFactory.CreateBox (file, header, handler) as IsoUserDataBox; // Since we can have multiple udta boxes, save the parent for each one List new_parents = AddParent ( parents, header); udtaBox.ParentTree = new_parents.ToArray (); udta_boxes.Add(udtaBox); } else if (type == BoxType.Mdat) { mdat_start = position; mdat_end = position + header.TotalBoxSize; } if (header.TotalBoxSize == 0) break; } } /// /// Parses boxes for a specified range, looking for chunk /// offset boxes. /// /// /// A value specifying the seek position /// at which to start reading. /// /// /// A value specifying the seek position /// at which to stop reading. /// private void ParseChunkOffsets (long start, long end) { BoxHeader header; for (long position = start; position < end; position += header.TotalBoxSize) { header = new BoxHeader (file, position); if (header.BoxType == BoxType.Moov) { ParseChunkOffsets ( header.HeaderSize + position, header.TotalBoxSize + position); } else if (header.BoxType == BoxType.Moov || header.BoxType == BoxType.Mdia || header.BoxType == BoxType.Minf || header.BoxType == BoxType.Stbl || header.BoxType == BoxType.Trak) { ParseChunkOffsets ( header.HeaderSize + position, header.TotalBoxSize + position); } else if (header.BoxType == BoxType.Stco || header.BoxType == BoxType.Co64) { stco_boxes.Add (BoxFactory.CreateBox ( file, header)); } else if (header.BoxType == BoxType.Mdat) { mdat_start = position; mdat_end = position + header.TotalBoxSize; } if (header.TotalBoxSize == 0) break; } } /// /// Resets all internal fields. /// private void ResetFields () { mvhd_box = null; udta_boxes.Clear (); moov_tree = null; udta_tree = null; stco_boxes.Clear (); stsd_boxes.Clear (); mdat_start = -1; mdat_end = -1; } #endregion #region Private Static Methods /// /// Adds a parent to the end of an existing list of parents. /// /// /// A object containing an existing /// list of parents. /// /// /// A object to add to the list. /// /// /// A new object containing the list /// of parents, including the added header. /// private static List AddParent (List parents, BoxHeader current) { List boxes = new List (); if (parents != null) boxes.AddRange (parents); boxes.Add (current); return boxes; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/File.cs0000644000175000017500000003330011470571657022442 0ustar00rubenruben00000000000000// // File.cs: Provides tagging and properties support for MPEG-4 files. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Mpeg4 { /// /// This class extends to provide tagging /// and properties support for MPEG-4 files. /// [SupportedMimeType("taglib/m4a", "m4a")] [SupportedMimeType("taglib/m4b", "m4b")] [SupportedMimeType("taglib/m4v", "m4v")] [SupportedMimeType("taglib/m4p", "m4p")] [SupportedMimeType("taglib/mp4", "mp4")] [SupportedMimeType("audio/mp4")] [SupportedMimeType("audio/x-m4a")] [SupportedMimeType("video/mp4")] [SupportedMimeType("video/x-m4v")] public class File : TagLib.File { #region Private Fields /// /// Contains the Apple tag. /// private AppleTag apple_tag; /// /// Contains the combined tag. /// /// /// TODO: Add support for ID3v2 tags. /// private CombinedTag tag; /// /// Contains the media properties. /// private Properties properties; /// /// Contains the ISO user data boxes. /// private List udta_boxes = new List (); #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : base (path) { Read (propertiesStyle); } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system with an average read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : this (path, ReadStyle.Average) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction) { Read (propertiesStyle); } /// /// Constructs and initializes a new instance of for a specified file abstraction with an /// average read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// public File (File.IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) { } #endregion #region Public Properties /// /// Gets a abstract representation of all tags stored in the /// current instance. /// /// /// A object representing all tags /// stored in the current instance. /// public override TagLib.Tag Tag { get {return tag;} } /// /// Gets the media properties of the file represented by the /// current instance. /// /// /// A object containing the /// media properties of the file represented by the current /// instance. /// public override TagLib.Properties Properties { get {return properties;} } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { if (udta_boxes.Count == 0) { IsoUserDataBox udtaBox = new IsoUserDataBox (); udta_boxes.Add(udtaBox); } // Try to get into write mode. Mode = File.AccessMode.Write; try { FileParser parser = new FileParser (this); parser.ParseBoxHeaders (); InvariantStartPosition = parser.MdatStartPosition; InvariantEndPosition = parser.MdatEndPosition; long size_change = 0; long write_position = 0; // To avoid rewriting udta blocks which might not have been modified, // the code here will work correctly if: // 1. There is a single udta for the entire file // - OR - // 2. There are multiple utdtas, but only 1 of them contains the Apple ILST box. // We should be OK in the vast majority of cases IsoUserDataBox udtaBox = FindAppleTagUdta(); if (null == udtaBox) udtaBox = new IsoUserDataBox (); ByteVector tag_data = udtaBox.Render (); // If we don't have a "udta" box to overwrite... if (udtaBox.ParentTree == null || udtaBox.ParentTree.Length == 0) { // Stick the box at the end of the moov box. BoxHeader moov_header = parser.MoovTree [ parser.MoovTree.Length - 1]; size_change = tag_data.Count; write_position = moov_header.Position + moov_header.TotalBoxSize; Insert (tag_data, write_position, 0); // Overwrite the parent box sizes. for (int i = parser.MoovTree.Length - 1; i >= 0; i --) size_change = parser.MoovTree [i ].Overwrite (this, size_change); } else { // Overwrite the old box. BoxHeader udta_header = udtaBox.ParentTree[udtaBox.ParentTree.Length - 1]; size_change = tag_data.Count - udta_header.TotalBoxSize; write_position = udta_header.Position; Insert (tag_data, write_position, udta_header.TotalBoxSize); // Overwrite the parent box sizes. for (int i = udtaBox.ParentTree.Length - 2; i >= 0; i --) size_change = udtaBox.ParentTree [i ].Overwrite (this, size_change); } // If we've had a size change, we may need to adjust // chunk offsets. if (size_change != 0) { // We may have moved the offset boxes, so we // need to reread. parser.ParseChunkOffsets (); InvariantStartPosition = parser.MdatStartPosition; InvariantEndPosition = parser.MdatEndPosition; foreach (Box box in parser.ChunkOffsetBoxes) { IsoChunkLargeOffsetBox co64 = box as IsoChunkLargeOffsetBox; if (co64 != null) { co64.Overwrite (this, size_change, write_position); continue; } IsoChunkOffsetBox stco = box as IsoChunkOffsetBox; if (stco != null) { stco.Overwrite (this, size_change, write_position); continue; } } } TagTypesOnDisk = TagTypes; } finally { Mode = File.AccessMode.Closed; } } /// /// Gets a tag of a specified type from the current instance, /// optionally creating a new tag if possible. /// /// /// A value indicating the /// type of tag to read. /// /// /// A value specifying whether or not to /// try and create the tag if one is not found. /// /// /// A object containing the tag that was /// found in or added to the current instance. If no /// matching tag was found and none was created, is returned. /// /// /// At the time of this writing, only /// is supported. All other tag types will be ignored. /// public override TagLib.Tag GetTag (TagTypes type, bool create) { if (type == TagTypes.Apple) { if (apple_tag == null && create) { IsoUserDataBox udtaBox = FindAppleTagUdta(); if (null == udtaBox) { udtaBox = new IsoUserDataBox(); } apple_tag = new AppleTag (udtaBox); tag.SetTags (apple_tag); } return apple_tag; } return null; } /// /// Removes a set of tag types from the current instance. /// /// /// A bitwise combined value /// containing tag types to be removed from the file. /// /// /// In order to remove all tags from a file, pass as . /// public override void RemoveTags (TagTypes types) { if ((types & TagTypes.Apple) != TagTypes.Apple || apple_tag == null) return; apple_tag.DetachIlst (); apple_tag = null; tag.SetTags (); } #endregion #region Private Methods /// /// Reads the file with a specified read style. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// private void Read (ReadStyle propertiesStyle) { // TODO: Support Id3v2 boxes!!! tag = new CombinedTag (); Mode = AccessMode.Read; try { FileParser parser = new FileParser (this); if (propertiesStyle == ReadStyle.None) parser.ParseTag (); else parser.ParseTagAndProperties (); InvariantStartPosition = parser.MdatStartPosition; InvariantEndPosition = parser.MdatEndPosition; udta_boxes.AddRange(parser.UserDataBoxes); // Ensure our collection contains at least a single empty box if (udta_boxes.Count == 0) { IsoUserDataBox dummy = new IsoUserDataBox (); udta_boxes.Add(dummy); } // Check if a udta with ILST actually exists if (IsAppleTagUdtaPresent ()) TagTypesOnDisk |= TagTypes.Apple; //There is an udta present with ILST info // Find the udta box with the Apple Tag ILST IsoUserDataBox udtaBox = FindAppleTagUdta(); if (null == udtaBox) { udtaBox = new IsoUserDataBox(); } apple_tag = new AppleTag (udtaBox); tag.SetTags (apple_tag); // If we're not reading properties, we're done. if (propertiesStyle == ReadStyle.None) { Mode = AccessMode.Closed; return; } // Get the movie header box. IsoMovieHeaderBox mvhd_box = parser.MovieHeaderBox; if(mvhd_box == null) { Mode = AccessMode.Closed; throw new CorruptFileException ( "mvhd box not found."); } IsoAudioSampleEntry audio_sample_entry = parser.AudioSampleEntry; IsoVisualSampleEntry visual_sample_entry = parser.VisualSampleEntry; // Read the properties. properties = new Properties (mvhd_box.Duration, audio_sample_entry, visual_sample_entry); } finally { Mode = AccessMode.Closed; } } /// /// Find the udta box within our collection that contains the Apple ILST data. /// /// /// If there is a single udta in a file, we return that. /// If there are multiple udtas, we search for the one that contains the ILST box. /// private IsoUserDataBox FindAppleTagUdta () { if (udta_boxes.Count == 1) return udta_boxes[0]; //Single udta - just return it foreach (IsoUserDataBox udtaBox in udta_boxes) { if (udtaBox.GetChild (BoxType.Meta) != null && udtaBox.GetChild (BoxType.Meta ).GetChild (BoxType.Ilst) != null) return udtaBox; } return null; } /// /// Returns true if there is a udta with ILST present in our collection /// private bool IsAppleTagUdtaPresent () { foreach (IsoUserDataBox udtaBox in udta_boxes) { if (udtaBox.GetChild (BoxType.Meta) != null && udtaBox.GetChild (BoxType.Meta ).GetChild (BoxType.Ilst) != null) return true; } return false; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/0000777000175000017500000000000011503407422022302 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/IsoHandlerBox.cs0000644000175000017500000001147711462100402025330 0ustar00rubenruben00000000000000// // IsoHandlerBox.cs: Provides an implementation of a ISO/IEC 14496-12 // HandlerBox. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg4 { /// /// This class extends to provide an /// implementation of a ISO/IEC 14496-12 FullBox. /// public class IsoHandlerBox : FullBox { #region Private Fields /// /// Contains the handler type. /// private ByteVector handler_type; /// /// Contains the handler name. /// private string name; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header and /// handler by reading the contents from a specified file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// /// /// is . /// public IsoHandlerBox (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, file, handler) { if (file == null) throw new System.ArgumentNullException ("file"); file.Seek (DataPosition + 4); ByteVector box_data = file.ReadBlock (DataSize - 4); handler_type = box_data.Mid (0, 4); int end = box_data.Find ((byte) 0, 16); if (end < 16) end = box_data.Count; name = box_data.ToString (StringType.UTF8, 16, end - 16); } /// /// Constructs and initializes a new instance of with a specified type and name. /// /// /// A object specifying a 4 byte /// handler type. /// /// /// A object specifying the handler /// name. /// /// /// is . /// /// /// is less than 4 bytes /// long. /// public IsoHandlerBox (ByteVector handlerType, string name) : base ("hdlr", 0, 0) { if (handlerType == null) throw new ArgumentNullException ("handlerType"); if (handlerType.Count < 4) throw new ArgumentException ( "The handler type must be four bytes long.", "handlerType"); this.handler_type = handlerType.Mid (0,4); this.name = name; } #endregion #region Public Properties /// /// Gets the data contained in the current instance. /// /// /// A object containing the /// rendered version of the data contained in the current /// instance. /// public override ByteVector Data { get { ByteVector output = new ByteVector (4); output.Add (handler_type); output.Add (new ByteVector (12)); output.Add (ByteVector.FromString (name, StringType.UTF8)); output.Add (new ByteVector (2)); return output; } } /// /// Gets the handler type of the current instance. /// /// /// A object containing the /// handler type of the current instance. /// public ByteVector HandlerType { get {return handler_type;} } /// /// Gets the name of the current instance. /// /// /// A object containing the name of the /// current instance. /// public string Name { get {return name;} } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/FullBox.cs0000644000175000017500000001371311462100402024175 0ustar00rubenruben00000000000000// // FullBox.cs: Provides an implementation of a ISO/IEC 14496-12 FullBox. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg4 { /// /// This class extends to provide an /// implementation of a ISO/IEC 14496-12 FullBox. /// public abstract class FullBox : Box { #region Private Fields /// /// Contains the box version. /// private byte version; /// /// Contains the box flags. /// private uint flags; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header and handler by /// reading the contents from a specified file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// /// /// is . /// protected FullBox (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, handler) { if (file == null) throw new ArgumentNullException ("file"); file.Seek (base.DataPosition); ByteVector header_data = file.ReadBlock (4); version = header_data [0]; flags = header_data.Mid (1, 3).ToUInt (); } /// /// Constructs and initializes a new instance of with a provided header, version, and /// flags. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A value containing the version of the /// new instance. /// /// /// A value containing the flags for the /// new instance. /// protected FullBox (BoxHeader header, byte version, uint flags) : base (header) { this.version = version; this.flags = flags; } /// /// Constructs and initializes a new instance of with a provided header, version, and /// flags. /// /// /// A object containing the four /// byte box type. /// /// /// A value containing the version of the /// new instance. /// /// /// A value containing the flags for the /// new instance. /// /// /// is of /// equal to "uuid". /// /// /// isn't exactly 4 bytes long. /// protected FullBox (ByteVector type, byte version, uint flags) : this (new BoxHeader (type), version, flags) { } #endregion #region Public Properties /// /// Gets the position of the data contained in the current /// instance, after any box specific headers. /// /// /// A value containing the position of /// the data contained in the current instance. /// protected override long DataPosition { get {return base.DataPosition + 4;} } /// /// Gets and sets the version number of the current instance. /// /// /// A value containing the version /// number of the current instance. /// public uint Version { get {return version;} set {version = (byte) value;} } /// /// Gets and sets the flags that apply to the current /// instance. /// /// /// A value containing the flags that /// apply to the current instance. /// public uint Flags { get {return flags;} set {flags = value;} } #endregion #region Protected Methods /// /// Renders the current instance, including its children, to /// a new object, preceeding the /// contents with a specified block of data. /// /// /// A object containing box /// specific header data to preceed the content. /// /// /// A object containing the /// rendered version of the current instance. /// protected override ByteVector Render (ByteVector topData) { ByteVector output = new ByteVector ((byte) version); output.Add (ByteVector.FromUInt (flags).Mid (1,3)); output.Add (topData); return base.Render (output); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/AppleAdditionalInfoBox.cs0000644000175000017500000000663311462100402027144 0ustar00rubenruben00000000000000// // AppleAdditionalInfoBox.cs: Provides an implementation of an Apple // AdditionalInfoBox. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg4 { /// /// This class extends to provide an /// implementation of an Apple AdditionalInfoBox. /// public class AppleAdditionalInfoBox : FullBox { #region Private Fields /// /// Contains the box data. /// private ByteVector data; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header /// and handler by reading the contents from a specified /// file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// /// /// is . /// public AppleAdditionalInfoBox (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, file, handler) { Data = file.ReadBlock (DataSize); } /// /// Constructs and initializes a new instance of using specified header, version and flags /// /// /// /// public AppleAdditionalInfoBox (ByteVector header, byte version, uint flags) : base (header, version, flags) { } #endregion #region Public Properties /// /// Gets and sets the data contained in the current instance. /// /// /// A object containing the data /// contained in the current instance. /// public override ByteVector Data { get {return data;} set {data = value != null ? value : new ByteVector ();} } /// /// Gets and sets the text contained in the current instance. /// /// /// A object containing the text /// contained in the current instance. /// public string Text { get {return Data.ToString (StringType.Latin1);} set { Data = ByteVector.FromString (value, StringType.Latin1); } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/AppleItemListBox.cs0000644000175000017500000000564411462100402026013 0ustar00rubenruben00000000000000// // AppleItemListBox.cs: Provides an implementation of an Apple ItemListBox. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Mpeg4 { /// /// This class extends to provide an /// implementation of an Apple ItemListBox. /// public class AppleItemListBox : Box { #region Private Fields /// /// Contains the children of the box. /// private IEnumerable children; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header and /// handler by reading the contents from a specified file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// /// /// is . /// public AppleItemListBox (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, handler) { if (file == null) throw new ArgumentNullException ("file"); children = LoadChildren (file); } /// /// Constructs and initializes a new instance of with no children. /// public AppleItemListBox () : base ("ilst") { children = new List (); } #endregion #region Public Properties /// /// Gets the children of the current instance. /// /// /// A object enumerating the /// children of the current instance. /// public override IEnumerable Children { get {return children;} } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/IsoMovieHeaderBox.cs0000644000175000017500000001526111462100402026136 0ustar00rubenruben00000000000000// // IsoMovieHeaderBox.cs: Provides an implementation of a ISO/IEC 14496-12 // MovieHeaderBox. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg4 { /// /// This class extends to provide an /// implementation of a ISO/IEC 14496-12 MovieHeaderBox. /// public class IsoMovieHeaderBox : FullBox { #region Private Fields /// /// Contains the creation time of the movie. /// private ulong creation_time; /// /// Contains the modification time of the movie. /// private ulong modification_time; /// /// Contains the timescale. /// private uint timescale; /// /// Contains the duration. /// private ulong duration; /// /// Contains the rate. /// private uint rate; /// /// Contains the volume. /// private ushort volume; /// /// Contains the next track ID. /// private uint next_track_id; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header and /// handler by reading the contents from a specified file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// /// /// is . /// public IsoMovieHeaderBox (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, file, handler) { if (file == null) throw new ArgumentNullException ("file"); int bytes_remaining = DataSize; ByteVector data; if (Version == 1) { // Read version one (large integers). data = file.ReadBlock (Math.Min (28, bytes_remaining)); if (data.Count >= 8) creation_time = data.Mid (0, 8).ToULong (); if (data.Count >= 16) modification_time = data.Mid (8, 8).ToULong (); if (data.Count >= 20) timescale = data.Mid (16, 4).ToUInt (); if (data.Count >= 28) duration = data.Mid (20, 8).ToULong (); bytes_remaining -= 28; } else { // Read version zero (normal integers). data = file.ReadBlock (Math.Min (16, bytes_remaining)); if (data.Count >= 4) creation_time = data.Mid (0, 4).ToUInt (); if (data.Count >= 8) modification_time = data.Mid (4, 4).ToUInt (); if (data.Count >= 12) timescale = data.Mid (8, 4).ToUInt (); if (data.Count >= 16) duration = data.Mid (12, 4).ToUInt (); bytes_remaining -= 16; } data = file.ReadBlock (Math.Min (6, bytes_remaining)); if (data.Count >= 4) rate = data.Mid (0, 4).ToUInt (); if (data.Count >= 6) volume = data.Mid (4, 2).ToUShort (); file.Seek (file.Tell + 70); bytes_remaining -= 76; data = file.ReadBlock (Math.Min (4, bytes_remaining)); if (data.Count >= 4) next_track_id = data.Mid (0, 4).ToUInt (); } #endregion #region Public Properties /// /// Gets the creation time of movie represented by the /// current instance. /// /// /// A value containing the creation /// time of the movie represented by the current instance. /// public DateTime CreationTime { get { return new System.DateTime (1904, 1, 1, 0, 0, 0).AddTicks ((long)(10000000 * creation_time)); } } /// /// Gets the modification time of movie represented by the /// current instance. /// /// /// A value containing the /// modification time of the movie represented by the current /// instance. /// public DateTime ModificationTime { get { return new System.DateTime (1904, 1, 1, 0, 0, 0).AddTicks ((long)(10000000 * modification_time)); } } /// /// Gets the duration of the movie represented by the current /// instance. /// /// /// A value containing the duration /// of the movie represented by the current instance. /// public TimeSpan Duration { get { // The length is the number of ticks divided by // ticks per second. return TimeSpan.FromSeconds ((double) duration / (double) timescale); } } /// /// Gets the playback rate of the movie represented by the /// current instance. /// /// /// A value containing the playback /// rate of the movie represented by the current instance. /// public double Rate { get {return ((double) rate) / ((double) 0x10000);} } /// /// Gets the playback volume of the movie represented by the /// current instance. /// /// /// A value containing the playback /// volume of the movie represented by the current instance. /// public double Volume { get {return ((double) volume) / ((double) 0x100);} } /// /// Gets the ID of the next track in the movie represented by /// the current instance. /// /// /// A value containing the ID of the next /// track in the movie represented by the current instance. /// public uint NextTrackId { get {return next_track_id;} } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/IsoFreeSpaceBox.cs0000644000175000017500000000642611462100402025606 0ustar00rubenruben00000000000000// // IsoFreeSpaceBox.cs: Provides an implementation of a ISO/IEC 14496-12 // FreeSpaceBox. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg4 { /// /// This class extends to provide an /// implementation of a ISO/IEC 14496-12 FreeSpaceBox. /// public class IsoFreeSpaceBox : Box { #region Private Fields /// /// Contains the size of the padding. /// private long padding; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header and /// handler by reading the contents from a specified file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// public IsoFreeSpaceBox (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, handler) { padding = DataSize; } /// /// Constructs and initializes a new instance of to occupy a specified number of /// bytes. /// /// /// A value specifying the number of /// bytes the new instance should occupy when rendered. /// public IsoFreeSpaceBox (long padding) : base ("free") { PaddingSize = padding; } #endregion #region Public Properties /// /// Gets and sets the data contained in the current instance. /// /// /// A object containing the data /// contained in the current instance. /// public override ByteVector Data { get {return new ByteVector ((int) padding);} set {padding = (value != null) ? value.Count : 0;} } /// /// Gets and sets the size the current instance will occupy /// when rendered. /// /// /// A value containing the size the /// current instance will occupy when rendered. /// public long PaddingSize { get {return padding + 8;} set {padding = value - 8;} } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/IsoVisualSampleEntry.cs0000644000175000017500000001226411462100402026724 0ustar00rubenruben00000000000000// // IsoVisualSampleEntry.cs: Provides an implementation of a ISO/IEC 14496-12 // VisualSampleEntry and support for reading MPEG-4 video properties. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Globalization; namespace TagLib.Mpeg4 { /// /// This class extends and implements /// to provide an implementation of a /// ISO/IEC 14496-12 VisualSampleEntry and support for reading MPEG-4 /// video properties. /// public class IsoVisualSampleEntry : IsoSampleEntry, IVideoCodec { #region Private Fields /// /// Contains the width of the visual. /// private ushort width; /// /// Contains the height of the visual. /// private ushort height; /* /// /// Contains the children of the box. /// private BoxList children; */ #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header and /// handler by reading the contents from a specified file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// /// /// is . /// public IsoVisualSampleEntry (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, file, handler) { file.Seek (base.DataPosition + 16); width = file.ReadBlock (2).ToUShort (); height = file.ReadBlock (2).ToUShort (); /* TODO: What are the children anyway? children = LoadChildren (file); */ } #endregion #region Public Properties /// /// Gets the position of the data contained in the current /// instance, after any box specific headers. /// /// /// A value containing the position of /// the data contained in the current instance. /// protected override long DataPosition { get {return base.DataPosition + 62;} } /* /// /// Gets the children of the current instance. /// /// /// A object enumerating the /// children of the current instance. /// public override BoxList Children { get {return children;} } */ #endregion #region IVideoCodec Properties /// /// Gets the duration of the media represented by the current /// instance. /// /// /// Always . /// public TimeSpan Duration { get {return TimeSpan.Zero;} } /// /// Gets the types of media represented by the current /// instance. /// /// /// Always . /// public MediaTypes MediaTypes { get {return MediaTypes.Video;} } /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public string Description { get { return string.Format ( CultureInfo.InvariantCulture, "MPEG-4 Video ({0})", BoxType); } } /// /// Gets the width of the video represented by the current /// instance. /// /// /// A containing the width of the video /// represented by the current instance. /// public int VideoWidth { get {return width;} } /// /// Gets the height of the video represented by the current /// instance. /// /// /// A containing the height of the video /// represented by the current instance. /// public int VideoHeight { get {return height;} } #endregion } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/IsoAudioSampleEntry.cs0000644000175000017500000001476311462100402026530 0ustar00rubenruben00000000000000// // IsoAudioSampleEntry.cs: Provides an implementation of a ISO/IEC 14496-12 // AudioSampleEntry and support for reading MPEG-4 video properties. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using System.Globalization; namespace TagLib.Mpeg4 { /// /// This class extends and implements /// to provide an implementation of a /// ISO/IEC 14496-12 AudioSampleEntry and support for reading MPEG-4 /// video properties. /// public class IsoAudioSampleEntry : IsoSampleEntry, IAudioCodec { #region Private Fields /// /// Contains the channel count. /// private ushort channel_count; /// /// Contains the sample size. /// private ushort sample_size; /// /// Contains the sample rate. /// private uint sample_rate; /// /// Contains the children of the box. /// private IEnumerable children; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header and /// handler by reading the contents from a specified file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// /// /// is . /// public IsoAudioSampleEntry (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, file, handler) { if (file == null) throw new ArgumentNullException ("file"); file.Seek (base.DataPosition + 8); channel_count = file.ReadBlock (2).ToUShort (); sample_size = file.ReadBlock (2).ToUShort (); file.Seek (base.DataPosition + 16); sample_rate = file.ReadBlock (4).ToUInt (); children = LoadChildren (file); } #endregion #region Public Properties /// /// Gets the position of the data contained in the current /// instance, after any box specific headers. /// /// /// A value containing the position of /// the data contained in the current instance. /// protected override long DataPosition { get {return base.DataPosition + 20;} } /// /// Gets the children of the current instance. /// /// /// A object enumerating the /// children of the current instance. /// public override IEnumerable Children { get {return children;} } #endregion #region IAudioCodec Properties /// /// Gets the duration of the media represented by the current /// instance. /// /// /// Always . /// public TimeSpan Duration { get {return TimeSpan.Zero;} } /// /// Gets the types of media represented by the current /// instance. /// /// /// Always . /// public MediaTypes MediaTypes { get {return MediaTypes.Audio;} } /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public string Description { get { return string.Format ( CultureInfo.InvariantCulture, "MPEG-4 Audio ({0})", BoxType); } } /// /// Gets the bitrate of the audio represented by the current /// instance. /// /// /// A value containing a bitrate of the /// audio represented by the current instance. /// public int AudioBitrate { get { AppleElementaryStreamDescriptor esds = GetChildRecursively ("esds") as AppleElementaryStreamDescriptor; // If we don't have an stream descriptor, we // don't know what's what. if (esds == null) return 0; // Return from the elementary stream descriptor. return (int) esds.AverageBitrate; } } /// /// Gets the sample rate of the audio represented by the /// current instance. /// /// /// A value containing the sample rate of /// the audio represented by the current instance. /// public int AudioSampleRate { get {return (int)(sample_rate >> 16);} } /// /// Gets the number of channels in the audio represented by /// the current instance. /// /// /// A value containing the number of /// channels in the audio represented by the current /// instance. /// public int AudioChannels { get {return channel_count;} } /// /// Gets the sample size of the audio represented by the /// current instance. /// /// /// A value containing the sample size of /// the audio represented by the current instance. /// public int AudioSampleSize { get {return sample_size;} } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/UnknownBox.cs0000644000175000017500000000520011462100402024722 0ustar00rubenruben00000000000000// // UnknownBox.cs: Provides a simple implementation of a box of unknown type. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg4 { /// /// This class extends to provide a simple /// implementation of a box of unknown type. /// public class UnknownBox : Box { #region Private Fields /// /// Contains the box's data. /// private ByteVector data; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header and handler /// by reading the contents from a specified file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// /// /// is . /// public UnknownBox (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, handler) { if (file == null) throw new ArgumentNullException ("file"); this.data = LoadData (file); } #endregion #region Public Properties /// /// Gets and sets the box data contained in the current /// instance. /// /// /// A object containing the box /// data contained in the current instance. /// public override ByteVector Data { get {return data;} set {data = value;} } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/AppleElementaryStreamDescriptor.cs0000644000175000017500000002135311462100402031123 0ustar00rubenruben00000000000000// // AppleElementaryStreamDescriptor.cs: Provides an implementation of an Apple // ItemListBox. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg4 { /// /// This class extends to provide an /// implementation of an Apple ElementaryStreamDescriptor. /// /// /// This box may appear as a child of a and provided further information /// about an audio stream. /// public class AppleElementaryStreamDescriptor : FullBox { #region Private Fields /// /// Contains the stream ID. /// private ushort es_id; /// /// Contains the stream priority. /// private byte stream_priority; /// /// Contains the object type ID. /// private byte object_type_id; /// /// Contains the stream type. /// private byte stream_type; /// /// Contains the bugger size. /// private uint buffer_size_db; /// /// Contains the maximum bitrate. /// private uint max_bitrate; /// /// Contains the average bitrate. /// private uint average_bitrate; /// /// Contains the decoder config. /// private ByteVector decoder_config; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided /// header and handler by reading the contents from a /// specified file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// /// /// is . /// /// /// Valid data could not be read. /// public AppleElementaryStreamDescriptor (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, file, handler) { int offset = 0; ByteVector box_data = file.ReadBlock (DataSize); decoder_config = new ByteVector (); // Elementary Stream Descriptor Tag if (box_data [offset ++] == 3) { // We have a descriptor tag. Check that it's at // least 20 long. if (ReadLength (box_data, ref offset) < 20) throw new CorruptFileException ( "Insufficient data present."); es_id = box_data.Mid (offset, 2).ToUShort (); offset += 2; stream_priority = box_data [offset ++]; } else { // The tag wasn't found, so the next two byte // are the ID, and after that, business as // usual. es_id = box_data.Mid (offset, 2).ToUShort (); offset += 2; } // Verify that the next data is the Decoder // Configuration Descriptor Tag and escape if it won't // work out. if (box_data [offset ++] != 4) throw new CorruptFileException ( "Could not identify decoder configuration descriptor."); // Check that it's at least 15 long. if (ReadLength (box_data, ref offset) < 15) throw new CorruptFileException ( "Could not read data. Too small."); // Read a lot of good info. object_type_id = box_data [offset ++]; stream_type = box_data [offset ++]; buffer_size_db = box_data.Mid (offset, 3).ToUInt (); offset += 3; max_bitrate = box_data.Mid (offset, 4).ToUInt (); offset += 4; average_bitrate = box_data.Mid (offset, 4).ToUInt (); offset += 4; // Verify that the next data is the Decoder Specific // Descriptor Tag and escape if it won't work out. if (box_data [offset ++] != 5) throw new CorruptFileException ( "Could not identify decoder specific descriptor."); // The rest of the info is decoder specific. uint length = ReadLength (box_data, ref offset); decoder_config = box_data.Mid (offset, (int) length); } #endregion #region Public Properties /// /// Gets the ID of the stream described by the current /// instance. /// /// /// A value containing the ID of the /// stream described by the current instance. /// public ushort StreamId { get {return es_id;} } /// /// Gets the priority of the stream described by the current /// instance. /// /// /// A value containing the priority of /// the stream described by the current instance. /// public byte StreamPriority { get {return stream_priority;} } /// /// Gets the object type ID of the stream described by the /// current instance. /// /// /// A value containing the object type ID /// of the stream described by the current instance. /// public byte ObjectTypeId { get {return object_type_id;} } /// /// Gets the type the stream described by the current /// instance. /// /// /// A value containing the type the /// stream described by the current instance. /// public byte StreamType { get {return stream_type;} } /// /// Gets the buffer size DB value the stream described by the /// current instance. /// /// /// A value containing the buffer size DB /// value the stream described by the current instance. /// public uint BufferSizeDB { get {return buffer_size_db;} } /// /// Gets the maximum bitrate the stream described by the /// current instance. /// /// /// A value containing the maximum /// bitrate the stream described by the current instance. /// public uint MaximumBitrate { get {return max_bitrate / 1000;} } /// /// Gets the maximum average the stream described by the /// current instance. /// /// /// A value containing the average /// bitrate the stream described by the current instance. /// public uint AverageBitrate { get {return average_bitrate / 1000;} } /// /// Gets the decoder config data of stream described by the /// current instance. /// /// /// A object containing the decoder /// config data of the stream described by the current /// instance. /// public ByteVector DecoderConfig { get {return decoder_config;} } #endregion #region Private Methods /// /// Reads a section length and updates the offset to the end /// of of the length block. /// /// /// A object to read from. /// /// /// A value reference specifying the /// offset at which to read. This value gets updated to the /// position following the size data. /// /// /// A value containing the length that /// was read. /// private static uint ReadLength (ByteVector data, ref int offset) { byte b; int end = offset + 4; uint length = 0; do { b = data [offset ++]; length = (uint) (length << 7) | (uint) (b & 0x7f); } while ((b & 0x80) != 0 && offset <= end); return length; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/IsoUserDataBox.cs0000644000175000017500000000713511470571657025506 0ustar00rubenruben00000000000000// // IsoUserDataBox.cs: Provides an implementation of a ISO/IEC 14496-12 // UserDataBox. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Mpeg4 { /// /// This class extends to provide an /// implementation of a ISO/IEC 14496-12 UserDataBox. /// public class IsoUserDataBox : Box { #region Private Fields /// /// Contains the children of the box. /// private IEnumerable children; /// /// Contains the box headers from the top of the file to the /// current udta box. /// private BoxHeader [] parent_tree; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header and /// handler by reading the contents from a specified file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// /// /// is . /// public IsoUserDataBox (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, handler) { if (file == null) throw new ArgumentNullException ("file"); children = LoadChildren (file); } /// /// Constructs and initializes a new instance of with no children. /// public IsoUserDataBox () : base ("udta") { children = new List (); } #endregion #region Public Properties /// /// Gets the children of the current instance. /// /// /// A object enumerating the /// children of the current instance. /// public override IEnumerable Children { get {return children;} } /// /// Gets the box headers for the current "udta" box and /// all parent boxes up to the top of the file. /// /// /// A containing the headers for /// the current "udta" box and its parent boxes up to /// the top of the file, in the order they appear, or if none is present. /// public BoxHeader [] ParentTree { get {return parent_tree;} set {parent_tree = value;} } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/IsoMetaBox.cs0000644000175000017500000000730411462100402024633 0ustar00rubenruben00000000000000// // IsoMetaBox.cs: Provides an implementation of a ISO/IEC 14496-12 MetaBox. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Mpeg4 { /// /// This class extends to provide an /// implementation of a ISO/IEC 14496-12 MetaBox. /// public class IsoMetaBox : FullBox { #region Private Fields /// /// Contains the children of the box. /// private IEnumerable children; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header and /// handler by reading the contents from a specified file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// /// /// is . /// public IsoMetaBox (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, file, handler) { children = LoadChildren (file); } /// /// Constructs and initializes a new instance of with a specified handler. /// /// /// A object specifying a 4 byte /// handler type. /// /// /// A object specifying the handler /// name. /// /// /// is . /// /// /// is less than 4 bytes /// long. /// public IsoMetaBox (ByteVector handlerType, string handlerName) : base ("meta", 0, 0) { if (handlerType == null) throw new ArgumentNullException ("handlerType"); if (handlerType.Count < 4) throw new ArgumentException ( "The handler type must be four bytes long.", "handlerType"); children = new List (); AddChild (new IsoHandlerBox (handlerType, handlerName)); } #endregion #region Public Properties /// /// Gets the children of the current instance. /// /// /// A object enumerating the /// children of the current instance. /// public override IEnumerable Children { get {return children;} } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/IsoChunkOffsetBox.cs0000644000175000017500000001267111462100402026167 0ustar00rubenruben00000000000000// // IsoChunkOffsetBox.cs: Provides an implementation of a ISO/IEC 14496-12 // ChunkOffsetBox. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg4 { /// /// This class extends to provide an /// implementation of a ISO/IEC 14496-12 ChunkOffsetBox. /// /// /// and contain offsets of media data /// within the file. As such, if the file changes by even one byte, /// these values are devalidatated and the box will have to be /// overwritten to maintain playability. /// public class IsoChunkOffsetBox : FullBox { #region Private Fields /// /// Contains the chunk offsets. /// private uint [] offsets; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header and /// handler by reading the contents from a specified file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// public IsoChunkOffsetBox (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, file, handler) { ByteVector box_data = file.ReadBlock (DataSize); offsets = new uint [(int) box_data.Mid (0, 4).ToUInt ()]; for (int i = 0; i < offsets.Length; i ++) offsets [i] = box_data.Mid (4 + i * 4, 4).ToUInt (); } #endregion #region Public Properties /// /// Gets and sets the data contained in the current instance. /// /// /// A object containing the data /// contained in the current instance. /// public override ByteVector Data { get { ByteVector output = ByteVector.FromUInt ((uint) offsets.Length); for (int i = 0; i < offsets.Length; i ++) output.Add (ByteVector.FromUInt ( offsets [i])); return output; } } /// /// Gets the offset table contained in the current instance. /// /// /// A containing the offset table /// contained in the current instance. /// public uint [] Offsets { get {return offsets;} } #endregion #region Public Methods /// /// Overwrites the existing box in the file after updating /// the table for a size change. /// /// /// A object containing the file to which /// the current instance belongs and wo which modifications /// must be applied. /// /// /// A value containing the size /// change that occurred in the file. /// /// /// A value containing the position in /// the file after which offsets will be invalidated. If an /// offset is before this point, it won't be updated. /// /// /// is . /// public void Overwrite (File file, long sizeDifference, long after) { if (file == null) throw new ArgumentNullException ("file"); file.Insert (Render (sizeDifference, after), Header.Position, Size); } /// /// Renders the current instance after updating the table for /// a size change. /// /// /// A value containing the size /// change that occurred in the file. /// /// /// A value containing the position in /// the file after which offsets will be invalidated. If an /// offset is before this point, it won't be updated. /// /// /// A object containing the /// rendered version of the file. /// public ByteVector Render (long sizeDifference, long after) { for (int i = 0; i < offsets.Length; i ++) if (offsets [i] >= (uint) after) offsets [i] = (uint) (offsets [i] + sizeDifference); return Render (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/AppleAnnotationBox.cs0000644000175000017500000000613111462100402026363 0ustar00rubenruben00000000000000// // AppleAnnotationBox.cs: Provides an implementation of an Apple AnnotationBox. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Mpeg4 { /// /// This class extends to provide an /// implementation of an Apple AnnotationBox. /// public class AppleAnnotationBox : Box { #region Private Fields /// /// Contains the children of the box. /// private IEnumerable children; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header and /// handler by reading the contents from a specified file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// /// /// is . /// public AppleAnnotationBox (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, handler) { if (file == null) throw new ArgumentNullException ("file"); children = LoadChildren (file); } /// /// Constructs and initializes a new instance of of specified type with no /// children. /// /// /// A object containing a 4-byte /// box type. /// public AppleAnnotationBox (ByteVector type) : base (type) { children = new List (); } #endregion #region Public Properties /// /// Gets the children of the current instance. /// /// /// A object enumerating the /// children of the current instance. /// public override IEnumerable Children { get {return children;} } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/IsoSampleEntry.cs0000644000175000017500000000612711462100402025541 0ustar00rubenruben00000000000000// // IsoSampleEntry.cs: Provides an implementation of a ISO/IEC 14496-12 // SampleEntry. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg4 { /// /// This class extends to provide an /// implementation of a ISO/IEC 14496-12 SampleEntry. /// public class IsoSampleEntry : Box { #region Private Fields /// /// Contains the data reference index. /// private ushort data_reference_index; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header and /// handler by reading the contents from a specified file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// /// /// is . /// public IsoSampleEntry (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, handler) { if (file == null) throw new ArgumentNullException ("file"); file.Seek (base.DataPosition + 6); data_reference_index = file.ReadBlock (2).ToUShort (); } #endregion #region Public Properties /// /// Gets the position of the data contained in the current /// instance, after any box specific headers. /// /// /// A value containing the position of /// the data contained in the current instance. /// protected override long DataPosition { get {return base.DataPosition + 8;} } /// /// Gets the data reference index of the current instance. /// /// /// A value containing the data /// reference index of the current instance. /// public ushort DataReferenceIndex { get {return data_reference_index;} } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/IsoChunkLargeOffsetBox.cs0000644000175000017500000001304011462100402027131 0ustar00rubenruben00000000000000// // IsoChunkLargeOffsetBox.cs: Provides an implementation of a ISO/IEC 14496-12 // ChunkLargeOffsetBox. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg4 { /// /// This class extends to provide an /// implementation of a ISO/IEC 14496-12 ChunkLargeOffsetBox. /// /// /// and contain offsets of media data /// within the file. As such, if the file changes by even one byte, /// these values are devalidatated and the box will have to be /// overwritten to maintain playability. /// public class IsoChunkLargeOffsetBox : FullBox { #region Private Fields /// /// Contains the chunk offsets. /// private ulong [] offsets; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header /// and handler by reading the contents from a specified /// file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// public IsoChunkLargeOffsetBox (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, file, handler) { ByteVector box_data = file.ReadBlock (DataSize); offsets = new ulong [(int) box_data.Mid (0, 4).ToUInt ()]; for (int i = 0; i < offsets.Length; i ++) offsets [i] = box_data.Mid (4 + i * 8, 8).ToULong (); } #endregion #region Public Properties /// /// Gets and sets the data contained in the current instance. /// /// /// A object containing the data /// contained in the current instance. /// public override ByteVector Data { get { ByteVector output = ByteVector.FromUInt ((uint) offsets.Length); for (int i = 0; i < offsets.Length; i ++) output.Add (ByteVector.FromULong ( offsets [i])); return output; } } /// /// Gets the offset table contained in the current instance. /// /// /// A containing the offset table /// contained in the current instance. /// public ulong [] Offsets { get {return offsets;} } #endregion #region Public Methods /// /// Overwrites the existing box in the file after updating /// the table for a size change. /// /// /// A object containing the file to which /// the current instance belongs and wo which modifications /// must be applied. /// /// /// A value containing the size /// change that occurred in the file. /// /// /// A value containing the position in /// the file after which offsets will be invalidated. If an /// offset is before this point, it won't be updated. /// /// /// is . /// public void Overwrite (File file, long sizeDifference, long after) { if (file == null) throw new ArgumentNullException ("file"); file.Insert (Render (sizeDifference, after), Header.Position, Size); } /// /// Renders the current instance after updating the table for /// a size change. /// /// /// A value containing the size /// change that occurred in the file. /// /// /// A value containing the position in /// the file after which offsets will be invalidated. If an /// offset is before this point, it won't be updated. /// /// /// A object containing the /// rendered version of the file. /// public ByteVector Render (long sizeDifference, long after) { for (int i = 0; i < offsets.Length; i ++) if (offsets [i] >= (ulong) after) offsets [i] = (ulong) ((long) offsets [i] + sizeDifference); return Render (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/IsoSampleTableBox.cs0000644000175000017500000000533311462100402026136 0ustar00rubenruben00000000000000// // IsoSampleTableBox.cs: Provides an implementation of a ISO/IEC 14496-12 // SampleTableBox. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Mpeg4 { /// /// This class extends to provide an /// implementation of a ISO/IEC 14496-12 SampleTableBox. /// public class IsoSampleTableBox : Box { #region Private Fields /// /// Contains the children of the box. /// private IEnumerable children; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header and /// handler by reading the contents from a specified file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// /// /// is . /// public IsoSampleTableBox (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, handler) { if (file == null) throw new ArgumentNullException ("file"); children = LoadChildren (file); } #endregion #region Public Properties /// /// Gets the children of the current instance. /// /// /// A object enumerating the /// children of the current instance. /// public override IEnumerable Children { get {return children;} } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/AppleDataBox.cs0000644000175000017500000001271111462100402025123 0ustar00rubenruben00000000000000// // AppleDataBox.cs: Provides an implementation of an Apple DataBox. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg4 { /// /// This class extends to provide an /// implementation of an Apple DataBox. /// public class AppleDataBox : FullBox { #region Enums /// /// Specifies the type of data contained in a box. /// public enum FlagType { /// /// The box contains UTF-8 text. /// ContainsText = 0x01, /// /// The box contains binary data. /// ContainsData = 0x00, /// /// The box contains data for a tempo box. /// ForTempo = 0x15, /// /// The box contains a raw JPEG image. /// ContainsJpegData = 0x0D, /// /// The box contains a raw PNG image. /// ContainsPngData = 0x0E } #endregion #region Private Fields /// /// Contains the box data. /// private ByteVector data; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header and handler /// by reading the contents from a specified file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// /// /// is . /// public AppleDataBox (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, file, handler) { Data = LoadData (file); } /// /// Constructs and initializes a new instance of with specified data and flags. /// /// /// A object containing the data to /// store in the new instance. /// /// /// A value containing flags to use for /// the new instance. /// public AppleDataBox (ByteVector data, uint flags) : base ("data", 0, flags) { Data = data; } #endregion #region Public Properties /// /// Gets the position of the data contained in the current /// instance, after any box specific headers. /// /// /// A value containing the position of /// the data contained in the current instance. /// protected override long DataPosition { get {return base.DataPosition + 4;} } /// /// Gets and sets the data contained in the current instance. /// /// /// A object containing the data /// contained in the current instance. /// public override ByteVector Data { get {return data;} set {data = value != null ? value : new ByteVector ();} } /// /// Gets and sets the text contained in the current instance. /// /// /// A object containing the text /// contained in the current instance, or if the box is not flagged as /// containing text. /// public string Text { get { return ((Flags & (int) FlagType.ContainsText) != 0) ? Data.ToString (StringType.UTF8) : null; } set { Flags = (int) FlagType.ContainsText; Data = ByteVector.FromString (value, StringType.UTF8); } } #endregion #region Protected Methods /// /// Renders the current instance, including its children, to /// a new object, preceeding the /// contents with a specified block of data. /// /// /// A object containing box /// specific header data to preceed the content. /// /// /// A object containing the /// rendered version of the current instance. /// protected override ByteVector Render (ByteVector topData) { ByteVector output = new ByteVector (4); output.Add (topData); return base.Render (output); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Boxes/IsoSampleDescriptionBox.cs0000644000175000017500000000764711462100402027404 0ustar00rubenruben00000000000000// // IsoSampleDescriptionBox.cs: Provides an implementation of a ISO/IEC 14496-12 // SampleDescriptionBox. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Mpeg4 { /// /// This class extends to provide an /// implementation of a ISO/IEC 14496-12 SampleDescriptionBox. /// public class IsoSampleDescriptionBox : FullBox { #region Private Fields /// /// Contains the number of entries at the beginning of the /// children that will be of type , regardless of their box type. /// private uint entry_count; /// /// Contains the children of the box. /// private IEnumerable children; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a provided header /// and handler by reading the contents from a specified /// file. /// /// /// A object containing the header /// to use for the new instance. /// /// /// A object to read the contents /// of the box from. /// /// /// A object containing the /// handler that applies to the new instance. /// /// /// is . /// public IsoSampleDescriptionBox (BoxHeader header, TagLib.File file, IsoHandlerBox handler) : base (header, file, handler) { if (file == null) throw new ArgumentNullException ("file"); entry_count = file.ReadBlock (4).ToUInt (); children = LoadChildren (file); } #endregion #region Public Properties /// /// Gets the position of the data contained in the current /// instance, after any box specific headers. /// /// /// A value containing the position of /// the data contained in the current instance. /// protected override long DataPosition { get {return base.DataPosition + 4;} } /// /// Gets the number of boxes at the begining of the children /// that will be stored as /// of objects, depending /// on the handler. /// /// /// A value containing the number of /// children that will appear as sample entries. /// public uint EntryCount { get {return entry_count;} } /// /// Gets the children of the current instance. /// /// /// A object enumerating the /// children of the current instance. /// public override IEnumerable Children { get {return children;} } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/BoxHeader.cs0000644000175000017500000002715411462100402023407 0ustar00rubenruben00000000000000// // BoxHeader.cs: Provides support for reading and writing headers for ISO/IEC // 14496-12 boxes. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg4 { /// /// This structure provides support for reading and writing headers /// for ISO/IEC 14496-12 boxes. /// public struct BoxHeader { #region Private Fields /// /// Contains the box type. /// private ByteVector box_type; /// /// Contains the extended type. /// private ByteVector extended_type; /// /// Contains the box size. /// private ulong box_size; /// /// Contains the header size. /// private uint header_size; /// /// Contains the position of the header. /// private long position; /// /// Contains the box (temporarily). /// private Box box; /// /// Indicated that the header was read from a file. /// private bool from_disk; #endregion #region Public Fields /// /// An empty box header. /// public static readonly BoxHeader Empty = new BoxHeader ("xxxx"); #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading it from a specified seek /// position in a specified file. /// /// /// A object to read the new /// instance from. /// /// /// A value specifiying the seek position /// in at which to start reading. /// /// /// is . /// /// /// There isn't enough data in the file to read the complete /// header. /// public BoxHeader (TagLib.File file, long position) { if (file == null) throw new ArgumentNullException ("file"); this.box = null; this.from_disk = true; this.position = position; file.Seek (position); ByteVector data = file.ReadBlock (32); int offset = 0; if (data.Count < 8 + offset) throw new CorruptFileException ( "Not enough data in box header."); header_size = 8; box_size = data.Mid (offset, 4).ToUInt (); box_type = data.Mid (offset + 4, 4); // If the size is 1, that just tells us we have a // massive ULONG size waiting for us in the next 8 // bytes. if (box_size == 1) { if (data.Count < 8 + offset) throw new CorruptFileException ( "Not enough data in box header."); header_size += 8; box_size = data.Mid (offset, 8).ToULong (); offset += 8; } // UUID has a special header with 16 extra bytes. if (box_type == Mpeg4.BoxType.Uuid) { if (data.Count < 16 + offset) throw new CorruptFileException ( "Not enough data in box header."); header_size += 16; extended_type = data.Mid (offset, 16); } else extended_type = null; } /// /// Constructs and initializes a new instance of with a specified box type. /// /// /// A object containing the four /// byte box type. /// /// /// must be /// used to create a header of type "uuid". /// /// /// is or is /// equal to "uuid". /// /// /// isn't exactly 4 bytes long. /// public BoxHeader (ByteVector type) : this (type, null) { } /// /// Constructs and initializes a new instance of with a specified box type and /// optionally extended type. /// /// /// A object containing the four /// byte box type. /// /// /// A object containing the four /// byte box type. /// /// /// is - or - /// is equal to "uuid" and /// is . /// /// /// isn't exactly 4 bytes long - or /// - isn't "uuid" but /// isn't - or - paramref name="type" /> is /// "uuid" but isn't /// exactly 16 bytes long. /// public BoxHeader (ByteVector type, ByteVector extendedType) { position = -1; box = null; from_disk = false; box_type = type; if (type == null) throw new ArgumentNullException ("type"); if (type.Count != 4) throw new ArgumentException ( "Box type must be 4 bytes in length.", "type"); box_size = header_size = 8; if (type != "uuid") { if (extendedType != null) throw new ArgumentException ( "Extended type only permitted for 'uuid'.", "extendedType"); this.extended_type = extendedType; return; } if (extendedType == null) throw new ArgumentNullException ("extendedType"); if (extendedType.Count != 16) throw new ArgumentException ( "Extended type must be 16 bytes in length.", "extendedType"); box_size = header_size = 24; this.extended_type = extendedType; } #endregion #region Public Properties /// /// Gets the type of box represented by the current instance. /// /// /// A object containing the 4 byte /// box type. /// public ByteVector BoxType { get {return box_type;} } /// /// Gets the extended type of the box represented by the /// current instance. /// /// /// A object containing the 16 byte /// extended type, or if is not "uuid". /// public ByteVector ExtendedType { get {return extended_type;} } /// /// Gets the size of the header represented by the current /// instance. /// /// /// A value containing the size of the /// header represented by the current instance. /// public long HeaderSize { get {return header_size;} } /// /// Gets and sets the size of the data in the box described /// by the current instance. /// /// /// A value containing the size of the /// data in the box described by the current instance. /// public long DataSize { get {return (long) (box_size - header_size);} set {box_size = (ulong) value + header_size;} } /// /// Gets the offset of the box data from the position of the /// header. /// /// /// A value containing the offset of the /// box data from the position of the header. /// [Obsolete("Use HeaderSize")] public long DataOffset { get {return header_size;} } /// /// Gets the total size of the box described by the current /// instance. /// /// /// A value containing the total size of /// the box described by the current instance. /// public long TotalBoxSize { get {return (long)box_size;} } /// /// Gets the position box represented by the current instance /// in the file it comes from. /// /// /// A value containing the position box /// represented by the current instance in the file it comes /// from. /// public long Position { get {return from_disk ? position : -1;} } #endregion #region Public Methods /// /// Overwrites the header on disk, updating it to include a /// change in the size of the box. /// /// /// A object containing the file /// from which the box originates. /// /// /// A value indicating the change in the /// size of the box described by the current instance. /// /// /// The size change encountered by the box that parents the /// box described the the current instance, equal to the /// size change of the box plus any size change that should /// happen in the header. /// public long Overwrite (TagLib.File file, long sizeChange) { if (file == null) throw new ArgumentNullException ("file"); if (!from_disk) throw new InvalidOperationException ( "Cannot overwrite headers not on disk."); long old_header_size = HeaderSize; DataSize += sizeChange; file.Insert (Render (), position, old_header_size); return sizeChange + HeaderSize - old_header_size; } /// /// Renders the header represented by the current instance. /// /// /// A object containing the /// rendered version of the current instance. /// public ByteVector Render () { // Enlarge for size if necessary. if ((header_size == 8 || header_size == 24) && box_size > uint.MaxValue) { header_size += 8; box_size += 8; } // Add the box size and type to the output. ByteVector output = ByteVector.FromUInt ( (header_size == 8 || header_size == 24) ? (uint) box_size : 1); output.Add (box_type); // If the box size is 16 or 32, we must have more a // large header to append. if (header_size == 16 || header_size == 32) output.Add (ByteVector.FromULong (box_size)); // The only reason for such a big size is an extended // type. Extend!!! if (header_size >= 24) output.Add (extended_type); return output; } #endregion #region Internal Properties /// /// Gets and sets the box represented by the current instance /// as a means of temporary storage for internal uses. /// internal Box Box {get {return box;} set {box = value;}} #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/BoxTypes.cs0000644000175000017500000001127511462100402023320 0ustar00rubenruben00000000000000// // BoxTypes.cs: Contains common box names. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.Mpeg4 { /// /// provides references to different box types /// used by the library. /// /// /// This class is used to severely reduce the number of times /// these types are created in , greatly /// improving the speed at which warm files are read. /// The reason it is marked as internal is because I'm not sure /// I like the way the fields are named, and it is really /// unneccessary for external uses. While the library may use /// DataBoxes (BoxType.Gen, BoxType.Gnre);, an external user /// could use tag.DataBoxes ("gen", "gnre"); with the same /// result. /// internal static class BoxType { public static readonly ReadOnlyByteVector Aart = "aART"; public static readonly ReadOnlyByteVector Alb = AppleTag.FixId ("alb"); public static readonly ReadOnlyByteVector Art = AppleTag.FixId ("ART"); public static readonly ReadOnlyByteVector Cmt = AppleTag.FixId ("cmt"); public static readonly ReadOnlyByteVector Cond = "cond"; public static readonly ReadOnlyByteVector Covr = "covr"; public static readonly ReadOnlyByteVector Co64 = "co64"; public static readonly ReadOnlyByteVector Cpil = "cpil"; public static readonly ReadOnlyByteVector Cprt = "cprt"; public static readonly ReadOnlyByteVector Data = "data"; public static readonly ReadOnlyByteVector Day = AppleTag.FixId ("day"); public static readonly ReadOnlyByteVector Disk = "disk"; public static readonly ReadOnlyByteVector Esds = "esds"; public static readonly ReadOnlyByteVector Ilst = "ilst"; public static readonly ReadOnlyByteVector Free = "free"; public static readonly ReadOnlyByteVector Gen = AppleTag.FixId ("gen"); public static readonly ReadOnlyByteVector Gnre = "gnre"; public static readonly ReadOnlyByteVector Grp = AppleTag.FixId("grp"); public static readonly ReadOnlyByteVector Hdlr = "hdlr"; public static readonly ReadOnlyByteVector Lyr = AppleTag.FixId ("lyr"); public static readonly ReadOnlyByteVector Mdat = "mdat"; public static readonly ReadOnlyByteVector Mdia = "mdia"; public static readonly ReadOnlyByteVector Meta = "meta"; public static readonly ReadOnlyByteVector Mean = "mean"; public static readonly ReadOnlyByteVector Minf = "minf"; public static readonly ReadOnlyByteVector Moov = "moov"; public static readonly ReadOnlyByteVector Mvhd = "mvhd"; public static readonly ReadOnlyByteVector Nam = AppleTag.FixId ("nam"); public static readonly ReadOnlyByteVector Name = "name"; public static readonly ReadOnlyByteVector Skip = "skip"; public static readonly ReadOnlyByteVector Soaa = "soaa"; // Album Artist Sort public static readonly ReadOnlyByteVector Soar = "soar"; // Performer Sort public static readonly ReadOnlyByteVector Soco = "soco"; // Composer Sort public static readonly ReadOnlyByteVector Sonm = "sonm"; // Track Title Sort public static readonly ReadOnlyByteVector Soal = "soal"; // Album Title Sort public static readonly ReadOnlyByteVector Stbl = "stbl"; public static readonly ReadOnlyByteVector Stco = "stco"; public static readonly ReadOnlyByteVector Stsd = "stsd"; public static readonly ReadOnlyByteVector Tmpo = "tmpo"; public static readonly ReadOnlyByteVector Trak = "trak"; public static readonly ReadOnlyByteVector Trkn = "trkn"; public static readonly ReadOnlyByteVector Udta = "udta"; public static readonly ReadOnlyByteVector Uuid = "uuid"; public static readonly ReadOnlyByteVector Wrt = AppleTag.FixId ("wrt"); public static readonly ReadOnlyByteVector DASH = "----"; // Handler types. public static readonly ReadOnlyByteVector Soun = "soun"; public static readonly ReadOnlyByteVector Vide = "vide"; // Another handler type, found in wild in audio file ripped using iTunes public static readonly ReadOnlyByteVector Alis = "alis"; } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/BoxFactory.cs0000644000175000017500000002122311462100402023615 0ustar00rubenruben00000000000000// // BoxFactory.cs: Provides support for reading boxes from a file. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg4 { /// /// This static class provides support for reading boxes from a file. /// public static class BoxFactory { /// /// Creates a box by reading it from a file given its header, /// parent header, handler, and index in its parent. /// /// /// A object containing the file /// to read from. /// /// /// A object containing the header /// of the box to create. /// /// /// A object containing the header /// of the parent box. /// /// /// A object containing the /// handler that applies to the new box. /// /// /// A value containing the index of the /// new box in its parent. /// /// /// A newly created object. /// private static Box CreateBox (TagLib.File file, BoxHeader header, BoxHeader parent, IsoHandlerBox handler, int index) { // The first few children of an "stsd" are sample // entries. if (parent.BoxType == BoxType.Stsd && parent.Box is IsoSampleDescriptionBox && index < (parent.Box as IsoSampleDescriptionBox).EntryCount) { if (handler != null && handler.HandlerType == BoxType.Soun) return new IsoAudioSampleEntry (header, file, handler); else if (handler != null && handler.HandlerType == BoxType.Vide) return new IsoVisualSampleEntry (header, file, handler); else if (handler != null && handler.HandlerType == BoxType.Alis) return new IsoAudioSampleEntry (header, file, handler); else return new IsoSampleEntry (header, file, handler); } // Standard items... ByteVector type = header.BoxType; if (type == BoxType.Mvhd) return new IsoMovieHeaderBox (header, file, handler); else if (type == BoxType.Stbl) return new IsoSampleTableBox (header, file, handler); else if (type == BoxType.Stsd) return new IsoSampleDescriptionBox (header, file, handler); else if (type == BoxType.Stco) return new IsoChunkOffsetBox (header, file, handler); else if (type == BoxType.Co64) return new IsoChunkLargeOffsetBox (header, file, handler); else if (type == BoxType.Hdlr) return new IsoHandlerBox (header, file, handler); else if (type == BoxType.Udta) return new IsoUserDataBox (header, file, handler); else if (type == BoxType.Meta) return new IsoMetaBox (header, file, handler); else if (type == BoxType.Ilst) return new AppleItemListBox (header, file, handler); else if (type == BoxType.Data) return new AppleDataBox (header, file, handler); else if (type == BoxType.Esds) return new AppleElementaryStreamDescriptor ( header, file, handler); else if (type == BoxType.Free || type == BoxType.Skip) return new IsoFreeSpaceBox (header, file, handler); else if (type == BoxType.Mean || type == BoxType.Name) return new AppleAdditionalInfoBox (header, file, handler); // If we still don't have a tag, and we're inside an // ItemListBox, load the box as an AnnotationBox // (Apple tag item). if (parent.BoxType == BoxType.Ilst) return new AppleAnnotationBox (header, file, handler); // Nothing good. Go generic. return new UnknownBox (header, file, handler); } /// /// Creates a box by reading it from a file given its /// position in the file, parent header, handler, and index /// in its parent. /// /// /// A object containing the file /// to read from. /// /// /// A value specifying at what seek /// position in to start reading. /// /// /// A object containing the header /// of the parent box. /// /// /// A object containing the /// handler that applies to the new box. /// /// /// A value containing the index of the /// new box in its parent. /// /// /// A newly created object. /// internal static Box CreateBox (TagLib.File file, long position, BoxHeader parent, IsoHandlerBox handler, int index) { BoxHeader header = new BoxHeader (file, position); return CreateBox (file, header, parent, handler, index); } /// /// Creates a box by reading it from a file given its /// position in the file and handler. /// /// /// A object containing the file /// to read from. /// /// /// A value specifying at what seek /// position in to start reading. /// /// /// A object containing the /// handler that applies to the new box. /// /// /// A newly created object. /// public static Box CreateBox (TagLib.File file, long position, IsoHandlerBox handler) { return CreateBox (file, position, BoxHeader.Empty, handler, -1); } /// /// Creates a box by reading it from a file given its /// position in the file. /// /// /// A object containing the file /// to read from. /// /// /// A value specifying at what seek /// position in to start reading. /// /// /// A newly created object. /// public static Box CreateBox (TagLib.File file, long position) { return CreateBox (file, position, null); } /// /// Creates a box by reading it from a file given its header /// and handler. /// /// /// A object containing the file /// to read from. /// /// /// A object containing the header /// of the box to create. /// /// /// A object containing the /// handler that applies to the new box. /// /// /// A newly created object. /// public static Box CreateBox (TagLib.File file, BoxHeader header, IsoHandlerBox handler) { return CreateBox (file, header, BoxHeader.Empty, handler, -1); } /// /// Creates a box by reading it from a file given its header /// and handler. /// /// /// A object containing the file /// to read from. /// /// /// A object containing the header /// of the box to create. /// /// /// A newly created object. /// public static Box CreateBox (TagLib.File file, BoxHeader header) { return CreateBox (file, header, null); } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg4/Box.cs0000644000175000017500000003661211462100402022275 0ustar00rubenruben00000000000000// // Box.cs: Provides a generic implementation of a ISO/IEC 14496-12 box. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Mpeg4 { /// /// This abstract class provides a generic implementation of a /// ISO/IEC 14496-12 box. /// public class Box { #region Private Fields /// /// Contains the box header. /// private BoxHeader header; /// /// Contains the box's handler, if applicable. /// private IsoHandlerBox handler; /// /// Contains the position of the box data. /// private long data_position; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a specified header and handler. /// /// /// A object describing the new /// instance. /// /// /// A object containing the /// handler that applies to the new instance, or if no handler applies. /// protected Box (BoxHeader header, IsoHandlerBox handler) { this.header = header; this.data_position = header.Position + header.HeaderSize; this.handler = handler; } /// /// Constructs and initializes a new instance of with a specified header. /// /// /// A object describing the new /// instance. /// protected Box (BoxHeader header) : this (header, null) { } /// /// Constructs and initializes a new instance of with a specified box type. /// /// /// A object containing the box /// type to use for the new instance. /// protected Box (ByteVector type) : this (new BoxHeader (type)) { } #endregion #region Public Properties /// /// Gets the MPEG-4 box type of the current instance. /// /// /// A object containing the four /// byte box type of the current instance. /// public virtual ByteVector BoxType { get {return header.BoxType;} } /// /// Gets the total size of the current instance as it last /// appeared on disk. /// /// /// A value containing the total size of /// the current instance as it last appeared on disk. /// public virtual int Size { get {return (int)header.TotalBoxSize;} } /// /// Gets and sets the data contained in the current instance. /// /// /// A object containing the data /// contained in the current instance. /// public virtual ByteVector Data { get {return null;} set {} } /// /// Gets the children of the current instance. /// /// /// A object enumerating the /// children of the current instance. /// public virtual IEnumerable Children { get {return null;} } /// /// Gets the handler box that applies to the current /// instance. /// /// /// A object containing the /// handler that applies to the current instance, or if no handler applies. /// public IsoHandlerBox Handler { get {return handler;} } #endregion #region Public Methods /// /// Renders the current instance, including its children, to /// a new object. /// /// /// A object containing the /// rendered version of the current instance. /// public ByteVector Render () { return Render (new ByteVector ()); } /// /// Gets a child box from the current instance by finding /// a matching box type. /// /// /// A object containing the box /// type to match. /// /// /// A object containing the matched box, /// or if no matching box was found. /// public Box GetChild (ByteVector type) { if (Children == null) return null; foreach (Box box in Children) if (box.BoxType == type) return box; return null; } /* /// /// Gets a child box from the current instance by finding /// a matching object type. /// /// /// A object containing the object /// type to match. /// /// /// A object containing the matched box, /// or if no matching box was found. /// public Box GetChild (System.Type type) { if (Children == null) return null; foreach (Box box in Children) if (box.GetType () == type) return box; return null; } */ /// /// Gets a child box from the current instance by finding /// a matching box type, searching recursively. /// /// /// A object containing the box /// type to match. /// /// /// A object containing the matched box, /// or if no matching box was found. /// public Box GetChildRecursively (ByteVector type) { if (Children == null) return null; foreach (Box box in Children) if (box.BoxType == type) return box; foreach (Box box in Children) { Box child_box = box.GetChildRecursively (type); if (child_box != null) return child_box; } return null; } /* /// /// Gets a child box from the current instance by finding /// a matching object type, searching recursively. /// /// /// A object containing the object /// type to match. /// /// /// A object containing the matched box, /// or if no matching box was found. /// public Box GetChildRecursively (System.Type type) { if (Children == null) return null; foreach (Box box in Children) if (box.GetType () == type) return box; foreach (Box box in Children) { Box child_box = box.GetChildRecursively (type); if (child_box != null) return child_box; } return null; } */ /// /// Removes all children with a specified box type from the /// current instance. /// /// /// A object containing the box /// type to remove. /// public void RemoveChild (ByteVector type) { ICollection children = Children as ICollection; if (children == null) return; foreach (Box b in new List (children)) if (b.BoxType == type) children.Remove (b); } /* /// /// Removes all children with a specified box type from the /// current instance. /// /// /// A object containing the box /// type to remove. /// public void RemoveChild (System.Type type) { ICollection children = Children as ICollection; if (children == null) return; foreach (Box b in new List (children)) if (b.GetType () == type) children.Remove (b); } */ /// /// Removes a specified box from the current instance. /// /// /// A object to remove from the current /// instance. /// public void RemoveChild (Box box) { ICollection children = Children as ICollection; if (children != null) children.Remove (box); } /// /// Adds a specified box to the current instance. /// /// /// A object to add to the current /// instance. /// public void AddChild (Box box) { ICollection children = Children as ICollection; if (children != null) children.Add (box); } /// /// Removes all children from the current instance. /// public void ClearChildren () { ICollection children = Children as ICollection; if (children != null) children.Clear (); } /// /// Gets whether or not the current instance has children. /// /// /// A value indicating whether or not the /// current instance has any children. /// public bool HasChildren { get { ICollection children = Children as ICollection; return children != null && children.Count > 0; } } #endregion #region Protected Properties /// /// Gets the size of the data contained in the current /// instance, minux the size of any box specific headers. /// /// /// A value containing the size of /// the data contained in the current instance. /// protected int DataSize { get {return (int)(header.DataSize + data_position - DataPosition);} } /// /// Gets the position of the data contained in the current /// instance, after any box specific headers. /// /// /// A value containing the position of /// the data contained in the current instance. /// protected virtual long DataPosition { get {return data_position;} } /// /// Gets the header of the current instance. /// /// /// A object containing the header /// of the current instance. /// protected BoxHeader Header { get {return header;} } #endregion #region Protected Methods /// /// Loads the children of the current instance from a /// specified file using the internal data position and size. /// /// /// The from which the current /// instance was read and from which to read the children. /// /// /// A object enumerating the /// boxes read from the file. /// /// /// is . /// protected IEnumerable LoadChildren (TagLib.File file) { if (file == null) throw new ArgumentNullException ("file"); List children = new List (); long position = DataPosition; long end = position + DataSize; header.Box = this; while (position < end) { Box child = BoxFactory.CreateBox (file, position, header, handler, children.Count); children.Add (child); position += child.Size; } header.Box = null; return children; } /// /// Loads the data of the current instance from a specified /// file using the internal data position and size. /// /// /// The from which the current /// instance was read and from which to read the data. /// /// /// A object containing the data /// read from the file. /// /// /// is . /// protected ByteVector LoadData (TagLib.File file) { if (file == null) throw new ArgumentNullException ("file"); file.Seek (DataPosition); return file.ReadBlock (DataSize); } /// /// Renders the current instance, including its children, to /// a new object, preceeding the /// contents with a specified block of data. /// /// /// A object containing box /// specific header data to preceed the content. /// /// /// A object containing the /// rendered version of the current instance. /// protected virtual ByteVector Render (ByteVector topData) { bool free_found = false; ByteVector output = new ByteVector (); if (Children != null) foreach (Box box in Children) if (box.GetType () == typeof ( IsoFreeSpaceBox)) free_found = true; else output.Add (box.Render ()); else if (Data != null) output.Add (Data); // If there was a free, don't take it away, and let meta // be a special case. if (free_found || BoxType == Mpeg4.BoxType.Meta) { long size_difference = DataSize - output.Count; // If we have room for free space, add it so we // don't have to resize the file. if (header.DataSize != 0 && size_difference >= 8) output.Add ((new IsoFreeSpaceBox ( size_difference)).Render ()); // If we're getting bigger, get a lot bigger so // we might not have to again. else output.Add ((new IsoFreeSpaceBox (2048 )).Render ()); } // Adjust the header's data size to match the content. header.DataSize = topData.Count + output.Count; // Render the full box. output.Insert (0, topData); output.Insert (0, header.Render ()); return output; } #endregion /* #region Internal Methods /// /// Dumps the child tree of the current instance to the /// console. /// /// /// A object to preface each line with. /// internal void DumpTree (string start) { if (BoxType == BoxType.Data) Console.WriteLine ("{0}{1} {2}", start, BoxType.ToString (), (this as AppleDataBox).Text); else Console.WriteLine ("{0}{1}", start, BoxType.ToString ()); if (Children != null) foreach (Box child in Children) child.DumpTree (start + " "); } #endregion */ } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/SupportedMimeType.cs0000644000175000017500000001442711462100402024230 0ustar00rubenruben00000000000000// // SupportedMimeType.cs: // // Author: // Aaron Bockover (abockover@novell.com) // // Original Source: // Entagged# // // Copyright (C) 2006 Novell, Inc. // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib { /// /// This class provides an attribute for listing supported mime-types /// for classes that extend . /// /// /// When classes that extend are registered with /// , its attributes are read. /// /// /// using TagLib; /// ///[SupportedMimeType("taglib/wv", "wv")] ///[SupportedMimeType("audio/x-wavpack")] ///public class MyFile : File { /// ... ///} /// [AttributeUsage(AttributeTargets.Class, AllowMultiple=true)] public sealed class SupportedMimeType : Attribute { /// /// Contains the registered /// objects. /// private static List mimetypes = new List (); /// /// Contains the mime-type. /// private string mimetype; /// /// Contains the extension. /// private string extension; /// /// Constructs and initializes the class by initializing the /// class. /// static SupportedMimeType () { FileTypes.Init (); } /// /// Constructs and initializes a new instance of the attribute for a specified /// mime-type. /// /// /// A object containing a standard /// mime-type. /// /// /// Standard practice is to use to register standard /// mime-types, like "audio/mp3" and "video/mpeg" and to use /// strictly /// to register extensions, using "taglib/ext" for the mime /// type. Eg. SupportedMimeType("taglib/mp3", /// "mp3"). /// public SupportedMimeType (string mimetype) { this.mimetype = mimetype; mimetypes.Add (this); } /// /// Constructs and initializes a new instance of the attribute for a specified /// mime-type and extension. /// /// /// A object containing a standard /// mime-type. /// /// /// A object containing a file /// extension. /// /// /// Standard practice is to use to register standard /// mime-types, like "audio/mp3" and "video/mpeg" and to use /// strictly /// to register extensions, using "taglib/ext" for the mime /// type. Eg. SupportedMimeType("taglib/mp3", /// "mp3"). /// public SupportedMimeType (string mimetype, string extension) : this (mimetype) { this.extension = extension; } /// /// Gets the mime-type registered by the current instance. /// /// /// A object containing the mime-type /// registered by the current instance. /// /// /// The value is in the format "generic/specific". For /// example, "video/mp4". /// public string MimeType { get {return mimetype;} } /// /// Gets the extension registered by the current instance. /// /// /// A object containing the extension /// registered by the current instance, or if not specified. /// /// /// The value is the file extension minus the preceding /// ".". For example, "m4v". /// public string Extension { get {return extension;} } /// /// Gets all the mime-types that have been registered with /// . /// /// /// A object containing all the /// mime-types that have been registered with . /// /// /// These values are used by to /// match file types. /// public static IEnumerable AllMimeTypes { get { foreach(SupportedMimeType type in mimetypes) yield return type.MimeType; } } /// /// Gets all the extensions that have been registered with /// . /// /// /// A object containing all the /// extensions that have been registered with . /// /// /// These values are currently not used in file type /// recognition. /// public static IEnumerable AllExtensions { get { foreach(SupportedMimeType type in mimetypes) if(type.Extension != null) yield return type.Extension; } } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Riff/0000777000175000017500000000000011503407422021134 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Riff/File.cs0000644000175000017500000004277311462100402022343 0ustar00rubenruben00000000000000// // File.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections; using System.Collections.Generic; namespace TagLib.Riff { /// /// This class extends to provide /// support for reading and writing tags and properties for files /// using the RIFF file format such as AVI and Wave files. /// [SupportedMimeType("taglib/avi", "avi")] [SupportedMimeType("taglib/wav", "wav")] [SupportedMimeType("taglib/divx", "divx")] [SupportedMimeType("video/avi")] [SupportedMimeType("video/msvideo")] [SupportedMimeType("video/x-msvideo")] [SupportedMimeType("image/avi")] [SupportedMimeType("application/x-troff-msvideo")] [SupportedMimeType("audio/avi")] [SupportedMimeType("audio/wav")] [SupportedMimeType("audio/wave")] [SupportedMimeType("audio/x-wav")] public class File : TagLib.File { #region Private Fields /// /// Contains all the tags of the file. /// private CombinedTag tag = new CombinedTag (); /// /// Contains the INFO tag. /// private InfoTag info_tag = null; /// /// Contains the MovieID tag. /// private MovieIdTag mid_tag = null; /// /// Contains the DivX tag. /// private DivXTag divx_tag = null; /// /// Contains the Id3v2 tag. /// private Id3v2.Tag id32_tag = null; /// /// Contains the media properties. /// private Properties properties = null; #endregion #region Public Static Fields /// /// The identifier used to recognize a RIFF files. /// /// /// "RIFF" /// public static readonly ReadOnlyByteVector FileIdentifier = "RIFF"; #endregion #region Public Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : this (new File.LocalFileAbstraction (path), propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system with an average read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : this (path, ReadStyle.Average) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction) { uint riff_size; long tag_start, tag_end; Mode = AccessMode.Read; try { Read (true, propertiesStyle, out riff_size, out tag_start, out tag_end); } finally { Mode = AccessMode.Closed; } TagTypesOnDisk = TagTypes; GetTag (TagTypes.Id3v2, true); GetTag (TagTypes.RiffInfo, true); GetTag (TagTypes.MovieId, true); GetTag (TagTypes.DivX, true); } /// /// Constructs and initializes a new instance of for a specified file abstraction with an /// average read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// public File (File.IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) {} #endregion #region Public Properties /// /// Gets a abstract representation of all tags stored in the /// current instance. /// /// /// A object representing all tags /// stored in the current instance. /// public override Tag Tag { get {return tag;} } /// /// Gets the media properties of the file represented by the /// current instance. /// /// /// A object containing the /// media properties of the file represented by the current /// instance. /// public override TagLib.Properties Properties { get {return properties;} } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { Mode = AccessMode.Write; try { ByteVector data = new ByteVector (); // Enclose the Id3v2 tag in an "ID32" item and // embed it as the first tag. if (id32_tag != null) { ByteVector tag_data = id32_tag.Render (); if (tag_data.Count > 10) { if (tag_data.Count % 2 == 1) tag_data.Add (0); data.Add ("ID32"); data.Add (ByteVector.FromUInt ( (uint) tag_data.Count, false)); data.Add (tag_data); } } // Embed "INFO" as the second tag. if (info_tag != null) data.Add (info_tag.RenderEnclosed ()); // Embed "MID " as the third tag. if (mid_tag != null) data.Add (mid_tag.RenderEnclosed ()); // Embed the DivX tag in "IDVX and embed it as // the fourth tag. if (divx_tag != null && !divx_tag.IsEmpty) { ByteVector tag_data = divx_tag.Render (); data.Add ("IDVX"); data.Add (ByteVector.FromUInt ( (uint) tag_data.Count, false)); data.Add (tag_data); } // Read the file to determine the current RIFF // size and the area tagging does in. uint riff_size; long tag_start, tag_end; Read (false, ReadStyle.None, out riff_size, out tag_start, out tag_end); // If tagging info cannot be found, place it at // the end of the file. if (tag_start < 12 || tag_end < tag_start) tag_start = tag_end = Length; int length = (int)(tag_end - tag_start); // If the tag isn't at the end of the file, // try appending using padding to improve // write time now or for subsequent writes. if (tag_end != Length) { int padding_size = length - data.Count - 8; if (padding_size < 0) padding_size = 1024; data.Add ("JUNK"); data.Add (ByteVector.FromUInt ( (uint)padding_size, false)); data.Add (new ByteVector (padding_size)); } // Insert the tagging data. Insert (data, tag_start, length); // If the data size changed, and the tagging // data is within the RIFF portion of the file, // update the riff size. if (data.Count - length != 0 && tag_start <= riff_size) Insert (ByteVector.FromUInt ((uint) (riff_size + data.Count - length), false), 4, 4); // Update the tag types. TagTypesOnDisk = TagTypes; } finally { Mode = AccessMode.Closed; } } /// /// Removes a set of tag types from the current instance. /// /// /// A bitwise combined value /// containing tag types to be removed from the file. /// /// /// In order to remove all tags from a file, pass as . /// public override void RemoveTags (TagTypes types) { if ((types & TagLib.TagTypes.Id3v2) != TagLib.TagTypes.None) id32_tag = null; if ((types & TagLib.TagTypes.RiffInfo) != TagLib.TagTypes.None) info_tag = null; if ((types & TagLib.TagTypes.MovieId) != TagLib.TagTypes.None) mid_tag = null; if ((types & TagLib.TagTypes.DivX) != TagLib.TagTypes.None) divx_tag = null; tag.SetTags (id32_tag, info_tag, mid_tag, divx_tag); } /// /// Gets a tag of a specified type from the current instance, /// optionally creating a new tag if possible. /// /// /// A value indicating the /// type of tag to read. /// /// /// A value specifying whether or not to /// try and create the tag if one is not found. /// /// /// A object containing the tag that was /// found in or added to the current instance. If no /// matching tag was found and none was created, is returned. /// public override TagLib.Tag GetTag (TagTypes type, bool create) { TagLib.Tag tag = null; switch (type) { case TagTypes.Id3v2: if (id32_tag == null && create) { id32_tag = new Id3v2.Tag (); id32_tag.Version = 4; id32_tag.Flags |= Id3v2.HeaderFlags .FooterPresent; this.tag.CopyTo (id32_tag, true); } tag = id32_tag; break; case TagTypes.RiffInfo: if (info_tag == null && create) { info_tag = new InfoTag (); this.tag.CopyTo (info_tag, true); } tag = info_tag; break; case TagTypes.MovieId: if (mid_tag == null && create) { mid_tag = new MovieIdTag (); this.tag.CopyTo (mid_tag, true); } tag = mid_tag; break; case TagTypes.DivX: if (divx_tag == null && create) { divx_tag = new DivXTag (); this.tag.CopyTo (divx_tag, true); } tag = divx_tag; break; } this.tag.SetTags (id32_tag, info_tag, mid_tag, divx_tag); return tag; } #endregion #region Private Methods /// /// Reads the contents of the current instance determining /// the size of the riff data, the area the tagging is in, /// and optionally reading in the tags and media properties. /// /// /// If , any tags found will be read /// into the current instance. /// /// /// A value specifying how the media /// data is to be read into the current instance. /// /// /// A value reference to be filled with /// the size of the RIFF data as read from the file. /// /// /// A value reference to be filled with /// the absolute seek position at which the tagging data /// starts. /// /// /// A value reference to be filled with /// the absolute seek position at which the tagging data /// ends. /// /// /// The file does not begin with . /// private void Read (bool read_tags, ReadStyle style, out uint riff_size, out long tag_start, out long tag_end) { Seek (0); if (ReadBlock (4) != FileIdentifier) throw new CorruptFileException ( "File does not begin with RIFF identifier"); riff_size = ReadBlock (4).ToUInt (false); ByteVector stream_format = ReadBlock (4); tag_start = -1; tag_end = -1; long position = 12; long length = Length; uint size = 0; TimeSpan duration = TimeSpan.Zero; ICodec [] codecs = new ICodec [0]; // Read until there are less than 8 bytes to read. do { bool tag_found = false; Seek (position); string fourcc = ReadBlock (4).ToString (StringType.UTF8); size = ReadBlock (4).ToUInt (false); switch (fourcc) { // "fmt " is used by Wave files to hold the // WaveFormatEx structure. case "fmt ": if (style == ReadStyle.None || stream_format != "WAVE") break; Seek (position + 8); codecs = new ICodec [] { new WaveFormatEx (ReadBlock (18), 0) }; break; // "data" contains the audio data for wave // files. It's contents represent the invariant // portion of the file and is used to determine // the duration of a file. It should always // appear after "fmt ". case "data": if (stream_format != "WAVE") break; InvariantStartPosition = position; InvariantEndPosition = position + size; if (style == ReadStyle.None || codecs.Length != 1 || !(codecs [0] is WaveFormatEx)) break; duration += TimeSpan.FromSeconds ( (double) size / (double) ((WaveFormatEx) codecs [0]) .AverageBytesPerSecond); break; // Lists are used to store a variety of data // collections. Read the type and act on it. case "LIST": { switch (ReadBlock (4).ToString (StringType.UTF8)) { // "hdlr" is used by AVI files to hold // a media header and BitmapInfoHeader // and WaveFormatEx structures. case "hdrl": if (style == ReadStyle.None || stream_format != "AVI ") continue; AviHeaderList header_list = new AviHeaderList (this, position + 12, (int) (size - 4)); duration = header_list.Header.Duration; codecs = header_list.Codecs; break; // "INFO" is a tagging format handled by // the InfoTag class. case "INFO": if (read_tags && info_tag == null) info_tag = new InfoTag ( this, position + 12, (int) (size - 4)); tag_found = true; break; // "MID " is a tagging format handled by // the MovieIdTag class. case "MID ": if (read_tags && mid_tag == null) mid_tag = new MovieIdTag ( this, position + 12, (int) (size - 4)); tag_found = true; break; // "movi" contains the media data for // and AVI and its contents represent // the invariant portion of the file. case "movi": if (stream_format != "AVI ") break; InvariantStartPosition = position; InvariantEndPosition = position + size; break; } break; } // "ID32" is a custom box for this format that // contains an ID3v2 tag. case "ID32": if (read_tags && id32_tag == null) id32_tag = new Id3v2.Tag (this, position + 8); tag_found = true; break; // "IDVX" is used by DivX and holds an ID3v1- // style tag. case "IDVX": if (read_tags && divx_tag == null) divx_tag = new DivXTag (this, position + 8); tag_found = true; break; // "JUNK" is a padding element that could be // associated with tag data. case "JUNK": if (tag_end == position) tag_end = position + 8 + size; break; } // Determine the region of the file that // contains tags. if (tag_found) { if (tag_start == -1) { tag_start = position; tag_end = position + 8 + size; } else if (tag_end == position) { tag_end = position + 8 + size; } } // Move to the next item. } while ((position += 8 + size) + 8 < length); // If we're reading properties, and one were found, // throw an exception. Otherwise, create the Properties // object. if (style != ReadStyle.None) { if (codecs.Length == 0) throw new UnsupportedFormatException ( "Unsupported RIFF type."); properties = new Properties (duration, codecs); } // If we're reading tags, update the combined tag. if (read_tags) tag.SetTags (id32_tag, info_tag, mid_tag, divx_tag); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Riff/List.cs0000644000175000017500000004277511462100402022401 0ustar00rubenruben00000000000000// // List.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Globalization; using System.Runtime.Serialization; namespace TagLib.Riff { /// /// This class extends to provide /// support for reading and writing RIFF lists. /// [Serializable] [ComVisible(false)] public class List : Dictionary { #region Constructors /// /// Constructs and initializes a new instance of with no contents. /// public List () { } /// /// Constructs and initializes a new instance of by reading the contents of a raw RIFF /// list stored in a object. /// /// /// A containing a raw RIFF list to /// read into the new instance. /// public List (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); Parse (data); } /// /// Constructs and initializes a new instance of by reading the contents of a raw RIFF list /// from a specified position in a . /// /// /// A object containing the file /// from which the contents of the new instance is to be /// read. /// /// /// A value specify at what position to /// read the list. /// /// /// A value specifying the number of bytes /// to read. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// public List (TagLib.File file, long position, int length) { if (file == null) throw new ArgumentNullException ("file"); if (length < 0) throw new ArgumentOutOfRangeException ( "length"); if (position < 0 || position > file.Length - length) throw new ArgumentOutOfRangeException ( "position"); file.Seek (position); Parse (file.ReadBlock (length)); } /// /// Constructs and initializes a new instance of from a specified serialization info and /// streaming context. /// /// /// A object containing the /// serialized data to be used for the new instance. /// /// /// A object containing the /// streaming context information for the new instance. /// /// /// This constructor is implemented because implements the interface. /// protected List (SerializationInfo info, StreamingContext context) : base (info, context) { } #endregion #region Public Methods /// /// Renders the current instance as a raw RIFF list. /// /// /// A object containing the rendered /// version of the current instance. /// public ByteVector Render () { ByteVector data = new ByteVector (); foreach (ByteVector id in Keys) foreach (ByteVector value in this [id]) { if (value.Count == 0) continue; data.Add (id); data.Add (ByteVector.FromUInt ( (uint) value.Count, false)); data.Add (value); if (value.Count % 2 == 1) data.Add (0); } return data; } /// /// Renders the current instance enclosed in an item with a /// specified ID. /// /// /// A object containing the ID of /// the item to enclose the current instance in. /// /// /// A object containing the rendered /// version of the current instance. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public ByteVector RenderEnclosed (ByteVector id) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); ByteVector data = Render (); if (data.Count <= 8) return new ByteVector (); ByteVector header = new ByteVector ("LIST"); header.Add (ByteVector.FromUInt ( (uint) (data.Count + 4), false)); header.Add (id); data.Insert (0, header); return data; } /// /// Gets the values for a specified item in the current /// instance as a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A object containing /// the values of the specified item. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public ByteVectorCollection GetValues (ByteVector id) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); ByteVectorCollection value; return TryGetValue (id, out value) ? value : new ByteVectorCollection (); } /// /// Gets the values for a specified item in the current /// instance as a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A containing the values of the /// specified item. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public string [] GetValuesAsStrings (ByteVector id) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); ByteVectorCollection values = GetValues (id); string [] result = new string [values.Count]; for (int i = 0; i < result.Length; i ++) { ByteVector data = values [i]; if (data == null) { result [i] = string.Empty; continue; } int length = data.Count; while (length > 0 && data [length - 1] == 0) length --; result [i] = data .ToString (StringType.UTF8, 0, length); } return result; } /// /// Gets the values for a specified item in the current /// instance as a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A object containing the /// values of the specified item. /// /// /// is . /// /// /// isn't exactly four bytes long. /// [Obsolete("Use GetValuesAsStrings(ByteVector)")] public StringCollection GetValuesAsStringCollection (ByteVector id) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); return new StringCollection (GetValuesAsStrings (id)); } /// /// Gets the value for a specified item in the current /// instance as a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A value containing the first value /// with the specified ID that could be converted to an /// integer, or zero if none could be found. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public uint GetValueAsUInt (ByteVector id) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); foreach (string text in GetValuesAsStrings (id)) { uint value; if (uint.TryParse (text, out value)) return value; } return 0; } /// /// Sets the value for a specified item in the current /// instance to the contents of a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A containing the objects to /// store in the specified item. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public void SetValue (ByteVector id, IEnumerable values) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); if (values == null) RemoveValue (id); else if (ContainsKey (id)) this [id] = new ByteVectorCollection (values); else Add (id, new ByteVectorCollection (values)); } /// /// Sets the value for a specified item in the current /// instance to the contents of a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A containing the values to /// store in the specified item. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public void SetValue (ByteVector id, params ByteVector [] values) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); if (values == null || values.Length == 0) RemoveValue (id); else SetValue (id, values as IEnumerable); } /// /// Sets the value for a specified item in the current /// instance to the value of a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A value to store in the specified /// item. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public void SetValue (ByteVector id, uint value) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); if (value == 0) RemoveValue (id); else SetValue (id, value.ToString ( CultureInfo.InvariantCulture)); } /// /// Sets the value for a specified item in the current /// instance to the contents of a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A containing the objects to store /// in the specified item. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public void SetValue (ByteVector id, IEnumerable values) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); if (values == null) { RemoveValue (id); return; } ByteVectorCollection l = new ByteVectorCollection (); foreach (string value in values) { if (string.IsNullOrEmpty (value)) continue; ByteVector data = ByteVector.FromString (value, StringType.UTF8); data.Add (0); l.Add (data); } if (l.Count == 0) RemoveValue (id); else SetValue (id, l); } /// /// Sets the value for a specified item in the current /// instance to the contents of a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A containing the values to store /// in the specified item. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public void SetValue (ByteVector id, params string [] values) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); if (values == null || values.Length == 0) RemoveValue (id); else SetValue (id, values as IEnumerable); } /// /// Removes the item with the specified ID from the current /// instance. /// /// /// A object containing the ID of /// the item to remove from the current instance. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public void RemoveValue (ByteVector id) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); if (ContainsKey (id)) Remove (id); } #endregion #region Private Methods /// /// Populates the current instance by reading in the contents /// of a raw RIFF list stored in a /// object. /// /// /// A containing a raw RIFF list to /// read into the current instance. /// private void Parse (ByteVector data) { int offset = 0; while (offset + 8 < data.Count) { ByteVector id = data.Mid (offset, 4); int length = (int) data.Mid (offset + 4, 4) .ToUInt (false); if (!ContainsKey (id)) Add (id, new ByteVectorCollection ()); this [id].Add (data.Mid (offset + 8, length)); if (length % 2 == 1) length ++; offset += 8 + length; } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Riff/MovieIdTag.cs0000644000175000017500000001555611462100402023453 0ustar00rubenruben00000000000000// // MovieIdTag.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Riff { /// /// This class extends to provide support for /// reading and writing MovieID tags. /// public class MovieIdTag : ListTag { #region Constructors /// /// Constructs and initializes a new instance of with no contents. /// public MovieIdTag () : base () { } /// /// Constructs and initializes a new instance of by reading the contents of a raw /// RIFF list stored in a object. /// /// /// A containing a raw RIFF list to /// read into the new instance. /// public MovieIdTag (ByteVector data) : base (data) { } /// /// Constructs and initializes a new instance of by reading the contents of a raw /// RIFF list from a specified position in a . /// /// /// A object containing the file /// from which the contents of the new instance is to be /// read. /// /// /// A value specify at what position to /// read the list. /// /// /// A value specifying the number of bytes /// to read. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// public MovieIdTag (TagLib.File file, long position, int length) : base (file, position, length) { } #endregion #region Public Methods /// /// Renders the current instance enclosed in a "MID " item. /// /// /// A object containing the rendered /// version of the current instance. /// public override ByteVector RenderEnclosed () { return RenderEnclosed ("MID "); } #endregion #region TagLib.Tag /// /// Gets the tag types contained in the current instance. /// /// /// Always . /// public override TagTypes TagTypes { get {return TagTypes.MovieId;} } /// /// Gets and sets the title for the media described by the /// current instance. /// /// /// A object containing the title for /// the media described by the current instance or if no value is present. /// /// /// This property is implemented using the "TITL" item. /// public override string Title { get { foreach (string s in GetValuesAsStrings ("TITL")) if (!string.IsNullOrEmpty (s)) return s; return null; } set {SetValue ("TITL", value);} } /// /// Gets and sets the performers or artists who performed in /// the media described by the current instance. /// /// /// A containing the performers or /// artists who performed in the media described by the /// current instance or an empty array if no value is /// present. /// /// /// This property is implemented using the "IART" item. /// public override string [] Performers { get {return GetValuesAsStrings ("IART");} set {SetValue ("IART", value);} } /// /// Gets and sets a user comment on the media represented by /// the current instance. /// /// /// A object containing user comments /// on the media represented by the current instance or if no value is present. /// /// /// This property is implemented using the "COMM" item. /// public override string Comment { get { foreach (string s in GetValuesAsStrings ("COMM")) if (!string.IsNullOrEmpty (s)) return s; return null; } set {SetValue ("COMM", value);} } /// /// Gets and sets the genres of the media represented by the /// current instance. /// /// /// A containing the genres of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This property is implemented using the "GENR" item. /// public override string [] Genres { get {return GetValuesAsStrings ("GENR");} set {SetValue ("GENR", value);} } /// /// Gets and sets the position of the media represented by /// the current instance in its containing album. /// /// /// A containing the position of the /// media represented by the current instance in its /// containing album or zero if not specified. /// /// /// This property is implemented using the "PRT1" item. /// public override uint Track { get {return GetValueAsUInt ("PRT1");} set {SetValue ("PRT1", value);} } /// /// Gets and sets the number of tracks in the album /// containing the media represented by the current instance. /// /// /// A containing the number of tracks in /// the album containing the media represented by the current /// instance or zero if not specified. /// /// /// This property is implemented using the "PRT2" item. /// public override uint TrackCount { get {return GetValueAsUInt ("PRT2");} set {SetValue ("PRT2", value);} } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Riff/InfoTag.cs0000644000175000017500000002240411462100402023000 0ustar00rubenruben00000000000000// // InfoTag.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Riff { /// /// This class extends to provide support for /// reading and writing standard INFO tags. /// public class InfoTag : ListTag { #region Constructors /// /// Constructs and initializes a new instance of with no contents. /// public InfoTag () : base () { } /// /// Constructs and initializes a new instance of by reading the contents of a raw /// RIFF list stored in a object. /// /// /// A containing a raw RIFF list to /// read into the new instance. /// public InfoTag (ByteVector data) : base (data) { } /// /// Constructs and initializes a new instance of by reading the contents of a raw RIFF /// list from a specified position in a . /// /// /// A object containing the file /// from which the contents of the new instance is to be /// read. /// /// /// A value specify at what position to /// read the list. /// /// /// A value specifying the number of bytes /// to read. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// public InfoTag (TagLib.File file, long position, int length) : base (file, position, length) { } #endregion #region Public Methods /// /// Renders the current instance enclosed in a "INFO" item. /// /// /// A object containing the rendered /// version of the current instance. /// public override ByteVector RenderEnclosed () { return RenderEnclosed ("INFO"); } #endregion #region TagLib.Tag /// /// Gets the tag types contained in the current instance. /// /// /// Always . /// public override TagTypes TagTypes { get {return TagTypes.RiffInfo;} } /// /// Gets and sets the title for the media described by the /// current instance. /// /// /// A object containing the title for /// the media described by the current instance or if no value is present. /// /// /// This property is implemented using the "INAM" item. /// public override string Title { get { foreach (string s in GetValuesAsStrings ("INAM")) if (!string.IsNullOrEmpty (s)) return s; return null; } set {SetValue ("INAM", value);} } /// /// Gets and sets the performers or artists who performed in /// the media described by the current instance. /// /// /// A containing the performers or /// artists who performed in the media described by the /// current instance or an empty array if no value is /// present. /// /// /// This property is implemented using the "ISTR" item. /// public override string [] Performers { get {return GetValuesAsStrings ("ISTR");} set {SetValue ("ISTR", value);} } /// /// Gets and sets the band or artist who is credited in the /// creation of the entire album or collection containing the /// media described by the current instance. /// /// /// A containing the band or artist /// who is credited in the creation of the entire album or /// collection containing the media described by the current /// instance or an empty array if no value is present. /// /// /// This property is implemented using the "IART" item. /// public override string [] AlbumArtists { get {return GetValuesAsStrings ("IART");} set {SetValue ("IART", value);} } /// /// Gets and sets the composers of the media represented by /// the current instance. /// /// /// A containing the composers of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This property is implemented using the "IWRI" item. /// public override string [] Composers { get {return GetValuesAsStrings ("IWRI");} set {SetValue ("IWRI", value);} } /// /// Gets and sets a user comment on the media represented by /// the current instance. /// /// /// A object containing user comments /// on the media represented by the current instance or if no value is present. /// /// /// This property is implemented using the "ICMT" item. /// public override string Comment { get { foreach (string s in GetValuesAsStrings ("ICMT")) if (!string.IsNullOrEmpty (s)) return s; return null; } set {SetValue ("ICMT", value);} } /// /// Gets and sets the genres of the media represented by the /// current instance. /// /// /// A containing the genres of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This property is implemented using the "IGNR" item. /// public override string [] Genres { get {return GetValuesAsStrings ("IGNR");} set {SetValue ("IGNR", value);} } /// /// Gets and sets the year that the media represented by the /// current instance was recorded. /// /// /// A containing the year that the media /// represented by the current instance was created or zero /// if no value is present. /// /// /// This property is implemented using the "ICRD" item. /// public override uint Year { get {return GetValueAsUInt ("ICRD");} set {SetValue ("ICRD", value);} } /// /// Gets and sets the position of the media represented by /// the current instance in its containing album. /// /// /// A containing the position of the /// media represented by the current instance in its /// containing album or zero if not specified. /// /// /// This property is implemented using the "IPRT" item. /// public override uint Track { get {return GetValueAsUInt ("IPRT");} set {SetValue ("IPRT", value);} } /// /// Gets and sets the number of tracks in the album /// containing the media represented by the current instance. /// /// /// A containing the number of tracks in /// the album containing the media represented by the current /// instance or zero if not specified. /// /// /// This property is implemented using the "IFRM" item. /// public override uint TrackCount { get {return GetValueAsUInt ("IFRM");} set {SetValue ("IFRM", value);} } /// /// Gets and sets the copyright information for the media /// represented by the current instance. /// /// /// A object containing the copyright /// information for the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "ICOP" item. /// public override string Copyright { get { foreach (string s in GetValuesAsStrings ("ICOP")) if (!string.IsNullOrEmpty (s)) return s; return null; } set {SetValue ("ICOP", value);} } #endregion } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Riff/BitmapInfoHeader.cs0000644000175000017500000006050711462100402024620 0ustar00rubenruben00000000000000// // BitmapInfoHeader.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Globalization; namespace TagLib.Riff { /// /// This structure provides a representation of a Microsoft /// BitmapInfoHeader structure. /// public struct BitmapInfoHeader : IVideoCodec { #region Private Fields /// /// Contains the size of the header. /// uint size; /// /// Contains the video width. /// uint width; /// /// Contains the video height. /// uint height; /// /// Contains the number of planes. /// ushort planes; /// /// Contains the bit count. /// ushort bit_count; /// /// Contains the compression (codec) ID. /// ByteVector compression_id; /// /// Contains the size of the image. /// uint size_of_image; /// /// Contains the number of X pixels per meter. /// uint x_pixels_per_meter; /// /// Contains the number of Y pixels per meter. /// uint y_pixels_per_meter; /// /// Contains the number of colors used. /// uint colors_used; /// /// Contains the number of important colors. /// uint colors_important; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading the raw structure /// from the beginning of a object. /// /// /// A object containing the raw /// data structure. /// /// /// is . /// /// /// contains less than 40 bytes. /// [Obsolete("Use BitmapInfoHeader(ByteVector,int)")] public BitmapInfoHeader (ByteVector data) : this (data, 0) { } /// /// Constructs and initializes a new instance of by reading the raw structure /// from a specified position in a /// object. /// /// /// A object containing the raw /// data structure. /// /// /// A value specifying the index in /// at which the structure begins. /// /// /// is . /// /// /// is less than zero. /// /// /// contains less than 16 bytes at /// . /// public BitmapInfoHeader (ByteVector data, int offset) { if (data == null) throw new ArgumentNullException ("data"); if (offset + 40 > data.Count) throw new CorruptFileException ( "Expected 40 bytes."); if (offset < 0) throw new ArgumentOutOfRangeException ( "offset"); size = data.Mid (offset + 0, 4).ToUInt (false); width = data.Mid (offset + 4, 4).ToUInt (false); height = data.Mid (offset + 8, 4).ToUInt (false); planes = data.Mid (offset + 12, 2).ToUShort (false); bit_count = data.Mid (offset + 14, 2).ToUShort (false); compression_id = data.Mid (offset + 16, 4); size_of_image = data.Mid (offset + 20, 4).ToUInt (false); x_pixels_per_meter = data.Mid (offset + 24, 4).ToUInt (false); y_pixels_per_meter = data.Mid (offset + 28, 4).ToUInt (false); colors_used = data.Mid (offset + 32, 4).ToUInt (false); colors_important = data.Mid (offset + 36, 4).ToUInt (false); } #endregion #region Public Properties /// /// Gets the size of the structure in bytes. /// /// /// A value containing the number of /// bytes in the structure. /// public uint HeaderSize { get {return size;} } /// /// Gets the number of planes in the image. /// /// /// A value containing the number of /// planes. /// public ushort Planes { get {return planes;} } /// /// Gets the number of bits per pixel. /// /// /// A value containing the number of /// bits per pixel, equivalent to the log base 2 of the /// maximum number of colors. /// public ushort BitCount { get {return bit_count;} } /// /// Gets the compression ID for image. /// /// /// A four-byte object containing /// the ID of the compression system (codec) used by the /// image. /// public ByteVector CompressionId { get {return compression_id;} } /// /// Gets the size of the image in bytes. /// /// /// A value containing the number of /// bytes in the image. /// public uint ImageSize { get {return size_of_image;} } /// /// Gets the horizontal resolution of the target device. /// /// /// A value containing the number of /// pixels-per-meter in the hoizontal direction for the /// target device. /// public uint XPixelsPerMeter { get {return x_pixels_per_meter;} } /// /// Gets the vertical resolution of the target device. /// /// /// A value containing the number of /// pixels-per-meter in the vertical direction for the /// target device. /// public uint YPixelsPerMeter { get {return y_pixels_per_meter;} } /// /// Gets the number of colors in the image. /// /// /// A value containing the number of /// colors. /// public uint ColorsUsed { get {return colors_used;} } /// /// Gets the number of colors important in displaying the /// image. /// /// /// A value containing the number of /// important colors. /// public uint ImportantColors { get {return colors_important;} } #endregion #region IVideoCodec /// /// Gets the width of the video represented by the current /// instance. /// /// /// A value containing the width of the /// video represented by the current instance. /// public int VideoWidth { get {return (int)width;} } /// /// Gets the height of the video represented by the current /// instance. /// /// /// A value containing the height of the /// video represented by the current instance. /// public int VideoHeight { get {return (int)height;} } /// /// Gets the types of media represented by the current /// instance. /// /// /// Always . /// public MediaTypes MediaTypes { get {return MediaTypes.Video;} } /// /// Gets the duration of the media represented by the current /// instance. /// /// /// Always . /// public TimeSpan Duration { get {return TimeSpan.Zero;} } /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public string Description { get { string id = CompressionId.ToString (StringType.UTF8) .ToUpper (CultureInfo.InvariantCulture); switch (id) { case "AEMI": return "Array VideoONE MPEG1-I capture"; case "ALPH": return "Ziracom Video"; case "AMPG": return "Array VideoONE capture/compression"; case "ANIM": return "Intel RDX"; case "AP41": return "Microsoft Corporation Video"; case "AUR2": return "AuraVision Aura 2 codec"; case "AURA": return "AuraVision Aura 1 codec"; case "AUVX": return "USH GmbH AUVX video codec"; case "BT20": return "Brooktree MediaStream codec"; case "BTCV": return "Brooktree composite video codec"; case "CC12": return "Intel YUV12 codec"; case "CDVC": return "Canopus DV codec"; case "CGDI": return "Microsoft CamCorder in Office 97 (screen capture codec)"; case "CHAM": return "Winnov Caviara Champagne"; case "CM10": return "CyberLink Corporation MediaShow 1.0"; case "CPLA": return "Weitek 4:2:0 YUV planar"; case "CT10": return "CyberLink Corporation TalkingShow 1.0"; case "CVID": return "Cinepak by SuperMac"; case "CWLT": return "Microsoft Corporation Video"; case "CYUV": return "Creative Labs YUV"; case "DIV3": case "MP43": return "Microsoft MPEG-4 Version 3 Video"; case "DIV4": return "Microsoft Corporation Video"; case "DIVX": return "DivX Video"; case "DJPG": return "Broadway 101 Motion JPEG codec"; case "DP16": return "YUV411 with DPCM 6-bit compression"; case "DP18": return "YUV411 with DPCM 8-bit compression"; case "DP26": return "YUV422 with DPCM 6-bit compression"; case "DP28": return "YUV422 with DPCM 8-bit compression"; case "DP96": return "YVU9 with DPCM 6-bit compression"; case "DP98": return "YVU9 with DPCM 8-bit compression"; case "DP9L": return "YVU9 with DPCM 6-bit compression and thinned-out"; case "DUCK": return "The Duck Corporation TrueMotion 1.0"; case "DV25": return "SMPTE 314M 25Mb/s compressed"; case "DV50": return "SMPTE 314M 50Mb/s compressed"; case "DVE2": return "DVE-2 videoconferencing codec"; case "DVH1": return "DVC Pro HD"; case "DVHD": return "DV data as defined in Part 3 of the Specification of Consumer-use Digital VCRs"; case "DVNM": return "Matsushita Electric Industrial Co., Ltd. Video"; case "DVSD": return "DV data as defined in Part 2 of the Specification of Consumer-use Digital VCRs"; case "DVSL": return "DV data as defined in Part 6 of Specification of Consumer-use Digital VCRs"; case "DVX1": return "Lucent DVX1000SP video decoder."; case "DVX2": return "Lucent DVX2000S video decoder"; case "DVX3": return "Lucent DVX3000S video decoder"; case "DXTC": return "DirectX texture compression"; case "DX50": return "DivX Version 5 Video"; case "EMWC": return "EverAd Marquee WMA codec"; case "ETV1": case "ETV2": case "ETVC": return "eTreppid video codec"; case "FLJP": return "Field-encoded motion JPEG with LSI bitstream format"; case "FRWA": return "Softlab-Nsk Ltd. Forward alpha"; case "FRWD": return "Softlab-Nsk Ltd. Forward JPEG"; case "FRWT": return "Softlab-Nsk Ltd. Forward JPEG+alpha"; case "FVF1": return "Iterated Systems, Inc. Fractal video frame"; case "FXT1": return "3dfx Interactive, Inc. Video"; case "GWLT": return "Microsoft Corporation Video"; case "H260": case "H261": case "H262": case "H263": case "H264": case "H265": case "H266": case "H267": case "H268": case "H269": return "Intel " + CompressionId.ToString (StringType.UTF8) + " Conferencing codec"; case "I263": return "Intel I263"; case "I420": return "Intel Indeo 4 codec"; case "IAN": return "Intel RDX"; case "ICLB": return "InSoft, Inc. CellB videoconferencing codec"; case "IFO9": return "Intel intermediate YUV9"; case "ILVC": return "Intel layered Video"; case "ILVR": return "ITU-T's H.263+ compression standard"; case "IMAC": return "Intel hardware motion compensation"; case "IPDV": return "IEEE 1394 digital video control and capture board format"; case "IRAW": return "Intel YUV uncompressed"; case "ISME": return "Intel's next-generation video codec"; case "IUYV": return "UYVY interlaced (even, then odd lines)"; case "IV30": case "IV31": case "IV32": case "IV33": case "IV34": case "IV35": case "IV36": case "IV37": case "IV38": case "IV39": return "Intel Indeo Video Version 3"; case "IV40": case "IV41": case "IV42": case "IV43": case "IV44": case "IV45": case "IV46": case "IV47": case "IV48": case "IV49": return "Intel Indeo Video Version 4"; case "IV50": return "Intel Indeo Video Version 5"; case "IY41": return "LEAD Technologies, Inc. Y41P interlaced (even, then odd lines)"; case "IYU1": return "IEEE 1394 Digital Camera 1.04 Specification: mode 2, 12-bit YUV (4:1:1)"; case "IYU2": return "IEEE 1394 Digital Camera 1.04 Specification: mode 2, 24 bit YUV (4:4:4)"; case "JPEG": return "Microsoft Corporation Still image JPEG DIB."; case "LEAD": return "LEAD Technologies, Inc. Proprietary MCMP compression"; case "LIA1": return "Liafail"; case "LJPG": return "LEAD Technologies, Inc. Lossless JPEG compression"; case "LSV0": return "Infinop Inc. Video"; case "LSVC": return "Infinop Lightning Strike constant bit rate video codec"; case "LSVW": return "Infinop Lightning Strike multiple bit rate video codec"; case "M101": return "Matrox Electronic Systems, Ltd. Uncompressed field-based YUY2"; case "M4S2": return "Microsoft ISO MPEG-4 video V1.1"; case "MJPG": return "Motion JPEG"; case "MMES": return "Matrox MPEG-2 elementary video stream"; case "MMIF": return "Matrox MPEG-2 elementary I-frame-only video stream"; case "MP2A": return "Media Excel Inc. MPEG-2 audio"; case "MP2T": return "Media Excel Inc. MPEG-2 transport"; case "MP2V": return "Media Excel Inc. MPEG-2 video"; case "MP42": return "Microsoft MPEG-4 video codec V2"; case "MP4A": return "Media Excel Inc. MPEG-4 audio"; case "MP4S": return "Microsoft ISO MPEG-4 video V1.0"; case "MP4T": return "Media Excel Inc. MPEG-4 transport"; case "MP4V": return "Media Excel Inc. MPEG-4 video"; case "MPEG": return "Chromatic Research, Inc. MPEG-1 video, I frame"; case "MPG4": return "Microsoft MPEG-4 Version 1 Video"; case "MRCA": return "FAST Multimedia AG Mrcodec"; case "MRLE": return "Microsoft Run length encoding"; case "MSS1": return "Microsoft screen codec V1"; case "MSV1": return "Microsoft video codec V1"; case "MSVC": return "Microsoft Video 1"; case "MV10": case "MV11": case "MV12": case "MV99": case "MVC1": case "MVC2": case "MVC9": return "Nokia MVC video codec"; case "NTN1": return "Nogatech video compression 1"; case "NY12": return "Nogatech YUV 12 format"; case "NYUV": return "Nogatech YUV 422 format"; case "PCL2": return "Pinnacle RL video codec"; case "PCLE": return "Pinnacle Studio 400 video codec"; case "PHMO": return "IBM Corporation Photomotion"; case "QPEG": return "Q-Team QPEG 1.1 format video codec"; case "RGBT": return "Computer Concepts Ltd. 32-bit support"; case "RIVA": return "NVIDIA Corporation Swizzled texture format"; case "RLND": return "Roland Corporation Video"; case "RT21": return "Intel Indeo 2.1"; case "RVX": return "Intel RDX"; case "S263": return "Sorenson Vision H.263"; case "SCCD": return "Luminositi SoftCam codec"; case "SDCC": return "Sun Digital Camera codec"; case "SFMC": return "Crystal Net SFM codec"; case "SMSC": case "SMSD": return "Radius Proprietary"; case "SPLC": return "Splash Studios ACM audio codec"; case "SQZ2": return "Microsoft VXtreme video codec V2"; case "STVA": return "ST CMOS Imager Data (Bayer)"; case "STVB": return "ST CMOS Imager Data (Nudged Bayer)"; case "STVC": return "ST CMOS Imager Data (Bunched)"; case "SV10": return "Sorenson Video R1"; case "SV3M": return "Sorenson SV3 module decoder"; case "TLMS": case "TLST": return "TeraLogic motion intraframe codec"; case "TM20": return "The Duck Corporation TrueMotion 2.0"; case "TMIC": return "TeraLogic motion intraframe codec"; case "TMOT": return "TrueMotion video compression algorithm"; case "TR20": return "The Duck Corporation TrueMotion RT 2.0"; case "ULTI": return "IBM Corporation Ultimotion"; case "UYVP": return "Evans & Sutherland YCbCr 4:2:2 extended precision, 10 bits per component (U0Y0V0Y1)"; case "V261": return "Lucent VX3000S video codec"; case "V422": return "VITEC Multimedia 24-bit YUV 4:2:2 format (CCIR 601)"; case "V655": return "VITEC Multimedia 16-bit YUV 4:2:2 format"; case "VCR1": return "ATI VCR 1.0"; case "VCWV": return "VideoCon wavelet"; case "VDCT": return "VITEC Multimedia Video Maker Pro DIB"; case "VIDS": return "VITEC Multimedia YUV 4:2:2 CCIR 601 for v422"; case "VGPX": return "Alaris VGPixel video"; case "VIVO": return "Vivo H.263 video codec"; case "VIXL": return "miro Computer Products AG"; case "VJPG": return "Video Communication Systems - A JPEG-based compression scheme for RGB bitmaps"; case "VLV1": return "VideoLogic Systems VLCAP.DRV"; case "VQC1": return "ViewQuest Technologies Inc. 0x31435156"; case "VQC2": return "ViewQuest Technologies Inc. 0x32435156"; case "VQJP": return "ViewQuest Technologies Inc. VQ630 dual-mode digital camera"; case "VQS4": return "ViewQuest Technologies Inc. VQ110 digital video camera"; case "VX1K": return "Lucent VX1000S video codec"; case "VX2K": return "Lucent VX2000S video codec"; case "VXSP": return "Lucent VX1000SP video codec9"; case "WBVC": return "Winbond Electronics Corporation W9960"; case "WINX": return "Winnov, Inc. Video"; case "WJPG": return "Winbond motion JPEG bitstream format"; case "WMV1": return "Microsoft Windows Media Video Version 7"; case "WMV2": return "Microsoft Windows Media Video Version 8"; case "WMV3": return "Microsoft Windows Media Video Version 9"; case "WNV1": case "WPY2": return "Winnov, Inc. Video"; case "WZCD": return "CORE Co. Ltd. iScan"; case "WZDC": return "CORE Co. Ltd. iSnap"; case "XJPG": return "Xirlink JPEG-like compressor"; case "XLV0": return "XL video decoder"; case "XVID": return "XviD Video"; case "YC12": return "Intel YUV12 Video"; case "YCCK": return "Uncompressed YCbCr Video with key data"; case "YU92": return "Intel YUV Video"; case "YUV8": return "Winnov Caviar YUV8 Video"; case "YUV9": return "Intel YUV Video"; case "YUYP": return "Evans & Sutherland YCbCr 4:2:2 extended precision, 10 bits per component Video"; case "YUYV": return "Canopus YUYV Compressor Video"; case "ZPEG": return "Metheus Corporation Video Zipper"; case "ZPG1": case "ZPG2": case "ZPG3": case "ZPG4": return "VoDeo Solutions Video"; default: return string.Format ( CultureInfo.InvariantCulture, "Unknown Image ({0})", CompressionId); } } } #endregion #region IEquatable /// /// Generates a hash code for the current instance. /// /// /// A value containing the hash code for /// the current instance. /// public override int GetHashCode () { unchecked { return (int) (size ^ width ^ height ^ planes ^ bit_count ^ compression_id.ToUInt () ^ size_of_image ^ x_pixels_per_meter ^ y_pixels_per_meter ^ colors_used ^ colors_important); } } /// /// Checks whether or not the current instance is equal to /// another object. /// /// /// A to compare to the current /// instance. /// /// /// A value indicating whether or not the /// current instance is equal to . /// /// public override bool Equals (object other) { if (!(other is BitmapInfoHeader)) return false; return Equals ((BitmapInfoHeader) other); } /// /// Checks whether or not the current instance is equal to /// another instance of . /// /// /// A object to compare to /// the current instance. /// /// /// A value indicating whether or not the /// current instance is equal to . /// /// public bool Equals (BitmapInfoHeader other) { return size == other.size && width == other.width && height == other.height && planes == other.planes && bit_count == other.bit_count && compression_id == other.compression_id && size_of_image == other.size_of_image && x_pixels_per_meter == other.x_pixels_per_meter && y_pixels_per_meter == other.y_pixels_per_meter && colors_used == other.colors_used && colors_important == other.colors_important; } /// /// Gets whether or not two instances of are equal to eachother. /// /// /// A object to compare. /// /// /// A object to compare. /// /// /// if is /// equal to . Otherwise, . /// public static bool operator == (BitmapInfoHeader first, BitmapInfoHeader second) { return first.Equals (second); } /// /// Gets whether or not two instances of differ. /// /// /// A object to compare. /// /// /// A object to compare. /// /// /// if is /// unequal to . Otherwise, . /// public static bool operator != (BitmapInfoHeader first, BitmapInfoHeader second) { return !first.Equals (second); } #endregion } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Riff/AviHeaderList.cs0000644000175000017500000002412211462100402024134 0ustar00rubenruben00000000000000// // AviHeaderList.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using System.Runtime.InteropServices; namespace TagLib.Riff { /// /// This class provides support for reading an AVI header list to /// extract stream information. /// public class AviHeaderList { /// /// Contains the AVI header. /// AviHeader header; /// /// Contains the AVI codec information. /// List codecs = new List (); /// /// Constructs and initializes a new instance of by reading the contents of a raw /// RIFF list from a specified position in a . /// /// /// A object containing the file /// from which the contents of the new instance is to be /// read. /// /// /// A value specify at what position to /// read the list. /// /// /// A value specifying the number of bytes /// to read. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// /// /// The list does not contain an AVI header or the AVI header /// is the wrong length. /// public AviHeaderList (TagLib.File file, long position, int length) { if (file == null) throw new ArgumentNullException ("file"); if (length < 0) throw new ArgumentOutOfRangeException ( "length"); if (position < 0 || position > file.Length - length) throw new ArgumentOutOfRangeException ( "position"); List list = new List (file, position, length); if (!list.ContainsKey ("avih")) throw new CorruptFileException ( "Avi header not found."); ByteVector header_data = list ["avih"][0]; if (header_data.Count != 0x38) throw new CorruptFileException ( "Invalid header length."); header = new AviHeader (header_data, 0); foreach (ByteVector list_data in list ["LIST"]) if (list_data.StartsWith ("strl")) codecs.Add (AviStream .ParseStreamList (list_data) .Codec); } /// /// Gets the header for the current instance. /// /// /// A object containing the header /// for the current instance. /// public AviHeader Header { get {return header;} } /// /// Gets the codecs contained in the current instance. /// /// /// A containing the codecs contained /// in the current instance. /// public ICodec [] Codecs { get {return codecs.ToArray ();} } } /// /// This structure provides a representation of a Microsoft /// AviMainHeader structure, minus the first 8 bytes. /// public struct AviHeader { /// /// Contains the number of microseconds per frame. /// uint microseconds_per_frame; /// /// Contains the maximum number of bytes per second. /// uint max_bytes_per_second; /// /// Contains the flags. /// uint flags; /// /// Contains the total number of frames. /// uint total_frames; /// /// Contains the number of initial frames. /// uint initial_frames; /// /// Contains the number of streams. /// uint streams; /// /// Contains the suggested buffer size. /// uint suggested_buffer_size; /// /// Contains the video width. /// uint width; /// /// Contains the video height. /// uint height; /// /// Constructs and initializes a new instance of by reading the raw structure from the /// beginning of a object. /// /// /// A object containing the raw /// data structure. /// /// /// is . /// /// /// contains less than 40 bytes. /// [Obsolete("Use AviHeader(ByteVector,int)")] public AviHeader (ByteVector data) : this (data, 0) { } /// /// Constructs and initializes a new instance of by reading the raw structure /// from a specified position in a /// object. /// /// /// A object containing the raw /// data structure. /// /// /// A value specifying the index in /// at which the structure begins. /// /// /// is . /// /// /// is less than zero. /// /// /// contains less than 40 bytes at /// . /// public AviHeader (ByteVector data, int offset) { if (data == null) throw new ArgumentNullException ("data"); if (offset < 0) throw new ArgumentOutOfRangeException ( "offset"); if (offset + 40 > data.Count) throw new CorruptFileException ( "Expected 40 bytes."); microseconds_per_frame = data.Mid (offset, 4).ToUInt (false); max_bytes_per_second = data.Mid (offset + 4, 4).ToUInt (false); flags = data.Mid (offset + 12, 4).ToUInt (false); total_frames = data.Mid (offset + 16, 4).ToUInt (false); initial_frames = data.Mid (offset + 20, 4).ToUInt (false); streams = data.Mid (offset + 24, 4).ToUInt (false); suggested_buffer_size = data.Mid (offset + 28, 4).ToUInt (false); width = data.Mid (offset + 32, 4).ToUInt (false); height = data.Mid (offset + 36, 4).ToUInt (false); } /// /// Gets the number of microseconds per frame. /// /// /// A value specifying number of /// microseconds per frame. /// public uint MicrosecondsPerFrame { get {return microseconds_per_frame;} } /// /// Gets the maximum number of bytes per second. /// /// /// A value specifying maximum number of /// bytes per second. /// public uint MaxBytesPerSecond { get {return max_bytes_per_second;} } /// /// Gets the file flags. /// /// /// A value specifying file flags. /// public uint Flags { get {return flags;} } /// /// Gets the number of frames in the file. /// /// /// A value specifying the number of /// frames in the file. /// public uint TotalFrames { get {return total_frames;} } /// /// Gets how far ahead audio is from video. /// /// /// A value specifying how far ahead /// audio is from video. /// public uint InitialFrames { get {return initial_frames;} } /// /// Gets the number of streams in the file. /// /// /// A value specifying the number of /// streams in the file. /// public uint Streams { get {return streams;} } /// /// Gets the suggested buffer size for the file. /// /// /// A value specifying the buffer size. /// public uint SuggestedBufferSize { get {return suggested_buffer_size;} } /// /// Gets the width of the video in the file. /// /// /// A value containing the width of the /// video. /// public uint Width { get {return width;} } /// /// Gets the height of the video in the file. /// /// /// A value containing the height of the /// video. /// public uint Height { get {return height;} } /// /// Gets the duration of the media in the file. /// /// /// A value containing the duration /// of the file. /// public TimeSpan Duration { get { return TimeSpan.FromMilliseconds ( (double) TotalFrames * (double) MicrosecondsPerFrame / 1000.0); } } } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Riff/WaveFormatEx.cs0000644000175000017500000005240111462100402024021 0ustar00rubenruben00000000000000// // WaveFormatEx.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Riff { /// /// This structure provides a representation of a Microsoft /// WaveFormatEx structure. /// public struct WaveFormatEx : IAudioCodec, ILosslessAudioCodec { #region Private Fields /// /// Contains the format tag of the audio. /// ushort format_tag; /// /// Contains the number of audio channels. /// ushort channels; /// /// Contains the number of samples per second. /// uint samples_per_second; /// /// Contains the average number of bytes per second. /// uint average_bytes_per_second; /// /// Contains the number of bits per sample. /// ushort bits_per_sample; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading the raw structure from /// the beginning of a object. /// /// /// A object containing the raw /// data structure. /// /// /// is . /// /// /// contains less than 16 bytes. /// [Obsolete("Use WaveFormatEx(ByteVector,int)")] public WaveFormatEx (ByteVector data) : this (data, 0) { } /// /// Constructs and initializes a new instance of by reading the raw structure from /// a specified position in a /// object. /// /// /// A object containing the raw /// data structure. /// /// /// A value specifying the index in /// at which the structure begins. /// /// /// is . /// /// /// is less than zero. /// /// /// contains less than 16 bytes at /// . /// public WaveFormatEx (ByteVector data, int offset) { if (data == null) throw new ArgumentNullException ("data"); if (offset < 0) throw new ArgumentOutOfRangeException ( "offset"); if (offset + 16 > data.Count) throw new CorruptFileException ( "Expected 16 bytes."); format_tag = data.Mid (offset, 2).ToUShort (false); channels = data.Mid (offset + 2, 2).ToUShort (false); samples_per_second = data.Mid (offset + 4, 4) .ToUInt (false); average_bytes_per_second = data.Mid (offset + 8, 4) .ToUInt (false); bits_per_sample = data.Mid (offset + 14, 2) .ToUShort (false); } #endregion #region Public Properties /// /// Gets the format tag of the audio described by the /// current instance. /// /// /// A value containing the format tag /// of the audio. /// /// /// Format tags indicate the codec of the audio contained in /// the file and are contained in a Microsoft registry. For /// a description of the format, use . /// public ushort FormatTag { get {return format_tag;} } /// /// Gets the average bytes per second of the audio described /// by the current instance. /// /// /// A value containing the average /// bytes per second of the audio. /// public uint AverageBytesPerSecond { get {return average_bytes_per_second;} } /// /// Gets the bits per sample of the audio described by the /// current instance. /// /// /// A value containing the bits per /// sample of the audio. /// public ushort BitsPerSample { get {return bits_per_sample;} } #endregion #region ILosslessAudioCodec int ILosslessAudioCodec.BitsPerSample { get {return bits_per_sample;} } #endregion #region IAudioCodec /// /// Gets the bitrate of the audio represented by the current /// instance. /// /// /// A value containing a bitrate of the /// audio represented by the current instance. /// public int AudioBitrate { get { return (int) Math.Round ( average_bytes_per_second * 8d / 1000d); } } /// /// Gets the sample rate of the audio represented by the /// current instance. /// /// /// A value containing the sample rate of /// the audio represented by the current instance. /// public int AudioSampleRate { get {return (int) samples_per_second;} } /// /// Gets the number of channels in the audio represented by /// the current instance. /// /// /// A value containing the number of /// channels in the audio represented by the current /// instance. /// public int AudioChannels { get {return channels;} } /// /// Gets the types of media represented by the current /// instance. /// /// /// Always . /// public MediaTypes MediaTypes { get {return MediaTypes.Audio;} } /// /// Gets the duration of the media represented by the current /// instance. /// /// /// Always . /// public TimeSpan Duration { get {return TimeSpan.Zero;} } /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public string Description { get { switch (FormatTag) { case 0x0000: return "Unknown Wave Format"; case 0x0001: return "PCM Audio"; case 0x0002: return "Microsoft Adaptive PCM Audio"; case 0x0003: return "PCM Audio in IEEE floating-point format"; case 0x0004: return "Compaq VSELP Audio"; case 0x0005: return "IBM CVSD Audio"; case 0x0006: return "Microsoft ALAW Audio"; case 0x0007: return "Microsoft MULAW Audio"; case 0x0008: return "Microsoft DTS Audio"; case 0x0009: return "Microsoft DRM Encrypted Audio"; case 0x000A: return "Microsoft Speech Audio"; case 0x000B: return "Microsoft Windows Media RT Voice Audio"; case 0x0010: return "OKI ADPCM Audio"; case 0x0011: return "Intel ADPCM Audio"; case 0x0012: return "VideoLogic ADPCM Audio"; case 0x0013: return "Sierra ADPCM Audio"; case 0x0014: return "Antex ADPCM Audio"; case 0x0015: return "DSP DIGISTD Audio"; case 0x0016: return "DSP DIGIFIX Audio"; case 0x0017: return "Dialogic OKI ADPCM Audio"; case 0x0018: return "Media Vision ADPCM Audio for Jazz 16"; case 0x0019: return "Hewlett-Packard CU Audio"; case 0x001A: return "Hewlett-Packard Dynamic Voice Audio"; case 0x0020: return "Yamaha ADPCM Audio"; case 0x0021: return "Speech Compression Audio"; case 0x0022: return "DSP Group True Speech Audio"; case 0x0023: return "Echo Speech Audio"; case 0x0024: return "Ahead AF36 Audio"; case 0x0025: return "Audio Processing Technology Audio"; case 0x0026: return "Ahead AF10 Audio"; case 0x0027: return "Aculab Prosody CTI Speech Card Audio"; case 0x0028: return "Merging Technologies LRC Audio"; case 0x0030: return "Dolby AC2 Audio"; case 0x0031: return "Microsoft GSM6.10 Audio"; case 0x0032: return "Microsoft MSN Audio"; case 0x0033: return "Antex ADPCME Audio"; case 0x0034: return "Control Resources VQLPC"; case 0x0035: return "DSP REAL Audio"; case 0x0036: return "DSP ADPCM Audio"; case 0x0037: return "Control Resources CR10 Audio"; case 0x0038: return "Natural MicroSystems VBXADPCM Audio"; case 0x0039: return "Roland RDAC Proprietary Audio Format"; case 0x003A: return "Echo Speech Proprietary Audio Compression Format"; case 0x003B: return "Rockwell ADPCM Audio"; case 0x003C: return "Rockwell DIGITALK Audio"; case 0x003D: return "Xebec Proprietary Audio Compression Format"; case 0x0040: return "Antex G721 ADPCM Audio"; case 0x0041: return "Antex G728 CELP Audio"; case 0x0042: return "Microsoft MSG723 Audio"; case 0x0043: return "Microsoft MSG723.1 Audio"; case 0x0044: return "Microsoft MSG729 Audio"; case 0x0045: return "Microsoft SPG726 Audio"; case 0x0050: return "Microsoft MPEG Audio"; case 0x0052: return "InSoft RT24 Audio"; case 0x0053: return "InSoft PAC Audio"; case 0x0055: return "ISO/MPEG Layer 3 Audio"; case 0x0059: return "Lucent G723 Audio"; case 0x0060: return "Cirrus Logic Audio"; case 0x0061: return "ESS Technology PCM Audio"; case 0x0062: return "Voxware Audio"; case 0x0063: return "Canopus ATRAC Audio"; case 0x0064: return "APICOM G726 ADPCM Audio"; case 0x0065: return "APICOM G722 ADPCM Audio"; case 0x0067: return "Microsoft DSAT Display Audio"; case 0x0069: return "Voxware Byte Aligned Audio"; case 0x0070: return "Voxware AC8 Audio"; case 0x0071: return "Voxware AC10 Audio"; case 0x0072: return "Voxware AC16 Audio"; case 0x0073: return "Voxware AC20 Audio"; case 0x0074: return "Voxware RT24 Audio"; case 0x0075: return "Voxware RT29 Audio"; case 0x0076: return "Voxware RT29HW Audio"; case 0x0077: return "Voxware VR12 Audio"; case 0x0078: return "Voxware VR18 Audio"; case 0x0079: return "Voxware TQ40 Audio"; case 0x007A: return "Voxware SC3 Audio"; case 0x007B: return "Voxware SC3 Audio"; case 0x0080: return "SoftSound Audio"; case 0x0081: return "Voxware TQ60 Audio"; case 0x0082: return "Microsoft RT24 Audio"; case 0x0083: return "AT&T G729A Audio"; case 0x0084: return "Motion Pixels MVI2 Audio"; case 0x0085: return "Datafusion Systems G726 Audio"; case 0x0086: return "Datafusion Systems G610 Audio"; case 0x0088: return "Iterated Systems Audio"; case 0x0089: return "OnLive! Audio"; case 0x008A: return "Multitude FT SX20 Audio"; case 0x008B: return "InfoCom ITS ACM G721 Audio"; case 0x008C: return "Convedia G729 Audio"; case 0x008D: return "Congruency Audio"; case 0x0091: return "Siemens Business Communications 24 Audio"; case 0x0092: return "Sonic Foundary Dolby AC3 Audio"; case 0x0093: return "MediaSonic G723 Audio"; case 0x0094: return "Aculab Prosody CTI Speech Card Audio"; case 0x0097: return "ZyXEL ADPCM"; case 0x0098: return "Philips Speech Processing LPCBB Audio"; case 0x0099: return "Studer Professional PACKED Audio"; case 0x00A0: return "Malden Electronics Phony Talk Audio"; case 0x00A1: return "Racal Recorder GSM Audio"; case 0x00A2: return "Racal Recorder G720.a Audio"; case 0x00A3: return "Racal G723.1 Audio"; case 0x00A4: return "Racal Tetra ACELP Audio"; case 0x00B0: return "NEC AAC Audio"; case 0x0100: return "Rhetorex ADPCM Audio"; case 0x0101: return "BeCubed IRAT Audio"; case 0x0111: return "Vivo G723 Audio"; case 0x0112: return "Vivo Siren Audio"; case 0x0120: return "Philips Speach Processing CELP Audio"; case 0x0121: return "Philips Speach Processing GRUNDIG Audio"; case 0x0123: return "Digital Equipment Corporation G723 Audio"; case 0x0125: return "Sanyo LD-ADPCM Audio"; case 0x0130: return "Sipro Lab ACELPNET Audio"; case 0x0131: return "Sipro Lab ACELP4800 Audio"; case 0x0132: return "Sipro Lab ACELP8v3 Audio"; case 0x0133: return "Sipro Lab G729 Audio"; case 0x0134: return "Sipro Lab G729A Audio"; case 0x0135: return "Sipro Lab KELVIN Audio"; case 0x0136: return "VoiceAge AMR Audio"; case 0x0140: return "Dictaphone G726 ADPCM Audio"; case 0x0141: return "Dictaphone CELP68 Audio"; case 0x0142: return "Dictaphone CELP54 Audio"; case 0x0150: return "QUALCOMM Pure Voice Audio"; case 0x0151: return "QUALCOMM Half Rate Audio"; case 0x0155: return "Ring Zero TUBGSM Audio"; case 0x0160: return "Microsoft WMA1 Audio"; case 0x0161: return "Microsoft WMA2 Audio"; case 0x0162: return "Microsoft Multichannel WMA Audio"; case 0x0163: return "Microsoft Lossless WMA Audio"; case 0x0170: return "Unisys NAP ADPCM Audio"; case 0x0171: return "Unisys NAP ULAW Audio"; case 0x0172: return "Unisys NAP ALAW Audio"; case 0x0173: return "Unisys NAP 16K Audio"; case 0X0174: return "SysCom ACM SYC008 Audio"; case 0x0175: return "SysCom ACM SYC701 G726L Audio"; case 0x0176: return "SysCom ACM SYC701 CELP54 Audio"; case 0x0177: return "SysCom ACM SYC701 CELP68 Audio"; case 0x0178: return "Knowledge Adventure ADPCM Audio"; case 0x0180: return "MPEG2 AAC Audio"; case 0x0190: return "Digital Theater Systems DTS DS Audio"; case 0x1979: return "Innings ADPCM Audio"; case 0x0200: return "Creative ADPCM Audio"; case 0x0202: return "Creative FastSpeech8 Audio"; case 0x0203: return "Creative FastSpeech10 Audio"; case 0x0210: return "UHER ADPCM Audio"; case 0x0220: return "Quarterdeck Audio"; case 0x0230: return "I-Link VC Audio"; case 0x0240: return "Aureal RAW SPORT Audio"; case 0x0250: return "Interactive Prodcuts HSX Audio"; case 0x0251: return "Interactive Products RPELP Audio"; case 0x0260: return "Consistens Software CS2 Audio"; case 0x0270: return "Sony SCX Audio"; case 0x0271: return "Sony SCY Audio"; case 0x0272: return "Sony ATRAC3 Audio"; case 0x0273: return "Sony SPC Audio"; case 0x0280: return "Telum Audio"; case 0x0281: return "Telum IA Audio"; case 0x0285: return "Norcom Voice Systems ADPCM Audio"; case 0x0300: return "Fujitsu FM TOWNS SND Audio"; case 0x0301: case 0x0302: case 0x0303: case 0x0304: case 0x0305: case 0x0306: case 0x0307: case 0x0308: return "Unknown Fujitsu Audio"; case 0x0350: return "Micronas Semiconductors Development Audio"; case 0x0351: return "Micronas Semiconductors CELP833 Audio"; case 0x0400: return "Brooktree Digital Audio"; case 0x0450: return "QDesign Audio"; case 0x0680: return "AT&T VME VMPCM Audio"; case 0x0681: return "AT&T TPC Audio"; case 0x1000: return "Ing. C. Olivetti & C., S.p.A. GSM Audio"; case 0x1001: return "Ing. C. Olivetti & C., S.p.A. ADPCM Audio"; case 0x1002: return "Ing. C. Olivetti & C., S.p.A. CELP Audio"; case 0x1003: return "Ing. C. Olivetti & C., S.p.A. SBC Audio"; case 0x1004: return "Ing. C. Olivetti & C., S.p.A. OPR Audio"; case 0x1100: return "Lernout & Hauspie Audio"; case 0X1101: return "Lernout & Hauspie CELP Audio"; case 0X1102: return "Lernout & Hauspie SB8 Audio"; case 0X1103: return "Lernout & Hauspie SB12 Audio"; case 0X1104: return "Lernout & Hauspie SB16 Audio"; case 0x1400: return "Norris Audio"; case 0x1500: return "AT&T Soundspace Musicompress Audio"; case 0x1971: return "Sonic Foundry Lossless Audio"; case 0x2000: return "FAST Multimedia DVM Audio"; case 0x4143: return "Divio AAC"; case 0x4201: return "Nokia Adaptive Multirate Audio"; case 0x4243: return "Divio G726 Audio"; case 0x7000: return "3Com NBX Audio"; case 0x7A21: return "Microsoft Adaptive Multirate Audio"; case 0x7A22: return "Microsoft Adaptive Multirate Audio with silence detection"; case 0xA100: return "Comverse Infosys G723 1 Audio"; case 0xA101: return "Comverse Infosys AVQSBC Audio"; case 0xA102: return "Comverse Infosys OLDSBC Audio"; case 0xA103: return "Symbol Technology G729A Audio"; case 0xA104: return "VoiceAge AMR WB Audio"; case 0xA105: return "Ingenient G726 Audio"; case 0xA106: return "ISO/MPEG-4 Advanced Audio Coding"; case 0xA107: return "Encore G726 Audio"; default: return "Unknown Audio (" + FormatTag + ")"; } } } #endregion #region IEquatable /// /// Generates a hash code for the current instance. /// /// /// A value containing the hash code for /// the current instance. /// public override int GetHashCode () { unchecked { return (int) (format_tag ^ channels ^ samples_per_second ^ average_bytes_per_second ^ bits_per_sample); } } /// /// Checks whether or not the current instance is equal to /// another object. /// /// /// A to compare to the current /// instance. /// /// /// A value indicating whether or not the /// current instance is equal to . /// /// public override bool Equals (object other) { if (!(other is WaveFormatEx)) return false; return Equals ((WaveFormatEx) other); } /// /// Checks whether or not the current instance is equal to /// another instance of . /// /// /// A object to compare to the /// current instance. /// /// /// A value indicating whether or not the /// current instance is equal to . /// /// public bool Equals (WaveFormatEx other) { return format_tag == other.format_tag && channels == other.channels && samples_per_second == other.samples_per_second && average_bytes_per_second == other.average_bytes_per_second && bits_per_sample == other.bits_per_sample; } /// /// Gets whether or not two instances of are equal to eachother. /// /// /// A object to compare. /// /// /// A object to compare. /// /// /// if is /// equal to . Otherwise, . /// public static bool operator == (WaveFormatEx first, WaveFormatEx second) { return first.Equals (second); } /// /// Gets whether or not two instances of differ. /// /// /// A object to compare. /// /// /// A object to compare. /// /// /// if is /// unequal to . Otherwise, . /// public static bool operator != (WaveFormatEx first, WaveFormatEx second) { return !first.Equals (second); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Riff/ListTag.cs0000644000175000017500000003512711462100402023026 0ustar00rubenruben00000000000000// // ListTag.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Riff { /// /// This abstract class extends to provide support /// for reading and writing tags stored in the RIFF list format. /// public abstract class ListTag : Tag { #region Private Fields /// /// Contains the object. /// List fields; #endregion #region Constructors /// /// Constructs and initializes a new instance of with no contents. /// protected ListTag () { fields = new List (); } /// /// Constructs and initializes a new instance of using a specified RIFF list. /// /// /// A object to use in the new instance. /// /// /// is . /// protected ListTag (List fields) { if (fields == null) throw new ArgumentNullException ("fields"); this.fields = fields; } /// /// Constructs and initializes a new instance of by reading the contents of a raw /// RIFF list stored in a object. /// /// /// A containing a raw RIFF list to /// read into the new instance. /// protected ListTag (ByteVector data) { fields = new List (data); } /// /// Constructs and initializes a new instance of by reading the contents of a raw RIFF /// list from a specified position in a . /// /// /// A object containing the file /// from which the contents of the new instance is to be /// read. /// /// /// A value specify at what position to /// read the list. /// /// /// A value specifying the number of bytes /// to read. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// protected ListTag (TagLib.File file, long position, int length) { if (file == null) throw new System.ArgumentNullException ("file"); if (length < 0) throw new ArgumentOutOfRangeException ( "length"); if (position < 0 || position > file.Length - length) throw new ArgumentOutOfRangeException ( "position"); fields = new List (file, position, length); } #endregion #region Public Methods /// /// Renders the current instance enclosed in the appropriate /// item. /// /// /// A object containing the rendered /// version of the current instance. /// public abstract ByteVector RenderEnclosed (); /// /// Renders the current instance enclosed in an item with a /// specified ID. /// /// /// A object containing the ID of /// the item to enclose the current instance in. /// /// /// A object containing the rendered /// version of the current instance. /// /// /// is . /// /// /// isn't exactly four bytes long. /// protected ByteVector RenderEnclosed (ByteVector id) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); return fields.RenderEnclosed (id); } /// /// Renders the current instance as a raw RIFF list. /// /// /// A object containing the rendered /// version of the current instance. /// public ByteVector Render () { return fields.Render (); } /// /// Gets the values for a specified item in the current /// instance as a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A object containing /// the values of the specified item. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public ByteVectorCollection GetValues (ByteVector id) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); return fields.GetValues (id); } /// /// Gets the values for a specified item in the current /// instance as a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A containing the values of the /// specified item. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public string [] GetValuesAsStrings (ByteVector id) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); return fields.GetValuesAsStrings (id); } /// /// Gets the values for a specified item in the current /// instance as a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A object containing the /// values of the specified item. /// /// /// is . /// /// /// isn't exactly four bytes long. /// [Obsolete("Use GetValuesAsStrings(ByteVector)")] public StringCollection GetValuesAsStringCollection (ByteVector id) { return new StringCollection ( fields.GetValuesAsStrings (id)); } /// /// Gets the value for a specified item in the current /// instance as a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A value containing the first value /// with the specified ID that could be converted to an /// integer, or zero if none could be found. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public uint GetValueAsUInt (ByteVector id) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); return fields.GetValueAsUInt (id); } /// /// Sets the value for a specified item in the current /// instance to the contents of a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A containing the values to /// store in the specified item. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public void SetValue (ByteVector id, params ByteVector [] value) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); fields.SetValue (id, value); } /// /// Sets the value for a specified item in the current /// instance to the contents of a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A object containing /// the values to store in the specified item. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public void SetValue (ByteVector id, ByteVectorCollection value) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); fields.SetValue (id, value); } /// /// Sets the value for a specified item in the current /// instance to the value of a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A value to store in the specified /// item. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public void SetValue (ByteVector id, uint value) { fields.SetValue (id, value); } /// /// Sets the value for a specified item in the current /// instance to the contents of a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A object containing the /// values to store in the specified item. /// /// /// is . /// /// /// isn't exactly four bytes long. /// [Obsolete("Use SetValue(ByteVector,string[])")] public void SetValue (ByteVector id, StringCollection value) { fields.SetValue (id, value); } /// /// Sets the value for a specified item in the current /// instance to the contents of a . /// /// /// A object containing the ID of /// the item to set. /// /// /// A containing the values to store /// in the specified item. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public void SetValue (ByteVector id, params string [] value) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); fields.SetValue (id, value); } /// /// Removes the item with the specified ID from the current /// instance. /// /// /// A object containing the ID of /// the item to remove from the current instance. /// /// /// is . /// /// /// isn't exactly four bytes long. /// public void RemoveValue (ByteVector id) { if (id == null) throw new ArgumentNullException ("id"); if (id.Count != 4) throw new ArgumentException ( "ID must be 4 bytes long.", "id"); fields.RemoveValue (id); } #endregion #region TagLib.Tag /// /// Gets whether or not the current instance is empty. /// /// /// if the current instance does not /// any values. Otherwise . /// public override bool IsEmpty { get {return fields.Count == 0;} } /// /// Clears the values stored in the current instance. /// public override void Clear () { fields.Clear (); } #endregion } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Riff/DivXTag.cs0000644000175000017500000002611211462100402022757 0ustar00rubenruben00000000000000// // DivXTag.cs: Provide support for reading and writing DivX tags. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // TagLib.Id3v1.Tag // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections; using System; using System.Text; using System.Globalization; namespace TagLib.Riff { /// /// This class extends to provide support for /// reading and writing tags stored in the DivX format. /// public class DivXTag : TagLib.Tag { #region Private Fields /// /// Contains the title. /// private string title; /// /// Contains the semicolon separated performers. /// private string artist; /// /// Contains the 4 digit year. /// private string year; /// /// Contains a comment on track. /// private string comment; /// /// Contains the genre index. /// private string genre; /// /// Contains the extra 6 bytes at the end of the tag. /// private ByteVector extra_data; #endregion #region Public Static Fields /// /// The size of a DivX tag. /// public const uint Size = 128; /// /// The identifier used to recognize a DivX tags. /// /// /// "DIVXTAG" /// public static readonly ReadOnlyByteVector FileIdentifier = "DIVXTAG"; #endregion #region Constructors /// /// Constructs and initializes a new instance of with no contents. /// public DivXTag () { Clear (); } /// /// Constructs and initializes a new instance of by reading the contents from a /// specified position in a specified file. /// /// /// A object containing the file from /// which the contents of the new instance is to be read. /// /// /// A value specify at what position to /// read the tag. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// /// /// The file does not contain the file identifier at the /// correct offset from the given position. /// public DivXTag (File file, long position) { if (file == null) throw new ArgumentNullException ("file"); file.Mode = TagLib.File.AccessMode.Read; if (position < 0 || position > file.Length - Size) throw new ArgumentOutOfRangeException ( "position"); file.Seek (position); // read the tag -- always 128 bytes ByteVector data = file.ReadBlock ((int) Size); // some initial sanity checking if (!data.EndsWith (FileIdentifier)) throw new CorruptFileException ( "DivX tag data does not end with identifier."); Parse (data); } /// /// Constructs and initializes a new instance of by reading the contents raw tag data /// stored in a specified object. /// /// /// A containing a raw DivX tag to /// read into the new instance. /// /// /// is . /// /// /// The file does not contain the file identifier at the /// correct offset from the given position. /// public DivXTag (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); if (data.Count < Size) throw new CorruptFileException ( "DivX tag data is less than 128 bytes long."); if (!data.EndsWith (FileIdentifier)) throw new CorruptFileException ( "DivX tag data does not end with identifier."); Parse (data); } #endregion #region Public Methods /// /// Renders the current instance as a raw DivX tag. /// /// /// A object containing the /// rendered tag. /// public ByteVector Render () { ByteVector data = new ByteVector (); data.Add (ByteVector.FromString (title, StringType.Latin1).Resize (32, 0x20)); data.Add (ByteVector.FromString (artist, StringType.Latin1).Resize (28, 0x20)); data.Add (ByteVector.FromString (year, StringType.Latin1).Resize ( 4, 0x20)); data.Add (ByteVector.FromString (comment, StringType.Latin1).Resize (48, 0x20)); data.Add (ByteVector.FromString (genre, StringType.Latin1).Resize ( 3, 0x20)); data.Add (extra_data); data.Add (FileIdentifier); return data; } #endregion #region Private Methods /// /// Populates the current instance by parsing the contents of /// a raw DivX tag. /// /// /// A object containing the /// starting with an DivX tag. /// private void Parse (ByteVector data) { title = data.ToString (StringType.Latin1, 0, 32).Trim (); artist = data.ToString (StringType.Latin1, 32, 28).Trim (); year = data.ToString (StringType.Latin1, 60, 4).Trim (); comment = data.ToString (StringType.Latin1, 64, 48).Trim (); genre = data.ToString (StringType.Latin1,112, 3).Trim (); extra_data = data.Mid (115, 6); } #endregion #region TagLib.Tag /// /// Gets the tag types contained in the current instance. /// /// /// Always . /// public override TagTypes TagTypes { get {return TagTypes.DivX;} } /// /// Gets and sets the title for the media described by the /// current instance. /// /// /// A object containing the title for /// the media described by the current instance or if no value is present. /// /// /// When stored on disk, only the first 32 bytes of the /// Latin-1 encoded value will be stored. This may result in /// lost data. /// public override string Title { get { return string.IsNullOrEmpty (title) ? null : title; } set { title = value != null ? value.Trim () : String.Empty; } } /// /// Gets and sets the performers or artists who performed in /// the media described by the current instance. /// /// /// A containing the performers or /// artists who performed in the media described by the /// current instance or an empty array if no value is /// present. /// /// /// When stored on disk, only the first 28 bytes of the /// Latin-1 encoded value will be stored, minus a byte for /// each additionial performer (i.e. two performers will only /// have 27 bytes and three performers will only have 26 /// bytes).This may result in lost data. /// public override string [] Performers { get { return string.IsNullOrEmpty (artist) ? new string [0] : artist.Split (';'); } set { artist = value != null ? string.Join (";", value) : string.Empty; } } /// /// Gets and sets a user comment on the media represented by /// the current instance. /// /// /// A object containing user comments /// on the media represented by the current instance or if no value is present. /// /// /// When stored on disk, only the first 48 bytes of the /// Latin-1 encoded value will be stored. This may result in /// lost data. /// public override string Comment { get { return string.IsNullOrEmpty (comment) ? null : comment; } set { comment = value != null ? value.Trim () : String.Empty; } } /// /// Gets and sets the genres of the media represented by the /// current instance. /// /// /// A containing the genres of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// Only first genre will be stored and only if it is an /// exact match for a value appearing in . All other values will /// result in the property being cleared. /// public override string [] Genres { get { string genre_name = TagLib.Genres.IndexToVideo (genre); return (genre_name != null) ? new string [] {genre_name} : new string [0]; } set { genre = (value != null && value.Length > 0) ? TagLib.Genres.VideoToIndex ( value [0].Trim ()).ToString ( CultureInfo.InvariantCulture) : string.Empty; } } /// /// Gets and sets the year that the media represented by the /// current instance was recorded. /// /// /// A containing the year that the media /// represented by the current instance was created or zero /// if no value is present. /// /// /// Only values between 1 and 9999 will be stored, all other /// values will result in the property being zeroed. /// public override uint Year { get { uint value; return uint.TryParse (year, NumberStyles.Integer, CultureInfo.InvariantCulture, out value) ? value : 0; } set { year = (value > 0 && value < 10000) ? value.ToString ( CultureInfo.InvariantCulture) : String.Empty; } } /// /// Clears the values stored in the current instance. /// public override void Clear () { title = artist = genre = year = comment = String.Empty; extra_data = new ByteVector (6); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Riff/AviStream.cs0000644000175000017500000004014711462100402023350 0ustar00rubenruben00000000000000// // AviStream.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Text; namespace TagLib.Riff { /// /// This abstract class provides basic support for parsing a raw AVI /// stream list. /// public abstract class AviStream { /// /// Contains the stream header. /// private AviStreamHeader header; /// /// Contains the stream codec information. /// private ICodec codec; /// /// Constructs and intializes a new instance of with a specified stream header. /// /// /// A object containing the /// stream's header. /// protected AviStream (AviStreamHeader header) { this.header = header; } /// /// Parses a stream list item. /// /// /// A object containing the item's /// ID. /// /// /// A object containing the item's /// data. /// /// /// A value specifying the index in /// at which the item data begins. /// /// /// A value specifying the length of the /// item. /// public virtual void ParseItem (ByteVector id, ByteVector data, int start, int length) { } /// /// Gets the stream header. /// /// /// A object containing the /// header information for the stream. /// public AviStreamHeader Header { get {return header;} } /// /// Gets the codec information. /// /// /// A object containing the codec /// information for the stream. /// public ICodec Codec { get {return codec;} protected set {this.codec = value;} } /// /// Parses a raw AVI stream list and returns the stream /// information. /// /// /// A object containing raw stream /// list. /// /// /// A object containing stream /// information. /// public static AviStream ParseStreamList (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); if (!data.StartsWith ("strl")) return null; AviStream stream = null; int pos = 4; while (pos + 8 < data.Count) { ByteVector id = data.Mid (pos, 4); int block_length = (int) data.Mid (pos + 4, 4) .ToUInt (false); if (id == "strh" && stream == null) { AviStreamHeader stream_header = new AviStreamHeader (data, pos + 8); if (stream_header.Type == "vids") stream = new AviVideoStream ( stream_header); else if (stream_header.Type == "auds") stream = new AviAudioStream ( stream_header); } else if (stream != null) { stream.ParseItem (id, data, pos + 8, block_length); } pos += block_length + 8; } return stream; } } /// /// This class extends to provide support /// for reading audio stream data. /// public class AviAudioStream : AviStream { /// /// Constructs and intializes a new instance of with a specified stream header. /// /// /// A object containing the /// stream's header. /// public AviAudioStream (AviStreamHeader header) : base (header) { } /// /// Parses a stream list item. /// /// /// A object containing the item's /// ID. /// /// /// A object containing the item's /// data. /// /// /// A value specifying the index in /// at which the item data begins. /// /// /// A value specifying the length of the /// item. /// public override void ParseItem (ByteVector id, ByteVector data, int start, int length) { if (id == "strf") Codec = new WaveFormatEx (data, start); } } /// /// This class extends to provide support /// for reading video stream data. /// public class AviVideoStream : AviStream { /// /// Constructs and intializes a new instance of with a specified stream header. /// /// /// A object containing the /// stream's header. /// public AviVideoStream (AviStreamHeader header) : base (header) { } /// /// Parses a stream list item. /// /// /// A object containing the item's /// ID. /// /// /// A object containing the item's /// data. /// /// /// A value specifying the index in /// at which the item data begins. /// /// /// A value specifying the length of the /// item. /// public override void ParseItem (ByteVector id, ByteVector data, int start, int length) { if (id == "strf") Codec = new BitmapInfoHeader (data, start); } } /// /// This structure provides a representation of a Microsoft /// AviStreamHeader structure, minus the first 8 bytes. /// public struct AviStreamHeader { /// /// Contains the stream type. /// private ByteVector type; /// /// Contains the stream handler. /// private ByteVector handler; /// /// Contains the flags. /// private uint flags; /// /// Contains the priority. /// private uint priority; /// /// Contains the initial frame count. /// private uint initial_frames; /// /// Contains the scale. /// private uint scale; /// /// Contains the rate. /// private uint rate; /// /// Contains the start delay. /// private uint start; /// /// Contains the stream length. /// private uint length; /// /// Contains the suggested buffer size. /// private uint suggested_buffer_size; /// /// Contains the quality (between 0 and 10,000). /// private uint quality; /// /// Contains the sample size. /// private uint sample_size; /// /// Contains the position for the left side of the video. /// private ushort left; /// /// Contains the position for the top side of the video. /// private ushort top; /// /// Contains the position for the right side of the video. /// private ushort right; /// /// Contains the position for the bottom side of the video. /// private ushort bottom; /// /// Constructs and initializes a new instance of by reading the raw structure /// from the beginning of a object. /// /// /// A object containing the raw /// data structure. /// /// /// is . /// /// /// contains less than 56 bytes. /// [Obsolete("Use WaveFormatEx(ByteVector,int)")] public AviStreamHeader (ByteVector data) : this (data, 0) { } /// /// Constructs and initializes a new instance of by reading the raw structure /// from a specified position in a /// object. /// /// /// A object containing the raw /// data structure. /// /// /// A value specifying the index in /// at which the structure begins. /// /// /// is . /// /// /// is less than zero. /// /// /// contains less than 56 bytes at /// . /// public AviStreamHeader (ByteVector data, int offset) { if (data == null) throw new System.ArgumentNullException ("data"); if (offset < 0) throw new ArgumentOutOfRangeException ( "offset"); if (offset + 56 > data.Count) throw new CorruptFileException ( "Expected 56 bytes."); type = data.Mid (offset, 4); handler = data.Mid (offset + 4, 4); flags = data.Mid (offset + 8, 4).ToUInt (false); priority = data.Mid (offset + 12, 4).ToUInt (false); initial_frames = data.Mid (offset + 16, 4).ToUInt (false); scale = data.Mid (offset + 20, 4).ToUInt (false); rate = data.Mid (offset + 24, 4).ToUInt (false); start = data.Mid (offset + 28, 4).ToUInt (false); length = data.Mid (offset + 32, 4).ToUInt (false); suggested_buffer_size = data.Mid (offset + 36, 4).ToUInt (false); quality = data.Mid (offset + 40, 4).ToUInt (false); sample_size = data.Mid (offset + 44, 4).ToUInt (false); left = data.Mid (offset + 48, 2).ToUShort (false); top = data.Mid (offset + 50, 2).ToUShort (false); right = data.Mid (offset + 52, 2).ToUShort (false); bottom = data.Mid (offset + 54, 2).ToUShort (false); } /// /// Gets the stream type. /// /// /// A four-byte object specifying /// stream type. /// public ByteVector Type { get {return type;} } /// /// Gets the stream handler (codec) ID. /// /// /// A four-byte object specifying /// stream handler ID. /// public ByteVector Handler { get {return handler;} } /// /// Gets the stream flags. /// /// /// A value specifying stream flags. /// public uint Flags { get {return flags;} } /// /// Gets the stream priority. /// /// /// A value specifying stream priority. /// public uint Priority { get {return priority;} } /// /// Gets how far ahead audio is from video. /// /// /// A value specifying how far ahead /// audio is from video. /// public uint InitialFrames { get {return initial_frames;} } /// /// Gets the scale of the stream. /// /// /// A value specifying the scale of the /// stream. /// /// /// Dividing by gives /// the number of samples per second. /// public uint Scale { get {return scale;} } /// /// Gets the rate of the stream. /// /// /// A value specifying the rate of the /// stream. /// /// /// Dividing by gives /// the number of samples per second. /// public uint Rate { get {return rate;} } /// /// Gets the start delay of the stream. /// /// /// A value specifying the start delay of /// the stream. /// public uint Start { get {return start;} } /// /// Gets the length of the stream. /// /// /// A value specifying the length of the /// stream. /// public uint Length { get {return length;} } /// /// Gets the suggested buffer size for the stream. /// /// /// A value specifying the buffer size. /// public uint SuggestedBufferSize { get {return suggested_buffer_size;} } /// /// Gets the quality of the stream data. /// /// /// A value specifying the quality of the /// stream data between 0 and 10,000. /// public uint Quality { get {return quality;} } /// /// Gets the sample size of the stream data. /// /// /// A value specifying the sample size. /// public uint SampleSize { get {return sample_size;} } /// /// Gets the position at which the left of the video is to /// be displayed in the rectangle whose width is given in the /// the file's . /// /// /// A value specifying the left /// position. /// public ushort Left { get {return left;} } /// /// Gets the position at which the top of the video is to be /// displayed in the rectangle whose height is given in the /// the file's . /// /// /// A value specifying the top /// position. /// public ushort Top { get {return top;} } /// /// Gets the position at which the right of the video is to /// be displayed in the rectangle whose width is given in the /// the file's . /// /// /// A value specifying the right /// position. /// public ushort Right { get {return right;} } /// /// Gets the position at which the bottom of the video is /// to be displayed in the rectangle whose height is given in /// the file's . /// /// /// A value specifying the bottom /// position. /// public ushort Bottom { get {return bottom;} } } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/0000777000175000017500000000000011503407423021137 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/Dng/0000777000175000017500000000000011503407423021647 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/Dng/File.cs0000644000175000017500000001430411470571657023071 0ustar00rubenruben00000000000000// // File.cs: Provides tagging for DNG files // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using TagLib; using TagLib.Image; using TagLib.IFD; using TagLib.IFD.Tags; using TagLib.IFD.Entries; namespace TagLib.Tiff.Dng { /// /// This class extends to provide tagging /// for DNG image files. /// [SupportedMimeType("taglib/dng", "dng")] [SupportedMimeType("image/dng")] [SupportedMimeType("image/x-adobe-dng")] public class File : TagLib.Tiff.File { #region public Properties /// /// Indicates if tags can be written back to the current file or not /// /// /// A which is true if tags can be written to the /// current file, otherwise false. /// public override bool Writeable { get { return false; } } #endregion #region constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : this (new File.LocalFileAbstraction (path), propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : this (path, ReadStyle.Average) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified file abstraction. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// protected File (IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) { } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { throw new NotSupportedException (); } #endregion /// /// Attempts to extract the media properties of the main /// photo. /// /// /// A object with a best effort guess /// at the right values. When no guess at all can be made, /// is returned. /// protected override Properties ExtractProperties () { int width = 0, height = 0; IFDTag tag = GetTag (TagTypes.TiffIFD) as IFDTag; IFDStructure structure = tag.Structure; // DNG uses SubIFDs for images, the one with SubfileType = 0 is the RAW data. var sub_ifds = structure.GetEntry (0, (ushort) IFDEntryTag.SubIFDs) as SubIFDArrayEntry; if (sub_ifds == null) { return base.ExtractProperties (); } foreach (var entry in sub_ifds.Entries) { var type = entry.GetLongValue (0, (ushort) IFDEntryTag.NewSubfileType); if (type == 0) { width = (int) (entry.GetLongValue (0, (ushort) IFDEntryTag.ImageWidth) ?? 0); height = (int) (entry.GetLongValue (0, (ushort) IFDEntryTag.ImageLength) ?? 0); break; // No need to iterate the other SubIFDs } } if (width > 0 && height > 0) { return new Properties (TimeSpan.Zero, CreateCodec (width, height)); } // Fall back to normal detection. return base.ExtractProperties (); } /// /// Create a codec that describes the photo properties. /// /// /// A object. /// protected override Codec CreateCodec (int width, int height) { return new Codec (width, height, "Adobe Digital Negative File"); } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/Pef/0000777000175000017500000000000011503407423021651 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/Pef/File.cs0000644000175000017500000001161211470571657023072 0ustar00rubenruben00000000000000// // File.cs: Provides tagging for Pentax CR2 files // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using TagLib; using TagLib.Image; using TagLib.IFD; using TagLib.IFD.Tags; namespace TagLib.Tiff.Pef { /// /// This class extends to provide tagging /// for PEF image files. /// [SupportedMimeType("taglib/pef", "pef")] [SupportedMimeType("image/pef")] [SupportedMimeType("image/x-pentax-pef")] public class File : TagLib.Tiff.File { #region public Properties /// /// Indicates if tags can be written back to the current file or not /// /// /// A which is true if tags can be written to the /// current file, otherwise false. /// public override bool Writeable { get { return false; } } #endregion #region constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : this (new File.LocalFileAbstraction (path), propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : this (path, ReadStyle.Average) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified file abstraction. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// protected File (IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) { } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { throw new NotSupportedException (); } #endregion /// /// Create a codec that describes the photo properties. /// /// /// A object. /// protected override Codec CreateCodec (int width, int height) { return new Codec (width, height, "Pentax Raw File"); } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/Codec.cs0000644000175000017500000000445711470571657022527 0ustar00rubenruben00000000000000// // Codec.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2009 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Tiff { /// /// A TIFF photo codec. Contains basic photo details. /// public class Codec : Image.Codec { private string description = "TIFF File"; /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public override string Description { get { return description; } } /// /// Constructs a new with the given width /// and height. /// /// /// The width of the photo. /// /// /// The height of the photo. /// /// /// A new instance. /// public Codec (int width, int height) : base (width, height) {} /// /// Constructs a new with the given width /// and height. /// /// /// The width of the photo. /// /// /// The height of the photo. /// /// /// The description of the photo type. /// /// /// A new instance. /// public Codec (int width, int height, string description) : base (width, height) { this.description = description; } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/File.cs0000644000175000017500000002002411470571657022355 0ustar00rubenruben00000000000000// // File.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2009 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using System.IO; using TagLib.Image; using TagLib.IFD; using TagLib.IFD.Entries; using TagLib.IFD.Tags; using TagLib.Xmp; namespace TagLib.Tiff { /// /// This class extends to provide tagging /// and properties support for Tiff files. /// [SupportedMimeType("taglib/tiff", "tiff")] [SupportedMimeType("taglib/tif", "tif")] [SupportedMimeType("image/tiff")] public class File : BaseTiffFile { #region Private Fields /// /// Contains the media properties. /// private Properties properties; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : this (new File.LocalFileAbstraction (path), propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : base (path) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction) { ImageTag = new CombinedImageTag (TagTypes.TiffIFD | TagTypes.XMP); Mode = AccessMode.Read; try { Read (propertiesStyle); TagTypesOnDisk = TagTypes; } finally { Mode = AccessMode.Closed; } } /// /// Constructs and initializes a new instance of for a specified file abstraction. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// protected File (IFileAbstraction abstraction) : base (abstraction) { } #endregion #region Public Properties /// /// Gets the media properties of the file represented by the /// current instance. /// /// /// A object containing the /// media properties of the file represented by the current /// instance. /// public override TagLib.Properties Properties { get { return properties; } } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { Mode = AccessMode.Write; try { WriteFile (); TagTypesOnDisk = TagTypes; } finally { Mode = AccessMode.Closed; } } #endregion #region Private Methods /// /// Render the whole file and write it back. /// private void WriteFile () { // Check, if IFD0 is contained IFDTag exif = ImageTag.Exif; if (exif == null) throw new Exception ("Tiff file without tags"); UpdateTags (exif); // first IFD starts at 8 uint first_ifd_offset = 8; ByteVector data = RenderHeader (first_ifd_offset); var renderer = new IFDRenderer (IsBigEndian, exif.Structure, first_ifd_offset); data.Add (renderer.Render ()); Insert (data, 0, Length); } /// /// Update the XMP stored in the Tiff IFD /// /// /// A The Tiff IFD to update the entries /// private void UpdateTags (IFDTag exif) { // update the XMP entry exif.Structure.RemoveTag (0, (ushort) IFDEntryTag.XMP); XmpTag xmp = ImageTag.Xmp; if (xmp != null) exif.Structure.AddEntry (0, new ByteVectorIFDEntry ((ushort) IFDEntryTag.XMP, xmp.Render ())); } /// /// Reads the file with a specified read style. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// protected void Read (ReadStyle propertiesStyle) { Mode = AccessMode.Read; try { uint first_ifd_offset = ReadHeader (); ReadIFD (first_ifd_offset); // Find XMP data var xmp_entry = ImageTag.Exif.Structure.GetEntry (0, (ushort) IFDEntryTag.XMP) as ByteVectorIFDEntry; if (xmp_entry != null) { ImageTag.AddTag (new XmpTag (xmp_entry.Data.ToString (), this)); } if (propertiesStyle == ReadStyle.None) return; properties = ExtractProperties (); } finally { Mode = AccessMode.Closed; } } /// /// Attempts to extract the media properties of the main /// photo. /// /// /// A object with a best effort guess /// at the right values. When no guess at all can be made, /// is returned. /// protected virtual Properties ExtractProperties () { int width = 0, height = 0; IFDTag tag = GetTag (TagTypes.TiffIFD) as IFDTag; IFDStructure structure = tag.Structure; width = (int) (structure.GetLongValue (0, (ushort) IFDEntryTag.ImageWidth) ?? 0); height = (int) (structure.GetLongValue (0, (ushort) IFDEntryTag.ImageLength) ?? 0); if (width > 0 && height > 0) { return new Properties (TimeSpan.Zero, CreateCodec (width, height)); } return null; } /// /// Create a codec that describes the photo properties. /// /// /// A object. /// protected virtual Codec CreateCodec (int width, int height) { return new Codec (width, height); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/Cr2/0000777000175000017500000000000011503407423021565 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/Cr2/File.cs0000644000175000017500000001772111470571657023015 0ustar00rubenruben00000000000000// // File.cs: Provides tagging for Canon CR2 files // // Author: // Mike Gemuende (mike@gemuende.be) // // Copyright (C) 2010 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using TagLib; using TagLib.Image; using TagLib.IFD; using TagLib.IFD.Tags; namespace TagLib.Tiff.Cr2 { /// /// This class extends to provide tagging /// for CR2 image files. /// [SupportedMimeType("taglib/cr2", "cr2")] [SupportedMimeType("image/cr2")] [SupportedMimeType("image/x-canon-cr2")] public class File : TagLib.Tiff.BaseTiffFile { #region private fields /// /// The Properties of the image /// private Properties properties; #endregion #region public Properties /// /// Gets the media properties of the file represented by the /// current instance. /// /// /// A object containing the /// media properties of the file represented by the current /// instance. /// public override TagLib.Properties Properties { get { return properties; } } /// /// Indicates if tags can be written back to the current file or not /// /// /// A which is true if tags can be written to the /// current file, otherwise false. /// public override bool Writeable { get { return false; } } #endregion #region constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : this (new File.LocalFileAbstraction (path), propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : this (path, ReadStyle.Average) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction) { Read (propertiesStyle); } /// /// Constructs and initializes a new instance of for a specified file abstraction. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// protected File (IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) { } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { throw new NotSupportedException (); } #endregion #region private methods /// /// Reads the information from file with a specified read style. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// private void Read (ReadStyle propertiesStyle) { Mode = AccessMode.Read; try { ImageTag = new CombinedImageTag (TagTypes.TiffIFD); ReadFile (); TagTypesOnDisk = TagTypes; if (propertiesStyle != ReadStyle.None) properties = ExtractProperties (); } finally { Mode = AccessMode.Closed; } } /// /// Parses the CR2 file /// private void ReadFile () { // A CR2 file starts with a Tiff header followed by a CR2 header uint first_ifd_offset = ReadHeader (); uint raw_ifd_offset = ReadAdditionalCR2Header (); ReadIFD (first_ifd_offset, 3); ReadIFD (raw_ifd_offset, 1); } /// /// Reads and validates the CR2 header started at the current position. /// /// /// A with the offset to the IFD with the RAW data. /// private uint ReadAdditionalCR2Header () { // CR2 Header // // CR2 Information: // // 2 bytes CR2 Magic word (CR) // 1 byte CR2 major version (2) // 1 byte CR2 minor version (0) // 4 bytes Offset to RAW IFD // ByteVector header = ReadBlock (8); if (header.Count != 8) throw new CorruptFileException ("Unexpected end of CR2 header"); if (header.Mid (0, 2).ToString () != "CR") throw new CorruptFileException("CR2 Magic (CR) expected"); byte major_version = header [2]; byte minor_version = header [3]; if (major_version != 2 || minor_version != 0) throw new UnsupportedFormatException ("Only major version 2 and minor version 0 are supported"); uint raw_ifd_offset = header.Mid (4, 4).ToUInt (IsBigEndian); return raw_ifd_offset; } /// /// Attempts to extract the media properties of the main /// photo. /// /// /// A object with a best effort guess /// at the right values. When no guess at all can be made, /// is returned. /// private Properties ExtractProperties () { int width = 0, height = 0; IFDTag tag = GetTag (TagTypes.TiffIFD) as IFDTag; width = (int) (tag.ExifIFD.GetLongValue (0, (ushort) ExifEntryTag.PixelXDimension) ?? 0); height = (int) (tag.ExifIFD.GetLongValue (0, (ushort) ExifEntryTag.PixelYDimension) ?? 0); if (width > 0 && height > 0) { return new Properties (TimeSpan.Zero, new Codec (width, height, "Canon RAW File")); } return null; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/BaseTiffFile.cs0000644000175000017500000001616111470571657023770 0ustar00rubenruben00000000000000// // BaseTiffFile.cs: // // Author: // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2010 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using TagLib.Image; using TagLib.IFD; namespace TagLib.Tiff { /// /// This class extends to provide some basic behavior /// for Tiff based file formats. /// public abstract class BaseTiffFile : TagLib.Image.File { #region Public Properties /// /// Indicates if the current file is in big endian or little endian format. /// /// /// The method must be called from a subclass to /// properly initialize this property. /// public bool IsBigEndian { get; private set; } #endregion #region Protected Properties /// /// The identifier used to recognize the file. This is 42 for most TIFF files. /// protected ushort Magic { get; set; } #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// protected BaseTiffFile (string path) : base (path) { Magic = 42; } /// /// Constructs and initializes a new instance of for a specified file abstraction. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// protected BaseTiffFile (IFileAbstraction abstraction) : base (abstraction) { Magic = 42; } #endregion #region Protected Methods /// /// Reads and validates the TIFF header at the current position. /// /// /// A with the offset value to the first /// IFD contained in the file. /// /// /// This method should only be called, when the current read position is /// the beginning of the file. /// protected uint ReadHeader () { // TIFF header: // // 2 bytes Indicating the endianess (II or MM) // 2 bytes Tiff Magic word (usually 42) // 4 bytes Offset to first IFD ByteVector header = ReadBlock (8); if (header.Count != 8) throw new CorruptFileException ("Unexpected end of header"); string order = header.Mid (0, 2).ToString (); if (order == "II") { IsBigEndian = false; } else if (order == "MM") { IsBigEndian = true; } else { throw new CorruptFileException ("Unknown Byte Order"); } if (header.Mid (2, 2).ToUShort (IsBigEndian) != Magic) throw new CorruptFileException (String.Format ("TIFF Magic ({0}) expected", Magic)); uint first_ifd_offset = header.Mid (4, 4).ToUInt (IsBigEndian); return first_ifd_offset; } /// /// Reads IFDs starting from the given offset. /// /// /// A with the IFD offset to start /// reading from. /// protected void ReadIFD (uint offset) { ReadIFD (offset, -1); } /// /// Reads a certain number of IFDs starting from the given offset. /// /// /// A with the IFD offset to start /// reading from. /// /// /// A with the number of IFDs to read. /// protected void ReadIFD (uint offset, int ifd_count) { long length = 0; try { length = Length; } catch (Exception) { // Use a safety-value of 4 gigabyte. length = 1073741824L * 4; } var ifd_tag = GetTag (TagTypes.TiffIFD, true) as IFDTag; var reader = CreateIFDReader (this, IsBigEndian, ifd_tag.Structure, 0, offset, (uint) length); reader.Read (ifd_count); } /// /// Creates an IFD reader to parse the file. /// /// /// A to read from. /// /// /// A , it must be true, if the data of the IFD should be /// read as bigendian, otherwise false. /// /// /// A that will be populated. /// /// /// A value describing the base were the IFD offsets /// refer to. E.g. in Jpegs the IFD are located in an Segment and the offsets /// inside the IFD refer from the beginning of this segment. So must contain the beginning of the segment. /// /// /// A value with the beginning of the IFD relative to /// . /// /// /// A value with maximal possible offset. This is to limit /// the size of the possible data; /// protected virtual IFDReader CreateIFDReader (BaseTiffFile file, bool is_bigendian, IFDStructure structure, long base_offset, uint ifd_offset, uint max_offset) { return new IFDReader (file, is_bigendian, structure, base_offset, ifd_offset, max_offset); } /// /// Renders a TIFF header with the given offset to the first IFD. /// The returned data has length 8. /// /// /// A with the offset to the first IFD /// to be included in the header. /// /// /// A with the rendered header of length 8. /// protected ByteVector RenderHeader (uint first_ifd_offset) { ByteVector data = new ByteVector (); if (IsBigEndian) data.Add ("MM"); else data.Add ("II"); data.Add (ByteVector.FromUShort (Magic, IsBigEndian)); data.Add (ByteVector.FromUInt (first_ifd_offset, IsBigEndian)); return data; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/Rw2/0000777000175000017500000000000011503407423021611 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/Rw2/IFDTag.cs0000644000175000017500000000517711470571657023222 0ustar00rubenruben00000000000000// // IFDTag.cs: Handles Panasonics weird metadata structure. // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using TagLib.IFD.Tags; namespace TagLib.Tiff.Rw2 { /// /// Handles the weird structure of Panasonic metadata. /// public class IFDTag : TagLib.IFD.IFDTag { private File file; internal IFDTag (File file) : base () { this.file = file; } /// /// Gets the ISO speed the image, the current instance belongs /// to, was taken with. /// /// /// A with the ISO speed as defined in ISO 12232. /// /// /// Panasonic stores these in a somewhat unstandard location. /// public override uint? ISOSpeedRatings { // TODO: The value in JPGFromRAW should probably be used as well. get { return Structure.GetLongValue (0, (ushort) PanasonicMakerNoteEntryTag.ISO); } set { Structure.SetLongValue (0, (ushort) PanasonicMakerNoteEntryTag.ISO, value.HasValue ? (uint) value : 0); } } /// /// Gets the focal length the image, the current instance belongs /// to, was taken with, assuming a 35mm film camera. /// /// /// A with the focal length in 35mm equivalent in millimeters. /// /// /// Panasonic stores these in a somewhat unstandard location. /// public override uint? FocalLengthIn35mmFilm { get { var jpg = file.JpgFromRaw; if (jpg == null) return base.FocalLengthIn35mmFilm; var tag = jpg.GetTag (TagTypes.TiffIFD, true) as Image.ImageTag; if (tag == null) return base.FocalLengthIn35mmFilm; return tag.FocalLengthIn35mmFilm ?? base.FocalLengthIn35mmFilm; } set { (file.JpgFromRaw.GetTag (TagTypes.TiffIFD, true) as Image.ImageTag).FocalLengthIn35mmFilm = value; } } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/Rw2/File.cs0000644000175000017500000002460011470571657023033 0ustar00rubenruben00000000000000// // File.cs: Provides tagging for Panasonic Rw2 files // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using TagLib; using TagLib.Image; using TagLib.IFD; using TagLib.IFD.Tags; namespace TagLib.Tiff.Rw2 { /// /// This class extends to provide tagging /// for RW2 image files. /// [SupportedMimeType("taglib/rw2", "rw2")] [SupportedMimeType("image/rw2")] [SupportedMimeType("taglib/raw", "raw")] [SupportedMimeType("image/raw")] [SupportedMimeType("image/x-raw")] [SupportedMimeType("image/x-panasonic-raw")] public class File : TagLib.Tiff.BaseTiffFile { #region private fields /// /// The Properties of the image /// private Properties properties; #endregion #region public Properties /// /// Gets the media properties of the file represented by the /// current instance. /// /// /// A object containing the /// media properties of the file represented by the current /// instance. /// public override TagLib.Properties Properties { get { return properties; } } /// /// Indicates if tags can be written back to the current file or not /// /// /// A which is true if tags can be written to the /// current file, otherwise false. /// public override bool Writeable { get { return false; } } /// /// The JPEG file that's embedded in the RAW file. /// public Jpeg.File JpgFromRaw { get; internal set; } #endregion #region constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : this (new File.LocalFileAbstraction (path), propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : this (path, ReadStyle.Average) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction) { Magic = 85; // Panasonic uses 0x55 Read (propertiesStyle); } /// /// Constructs and initializes a new instance of for a specified file abstraction. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// protected File (IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) { } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { throw new NotSupportedException (); } /// /// Gets a tag of a specified type from the current instance, /// optionally creating a new tag if possible. /// /// /// A value indicating the /// type of tag to read. /// /// /// A value specifying whether or not to /// try and create the tag if one is not found. /// /// /// A object containing the tag that was /// found in or added to the current instance. If no /// matching tag was found and none was created, is returned. /// public override TagLib.Tag GetTag (TagLib.TagTypes type, bool create) { TagLib.Tag tag = base.GetTag (type, false); if (tag != null) { return tag; } if (!create || (type & ImageTag.AllowedTypes) == 0) return null; if (type != TagTypes.TiffIFD) return base.GetTag (type, create); ImageTag new_tag = new IFDTag (this); ImageTag.AddTag (new_tag); return new_tag; } #endregion #region private methods /// /// Reads the information from file with a specified read style. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// private void Read (ReadStyle propertiesStyle) { Mode = AccessMode.Read; try { ImageTag = new CombinedImageTag (TagTypes.TiffIFD); ReadFile (); TagTypesOnDisk = TagTypes; if (propertiesStyle != ReadStyle.None) properties = ExtractProperties (); } finally { Mode = AccessMode.Closed; } } /// /// Parses the RW2 file /// private void ReadFile () { // A RW2 file starts with a Tiff header followed by a RW2 header uint first_ifd_offset = ReadHeader (); uint raw_ifd_offset = ReadAdditionalRW2Header (); ReadIFD (first_ifd_offset, 3); ReadIFD (raw_ifd_offset, 1); } /// /// Reads and validates the RW2 header started at the current position. /// /// /// A with the offset to the IFD with the RAW data. /// private uint ReadAdditionalRW2Header () { // RW2 Header // // Seems to be 16 bytes, no idea on the meaning of these. ByteVector header = ReadBlock (16); if (header.Count != 16) throw new CorruptFileException ("Unexpected end of RW2 header"); return (uint) Tell; } /// /// Attempts to extract the media properties of the main /// photo. /// /// /// A object with a best effort guess /// at the right values. When no guess at all can be made, /// is returned. /// private Properties ExtractProperties () { int width = 0, height = 0; IFDTag tag = GetTag (TagTypes.TiffIFD) as IFDTag; IFDStructure structure = tag.Structure; width = (int) (structure.GetLongValue (0, 0x07) ?? 0); height = (int) (structure.GetLongValue (0, 0x06) ?? 0); var vendor = ImageTag.Make; if (vendor == "LEICA") vendor = "Leica"; var desc = String.Format ("{0} RAW File", vendor); if (width > 0 && height > 0) { return new Properties (TimeSpan.Zero, new Codec (width, height, desc)); } return null; } /// /// Creates an IFD reader to parse the file. /// /// /// A to read from. /// /// /// A , it must be true, if the data of the IFD should be /// read as bigendian, otherwise false. /// /// /// A that will be populated. /// /// /// A value describing the base were the IFD offsets /// refer to. E.g. in Jpegs the IFD are located in an Segment and the offsets /// inside the IFD refer from the beginning of this segment. So must contain the beginning of the segment. /// /// /// A value with the beginning of the IFD relative to /// . /// /// /// A value with maximal possible offset. This is to limit /// the size of the possible data; /// protected override TagLib.IFD.IFDReader CreateIFDReader (BaseTiffFile file, bool is_bigendian, IFDStructure structure, long base_offset, uint ifd_offset, uint max_offset) { return new IFDReader (file, is_bigendian, structure, base_offset, ifd_offset, max_offset); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/Rw2/IFDReader.cs0000644000175000017500000001060711470571657023703 0ustar00rubenruben00000000000000// // IFDReader.cs: Panasonic Rw2-specific IFD reader // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.IO; using TagLib.IFD; namespace TagLib.Tiff.Rw2 { /// /// Panasonic Rw2-specific IFD reader /// public class IFDReader : TagLib.IFD.IFDReader { #region Constructors /// /// Constructor. Reads an IFD from given file, using the given endianness. /// /// /// A to read from. /// /// /// A , it must be true, if the data of the IFD should be /// read as bigendian, otherwise false. /// /// /// A that will be populated. /// /// /// A value describing the base were the IFD offsets /// refer to. E.g. in Jpegs the IFD are located in an Segment and the offsets /// inside the IFD refer from the beginning of this segment. So must contain the beginning of the segment. /// /// /// A value with the beginning of the IFD relative to /// . /// /// /// A value with maximal possible offset. This is to limit /// the size of the possible data; /// public IFDReader (BaseTiffFile file, bool is_bigendian, IFDStructure structure, long base_offset, uint ifd_offset, uint max_offset) : base (file, is_bigendian, structure, base_offset, ifd_offset, max_offset) { } #endregion /// /// Try to parse the given IFD entry, used to discover format-specific entries. /// /// /// A with the tag of the entry. /// /// /// A with the type of the entry. /// /// /// A with the data count of the entry. /// /// /// A with the base offset which every offsets in the /// IFD are relative to. /// /// /// A with the offset of the entry. /// /// /// A with the given parameters, or null if none was parsed, after /// which the normal TIFF parsing is used. /// protected override IFDEntry ParseIFDEntry (ushort tag, ushort type, uint count, long base_offset, uint offset) { if (tag == 0x002e && !seen_jpgfromraw) { // FIXME: JpgFromRaw file.Seek (base_offset + offset, SeekOrigin.Begin); var data = file.ReadBlock ((int) count); var mem_stream = new MemoryStream (data.Data); var res = new StreamJPGAbstraction (mem_stream); (file as Rw2.File).JpgFromRaw = new Jpeg.File (res, ReadStyle.Average); seen_jpgfromraw = true; return null; } return base.ParseIFDEntry (tag, type, count, base_offset, offset); } private bool seen_jpgfromraw = false; } class StreamJPGAbstraction : File.IFileAbstraction { readonly Stream stream; public StreamJPGAbstraction (Stream stream) { this.stream = stream; } public string Name { get { return "JpgFromRaw.jpg"; } } public void CloseStream (System.IO.Stream stream) { stream.Close (); } public System.IO.Stream ReadStream { get { return stream; } } public System.IO.Stream WriteStream { get { return stream; } } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/Nef/0000777000175000017500000000000011503407423021647 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/Nef/File.cs0000644000175000017500000001157711470571657023102 0ustar00rubenruben00000000000000// // File.cs: Provides tagging for Nikon NEF files // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using TagLib; using TagLib.Image; using TagLib.IFD; using TagLib.IFD.Tags; namespace TagLib.Tiff.Nef { /// /// This class extends to provide tagging /// for NEF image files. /// [SupportedMimeType("taglib/nef", "nef")] [SupportedMimeType("image/nef")] [SupportedMimeType("image/x-nikon-nef")] public class File : TagLib.Tiff.File { #region public Properties /// /// Indicates if tags can be written back to the current file or not /// /// /// A which is true if tags can be written to the /// current file, otherwise false. /// public override bool Writeable { get { return false; } } #endregion #region constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : this (new File.LocalFileAbstraction (path), propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : this (path, ReadStyle.Average) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified file abstraction. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// protected File (IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) { } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { throw new NotSupportedException (); } #endregion /// /// Create a codec that describes the photo properties. /// /// /// A object. /// protected override Codec CreateCodec (int width, int height) { return new Codec (width, height, "Nikon Raw File"); } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/Arw/0000777000175000017500000000000011503407423021670 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tiff/Arw/File.cs0000644000175000017500000001157511470571657023121 0ustar00rubenruben00000000000000// // File.cs: Provides tagging for Sony ARW files // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using TagLib; using TagLib.Image; using TagLib.IFD; using TagLib.IFD.Tags; namespace TagLib.Tiff.Arw { /// /// This class extends to provide tagging /// for ARW image files. /// [SupportedMimeType("taglib/arw", "arw")] [SupportedMimeType("image/arw")] [SupportedMimeType("image/x-sony-arw")] public class File : TagLib.Tiff.File { #region public Properties /// /// Indicates if tags can be written back to the current file or not /// /// /// A which is true if tags can be written to the /// current file, otherwise false. /// public override bool Writeable { get { return false; } } #endregion #region constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : this (new File.LocalFileAbstraction (path), propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : this (path, ReadStyle.Average) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified file abstraction. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// protected File (IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) { } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { throw new NotSupportedException (); } #endregion /// /// Create a codec that describes the photo properties. /// /// /// A object. /// protected override Codec CreateCodec (int width, int height) { return new Codec (width, height, "Sony Raw File"); } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/ListBase.cs0000644000175000017500000002640111462100402022272 0ustar00rubenruben00000000000000// // ListBase.cs: // // Author: // Aaron Bockover (abockover@novell.com) // // Original Source: // tbytevectorlist.cpp from TagLib // // Copyright (C) 2006 Novell, Inc. // Copyright (C) 2002,2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Text; using System.Collections; using System.Collections.Generic; namespace TagLib { /// /// This class implements /// for objects that implement , /// providing extra features used in lists in TagLib#. /// public class ListBase : IList where T : IComparable { /// /// Contains the internal list. /// private List data = new List (); #region Constructors /// /// Constructs and initializes a new instance of with no contents. /// public ListBase () { } /// /// Constructs and initializes a new instance of with specified contents. /// /// /// A containing objects to add to the current instance. /// public ListBase(ListBase list) { if (list != null) Add (list); } /// /// Constructs and initializes a new instance of with specified contents. /// /// /// A containing objects to add to /// the current instance. /// public ListBase (params T [] list) { if (list != null) Add (list); } #endregion #region Properties /// /// Gets whether or not the current instance is empty. /// /// /// if the current instance is empty; /// otherwise . /// public bool IsEmpty { get {return Count == 0;} } #endregion #region Methods /// /// Adds a collection of elements to the current instance. /// /// /// A object containing /// elements to add to the current instance. /// public void Add(ListBase list) { if(list != null) { data.AddRange(list); } } /// /// Adds a collection of elements to the current instance. /// /// /// A object containing /// elements to add to the current instance. /// public void Add(IEnumerable list) { if(list != null) { data.AddRange(list); } } /// /// Adds a collection of elements to the current instance. /// /// /// An array containing elements to add to the current /// instance. /// public void Add(T [] list) { if(list != null) { data.AddRange(list); } } /// /// Performs a sorted insert of an object into the current /// instance, optionally only adding if the item is unique. /// /// /// An object to add to the current instance. /// /// /// If , the object will only be added /// if an identical value is not already contained in the /// current instance. /// /// /// is . /// public virtual void SortedInsert (T item, bool unique) { if (item == null) throw new ArgumentNullException ("item"); int i = 0; for(; i < data.Count; i++) { if(item.CompareTo(data[i]) == 0 && unique) { return; } if(item.CompareTo(data[i]) <= 0) { break; } } Insert(i, item); } /// /// Performs a sorted insert of an object into the current /// instance. /// /// /// An object to add to the current instance. /// /// /// is . /// public void SortedInsert (T item) { if (item == null) throw new ArgumentNullException ("item"); SortedInsert(item, false); } /// /// Converts the current instance to an array. /// /// /// A containing the contents of /// the current instance. /// public T [] ToArray () { return data.ToArray(); } #endregion #region IList /// /// Gets whether or not the current instance is read-only. /// /// /// Always . /// public bool IsReadOnly { get { return false; } } /// /// Gets whether or not the current instance has a fixed /// size. /// /// /// Always . /// public bool IsFixedSize { get { return false; } } /// /// Gets and sets the value as a specified index. /// public T this [int index] { get { return data[index]; } set { data[index] = value; } } /// /// Adds a single item to end of the current instance. /// /// /// An object to add to the end of the current instance. /// public void Add (T item) { data.Add (item); } /// /// Clears the contents of the current instance. /// public void Clear () { data.Clear (); } /// /// Gets whether or not the current instance contains a /// specified object. /// /// /// An object to look for in the current instance. /// /// /// if the item could be found; /// otherwise . /// public bool Contains (T item) { return data.Contains (item); } /// /// Gets the index of the first occurance of a value. /// /// /// A object to find in the current instance. /// /// /// A value containing the first index /// at which the value was found, or -1 if it was not found. /// public int IndexOf (T item) { return data.IndexOf (item); } /// /// Inserts a single value into the current instance at a // specified index. /// /// /// A value specifying the position at /// which to insert the value. /// /// /// An object to insert into the current instance. /// public void Insert (int index, T item) { data.Insert (index, item); } /// /// Removes the first occurance of an object from the current /// instance. /// /// /// An object to remove from the current instance. /// /// /// if the value was removed; /// otherwise the value did not appear in the current /// instance and is returned. /// public bool Remove (T item) { return data.Remove (item); } /// /// Removes the item at the specified index. /// /// /// A value specifying the position at /// which to remove an item. /// public void RemoveAt (int index) { data.RemoveAt (index); } /// /// Gets a string representation of the contents of the /// current instance, joined by a separator. /// /// /// A object to separate the items /// with. /// /// /// A object containing the contents /// of the current instance. /// public string ToString (string separator) { StringBuilder builder = new StringBuilder(); for(int i = 0; i < Count; i++) { if(i != 0) { builder.Append(separator); } builder.Append(this[i].ToString()); } return builder.ToString (); } /// /// Gets a string representation of the contents of the /// current instance, joined by commas. /// /// /// A object containing the contents /// of the current instance. /// public override string ToString () { return ToString(", "); } #endregion #region ICollection /// /// Gets the number of elements in the current instance. /// /// /// A value containing the number of /// elements in the current instance. /// public int Count { get {return data.Count;} } /// /// Gets whether or not the current instance is synchronized. /// /// /// Always . /// public bool IsSynchronized { get {return false;} } /// /// Gets the object that can be used to synchronize the /// current instance. /// /// /// A that can be used to synchronize /// the current instance. /// public object SyncRoot { get {return this;} } /// /// Copies the current instance to an array, starting at a /// specified index. /// /// /// An array to copy to. /// /// /// A value indicating the index in /// at which to start copying. /// public void CopyTo (T [] array, int arrayIndex) { data.CopyTo (array, arrayIndex); } #endregion #region IEnumerable /// /// Gets an enumerator for enumerating through the elements /// in the current instance. /// /// /// A for /// enumerating through the tag's data boxes. /// public IEnumerator GetEnumerator() { return data.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return data.GetEnumerator(); } #endregion } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/ByteVectorList.cs0000644000175000017500000002170511462100402023510 0ustar00rubenruben00000000000000// // ByteVectorList.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // Aaron Bockover (abockover@novell.com) // // Original Source: // tbytevectorlist.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2006 Novell, Inc. // Copyright (C) 2002,2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; namespace TagLib { /// /// This class extends to represent /// a collection of objects. /// [ComVisible(false)] public class ByteVectorCollection : ListBase { /// /// Constructs and initializes a new instance of with no contents. /// public ByteVectorCollection () { } /// /// Constructs and initializes a new instance of with specified contents. /// /// /// A containing objects to add to /// the current instance. /// public ByteVectorCollection(IEnumerable list) { if (list != null) Add (list); } /// /// Constructs and initializes a new instance of with specified contents. /// /// /// A containing objects to add to /// the current instance. /// public ByteVectorCollection (params ByteVector[] list) { if (list != null) Add (list); } /// /// Performs a sorted insert of a /// object into the current instance, optionally only adding /// if the item is unique. /// /// /// A object to add to the current /// instance. /// /// /// If , the object will only be added /// if an identical value is not already contained in the /// current instance. /// /// /// is . /// public override void SortedInsert (ByteVector item, bool unique) { if (item == null) throw new ArgumentNullException ("item"); // FIXME: This is not used, but if it is a faster // method could be used. int i = 0; for(; i < Count; i++) { if (item == this[i] && unique) return; if (item >= this[i]) break; } Insert (i + 1, item); } /// /// Converts the current instance to a by joining the contents together with a specified /// separator. /// /// /// A object to separate the /// combined contents of the current instance. /// /// /// A new object containing the /// joined contents of the current instance. /// /// /// is . /// public ByteVector ToByteVector (ByteVector separator) { if (separator == null) throw new ArgumentNullException ("separator"); ByteVector vector = new ByteVector(); for(int i = 0; i < Count; i++) { if(i != 0 && separator.Count > 0) vector.Add(separator); vector.Add(this[i]); } return vector; } /// /// Splits a object using a /// pattern. /// /// /// A object to split. /// /// /// A object to use to split /// with. /// /// /// A specifying the byte align to use /// when splitting. In order to split when a pattern is /// encountered, the index at which it is found must be // divisible by . /// /// /// A value specifying the maximum number /// of objects to return, or zero to not to limit the number. /// If that that number is reached, the last value will /// contain the remainder of the file even if it contains /// more instances of . /// /// /// A object containing /// the split contents of the current instance. /// /// /// or /// is . /// /// /// is less than 1. /// public static ByteVectorCollection Split (ByteVector vector, ByteVector pattern, int byteAlign, int max) { if (vector == null) throw new ArgumentNullException ("vector"); if (pattern == null) throw new ArgumentNullException ("pattern"); if (byteAlign < 1) throw new ArgumentOutOfRangeException ( "byteAlign", "byteAlign must be at least 1."); ByteVectorCollection list = new ByteVectorCollection (); int previous_offset = 0; for (int offset = vector.Find(pattern, 0, byteAlign); offset != -1 && (max < 1 || max > list.Count + 1); offset = vector.Find (pattern, offset + pattern.Count, byteAlign)) { list.Add (vector.Mid (previous_offset, offset - previous_offset)); previous_offset = offset + pattern.Count; } if (previous_offset < vector.Count) list.Add (vector.Mid (previous_offset, vector.Count - previous_offset)); return list; } /// /// Splits a object using a /// pattern. /// /// /// A object to split. /// /// /// A object to use to split /// with. /// /// /// A specifying the byte align to use /// when splitting. In order to split when a pattern is /// encountered, the index at which it is found must be // divisible by . /// /// /// A object containing /// the split contents of the current instance. /// /// /// or /// is . /// /// /// is less than 1. /// public static ByteVectorCollection Split (ByteVector vector, ByteVector pattern, int byteAlign) { return Split(vector, pattern, byteAlign, 0); } /// /// Splits a object using a /// pattern. /// /// /// A object to split. /// /// /// A object to use to split /// with. /// /// /// A object containing /// the split contents of the current instance. /// /// /// or /// is . /// public static ByteVectorCollection Split (ByteVector vector, ByteVector pattern) { return Split(vector, pattern, 1); } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Xmp/0000777000175000017500000000000011503407423021013 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Xmp/XmpNode.cs0000644000175000017500000002721711470571657022737 0ustar00rubenruben00000000000000// // XmpNode.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2009 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using System.Xml; namespace TagLib.Xmp { /// /// An represents a node in the XMP document. /// This is any valid XMP element. /// public class XmpNode { #region Private Fields /// /// The children of the current node /// private List children; /// /// The qualifiers of the current node /// private Dictionary> qualifiers; /// /// The name of the current node /// private string name; #endregion #region Properties /// /// The namespace the current instance belongs to /// public string Namespace { get; private set; } /// /// The name of the current node instance /// public string Name { get { return name; } internal set { if (name != null) throw new Exception ("Cannot change named node"); if (value == null) throw new ArgumentException ("value"); name = value; } } /// /// The text value of the current node /// public string Value { get; set; } /// /// The type of the current node /// public XmpNodeType Type { get; internal set; } /// /// The number of qualifiers of the current instance /// public int QualifierCount { get { if (qualifiers == null) return 0; int count = 0; foreach (var collection in qualifiers.Values) { count += collection == null ? 0 : collection.Count; } return count; } } /// /// The children of the current instance. /// public List Children { // TODO: do not return a list, because it can be modified elsewhere get { return children ?? new List (); } } #endregion #region Constructors /// /// Constructor. /// /// /// A with the namespace of the new instance. /// /// /// A with the name of the new instance. /// public XmpNode (string ns, string name) { // Namespaces in XMP need to end with / or #. Broken files are known // to be floating around (we have one with MicrosoftPhoto in our tree). // Correcting below. if (ns != String.Empty && ns != XmpTag.XML_NS && !ns.EndsWith ("/") && !ns.EndsWith ("#")) ns = String.Format ("{0}/", ns); Namespace = ns; Name = name; Type = XmpNodeType.Simple; Value = String.Empty; } /// /// Constructor. /// /// /// A with the namespace of the new instance. /// /// /// A with the name of the new instance. /// /// /// A with the txt value of the new instance. /// public XmpNode (string ns, string name, string value) : this (ns, name) { Value = value; } #endregion #region Public Methods /// /// Adds a node as child of the current node /// /// /// A to be add as child /// public void AddChild (XmpNode node) { if (node == null || node == this) throw new ArgumentException ("node"); if (children == null) children = new List (); children.Add (node); } /// /// Removes the given node as child of the current instance /// /// /// A to remove as child /// public void RemoveChild (XmpNode node) { if (children == null) return; children.Remove (node); } /// /// Get a named child from the current node /// /// /// The namespace of the child node. /// /// /// The name of the child node. /// /// /// A with the given name and namespace. /// public XmpNode GetChild (string ns, string name) { foreach (var node in children) { if (node.Namespace.Equals (ns) && node.Name.Equals (name)) return node; } return null; } /// /// Adds a node as qualifier of the current instance /// /// /// A to add as qualifier /// public void AddQualifier (XmpNode node) { if (node == null || node == this) throw new ArgumentException ("node"); if (qualifiers == null) qualifiers = new Dictionary> (); if (!qualifiers.ContainsKey (node.Namespace)) qualifiers [node.Namespace] = new Dictionary (); qualifiers [node.Namespace][node.Name] = node; } /// /// Returns the qualifier associated with the given namespace /// and name /// /// /// A with the namespace of the qualifier /// /// /// A with the name of the qualifier /// /// /// A with the qualifier /// public XmpNode GetQualifier (string ns, string name) { if (qualifiers == null) return null; if (!qualifiers.ContainsKey (ns)) return null; if (!qualifiers [ns].ContainsKey (name)) return null; return qualifiers [ns][name]; } /// /// Print a debug output of the node. /// public void Dump () { Dump (""); } /// /// Calls the Visitor for this node and every child node. /// /// /// A to access the node and the children. /// public void Accept (XmpNodeVisitor visitor) { visitor.Visit (this); // TODO: what is with the qualifiers ? // either add them to be also visited, or add a comment if (children != null) { foreach (XmpNode child in children) { child.Accept (visitor); } } } /// /// Renders the current instance as child of the given node to the /// given /// /// /// A to render the current instance as child of. /// public void RenderInto (XmlNode parent) { if (IsRootNode) { AddAllChildrenTo (parent); } else if (IsReallySimpleType && parent.Attributes.GetNamedItem (XmpTag.PARSE_TYPE_URI, XmpTag.RDF_NS) == null) { // Simple values can be added as attributes of the parent node. Not allowed when the parent has an rdf:parseType. XmlAttribute attr = XmpTag.CreateAttribute (parent.OwnerDocument, Name, Namespace); attr.Value = Value; parent.Attributes.Append (attr); } else if (Type == XmpNodeType.Simple || Type == XmpNodeType.Struct) { var node = XmpTag.CreateNode (parent.OwnerDocument, Name, Namespace); node.InnerText = Value; if (Type == XmpNodeType.Struct) { // Structured types are always handled as a parseType=Resource node. This way, IsReallySimpleType will // not match for child nodes, which makes sure they are added as extra nodes to this node. Does the // trick well, unit tests that prove this are in XmpSpecTest. XmlAttribute attr = XmpTag.CreateAttribute (parent.OwnerDocument, XmpTag.PARSE_TYPE_URI, XmpTag.RDF_NS); attr.Value = "Resource"; node.Attributes.Append (attr); } AddAllQualifiersTo (node); AddAllChildrenTo (node); parent.AppendChild (node); } else if (Type == XmpNodeType.Bag) { var node = XmpTag.CreateNode (parent.OwnerDocument, Name, Namespace); // TODO: Add all qualifiers. if (QualifierCount > 0) throw new NotImplementedException (); var bag = XmpTag.CreateNode (parent.OwnerDocument, XmpTag.BAG_URI, XmpTag.RDF_NS); foreach (var child in Children) child.RenderInto (bag); node.AppendChild (bag); parent.AppendChild (node); } else if (Type == XmpNodeType.Alt) { var node = XmpTag.CreateNode (parent.OwnerDocument, Name, Namespace); // TODO: Add all qualifiers. if (QualifierCount > 0) throw new NotImplementedException (); var bag = XmpTag.CreateNode (parent.OwnerDocument, XmpTag.ALT_URI, XmpTag.RDF_NS); foreach (var child in Children) child.RenderInto (bag); node.AppendChild (bag); parent.AppendChild (node); } else if (Type == XmpNodeType.Seq) { var node = XmpTag.CreateNode (parent.OwnerDocument, Name, Namespace); // TODO: Add all qualifiers. if (QualifierCount > 0) throw new NotImplementedException (); var bag = XmpTag.CreateNode (parent.OwnerDocument, XmpTag.SEQ_URI, XmpTag.RDF_NS); foreach (var child in Children) child.RenderInto (bag); node.AppendChild (bag); parent.AppendChild (node); } else { // Probably some combination of things we don't fully cover yet. Dump (); throw new NotImplementedException (); } } #endregion #region Internal Methods internal void Dump (string prefix) { Console.WriteLine ("{0}{1}{2} ({4}) = \"{3}\"", prefix, Namespace, Name, Value, Type); if (qualifiers != null) { Console.WriteLine ("{0}Qualifiers:", prefix); foreach (string ns in qualifiers.Keys) { foreach (string name in qualifiers [ns].Keys) { qualifiers [ns][name].Dump (prefix+" -> "); } } } if (children != null) { Console.WriteLine ("{0}Children:", prefix); foreach (XmpNode child in children) { child.Dump (prefix+" -> "); } } } #endregion #region Private Methods /// /// Is this a node that we can transform into an attribute of the /// parent node? Yes if it has no qualifiers or children, nor is /// it part of a list. /// private bool IsReallySimpleType { get { return Type == XmpNodeType.Simple && (children == null || children.Count == 0) && QualifierCount == 0 && (Name != XmpTag.LI_URI || Namespace != XmpTag.RDF_NS); } } /// /// Is this the root node of the tree? /// private bool IsRootNode { get { return Name == String.Empty && Namespace == String.Empty; } } private void AddAllQualifiersTo (XmlNode xml) { if (qualifiers == null) return; foreach (var collection in qualifiers.Values) { foreach (XmpNode node in collection.Values) { XmlAttribute attr = XmpTag.CreateAttribute (xml.OwnerDocument, node.Name, node.Namespace); attr.Value = node.Value; xml.Attributes.Append (attr); } } } private void AddAllChildrenTo (XmlNode parent) { if (children == null) return; foreach (var child in children) child.RenderInto (parent); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Xmp/XmpNodeVisitor.cs0000644000175000017500000000241111470571657024304 0ustar00rubenruben00000000000000// // XmpNodeVisitor.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2009 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.Xmp { /// /// A visitor that walks the XMP node tree. This can be used to /// perform cleanups of XMP data. See the Visitor pattern for /// more info if you don't know how to use this. /// public interface XmpNodeVisitor { /// /// Visit an . /// /// /// The that is being visited. /// void Visit (XmpNode node); } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Xmp/XmpNodeType.cs0000644000175000017500000000250411470571657023571 0ustar00rubenruben00000000000000// // XmpNodeType.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2009 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Xmp { /// /// Denotes the type of a node. /// public enum XmpNodeType { /// /// Unstructured (simple) value node. /// Simple, /// /// Structured value node. /// Struct, /// /// Ordered array. /// Seq, /// /// Language alternative. /// Alt, /// /// Unordered structured value. /// Bag } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Xmp/XmpTag.cs0000644000175000017500000012132011470571657022553 0ustar00rubenruben00000000000000// // XmpTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2009 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using System.Xml; using TagLib.Image; using TagLib.IFD.Entries; namespace TagLib.Xmp { /// /// Holds XMP (Extensible Metadata Platform) metadata. /// public class XmpTag : ImageTag { static XmpTag () { Initialize (); } #region Parsing speedup private Dictionary> nodes; /// /// Adobe namespace /// public static readonly string ADOBE_X_NS = "adobe:ns:meta/"; /// /// Camera Raw Settings namespace /// public static readonly string CRS_NS = "http://ns.adobe.com/camera-raw-settings/1.0/"; /// /// Dublin Core namespace /// public static readonly string DC_NS = "http://purl.org/dc/elements/1.1/"; /// /// Exif namespace /// public static readonly string EXIF_NS = "http://ns.adobe.com/exif/1.0/"; /// /// Exif aux namespace /// public static readonly string EXIF_AUX_NS = "http://ns.adobe.com/exif/1.0/aux/"; /// /// JOB namespace /// public static readonly string JOB_NS = "http://ns.adobe.com/xap/1.0/sType/Job#"; /// /// Microsoft Photo namespace /// public static readonly string MS_PHOTO_NS = "http://ns.microsoft.com/photo/1.0/"; /// /// Photoshop namespace /// public static readonly string PHOTOSHOP_NS = "http://ns.adobe.com/photoshop/1.0/"; /// /// Prism namespace /// public static readonly string PRISM_NS = "http://prismstandard.org/namespaces/basic/2.1/"; /// /// RDF namespace /// public static readonly string RDF_NS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; /// /// STDIM namespace /// public static readonly string STDIM_NS = "http://ns.adobe.com/xap/1.0/sType/Dimensions#"; /// /// TIFF namespace /// public static readonly string TIFF_NS = "http://ns.adobe.com/tiff/1.0/"; /// /// XAP (XMP's previous name) namespace /// public static readonly string XAP_NS = "http://ns.adobe.com/xap/1.0/"; /// /// XAP bj namespace /// public static readonly string XAP_BJ_NS = "http://ns.adobe.com/xap/1.0/bj/"; /// /// XAP mm namespace /// public static readonly string XAP_MM_NS = "http://ns.adobe.com/xap/1.0/mm/"; /// /// XAP rights namespace /// public static readonly string XAP_RIGHTS_NS = "http://ns.adobe.com/xap/1.0/rights/"; /// /// XML namespace /// public static readonly string XML_NS = "http://www.w3.org/XML/1998/namespace"; /// /// XMLNS namespace /// public static readonly string XMLNS_NS = "http://www.w3.org/2000/xmlns/"; /// /// XMP TPg (XMP Paged-Text) namespace /// public static readonly string XMPTG_NS = "http://ns.adobe.com/xap/1.0/t/pg/"; internal static readonly string ABOUT_URI = "about"; internal static readonly string ABOUT_EACH_URI = "aboutEach"; internal static readonly string ABOUT_EACH_PREFIX_URI = "aboutEachPrefix"; internal static readonly string ALT_URI = "Alt"; internal static readonly string BAG_URI = "Bag"; internal static readonly string BAG_ID_URI = "bagID"; internal static readonly string DATA_TYPE_URI = "datatype"; internal static readonly string DESCRIPTION_URI = "Description"; internal static readonly string ID_URI = "ID"; internal static readonly string LANG_URI = "lang"; internal static readonly string LI_URI = "li"; internal static readonly string NODE_ID_URI = "nodeID"; internal static readonly string PARSE_TYPE_URI = "parseType"; internal static readonly string RDF_URI = "RDF"; internal static readonly string RESOURCE_URI = "resource"; internal static readonly string SEQ_URI = "Seq"; internal static readonly string VALUE_URI = "value"; // This allows for fast string comparison using operator== static readonly NameTable NameTable = new NameTable (); static bool initialized = false; static void Initialize () { if (initialized) return; lock (NameTable) { if (initialized) return; PrepareNamespaces (); initialized = true; } } static void PrepareNamespaces () { // Namespaces AddNamespacePrefix ("", ""); // Needed for the about attribute, which can be unqualified. AddNamespacePrefix ("x", ADOBE_X_NS); AddNamespacePrefix ("crs", CRS_NS); AddNamespacePrefix ("dc", DC_NS); AddNamespacePrefix ("exif", EXIF_NS); AddNamespacePrefix ("aux", EXIF_AUX_NS); AddNamespacePrefix ("stJob", JOB_NS); AddNamespacePrefix ("MicrosoftPhoto", MS_PHOTO_NS); AddNamespacePrefix ("photoshop", PHOTOSHOP_NS); AddNamespacePrefix ("prism", PRISM_NS); AddNamespacePrefix ("rdf", RDF_NS); AddNamespacePrefix ("stDim", STDIM_NS); AddNamespacePrefix ("tiff", TIFF_NS); AddNamespacePrefix ("xmp", XAP_NS); AddNamespacePrefix ("xapBJ", XAP_BJ_NS); AddNamespacePrefix ("xapMM", XAP_MM_NS); AddNamespacePrefix ("xapRights", XAP_RIGHTS_NS); AddNamespacePrefix ("xml", XML_NS); AddNamespacePrefix ("xmlns", XMLNS_NS); AddNamespacePrefix ("xmpTPg", XMPTG_NS); // Attribute names NameTable.Add (ABOUT_URI); NameTable.Add (ABOUT_EACH_URI); NameTable.Add (ABOUT_EACH_PREFIX_URI); NameTable.Add (ALT_URI); NameTable.Add (BAG_URI); NameTable.Add (BAG_ID_URI); NameTable.Add (DATA_TYPE_URI); NameTable.Add (DESCRIPTION_URI); NameTable.Add (ID_URI); NameTable.Add (LANG_URI); NameTable.Add (LI_URI); NameTable.Add (NODE_ID_URI); NameTable.Add (PARSE_TYPE_URI); NameTable.Add (RDF_URI); NameTable.Add (RESOURCE_URI); NameTable.Add (SEQ_URI); NameTable.Add (VALUE_URI); } /// /// Mapping between full namespaces and their short prefix. Needs to be public for the unit test generator. /// public static Dictionary NamespacePrefixes = new Dictionary(); static int anon_ns_count = 0; static void AddNamespacePrefix (string prefix, string ns) { NameTable.Add (ns); NamespacePrefixes.Add (ns, prefix); } #endregion #region Constructors /// /// Construct a new empty . /// public XmpTag () { NodeTree = new XmpNode (String.Empty, String.Empty); nodes = new Dictionary> (); } /// /// Construct a new , using the data parsed from the given string. /// /// /// A containing an XMP packet. This should be a valid /// XMP block. /// /// /// The file that's currently being parsed, used for reporting corruptions. /// public XmpTag (string data, TagLib.File file) { XmlDocument doc = new XmlDocument (NameTable); doc.LoadXml (data); XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("x", ADOBE_X_NS); nsmgr.AddNamespace("rdf", RDF_NS); XmlNode node = doc.SelectSingleNode("/x:xmpmeta/rdf:RDF", nsmgr); // Old versions of XMP were called XAP, fall back to this case (tested in sample_xap.jpg) node = node ?? doc.SelectSingleNode("/x:xapmeta/rdf:RDF", nsmgr); if (node == null) throw new CorruptFileException (); NodeTree = ParseRDF (node, file); AcceptVisitors (); } #endregion #region Private Methods // 7.2.9 RDF // start-element ( URI == rdf:RDF, attributes == set() ) // nodeElementList // end-element() private XmpNode ParseRDF (XmlNode rdf_node, TagLib.File file) { XmpNode top = new XmpNode (String.Empty, String.Empty); foreach (XmlNode node in rdf_node.ChildNodes) { if (node is XmlWhitespace) continue; if (node.Is (RDF_NS, DESCRIPTION_URI)) { var attr = node.Attributes.GetNamedItem (RDF_NS, ABOUT_URI) as XmlAttribute; if (attr != null) { if (top.Name != String.Empty && top.Name != attr.InnerText) throw new CorruptFileException ("Multiple inconsistent rdf:about values!"); top.Name = attr.InnerText; } continue; } file.MarkAsCorrupt ("Cannot have anything other than rdf:Description at the top level"); return top; } ParseNodeElementList (top, rdf_node); return top; } // 7.2.10 nodeElementList // ws* ( nodeElement ws* )* private void ParseNodeElementList (XmpNode parent, XmlNode xml_parent) { foreach (XmlNode node in xml_parent.ChildNodes) { if (node is XmlWhitespace) continue; ParseNodeElement (parent, node); } } // 7.2.11 nodeElement // start-element ( URI == nodeElementURIs, // attributes == set ( ( idAttr | nodeIdAttr | aboutAttr )?, propertyAttr* ) ) // propertyEltList // end-element() // // 7.2.13 propertyEltList // ws* ( propertyElt ws* )* private void ParseNodeElement (XmpNode parent, XmlNode node) { if (!node.IsNodeElement ()) throw new CorruptFileException ("Unexpected node found, invalid RDF?"); if (node.Is (RDF_NS, SEQ_URI)) { parent.Type = XmpNodeType.Seq; } else if (node.Is (RDF_NS, ALT_URI)) { parent.Type = XmpNodeType.Alt; } else if (node.Is (RDF_NS, BAG_URI)) { parent.Type = XmpNodeType.Bag; } else if (node.Is (RDF_NS, DESCRIPTION_URI)) { parent.Type = XmpNodeType.Struct; } else { throw new Exception ("Unknown nodeelement found! Perhaps an unimplemented collection?"); } foreach (XmlAttribute attr in node.Attributes) { if (attr.In (XMLNS_NS)) continue; if (attr.Is (RDF_NS, ID_URI) || attr.Is (RDF_NS, NODE_ID_URI) || attr.Is (RDF_NS, ABOUT_URI)) continue; if (attr.Is (XML_NS, LANG_URI)) throw new CorruptFileException ("xml:lang is not allowed here!"); parent.AddChild (new XmpNode (attr.NamespaceURI, attr.LocalName, attr.InnerText)); } foreach (XmlNode child in node.ChildNodes) { if (child is XmlWhitespace || child is XmlComment) continue; ParsePropertyElement (parent, child); } } // 7.2.14 propertyElt // resourcePropertyElt | literalPropertyElt | parseTypeLiteralPropertyElt | // parseTypeResourcePropertyElt | parseTypeCollectionPropertyElt | // parseTypeOtherPropertyElt | emptyPropertyElt private void ParsePropertyElement (XmpNode parent, XmlNode node) { int count = 0; bool has_other = false; foreach (XmlAttribute attr in node.Attributes) { if (!attr.In (XMLNS_NS)) count++; if (!attr.Is (XML_NS, LANG_URI) && !attr.Is (RDF_NS, ID_URI) && !attr.In (XMLNS_NS)) has_other = true; } if (count > 3) { ParseEmptyPropertyElement (parent, node); } else { if (!has_other) { if (!node.HasChildNodes) { ParseEmptyPropertyElement (parent, node); } else { bool only_text = true; foreach (XmlNode child in node.ChildNodes) { if (!(child is XmlText)) only_text = false; } if (only_text) { ParseLiteralPropertyElement (parent, node); } else { ParseResourcePropertyElement (parent, node); } } } else { foreach (XmlAttribute attr in node.Attributes) { if (attr.Is (XML_NS, LANG_URI) || attr.Is (RDF_NS, ID_URI) || attr.In (XMLNS_NS)) continue; if (attr.Is (RDF_NS, DATA_TYPE_URI)) { ParseLiteralPropertyElement (parent, node); } else if (!attr.Is (RDF_NS, PARSE_TYPE_URI)) { ParseEmptyPropertyElement (parent, node); } else if (attr.InnerText.Equals ("Resource")) { ParseTypeResourcePropertyElement (parent, node); } else { // Neither Literal, Collection or anything else is allowed throw new CorruptFileException (String.Format ("This is not allowed in XMP! Bad XMP: {0}", node.OuterXml)); } } } } } // 7.2.15 resourcePropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr? ) ) // ws* nodeElement ws* // end-element() private void ParseResourcePropertyElement (XmpNode parent, XmlNode node) { if (!node.IsPropertyElement ()) throw new CorruptFileException ("Invalid property"); XmpNode new_node = new XmpNode (node.NamespaceURI, node.LocalName); foreach (XmlAttribute attr in node.Attributes) { if (attr.Is (XML_NS, LANG_URI)) { new_node.AddQualifier (new XmpNode (XML_NS, LANG_URI, attr.InnerText)); } else if (attr.Is (RDF_NS, ID_URI) || attr.In (XMLNS_NS)) { continue; } throw new CorruptFileException (String.Format ("Invalid attribute: {0}", attr.OuterXml)); } bool has_xml_children = false; foreach (XmlNode child in node.ChildNodes) { if (child is XmlWhitespace) continue; if (child is XmlText) throw new CorruptFileException ("Can't have text here!"); has_xml_children = true; ParseNodeElement (new_node, child); } if (!has_xml_children) throw new CorruptFileException ("Missing children for resource property element"); parent.AddChild (new_node); } // 7.2.16 literalPropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, datatypeAttr?) ) // text() // end-element() private void ParseLiteralPropertyElement (XmpNode parent, XmlNode node) { if (!node.IsPropertyElement ()) throw new CorruptFileException ("Invalid property"); parent.AddChild (CreateTextPropertyWithQualifiers (node, node.InnerText)); } // 7.2.18 parseTypeResourcePropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, parseResource ) ) // propertyEltList // end-element() private void ParseTypeResourcePropertyElement (XmpNode parent, XmlNode node) { if (!node.IsPropertyElement ()) throw new CorruptFileException ("Invalid property"); XmpNode new_node = new XmpNode (node.NamespaceURI, node.LocalName); new_node.Type = XmpNodeType.Struct; foreach (XmlNode attr in node.Attributes) { if (attr.Is (XML_NS, LANG_URI)) new_node.AddQualifier (new XmpNode (XML_NS, LANG_URI, attr.InnerText)); } foreach (XmlNode child in node.ChildNodes) { if (child is XmlWhitespace || child is XmlComment) continue; ParsePropertyElement (new_node, child); } parent.AddChild (new_node); } // 7.2.21 emptyPropertyElt // start-element ( URI == propertyElementURIs, // attributes == set ( idAttr?, ( resourceAttr | nodeIdAttr )?, propertyAttr* ) ) // end-element() private void ParseEmptyPropertyElement (XmpNode parent, XmlNode node) { if (!node.IsPropertyElement ()) throw new CorruptFileException ("Invalid property"); if (node.HasChildNodes) throw new CorruptFileException (String.Format ("Can't have content in this node! Node: {0}", node.OuterXml)); var rdf_value = node.Attributes.GetNamedItem (VALUE_URI, RDF_NS) as XmlAttribute; var rdf_resource = node.Attributes.GetNamedItem (RESOURCE_URI, RDF_NS) as XmlAttribute; // Options 1 and 2 var simple_prop_val = rdf_value ?? rdf_resource ?? null; if (simple_prop_val != null) { string value = simple_prop_val.InnerText; parent.AddChild (CreateTextPropertyWithQualifiers (node, value)); return; } // Options 3 & 4 var new_node = new XmpNode (node.NamespaceURI, node.LocalName); foreach (XmlAttribute a in node.Attributes) { if (a.Is(RDF_NS, ID_URI) || a.Is(RDF_NS, NODE_ID_URI)) { continue; } else if (a.In (XMLNS_NS)) { continue; } else if (a.Is (XML_NS, LANG_URI)) { new_node.AddQualifier (new XmpNode (XML_NS, LANG_URI, a.InnerText)); } new_node.AddChild (new XmpNode (a.NamespaceURI, a.LocalName, a.InnerText)); } parent.AddChild (new_node); } private XmpNode CreateTextPropertyWithQualifiers (XmlNode node, string value) { XmpNode t = new XmpNode (node.NamespaceURI, node.LocalName, value); foreach (XmlAttribute attr in node.Attributes) { if (attr.In (XMLNS_NS)) continue; if (attr.Is (RDF_NS, VALUE_URI) || attr.Is (RDF_NS, RESOURCE_URI)) continue; // These aren't qualifiers t.AddQualifier (new XmpNode (attr.NamespaceURI, attr.LocalName, attr.InnerText)); } return t; } private XmpNode NewNode (string ns, string name) { Dictionary ns_nodes = null; if (!nodes.ContainsKey (ns)) { ns_nodes = new Dictionary (); nodes.Add (ns, ns_nodes); } else ns_nodes = nodes [ns]; if (ns_nodes.ContainsKey (name)) { foreach (XmpNode child_node in NodeTree.Children) { if (child_node.Namespace == ns && child_node.Name == name) { NodeTree.RemoveChild (child_node); break; } } ns_nodes.Remove (name); } XmpNode node = new XmpNode (ns, name); ns_nodes.Add (name, node); NodeTree.AddChild (node); return node; } private XmpNode NewNode (string ns, string name, XmpNodeType type) { XmpNode node = NewNode (ns, name); node.Type = type; return node; } private void RemoveNode (string ns, string name) { if (!nodes.ContainsKey (ns)) return; foreach (XmpNode node in NodeTree.Children) { if (node.Namespace == ns && node.Name == name) { NodeTree.RemoveChild (node); break; } } nodes[ns].Remove (name); } /// /// Accept visitors to touch up the node tree. /// private void AcceptVisitors () { NodeTree.Accept (new NodeIndexVisitor (this)); //NodeTree.Dump (); //Console.WriteLine (node.OuterXml); } #endregion #region Public Properties /// /// Gets the tag types contained in the current instance. /// /// /// Always . /// public override TagTypes TagTypes { get {return TagTypes.XMP;} } /// /// Get the tree of nodes. These contain the values /// parsed from the XMP file. /// public XmpNode NodeTree { get; private set; } #endregion #region Public Methods /// /// Replace the current tag with the given one. /// /// /// The tag from which the data should be copied. /// public void ReplaceFrom (XmpTag tag) { NodeTree = tag.NodeTree; nodes = new Dictionary> (); AcceptVisitors (); } /// /// Clears the values stored in the current instance. /// public override void Clear () { throw new NotImplementedException (); } /// /// Finds the node associated with the namespace and the name /// . /// /// /// A with the namespace of the node. /// /// /// A with the name of the node. /// /// /// A with the found node, or /// if no node was found. /// public XmpNode FindNode (string ns, string name) { if (!nodes.ContainsKey (ns)) return null; if (!nodes [ns].ContainsKey (name)) return null; return nodes [ns][name]; } /// /// Returns the text of the node associated with the namespace /// and the name . /// /// /// A with the namespace of the node. /// /// /// A with the name of the node. /// /// /// A with the text of the node, or /// if no such node exists, or if it is not /// a text node. /// public string GetTextNode (string ns, string name) { var node = FindNode (ns, name); if (node == null || node.Type != XmpNodeType.Simple) return null; return node.Value; } /// /// Creates a new text node associated with the namespace /// and the name . /// /// /// A with the namespace of the node. /// /// /// A with the name of the node. /// /// /// A with the value for the new node. /// If is given, a possibly existing node will /// be deleted. /// public void SetTextNode (string ns, string name, string value) { if (value == null) { RemoveNode (ns, name); return; } var node = NewNode (ns, name); node.Value = value; } /// /// Searches for a node holding language alternatives. The return value /// is the value of the default language stored by the node. The node is /// identified by the namespace and the name /// . If the default language is not set, an arbitrary /// one is chosen. /// It is also tried to return the value a simple text node, if no /// associated alt-node exists. /// /// /// A with the namespace of the node. /// /// /// A with the name of the node. /// /// /// A with the value stored as default language /// for the referenced node. /// public string GetLangAltNode (string ns, string name) { var node = FindNode (ns, name); if (node == null) return null; if (node.Type == XmpNodeType.Simple) return node.Value; if (node.Type != XmpNodeType.Alt) return null; var children = node.Children; foreach (XmpNode child_node in children) { var qualifier = child_node.GetQualifier (XML_NS, "lang"); if (qualifier != null && qualifier.Value == "x-default") return child_node.Value; } if (children.Count > 0 && children[0].Type == XmpNodeType.Simple) return children[0].Value; return null; } /// /// Stores a the given as the default language /// value for the alt-node associated with the namespace /// and the name . /// All other alternatives set, are deleted by this method. /// /// /// A with the namespace of the node. /// /// /// A with the name of the node. /// /// /// A with the value for the default language /// to set. If is given, a possibly existing node /// will be deleted. /// public void SetLangAltNode (string ns, string name, string value) { if (value == null) { RemoveNode (ns, name); return; } var node = NewNode (ns, name, XmpNodeType.Alt); var child_node = new XmpNode (RDF_NS, LI_URI, value); child_node.AddQualifier (new XmpNode (XML_NS, "lang", "x-default")); node.AddChild (child_node); } /// /// The method returns an array of values /// which are the stored text of the child nodes of the node associated /// with the namespace and the name . /// /// /// A with the namespace of the node. /// /// /// A with the name of the node. /// /// /// A with the text stored in the child nodes. /// public string[] GetCollectionNode (string ns, string name) { var node = FindNode (ns, name); if (node == null) return null; List items = new List (); foreach (XmpNode child in node.Children) { string item = child.Value; if (item != null) items.Add (item); } return items.ToArray (); } /// /// Sets a as texts to the children of the /// node associated with the namespace and the name /// . /// /// /// A with the namespace of the node. /// /// /// A with the name of the node. /// /// /// A with the values to set for the children. /// /// /// A with the type of the parent node. /// public void SetCollectionNode (string ns, string name, string [] values, XmpNodeType type) { if (type == XmpNodeType.Simple || type == XmpNodeType.Alt) throw new ArgumentException ("type"); if (values == null) { RemoveNode (ns, name); return; } var node = NewNode (ns, name, type); foreach (string value in values) node.AddChild (new XmpNode (RDF_NS, LI_URI, value)); } /// /// Returns the rational value of the node associated with the namespace /// and the name . /// /// /// A with the namespace of the node. /// /// /// A with the name of the node. /// /// /// A double? with the read value, or /// if no such node exists, or if it is in wrong /// format. /// /// /// Rational nodes only used in EXIF schema. /// public double? GetRationalNode (string ns, string name) { var text = GetTextNode (ns, name); if (text == null) return null; // format is expected to be e.g. "1/200" ... string [] values = text.Split ('/'); if (values.Length != 2) { // but we also try to parse a double value directly. double result; if (Double.TryParse (text, out result)) return result; return null; } double nom, den; if (Double.TryParse (values[0], out nom) && Double.TryParse (values[1], out den)) { if (den != 0.0) return ((double) nom) / ((double) den); } return null; } /// /// Creates a new rational node with the namespace /// and the name . /// /// /// A with the namespace of the node. /// /// /// A with the name of the node. /// /// /// A with the value of the node. /// public void SetRationalNode (string ns, string name, double value) { string fraction = DecimalToFraction (value, (long) Math.Pow (10, 10)); SetTextNode (ns, name, fraction); } // Based on http://www.ics.uci.edu/~eppstein/numth/frap.c private string DecimalToFraction (double value, long max_denominator) { var m = new long [2, 2]; m[0, 0] = m[1, 1] = 1; m[1, 0] = m[0, 1] = 0; double x = value; long ai; while (m[1, 0] * (ai = (long)x) + m[1, 1] <= max_denominator) { long t = m[0, 0] * ai + m[0, 1]; m[0, 1] = m[0, 0]; m[0, 0] = t; t = m[1, 0] * ai + m[1, 1]; m[1, 1] = m[1, 0]; m[1, 0] = t; if (x == (double)ai) break; // AF: division by zero x = 1 / (x - (double) ai); if (x > (double) 0x7FFFFFFF) break; // AF: representation failure } return String.Format ("{0}/{1}", m[0, 0], m[1, 0]); } /// /// Returns the unsigned integer value of the node associated with the /// namespace and the name . /// /// /// A with the namespace of the node. /// /// /// A with the name of the node. /// /// /// A uint? with the read value, or /// if no such node exists, or if it is in wrong /// format. /// public uint? GetUIntNode (string ns, string name) { var text = GetTextNode (ns, name); if (text == null) return null; uint result; if (UInt32.TryParse (text, out result)) return result; return null; } /// /// Renders the current instance to an XMP . /// /// /// A with the XMP structure. /// public string Render () { XmlDocument doc = new XmlDocument (NameTable); var meta = CreateNode (doc, "xmpmeta", ADOBE_X_NS); var rdf = CreateNode (doc, "RDF", RDF_NS); var description = CreateNode (doc, "Description", RDF_NS); NodeTree.RenderInto (description); doc.AppendChild (meta); meta.AppendChild (rdf); rdf.AppendChild (description); return doc.OuterXml; } /// /// Make sure there's a suitable prefix mapped for the given namespace URI. /// /// /// A with the namespace that will be rendered. /// static void EnsureNamespacePrefix (string ns) { if (!NamespacePrefixes.ContainsKey (ns)) { NamespacePrefixes.Add (ns, String.Format ("ns{0}", ++anon_ns_count)); Console.WriteLine ("TAGLIB# DEBUG: Added {0} prefix for {1} namespace (XMP)", NamespacePrefixes [ns], ns); } } internal static XmlNode CreateNode (XmlDocument doc, string name, string ns) { EnsureNamespacePrefix (ns); return doc.CreateElement (NamespacePrefixes [ns], name, ns); } internal static XmlAttribute CreateAttribute (XmlDocument doc, string name, string ns) { EnsureNamespacePrefix (ns); return doc.CreateAttribute (NamespacePrefixes [ns], name, ns); } #endregion private class NodeIndexVisitor : XmpNodeVisitor { private XmpTag tag; public NodeIndexVisitor (XmpTag tag) { this.tag = tag; } public void Visit (XmpNode node) { // TODO: This should be a proper check to see if it is a nodeElement if (node.Namespace == XmpTag.RDF_NS && node.Name == XmpTag.LI_URI) return; AddNode (node); } void AddNode (XmpNode node) { if (tag.nodes == null) tag.nodes = new Dictionary> (); if (!tag.nodes.ContainsKey (node.Namespace)) tag.nodes [node.Namespace] = new Dictionary (); tag.nodes [node.Namespace][node.Name] = node; } } #region Metadata fields /// /// Gets or sets the comment for the image described /// by the current instance. /// /// /// A containing the comment of the /// current instace. /// public override string Comment { get { string comment = GetLangAltNode (DC_NS, "description"); if (comment != null) return comment; comment = GetLangAltNode (EXIF_NS, "UserComment"); return comment; } set { SetLangAltNode (DC_NS, "description", value); SetLangAltNode (EXIF_NS, "UserComment", value); } } /// /// Gets or sets the keywords for the image described /// by the current instance. /// /// /// A containing the keywords of the /// current instace. /// public override string[] Keywords { get { return GetCollectionNode (DC_NS, "subject") ?? new string [] {}; } set { SetCollectionNode (DC_NS, "subject", value, XmpNodeType.Bag); } } /// /// Gets or sets the rating for the image described /// by the current instance. /// /// /// A containing the rating of the /// current instace. /// public override uint? Rating { get { return GetUIntNode (XAP_NS, "Rating"); } set { SetTextNode (XAP_NS, "Rating", value != null ? value.ToString () : null); } } /// /// Gets or sets the time when the image, the current instance /// belongs to, was taken. /// /// /// A with the time the image was taken. /// public override DateTime? DateTime { get { // TODO: use correct parsing try { return System.DateTime.Parse (GetTextNode (XAP_NS, "CreateDate")); } catch {} return null; } set { // TODO: write correct format SetTextNode (XAP_NS, "CreateDate", value != null ? value.ToString () : null); } } /// /// Gets or sets the orientation of the image described /// by the current instance. /// /// /// A containing the orientation of the /// image /// public override ImageOrientation Orientation { get { var orientation = GetUIntNode (TIFF_NS, "Orientation"); if (orientation.HasValue) return (ImageOrientation) orientation; return ImageOrientation.None; } set { if ((uint) value < 1U || (uint) value > 8U) { RemoveNode (TIFF_NS, "Orientation"); return; } SetTextNode (TIFF_NS, "Orientation", String.Format ("{0}", (ushort) value)); } } /// /// Gets or sets the software the image, the current instance /// belongs to, was created with. /// /// /// A containing the name of the /// software the current instace was created with. /// public override string Software { get { return GetTextNode (XAP_NS, "CreatorTool"); } set { SetTextNode (XAP_NS, "CreatorTool", value); } } /// /// Gets or sets the latitude of the GPS coordinate the current /// image was taken. /// /// /// A with the latitude ranging from -90.0 /// to +90.0 degrees. /// public override double? Latitude { get { return null; } set {} } /// /// Gets or sets the longitude of the GPS coordinate the current /// image was taken. /// /// /// A with the longitude ranging from -180.0 /// to +180.0 degrees. /// public override double? Longitude { get { return null; } set {} } /// /// Gets or sets the altitude of the GPS coordinate the current /// image was taken. The unit is meter. /// /// /// A with the altitude. A positive value /// is above sea level, a negative one below sea level. The unit is meter. /// public override double? Altitude { get { return null; } set {} } /// /// Gets the exposure time the image, the current instance belongs /// to, was taken with. /// /// /// A with the exposure time in seconds. /// public override double? ExposureTime { get { return GetRationalNode (EXIF_NS, "ExposureTime"); } set { SetRationalNode (EXIF_NS, "ExposureTime", value.HasValue ? (double) value : 0); } } /// /// Gets the FNumber the image, the current instance belongs /// to, was taken with. /// /// /// A with the FNumber. /// /// /// Bibble wrongly tends to put this into tiff:FNumber so we /// use that as a fallback and correct it if needed. /// public override double? FNumber { get { return GetRationalNode (EXIF_NS, "FNumber") ?? GetRationalNode (TIFF_NS, "FNumber"); } set { SetTextNode (TIFF_NS, "FNumber", null); // Remove wrong value SetRationalNode (EXIF_NS, "FNumber", value.HasValue ? (double) value : 0); } } /// /// Gets the ISO speed the image, the current instance belongs /// to, was taken with. /// /// /// A with the ISO speed as defined in ISO 12232. /// /// /// Bibble writes ISOSpeedRating instead of ISOSpeedRatings. /// public override uint? ISOSpeedRatings { get { string[] values = GetCollectionNode (EXIF_NS, "ISOSpeedRatings"); if (values != null && values.Length > 0) { uint result; if (UInt32.TryParse (values[0], out result)) return result; } // Bibble fallback. return GetUIntNode (EXIF_NS, "ISOSpeedRating"); } set { SetCollectionNode (EXIF_NS, "ISOSpeedRating", null, XmpNodeType.Seq); SetCollectionNode (EXIF_NS, "ISOSpeedRatings", new string [] { value.ToString () }, XmpNodeType.Seq); } } /// /// Gets the focal length the image, the current instance belongs /// to, was taken with. /// /// /// A with the focal length in millimeters. /// public override double? FocalLength { get { return GetRationalNode (EXIF_NS, "FocalLength"); } set { SetRationalNode (EXIF_NS, "FocalLength", value.HasValue ? (double) value : 0); } } /// /// Gets the focal length the image, the current instance belongs /// to, was taken with, assuming a 35mm film camera. /// /// /// A with the focal length in 35mm equivalent in millimeters. /// public override uint? FocalLengthIn35mmFilm { get { return GetUIntNode (EXIF_NS, "FocalLengthIn35mmFilm"); } set { SetTextNode (EXIF_NS, "FocalLengthIn35mmFilm", value.HasValue ? value.Value.ToString () : String.Empty); } } /// /// Gets the manufacture of the recording equipment the image, the /// current instance belongs to, was taken with. /// /// /// A with the manufacture name. /// public override string Make { get { return GetTextNode (TIFF_NS, "Make"); } set { SetTextNode (TIFF_NS, "Make", value); } } /// /// Gets the model name of the recording equipment the image, the /// current instance belongs to, was taken with. /// /// /// A with the model name. /// public override string Model { get { return GetTextNode (TIFF_NS, "Model"); } set { SetTextNode (TIFF_NS, "Model", value); } } /// /// Gets or sets the creator of the image. /// /// /// A with the name of the creator. /// public override string Creator { get { string [] values = GetCollectionNode (DC_NS, "creator"); if (values != null && values.Length > 0) return values [0]; return null; } set { if (value == null) RemoveNode (DC_NS, "creator"); SetCollectionNode (DC_NS, "creator", new string [] { value }, XmpNodeType.Seq); } } /// /// Gets and sets the title for the media described by the /// current instance. /// /// /// A object containing the title for /// the media described by the current instance or if no value is present. /// public override string Title { get { return GetLangAltNode (DC_NS, "title"); } set { SetLangAltNode (DC_NS, "title", value); } } /// /// Gets and sets the copyright information for the media /// represented by the current instance. /// /// /// A object containing the copyright /// information for the media represented by the current /// instance or if no value present. /// public override string Copyright { get { return GetLangAltNode (DC_NS, "rights"); } set { SetLangAltNode (DC_NS, "rights", value); } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Xmp/XmlNodeExtensions.cs0000644000175000017500000000552611470571657025012 0ustar00rubenruben00000000000000// // XmlNodeExtensions.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2009 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using System.Xml; namespace TagLib.Xmp { internal static class XmlNodeExtensions { public static bool In (this XmlNode node, string ns) { return node.NamespaceURI == ns; } public static bool Is (this XmlNode node, string ns, string name) { return node.In (ns) && node.LocalName == name; } // 7.2.2 coreSyntaxTerms // rdf:RDF | rdf:ID | rdf:about | rdf:parseType | rdf:resource | rdf:nodeID | rdf:datatype public static bool IsCoreSyntax (this XmlNode node) { return node.In (XmpTag.RDF_NS) && ( node.LocalName == XmpTag.RDF_URI || node.LocalName == XmpTag.ID_URI || node.LocalName == XmpTag.ABOUT_URI || node.LocalName == XmpTag.PARSE_TYPE_URI || node.LocalName == XmpTag.RESOURCE_URI || node.LocalName == XmpTag.NODE_ID_URI || node.LocalName == XmpTag.DATA_TYPE_URI ); } // 7.2.4 oldTerms // rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID public static bool IsOld (this XmlNode node) { return node.In (XmpTag.RDF_NS) && ( node.LocalName == XmpTag.ABOUT_EACH_URI || node.LocalName == XmpTag.ABOUT_EACH_PREFIX_URI || node.LocalName == XmpTag.BAG_ID_URI ); } // 7.2.5 nodeElementURIs // anyURI - ( coreSyntaxTerms | rdf:li | oldTerms ) public static bool IsNodeElement (this XmlNode node) { return !node.IsCoreSyntax () && !node.Is (XmpTag.RDF_NS, XmpTag.LI_URI) && !node.IsOld (); } // 7.2.6 propertyElementURIs // anyURI - ( coreSyntaxTerms | rdf:Description | oldTerms ) public static bool IsPropertyElement (this XmlNode node) { return !node.IsCoreSyntax () && !node.Is (XmpTag.RDF_NS, XmpTag.DESCRIPTION_URI) && !node.IsOld (); } // 7.2.7 propertyAttributeURIs // anyURI - ( coreSyntaxTerms | rdf:Description | rdf:li | oldTerms ) public static bool IsPropertyAttribute (this XmlNode node) { return node is XmlAttribute && !node.IsCoreSyntax () && !node.Is (XmpTag.RDF_NS, XmpTag.DESCRIPTION_URI) && !node.Is (XmpTag.RDF_NS, XmpTag.LI_URI) && !node.IsOld (); } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/File.cs0000644000175000017500000016017211470571657021476 0ustar00rubenruben00000000000000// // File.cs: Provides a basic framework for reading from and writing to // a file, as well as accessing basic tagging and media properties. // // Author: // Brian Nickel (brian.nickel@gmail.com) // Aaron Bockover (abockover@novell.com) // // Original Source: // tfile.cpp from TagLib // // Copyright (C) 2005, 2007 Brian Nickel // Copyright (C) 2006 Novell, Inc. // Copyright (C) 2002,2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using System.Globalization; namespace TagLib { /// /// Specifies the level of intensity to use when reading the media /// properties. /// public enum ReadStyle { /// /// The media properties will not be read. /// None = 0, // Fast = 1, /// /// The media properties will be read with average accuracy. /// Average = 2, // Accurate = 3 } /// /// This abstract class provides a basic framework for reading from /// and writing to a file, as well as accessing basic tagging and /// media properties. /// /// /// This class is agnostic to all specific media types. Its /// child classes, on the other hand, support the the intricacies of /// different media and tagging formats. For example, supports the MPEG-4 specificication and /// Apple's tagging format. /// Each file type can be created using its format specific /// constructors, ie. , but the /// preferred method is to use or one of its /// variants, as it automatically detects the appropriate class from /// the file extension or provided mime-type. /// public abstract class File : IDisposable { #region Enums /// /// Specifies the type of file access operations currently /// permitted on an instance of . /// public enum AccessMode { /// /// Read operations can be performed. /// Read, /// /// Read and write operations can be performed. /// Write, /// /// The file is closed for both read and write /// operations. /// Closed } #endregion #region Delegates /// /// This delegate is used for intervening in by resolving the file type /// before any standard resolution operations. /// /// /// A object representing the /// file to be read. /// /// /// A object containing the mime-type /// of the file. /// /// /// A value specifying how to read /// media properties from the file. /// /// /// A new instance of or if the resolver could not match it. /// /// /// A is one way of /// altering the behavior of /// . /// When is called, the /// registered resolvers are invoked in the reverse order in /// which they were registered. The resolver may then perform /// any operations necessary, including other type-finding /// methods. /// If the resolver returns a new , /// it will instantly be returned, by . If it returns , will /// continue to process. If the resolver throws an exception /// it will be uncaught. /// To register a resolver, use . /// public delegate File FileTypeResolver (IFileAbstraction abstraction, string mimetype, ReadStyle style); #endregion #region Private Properties /// /// Contains the current stream used in reading/writing. /// private System.IO.Stream file_stream; /// /// Contains the internal file abstraction. /// private IFileAbstraction file_abstraction; /// /// Contains the mime-type of the file as provided by . /// private string mime_type; /// /// Contains the types of tags in the file on disk. /// private TagTypes tags_on_disk = TagTypes.None; /// /// Contains buffer size to use when reading. /// private static int buffer_size = 1024; /// /// Contains the file type resolvers to use in . /// private static List file_type_resolvers = new List (); /// /// Contains position at which the invariant data portion of /// the file begins. /// private long invariant_start_position = -1; /// /// Contains position at which the invariant data portion of /// the file ends. /// private long invariant_end_position = -1; /// /// The reasons (if any) why this file is marked as corrupt. /// private List corruption_reasons = null; #endregion #region Public Static Properties /// /// The buffer size to use when reading large blocks of data /// in the class. /// /// /// A containing the buffer size to use /// when reading large blocks of data. /// public static uint BufferSize { get {return (uint) buffer_size;} } #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// protected File (string path) { if (path == null) throw new ArgumentNullException ("path"); file_abstraction = new LocalFileAbstraction (path); } /// /// Constructs and initializes a new instance of for a specified file abstraction. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// protected File (IFileAbstraction abstraction) { if (abstraction == null) throw new ArgumentNullException ("abstraction"); file_abstraction = abstraction; } #endregion #region Public Properties /// /// Gets a abstract representation of all tags stored in the /// current instance. /// /// /// A object representing all tags /// stored in the current instance. /// /// /// This property provides generic and general access /// to the most common tagging features of a file. To access /// or add a specific type of tag in the file, use . /// public abstract Tag Tag {get;} /// /// Gets the media properties of the file represented by the /// current instance. /// /// /// A object containing the /// media properties of the file represented by the current /// instance. /// public abstract Properties Properties {get;} /// /// Gets the tag types contained in the physical file /// represented by the current instance. /// /// /// A bitwise combined value /// containing the tag types stored in the physical file as /// it was read or last saved. /// public TagTypes TagTypesOnDisk { get {return tags_on_disk;} protected set {tags_on_disk = value;} } /// /// Gets the tag types contained in the current instance. /// /// /// A bitwise combined value /// containing the tag types stored in the current instance. /// public TagTypes TagTypes { get {return Tag != null ? Tag.TagTypes : TagTypes.None;} } /// /// Gets the name of the file as stored in its file /// abstraction. /// /// /// A object containing the name of the /// file as stored in the /// object used to create it or the path if created with a /// local path. /// public string Name { get {return file_abstraction.Name;} } /// /// Gets the mime-type of the file as determined by if /// that method was used to create the current instance. /// /// /// A object containing the mime-type /// used to create the file or if was /// not used to create the current instance. /// public string MimeType { get {return mime_type;} internal set {mime_type = value;} } /// /// Gets the seek position in the internal stream used by the /// current instance. /// /// /// A value representing the seek /// position, or 0 if the file is not open for reading. /// public long Tell { get {return (Mode == AccessMode.Closed) ? 0 : file_stream.Position;} } /// /// Gets the length of the file represented by the current /// instance. /// /// /// A value representing the size of the /// file, or 0 if the file is not open for reading. /// public long Length { get {return (Mode == AccessMode.Closed) ? 0 : file_stream.Length;} } /// /// Gets the position at which the invariant portion of the /// current instance begins. /// /// /// A value representing the seek /// position at which the file's invariant (media) data /// section begins. If the value could not be determined, /// -1 is returned. /// public long InvariantStartPosition { get {return invariant_start_position;} protected set {invariant_start_position = value;} } /// /// Gets the position at which the invariant portion of the /// current instance ends. /// /// /// A value representing the seek /// position at which the file's invariant (media) data /// section ends. If the value could not be determined, /// -1 is returned. /// public long InvariantEndPosition { get {return invariant_end_position;} protected set {invariant_end_position = value;} } /// /// Gets and sets the file access mode in use by the current /// instance. /// /// /// A value describing the features /// of stream currently in use by the current instance. /// /// /// Changing the value will cause the stream currently in use /// to be closed, except when a change is made from to which has no effect. /// public AccessMode Mode { get {return (file_stream == null) ? AccessMode.Closed : (file_stream.CanWrite) ? AccessMode.Write : AccessMode.Read;} set { if (Mode == value || (Mode == AccessMode.Write && value == AccessMode.Read)) return; if (file_stream != null) file_abstraction.CloseStream (file_stream); file_stream = null; if (value == AccessMode.Read) file_stream = file_abstraction.ReadStream; else if (value == AccessMode.Write) file_stream = file_abstraction.WriteStream; Mode = value; } } /// /// Indicates if tags can be written back to the current file or not /// /// /// A which is true if tags can be written to the /// current file, otherwise false. /// public virtual bool Writeable { get { return !PossiblyCorrupt; } } /// /// Indicates whether or not this file may be corrupt. /// /// /// true if possibly corrupt; otherwise, false. /// /// /// Files with unknown corruptions should not be written. /// public bool PossiblyCorrupt { get { return corruption_reasons != null; } } /// /// The reasons for which this file is marked as corrupt. /// public IEnumerable CorruptionReasons { get { return corruption_reasons; } } #endregion #region Public Methods /// /// Mark the file as corrupt. /// /// /// The reason why this file is considered to be corrupt. /// internal void MarkAsCorrupt (string reason) { if (corruption_reasons == null) corruption_reasons = new List (); corruption_reasons.Add (reason); } /// /// Dispose the current file. Equivalent to setting the /// mode to closed /// public void Dispose () { Mode = AccessMode.Closed; } /// /// Saves the changes made in the current instance to the /// file it represents. /// public abstract void Save (); /// /// Removes a set of tag types from the current instance. /// /// /// A bitwise combined value /// containing tag types to be removed from the file. /// /// /// In order to remove all tags from a file, pass as . /// public abstract void RemoveTags (TagTypes types); /// /// Gets a tag of a specified type from the current instance, /// optionally creating a new tag if possible. /// /// /// A value indicating the /// type of tag to read. /// /// /// A value specifying whether or not to /// try and create the tag if one is not found. /// /// /// A object containing the tag that was /// found in or added to the current instance. If no /// matching tag was found and none was created, is returned. /// /// /// Passing to does not guarantee the tag will be /// created. For example, trying to create an ID3v2 tag on an /// OGG Vorbis file will always fail. /// It is safe to assume that if is not returned, the returned tag can be cast to the /// appropriate type. /// /// /// The following example sets the mood of a file to /// several tag types. /// string [] SetMoods (TagLib.File file, params string[] moods) ///{ /// TagLib.Id3v2.Tag id3 = file.GetTag (TagLib.TagTypes.Id3v2, true); /// if (id3 != null) /// id3.SetTextFrame ("TMOO", moods); /// /// TagLib.Asf.Tag asf = file.GetTag (TagLib.TagTypes.Asf, true); /// if (asf != null) /// asf.SetDescriptorStrings (moods, "WM/Mood", "Mood"); /// /// TagLib.Ape.Tag ape = file.GetTag (TagLib.TagTypes.Ape); /// if (ape != null) /// ape.SetValue ("MOOD", moods); /// /// // Whatever tag types you want... ///} /// public abstract Tag GetTag (TagTypes type, bool create); /// /// Gets a tag of a specified type from the current instance. /// /// /// A value indicating the /// type of tag to read. /// /// /// A object containing the tag that was /// found in the current instance. If no matching tag /// was found, is returned. /// /// /// This class merely accesses the tag if it exists. /// provides the option /// of adding the tag to the current instance if it does not /// exist. /// It is safe to assume that if is not returned, the returned tag can be cast to the /// appropriate type. /// /// /// The following example reads the mood of a file from /// several tag types. /// static string [] GetMoods (TagLib.File file) ///{ /// TagLib.Id3v2.Tag id3 = file.GetTag (TagLib.TagTypes.Id3v2); /// if (id3 != null) { /// TextIdentificationFrame f = TextIdentificationFrame.Get (this, "TMOO"); /// if (f != null) /// return f.FieldList.ToArray (); /// } /// /// TagLib.Asf.Tag asf = file.GetTag (TagLib.TagTypes.Asf); /// if (asf != null) { /// string [] value = asf.GetDescriptorStrings ("WM/Mood", "Mood"); /// if (value.Length > 0) /// return value; /// } /// /// TagLib.Ape.Tag ape = file.GetTag (TagLib.TagTypes.Ape); /// if (ape != null) { /// Item item = ape.GetItem ("MOOD"); /// if (item != null) /// return item.ToStringArray (); /// } /// /// // Whatever tag types you want... /// /// return new string [] {}; ///} /// public Tag GetTag (TagTypes type) { return GetTag (type, false); } /// /// Reads a specified number of bytes at the current seek /// position from the current instance. /// /// /// A value specifying the number of bytes /// to read. /// /// /// A object containing the data /// read from the current instance. /// /// /// This method reads the block of data at the current /// seek position. To change the seek position, use . /// /// /// is less than zero. /// public ByteVector ReadBlock (int length) { if (length < 0) throw new ArgumentException ( "Length must be non-negative", "length"); if (length == 0) return new ByteVector (); Mode = AccessMode.Read; byte [] buffer = new byte [length]; int count = file_stream.Read (buffer, 0, length); return new ByteVector (buffer, count); } /// /// Writes a block of data to the file represented by the /// current instance at the current seek position. /// /// /// A object containing data to be /// written to the current instance. /// /// /// This will overwrite any existing data at the seek /// position and append new data to the file if writing past /// the current end. /// /// /// is . /// public void WriteBlock (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); Mode = AccessMode.Write; file_stream.Write (data.Data, 0, data.Count); } /// /// Searches forwards through a file for a specified /// pattern, starting at a specified offset. /// /// /// A object containing a pattern /// to search for in the current instance. /// /// /// A value specifying at what /// seek position to start searching. /// /// /// A object specifying a pattern /// that the searched for pattern must appear before. If this /// pattern is found first, -1 is returned. /// /// /// A value containing the index at which /// the value was found. If not found, -1 is returned. /// /// /// is . /// public long Find (ByteVector pattern, long startPosition, ByteVector before) { if (pattern == null) throw new ArgumentNullException ("pattern"); Mode = AccessMode.Read; if (pattern.Count > buffer_size) return -1; // The position in the file that the current buffer // starts at. long buffer_offset = startPosition; ByteVector buffer; // These variables are used to keep track of a partial // match that happens at the end of a buffer. int previous_partial_match = -1; int before_previous_partial_match = -1; // Save the location of the current read pointer. We // will restore the position using Seek() before all // returns. long original_position = file_stream.Position; // Start the search at the offset. file_stream.Position = startPosition; // This loop is the crux of the find method. There are // three cases that we want to account for: // // (1) The previously searched buffer contained a // partial match of the search pattern and we want // to see if the next one starts with the remainder // of that pattern. // // (2) The search pattern is wholly contained within the // current buffer. // // (3) The current buffer ends with a partial match of // the pattern. We will note this for use in the // next iteration, where we will check for the rest // of the pattern. // // All three of these are done in two steps. First we // check for the pattern and do things appropriately if // a match (or partial match) is found. We then check // for "before". The order is important because it // gives priority to "real" matches. for (buffer = ReadBlock (buffer_size); buffer.Count > 0; buffer = ReadBlock(buffer_size)) { // (1) previous partial match if (previous_partial_match >= 0 && buffer_size > previous_partial_match) { int pattern_offset = buffer_size - previous_partial_match; if (buffer.ContainsAt (pattern, 0, pattern_offset)) { file_stream.Position = original_position; return buffer_offset - buffer_size + previous_partial_match; } } if (before != null && before_previous_partial_match >= 0 && buffer_size > before_previous_partial_match) { int before_offset = buffer_size - before_previous_partial_match; if (buffer.ContainsAt (before, 0, before_offset)) { file_stream.Position = original_position; return -1; } } // (2) pattern contained in current buffer long location = buffer.Find (pattern); if (location >= 0) { file_stream.Position = original_position; return buffer_offset + location; } if (before != null && buffer.Find (before) >= 0) { file_stream.Position = original_position; return -1; } // (3) partial match previous_partial_match = buffer.EndsWithPartialMatch (pattern); if (before != null) before_previous_partial_match = buffer.EndsWithPartialMatch ( before); buffer_offset += buffer_size; } // Since we hit the end of the file, reset the status // before continuing. file_stream.Position = original_position; return -1; } /// /// Searches forwards through a file for a specified /// pattern, starting at a specified offset. /// /// /// A object containing a pattern /// to search for in the current instance. /// /// /// A value specifying at what /// seek position to start searching. /// /// /// A value containing the index at which /// the value was found. If not found, -1 is returned. /// /// /// is . /// public long Find (ByteVector pattern, long startPosition) { return Find (pattern, startPosition, null); } /// /// Searches forwards through a file for a specified /// pattern, starting at the beginning of the file. /// /// /// A object containing a pattern /// to search for in the current instance. /// /// /// A value containing the index at which /// the value was found. If not found, -1 is returned. /// /// /// is . /// public long Find (ByteVector pattern) { return Find (pattern, 0); } /// /// Searches backwards through a file for a specified /// pattern, starting at a specified offset. /// /// /// A object containing a pattern /// to search for in the current instance. /// /// /// A value specifying at what /// seek position to start searching. /// /// /// A object specifying a pattern /// that the searched for pattern must appear after. If this /// pattern is found first, -1 is returned. /// /// /// A value containing the index at which /// the value was found. If not found, -1 is returned. /// /// /// Searching for is not yet /// implemented. /// /// /// is . /// long RFind (ByteVector pattern, long startPosition, ByteVector after) { if (pattern == null) throw new ArgumentNullException ("pattern"); Mode = AccessMode.Read; if (pattern.Count > buffer_size) return -1; // The position in the file that the current buffer // starts at. ByteVector buffer; // These variables are used to keep track of a partial // match that happens at the end of a buffer. /* int previous_partial_match = -1; int after_previous_partial_match = -1; */ // Save the location of the current read pointer. We // will restore the position using Seek() before all // returns. long original_position = file_stream.Position; // Start the search at the offset. long buffer_offset = Length - startPosition; int read_size = buffer_size; read_size = (int) Math.Min (buffer_offset, buffer_size); buffer_offset -= read_size; file_stream.Position = buffer_offset; // See the notes in find() for an explanation of this // algorithm. for (buffer = ReadBlock (read_size); buffer.Count > 0; buffer = ReadBlock (read_size)) { // TODO: (1) previous partial match // (2) pattern contained in current buffer long location = buffer.RFind (pattern); if (location >= 0) { file_stream.Position = original_position; return buffer_offset + location; } if(after != null && buffer.RFind (after) >= 0) { file_stream.Position = original_position; return -1; } // TODO: (3) partial match read_size = (int) Math.Min (buffer_offset, buffer_size); buffer_offset -= read_size; file_stream.Position = buffer_offset; } // Since we hit the end of the file, reset the status // before continuing. file_stream.Position = original_position; return -1; } /// /// Searches backwards through a file for a specified /// pattern, starting at a specified offset. /// /// /// A object containing a pattern /// to search for in the current instance. /// /// /// A value specifying at what /// seek position to start searching. /// /// /// A value containing the index at which /// the value was found. If not found, -1 is returned. /// /// /// is . /// public long RFind (ByteVector pattern, long startPosition) { return RFind (pattern, startPosition, null); } /// /// Searches backwards through a file for a specified /// pattern, starting at the end of the file. /// /// /// A object containing a pattern /// to search for in the current instance. /// /// /// A value containing the index at which /// the value was found. If not found, -1 is returned. /// /// /// is . /// public long RFind (ByteVector pattern) { return RFind (pattern, 0); } /// /// Inserts a specifed block of data into the file repesented /// by the current instance at a specified location, /// replacing a specified number of bytes. /// /// /// A object containing the data to /// insert into the file. /// /// /// A value specifying at which point to /// insert the data. /// /// /// A value specifying the number of /// bytes to replace. Typically this is the original size of /// the data block so that a new block will replace the old /// one. /// /// /// is . /// public void Insert (ByteVector data, long start, long replace) { if (data == null) throw new ArgumentNullException ("data"); Mode = AccessMode.Write; if (data.Count == replace) { file_stream.Position = start; WriteBlock (data); return; } else if(data.Count < replace) { file_stream.Position = start; WriteBlock (data); RemoveBlock (start + data.Count, replace - data.Count); return; } // Woohoo! Faster (about 20%) than id3lib at last. I // had to get hardcore and avoid TagLib's high level API // for rendering just copying parts of the file that // don't contain tag data. // // Now I'll explain the steps in this ugliness: // First, make sure that we're working with a buffer // that is longer than the *differnce* in the tag sizes. // We want to avoid overwriting parts that aren't yet in // memory, so this is necessary. int buffer_length = buffer_size; while (data.Count - replace > buffer_length) buffer_length += (int) BufferSize; // Set where to start the reading and writing. long read_position = start + replace; long write_position = start; byte [] buffer; byte [] about_to_overwrite; // This is basically a special case of the loop below. // Here we're just doing the same steps as below, but // since we aren't using the same buffer size -- instead // we're using the tag size -- this has to be handled as // a special case. We're also using File::writeBlock() // just for the tag. That's a bit slower than using char // *'s so, we're only doing it here. file_stream.Position = read_position; about_to_overwrite = ReadBlock (buffer_length).Data; read_position += buffer_length; file_stream.Position = write_position; WriteBlock (data); write_position += data.Count; buffer = new byte [about_to_overwrite.Length]; System.Array.Copy (about_to_overwrite, 0, buffer, 0, about_to_overwrite.Length); // Ok, here's the main loop. We want to loop until the // read fails, which means that we hit the end of the // file. while (buffer_length != 0) { // Seek to the current read position and read // the data that we're about to overwrite. // Appropriately increment the readPosition. file_stream.Position = read_position; int bytes_read = file_stream.Read ( about_to_overwrite, 0, buffer_length < about_to_overwrite.Length ? buffer_length : about_to_overwrite.Length); read_position += buffer_length; // Seek to the write position and write our // buffer. Increment the writePosition. file_stream.Position = write_position; file_stream.Write (buffer, 0, buffer_length < buffer.Length ? buffer_length : buffer.Length); write_position += buffer_length; // Make the current buffer the data that we read // in the beginning. System.Array.Copy (about_to_overwrite, 0, buffer, 0, bytes_read); // Again, we need this for the last write. We // don't want to write garbage at the end of our // file, so we need to set the buffer size to // the amount that we actually read. buffer_length = bytes_read; } } /// /// Inserts a specifed block of data into the file repesented /// by the current instance at a specified location. /// /// /// A object containing the data to /// insert into the file. /// /// /// A value specifying at which point to /// insert the data. /// /// /// This method inserts a new block of data into the file. To /// replace an existing block, ie. replacing an existing /// tag with a new one of different size, use . /// /// /// is . /// public void Insert (ByteVector data, long start) { Insert (data, start, 0); } /// /// Removes a specified block of data from the file /// represented by the current instance. /// /// /// A value specifying at which point to /// remove data. /// /// /// A value specifying the number of /// bytes to remove. /// public void RemoveBlock (long start, long length) { if (length <= 0) return; Mode = AccessMode.Write; int buffer_length = buffer_size; long read_position = start + length; long write_position = start; ByteVector buffer = (byte) 1; while(buffer.Count != 0) { file_stream.Position = read_position; buffer = ReadBlock (buffer_length); read_position += buffer.Count; file_stream.Position = write_position; WriteBlock (buffer); write_position += buffer.Count; } Truncate (write_position); } /// /// Seeks the read/write pointer to a specified offset in the /// current instance, relative to a specified origin. /// /// /// A value indicating the byte offset to /// seek to. /// /// /// A value specifying an /// origin to seek from. /// public void Seek (long offset, System.IO.SeekOrigin origin) { if (Mode != AccessMode.Closed) file_stream.Seek (offset, origin); } /// /// Seeks the read/write pointer to a specified offset in the /// current instance, relative to the beginning of the file. /// /// /// A value indicating the byte offset to /// seek to. /// public void Seek (long offset) { Seek (offset, System.IO.SeekOrigin.Begin); } #endregion #region Public Static Methods /// /// Creates a new instance of a subclass /// for a specified path, guessing the mime-type from the /// file's extension and using the average read style. /// /// /// A object specifying the file to /// read from and write to. /// /// /// A new instance of as read from the /// specified path. /// /// /// The file could not be read due to corruption. /// /// /// The file could not be read because the mime-type could /// not be resolved or the library does not support an /// internal feature of the file crucial to its reading. /// public static File Create (string path) { return Create(path, null, ReadStyle.Average); } /// /// Creates a new instance of a subclass /// for a specified file abstraction, guessing the mime-type /// from the file's extension and using the average read /// style. /// /// /// A object to use when /// reading to and writing from the current instance. /// /// /// A new instance of as read from the /// specified abstraction. /// /// /// The file could not be read due to corruption. /// /// /// The file could not be read because the mime-type could /// not be resolved or the library does not support an /// internal feature of the file crucial to its reading. /// public static File Create (IFileAbstraction abstraction) { return Create(abstraction, null, ReadStyle.Average); } /// /// Creates a new instance of a subclass /// for a specified path and read style, guessing the /// mime-type from the file's extension. /// /// /// A object specifying the file to /// read from and write to. /// /// /// A value specifying the level of /// detail to use when reading the media information from the /// new instance. /// /// /// A new instance of as read from the /// specified path. /// /// /// The file could not be read due to corruption. /// /// /// The file could not be read because the mime-type could /// not be resolved or the library does not support an /// internal feature of the file crucial to its reading. /// public static File Create (string path, ReadStyle propertiesStyle) { return Create(path, null, propertiesStyle); } /// /// Creates a new instance of a subclass /// for a specified file abstraction and read style, guessing /// the mime-type from the file's extension. /// /// /// A object to use when /// reading to and writing from the current instance. /// /// /// A value specifying the level of /// detail to use when reading the media information from the /// new instance. /// /// /// A new instance of as read from the /// specified abstraction. /// /// /// The file could not be read due to corruption. /// /// /// The file could not be read because the mime-type could /// not be resolved or the library does not support an /// internal feature of the file crucial to its reading. /// public static File Create (IFileAbstraction abstraction, ReadStyle propertiesStyle) { return Create(abstraction, null, propertiesStyle); } /// /// Creates a new instance of a subclass /// for a specified path, mime-type, and read style. /// /// /// A object specifying the file to /// read from and write to. /// /// /// A object containing the mime-type /// to use when selecting the appropriate class to use, or /// if the extension in is to be used. /// /// /// A value specifying the level of /// detail to use when reading the media information from the /// new instance. /// /// /// A new instance of as read from the /// specified path. /// /// /// The file could not be read due to corruption. /// /// /// The file could not be read because the mime-type could /// not be resolved or the library does not support an /// internal feature of the file crucial to its reading. /// public static File Create (string path, string mimetype, ReadStyle propertiesStyle) { return Create (new LocalFileAbstraction (path), mimetype, propertiesStyle); } /// /// Creates a new instance of a subclass /// for a specified file abstraction, mime-type, and read /// style. /// /// /// A object to use when /// reading to and writing from the current instance. /// /// /// A object containing the mime-type /// to use when selecting the appropriate class to use, or /// if the extension in is to be used. /// /// /// A value specifying the level of /// detail to use when reading the media information from the /// new instance. /// /// /// A new instance of as read from the /// specified abstraction. /// /// /// The file could not be read due to corruption. /// /// /// The file could not be read because the mime-type could /// not be resolved or the library does not support an /// internal feature of the file crucial to its reading. /// public static File Create (IFileAbstraction abstraction, string mimetype, ReadStyle propertiesStyle) { if(mimetype == null) { string ext = String.Empty; int index = abstraction.Name.LastIndexOf (".") + 1; if(index >= 1 && index < abstraction.Name.Length) ext = abstraction.Name.Substring (index, abstraction.Name.Length - index); mimetype = "taglib/" + ext.ToLower( CultureInfo.InvariantCulture); } foreach (FileTypeResolver resolver in file_type_resolvers) { File file = resolver(abstraction, mimetype, propertiesStyle); if(file != null) return file; } if (!FileTypes.AvailableTypes.ContainsKey(mimetype)) throw new UnsupportedFormatException ( String.Format ( CultureInfo.InvariantCulture, "{0} ({1})", abstraction.Name, mimetype)); Type file_type = FileTypes.AvailableTypes[mimetype]; try { File file = (File) Activator.CreateInstance( file_type, new object [] {abstraction, propertiesStyle}); file.MimeType = mimetype; return file; } catch (System.Reflection.TargetInvocationException e) { throw e.InnerException; } } /// /// Adds a to the class. The one added last gets run first. /// /// /// A delegate to add to the /// file type recognition stack. /// /// /// A adds support for /// recognizing a file type outside of the standard mime-type /// methods. /// public static void AddFileTypeResolver (FileTypeResolver resolver) { if (resolver != null) file_type_resolvers.Insert (0, resolver); } #endregion #region Protected Methods /// /// Resized the current instance to a specified number of /// bytes. /// /// /// A value specifying the number of /// bytes to resize the file to. /// protected void Truncate (long length) { AccessMode old_mode = Mode; Mode = AccessMode.Write; file_stream.SetLength (length); Mode = old_mode; } #endregion #region Classes /// /// This class implements /// to provide support for accessing the local/standard file /// system. /// /// /// This class is used as the standard file abstraction /// throughout the library. /// public class LocalFileAbstraction : IFileAbstraction { /// /// Contains the name used to open the file. /// private string name; /// /// Constructs and initializes a new instance of /// for a /// specified path in the local file system. /// /// /// A object containing the /// path of the file to use in the new instance. /// /// /// is . /// public LocalFileAbstraction (string path) { if (path == null) throw new ArgumentNullException ("path"); name = path; } /// /// Gets the path of the file represented by the /// current instance. /// /// /// A object containing the /// path of the file represented by the current /// instance. /// public string Name { get {return name;} } /// /// Gets a new readable, seekable stream from the /// file represented by the current instance. /// /// /// A new to be used /// when reading the file represented by the current /// instance. /// public System.IO.Stream ReadStream { get {return System.IO.File.Open (Name, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);} } /// /// Gets a new writable, seekable stream from the /// file represented by the current instance. /// /// /// A new to be used /// when writing to the file represented by the /// current instance. /// public System.IO.Stream WriteStream { get {return System.IO.File.Open (Name, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite);} } /// /// Closes a stream created by the current instance. /// /// /// A object /// created by the current instance. /// public void CloseStream (System.IO.Stream stream) { if (stream == null) throw new ArgumentNullException ("stream"); stream.Close (); } } #endregion #region Interfaces /// /// This interface provides abstracted access to a file. It // premits access to non-standard file systems and data /// retrieval methods. /// /// /// To use a custom abstraction, use instead of when creating files. /// /// /// The following example uses Gnome VFS to open a file /// and read its title. /// using TagLib; ///using Gnome.Vfs; /// ///public class ReadTitle ///{ /// public static void Main (string [] args) /// { /// if (args.Length != 1) /// return; /// /// Gnome.Vfs.Vfs.Initialize (); /// /// try { /// TagLib.File file = TagLib.File.Create ( /// new VfsFileAbstraction (args [0])); /// System.Console.WriteLine (file.Tag.Title); /// } finally { /// Vfs.Shutdown() /// } /// } ///} /// ///public class VfsFileAbstraction : TagLib.File.IFileAbstraction ///{ /// private string name; /// /// public VfsFileAbstraction (string file) /// { /// name = file; /// } /// /// public string Name { /// get { return name; } /// } /// /// public System.IO.Stream ReadStream { /// get { return new VfsStream(Name, System.IO.FileMode.Open); } /// } /// /// public System.IO.Stream WriteStream { /// get { return new VfsStream(Name, System.IO.FileMode.Open); } /// } /// /// public void CloseStream (System.IO.Stream stream) /// { /// stream.Close (); /// } ///} /// import TagLib from "taglib-sharp.dll" ///import Gnome.Vfs from "gnome-vfs-sharp" /// ///class VfsFileAbstraction (TagLib.File.IFileAbstraction): /// /// _name as string /// /// def constructor(file as string): /// _name = file /// /// Name: /// get: /// return _name /// /// ReadStream: /// get: /// return VfsStream(_name, FileMode.Open) /// /// WriteStream: /// get: /// return VfsStream(_name, FileMode.Open) /// ///if len(argv) == 1: /// Vfs.Initialize() /// /// try: /// file as TagLib.File = TagLib.File.Create (VfsFileAbstraction (argv[0])) /// print file.Tag.Title /// ensure: /// Vfs.Shutdown() /// public interface IFileAbstraction { /// /// Gets the name or identifier used by the /// implementation. /// /// /// A object containing the /// name or identifier used by the implementation. /// /// /// This value would typically represent a path or /// URL to be used when identifying the file in the /// file system, but it could be any value /// as appropriate for the implementation. /// string Name {get;} /// /// Gets a readable, seekable stream for the file /// referenced by the current instance. /// /// /// A object to be /// used when reading a file. /// /// /// This property is typically used when creating /// constructing an instance of . /// Upon completion of the constructor, will be called to close /// the stream. If the stream is to be reused after /// this point, should be /// implemented in a way to keep it open. /// System.IO.Stream ReadStream {get;} /// /// Gets a writable, seekable stream for the file /// referenced by the current instance. /// /// /// A object to be /// used when writing to a file. /// /// /// This property is typically used when saving a /// file with . Upon completion of /// the method, will be /// called to close the stream. If the stream is to /// be reused after this point, should be implemented in a /// way to keep it open. /// System.IO.Stream WriteStream {get;} /// /// Closes a stream originating from the current /// instance. /// /// /// A object /// originating from the current instance. /// /// /// If the stream is to be used outside of the scope, /// of TagLib#, this method should perform no action. /// For example, a stream that was created outside of /// the current instance, or a stream that will /// subsequently be used to play the file. /// void CloseStream (System.IO.Stream stream); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/FileTypes.cs0000644000175000017500000001105711470571657022520 0ustar00rubenruben00000000000000// // FileTypes.cs: Provides a mechanism for registering file classes and mime- // types, to be used when constructing a class via TagLib.File.Create. // // Author: // Aaron Bockover (abockover@novell.com) // // Copyright (C) 2006 Novell, Inc. // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib { /// /// This static class provides a mechanism for registering file /// classes and mime-types, to be used when constructing a class via /// . /// /// /// The default types built into the taglib-sharp.dll assembly /// are registered automatically when the class is initialized. To /// register your own custom types, use . /// /// public static class FileTypes { /// /// Contains a mapping between mime-types and the subclasses that support them. /// private static Dictionary file_types; /// /// Contains a static array of file types contained in the /// TagLib# assembly. /// /// /// A static Type array is used instead of getting types by /// reflecting the executing assembly as Assembly.GetTypes is /// very inefficient and leaks every type instance under /// Mono. Not reflecting taglib-sharp.dll saves about 120KB /// of heap. /// private static Type [] static_file_types = new Type [] { typeof(TagLib.Aac.File), typeof(TagLib.Aiff.File), typeof(TagLib.Ape.File), typeof(TagLib.Asf.File), typeof(TagLib.Flac.File), typeof(TagLib.Gif.File), typeof(TagLib.Image.NoMetadata.File), typeof(TagLib.Jpeg.File), typeof(TagLib.Mpeg4.File), typeof(TagLib.Mpeg.AudioFile), typeof(TagLib.Mpeg.File), typeof(TagLib.MusePack.File), typeof(TagLib.Ogg.File), typeof(TagLib.Png.File), typeof(TagLib.Riff.File), typeof(TagLib.Tiff.Arw.File), typeof(TagLib.Tiff.Cr2.File), typeof(TagLib.Tiff.Dng.File), typeof(TagLib.Tiff.File), typeof(TagLib.Tiff.Nef.File), typeof(TagLib.Tiff.Pef.File), typeof(TagLib.Tiff.Rw2.File), typeof(TagLib.WavPack.File) }; /// /// Constructs and initializes the /// class by registering the default types. /// static FileTypes () { Init(); } /// /// Initializes the class by registering the default types. /// internal static void Init () { if(file_types != null) return; file_types = new Dictionary(); foreach(Type type in static_file_types) Register (type); } /// /// Registers a subclass to be used when /// creating files via . /// /// /// A object for the class to register. /// /// /// In order to register mime-types, the class represented by /// should use the custom attribute. /// public static void Register (Type type) { Attribute [] attrs = Attribute.GetCustomAttributes (type, typeof(SupportedMimeType), false); if(attrs == null || attrs.Length == 0) return; foreach(SupportedMimeType attr in attrs) file_types.Add(attr.MimeType, type); } /// /// Gets a dictionary containing all the supported mime-types /// and file classes used by . /// /// /// A object containing the /// supported mime-types. /// public static IDictionary AvailableTypes { get {return file_types;} } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v1/0000777000175000017500000000000011503407420021132 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v1/Tag.cs0000644000175000017500000003232611462100402022170 0ustar00rubenruben00000000000000// // Tag.cs: Provide support for reading and writing ID3v1 tags. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // id3v1tag.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2002,2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections; using System; using System.Globalization; namespace TagLib.Id3v1 { /// /// This class extends to provide support for /// reading and writing tags stored in the ID3v1.1 format. /// public class Tag : TagLib.Tag { #region Private Static Fields private static StringHandler string_handler = new StringHandler (); #endregion #region Private Fields /// /// Contains the title. /// private string title; /// /// Contains the semicolon separated performers. /// private string artist; /// /// Contains the album name. /// private string album; /// /// Contains the 4 digit year. /// private string year; /// /// Contains a comment on track. /// private string comment; /// /// Contains the track number in the album. /// private byte track; /// /// Contains the genre index. /// private byte genre; #endregion #region Public Static Fields /// /// The size of a ID3v1 tag. /// public const uint Size = 128; /// /// The identifier used to recognize a ID3v1 tags. /// /// /// "TAG" /// public static readonly ReadOnlyByteVector FileIdentifier = "TAG"; #endregion #region Constructors /// /// Constructs and initializes a new instance of with no contents. /// public Tag () { Clear (); } /// /// Constructs and initializes a new instance of by reading the contents from a specified /// position in a specified file. /// /// /// A object containing the file from /// which the contents of the new instance is to be read. /// /// /// A value specify at what position to /// read the tag. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// /// /// The file does not contain /// at the given position. /// public Tag (File file, long position) { if (file == null) throw new ArgumentNullException ("file"); file.Mode = TagLib.File.AccessMode.Read; if (position < 0 || position > file.Length - Size) throw new ArgumentOutOfRangeException ( "position"); file.Seek (position); // read the tag -- always 128 bytes ByteVector data = file.ReadBlock ((int) Size); // some initial sanity checking if (!data.StartsWith (FileIdentifier)) throw new CorruptFileException ( "ID3v1 data does not start with identifier."); Parse (data); } /// /// Constructs and initializes a new instance of by reading the contents from a specified /// object. /// /// /// A object to read the tag from. /// /// /// is . /// /// /// is less than 128 bytes or does /// not start with . /// public Tag (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); if (data.Count < Size) throw new CorruptFileException ( "ID3v1 data is less than 128 bytes long."); if (!data.StartsWith (FileIdentifier)) throw new CorruptFileException ( "ID3v1 data does not start with identifier."); Parse (data); } #endregion #region Public Methods /// /// Renders the current instance as a raw ID3v1 tag. /// /// /// A object containing the /// rendered tag. /// public ByteVector Render () { ByteVector data = new ByteVector (); data.Add (FileIdentifier); data.Add (string_handler.Render (title ).Resize (30)); data.Add (string_handler.Render (artist ).Resize (30)); data.Add (string_handler.Render (album ).Resize (30)); data.Add (string_handler.Render (year ).Resize ( 4)); data.Add (string_handler.Render (comment).Resize (28)); data.Add ((byte) 0); data.Add (track); data.Add (genre); return data; } #endregion #region Public Static Properties /// /// Gets and sets the object /// to use when reading and writing ID3v1 fields. /// /// /// A object to use when /// processing fields. /// public static StringHandler DefaultStringHandler { get {return string_handler;} set {string_handler = value;} } #endregion #region Private Methods /// /// Populates the current instance by parsing the contents of /// a raw ID3v1 tag. /// /// /// A object containing the /// starting with an ID3v1 tag. /// private void Parse (ByteVector data) { title = string_handler.Parse (data.Mid ( 3, 30)); artist = string_handler.Parse (data.Mid (33, 30)); album = string_handler.Parse (data.Mid (63, 30)); year = string_handler.Parse (data.Mid (93, 4)); // Check for ID3v1.1 -- Note that ID3v1 *does not* // support "track zero" -- this is not a bug in TagLib. // Since a zeroed byte is what we would expect to // indicate the end of a C-String, specifically the // comment string, a value of zero must be assumed to be // just that. if (data [125] == 0 && data [126] != 0) { // ID3v1.1 detected comment = string_handler.Parse (data.Mid (97, 28)); track = data [126]; } else { comment = string_handler.Parse (data.Mid (97, 30)); } genre = data [127]; } #endregion #region TagLib.Tag /// /// Gets the tag types contained in the current instance. /// /// /// Always . /// public override TagTypes TagTypes { get {return TagTypes.Id3v1;} } /// /// Gets and sets the title for the media described by the /// current instance. /// /// /// A object containing the title for /// the media described by the current instance or if no value is present. /// /// /// When stored on disk, only the first 30 bytes of the /// Latin-1 encoded value will be stored. This may result in /// lost data. /// public override string Title { get { return string.IsNullOrEmpty (title) ? null : title; } set { title = value != null ? value.Trim () : String.Empty; } } /// /// Gets and sets the performers or artists who performed in /// the media described by the current instance. /// /// /// A containing the performers or /// artists who performed in the media described by the /// current instance or an empty array if no value is /// present. /// /// /// When stored on disk, only the first 30 bytes of the /// Latin-1 encoded value will be stored, minus a byte for /// each additionial performer (i.e. two performers will only /// have 29 bytes and three performers will only have 28 /// bytes).This may result in lost data. /// public override string [] Performers { get { return string.IsNullOrEmpty (artist) ? new string [0] : artist.Split (';'); } set { artist = value != null ? string.Join (";", value) : string.Empty; } } /// /// Gets and sets the album of the media represented by the /// current instance. /// /// /// A object containing the album of /// the media represented by the current instance or if no value is present. /// /// /// When stored on disk, only the first 30 bytes of the /// Latin-1 encoded value will be stored. This may result in /// lost data. /// public override string Album { get { return string.IsNullOrEmpty (album) ? null : album; } set { album = value != null ? value.Trim () : String.Empty; } } /// /// Gets and sets a user comment on the media represented by /// the current instance. /// /// /// A object containing user comments /// on the media represented by the current instance or if no value is present. /// /// /// When stored on disk, only the first 28 bytes of the /// Latin-1 encoded value will be stored. This may result in /// lost data. /// public override string Comment { get { return string.IsNullOrEmpty (comment) ? null : comment; } set { comment = value != null ? value.Trim () : String.Empty; } } /// /// Gets and sets the genres of the media represented by the /// current instance. /// /// /// A containing the genres of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// Only first genre will be stored and only if it is an /// exact match for a value appearing in . All other values will /// result in the property being cleared. /// public override string [] Genres { get { string genre_name = TagLib.Genres.IndexToAudio (genre); return (genre_name != null) ? new string [] {genre_name} : new string [0]; } set { genre = (value == null || value.Length == 0) ? (byte) 255 : TagLib.Genres.AudioToIndex ( value [0].Trim ()); } } /// /// Gets and sets the year that the media represented by the /// current instance was recorded. /// /// /// A containing the year that the media /// represented by the current instance was created or zero /// if no value is present. /// /// /// Only values between 1 and 9999 will be stored, all other /// values will result in the property being zeroed. /// public override uint Year { get { uint value; return uint.TryParse (year, NumberStyles.Integer, CultureInfo.InvariantCulture, out value) ? value : 0; } set { year = (value > 0 && value < 10000) ? value.ToString ( CultureInfo.InvariantCulture) : String.Empty; } } /// /// Gets and sets the position of the media represented by /// the current instance in its containing album. /// /// /// A containing the position of the /// media represented by the current instance in its /// containing album or zero if not specified. /// /// /// Only values between 1 and 255 will be stored, all other /// values will result in the property being zeroed. /// public override uint Track { get {return track;} set {track = (byte) (value < 256 ? value : 0);} } /// /// Clears the values stored in the current instance. /// public override void Clear () { title = artist = album = year = comment = null; track = 0; genre = 255; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v1/StringHandler.cs0000644000175000017500000000426711462100402024224 0ustar00rubenruben00000000000000// // StringHandler.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // id3v1tag.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2002,2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections; using System; namespace TagLib.Id3v1 { /// /// This class provides a mechanism for customizing how Id3v1 text /// is read and written. /// public class StringHandler { /// /// Converts raw ID3v1 text data to a /// object. /// /// /// A object containing raw Id3v1 /// text data. /// /// /// A object containing the converted /// text. /// public virtual string Parse (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); string output = data.ToString (StringType.Latin1).Trim (); int i = output.IndexOf ('\0'); return (i >= 0) ? output.Substring (0, i) : output; } /// /// Converts a object to raw ID3v1 text /// data. /// /// /// A object to convert. /// /// /// A containing the raw ID3v1 text /// data. /// public virtual ByteVector Render (string text) { return ByteVector.FromString (text, StringType.Latin1); } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Aiff/0000777000175000017500000000000011503407416021116 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Aiff/File.cs0000644000175000017500000003253311462100402022313 0ustar00rubenruben00000000000000// // File.cs: Provides tagging and properties support for Apple's AIFF // files. // // Author: // Helmut Wahrmann // // Copyright (C) 2009 Helmut Wahrmann // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using TagLib.Id3v2; namespace TagLib.Aiff { /// /// This class extends to provide /// support for reading and writing tags and properties for files /// using the AIFF file format. /// [SupportedMimeType("taglib/aif", "aif")] [SupportedMimeType("audio/x-aiff")] [SupportedMimeType("audio/aiff")] [SupportedMimeType("sound/aiff")] [SupportedMimeType("application/x-aiff")] public class File : TagLib.File { #region Private Fields /// /// Contains the address of the AIFF header block. /// private ByteVector header_block = null; /// /// Contains the Id3v2 tag. /// private Id3v2.Tag tag = null; /// /// Contains the media properties. /// private Properties properties = null; #endregion #region Public Static Fields /// /// The identifier used to recognize a AIFF files. /// /// /// "FORM" /// public static readonly ReadOnlyByteVector FileIdentifier = "FORM"; /// /// The identifier used to recognize a AIFF Common chunk. /// /// /// "COMM" /// public static readonly ReadOnlyByteVector CommIdentifier = "COMM"; /// /// The identifier used to recognize a AIFF Sound Data Chunk. /// /// /// "SSND" /// public static readonly ReadOnlyByteVector SoundIdentifier = "SSND"; /// /// The identifier used to recognize a AIFF ID3 chunk. /// /// /// "ID3 " /// public static readonly ReadOnlyByteVector ID3Identifier = "ID3 "; #endregion #region Public Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File(string path, ReadStyle propertiesStyle) : this(new File.LocalFileAbstraction(path), propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system with an average read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File(string path) : this(path, ReadStyle.Average) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File(File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base(abstraction) { Mode = AccessMode.Read; try { uint aiff_size; long tag_start, tag_end; Read(true, propertiesStyle, out aiff_size, out tag_start, out tag_end); } finally { Mode = AccessMode.Closed; } TagTypesOnDisk = TagTypes; GetTag(TagTypes.Id3v2, true); } /// /// Constructs and initializes a new instance of for a specified file abstraction with an /// average read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// public File(File.IFileAbstraction abstraction) : this(abstraction, ReadStyle.Average) { } #endregion #region Public Properties /// /// Gets a abstract representation of all tags stored in the /// current instance. /// /// /// A object representing all tags /// stored in the current instance. /// public override Tag Tag { get { return tag; } } /// /// Gets the media properties of the file represented by the /// current instance. /// /// /// A object containing the /// media properties of the file represented by the current /// instance. /// public override TagLib.Properties Properties { get { return properties; } } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save() { Mode = AccessMode.Write; try { ByteVector data = new ByteVector(); // Add the ID3 chunk and ID32 tag to the vector if (tag != null) { ByteVector tag_data = tag.Render(); if (tag_data.Count > 10) { if (tag_data.Count%2 == 1) tag_data.Add(0); data.Add("ID3 "); data.Add(ByteVector.FromUInt( (uint) tag_data.Count, true)); data.Add(tag_data); } } // Read the file to determine the current AIFF // size and the area tagging is in. uint aiff_size; long tag_start, tag_end; Read(false, ReadStyle.None, out aiff_size, out tag_start, out tag_end); // If tagging info cannot be found, place it at // the end of the file. if (tag_start < 12 || tag_end < tag_start) tag_start = tag_end = Length; int length = (int) (tag_end - tag_start + 8); // Insert the tagging data. Insert(data, tag_start, length); // If the data size changed update the aiff size. if (data.Count - length != 0 && tag_start <= aiff_size) { // Depending, if a Tag has been added or removed, // the length needs to be adjusted if (tag == null) { length -= 16; } else { length -= 8; } Insert(ByteVector.FromUInt((uint) (aiff_size + data.Count - length), true), 4, 4); } // Update the tag types. TagTypesOnDisk = TagTypes; } finally { Mode = AccessMode.Closed; } } /// /// Removes a set of tag types from the current instance. /// /// /// A bitwise combined value /// containing tag types to be removed from the file. /// /// /// In order to remove all tags from a file, pass as . /// public override void RemoveTags(TagTypes types) { if (types == TagLib.TagTypes.Id3v2 || types == TagLib.TagTypes.AllTags) { tag = null; } } /// /// Gets a tag of a specified type from the current instance, /// optionally creating a new tag if possible. /// /// /// A value indicating the /// type of tag to read. /// /// /// A value specifying whether or not to /// try and create the tag if one is not found. /// /// /// A object containing the tag that was /// found in or added to the current instance. If no /// matching tag was found and none was created, is returned. /// public override TagLib.Tag GetTag(TagTypes type, bool create) { TagLib.Tag id32_tag = null; switch (type) { case TagTypes.Id3v2: if (tag == null && create) { tag = new Id3v2.Tag(); tag.Version = 2; } id32_tag = tag; break; } return id32_tag; } #endregion #region Private Methods /// /// Reads the contents of the current instance determining /// the size of the riff data, the area the tagging is in, /// and optionally reading in the tags and media properties. /// /// /// If , any tags found will be read /// into the current instance. /// /// /// A value specifying how the media /// data is to be read into the current instance. /// /// /// A value reference to be filled with /// the size of the RIFF data as read from the file. /// /// /// A value reference to be filled with /// the absolute seek position at which the tagging data /// starts. /// /// /// A value reference to be filled with /// the absolute seek position at which the tagging data /// ends. /// /// /// The file does not begin with . /// private void Read(bool read_tags, ReadStyle style, out uint aiff_size, out long tag_start, out long tag_end) { Seek(0); if (ReadBlock(4) != FileIdentifier) throw new CorruptFileException( "File does not begin with AIFF identifier"); aiff_size = ReadBlock(4).ToUInt(true); tag_start = -1; tag_end = -1; // Get the properties of the file if (header_block == null && style != ReadStyle.None) { long common_chunk_pos = Find(CommIdentifier, 0); if (common_chunk_pos == -1) { throw new CorruptFileException( "No Common chunk available in AIFF file."); } Seek(common_chunk_pos); header_block = ReadBlock((int) StreamHeader.Size); StreamHeader header = new StreamHeader(header_block, aiff_size); properties = new Properties(TimeSpan.Zero, header); } // Now we search for the ID3 chunk. // Normally it appears after the Sound data chunk. But as the order of // chunks is free, it might be the case that the ID3 chunk appears before // the sound data chunk. // So we search first for the Sound data chunk and see, if an ID3 chunk appears before long id3_chunk_pos = -1; long sound_chunk_pos = Find(SoundIdentifier, 0, ID3Identifier); if (sound_chunk_pos == -1) { // The ID3 chunk appears before the Sound chunk id3_chunk_pos = Find(ID3Identifier, 0); } // Now let's look for the Sound chunk again // Since a previous return value of -1 does mean, that the ID3 chunk was found first sound_chunk_pos = Find(SoundIdentifier, 0); if (sound_chunk_pos == -1) { throw new CorruptFileException( "No Sound chunk available in AIFF file."); } // Get the length of the Sound chunk and use this as a start value to look for the ID3 chunk Seek(sound_chunk_pos + 4); ulong sound_chunk_length = ReadBlock(4).ToULong(true); long start_search_pos = (long) sound_chunk_length + sound_chunk_pos + 4; if (id3_chunk_pos == -1) { id3_chunk_pos = Find(ID3Identifier, start_search_pos); } if (id3_chunk_pos > -1) { if (read_tags && tag == null) { tag = new Id3v2.Tag(this, id3_chunk_pos + 8); } // Get the length of the tag out of the ID3 chunk Seek(id3_chunk_pos + 4); uint tag_size = ReadBlock(4).ToUInt(true) + 8; tag_start = InvariantStartPosition = id3_chunk_pos; tag_end = InvariantEndPosition = tag_start + tag_size; } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Aiff/StreamHeader.cs0000644000175000017500000002015611462100402023776 0ustar00rubenruben00000000000000// // StreamHeader.cs: Provides support for reading Apple's AIFF stream // properties. // // Author: // Helmut Wahrmann // // Copyright (C) 2009 Helmut Wahrmann // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Globalization; namespace TagLib.Aiff { /// /// This struct implements to provide /// support for reading Apple's AIFF stream properties. /// public struct StreamHeader : IAudioCodec, ILosslessAudioCodec { #region Private Fields /// /// Contains the number of channels. /// /// /// This value is stored in bytes (9,10). /// 1 is monophonic, 2 is stereo, 4 means 4 channels, etc.. /// any number of audio channels may be represented /// private ushort channels; /// /// Contains the number of sample frames in the Sound Data chunk. /// /// /// This value is stored in bytes (11-14). /// private ulong total_frames; /// /// Contains the number of bits per sample. /// /// /// This value is stored in bytes (15,16). /// It can be any number from 1 to 32. /// private ushort bits_per_sample; /// /// Contains the sample rate. /// /// /// This value is stored in bytes (17-26). /// the sample rate at which the sound is to be played back, /// in sample frames per second /// private ulong sample_rate; /// /// Contains the length of the audio stream. /// /// /// This value is provided by the constructor. /// private long stream_length; #endregion #region Public Static Fields /// /// The size of an AIFF Common chunk /// public const uint Size = 26; /// /// The identifier used to recognize a AIFF file. /// Altough an AIFF file start with "FORM2, we're interested /// in the Common chunk only, which contains the properties we need. /// /// /// "COMM" /// public static readonly ReadOnlyByteVector FileIdentifier = "COMM"; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified header block and /// stream length. /// /// /// A object containing the stream /// header data. /// /// /// A value containing the length of the /// AIFF Audio stream in bytes. /// /// /// is . /// /// /// does not begin with /// public StreamHeader(ByteVector data, long streamLength) { if (data == null) throw new ArgumentNullException("data"); if (!data.StartsWith(FileIdentifier)) throw new CorruptFileException( "Data does not begin with identifier."); stream_length = streamLength; // The first 8 bytes contain the Common chunk identifier "COMM" // And the size of the common chunk, which is always 18 channels = data.Mid(8, 2).ToUShort(true); total_frames = data.Mid(10, 4).ToULong(true); bits_per_sample = data.Mid(14, 2).ToUShort(true); ByteVector sample_rate_indicator = data.Mid(17, 1); ulong sample_rate_tmp = data.Mid(18, 2).ToULong(true); sample_rate = 44100; // Set 44100 as default sample rate // The following are combinations that iTunes 8 encodes to. // There may be other combinations in the field, but i couldn't test them. switch (sample_rate_tmp) { case 44100: if (sample_rate_indicator == 0x0E) { sample_rate = 44100; } else if (sample_rate_indicator == 0x0D) { sample_rate = 22050; } else if (sample_rate_indicator == 0x0C) { sample_rate = 11025; } break; case 48000: if (sample_rate_indicator == 0x0E) { sample_rate = 48000; } else if (sample_rate_indicator == 0x0D) { sample_rate = 24000; } break; case 64000: if (sample_rate_indicator == 0x0D) { sample_rate = 32000; } else if (sample_rate_indicator == 0x0C) { sample_rate = 16000; } else if (sample_rate_indicator == 0x0B) { sample_rate = 8000; } break; case 44510: if (sample_rate_indicator == 0x0D) { sample_rate = 22255; } break; case 44508: if (sample_rate_indicator == 0x0C) { sample_rate = 11127; } break; } } #endregion #region Public Properties /// /// Gets the duration of the media represented by the current /// instance. /// /// /// A containing the duration of the /// media represented by the current instance. /// public TimeSpan Duration { get { if (sample_rate <= 0 || total_frames <= 0) return TimeSpan.Zero; return TimeSpan.FromSeconds( (double) total_frames/ (double) sample_rate); } } /// /// Gets the types of media represented by the current /// instance. /// /// /// Always . /// public MediaTypes MediaTypes { get { return MediaTypes.Audio; } } /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public string Description { get { return "AIFF Audio"; } } /// /// Gets the bitrate of the audio represented by the current /// instance. /// /// /// A value containing a bitrate of the /// audio represented by the current instance. /// public int AudioBitrate { get { TimeSpan d = Duration; if (d <= TimeSpan.Zero) return 0; return (int) ((stream_length*8L)/ d.TotalSeconds)/1000; } } /// /// Gets the sample rate of the audio represented by the /// current instance. /// /// /// A value containing the sample rate of /// the audio represented by the current instance. /// public int AudioSampleRate { get { return (int) sample_rate; } } /// /// Gets the number of channels in the audio represented by /// the current instance. /// /// /// A value containing the number of /// channels in the audio represented by the current /// instance. /// public int AudioChannels { get { return channels; } } /// /// Gets the number of bits per sample in the audio /// represented by the current instance. /// /// /// A value containing the number of bits /// per sample in the audio represented by the current /// instance. /// public int BitsPerSample { get { return bits_per_sample; } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/0000777000175000017500000000000011503407420021133 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Frame.cs0000644000175000017500000003665111462100402022515 0ustar00rubenruben00000000000000// // Frame.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // id3v2frame.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2002,2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Id3v2 { /// /// This abstract class provides a basic framework for representing /// ID3v2.4 frames. /// public abstract class Frame : ICloneable { #region Private Fields /// /// Contains the frame's header. /// private FrameHeader header; /// /// Contains the frame's grouping ID. /// private byte group_id; /// /// Contains the frame's encryption ID. /// private byte encryption_id; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading the raw header encoded in the /// specified ID3v2 version. /// /// /// A object containing the /// identifier or header data to use for the new instance. /// /// /// A value indicating the ID3v2 version /// which is encoded in. /// /// /// is . /// /// /// does not contain a complete /// identifier. /// protected Frame (ByteVector data, byte version) { if (data == null) throw new ArgumentNullException ("data"); if (data.Count < ((version < 3) ? 3 : 4)) throw new ArgumentException ( "Data contains an incomplete identifier.", "data"); header = new FrameHeader (data, version); } /// /// Constructs and initializes a new instance of with a specified header. /// /// /// A value containing the header /// to use for the new instance. /// protected Frame (FrameHeader header) { this.header = header; } #endregion #region Public Properties /// /// Gets the frame ID for the current instance. /// /// /// A object containing the /// four-byte ID3v2.4 frame header for the current instance. /// public ReadOnlyByteVector FrameId { get {return header.FrameId;} } /// /// Gets the size of the current instance as it was last /// stored on disk. /// /// /// A value containing the size of the /// current instance as it was last stored on disk. /// public uint Size { get {return header.FrameSize;} } /// /// Gets and sets the frame flags applied to the current /// instance. /// /// /// A bitwise combined value /// containing the frame flags applied to the current /// instance. /// /// /// If the value includes either or , /// will throw a . /// public FrameFlags Flags { get {return header.Flags;} set {header.Flags = value;} } /// /// Gets and sets the grouping ID applied to the current /// instance. /// /// /// A value containing the grouping /// identifier for the current instance, or -1 if not set. /// /// /// Grouping identifiers can be between 0 and 255. Setting /// any other value will unset the grouping identity and set /// the value to -1. /// public short GroupId { get { return (Flags & FrameFlags.GroupingIdentity) != 0 ? group_id : (short) -1; } set { if (value >= 0x00 && value <= 0xFF) { group_id = (byte) value; Flags |= FrameFlags.GroupingIdentity; } else { Flags &= ~FrameFlags.GroupingIdentity; } } } /// /// Gets and sets the encryption ID applied to the current /// instance. /// /// /// A value containing the encryption /// identifier for the current instance, or -1 if not set. /// /// /// Encryption identifiers can be between 0 and 255. /// Setting any other value will unset the grouping identity /// and set the value to -1. /// If set, will throw a . /// public short EncryptionId { get { return (Flags & FrameFlags.Encryption) != 0 ? encryption_id : (short) -1; } set { if (value >= 0x00 && value <= 0xFF) { encryption_id = (byte) value; Flags |= FrameFlags.Encryption; } else { Flags &= ~FrameFlags.Encryption; } } } #endregion #region Public Methods /// /// Renders the current instance, encoded in a specified /// ID3v2 version. /// /// /// A value specifying the version of /// ID3v2 to use when encoding the current instance. /// /// /// A object containing the /// rendered version of the current instance. /// /// /// The current instance uses some feature that cannot be /// implemented in the specified ID3v2 version, or uses a /// feature, such as encryption or compression, which is not /// yet implemented in the library. /// public virtual ByteVector Render (byte version) { // Remove flags that are not supported by older versions // of ID3v2. if (version < 4) Flags &= ~(FrameFlags.DataLengthIndicator | FrameFlags.Unsynchronisation); if (version < 3) Flags &= ~(FrameFlags.Compression | FrameFlags.Encryption | FrameFlags.FileAlterPreservation | FrameFlags.GroupingIdentity | FrameFlags.ReadOnly | FrameFlags.TagAlterPreservation); ByteVector field_data = RenderFields (version); // If we don't have any content, don't render anything. // This will cause the frame to not be rendered. if (field_data.Count == 0) return new ByteVector (); ByteVector front_data = new ByteVector (); if ((Flags & (FrameFlags.Compression | FrameFlags.DataLengthIndicator)) != 0) front_data.Add (ByteVector.FromUInt ((uint) field_data.Count)); if ((Flags & FrameFlags.GroupingIdentity) != 0) front_data.Add (group_id); if ((Flags & FrameFlags.Encryption) != 0) front_data.Add (encryption_id); // FIXME: Implement compression. if ((Flags & FrameFlags.Compression) != 0) throw new NotImplementedException ( "Compression not yet supported"); // FIXME: Implement encryption. if ((Flags & FrameFlags.Encryption) != 0) throw new NotImplementedException ( "Encryption not yet supported"); if ((Flags & FrameFlags.Unsynchronisation) != 0) SynchData.UnsynchByteVector (field_data); if (front_data.Count > 0) field_data.Insert (0, front_data); header.FrameSize = (uint) field_data.Count; ByteVector header_data = header.Render (version); header_data.Add (field_data); return header_data; } #endregion #region Public Static Methods /// /// Gets the text delimiter for a specified encoding. /// /// /// A value specifying the encoding /// to get the delimiter for. /// /// /// A object containing the /// delimiter for the specified encoding. /// [Obsolete("Use ByteVector.TextDelimiter.")] public static ByteVector TextDelimiter (StringType type) { return ByteVector.TextDelimiter (type); } #endregion #region Protected Methods /// /// Converts an encoding to be a supported encoding for a /// specified tag version. /// /// /// A value containing the original /// encoding. /// /// /// A value containing the ID3v2 version /// to be encoded for. /// /// /// A value containing the correct /// encoding to use, based on and what is supported /// by . /// protected static StringType CorrectEncoding (StringType type, byte version) { if (Tag.ForceDefaultEncoding) type = Tag.DefaultEncoding; return (version < 4 && type == StringType.UTF8) ? StringType.UTF16 : type; } /// /// Populates the current instance by reading the raw frame /// from disk, optionally reading the header. /// /// /// A object containing the raw /// ID3v2 frame. /// /// /// A value containing the offset in /// at which the frame begins. /// /// /// A value containing the ID3v2 version /// of the raw frame contained in . /// /// /// A value indicating whether or not to /// read the header into current instance. /// protected void SetData (ByteVector data, int offset, byte version, bool readHeader) { if (readHeader) header = new FrameHeader (data, version); ParseFields (FieldData (data, offset, version), version); } /// /// Populates the values in the current instance by parsing /// its field data in a specified version. /// /// /// A object containing the /// extracted field data. /// /// /// A indicating the ID3v2 version the /// field data is encoded in. /// protected abstract void ParseFields (ByteVector data, byte version); /// /// Renders the values in the current instance into field /// data for a specified version. /// /// /// A indicating the ID3v2 version the /// field data is to be encoded in. /// /// /// A object containing the /// rendered field data. /// protected abstract ByteVector RenderFields (byte version); /// /// Extracts the field data from the raw data portion of an /// ID3v2 frame. /// /// /// A object containing fraw frame /// data. /// /// /// A value containing the index at which /// the data is contained. /// /// /// A value containing the ID3v2 version /// of the data. /// /// /// A object containing the /// extracted field data. /// /// /// This method is necessary for extracting extra data /// prepended to the frame such as the grouping ID. /// /// /// is . /// protected ByteVector FieldData (ByteVector frameData, int offset, byte version) { if (frameData == null) throw new ArgumentNullException ("frameData"); int data_offset = offset + (int) FrameHeader.Size (version); int data_length = (int) Size; if ((Flags & (FrameFlags.Compression | FrameFlags.DataLengthIndicator)) != 0) { data_offset += 4; data_length -= 4; } if ((Flags & FrameFlags.GroupingIdentity) != 0) { if (frameData.Count >= data_offset) throw new TagLib.CorruptFileException ( "Frame data incomplete."); group_id = frameData [data_offset++]; data_length--; } if ((Flags & FrameFlags.Encryption) != 0) { if (frameData.Count >= data_offset) throw new TagLib.CorruptFileException ( "Frame data incomplete."); encryption_id = frameData [data_offset++]; data_length--; } data_length = Math.Min (data_length, frameData.Count - data_offset); if (data_length < 0 ) throw new CorruptFileException ( "Frame size less than zero."); ByteVector data = frameData.Mid (data_offset, data_length); if ((Flags & FrameFlags.Unsynchronisation) != 0) { int before_length = data.Count; SynchData.ResynchByteVector (data); data_length -= (data.Count - before_length); } // FIXME: Implement encryption. if ((Flags & FrameFlags.Encryption) != 0) throw new NotImplementedException (); // FIXME: Implement compression. if ((Flags & FrameFlags.Compression) != 0) throw new NotImplementedException (); /* if(d->header->compression()) { ByteVector data(frameDataLength); uLongf uLongTmp = frameDataLength; ::uncompress((Bytef *) data.data(), (uLongf *) &uLongTmp, (Bytef *) frameData.data() + frameDataOffset, size()); return data; } */ return data; } #endregion #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to the /// current instance. /// /// /// This method is implemented by rendering the current /// instance as an ID3v2.4 frame and using to create a new /// frame. As such, this method should be overridden by /// child classes. /// public virtual Frame Clone () { int index = 0; return FrameFactory.CreateFrame (Render (4), ref index, 4, false); } object ICloneable.Clone () { return Clone (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Frames/0000777000175000017500000000000011503407420022350 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Frames/SynchronizedLyricsFrame.cs0000644000175000017500000005105611462100402027514 0ustar00rubenruben00000000000000// // SynchronizedLyricsFrame.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using System.Text; namespace TagLib.Id3v2 { /// /// Specifies the timestamp format used by a . /// public enum TimestampFormat { /// /// The timestamp is of unknown format. /// Unknown = 0x00, /// /// The timestamp represents the number of MPEG frames since /// the beginning of the audio stream. /// AbsoluteMpegFrames = 0x01, /// /// The timestamp represents the number of milliseconds since /// the beginning of the audio stream. /// AbsoluteMilliseconds = 0x02 } /// /// Specifies the type of text contained in a . /// public enum SynchedTextType { /// /// The text is some other type of text. /// Other = 0x00, /// /// The text contains lyrical data. /// Lyrics = 0x01, /// /// The text contains a transcription. /// TextTranscription = 0x02, /// /// The text lists the movements in the piece. /// Movement = 0x03, /// /// The text describes events that occur. /// Events = 0x04, /// /// The text contains chord changes that occur in the music. /// Chord = 0x05, /// /// The text contains trivia or "pop up" information about /// the media. /// Trivia = 0x06, /// /// The text contains URL's for relevant webpages. /// WebpageUrls = 0x07, /// /// The text contains URL's for relevant images. /// ImageUrls = 0x08 } /// /// This class extends , implementing support for /// ID3v2 Synchronised Lyrics and Text (SYLT) Frames. /// public class SynchronisedLyricsFrame : Frame { #region Private Properties /// /// Contains the text encoding to use when rendering the /// current instance. /// private StringType encoding = Tag.DefaultEncoding; /// /// Contains the ISO-639-2 language code. /// private string language = null; /// /// Contains the description. /// private string description = null; /// /// Contains the timestamp format. /// private TimestampFormat timestamp_format = TimestampFormat.Unknown; /// /// Contains the text type. /// private SynchedTextType lyrics_type = SynchedTextType.Other; /// /// Contains the text. /// private SynchedText [] text = new SynchedText [0]; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a specified /// description, ISO-639-2 language code, text type, and text /// encoding. /// /// /// A object containing the description /// of the new instnace. /// /// /// A object containing the ISO-639-2 /// language code of the new instance. /// /// /// A containing the type of /// text to be stored in the new instance. /// /// /// A containing the text encoding /// to use when rendering the new instance. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more /// integrated frame creation. /// public SynchronisedLyricsFrame (string description, string language, SynchedTextType type, StringType encoding) : base (FrameType.SYLT, 4) { this.encoding = encoding; this.language = language; this.description = description; this.lyrics_type = type; } /// /// Constructs and initializes a new instance of with a specified /// description, ISO-639-2 language code, and text type. /// /// /// A object containing the description /// of the new instnace. /// /// /// A object containing the ISO-639-2 /// language code of the new instance. /// /// /// A containing the type of /// text to be stored in the new instance. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more /// integrated frame creation. /// public SynchronisedLyricsFrame (string description, string language, SynchedTextType type) : this (description, language, type, TagLib.Id3v2.Tag.DefaultEncoding) { } /// /// Constructs and initializes a new instance of by reading its raw data /// in a specified ID3v2 version. /// /// /// A object starting with the raw /// representation of the new instance. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// public SynchronisedLyricsFrame (ByteVector data, byte version) : base(data, version) { SetData (data, 0, version, true); } /// /// Constructs and initializes a new instance of by reading its raw data /// in a specified ID3v2 version. /// /// /// A object containing the raw /// representation of the new instance. /// /// /// A indicating at what offset in /// the frame actually begins. /// /// /// A containing the header of the /// frame found at in the data. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// protected internal SynchronisedLyricsFrame (ByteVector data, int offset, FrameHeader header, byte version) : base (header) { SetData (data, offset, version, false); } #endregion #region Public Properties /// /// Gets and sets the text encoding to use when storing the /// current instance. /// /// /// A containing the text encoding to /// use when storing the current instance. /// /// /// This encoding is overridden when rendering if is or the render version does not support /// it. /// public StringType TextEncoding { get {return encoding;} set {encoding = value;} } /// /// Gets and sets the ISO-639-2 language code stored in the /// current instance. /// /// /// A containing the ISO-639-2 language /// code stored in the current instance. /// /// /// There should only be one frame with a matching /// description, type, and ISO-639-2 language code per tag. /// public string Language { get { return (language != null && language.Length > 2) ? language.Substring (0, 3) : "XXX"; } set {language = value;} } /// /// Gets and sets the description stored in the current /// instance. /// /// /// A containing the description /// stored in the current instance. /// /// /// There should only be one frame with a matching /// description, type, and ISO-639-2 language code per tag. /// public string Description { get {return description;} set {description = value;} } /// /// Gets and sets the timestamp format used by the current /// instance. /// /// /// A value describing the /// timestamp format used by the current instance. /// public TimestampFormat Format { get {return timestamp_format;} set {timestamp_format = value;} } /// /// Gets and sets the type of text contained in the current /// instance. /// /// /// A value describing the /// type of text contained in the current instance. /// public SynchedTextType Type { get {return lyrics_type;} set {lyrics_type = value;} } /// /// Gets and sets the text contained in the current /// instance. /// /// /// A containing the text /// contained in the current instance. /// public SynchedText [] Text { get {return text;} set { text = value == null ? new SynchedText [0] : value; } } #endregion #region Public Static Methods /// /// Gets a specified lyrics frame from the specified tag, /// optionally creating it if it does not exist. /// /// /// A object to search in. /// /// /// A object specifying the description /// to match. /// /// /// A object specifying the ISO-639-2 /// language code to match. /// /// /// A value specifying the /// text type to match. /// /// /// A specifying whether or not to create /// and add a new frame to the tag if a match is not found. /// /// /// A object /// containing the matching frame, or /// if a match wasn't found and is /// . /// public static SynchronisedLyricsFrame Get (Tag tag, string description, string language, SynchedTextType type, bool create) { foreach (Frame f in tag) { SynchronisedLyricsFrame lyr = f as SynchronisedLyricsFrame; if (lyr == null) continue; if (lyr.Description == description && (language == null || language == lyr.Language) && type == lyr.Type) return lyr; } if (!create) return null; SynchronisedLyricsFrame frame = new SynchronisedLyricsFrame (description, language, type); tag.AddFrame (frame); return frame; } /// /// Gets a specified lyrics frame from the specified tag, /// trying to to match the description and language but /// accepting an incomplete match. /// /// /// A object to search in. /// /// /// A object specifying the description /// to match. /// /// /// A object specifying the ISO-639-2 /// language code to match. /// /// /// A value specifying the /// text type to match. /// /// /// A object /// containing the matching frame, or /// if a match wasn't found. /// /// /// The method tries matching with the following order /// of precidence: /// /// The first frame with a matching /// description, language, and type. /// The first frame with a matching /// description and language. /// The first frame with a matching /// language. /// The first frame with a matching /// description. /// The first frame with a matching /// type. /// The first frame. /// /// public static SynchronisedLyricsFrame GetPreferred (Tag tag, string description, string language, SynchedTextType type) { // This is weird, so bear with me. The best thing we can // have is something straightforward and in our own // language. If it has a description, then it is // probably used for something other than an actual // comment. If that doesn't work, we'd still rather have // something in our language than something in another. // After that all we have left are things in other // languages, so we'd rather have one with actual // content, so we try to get one with no description // first. int best_value = -1; SynchronisedLyricsFrame best_frame = null; foreach (Frame f in tag) { SynchronisedLyricsFrame cf = f as SynchronisedLyricsFrame; if (cf == null) continue; int value = 0; if (cf.Language == language) value += 4; if (cf.Description == description) value += 2; if (cf.Type == type) value += 1; if (value == 7) return cf; if (value <= best_value) continue; best_value = value; best_frame = cf; } return best_frame; } #endregion #region Protected Methods /// /// Populates the values in the current instance by parsing /// its field data in a specified version. /// /// /// A object containing the /// extracted field data. /// /// /// A indicating the ID3v2 version the /// field data is encoded in. /// protected override void ParseFields (ByteVector data, byte version) { if (data.Count < 6) throw new CorruptFileException ( "Not enough bytes in field."); encoding = (StringType) data [0]; language = data.ToString (StringType.Latin1, 1, 3); timestamp_format = (TimestampFormat) data [4]; lyrics_type = (SynchedTextType) data [5]; ByteVector delim = ByteVector.TextDelimiter ( encoding); int delim_index = data.Find (delim, 6, delim.Count); if (delim_index < 0) throw new CorruptFileException ( "Text delimiter expected."); description = data.ToString (encoding, 6, delim_index - 6); int offset = delim_index + delim.Count; List l = new List (); while (offset + delim.Count + 4 < data.Count) { delim_index = data.Find (delim, offset, delim.Count); if (delim_index < offset) throw new CorruptFileException ( "Text delimiter expected."); string text = data.ToString (encoding, offset, delim_index - offset); offset = delim_index + delim.Count; if (offset + 4 > data.Count) break; l.Add (new SynchedText (data.Mid (offset, 4) .ToUInt (), text)); offset += 4; } this.text = l.ToArray (); } /// /// Renders the values in the current instance into field /// data for a specified version. /// /// /// A indicating the ID3v2 version the /// field data is to be encoded in. /// /// /// A object containing the /// rendered field data. /// protected override ByteVector RenderFields (byte version) { StringType encoding = CorrectEncoding(TextEncoding, version); ByteVector delim = ByteVector.TextDelimiter (encoding); ByteVector v = new ByteVector (); v.Add ((byte) encoding); v.Add (ByteVector.FromString (Language, StringType.Latin1)); v.Add ((byte) timestamp_format); v.Add ((byte) lyrics_type); v.Add (ByteVector.FromString (description, encoding)); v.Add (delim); foreach (SynchedText t in text) { v.Add (ByteVector.FromString (t.Text, encoding)); v.Add (delim); v.Add (ByteVector.FromUInt ((uint)t.Time)); } return v; } #endregion #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to the /// current instance. /// public override Frame Clone () { SynchronisedLyricsFrame frame = new SynchronisedLyricsFrame (description, language, lyrics_type, encoding); frame.timestamp_format = timestamp_format; frame.text = (SynchedText[]) text.Clone (); return frame; } #endregion } /// /// This structure contains a single entry in a object. /// public struct SynchedText { /// /// Contains the time offset. /// private long time; /// /// Contains the text. /// private string text; /// /// Constructs and initializes a new instance of with a specified time and text. /// /// /// A value representing an amount of /// time in a format define in the class using it. The /// specific format is specified in . /// /// /// A object containing the text /// for the point in time. /// public SynchedText (long time, string text) { this.time = time; this.text = text; } /// /// Gets and sets the time offset of the current instance. /// /// /// A value representing an amount of /// time in a format define in the class using it. The /// specific format is specified in . /// public long Time { get {return time;} set {time = value;} } /// /// Gets and sets the text for the point in time represented /// by the current instance. /// /// /// A object containing the text /// for the point in time. /// public string Text { get {return text;} set {text = value;} } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Frames/GeneralEncapsulatedObjectFrame.cs0000644000175000017500000002760211462100402030704 0ustar00rubenruben00000000000000// // GeneralEncapsulatedObjectFrame.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // generalencapsulatedobjectframe.cpp from TagLib // // Copyright (C) 2007 Brian Nickel // Copyright (C) 2007 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections; using System; namespace TagLib.Id3v2 { /// /// This class extends , implementing support for /// ID3v2 General Encapsulated Object (GEOB) Frames. /// /// /// A should be /// used for storing files and other objects relevant to the file but /// not supported by other frames. /// public class GeneralEncapsulatedObjectFrame : Frame { #region Private Fields /// /// Contains the text encoding to use when rendering the /// current instance. /// private StringType encoding = Tag.DefaultEncoding; /// /// Contains the mime type of . /// private string mime_type = null; /// /// Contains the original file name. /// string file_name = null; /// /// Contains the description. /// private string description = null; /// /// Contains the data. /// private ByteVector data = null; #endregion #region Constructors /// /// Constructs and initializes a new instance of with no /// contents. /// public GeneralEncapsulatedObjectFrame () : base (FrameType.GEOB, 4) { } /// /// Constructs and initializes a new instance of by reading its /// raw data in a specified ID3v2 version. /// /// /// A object starting with the raw /// representation of the new frame. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// public GeneralEncapsulatedObjectFrame (ByteVector data, byte version) : base (data, version) { SetData (data, 0, version, true); } /// /// Constructs and initializes a new instance of by reading its /// raw data in a specified ID3v2 version. /// /// /// A object containing the raw /// representation of the new frame. /// /// /// A indicating at what offset in /// the frame actually begins. /// /// /// A containing the header of the /// frame found at in the data. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// protected internal GeneralEncapsulatedObjectFrame (ByteVector data, int offset, FrameHeader header, byte version) : base(header) { SetData (data, offset, version, false); } #endregion #region Public Properties /// /// Gets and sets the text encoding to use when storing the /// current instance. /// /// /// A containing the text encoding to /// use when storing the current instance. /// /// /// This encoding is overridden when rendering if is or the render version does not support /// it. /// public StringType TextEncoding { get {return encoding;} set {encoding = value;} } /// /// Gets and sets the mime-type of the object stored in the /// current instance. /// /// /// A containing the mime-type of the /// object stored in the current instance. /// public string MimeType { get { if (mime_type != null) return mime_type; return string.Empty; } set {mime_type = value;} } /// /// Gets and sets the file name of the object stored in the /// current instance. /// /// /// A containing the file name of the /// object stored in the current instance. /// public string FileName { get { if (file_name != null) return file_name; return string.Empty; } set {file_name = value;} } /// /// Gets and sets the description stored in the current /// instance. /// /// /// A containing the description /// stored in the current instance. /// /// /// There should only be one frame with a matching /// description and type per tag. /// public string Description { get { if (description != null) return description; return string.Empty; } set {description = value;} } /// /// Gets and sets the object data stored in the current /// instance. /// /// /// A containing the object data /// stored in the current instance. /// public ByteVector Object { get {return data != null ? data : new ByteVector ();} set {data = value;} } #endregion #region Public Methods /// /// Creates a text description of the current instance. /// /// /// A object containing a description /// of the current instance. /// public override string ToString () { System.Text.StringBuilder builder = new System.Text.StringBuilder (); if (Description.Length == 0) { builder.Append (Description); builder.Append (" "); } builder.AppendFormat ( System.Globalization.CultureInfo.InvariantCulture, "[{0}] {1} bytes", MimeType, Object.Count); return builder.ToString (); } #endregion #region Public Static Methods /// /// Gets a specified encapsulated object frame from the /// specified tag, optionally creating it if it does not /// exist. /// /// /// A object to search in. /// /// /// A specifying the description to /// match. /// /// /// A specifying whether or not to create /// and add a new frame to the tag if a match is not found. /// /// /// A object /// containing the matching frame, or /// if a match wasn't found and is /// . /// public static GeneralEncapsulatedObjectFrame Get (Tag tag, string description, bool create) { GeneralEncapsulatedObjectFrame geob; foreach (Frame frame in tag.GetFrames (FrameType.GEOB)) { geob = frame as GeneralEncapsulatedObjectFrame; if (geob == null) continue; if (geob.Description != description) continue; return geob; } if (!create) return null; geob = new GeneralEncapsulatedObjectFrame (); geob.Description = description; tag.AddFrame (geob); return geob; } #endregion #region Protected Methods /// /// Populates the values in the current instance by parsing /// its field data in a specified version. /// /// /// A object containing the /// extracted field data. /// /// /// A indicating the ID3v2 version the /// field data is encoded in. /// /// /// contains less than 5 bytes. /// protected override void ParseFields (ByteVector data, byte version) { if (data.Count < 4) throw new CorruptFileException ( "An object frame must contain at least 4 bytes."); int start = 0; encoding = (StringType) data [start++]; int end = data.Find ( ByteVector.TextDelimiter (StringType.Latin1), start); if (end < start) return; mime_type = data.ToString (StringType.Latin1, start, end - start); ByteVector delim = ByteVector.TextDelimiter ( encoding); start = end + 1; end = data.Find (delim, start, delim.Count); if (end < start) return; file_name = data.ToString (encoding, start, end - start); start = end + delim.Count; end = data.Find (delim, start, delim.Count); if (end < start) return; description = data.ToString (encoding, start, end - start); start = end + delim.Count; data.RemoveRange (0, start); this.data = data; } /// /// Renders the values in the current instance into field /// data for a specified version. /// /// /// A indicating the ID3v2 version the /// field data is to be encoded in. /// /// /// A object containing the /// rendered field data. /// protected override ByteVector RenderFields (byte version) { StringType encoding = CorrectEncoding (this.encoding, version); ByteVector v = new ByteVector (); v.Add ((byte) encoding); if (MimeType != null) v.Add (ByteVector.FromString (MimeType, StringType.Latin1)); v.Add (ByteVector.TextDelimiter (StringType.Latin1)); if (FileName != null) v.Add (ByteVector.FromString (FileName, encoding)); v.Add (ByteVector.TextDelimiter (encoding)); if (Description != null) v.Add (ByteVector.FromString (Description, encoding)); v.Add (ByteVector.TextDelimiter (encoding)); v.Add (data); return v; } #endregion #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to the /// current instance. /// public override Frame Clone () { GeneralEncapsulatedObjectFrame frame = new GeneralEncapsulatedObjectFrame (); frame.encoding = encoding; frame.mime_type = mime_type; frame.file_name = file_name; frame.description = description; if (data != null) frame.data = new ByteVector (data); return frame; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Frames/TermsOfUseFrame.cs0000644000175000017500000002534411462100402025704 0ustar00rubenruben00000000000000// // TermsOfUseFrame.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Id3v2 { /// /// This class extends , implementing support for /// ID3v2 Terms of Use (USER) Frames. /// /// /// This frame contains license text or restrictions on the use of a /// media file. /// public class TermsOfUseFrame : Frame { #region Private Fields /// /// Contains the text encoding to use when rendering the /// current instance. /// private StringType encoding = Tag.DefaultEncoding; /// /// Contains the ISO-639-2 language code of the current /// instance. /// private string language = null; /// /// Contains the text in the current instance. /// private string text = null; #endregion #region Constructors /// /// Constructs and intializes a new instance of with a specified language and /// encoding. /// /// /// A containing the ISO-639-2 language /// code of the new frame. /// /// /// A containing the text encoding /// to use when rendering the new frame. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more /// integrated frame creation. /// public TermsOfUseFrame (string language, StringType encoding) : base (FrameType.USER, 4) { this.encoding = encoding; this.language = language; } /// /// Constructs and intializes a new instance of with a specified language. /// /// /// A containing the ISO-639-2 language /// code of the new frame. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more /// integrated frame creation. /// public TermsOfUseFrame (string language) : base (FrameType.USER, 4) { this.language = language; } /// /// Constructs and initializes a new instance of by reading its raw data in a /// specified ID3v2 version. /// /// /// A object starting with the raw /// representation of the new frame. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// public TermsOfUseFrame (ByteVector data, byte version) : base (data, version) { SetData (data, 0, version, true); } /// /// Constructs and initializes a new instance of by reading its raw data in a /// specified ID3v2 version. /// /// /// A object containing the raw /// representation of the new frame. /// /// /// A indicating at what offset in /// the frame actually begins. /// /// /// A containing the header of the /// frame found at in the data. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// protected internal TermsOfUseFrame (ByteVector data, int offset, FrameHeader header, byte version) : base (header) { SetData (data, offset, version, false); } #endregion #region Public Properties /// /// Gets and sets the text encoding to use when storing the /// current instance. /// /// /// A containing the text encoding to /// use when storing the current instance. /// /// /// This encoding is overridden when rendering if is or the render version does not support /// it. /// public StringType TextEncoding { get {return encoding;} set {encoding = value;} } /// /// Gets and sets the ISO-639-2 language code stored in the /// current instance. /// /// /// A containing the ISO-639-2 language /// code stored in the current instance. /// /// /// There should only be one file with a matching /// ISO-639-2 language code per tag. /// public string Language { get { return (language != null && language.Length > 2) ? language.Substring (0, 3) : "XXX"; } set {language = value;} } /// /// Gets and sets the terms of use stored in the current /// instance. /// /// /// A object containing the terms of /// use. /// public string Text { get {return text;} set {text = value;} } #endregion #region Public Methods /// /// Gets a string representation of the current instance. /// /// /// A containing the terms of use. /// public override string ToString () { return text; } #endregion #region Public Static Methods /// /// Gets a specified terms of use frame from the specified /// tag, optionally creating it if it does not exist. /// /// /// A object to search in. /// /// /// A specifying the ISO-639-2 language /// code to match. /// /// /// A specifying whether or not to create /// and add a new frame to the tag if a match is not found. /// /// /// A object containing the /// matching frame, or if a match /// wasn't found and is . /// public static TermsOfUseFrame Get (Tag tag, string language, bool create) { foreach (Frame f in tag.GetFrames (FrameType.USER)) { TermsOfUseFrame cf = f as TermsOfUseFrame; if (cf != null && (language == null || language == cf.Language)) return cf; } if (!create) return null; TermsOfUseFrame frame = new TermsOfUseFrame (language); tag.AddFrame (frame); return frame; } /// /// Gets a specified terms of use frame from the specified /// tag, trying to to match the language but accepting one /// with a different language if a match was not found. /// /// /// A object to search in. /// /// /// A specifying the ISO-639-2 language /// code to match. /// /// /// A object containing the /// matching frame, or if a match /// wasn't found. /// public static TermsOfUseFrame GetPreferred (Tag tag, string language) { TermsOfUseFrame best = null; foreach (Frame f in tag.GetFrames (FrameType.USER)) { TermsOfUseFrame cf = f as TermsOfUseFrame; if (cf == null) continue; if (cf.Language == language) return cf; if (best == null) best = cf; } return best; } #endregion #region Protected Methods /// /// Populates the values in the current instance by parsing /// its field data in a specified version. /// /// /// A object containing the /// extracted field data. /// /// /// A indicating the ID3v2 version the /// field data is encoded in. /// protected override void ParseFields (ByteVector data, byte version) { if (data.Count < 4) throw new CorruptFileException ( "Not enough bytes in field."); encoding = (StringType) data [0]; language = data.ToString (StringType.Latin1, 1, 3); text = data.ToString (encoding, 4, data.Count - 4); } /// /// Renders the values in the current instance into field /// data for a specified version. /// /// /// A indicating the ID3v2 version the /// field data is to be encoded in. /// /// /// A object containing the /// rendered field data. /// protected override ByteVector RenderFields (byte version) { StringType encoding = CorrectEncoding (TextEncoding, version); ByteVector v = new ByteVector (); v.Add ((byte) encoding); v.Add (ByteVector.FromString (Language, StringType.Latin1)); v.Add (ByteVector.FromString (text, encoding)); return v; } #endregion #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to the /// current instance. /// public override Frame Clone () { TermsOfUseFrame frame = new TermsOfUseFrame (language, encoding); frame.text = text; return frame; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Frames/UnsynchronisedLyricsFrame.cs0000644000175000017500000003627611462100402030057 0ustar00rubenruben00000000000000// // UnsynchronisedLyricsFrame.cs: // // Author: // Patrick Laplante // // Original Source: // TagLib.Id3v2.CommentsFrame // // Copyright (C) 2007 Brian Nickel (Original Implementation) // Copyright (C) 2002,2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using System.Text; using TagLib.Id3v2; namespace TagLib.Id3v2 { /// /// This class extends , implementing support for /// ID3v2 Unsynchronised Lyrics (USLT) Frames. /// public class UnsynchronisedLyricsFrame : Frame { #region Private Properties /// /// Contains the text encoding to use when rendering the /// current instance. /// private StringType encoding = Tag.DefaultEncoding; /// /// Contains the ISO-639-2 language code of the current /// instance. /// private string language = null; /// /// Contains the description of the current instance. /// private string description = null; /// /// Contains the lyrics text of the current instance. /// private string text = null; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a specified /// description, ISO-639-2 language code, and text encoding. /// /// /// A containing the description of the /// new frame. /// /// /// A containing the ISO-639-2 language /// code of the new frame. /// /// /// A containing the text encoding /// to use when rendering the new frame. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more /// integrated frame creation. /// public UnsynchronisedLyricsFrame (string description, string language, StringType encoding) : base (FrameType.USLT, 4) { this.encoding = encoding; this.language = language; this.description = description; } /// /// Constructs and initializes a new instance of with a specified /// description and ISO-639-2 language code. /// /// /// A containing the description of the /// new frame. /// /// /// A containing the ISO-639-2 language /// code of the new frame. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more /// integrated frame creation. /// public UnsynchronisedLyricsFrame (string description, string language) : this (description, language, TagLib.Id3v2.Tag.DefaultEncoding) { } /// /// Constructs and initializes a new instance of with a specified /// description. /// /// /// A containing the description of the /// new frame. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more /// integrated frame creation. /// public UnsynchronisedLyricsFrame (string description) : this (description, null) { } /// /// Constructs and initializes a new instance of by reading its raw /// data in a specified ID3v2 version. /// /// /// A object starting with the raw /// representation of the new frame. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// public UnsynchronisedLyricsFrame (ByteVector data, byte version) : base(data, version) { SetData (data, 0, version, true); } /// /// Constructs and initializes a new instance of by reading its raw /// data in a specified ID3v2 version. /// /// /// A object containing the raw /// representation of the new frame. /// /// /// A indicating at what offset in /// the frame actually begins. /// /// /// A containing the header of the /// frame found at in the data. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// protected internal UnsynchronisedLyricsFrame (ByteVector data, int offset, FrameHeader header, byte version) : base(header) { SetData (data, offset, version, false); } #endregion #region Public Properties /// /// Gets and sets the text encoding to use when storing the /// current instance. /// /// /// A containing the text encoding to /// use when storing the current instance. /// /// /// This encoding is overridden when rendering if is or the render version does not support /// it. /// public StringType TextEncoding { get {return encoding;} set {encoding = value;} } /// /// Gets and sets the ISO-639-2 language code stored in the /// current instance. /// /// /// A containing the ISO-639-2 language /// code stored in the current instance. /// /// /// There should only be one file with a matching description /// and ISO-639-2 language code per tag. /// public string Language { get { if (language != null && language.Length > 2) return language.Substring (0, 3); return "XXX"; } set {language = value;} } /// /// Gets and sets the description stored in the current /// instance. /// /// /// A containing the description /// stored in the current instance. /// /// /// There should only be one frame with a matching /// description and ISO-639-2 language code per tag. /// public string Description { get { if (description != null) return description; return string.Empty; } set {description = value;} } /// /// Gets and sets the lyrical text stored in the current /// instance. /// /// /// A containing the lyrical text /// stored in the current instance. /// public string Text { get { if (text != null) return text; return string.Empty; } set {text = value;} } #endregion #region Public Methods /// /// Gets a string representation of the current instance. /// /// /// A containing the lyrical text. /// public override string ToString () { return Text; } #endregion #region Public Static Methods /// /// Gets a specified lyrics frame from the specified tag, /// optionally creating it if it does not exist. /// /// /// A object to search in. /// /// /// A specifying the description to /// match. /// /// /// A specifying the ISO-639-2 language /// code to match. /// /// /// A specifying whether or not to create /// and add a new frame to the tag if a match is not found. /// /// /// A object /// containing the matching frame, or /// if a match wasn't found and is /// . /// public static UnsynchronisedLyricsFrame Get (Tag tag, string description, string language, bool create) { UnsynchronisedLyricsFrame uslt; foreach (Frame frame in tag.GetFrames (FrameType.USLT)) { uslt = frame as UnsynchronisedLyricsFrame; if (uslt == null) continue; if (uslt.Description != description) continue; if (language != null && language != uslt.Language) continue; return uslt; } if (!create) return null; uslt = new UnsynchronisedLyricsFrame (description, language); tag.AddFrame (uslt); return uslt; } /// /// Gets a specified comments frame from the specified tag, /// trying to to match the description and language but /// accepting an incomplete match. /// /// /// A object to search in. /// /// /// A specifying the description to /// match. /// /// /// A specifying the ISO-639-2 language /// code to match. /// /// /// A object /// containing the matching frame, or /// if a match wasn't found. /// /// /// The method tries matching with the following order /// of precidence: /// /// The first frame with a matching /// description and language. /// The first frame with a matching /// language. /// The first frame with a matching /// description. /// The first frame. /// /// public static UnsynchronisedLyricsFrame GetPreferred (Tag tag, string description, string language) { // This is weird, so bear with me. The best thing we can // have is something straightforward and in our own // language. If it has a description, then it is // probably used for something other than an actual // comment. If that doesn't work, we'd still rather have // something in our language than something in another. // After that all we have left are things in other // languages, so we'd rather have one with actual // content, so we try to get one with no description // first. int best_value = -1; UnsynchronisedLyricsFrame best_frame = null; foreach (Frame frame in tag.GetFrames (FrameType.USLT)) { UnsynchronisedLyricsFrame uslt = frame as UnsynchronisedLyricsFrame; if (uslt == null) continue; bool same_name = uslt.Description == description; bool same_lang = uslt.Language == language; if (same_name && same_lang) return uslt; int value = same_lang ? 2 : same_name ? 1 : 0; if (value <= best_value) continue; best_value = value; best_frame = uslt; } return best_frame; } #endregion #region Protected Methods /// /// Populates the values in the current instance by parsing /// its field data in a specified version. /// /// /// A object containing the /// extracted field data. /// /// /// A indicating the ID3v2 version the /// field data is encoded in. /// protected override void ParseFields (ByteVector data, byte version) { if (data.Count < 4) throw new CorruptFileException ( "Not enough bytes in field."); encoding = (StringType) data [0]; language = data.ToString (StringType.Latin1, 1, 3); string [] split = data.ToStrings (encoding, 4, 2); if (split.Length == 1) { // Bad lyrics frame. Assume that it lacks a // description. description = String.Empty; text = split [0]; } else { description = split [0]; text = split [1]; } } /// /// Renders the values in the current instance into field /// data for a specified version. /// /// /// A indicating the ID3v2 version the /// field data is to be encoded in. /// /// /// A object containing the /// rendered field data. /// protected override ByteVector RenderFields(byte version) { StringType encoding = CorrectEncoding (TextEncoding, version); ByteVector v = new ByteVector(); v.Add ((byte) encoding); v.Add (ByteVector.FromString (Language, StringType.Latin1)); v.Add (ByteVector.FromString (description, encoding)); v.Add (ByteVector.TextDelimiter(encoding)); v.Add (ByteVector.FromString (text, encoding)); return v; } #endregion #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to the /// current instance. /// public override Frame Clone () { UnsynchronisedLyricsFrame frame = new UnsynchronisedLyricsFrame (description, language, encoding); frame.text = text; return frame; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Frames/UnknownFrame.cs0000644000175000017500000001312711462100402025303 0ustar00rubenruben00000000000000// // UnknownFrame.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // unknownframe.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2002 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections; using System; namespace TagLib.Id3v2 { /// /// This class extends to provide a fallback /// type when no other frame class works for a given frame. /// public class UnknownFrame : Frame { #region Private Properties /// /// Contains the field data. /// private ByteVector field_data = null; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a specified type. /// /// /// A object containing an ID3v2.4 /// frame identifier. /// /// /// A object containing the contents /// of the frame. /// public UnknownFrame (ByteVector type, ByteVector data) : base (type, 4) { field_data = data; } /// /// Constructs and initializes a new instance of with a specified type. /// /// /// A object containing an ID3v2.4 /// frame identifier. /// public UnknownFrame (ByteVector type) : this (type, null) { } /// /// Constructs and initializes a new instance of by reading its raw data in a /// specified ID3v2 version. /// /// /// A object starting with the raw /// representation of the new frame. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// public UnknownFrame (ByteVector data, byte version) : base (data, version) { SetData (data, 0, version, true); } /// /// Constructs and initializes a new instance of by reading its raw data in a /// specified ID3v2 version. /// /// /// A object containing the raw /// representation of the new frame. /// /// /// A indicating at what offset in /// the frame actually begins. /// /// /// A containing the header of the /// frame found at in the data. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// protected internal UnknownFrame (ByteVector data, int offset, FrameHeader header, byte version) : base(header) { SetData (data, offset, version, false); } #endregion #region Public Properties /// /// Gets and sets the field data in the current instance. /// /// /// A containing the field data. /// public ByteVector Data { get {return field_data;} set {field_data = value;} } #endregion #region Public Methods /// /// Gets a string representation of the current instance. /// /// /// A object describing the current /// instance. /// public override string ToString () { return base.ToString (); } #endregion #region Protected Methods /// /// Populates the values in the current instance by parsing /// its field data in a specified version. /// /// /// A object containing the /// extracted field data. /// /// /// A indicating the ID3v2 version the /// field data is encoded in. /// protected override void ParseFields (ByteVector data, byte version) { field_data = data; } /// /// Renders the values in the current instance into field /// data for a specified version. /// /// /// A indicating the ID3v2 version the /// field data is to be encoded in. /// /// /// A object containing the /// rendered field data. /// protected override ByteVector RenderFields (byte version) { return field_data ?? new ByteVector (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Frames/AttachedPictureFrame.cs0000644000175000017500000005056111462100402026720 0ustar00rubenruben00000000000000// // AttachedPictureFrame.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // attachedpictureframe.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2004 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections; using System; using TagLib; namespace TagLib.Id3v2 { /// /// This class extends , implementing support for /// ID3v2 Attached Picture (APIC) Frames. /// /// /// A is used for storing /// pictures that complement the media, including the album cover, /// the physical medium, leaflets, file icons, etc. Other file and /// object data can be encapulsated via . /// Additionally, provides a /// generic way or getting and setting pictures which is preferable /// to format specific code. /// public class AttachedPictureFrame : Frame, IPicture { #region Private Properties /// /// Contains the text encoding to use when rendering. /// private StringType text_encoding = Tag.DefaultEncoding; /// /// Contains the mime type of . /// private string mime_type = null; /// /// Contains the type of picture. /// private PictureType type = PictureType.Other; /// /// Contains the description. /// private string description = null; /// /// Contains the picture data. /// private ByteVector data = null; /// /// Contains the raw field data of the current instance as /// sent to or if has not /// been called or has been /// called. /// /// /// As this frame takes a while to parse and isn't read in /// all cases, the raw data is stored here until it is /// needed. This speeds up the file read time significantly. /// private ByteVector raw_data = null; /// /// Contains the ID3v2 version is /// stored in. /// private byte raw_version = 0; #endregion #region Constructors /// /// Constructs and initializes a new instance of with no contents and the /// default values. /// /// /// When a frame is created, it is not automatically /// added to the tag. Consider using for more /// integrated frame creation. /// Additionally, /// provides a generic way or getting and setting /// pictures which is preferable to format specific /// code. /// public AttachedPictureFrame () : base (FrameType.APIC, 4) { } /// /// Constructs and initializes a new instance of by populating it with /// the contents of another object. /// /// /// A object containing values to use /// in the new instance. /// /// /// is . /// /// /// When a frame is created, it is not automatically /// added to the tag. Consider using for more /// integrated frame creation. /// Additionally, /// provides a generic way or getting and setting /// pictures which is preferable to format specific /// code. /// /// /// Add a picture to a file. /// /// using TagLib; /// using TagLib.Id3v2; /// /// public static class AddId3v2Picture /// { /// public static void Main (string [] args) /// { /// if (args.Length != 2) /// throw new ApplicationException ( /// "USAGE: AddId3v2Picture.exe AUDIO_FILE PICTURE_FILE"); /// /// // Create the file. Can throw file to TagLib# exceptions. /// File file = File.Create (args [0]); /// /// // Get or create the ID3v2 tag. /// TagLib.Id3v2.Tag tag = file.GetTag (TagTypes.Id3v2, true) as TagLib.Id3v2.Tag; /// if (tag == null) /// throw new ApplicationException ("File does not support ID3v2 tags."); /// /// // Create a picture. Can throw file related exceptions. /// TagLib.Picture picture = TagLib.Picture.CreateFromPath (path); /// /// // Add a new picture frame to the tag. /// tag.AddFrame (new AttachedPictureFrame (picture)); /// /// // Save the file. /// file.Save (); /// } /// } /// /// public AttachedPictureFrame (IPicture picture) : base(FrameType.APIC, 4) { if (picture == null) throw new ArgumentNullException ("picture"); mime_type = picture.MimeType; type = picture.Type; description = picture.Description; data = picture.Data; } /// /// Constructs and initializes a new instance of by reading its raw data in /// a specified ID3v2 version. /// /// /// A object starting with the raw /// representation of the new frame. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// public AttachedPictureFrame (ByteVector data, byte version) : base (data, version) { SetData (data, 0, version, true); } /// /// Constructs and initializes a new instance of by reading its raw data /// in a specified ID3v2 version. /// /// /// A object containing the raw /// representation of the new frame. /// /// /// A indicating at what offset in /// the frame actually begins. /// /// /// A containing the header of the /// frame found at in the data. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// protected internal AttachedPictureFrame (ByteVector data, int offset, FrameHeader header, byte version) : base(header) { SetData (data, offset, version, false); } #endregion #region Public Properties /// /// Gets and sets the text encoding to use when storing the /// current instance. /// /// /// A containing the text encoding to /// use when storing the current instance. /// /// /// This encoding is overridden when rendering if is or the render version does not support /// it. /// public StringType TextEncoding { get {ParseRawData (); return text_encoding;} set {text_encoding = value;} } /// /// Gets and sets the mime-type of the picture stored in the /// current instance. /// /// /// A containing the mime-type of the /// picture stored in the current instance. /// public string MimeType { get { ParseRawData (); if (mime_type != null) return mime_type; return string.Empty; } set {mime_type = value;} } /// /// Gets and sets the picture type stored in the current /// instance. /// /// /// A containing the picture type /// stored in the current instance. /// /// /// There should only be one frame with a matching /// description and type per tag. /// public PictureType Type { get {ParseRawData (); return type;} set {type = value;} } /// /// Gets and sets the description stored in the current /// instance. /// /// /// A containing the description /// stored in the current instance. /// /// /// There should only be one frame with a matching /// description and type per tag. /// public string Description { get { ParseRawData (); if (description != null) return description; return string.Empty; } set {description = value;} } /// /// Gets and sets the image data stored in the current /// instance. /// /// /// A containing the image data /// stored in the current instance. /// public ByteVector Data { get { ParseRawData (); return data != null ? data : new ByteVector (); } set {data = value;} } #endregion #region Public Methods /// /// Gets a string representation of the current instance. /// /// /// A representing the current /// instance. /// public override string ToString () { System.Text.StringBuilder builder = new System.Text.StringBuilder (); if (string.IsNullOrEmpty (Description)) { builder.Append (Description); builder.Append (" "); } builder.AppendFormat ( System.Globalization.CultureInfo.InvariantCulture, "[{0}] {1} bytes", MimeType, Data.Count); return builder.ToString (); } #endregion #region Public Static Methods /// /// Gets a specified picture frame from the specified tag, /// optionally creating it if it does not exist. /// /// /// A object to search in. /// /// /// A specifying the description to /// match. /// /// /// A specifying whether or not to create /// and add a new frame to the tag if a match is not found. /// /// /// A object containing /// the matching frame, or if a match /// wasn't found and is . /// public static AttachedPictureFrame Get (Tag tag, string description, bool create) { return Get (tag, description, PictureType.Other, create); } /// /// Gets a specified picture frame from the specified tag, /// optionally creating it if it does not exist. /// /// /// A object to search in. /// /// /// A specifying the picture type /// to match. /// /// /// A specifying whether or not to create /// and add a new frame to the tag if a match is not found. /// /// /// A object containing /// the matching frame, or if a match /// wasn't found and is . /// public static AttachedPictureFrame Get (Tag tag, PictureType type, bool create) { return Get (tag, null, type, create); } /// /// Gets a specified picture frame from the specified tag, /// optionally creating it if it does not exist. /// /// /// A object to search in. /// /// /// A specifying the description to /// match. /// /// /// A specifying the picture type /// to match. /// /// /// A specifying whether or not to create /// and add a new frame to the tag if a match is not found. /// /// /// A object containing /// the matching frame, or if a match /// wasn't found and is . /// /// /// Sets a cover image with a description. Because is used, if /// the program is called again with the same audio file and /// desciption, the picture will be overwritten with the new /// one. /// /// using TagLib; /// using TagLib.Id3v2; /// /// public static class SetId3v2Cover /// { /// public static void Main (string [] args) /// { /// if (args.Length != 3) /// throw new ApplicationException ( /// "USAGE: SetId3v2Cover.exe AUDIO_FILE PICTURE_FILE DESCRIPTION"); /// /// // Create the file. Can throw file to TagLib# exceptions. /// File file = File.Create (args [0]); /// /// // Get or create the ID3v2 tag. /// TagLib.Id3v2.Tag tag = file.GetTag (TagTypes.Id3v2, true) as TagLib.Id3v2.Tag; /// if (tag == null) /// throw new ApplicationException ("File does not support ID3v2 tags."); /// /// // Create a picture. Can throw file related exceptions. /// TagLib.Picture picture = TagLib.Picture.CreateFromPath (args [1]); /// /// // Get or create the picture frame. /// AttachedPictureFrame frame = AttachedPictureFrame.Get ( /// tag, args [2], PictureType.FrontCover, true); /// /// // Set the data from the picture. /// frame.MimeType = picture.MimeType; /// frame.Data = picture.data; /// /// // Save the file. /// file.Save (); /// } /// } /// /// public static AttachedPictureFrame Get (Tag tag, string description, PictureType type, bool create) { AttachedPictureFrame apic; foreach (Frame frame in tag.GetFrames (FrameType.APIC)) { apic = frame as AttachedPictureFrame; if (apic == null) continue; if (description != null && apic.Description != description) continue; if (type != PictureType.Other && apic.Type != type) continue; return apic; } if (!create) return null; apic = new AttachedPictureFrame (); apic.Description = description; apic.Type = type; tag.AddFrame (apic); return apic; } #endregion #region Protected Methods /// /// Populates the values in the current instance by parsing /// its field data in a specified version. /// /// /// A object containing the /// extracted field data. /// /// /// A indicating the ID3v2 version the /// field data is encoded in. /// /// /// contains less than 5 bytes. /// protected override void ParseFields (ByteVector data, byte version) { if (data.Count < 5) throw new CorruptFileException ( "A picture frame must contain at least 5 bytes."); raw_data = data; raw_version = version; } /// /// Performs the actual parsing of the raw data. /// /// /// Because of the high parsing cost and relatively low usage /// of the class, only stores the /// field data so it can be parsed on demand. Whenever a /// property or method is called which requires the data, /// this method is called, and only on the first call does it /// actually parse the data. /// protected void ParseRawData () { if (raw_data == null) return; int pos = 0; int offset; text_encoding = (StringType) raw_data [pos++]; if (raw_version > 2) { offset = raw_data.Find (ByteVector.TextDelimiter ( StringType.Latin1), pos); if(offset < pos) return; mime_type = raw_data.ToString ( StringType.Latin1, pos, offset - pos); pos = offset + 1; } else { ByteVector ext = raw_data.Mid (pos, 3); if (ext == "JPG") mime_type = "image/jpeg"; else if (ext == "PNG") mime_type = "image/png"; else mime_type = "image/unknown"; pos += 3; } ByteVector delim = ByteVector.TextDelimiter ( text_encoding); type = (PictureType) raw_data [pos++]; offset = raw_data.Find (delim, pos, delim.Count); if(offset < pos) return; description = raw_data.ToString (text_encoding, pos, offset - pos); pos = offset + delim.Count; raw_data.RemoveRange (0, pos); this.data = raw_data; this.raw_data = null; } /// /// Renders the values in the current instance into field /// data for a specified version. /// /// /// A indicating the ID3v2 version the /// field data is to be encoded in. /// /// /// A object containing the /// rendered field data. /// protected override ByteVector RenderFields (byte version) { if (raw_data != null && raw_version == version) return raw_data; StringType encoding = CorrectEncoding (TextEncoding, version); ByteVector data = new ByteVector (); data.Add ((byte) encoding); if (version == 2) { switch (MimeType) { case "image/png": data.Add ("PNG"); break; case "image/jpeg": data.Add ("JPG"); break; default: data.Add ("XXX"); break; } } else { data.Add (ByteVector.FromString (MimeType, StringType.Latin1)); data.Add (ByteVector.TextDelimiter ( StringType.Latin1)); } data.Add ((byte) type); data.Add (ByteVector.FromString (Description, encoding)); data.Add (ByteVector.TextDelimiter (encoding)); data.Add (this.data); return data; } #endregion #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to the /// current instance. /// public override Frame Clone () { AttachedPictureFrame frame = new AttachedPictureFrame (); frame.text_encoding = text_encoding; frame.mime_type = mime_type; frame.type = type; frame.description = description; if (data != null) frame.data = new ByteVector (data); if (raw_data != null) frame.data = new ByteVector (raw_data); frame.raw_version = raw_version; return frame; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Frames/MusicCdIdentifierFrame.cs0000644000175000017500000002313011462100402027171 0ustar00rubenruben00000000000000// // MusicCdIdentifierFrame.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System.Collections; using System; namespace TagLib.Id3v2 { /// /// This class extends , implementing support for /// ID3v2 Music CD Identifier (MCDI) Frames. /// /// /// Music CD Identifier Frames should contain the table of /// contents data as stored on the physical CD. It is primarily used /// for track information lookup by through web sources like CDDB. /// /// /// Reading the music CD identifier from a tag. /// /// using TagLib; /// using TagLib.Id3v2; /// /// public static class LookupUtil /// { /// public static ByteVector GetCdIdentifier (string filename) /// { /// File file = File.Create (filename, ReadStyle.None); /// Id3v2.Tag tag = file.GetTag (TagTypes.Id3v2, false) as Id3v2.Tag; /// if (tag == null) /// return new ByteVector (); /// /// MusicCdIdentifierFrame frame = MusicCdIdentifierFrame.Get (tag, false); /// if (frame == null) /// return new ByteVector (); /// /// return frame.Data; /// } /// } /// /// /// #using <System.dll> /// #using <taglib-sharp.dll> /// /// using System; /// using TagLib; /// using TagLib::Id3v2; /// /// public ref class LookupUtil abstract sealed /// { /// public: /// static ByteVector^ GetCdIdentifier (String^ filename) /// { /// File^ file = File::Create (filename, ReadStyle::None); /// Id3v2::Tag^ tag = dynamic_cast<Id3v2::Tag^> (file.GetTag (TagTypes::Id3v2, false)); /// if (tag == null) /// return gcnew ByteVector; /// /// MusicCdIdentifierFrame^ frame = MusicCdIdentifierFrame::Get (tag, false); /// if (frame == null) /// return gcnew ByteVector; /// /// return frame->Data; /// } /// } /// /// /// Imports TagLib /// Imports TagLib.Id3v2 /// /// Public Shared Class LookupUtil /// Public Shared Sub GetCdIdentifier (filename As String) As TagLib.ByteVector /// Dim file As File = File.Create (filename, ReadStyle.None) /// Dim tag As Id3v2.Tag = file.GetTag (TagTypes.Id3v2, False) /// If tag Is Nothing Return New ByteVector () /// /// Dim frame As MusicCdIdentifierFrame = MusicCdIdentifierFrame.Get (tag, False) /// If frame Is Nothing Return New ByteVector () /// /// Return frame.Data /// End Sub /// End Class /// /// /// import TagLib /// import TagLib.Id3v2 /// /// public static class LookupUtil: /// static def GetCdIdentifier (filename as string) as TagLib.ByteVector: /// file as File = File.Create (filename, ReadStyle.None) /// tag as Id3v2.Tag = file.GetTag (TagTypes.Id3v2, false) /// if tag == null: /// return ByteVector () /// /// frame as MusicCdIdentifierFrame = MusicCdIdentifierFrame.Get (tag, false) /// if frame == null: /// return ByteVector () /// /// return frame.Data /// /// public class MusicCdIdentifierFrame : Frame { #region Private Properties /// /// Contains the identifer data for the current instance. /// private ByteVector field_data = null; #endregion #region Constructors /// /// Constructs and initializes a new instance of with empty /// identifier data. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more /// integrated frame creation. /// public MusicCdIdentifierFrame () : base (FrameType.MCDI, 4) { } /// /// Constructs and initializes a new instance of by reading its raw data /// in a specified ID3v2 version. /// /// /// A object starting with the raw /// representation of the new frame. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// public MusicCdIdentifierFrame (ByteVector data, byte version) : base (data, version) { SetData (data, 0, version, true); } /// /// Constructs and initializes a new instance of by reading its raw data /// in a specified ID3v2 version. /// /// /// A object containing the raw /// representation of the new frame. /// /// /// A indicating at what offset in /// the frame actually begins. /// /// /// A containing the header of the /// frame found at in the data. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// protected internal MusicCdIdentifierFrame (ByteVector data, int offset, FrameHeader header, byte version) : base(header) { SetData (data, offset, version, false); } #endregion #region Public Properties /// /// Gets and sets the identifier data stored in the current /// instance. /// /// /// A containing the identifier /// data stored in the current instance. /// public ByteVector Data { get {return field_data;} set {field_data = value;} } #endregion #region Public Static Methods /// /// Gets a music CD identifier frame from a specified tag, /// optionally creating it if it does not exist. /// /// /// A object to search in. /// /// /// A specifying whether or not to create /// and add a new frame to the tag if a match is not found. /// /// /// A object containing /// the matching frame, or if a match /// wasn't found and is . /// public static MusicCdIdentifierFrame Get (Tag tag, bool create) { MusicCdIdentifierFrame mcdi; foreach (Frame frame in tag) { mcdi = frame as MusicCdIdentifierFrame; if (mcdi != null) return mcdi; } if (!create) return null; mcdi = new MusicCdIdentifierFrame (); tag.AddFrame (mcdi); return mcdi; } #endregion #region Protected Methods /// /// Populates the values in the current instance by parsing /// its field data in a specified version. /// /// /// A object containing the /// extracted field data. /// /// /// A indicating the ID3v2 version the /// field data is encoded in. /// protected override void ParseFields (ByteVector data, byte version) { field_data = data; } /// /// Renders the values in the current instance into field /// data for a specified version. /// /// /// A indicating the ID3v2 version the /// field data is to be encoded in. /// /// /// A object containing the /// rendered field data. /// protected override ByteVector RenderFields (byte version) { return field_data != null ? field_data : new ByteVector (); } #endregion #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to the /// current instance. /// public override Frame Clone () { MusicCdIdentifierFrame frame = new MusicCdIdentifierFrame (); if (field_data != null) frame.field_data = new ByteVector (field_data); return frame; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Frames/TextIdentificationFrame.cs0000644000175000017500000013172511462100402027447 0ustar00rubenruben00000000000000// // TextInformationFrame.cs: Provides support ID3v2 Text Information Frames // (Section 4.2), covering "T000" to "TZZZ", excluding "TXXX". // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // textidentificationframe.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2002,2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using System.Globalization; using System.Text; namespace TagLib.Id3v2 { /// /// This class extends to provide support ID3v2 /// Text Information Frames (Section 4.2), covering "T000" to /// "TZZZ", excluding "TXXX". /// /// /// Text Information Frames contain the most commonly used /// values in tagging, including the artist, the track name, and just /// about any value that can be expressed as text. /// The following table contains types and descriptions as /// found in the ID3 2.4.0 native frames specification. (Copyright /// (C) Martin Nilsson 2000.) /// /// /// /// ID /// Description /// /// /// TIT1 /// The 'Content group description' frame is used /// if the sound belongs to a larger category of sounds/music. /// For example, classical music is often sorted in different /// musical sections (e.g. "Piano Concerto", "Weather - /// Hurricane"). /// /// /// TIT2 /// The 'Title/Songname/Content description' frame /// is the actual name of the piece (e.g. "Adagio", "Hurricane /// Donna"). /// /// /// TIT3 /// The 'Subtitle/Description refinement' frame is /// used for information directly related to the contents title /// (e.g. "Op. 16" or "Performed live at /// Wembley"). /// /// /// TALB /// The 'Album/Movie/Show title' frame is intended /// for the title of the recording (or source of sound) from /// which the audio in the file is taken. /// /// /// TOAL /// The 'Original album/movie/show title' frame is /// intended for the title of the original recording (or source /// of sound), if for example the music in the file should be a /// cover of a previously released song. /// /// /// TRCK /// The 'Track number/Position in set' frame is a /// numeric string containing the order number of the /// audio-file on its original recording. This MAY be extended /// with a "/" character and a numeric string containing the /// total number of tracks/elements on the original recording. /// E.g. "4/9". /// /// /// TPOS /// The 'Part of a set' frame is a numeric string /// that describes which part of a set the audio came from. /// This frame is used if the source described in the "TALB" /// frame is divided into several mediums, e.g. a double CD. /// The value MAY be extended with a "/" character and a /// numeric string containing the total number of parts in the /// set. E.g. "1/2". /// /// /// TSST /// The 'Set subtitle' frame is intended for the /// subtitle of the part of a set this track belongs /// to. /// /// /// TSRC /// The 'ISRC' frame should contain the /// International Standard Recording Code [ISRC] (12 /// characters). /// /// /// TPE1 /// The /// 'Lead artist/Lead performer/Soloist/Performing group' is /// used for the main artist. /// /// /// TPE2 /// The 'Band/Orchestra/Accompaniment' frame is /// used for additional information about the performers in the /// recording. /// /// /// TPE3 /// The 'Conductor' frame is used for the name of /// the conductor. /// /// /// TPE4 /// The 'Interpreted, remixed, or otherwise /// modified by' frame contains more information about the /// people behind a remix and similar interpretations of /// another existing piece. /// /// /// TOPE /// The 'Original artist/performer' frame is /// intended for the performer of the original recording, if /// for example the music in the file should be a cover of a /// previously released song. /// /// /// TEXT /// The 'Lyricist/Text writer' frame is intended /// for the writer of the text or lyrics in the /// recording. /// /// /// TOLY /// The 'Original lyricist/text writer' frame is /// intended for the text writer of the original recording, if /// for example the music in the file should be a cover of a /// previously released song. /// /// /// TCOM /// The 'Composer' frame is intended for the name /// of the composer. /// /// /// TMCL /// The 'Musician credits list' is intended as a /// mapping between instruments and the musician that played /// it. Every odd field is an instrument and every even is an /// artist or a comma delimited list of artists. /// /// /// TIPL /// The 'Involved people list' is very similar to /// the musician credits list, but maps between functions, like /// producer, and names. /// /// /// TENC /// The 'Encoded by' frame contains the name of /// the person or organisation that encoded the audio file. /// This field may contain a copyright message, if the audio /// file also is copyrighted by the encoder. /// /// /// TBPM /// The 'BPM' frame contains the number of beats /// per minute in the main part of the audio. The BPM is an /// integer and represented as a numerical /// string. /// /// /// TLEN /// The 'Length' frame contains the length of the /// audio file in milliseconds, represented as a numeric /// string. /// /// /// TKEY /// The 'Initial key' frame contains the musical /// key in which the sound starts. It is represented as a /// string with a maximum length of three characters. The /// ground keys are represented with "A","B","C","D","E", "F" /// and "G" and halfkeys represented with "b" and "#". Minor is /// represented as "m", e.g. "Dbm". Off key is represented with /// an "o" only. /// /// /// TLAN /// The 'Language' frame should contain the /// languages of the text or lyrics spoken or sung in the /// audio. The language is represented with three characters /// according to ISO-639-2. If more than one language is used /// in the text their language codes should follow according to /// the amount of their usage. /// /// /// TCON /// The 'Content type', which ID3v1 was stored as /// a one byte numeric value only, is now a string. You may use /// one or several of the ID3v1 types as numerical strings, or, /// since the category list would be impossible to maintain /// with accurate and up to date categories, define your /// own. /// /// /// TFLT /// The 'File type' frame indicates which type of /// audio this tag defines. (See the specification for more /// details.) /// /// /// TMED /// The 'Media type' frame describes from which /// media the sound originated. (See the specification for more /// details.) /// /// /// TMOO /// The 'Mood' frame is intended to reflect the /// mood of the audio with a few keywords, e.g. "Romantic" or /// "Sad". /// /// /// TCOP /// The 'Copyright message' frame, in which the /// string must begin with a year and a space character (making /// five characters), is intended for the copyright holder of /// the original sound, not the audio file itself. The absence /// of this frame means only that the copyright information is /// unavailable or has been removed, and must not be /// interpreted to mean that the audio is public domain. Every /// time this field is displayed the field must be preceded /// with "Copyright " (C) " ", where (C) is one character /// showing a C in a circle. /// /// /// TPRO /// The 'Produced notice' frame, in which the /// string must begin with a year and a space character (making /// five characters), is intended for the production copyright /// holder of the original sound, not the audio file itself. /// The absence of this frame means only that the production /// copyright information is unavailable or has been removed, /// and must not be interpreted to mean that the audio is /// public domain. Every time this field is displayed the field /// must be preceded with "Produced " (P) " ", where (P) is one /// character showing a P in a circle. /// /// /// TPUB /// The 'Publisher' frame simply contains the name /// of the label or publisher. /// /// /// TOWN /// The 'File owner/licensee' frame contains the /// name of the owner or licensee of the file and it's /// contents. /// /// /// TRSN /// The 'Internet radio station name' frame /// contains the name of the internet radio station from which /// the audio is streamed. /// /// /// TRSO /// The 'Internet radio station owner' frame /// contains the name of the owner of the internet radio /// station from which the audio is streamed. /// /// /// TOFN /// The 'Original filename' frame contains the /// preferred filename for the file, since some media doesn't /// allow the desired length of the filename. The filename is /// case sensitive and includes its suffix. /// /// /// TDLY /// The 'Playlist delay' defines the numbers of /// milliseconds of silence that should be inserted before this /// audio. The value zero indicates that this is a part of a /// multifile audio track that should be played /// continuously. /// /// /// TDEN /// The 'Encoding time' frame contains a timestamp /// describing when the audio was encoded. Timestamp format is /// described in the ID3v2 structure document. /// /// /// TDOR /// The 'Original release time' frame contains a /// timestamp describing when the original recording of the /// audio was released. Timestamp format is described in the /// ID3v2 structure document. /// /// /// TDRC /// The 'Recording time' frame contains a /// timestamp describing when the audio was recorded. Timestamp /// format is described in the ID3v2 structure /// document. /// /// /// TDRL /// The 'Release time' frame contains a timestamp /// describing when the audio was first released. Timestamp /// format is described in the ID3v2 structure /// document. /// /// /// TDTG /// The 'Tagging time' frame contains a timestamp /// describing then the audio was tagged. Timestamp format is /// described in the ID3v2 structure document. /// /// /// TSSE /// The 'Software/Hardware and settings used for /// encoding' frame includes the used audio encoder and its /// settings when the file was encoded. Hardware refers to /// hardware encoders, not the computer on which a program was /// run. /// /// /// TSOA /// The 'Album sort order' frame defines a string /// which should be used instead of the album name (TALB) for /// sorting purposes. E.g. an album named "A Soundtrack" might /// preferably be sorted as "Soundtrack". /// /// /// TSOP /// The 'Performer sort order' frame defines a /// string which should be used instead of the performer (TPE2) /// for sorting purposes. /// /// /// TSOT /// The 'Title sort order' frame defines a string /// which should be used instead of the title (TIT2) for /// sorting purposes. /// /// /// public class TextInformationFrame : Frame { #region Private Fields /// /// Contains the encoding to use for the text. /// private StringType encoding = Id3v2.Tag.DefaultEncoding; /// /// Contains the text fields. /// private string [] text_fields = new string [0]; /// /// Contains the raw data from the frame, or if it has been processed. /// /// /// Rather than processing the data when the frame is loaded, /// it is parsed on demand, reducing the ammount of /// unnecessary conversion. /// private ByteVector raw_data = null; /// /// Contains the ID3v2 version of . /// private byte raw_version = 0; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a specified /// identifier and text encoding. /// /// /// A object containing an ID3v2.4 /// frame identifier. /// /// /// A value specifying the encoding /// to use for the new instance. /// public TextInformationFrame (ByteVector ident, StringType encoding) : base (ident, 4) { this.encoding = encoding; } /// /// Constructs and initializes a new instance of with a specified /// identifer. /// /// /// A object containing an ID3v2.4 /// frame identifier. /// public TextInformationFrame (ByteVector ident) : this (ident, Id3v2.Tag.DefaultEncoding) { } /// /// Constructs and initializes a new instance of by reading its raw /// contents in a specified ID3v2 version. /// /// /// A object starting with the /// frame to read. /// /// /// A value containing the ID3v2 version /// in which is encoded. /// public TextInformationFrame (ByteVector data, byte version) : base (data, version) { SetData (data, 0, version, true); } /// /// Constructs and initializes a new instance of by reading its raw /// contents from a specifed position in a object in a specified ID3v2 version. /// /// /// A object containing the frame /// to read. /// /// /// A value specifying the offset in /// at which the frame begins. /// /// /// A value containing the header /// that would be read in the frame. /// /// /// A value containing the ID3v2 version /// in which is encoded. /// protected internal TextInformationFrame (ByteVector data, int offset, FrameHeader header, byte version) : base (header) { SetData (data, offset, version, false); } #endregion #region Public Properties /// /// Gets the text contained in the current instance. /// /// /// A object containing the /// text contained in the current instance. /// /// /// Modifying the contents of the returned value will not /// modify the contents of the current instance. /// [Obsolete("Use TextInformationFrame.Text")] public StringCollection FieldList { get { ParseRawData (); return new StringCollection (Text); } } /// /// Gets and sets the text contained in the current /// instance. /// /// /// A containing the text contained /// in the current instance. /// /// /// Modifying the contents of the returned value will /// not modify the contents of the current instance. The /// value must be reassigned for the value to change. /// /// /// Modifying the values text values of a frame. /// TextInformationFrame frame = TextInformationFrame.Get (myTag, "TPE1", true); ////* Upper casing all the text: */ ///string[] text = frame.Text; ///for (int i = 0; i < text.Length; i++) /// text [i] = text [i].ToUpper (); ///frame.Text = text; /// ////* Replacing the value completely: */ ///frame.Text = new string [] {"DJ Jazzy Jeff"}; /// public virtual string [] Text { get { ParseRawData (); return (string[]) text_fields.Clone (); } set { raw_data = null; text_fields = value != null ? (string[]) value.Clone () : new string [0]; } } /// /// Gets and sets the text encoding to use when rendering /// the current instance. /// /// /// A value specifying the encoding /// to use when rendering the current instance. /// /// /// This value will be overwritten if is . /// public StringType TextEncoding { get { ParseRawData (); return encoding; } set {encoding = value;} } #endregion #region Public Methods /// /// Sets the text contained in the current instance. /// /// /// A object containing text /// to store in the current instance. /// [Obsolete("Use TextInformationFrame.Text")] public void SetText (StringCollection fields) { raw_data = null; Text = fields != null ? fields.ToArray () : null; } /// /// Sets the text contained in the current instance. /// /// /// A containing text to store in the /// current instance. /// [Obsolete("Use TextInformationFrame.Text")] public void SetText (params string [] text) { raw_data = null; Text = text; } /// /// Gets a string representation of the current instance. /// /// /// A containing the joined text. /// public override string ToString () { ParseRawData (); return string.Join ("; ", Text); } /// /// Renders the current instance, encoded in a specified /// ID3v2 version. /// /// /// A value specifying the version of /// ID3v2 to use when encoding the current instance. /// /// /// A object containing the /// rendered version of the current instance. /// public override ByteVector Render (byte version) { if (version != 3 || FrameId != FrameType.TDRC) return base.Render (version); string text = ToString (); if (text.Length < 10 || text [4] != '-' || text [7] != '-') return base.Render (version); ByteVector output = new ByteVector (); TextInformationFrame f; f = new TextInformationFrame (FrameType.TYER, encoding); f.Text = new string [] {text.Substring (0, 4)}; output.Add (f.Render (version)); f = new TextInformationFrame (FrameType.TDAT, encoding); f.Text = new string [] { text.Substring (5, 2) + text.Substring (8, 2) }; output.Add (f.Render (version)); if (text.Length < 16 || text [10] != 'T' || text [13] != ':') return output; f = new TextInformationFrame (FrameType.TIME, encoding); f.Text = new string [] { text.Substring (11, 2) + text.Substring (14, 2) }; output.Add (f.Render (version)); return output; } #endregion #region Public Static Methods /// /// Gets a object of a /// specified type from a specified tag, optionally creating /// and adding one with a specified encoding if none is /// found. /// /// /// A object to search for the specified /// tag in. /// /// /// A object containing the frame /// identifer to search for. /// /// /// A value specifying the encoding /// to use if a new frame is created. /// /// /// A value specifying whether or not to /// create a new frame if an existing frame was not found. /// /// /// A object containing /// the frame found in or added to or /// if no value was found is . /// /// /// To create a frame without having to specify the encoding, /// use . /// /// /// or is /// . /// /// /// is not exactly four bytes long. /// public static TextInformationFrame Get (Tag tag, ByteVector ident, StringType encoding, bool create) { if (tag == null) throw new ArgumentNullException ("tag"); if (ident == null) throw new ArgumentNullException ("ident"); if (ident.Count != 4) throw new ArgumentException ( "Identifier must be four bytes long.", "ident"); foreach (TextInformationFrame frame in tag.GetFrames (ident)) return frame; if (!create) return null; TextInformationFrame new_frame = new TextInformationFrame (ident, encoding); tag.AddFrame (new_frame); return new_frame; } /// /// Gets a object of a /// specified type from a specified tag, optionally creating /// and adding one if none is found. /// /// /// A object to search for the specified /// tag in. /// /// /// A object containing the frame /// identifer to search for. /// /// /// A value specifying whether or not to /// create a new frame if an existing frame was not found. /// /// /// A object containing /// the frame found in or added to or /// if no value was found is . /// /// /// or is /// . /// /// /// is not exactly four bytes long. /// public static TextInformationFrame Get (Tag tag, ByteVector ident, bool create) { return Get (tag, ident, Tag.DefaultEncoding, create); } /// /// Gets a object of a /// specified type from a specified tag. /// /// /// A object to search for the specified /// tag in. /// /// /// A object containing the frame /// identifer to search for. /// /// /// A object containing /// the frame found in or if no value was found. /// /// /// or is /// . /// /// /// is not exactly four bytes long. /// [Obsolete("Use TextInformationFrame.Get(Tag,ByteVector,bool)")] public static TextInformationFrame Get (Tag tag, ByteVector ident) { return Get (tag, ident, false); } #endregion #region Protected Methods /// /// Populates the values in the current instance by parsing /// its field data in a specified version. /// /// /// A object containing the /// extracted field data. /// /// /// A indicating the ID3v2 version the /// field data is encoded in. /// protected override void ParseFields (ByteVector data, byte version) { raw_data = data; raw_version = version; } /// /// Performs the actual parsing of the raw data. /// /// /// Because of the high parsing cost and relatively low usage /// of the class, only stores the /// field data so it can be parsed on demand. Whenever a /// property or method is called which requires the data, /// this method is called, and only on the first call does it /// actually parse the data. /// protected void ParseRawData () { if (raw_data == null) return; ByteVector data = raw_data; raw_data = null; // read the string data type (the first byte of the // field data) encoding = (StringType) data [0]; List field_list = new List (); ByteVector delim = ByteVector.TextDelimiter (encoding); if (raw_version > 3 || FrameId == FrameType.TXXX) { field_list.AddRange (data.ToStrings (encoding, 1)); } else if (data.Count > 1 && !data.Mid (1, delim.Count).Equals (delim)) { string value = data.ToString (encoding, 1, data.Count - 1); // Truncate values containing NULL bytes int null_index = value.IndexOf ('\x00'); if (null_index >= 0) { value = value.Substring (0, null_index); } if (FrameId == FrameType.TCOM || FrameId == FrameType.TEXT || FrameId == FrameType.TOLY || FrameId == FrameType.TOPE || FrameId == FrameType.TPE1 || FrameId == FrameType.TPE2 || FrameId == FrameType.TPE3 || FrameId == FrameType.TPE4) { field_list.AddRange (value.Split ('/')); } else if (FrameId == FrameType.TCON) { while (value.Length > 1 && value [0] == '(') { int closing = value.IndexOf (')'); if (closing < 0) break; string number = value.Substring (1, closing - 1); field_list.Add (number); value = value.Substring ( closing + 1).TrimStart ('/', ' '); string text = Genres.IndexToAudio (number); if (text != null && value.StartsWith (text)) value = value.Substring (text.Length) .TrimStart ('/', ' '); } if (value.Length > 0) field_list.AddRange (value.Split (new char [] {'/'})); } else { field_list.Add (value); } } // Bad tags may have one or more nul characters at the // end of a string, resulting in empty strings at the // end of the FieldList. Strip them off. while (field_list.Count != 0 && string.IsNullOrEmpty (field_list [ field_list.Count - 1])) field_list.RemoveAt (field_list.Count - 1); text_fields = field_list.ToArray (); } /// /// Renders the values in the current instance into field /// data for a specified version. /// /// /// A indicating the ID3v2 version the /// field data is to be encoded in. /// /// /// A object containing the /// rendered field data. /// protected override ByteVector RenderFields (byte version) { if (raw_data != null && raw_version == version) return raw_data; StringType encoding = CorrectEncoding (TextEncoding, version); ByteVector v = new ByteVector ((byte) encoding); string [] text = text_fields; bool txxx = FrameId == FrameType.TXXX; if (version > 3 || txxx) { if (txxx) { if (text.Length == 0) text = new string [] {null, null}; else if (text.Length == 1) text = new string [] {text [0], null}; } for (int i = 0; i < text.Length; i++) { // Since the field list is null // delimited, if this is not the first // element in the list, append the // appropriate delimiter for this // encoding. if (i != 0) v.Add (ByteVector.TextDelimiter ( encoding)); if (text [i] != null) v.Add (ByteVector.FromString ( text [i], encoding)); } } else if (FrameId == FrameType.TCON) { byte id; bool prev_value_indexed = true; StringBuilder data = new StringBuilder (); foreach (string s in text) { if (!prev_value_indexed) { data.Append ("/").Append (s); continue; } if (prev_value_indexed = byte.TryParse (s, out id)) data.AppendFormat ( CultureInfo.InvariantCulture, "({0})", id); else data.Append (s); } v.Add (ByteVector.FromString (data.ToString (), encoding)); } else { v.Add (ByteVector.FromString ( string.Join ("/", text), encoding)); } return v; } #endregion #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to the /// current instance. /// public override Frame Clone () { TextInformationFrame frame = (this is UserTextInformationFrame) ? new UserTextInformationFrame (null, encoding) : new TextInformationFrame (FrameId, encoding); frame.text_fields = (string[]) text_fields.Clone (); if (raw_data != null) frame.raw_data = new ByteVector (raw_data); frame.raw_version = raw_version; return frame; } #endregion } /// /// This class extends to provide /// support for ID3v2 User Text Information (TXXX) Frames. /// public class UserTextInformationFrame : TextInformationFrame { #region Constructors /// /// Constructs and initializes a new instance of with a specified /// description and text encoding. /// /// /// A containing the description of the /// new frame. /// /// /// A containing the text encoding /// to use when rendering the new frame. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more /// integrated frame creation. /// public UserTextInformationFrame (string description, StringType encoding) : base (FrameType.TXXX, encoding) { base.Text = new string [] {description}; } /// /// Constructs and initializes a new instance of with a specified /// description. /// /// /// A containing the description of the /// new frame. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more integrated frame /// creation. /// public UserTextInformationFrame (string description) : base (FrameType.TXXX) { base.Text = new string [] {description}; } /// /// Constructs and initializes a new instance of by reading its raw /// data in a specified ID3v2 version. /// /// /// A object starting with the raw /// representation of the new frame. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// public UserTextInformationFrame (ByteVector data, byte version) : base (data, version) { } /// /// Constructs and initializes a new instance of by reading its raw /// data in a specified ID3v2 version. /// /// /// A object containing the raw /// representation of the new frame. /// /// /// A indicating at what offset in /// the frame actually begins. /// /// /// A containing the header of the /// frame found at in the data. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// protected internal UserTextInformationFrame (ByteVector data, int offset, FrameHeader header, byte version) : base (data, offset, header, version) { } #endregion #region Public Properties /// /// Gets and sets the description stored in the current /// instance. /// /// /// A containing the description /// stored in the current instance. /// /// /// There should only be one frame with a matching /// description per tag. /// public string Description { get { string [] text = base.Text; return text.Length > 0 ? text [0] : null; } set { string [] text = base.Text; if (text.Length > 0) text [0] = value; else text = new string [] {value}; base.Text = text; } } /// /// Gets and sets the text contained in the current /// instance. /// /// /// A containing the text contained /// in the current instance. /// /// /// Modifying the contents of the returned value will /// not modify the contents of the current instance. The /// value must be reassigned for the value to change. /// public override string [] Text { get { string [] text = base.Text; if (text.Length < 2) return new string [0]; string [] new_text = new string [text.Length - 1]; for (int i = 0; i < new_text.Length; i ++) new_text [i] = text [i+1]; return new_text; } set { string [] new_value = new string [ value != null ? (value.Length + 1) : 1]; new_value [0] = Description; for (int i = 1; i < new_value.Length; i ++) new_value [i] = value [i - 1]; base.Text = new_value; } } #endregion #region Public Methods /// /// Gets a string representation of the current instance. /// /// /// A containing the joined text. /// public override string ToString () { return new StringBuilder ().Append ("[") .Append (Description) .Append ("] ") .Append (base.ToString ()).ToString (); } #endregion #region Public Static Methods /// /// Gets a specified user text frame from the specified tag, /// optionally creating it if it does not exist. /// /// /// A object to search in. /// /// /// A specifying the description to /// match. /// /// /// A specifying the encoding to /// use if creating a new frame. /// /// /// A specifying whether or not to create /// and add a new frame to the tag if a match is not found. /// /// /// A object /// containing the matching frame, or /// if a match wasn't found and is /// . /// public static UserTextInformationFrame Get (Tag tag, string description, StringType type, bool create) { if (tag == null) throw new ArgumentNullException ("tag"); if (description == null) throw new ArgumentNullException ("description"); if (description.Length == 0) throw new ArgumentException ( "Description must not be empty.", "description"); foreach (UserTextInformationFrame frame in tag.GetFrames ( FrameType.TXXX)) if (description.Equals (frame.Description)) return frame; if (!create) return null; UserTextInformationFrame new_frame = new UserTextInformationFrame (description, type); tag.AddFrame (new_frame); return new_frame; } /// /// Gets a specified user text frame from the specified tag, /// optionally creating it if it does not exist. /// /// /// A object to search in. /// /// /// A specifying the description to /// match. /// /// /// A specifying whether or not to create /// and add a new frame to the tag if a match is not found. /// /// /// A object /// containing the matching frame, or /// if a match wasn't found and is /// . /// public static UserTextInformationFrame Get (Tag tag, string description, bool create) { return Get (tag, description, Tag.DefaultEncoding, create); } /// /// Gets a specified user text frame from the specified tag. /// /// /// A object to search in. /// /// /// A specifying the description to /// match. /// /// /// A object /// containing the matching frame, or /// if a match wasn't found. /// [Obsolete("Use UserTextInformationFrame.Get(Tag,string,bool)")] public static UserTextInformationFrame Get (Tag tag, string description) { return Get (tag, description, false); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Frames/CommentsFrame.cs0000644000175000017500000003705011462100402025432 0ustar00rubenruben00000000000000// // CommentsFrame.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // id3v2commentsframe.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2002,2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections; using System; namespace TagLib.Id3v2 { /// /// This class extends , implementing support for /// ID3v2 Comments (COMM) Frames. /// /// /// A should be used for storing /// user readable comments on the media file. /// When reading comments from a file, should be used as it gracefully falls back to comments that /// you, as a developer, may not be expecting. When writing comments, /// however, it is best to use as it forces it to /// be written in the exact version you are expecting. /// public class CommentsFrame : Frame { #region Private Fields /// /// Contains the text encoding to use when rendering the /// current instance. /// private StringType encoding = Tag.DefaultEncoding; /// /// Contains the ISO-639-2 language code of the current /// instance. /// private string language = null; /// /// Contains the description of the current instance. /// private string description = null; /// /// Contains the comment text of the current instance. /// private string text = null; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a specified description, /// ISO-639-2 language code, and text encoding. /// /// /// A containing the description of the /// new frame. /// /// /// A containing the ISO-639-2 language /// code of the new frame. /// /// /// A containing the text encoding /// to use when rendering the new frame. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more /// integrated frame creation. /// public CommentsFrame (string description, string language, StringType encoding) : base (FrameType.COMM, 4) { this.encoding = encoding; this.language = language; this.description = description; } /// /// Constructs and initializes a new instance of with a specified description and /// ISO-639-2 language code. /// /// /// A containing the description of the /// new frame. /// /// /// A containing the ISO-639-2 language /// code of the new frame. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more /// integrated frame creation. /// public CommentsFrame (string description, string language) : this (description, language, TagLib.Id3v2.Tag.DefaultEncoding) { } /// /// Constructs and initializes a new instance of with a specified description. /// /// /// A containing the description of the /// new frame. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more /// integrated frame creation. /// public CommentsFrame (string description) : this (description, null) { } /// /// Constructs and initializes a new instance of by reading its raw data in a /// specified ID3v2 version. /// /// /// A object starting with the raw /// representation of the new frame. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// public CommentsFrame (ByteVector data, byte version) : base (data, version) { SetData (data, 0, version, true); } /// /// Constructs and initializes a new instance of by reading its raw data in a /// specified ID3v2 version. /// /// /// A object containing the raw /// representation of the new frame. /// /// /// A indicating at what offset in /// the frame actually begins. /// /// /// A containing the header of the /// frame found at in the data. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// protected internal CommentsFrame (ByteVector data, int offset, FrameHeader header, byte version) : base(header) { SetData (data, offset, version, false); } #endregion #region Public Properties /// /// Gets and sets the text encoding to use when storing the /// current instance. /// /// /// A containing the text encoding to /// use when storing the current instance. /// /// /// This encoding is overridden when rendering if is or the render version does not support /// it. /// public StringType TextEncoding { get {return encoding;} set {encoding = value;} } /// /// Gets and sets the ISO-639-2 language code stored in the /// current instance. /// /// /// A containing the ISO-639-2 language /// code stored in the current instance. /// /// /// There should only be one file with a matching description /// and ISO-639-2 language code per tag. /// public string Language { get { if (language != null && language.Length > 2) return language.Substring (0, 3); return "XXX"; } set {language = value;} } /// /// Gets and sets the description stored in the current /// instance. /// /// /// A containing the description /// stored in the current instance. /// /// /// There should only be one frame with a matching /// description and ISO-639-2 language code per tag. /// public string Description { get { if (description != null) return description; return string.Empty; } set {description = value;} } /// /// Gets and sets the comment text stored in the current /// instance. /// /// /// A containing the comment text /// stored in the current instance. /// public string Text { get { if (text != null) return text; return string.Empty; } set {text = value;} } #endregion #region Public Methods /// /// Gets a string representation of the current instance. /// /// /// A containing the comment text. /// public override string ToString () { return Text; } #endregion #region Public Static Methods /// /// Gets a specified comments frame from the specified tag, /// optionally creating it if it does not exist. /// /// /// A object to search in. /// /// /// A specifying the description to /// match. /// /// /// A specifying the ISO-639-2 language /// code to match. /// /// /// A specifying whether or not to create /// and add a new frame to the tag if a match is not found. /// /// /// A object containing the /// matching frame, or if a match /// wasn't found and is . /// public static CommentsFrame Get (Tag tag, string description, string language, bool create) { CommentsFrame comm; foreach (Frame frame in tag.GetFrames (FrameType.COMM)) { comm = frame as CommentsFrame; if (comm == null) continue; if (comm.Description != description) continue; if (language != null && language != comm.Language) continue; return comm; } if (!create) return null; comm = new CommentsFrame (description, language); tag.AddFrame (comm); return comm; } /// /// Gets a specified comments frame from the specified tag, /// trying to to match the description and language but /// accepting an incomplete match. /// /// /// A object to search in. /// /// /// A specifying the description to /// match. /// /// /// A specifying the ISO-639-2 language /// code to match. /// /// /// A object containing the /// matching frame, or if a match /// wasn't found. /// /// /// The method tries matching with the following order /// of precidence: /// /// The first frame with a matching /// description and language. /// The first frame with a matching /// language. /// The first frame with a matching /// description. /// The first frame. /// /// public static CommentsFrame GetPreferred (Tag tag, string description, string language) { // This is weird, so bear with me. The best thing we can // have is something straightforward and in our own // language. If it has a description, then it is // probably used for something other than an actual // comment. If that doesn't work, we'd still rather have // something in our language than something in another. // After that all we have left are things in other // languages, so we'd rather have one with actual // content, so we try to get one with no description // first. bool skip_itunes = description == null || !description.StartsWith ("iTun"); int best_value = -1; CommentsFrame best_frame = null; foreach (Frame frame in tag.GetFrames (FrameType.COMM)) { CommentsFrame comm = frame as CommentsFrame; if (comm == null) continue; if (skip_itunes && comm.Description.StartsWith ("iTun")) continue; bool same_name = comm.Description == description; bool same_lang = comm.Language == language; if (same_name && same_lang) return comm; int value = same_lang ? 2 : same_name ? 1 : 0; if (value <= best_value) continue; best_value = value; best_frame = comm; } return best_frame; } #endregion #region Protected Methods /// /// Populates the values in the current instance by parsing /// its field data in a specified version. /// /// /// A object containing the /// extracted field data. /// /// /// A indicating the ID3v2 version the /// field data is encoded in. /// protected override void ParseFields (ByteVector data, byte version) { if (data.Count < 4) throw new CorruptFileException ( "Not enough bytes in field."); encoding = (StringType) data [0]; language = data.ToString (StringType.Latin1, 1, 3); // Instead of splitting into two string, in the format // [{desc}\0{value}], try splitting into three strings // in case of a misformatted [{desc}\0{value}\0]. string [] split = data.ToStrings (encoding, 4, 3); if (split.Length == 0) { // No data in the frame. description = String.Empty; text = String.Empty; } else if (split.Length == 1) { // Bad comment frame. Assume that it lacks a // description. description = String.Empty; text = split [0]; } else { description = split [0]; text = split [1]; } } /// /// Renders the values in the current instance into field /// data for a specified version. /// /// /// A indicating the ID3v2 version the /// field data is to be encoded in. /// /// /// A object containing the /// rendered field data. /// protected override ByteVector RenderFields (byte version) { StringType encoding = CorrectEncoding (TextEncoding, version); ByteVector v = new ByteVector (); v.Add ((byte) encoding); v.Add (ByteVector.FromString (Language, StringType.Latin1)); v.Add (ByteVector.FromString (description, encoding)); v.Add (ByteVector.TextDelimiter (encoding)); v.Add (ByteVector.FromString (text, encoding)); return v; } #endregion #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to the /// current instance. /// public override Frame Clone () { CommentsFrame frame = new CommentsFrame (description, language, encoding); frame.text = text; return frame; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Frames/RelativeVolumeFrame.cs0000644000175000017500000004020111462100402026600 0ustar00rubenruben00000000000000// // RelativeVolumeFrame.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // textidentificationframe.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2004 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections; using System.Collections.Generic; using System; namespace TagLib.Id3v2 { /// /// Specified the type of channel data to get from or set to a /// object. /// public enum ChannelType { /// /// The channel data is for some other speaker. /// Other = 0x00, /// /// The channel data is for the master volume. /// MasterVolume = 0x01, /// /// The channel data is for the front right speaker. /// FrontRight = 0x02, /// /// The channel data is for the front left speaker. /// FrontLeft = 0x03, /// /// The channel data is for the back right speaker. /// BackRight = 0x04, /// /// The channel data is for the back left speaker. /// BackLeft = 0x05, /// /// The channel data is for the front center speaker. /// FrontCentre = 0x06, /// /// The channel data is for the back center speaker. /// BackCentre = 0x07, /// /// The channel data is for the subwoofer. /// Subwoofer = 0x08 } /// /// This class extends , implementing support for /// ID3v2 Relative Volume (RVA2) Frames. /// public class RelativeVolumeFrame : Frame { #region Private Fields /// /// Contains the frame identification. /// private string identification = null; /// /// Contains the channel data. /// private ChannelData [] channels = new ChannelData [9]; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a specified /// identifier. /// /// /// A object containing the /// identification to use for the new frame. /// public RelativeVolumeFrame (string identification) : base (FrameType.RVA2, 4) { this.identification = identification; } /// /// Constructs and initializes a new instance of by reading its raw data in /// a specified ID3v2 version. /// /// /// A object starting with the raw /// representation of the new frame. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// public RelativeVolumeFrame (ByteVector data, byte version) : base (data, version) { SetData (data, 0, version, true); } /// /// Constructs and initializes a new instance of by reading its raw data in /// a specified ID3v2 version. /// /// /// A object containing the raw /// representation of the new frame. /// /// /// A indicating at what offset in /// the frame actually begins. /// /// /// A containing the header of the /// frame found at in the data. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// protected internal RelativeVolumeFrame (ByteVector data, int offset, FrameHeader header, byte version) : base(header) { SetData (data, offset, version, false); } #endregion #region Public Properties /// /// Gets the identification used for the current instance. /// /// /// A object containing the /// identification used for the current instance. /// public string Identification { get {return identification;} } /// /// Gets a list of the channels in the current instance that /// contain a value. /// /// /// A containing the channels /// which have a value set in the current instance. /// public ChannelType [] Channels { get { List types = new List (); for (int i = 0; i < 9; i ++) if (channels [i].IsSet) types.Add ((ChannelType) i); return types.ToArray (); } } #endregion #region Public Methods /// /// Creates a text description of the current instance. /// /// /// A object containing a description /// of the current instance. /// public override string ToString () { return identification; } /// /// Gets the volume adjustment index for a specified channel. /// /// /// A value specifying which /// channel to get the value for. /// /// /// A value containing the volume /// adjustment index. /// /// /// The volume adjustment index is simply the volume /// adjustment multiplied by 512. /// /// /// public short GetVolumeAdjustmentIndex (ChannelType type) { return channels [(int) type].VolumeAdjustmentIndex; } /// /// Sets the volume adjustment index for a specified channel. /// /// /// A value specifying which /// channel to set the value for. /// /// /// A value containing the volume /// adjustment index. /// /// /// public void SetVolumeAdjustmentIndex (ChannelType type, short index) { channels [(int) type].VolumeAdjustmentIndex = index; } /// /// Gets the volume adjustment for a specified channel. /// /// /// A value specifying which /// channel to get the value for. /// /// /// A value containing the volume /// adjustment in decibles. /// /// /// The value can be between -64dB and +64dB. /// /// /// public float GetVolumeAdjustment (ChannelType type) { return channels [(int) type].VolumeAdjustment; } /// /// Sets the volume adjustment for a specified channel. /// /// /// A value specifying which /// channel to set the value for. /// /// /// A value containing the volume /// adjustment in decibles. /// /// /// The value can be between -64dB and +64dB. /// /// /// public void SetVolumeAdjustment (ChannelType type, float adjustment) { channels [(int) type].VolumeAdjustment = adjustment; } /// /// Gets the peak volume index for a specified channel. /// /// /// A value specifying which /// channel to get the value for. /// /// /// A value containing the peak volume /// index. /// /// /// The peak volume index is simply the peak volume /// multiplied by 512. /// /// /// public ulong GetPeakVolumeIndex (ChannelType type) { return channels [(int) type].PeakVolumeIndex; } /// /// Sets the peak volume index for a specified channel. /// /// /// A value specifying which /// channel to set the value for. /// /// /// A value containing the peak volume /// index. /// /// /// The peak volume index is simply the peak volume /// multiplied by 512. /// /// /// public void SetPeakVolumeIndex (ChannelType type, ulong index) { channels [(int) type].PeakVolumeIndex = index; } /// /// Gets the peak volume for a specified channel. /// /// /// A value specifying which /// channel to get the value for. /// /// /// A value containing the peak volume. /// /// /// public double GetPeakVolume (ChannelType type) { return channels [(int) type].PeakVolume; } /// /// Sets the peak volume for a specified channel. /// /// /// A value specifying which /// channel to set the value for. /// /// /// A value containing the peak volume. /// /// /// public void SetPeakVolume (ChannelType type, double peak) { channels [(int) type].PeakVolume = peak; } #endregion #region Public Static Methods /// /// Gets a specified volume adjustment frame from the /// specified tag, optionally creating it if it does not /// exist. /// /// /// A object to search in. /// /// /// A specifying the identification to /// match. /// /// /// A specifying whether or not to create /// and add a new frame to the tag if a match is not found. /// /// /// A object containing /// the matching frame, or if a match /// wasn't found and is . /// public static RelativeVolumeFrame Get (Tag tag, string identification, bool create) { RelativeVolumeFrame rva2; foreach (Frame frame in tag.GetFrames (FrameType.RVA2)) { rva2 = frame as RelativeVolumeFrame; if (rva2 == null) continue; if (rva2.Identification != identification) continue; return rva2; } if (!create) return null; rva2 = new RelativeVolumeFrame (identification); tag.AddFrame (rva2); return rva2; } #endregion #region Protected Properties /// /// Populates the values in the current instance by parsing /// its field data in a specified version. /// /// /// A object containing the /// extracted field data. /// /// /// A indicating the ID3v2 version the /// field data is encoded in. /// /// /// contains less than 5 bytes. /// protected override void ParseFields (ByteVector data, byte version) { int pos = data.Find (ByteVector.TextDelimiter ( StringType.Latin1)); if (pos < 0) return; identification = data.ToString (StringType.Latin1, 0, pos++); // Each channel is at least 4 bytes. while (pos <= data.Count - 4) { int type = data [pos++]; unchecked { channels [type].VolumeAdjustmentIndex = (short) data.Mid (pos, 2).ToUShort (); } pos += 2; int bytes = BitsToBytes (data [pos++]); if (data.Count < pos + bytes) break; channels [type].PeakVolumeIndex = data.Mid (pos, bytes).ToULong (); pos += bytes; } } /// /// Renders the values in the current instance into field /// data for a specified version. /// /// /// A indicating the ID3v2 version the /// field data is to be encoded in. /// /// /// A object containing the /// rendered field data. /// protected override ByteVector RenderFields (byte version) { ByteVector data = new ByteVector (); data.Add (ByteVector.FromString (identification, StringType.Latin1)); data.Add (ByteVector.TextDelimiter(StringType.Latin1)); for (byte i = 0; i < 9; i ++) { if (!channels [i].IsSet) continue; data.Add (i); unchecked { data.Add (ByteVector.FromUShort ( (ushort) channels [i] .VolumeAdjustmentIndex)); } byte bits = 0; for (byte j = 0; j < 64; j ++) if ((channels [i].PeakVolumeIndex & (1UL << j)) != 0) bits = (byte)(j + 1); data.Add (bits); if (bits > 0) data.Add (ByteVector.FromULong ( channels [i].PeakVolumeIndex) .Mid (8 - BitsToBytes (bits))); } return data; } #endregion #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to the /// current instance. /// public override Frame Clone () { RelativeVolumeFrame frame = new RelativeVolumeFrame (identification); for (int i = 0; i < 9; i ++) frame.channels [i] = channels [i]; return frame; } #endregion #region Private Static Methods private static int BitsToBytes (int i) { return i % 8 == 0 ? i / 8 : (i - i % 8) / 8 + 1; } #endregion #region Classes private struct ChannelData { public short VolumeAdjustmentIndex; public ulong PeakVolumeIndex; public bool IsSet { get { return VolumeAdjustmentIndex != 0 || PeakVolumeIndex != 0; } } public float VolumeAdjustment { get {return VolumeAdjustmentIndex / 512f;} set { VolumeAdjustmentIndex = (short) (value * 512f); } } public double PeakVolume { get {return PeakVolumeIndex / 512.0;} set {PeakVolumeIndex = (ulong) (value * 512.0);} } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Frames/PlayCountFrame.cs0000644000175000017500000002427511462100402025570 0ustar00rubenruben00000000000000// // PlayCountFrame.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace TagLib.Id3v2 { /// /// This class extends , implementing support for /// ID3v2 Play Count (PCNT) Frames. /// /// /// Getting and incrementing the play count of a file. /// /// using TagLib; /// using TagLib.Id3v2; /// /// public static class TrackUtil /// { /// public static int GetPlayCount (string filename) /// { /// File file = File.Create (filename, ReadStyle.None); /// Id3v2.Tag tag = file.GetTag (TagTypes.Id3v2, false) as Id3v2.Tag; /// if (tag == null) /// return 0; /// /// PlayCountFrame frame = PlayCountFrame.Get (tag, false); /// if (frame == null) /// return 0; /// /// return frame.PlayCount; /// } /// /// public static void IncrementPlayCount (string filename) /// { /// File file = File.Create (filename, ReadStyle.None); /// Id3v2.Tag tag = file.GetTag (TagTypes.Id3v2, true) as Id3v2.Tag; /// if (tag == null) /// return; /// /// PlayCountFrame.Get (tag, true).PlayCount ++; /// file.Save (); /// } /// } /// /// /// #using <System.dll> /// #using <taglib-sharp.dll> /// /// using System; /// using TagLib; /// using TagLib::Id3v2; /// /// public ref class TrackUtil abstract sealed /// { /// public: /// static int GetPlayCount (String^ filename) /// { /// File^ file = File.Create (filename, ReadStyle.None); /// Id3v2::Tag^ tag = dynamic_cast<Id3v2::Tag^> (file.GetTag (TagTypes::Id3v2, false)); /// if (tag == null) /// return 0; /// /// PlayCountFrame^ frame = PlayCountFrame::Get (tag, false); /// if (frame == null) /// return 0; /// /// return frame->PlayCount; /// } /// /// static void IncrementPlayCount (String^ filename) /// { /// File^ file = File::Create (filename, ReadStyle::None); /// Id3v2.Tag^ tag = dynamic_cast<Id3v2::Tag^> (file.GetTag (TagTypes::Id3v2, true)); /// if (tag == null) /// return; /// /// PlayCountFrame::Get (tag, true)->PlayCount ++; /// file->Save (); /// } /// } /// /// /// Imports TagLib /// Imports TagLib.Id3v2 /// /// Public Shared Class TrackUtil /// Public Shared Sub GetPlayCount (filename As String) As Integer /// Dim file As File = File.Create (filename, ReadStyle.None) /// Dim tag As Id3v2.Tag = file.GetTag (TagTypes.Id3v2, False) /// If tag Is Nothing Then Return 0 /// /// Dim frame As PlayCountFrame = PlayCountFrame.Get (tag, False) /// If frame Is Nothing Then Return 0 /// /// Return frame.PlayCount /// End Sub /// /// Public Shared Sub IncrementPlayCount (filename As String) /// Dim file As File = File.Create (filename, ReadStyle.None) /// Dim tag As Id3v2.Tag = file.GetTag (TagTypes.Id3v2, True) /// If tag Is Nothing Then Exit Sub /// /// PlayCountFrame.Get (tag, True).PlayCount += 1 /// file.Save () /// End Sub /// End Class /// /// /// import TagLib /// import TagLib.Id3v2 /// /// public static class TrackUtil: /// static def GetPlayCount (filename as string) as int: /// file As File = File.Create (filename, ReadStyle.None) /// tag as Id3v2.Tag = file.GetTag (TagTypes.Id3v2, false) /// if tag == null: /// return 0 /// /// frame as PlayCountFrame = PlayCountFrame.Get (tag, false) /// if frame == null: /// return 0 /// /// return frame.PlayCount /// /// static def IncrementPlayCount (filename as string): /// file as File = File.Create (filename, ReadStyle.None) /// tag as Id3v2.Tag = file.GetTag (TagTypes.Id3v2, True) /// if tag == null: /// return /// /// PlayCountFrame.Get (tag, true).PlayCount ++ /// file.Save () /// /// public class PlayCountFrame : Frame { #region Private Properties /// /// Contains the total number of times the file has been /// played. /// private ulong play_count = 0; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a count of zero. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more /// integrated frame creation. /// public PlayCountFrame () : base (FrameType.PCNT, 4) { } /// /// Constructs and initializes a new instance of by reading its raw data in a /// specified ID3v2 version. /// /// /// A object starting with the raw /// representation of the new frame. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// public PlayCountFrame (ByteVector data, byte version) : base (data, version) { SetData (data, 0, version, true); } /// /// Constructs and initializes a new instance of by reading its raw data in a /// specified ID3v2 version. /// /// /// A object containing the raw /// representation of the new frame. /// /// /// A indicating at what offset in /// the frame actually begins. /// /// /// A containing the header of the /// frame found at in the data. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// protected internal PlayCountFrame (ByteVector data, int offset, FrameHeader header, byte version) : base(header) { SetData (data, offset, version, false); } #endregion #region Public Properties /// /// Gets and sets the play count of the current instance. /// /// /// A containing the play count of the /// current instance. /// public ulong PlayCount { get {return play_count;} set {play_count = value;} } #endregion #region Public Static Methods /// /// Gets a play count frame from a specified tag, optionally /// creating it if it does not exist. /// /// /// A object to search in. /// /// /// A specifying whether or not to create /// and add a new frame to the tag if a match is not found. /// /// /// A object containing the /// matching frame, or if a match /// wasn't found and is . /// public static PlayCountFrame Get (Tag tag, bool create) { PlayCountFrame pcnt; foreach (Frame frame in tag) { pcnt = frame as PlayCountFrame; if (pcnt != null) return pcnt; } if (!create) return null; pcnt = new PlayCountFrame (); tag.AddFrame (pcnt); return pcnt; } #endregion #region Protected Methods /// /// Populates the values in the current instance by parsing /// its field data in a specified version. /// /// /// A object containing the /// extracted field data. /// /// /// A indicating the ID3v2 version the /// field data is encoded in. /// protected override void ParseFields (ByteVector data, byte version) { play_count = data.ToULong (); } /// /// Renders the values in the current instance into field /// data for a specified version. /// /// /// A indicating the ID3v2 version the /// field data is to be encoded in. /// /// /// A object containing the /// rendered field data. /// protected override ByteVector RenderFields (byte version) { ByteVector data = ByteVector.FromULong (play_count); while (data.Count > 4 && data [0] == 0) data.RemoveAt (0); return data; } #endregion #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to the /// current instance. /// public override Frame Clone () { PlayCountFrame frame = new PlayCountFrame (); frame.play_count = play_count; return frame; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Frames/PrivateFrame.cs0000644000175000017500000003176711462100402025270 0ustar00rubenruben00000000000000// // PrivateFrame.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2005-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections; using System; namespace TagLib.Id3v2 { /// /// This class extends , implementing support for /// ID3v2 Private (PRIV) Frames. /// /// /// A should be used for storing /// values specific to the application that cannot or should not be /// stored in another frame type. /// /// /// Serializing a database entry and storing it in a private /// field. /// /// using System; /// using System.IO; /// using System.Runtime.Serialization; /// using System.Text; /// using System.Xml.Serialization; /// using TagLib.Id3v2; /// /// public static class DbUtil /// { /// public static void StoreDatabaseEntry (Tag tag, ISerializable dbEntry) /// { /// StringWriter data = new StringWriter (new StringBuilder ()); /// XmlSerializer serializer = new XmlSerializer (dbEntry.GetType ()); /// serializer.Serialize (data, dbEntry); /// PrivateFrame frame = PrivateFrame.Get (tag, "org.MyProgram.DatabaseEntry", true); /// frame.PrivateData = Encoding.UTF8.GetBytes (data.ToString ()); /// } /// /// public static object GetDatabaseEntry (Tag tag, Type type) /// { /// PrivateFrame frame = PrivateFrame.Get (tag, "org.MyProgram.DatabaseEntry", false); /// if (frame == null) /// return null; /// /// XmlSerializer serializer = new XmlSerializer (type); /// return serializer.Deserialize (new MemoryStream (frame.PrivateData)); /// } /// } /// /// /// #using <System.dll> /// #using <System.Xml.dll> /// #using <taglib-sharp.dll> /// /// using System; /// using System::IO; /// using System::Runtime::Serialization; /// using System::Text; /// using System::Xml::Serialization; /// using TagLib::Id3v2; /// /// public ref class DbUtil abstract sealed /// { /// public: /// static void StoreDatabaseEntry (Tag^ tag, ISerializable^ dbEntry) /// { /// StringWriter^ data = gcnew StringWriter (gcnew StringBuilder); /// XmlSerializer serializer = gcnew XmlSerializer (dbEntry->GetType ()); /// serializer->Serialize (data, dbEntry); /// PrivateFrame frame = PrivateFrame::Get (tag, L"org.MyProgram.DatabaseEntry", true); /// frame.PrivateData = Encoding::UTF8->GetBytes (data->ToString ()); /// } /// /// static Object^ GetDatabaseEntry (Tag^ tag, Type^ type) /// { /// PrivateFrame^ frame = PrivateFrame::Get (tag, L"org.MyProgram.DatabaseEntry", false); /// if (frame == null) /// return null; /// /// XmlSerializer serializer = gcnew XmlSerializer (type); /// return serializer->Deserialize (gcnew MemoryStream (frame->PrivateData)); /// } /// } /// /// /// Imports System /// Imports System.IO /// Imports System.Runtime.Serialization /// Imports System.Text /// Imports System.Xml.Serialization /// Imports TagLib.Id3v2 /// /// Public Shared Class DbUtil /// Public Shared Sub StoreDatabaseEntry (tag As Tag, dbEntry As ISerializable) /// Dim data As New StringWriter (New StringBuilder ()) /// Dim serializer As New XmlSerializer (dbEntry.GetType ()) /// serializer.Serialize (data, dbEntry) /// Dim frame As PrivateFrame = PrivateFrame.Get (tag, "org.MyProgram.DatabaseEntry", True) /// frame.PrivateData = Encoding.UTF8.GetBytes (data.ToString ()) /// End Sub /// /// Public Shared Sub GetDatabaseEntry (tag As Tag, type As Type) /// Dim frame As PrivateFrame = PrivateFrame.Get (tag, "org.MyProgram.DatabaseEntry", False) /// If frame Is Nothing Then Return Nothing /// /// Dim serializer As XmlSerializer = New XmlSerializer (type) /// Return serializer.Deserialize (New MemoryStream (frame.PrivateData)) /// End Sub /// End Class /// /// /// import System /// import System.IO /// import System.Runtime.Serialization /// import System.Text /// import System.Xml.Serialization /// import TagLib.Id3v2 /// /// public static class DbUtil: /// static def StoreDatabaseEntry (tag as Tag, dbEntry as ISerializable): /// data as StringWriter = StringWriter (StringBuilder ()) /// serializer as XmlSerializer = XmlSerializer (dbEntry.GetType ()) /// serializer.Serialize (data, dbEntry) /// frame as PrivateFrame = PrivateFrame.Get (tag, "org.MyProgram.DatabaseEntry", true) /// frame.PrivateData = Encoding.UTF8.GetBytes (data.ToString ()) /// /// static def GetDatabaseEntry (tag As Tag, type As Type): /// frame as PrivateFrame = PrivateFrame.Get (tag, "org.MyProgram.DatabaseEntry", false) /// if frame == null: /// return null /// /// serializer as XmlSerializer = XmlSerializer (type) /// return serializer.Deserialize (MemoryStream (frame.PrivateData)) /// /// public class PrivateFrame : Frame { #region Private Properties /// /// Contains the owner of the current instance. /// private string owner = null; /// /// Contains private data stored in the current instance. /// private ByteVector data = null; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified owner and data. /// /// /// A containing the owner of the new /// frame. /// /// /// A object containing the data /// for the new frame. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more /// integrated frame creation. /// public PrivateFrame (string owner, ByteVector data) : base (FrameType.PRIV, 4) { this.owner = owner; this.data = data; } /// /// Constructs and initializes a new instance of without data for a specified /// owner. /// /// /// A containing the owner of the new /// frame. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more /// integrated frame creation. /// public PrivateFrame (string owner) : this (owner, null) { } /// /// Constructs and initializes a new instance of by reading its raw data in a /// specified ID3v2 version. /// /// /// A object starting with the raw /// representation of the new frame. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// public PrivateFrame (ByteVector data, byte version) : base (data, version) { SetData (data, 0, version, true); } /// /// Constructs and initializes a new instance of by reading its raw data in a /// specified ID3v2 version. /// /// /// A object containing the raw /// representation of the new frame. /// /// /// A indicating at what offset in /// the frame actually begins. /// /// /// A containing the header of the /// frame found at in the data. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// protected internal PrivateFrame (ByteVector data, int offset, FrameHeader header, byte version) : base(header) { SetData (data, offset, version, false); } #endregion #region Public Properties /// /// Gets the owner of the current instance. /// /// /// A containing the owner of the /// current instance. /// /// /// There should only be one frame with a given owner per /// tag. /// public string Owner { get {return owner;} } /// /// Gets and sets the private data stored in the current /// instance. /// /// /// A containing the private data /// stored in the current instance. /// public ByteVector PrivateData { get {return data;} set {data = value;} } #endregion #region Public Static Methods /// /// Gets a specified private frame from the specified tag, /// optionally creating it if it does not exist. /// /// /// A object to search in. /// /// /// A specifying the owner to match. /// /// /// A specifying whether or not to create /// and add a new frame to the tag if a match is not found. /// /// /// A object containing the /// matching frame, or if a match /// wasn't found and is . /// public static PrivateFrame Get (Tag tag, string owner, bool create) { PrivateFrame priv; foreach (Frame frame in tag.GetFrames (FrameType.PRIV)) { priv = frame as PrivateFrame; if (priv != null && priv.Owner == owner) return priv; } if (!create) return null; priv = new PrivateFrame (owner); tag.AddFrame (priv); return priv; } #endregion #region Protected Methods /// /// Populates the values in the current instance by parsing /// its field data in a specified version. /// /// /// A object containing the /// extracted field data. /// /// /// A indicating the ID3v2 version the /// field data is encoded in. /// protected override void ParseFields (ByteVector data, byte version) { if (data.Count < 1) throw new CorruptFileException ( "A private frame must contain at least 1 byte."); ByteVectorCollection l = ByteVectorCollection.Split ( data, ByteVector.TextDelimiter (StringType.Latin1), 1, 2); if (l.Count == 2) { this.owner = l [0].ToString (StringType.Latin1); this.data = l [1]; } } /// /// Renders the values in the current instance into field /// data for a specified version. /// /// /// A indicating the ID3v2 version the /// field data is to be encoded in. /// /// /// A object containing the /// rendered field data. /// /// /// is less than 3. ID3v2.2 does /// not support this frame. /// protected override ByteVector RenderFields (byte version) { if (version < 3) throw new NotImplementedException (); ByteVector v = new ByteVector (); v.Add (ByteVector.FromString (owner, StringType.Latin1)); v.Add (ByteVector.TextDelimiter (StringType.Latin1)); v.Add (data); return v; } #endregion #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to the /// current instance. /// public override Frame Clone () { PrivateFrame frame = new PrivateFrame (owner); if (data != null) frame.data = new ByteVector (data); return frame; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Frames/UniqueFileIdentifierFrame.cs0000644000175000017500000002211411462100402027711 0ustar00rubenruben00000000000000// // UniqueFileIdentifierFrame.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // uniquefileidentifierframe.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2004 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections; using System; namespace TagLib.Id3v2 { /// /// This class extends , implementing support for /// ID3v2 Unique File Identifier (UFID) Frames. /// public class UniqueFileIdentifierFrame : Frame { #region Private Fields /// /// Contains the owner string. /// private string owner = null; /// /// Contains the identifier data. /// private ByteVector identifier = null; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a specified /// owner and identifier data. /// /// /// A containing the owner of the new /// frame. /// /// /// A object containing the /// identifier for the new frame. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more integrated frame /// creation. /// /// /// is . /// public UniqueFileIdentifierFrame (string owner, ByteVector identifier) : base (FrameType.UFID, 4) { if (owner == null) throw new ArgumentNullException ("owner"); this.owner = owner; this.identifier = identifier; } /// /// Constructs and initializes a new instance of with a specified /// owner. /// /// /// A containing the owner of the new /// frame. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more integrated frame /// creation. /// /// /// is . /// public UniqueFileIdentifierFrame (string owner) : this (owner, null) { } /// /// Constructs and initializes a new instance of by reading its raw /// data in a specified ID3v2 version. /// /// /// A object starting with the raw /// representation of the new frame. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// public UniqueFileIdentifierFrame (ByteVector data, byte version) : base (data, version) { SetData (data, 0, version, true); } /// /// Constructs and initializes a new instance of by reading its raw /// data in a specified ID3v2 version. /// /// /// A object containing the raw /// representation of the new frame. /// /// /// A indicating at what offset in /// the frame actually begins. /// /// /// A containing the header of the /// frame found at in the data. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// protected internal UniqueFileIdentifierFrame (ByteVector data, int offset, FrameHeader header, byte version) : base(header) { SetData (data, offset, version, false); } #endregion #region Public Properties /// /// Gets and sets the owner of the current instance. /// /// /// A containing the owner of the /// current instance. /// /// /// There should only be one frame with a matching owner per /// tag. /// public string Owner { get {return owner;} } /// /// Gets and sets the identifier data stored in the current /// instance. /// /// /// A object containiner the unique /// file identifier frame. /// public ByteVector Identifier { get {return identifier;} set {identifier = value;} } #endregion #region Public Static Methods /// /// Gets a specified unique file identifer frame from the /// specified tag, optionally creating it if it does not /// exist. /// /// /// A object to search in. /// /// /// A specifying the owner to match. /// /// /// A specifying whether or not to create /// and add a new frame to the tag if a match is not found. /// /// /// A object /// containing the matching frame, or /// if a match wasn't found and is /// . /// public static UniqueFileIdentifierFrame Get (Tag tag, string owner, bool create) { UniqueFileIdentifierFrame ufid; foreach (Frame frame in tag.GetFrames (FrameType.UFID)) { ufid = frame as UniqueFileIdentifierFrame; if (ufid == null) continue; if (ufid.Owner == owner) return ufid; } if (!create) return null; ufid = new UniqueFileIdentifierFrame (owner, null); tag.AddFrame (ufid); return ufid; } #endregion #region Protected Methods /// /// Populates the values in the current instance by parsing /// its field data in a specified version. /// /// /// A object containing the /// extracted field data. /// /// /// A indicating the ID3v2 version the /// field data is encoded in. /// protected override void ParseFields (ByteVector data, byte version) { ByteVectorCollection fields = ByteVectorCollection.Split (data, (byte) 0); if (fields.Count != 2) return; owner = fields [0].ToString (StringType.Latin1); identifier = fields [1]; } /// /// Renders the values in the current instance into field /// data for a specified version. /// /// /// A indicating the ID3v2 version the /// field data is to be encoded in. /// /// /// A object containing the /// rendered field data. /// protected override ByteVector RenderFields (byte version) { ByteVector data = new ByteVector (); data.Add (ByteVector.FromString (owner, StringType.Latin1)); data.Add (ByteVector.TextDelimiter (StringType.Latin1)); data.Add (identifier); return data; } #endregion #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to the /// current instance. /// public override Frame Clone () { UniqueFileIdentifierFrame frame = new UniqueFileIdentifierFrame (owner); if (identifier != null) frame.identifier = new ByteVector (identifier); return frame; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Frames/PopularimeterFrame.cs0000644000175000017500000002057611462100402026502 0ustar00rubenruben00000000000000// // PopularimeterFrame.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace TagLib.Id3v2 { /// /// This class extends , implementing support for /// ID3v2 Popularimeter (POPM) Frames. /// public class PopularimeterFrame : Frame { #region Private Properties /// /// Contains the email of the user this frame belongs to. /// private string user = string.Empty; /// /// Contains the rating of the files from 0 to 255. /// private byte rating = 0; /// /// Contains the number of times this file has been played. /// private ulong play_count = 0; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified user with a /// rating and play count of zero. /// /// /// When a frame is created, it is not automatically added to /// the tag. Consider using for more /// integrated frame creation. /// public PopularimeterFrame (string user) : base (FrameType.POPM, 4) { User = user; } /// /// Constructs and initializes a new instance of by reading its raw data in a /// specified ID3v2 version. /// /// /// A object starting with the raw /// representation of the new frame. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// public PopularimeterFrame (ByteVector data, byte version) : base (data, version) { SetData (data, 0, version, true); } /// /// Constructs and initializes a new instance of by reading its raw data in a /// specified ID3v2 version. /// /// /// A object containing the raw /// representation of the new frame. /// /// /// A indicating at what offset in /// the frame actually begins. /// /// /// A containing the header of the /// frame found at in the data. /// /// /// A indicating the ID3v2 version the /// raw frame is encoded in. /// protected internal PopularimeterFrame (ByteVector data, int offset, FrameHeader header, byte version) : base (header) { SetData (data, offset, version, false); } #endregion #region Public Properties /// /// Gets and sets the user to whom the current instance /// belongs. /// /// /// A containing the user to whom the /// current instance belongs. /// public string User { get {return user;} set {user = value != null ? value : string.Empty;} } /// /// Gets and sets the rating of the current instance. /// /// /// A containing the rating of the /// current instance. /// public byte Rating { get {return rating;} set {rating = value;} } /// /// Gets and sets the play count of the current instance. /// /// /// A containing the play count of the /// current instance. /// public ulong PlayCount { get {return play_count;} set {play_count = value;} } #endregion #region Public Static Methods /// /// Gets a popularimeter frame from a specified tag, /// optionally creating it if it does not exist. /// /// /// A object to search in. /// /// /// A containing the user to search for /// in the current instance. /// /// /// A specifying whether or not to create /// and add a new frame to the tag if a match is not found. /// /// /// A object containing the /// matching frame, or if a match /// wasn't found and is . /// public static PopularimeterFrame Get (Tag tag, string user, bool create) { PopularimeterFrame popm; foreach (Frame frame in tag) { popm = frame as PopularimeterFrame; if (popm != null && popm.user.Equals (user)) return popm; } if (!create) return null; popm = new PopularimeterFrame (user); tag.AddFrame (popm); return popm; } #endregion #region Protected Methods /// /// Populates the values in the current instance by parsing /// its field data in a specified version. /// /// /// A object containing the /// extracted field data. /// /// /// A indicating the ID3v2 version the /// field data is encoded in. /// protected override void ParseFields (ByteVector data, byte version) { ByteVector delim = ByteVector.TextDelimiter ( StringType.Latin1); int index = data.Find (delim); if (index < 0) throw new CorruptFileException ( "Popularimeter frame does not contain a text delimiter"); user = data.ToString (StringType.Latin1, 0, index); rating = data [index + 1]; play_count = data.Mid (index + 2).ToULong (); } /// /// Renders the values in the current instance into field /// data for a specified version. /// /// /// A indicating the ID3v2 version the /// field data is to be encoded in. /// /// /// A object containing the /// rendered field data. /// protected override ByteVector RenderFields (byte version) { ByteVector data = ByteVector.FromULong (play_count); while (data.Count > 0 && data [0] == 0) data.RemoveAt (0); data.Insert (0, rating); data.Insert (0, 0); data.Insert (0, ByteVector.FromString (user, StringType.Latin1)); return data; } #endregion #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to the /// current instance. /// public override Frame Clone () { PopularimeterFrame frame = new PopularimeterFrame (user); frame.play_count = play_count; frame.rating = rating; return frame; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/FrameFactory.cs0000644000175000017500000002232211462100402024033 0ustar00rubenruben00000000000000// // FrameFactory.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // id3v2framefactory.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2002,2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections.Generic; namespace TagLib.Id3v2 { /// /// This static class performs the necessary operations to determine /// and create the correct child class of for a /// given raw ID3v2 frame. /// /// /// By default, will only load frames /// contained in the library. To add additional frames to the /// process, register a frame creator with . /// public static class FrameFactory { /// /// Creates a frame from a specified block of data, or /// returns if unsupported. /// /// /// A object containing a raw ID3v2 /// frame. /// /// /// A value specifying the offset in /// at which the frame data begins. /// /// /// A object for the frame /// contained in . /// /// /// A specifying the version of ID3v2 the /// raw frame data is stored in. /// /// /// A object if the method was able to /// match and create one. Otherwise . /// /// /// Frame creators are used to provide access or /// support for items that are left out of TagLib#. /// /// /// /// public Frame Creator (TagLib.ByteVector data, TagLib.Id3v2.FrameHeader header) /// { /// if (header.FrameId == "RVRB") /// return new ReverbFrame (data, header); /// else /// return null; /// } /// ... /// TagLib.Id3v2.FrameFactor.AddFrameCreator (ReverbFrame.Creator); /// /// /// public delegate Frame FrameCreator (ByteVector data, int offset, FrameHeader header, byte version); /// /// Contains registered frame creators. /// private static List frame_creators = new List (); /// /// Creates a object by reading it from /// raw ID3v2 frame data. /// /// /// A object containing a raw ID3v2 /// frame. /// /// /// A value reference specifying at what /// index in at which the frame /// begins. After reading, it contains the offset of the next /// frame to be read. /// /// /// A value specifying the ID3v2 version /// the frame in is encoded in. /// /// /// A value specifying whether the entire /// tag has already been unsynchronized. /// /// /// A object read from the data, or if none is found. /// /// /// The frame contained in the raw data could not be /// converted to ID3v2 or uses encryption or compression. /// public static Frame CreateFrame (ByteVector data, ref int offset, byte version, bool alreadyUnsynched) { int position = offset; FrameHeader header = new FrameHeader (data.Mid (position, (int) FrameHeader.Size (version)), version); offset += (int) (header.FrameSize + FrameHeader.Size ( version)); if (header.FrameId == null) throw new System.NotImplementedException (); foreach (byte b in header.FrameId) { char c = (char) b; if ((c < 'A' || c > 'Z') && (c < '1' || c > '9')) return null; } if (alreadyUnsynched) { // Mark the frame as not Unsynchronozed because the entire // tag has already been Unsynchronized header.Flags &= ~FrameFlags.Unsynchronisation; } // Windows Media Player may create zero byte frames. // Just send them off as unknown and delete them. if (header.FrameSize == 0) { header.Flags |= FrameFlags.TagAlterPreservation; return new UnknownFrame (data, position, header, version); } // TODO: Support Compression. if ((header.Flags & FrameFlags.Compression) != 0) throw new System.NotImplementedException (); // TODO: Support Encryption. if ((header.Flags & FrameFlags.Encryption) != 0) throw new System.NotImplementedException (); foreach (FrameCreator creator in frame_creators) { Frame frame = creator (data, position, header, version); if (frame != null) return frame; } // This is where things get necissarily nasty. Here we // determine which Frame subclass (or if none is found // simply an Frame) based on the frame ID. Since there // are a lot of possibilities, that means a lot of if // blocks. // Text Identification (frames 4.2) if (header.FrameId == FrameType.TXXX) return new UserTextInformationFrame (data, position, header, version); if (header.FrameId [0] == (byte) 'T') return new TextInformationFrame (data, position, header, version); // Unique File Identifier (frames 4.1) if (header.FrameId == FrameType.UFID) return new UniqueFileIdentifierFrame (data, position, header, version); // Music CD Identifier (frames 4.5) if (header.FrameId == FrameType.MCDI) return new MusicCdIdentifierFrame (data, position, header, version); // Unsynchronized Lyrics (frames 4.8) if (header.FrameId == FrameType.USLT) return new UnsynchronisedLyricsFrame (data, position, header, version); // Synchronized Lyrics (frames 4.9) if (header.FrameId == FrameType.SYLT) return new SynchronisedLyricsFrame (data, position, header, version); // Comments (frames 4.10) if (header.FrameId == FrameType.COMM) return new CommentsFrame (data, position, header, version); // Relative Volume Adjustment (frames 4.11) if (header.FrameId == FrameType.RVA2) return new RelativeVolumeFrame (data, position, header, version); // Attached Picture (frames 4.14) if (header.FrameId == FrameType.APIC) return new AttachedPictureFrame (data, position, header, version); // General Encapsulated Object (frames 4.15) if(header.FrameId == FrameType.GEOB) return new GeneralEncapsulatedObjectFrame (data, position, header, version); // Play Count (frames 4.16) if(header.FrameId == FrameType.PCNT) return new PlayCountFrame (data, position, header, version); // Play Count (frames 4.17) if(header.FrameId == FrameType.POPM) return new PopularimeterFrame (data, position, header, version); // Terms of Use (frames 4.22) if(header.FrameId == FrameType.USER) return new TermsOfUseFrame (data, position, header, version); // Private (frames 4.27) if (header.FrameId == FrameType.PRIV) return new PrivateFrame (data, position, header, version); return new UnknownFrame (data, position, header, version); } /// /// Adds a curstom frame creator to try before using standard /// frame creation methods. /// /// /// A delegate to be used by the /// frame factory. /// /// /// Frame creators are used before standard methods so custom /// checking can be used and new formats can be added. They /// are executed in the reverse order in which they are /// added. /// /// /// is . /// public static void AddFrameCreator (FrameCreator creator) { if (creator == null) throw new System.ArgumentNullException ( "creator"); frame_creators.Insert (0, creator); } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/ExtendedHeader.cs0000644000175000017500000000636511462100402024333 0ustar00rubenruben00000000000000// // ExtendedHeader.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // id3v2extendedheader.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2002,2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections; using System; namespace TagLib.Id3v2 { /// /// This class is a filler until support for reading and writing the /// ID3v2 extended header is implemented. /// public class ExtendedHeader : ICloneable { /// /// Contains the size of the read header. /// private uint size; /// /// Constructs and initializes a new instance of with no contents. /// public ExtendedHeader () { } /// /// Constructs and initializes a new instance of by reading the raw contents from /// a object. /// /// /// A object containing the raw /// extended header structure. /// /// /// A value indicating the ID3v2 version. /// public ExtendedHeader (ByteVector data, byte version) { Parse (data, version); } /// /// Gets the size of the data on disk in bytes. /// /// /// A value containing the size of the /// data on disk. /// public uint Size { get {return size;} } /// /// Populates the current instance with the contents of the /// raw ID3v2 frame. /// /// /// A object containing the raw /// extended header structure. /// /// /// A value indicating the ID3v2 version. /// protected void Parse (ByteVector data, byte version) { if (data == null) throw new ArgumentNullException ("data"); size = (version == 3 ? 4u : 0u) + SynchData.ToUInt (data.Mid (0, 4)); } #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to /// the current instance. /// public ExtendedHeader Clone () { ExtendedHeader header = new ExtendedHeader (); header.size = size; return header; } object ICloneable.Clone () { return Clone (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Header.cs0000644000175000017500000002070611462100402022645 0ustar00rubenruben00000000000000// // Header.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // id3v2header.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2002,2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Id3v2 { /// /// Indicates the flags applied to a object. /// [Flags] public enum HeaderFlags : byte { /// /// The header contains no flags. /// None = 0, /// /// The tag described by the header has been unsynchronized. /// Unsynchronisation = 0x80, /// /// The tag described by the header has contains an extended /// header. /// ExtendedHeader = 0x40, /// /// The tag described by the header is experimental. /// ExperimentalIndicator = 0x20, /// /// The tag described by the header contains a footer. /// FooterPresent = 0x10 } /// /// This structure provides a representation of an ID3v2 tag header /// which can be read from and written to disk. /// public struct Header { #region Private Fields /// /// Contains the tag's major version. /// private byte major_version; /// /// Contains the tag's version revision. /// private byte revision_number; /// /// Contains tag's flags. /// private HeaderFlags flags; /// /// Contains the tag size. /// private uint tag_size; #endregion #region Public Fields /// /// The size of a ID3v2 header. /// public const uint Size = 10; /// /// The identifier used to recognize a ID3v2 headers. /// /// /// "ID3" /// public static readonly ReadOnlyByteVector FileIdentifier = "ID3"; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading it from raw header data. /// /// /// A object containing the raw /// data to build the new instance from. /// /// /// is . /// /// /// is smaller than , does not begin with , contains invalid flag data, /// or contains invalid size data. /// public Header (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); if (data.Count < Size) throw new CorruptFileException ( "Provided data is smaller than object size."); if (!data.StartsWith (FileIdentifier)) throw new CorruptFileException ( "Provided data does not start with the file identifier"); major_version = data [3]; revision_number = data [4]; flags = (HeaderFlags) data [5]; if (major_version == 2 && ((int) flags & 127) != 0) throw new CorruptFileException ( "Invalid flags set on version 2 tag."); if (major_version == 3 && ((int) flags & 15) != 0) throw new CorruptFileException ( "Invalid flags set on version 3 tag."); if (major_version == 4 && ((int) flags & 7) != 0) throw new CorruptFileException ( "Invalid flags set on version 4 tag."); for (int i = 6; i < 10; i ++) if (data [i] >= 128) throw new CorruptFileException ( "One of the bytes in the header was greater than the allowed 128."); tag_size = SynchData.ToUInt (data.Mid (6, 4)); } #endregion #region Public Properties /// /// Gets and sets the major version of the tag described by /// the current instance. /// /// /// A value specifying the ID3v2 version /// of tag described by the current instance. /// /// /// When the version is set, unsupported header flags will /// automatically be removed from the tag. /// /// /// is less than 2 or more than 4. /// public byte MajorVersion { get { return major_version == 0 ? Tag.DefaultVersion : major_version; } set { if (value < 2 || value > 4) throw new ArgumentException ( "Version unsupported"); if (value < 3) flags &= ~(HeaderFlags.ExtendedHeader | HeaderFlags.ExperimentalIndicator); if (value < 4) flags &= ~HeaderFlags.FooterPresent; major_version = value; } } /// /// Gets and sets the version revision number of the tag /// represented by the current instance. /// /// /// A value containing the version /// revision number of the tag represented by the current /// instance. /// /// /// This value should always be zeroed. A non-zero value /// indicates an experimental or new version of the format /// which may not be completely understood by the current /// implementation. Some software may refuse to read tags /// with a non-zero value. /// public byte RevisionNumber { get {return revision_number;} set {revision_number = value;} } /// /// Gets and sets the flags applied to the current instance. /// /// /// A bitwise combined value /// containing the flags applied to the current instance. /// /// /// contains a flag not supported /// by the the ID3v2 version of the current instance. /// public HeaderFlags Flags { get {return flags;} set { if (0 != (value & (HeaderFlags.ExtendedHeader | HeaderFlags.ExperimentalIndicator)) && MajorVersion < 3) throw new ArgumentException ( "Feature only supported in version 2.3+", "value"); if (0 != (value & HeaderFlags.FooterPresent) && MajorVersion < 3) throw new ArgumentException ( "Feature only supported in version 2.4+", "value"); flags = value; } } /// /// Gets and sets the size of the tag described by the /// current instance, minus the header and footer. /// /// /// A value containing the size of the /// tag described by the current instance. /// public uint TagSize { get {return tag_size;} set {tag_size = value;} } /// /// Gets the complete size of the tag described by the /// current instance, including the header and footer. /// /// /// A value containing the complete size /// of the tag described by the current instance. /// public uint CompleteTagSize { get { if ((flags & HeaderFlags.FooterPresent) != 0) return TagSize + Size + Footer.Size; else return TagSize + Size; } } #endregion #region Public Methods /// /// Renders the current instance as a raw ID3v2 header. /// /// /// A object containing the /// rendered header. /// public ByteVector Render () { ByteVector v = new ByteVector (); v.Add (FileIdentifier); v.Add (MajorVersion); v.Add (RevisionNumber); v.Add ((byte)flags); v.Add (SynchData.FromUInt (TagSize)); return v; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/SynchData.cs0000644000175000017500000001050411462100402023326 0ustar00rubenruben00000000000000// // SynchData.cs: Provides support for encoding and decoding unsynchronized data // and numbers. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // id3v2synchdata.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2002,2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Id3v2 { /// /// This static class provides support for encoding and decoding /// unsynchronized data and numbers. /// /// /// Unsynchronization is designed so that portions of the tag won't /// be misinterpreted as MPEG audio stream headers by removing the /// possibility of the synch bytes occuring in the tag. /// public static class SynchData { /// /// Decodes synchronized integer data into a value. /// /// /// A object containing the number /// to decode. Only the first 4 bytes of this value will be /// used. /// /// /// A value containing the decoded /// number. /// /// /// is . /// public static uint ToUInt (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); uint sum = 0; int last = data.Count > 4 ? 3 : data.Count - 1; for(int i = 0; i <= last; i++) sum |= (uint) (data [i] & 0x7f) << ((last - i) * 7); return sum; } /// /// Encodes a value as synchronized /// integer data. /// /// /// A value containing the number to /// encode. /// /// /// A object containing the encoded /// number. /// /// /// is greater than 268435455. /// public static ByteVector FromUInt (uint value) { if ((value >> 28) != 0) throw new ArgumentOutOfRangeException ("value", "value must be less than 268435456."); ByteVector v = new ByteVector (4, 0); for (int i = 0; i < 4; i++) v [i] = (byte) (value >> ((3 - i) * 7) & 0x7f); return v; } /// /// Unsynchronizes a object by /// inserting empty bytes where necessary. /// /// /// A object to unsynchronize. /// /// /// is . /// public static void UnsynchByteVector (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); for (int i = data.Count - 2; i >= 0; i --) if (data [i] == 0xFF && (data [i+1] == 0 || (data [i+1] & 0xE0) != 0)) data.Insert (i+1, 0); } /// /// Resynchronizes a object by /// removing the added bytes. /// /// /// A object to resynchronize. /// /// /// is . /// public static void ResynchByteVector (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); for (int i = data.Count - 2; i >= 0; i --) if (data [i] == 0xFF && data [i+1] == 0) data.RemoveAt (i+1); } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/FrameHeader.cs0000644000175000017500000003044611462100402023622 0ustar00rubenruben00000000000000// // FrameHeader.cs: // // Authors: // Brian Nickel (brian.nickel@gmail.com) // Gabriel BUrt (gabriel.burt@gmail.com) // // Original Source: // id3v2frame.cpp from TagLib // // Copyright (C) 2010 Novell, Inc. // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2002,2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Id3v2 { /// /// Indicates the flags applied to a /// object. /// [Flags] public enum FrameFlags : ushort { /// /// The header contains no flags. /// None = 0, /// /// Indicates that the frame is to be deleted if the tag is /// altered. /// TagAlterPreservation = 0x4000, /// /// Indicates that the frame is to be deleted if the file is /// altered. /// FileAlterPreservation = 0x2000, /// /// Indicates that the frame is read-only and should not be /// altered. /// ReadOnly = 0x1000, /// /// Indicates that the frame has a grouping identity. /// GroupingIdentity = 0x0040, /// /// Indicates that the frame data is compressed. /// Compression = 0x0008, /// /// Indicates that the frame data is encrypted. /// Encryption = 0x0004, /// /// Indicates that the frame data has been unsynchronized. /// Unsynchronisation = 0x0002, /// /// Indicates that the frame has a data length indicator. /// DataLengthIndicator = 0x0001 } /// /// This structure provides a representation of an ID3v2 frame header /// which can be read from and written to disk. /// public struct FrameHeader { #region Private Fields /// /// Contains frame's ID. /// private ReadOnlyByteVector frame_id; /// /// Contains frame's size. /// private uint frame_size; /// /// Contains frame's flags. /// private FrameFlags flags; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading it from raw header data /// of a specified version. /// /// /// A object containing the raw /// data to build the new instance from. /// /// /// A value containing the ID3v2 version /// with which the data in was /// encoded. /// /// /// If the data size is smaller than the size of a full /// header, the data is just treated as a frame identifier /// and the remaining values are zeroed. /// /// /// is . /// /// /// is smaller than the size of a /// frame identifier or is less /// than 2 or more than 4. /// public FrameHeader (ByteVector data, byte version) { if (data == null) throw new ArgumentNullException ("data"); flags = 0; frame_size = 0; if (version < 2 || version > 4) throw new CorruptFileException ( "Unsupported tag version."); if (data.Count < (version == 2 ? 3 : 4)) throw new CorruptFileException ( "Data must contain at least a frame ID."); switch (version) { case 2: // Set the frame ID -- the first three bytes frame_id = ConvertId (data.Mid (0, 3), version, false); // If the full header information was not passed // in, do not continue to the steps to parse the // frame size and flags. if (data.Count < 6) return; frame_size = data.Mid (3, 3).ToUInt (); return; case 3: // Set the frame ID -- the first four bytes frame_id = ConvertId (data.Mid (0, 4), version, false); // If the full header information was not passed // in, do not continue to the steps to parse the // frame size and flags. if (data.Count < 10) return; // Store the flags internally as version 2.4. frame_size = data.Mid (4, 4).ToUInt (); flags = (FrameFlags) ( ((data [8] << 7) & 0x7000) | ((data [9] >> 4) & 0x000C) | ((data [9] << 1) & 0x0040)); return; case 4: // Set the frame ID -- the first four bytes frame_id = new ReadOnlyByteVector ( data.Mid (0, 4)); // If the full header information was not passed // in, do not continue to the steps to parse the // frame size and flags. if (data.Count < 10) return; frame_size = SynchData.ToUInt (data.Mid (4, 4)); flags = (FrameFlags) data.Mid (8, 2).ToUShort (); return; default: throw new CorruptFileException ( "Unsupported tag version."); } } #endregion #region Public Properties /// /// Gets and sets the identifier of the frame described by /// the current instance. /// /// /// A object containing the /// identifier of the frame described by the current /// instance. /// /// /// is . /// public ReadOnlyByteVector FrameId { get {return frame_id;} set { if (value == null) throw new ArgumentNullException ( "value"); frame_id = value.Count == 4 ? value : new ReadOnlyByteVector ( value.Mid (0, 4)); } } /// /// Gets and sets the size of the frame described by the /// current instance, minus the header. /// /// /// A value containing the size of the /// frame described by the current instance. /// public uint FrameSize { get {return frame_size;} set {frame_size = value;} } /// /// Gets and sets the flags applied to the current instance. /// /// /// A bitwise combined value /// containing the flags applied to the current instance. /// /// /// contains a either compression /// or encryption, neither of which are supported by the /// library. /// public FrameFlags Flags { get {return flags;} set { if ((value & (FrameFlags.Compression | FrameFlags.Encryption)) != 0) throw new ArgumentException ( "Encryption and compression are not supported.", "value"); flags = value; } } #endregion #region Public Methods /// /// Renders the current instance, encoded in a specified /// ID3v2 version. /// /// /// A value specifying the version of /// ID3v2 to use when encoding the current instance. /// /// /// A object containing the /// rendered version of the current instance. /// /// /// The version specified in the current instance is /// unsupported. /// public ByteVector Render (byte version) { ByteVector data = new ByteVector (); ByteVector id = ConvertId (frame_id, version, true); if (id == null) throw new NotImplementedException (); switch (version) { case 2: data.Add (id); data.Add (ByteVector.FromUInt (frame_size) .Mid (1, 3)); return data; case 3: ushort new_flags = (ushort) ( (((ushort)flags << 1) & 0xE000) | (((ushort)flags << 4) & 0x00C0) | (((ushort)flags >> 1) & 0x0020)); data.Add (id); data.Add (ByteVector.FromUInt (frame_size)); data.Add (ByteVector.FromUShort (new_flags)); return data; case 4: data.Add (id); data.Add (SynchData.FromUInt (frame_size)); data.Add (ByteVector.FromUShort ((ushort) flags)); return data; default: throw new NotImplementedException ( "Unsupported tag version."); } } /// /// Gets the size of a header for a specified ID3v2 version. /// /// /// A value specifying the version of /// ID3v2 to get the size for. /// public static uint Size (byte version) { return (uint) (version < 3 ? 6 : 10); } #endregion #region Private Methods private static ReadOnlyByteVector ConvertId (ByteVector id, byte version, bool toVersion) { if (version >= 4) { ReadOnlyByteVector outid = id as ReadOnlyByteVector; return outid != null ? outid : new ReadOnlyByteVector (id); } if (id == null || version < 2) return null; if (!toVersion && (id == FrameType.EQUA || id == FrameType.RVAD || id == FrameType.TRDA || id == FrameType.TSIZ)) return null; if (version == 2) for (int i = 0; i < version2_frames.GetLength (0); i ++) { if (!version2_frames [i, toVersion ? 1 : 0].Equals (id)) continue; return version2_frames [i, toVersion ? 0 : 1]; } if (version == 3) for (int i = 0; i < version3_frames.GetLength (0); i ++) { if (!version3_frames [i, toVersion ? 1 : 0].Equals (id)) continue; return version3_frames [i, toVersion ? 0 : 1]; } if ((id.Count != 4 && version > 2) || (id.Count != 3 && version == 2)) return null; return id is ReadOnlyByteVector ? id as ReadOnlyByteVector : new ReadOnlyByteVector (id); } private static readonly ReadOnlyByteVector [,] version2_frames = new ReadOnlyByteVector [59,2] { { "BUF", "RBUF" }, { "CNT", "PCNT" }, { "COM", "COMM" }, { "CRA", "AENC" }, { "ETC", "ETCO" }, { "GEO", "GEOB" }, { "IPL", "TIPL" }, { "MCI", "MCDI" }, { "MLL", "MLLT" }, { "PIC", "APIC" }, { "POP", "POPM" }, { "REV", "RVRB" }, { "SLT", "SYLT" }, { "STC", "SYTC" }, { "TAL", "TALB" }, { "TBP", "TBPM" }, { "TCM", "TCOM" }, { "TCO", "TCON" }, { "TCP", "TCMP" }, { "TCR", "TCOP" }, { "TDA", "TDAT" }, { "TIM", "TIME" }, { "TDY", "TDLY" }, { "TEN", "TENC" }, { "TFT", "TFLT" }, { "TKE", "TKEY" }, { "TLA", "TLAN" }, { "TLE", "TLEN" }, { "TMT", "TMED" }, { "TOA", "TOAL" }, { "TOF", "TOFN" }, { "TOL", "TOLY" }, { "TOR", "TDOR" }, { "TOT", "TOAL" }, { "TP1", "TPE1" }, { "TP2", "TPE2" }, { "TP3", "TPE3" }, { "TP4", "TPE4" }, { "TPA", "TPOS" }, { "TPB", "TPUB" }, { "TRC", "TSRC" }, { "TRK", "TRCK" }, { "TSS", "TSSE" }, { "TT1", "TIT1" }, { "TT2", "TIT2" }, { "TT3", "TIT3" }, { "TXT", "TOLY" }, { "TXX", "TXXX" }, { "TYE", "TDRC" }, { "UFI", "UFID" }, { "ULT", "USLT" }, { "WAF", "WOAF" }, { "WAR", "WOAR" }, { "WAS", "WOAS" }, { "WCM", "WCOM" }, { "WCP", "WCOP" }, { "WPB", "WPUB" }, { "WXX", "WXXX" }, { "XRV", "RVA2" } }; private static readonly ReadOnlyByteVector [,] version3_frames = new ReadOnlyByteVector [3,2] { { "TORY", "TDOR" }, { "TYER", "TDRC" }, { "XRVA", "RVA2" } }; #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Tag.cs0000644000175000017500000017311211462100402022170 0ustar00rubenruben00000000000000// // Tag.cs: Provide support for reading and writing ID3v2 tags. // // Authors: // Brian Nickel (brian.nickel@gmail.com) // Gabriel BUrt (gabriel.burt@gmail.com) // // Original Source: // id3v2tag.cpp from TagLib // // Copyright (C) 2010 Novell, Inc. // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2002,2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Text; namespace TagLib.Id3v2 { /// /// This class extends and implements to provide support for reading and /// writing ID3v2 tags. /// public class Tag : TagLib.Tag, IEnumerable, ICloneable { #region Private Static Fields /// /// Contains the language to use for language specific /// fields. /// private static string language = CultureInfo.CurrentCulture.ThreeLetterISOLanguageName; /// /// Contains the field to use for new tags. /// private static byte default_version = 3; /// /// Indicates whether or not all tags should be saved in /// . /// private static bool force_default_version = false; /// /// Specifies the default string type to use for new frames. /// private static StringType default_string_type = StringType.UTF8; /// /// Specifies whether or not all frames shoudl be saved in /// . /// private static bool force_default_string_type = false; /// /// Specifies whether or not numeric genres should be used /// when available. /// private static bool use_numeric_genres = true; #endregion #region Private Fields /// /// Contains the tag's header. /// private Header header = new Header (); /// /// Contains the tag's extended header. /// private ExtendedHeader extended_header = null; /// /// Contains the tag's frames. /// private List frame_list = new List (); #endregion #region Constructors /// /// Constructs and initializes a new instance of with no contents. /// public Tag () { } /// /// Constructs and initializes a new instance of by reading the contents from a specified /// position in a specified file. /// /// /// A object containing the file from /// which the contents of the new instance is to be read. /// /// /// A value specify at what position to /// read the tag. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// public Tag (File file, long position) { if (file == null) throw new ArgumentNullException ("file"); file.Mode = TagLib.File.AccessMode.Read; if (position < 0 || position > file.Length - Header.Size) throw new ArgumentOutOfRangeException ( "position"); Read (file, position); } /// /// Constructs and initializes a new instance of by reading the contents from a specified /// object. /// /// /// A object to read the tag from. /// /// /// is . /// /// /// does not contain enough data. /// public Tag (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); if (data.Count < Header.Size) throw new CorruptFileException ( "Does not contain enough header data."); header = new Header (data); // If the tag size is 0, then this is an invalid tag. // Tags must contain at least one frame. if(header.TagSize == 0) return; if (data.Count - Header.Size < header.TagSize) throw new CorruptFileException ( "Does not contain enough tag data."); Parse (data.Mid ((int) Header.Size, (int) header.TagSize)); } #endregion #region Public Methods /// /// Gets all frames contained in the current instance. /// /// /// A object enumerating /// through the frames. /// public IEnumerable GetFrames () { return frame_list; } /// /// Gets all frames with a specified identifier contained in /// the current instance. /// /// /// A object containing the /// identifier of the frames to return. /// /// /// A object enumerating /// through the frames. /// /// /// is . /// /// /// is not exactly four bytes long. /// public IEnumerable GetFrames (ByteVector ident) { if (ident == null) throw new ArgumentNullException ("ident"); if (ident.Count != 4) throw new ArgumentException ( "Identifier must be four bytes long.", "ident"); foreach (Frame f in frame_list) if (f.FrameId.Equals (ident)) yield return f; } /// /// Gets all frames with of a specified type contained in /// the current instance. /// /// /// The type of object, derived from , /// to return from in the current instance. /// /// /// A object enumerating /// through the frames. /// public IEnumerable GetFrames () where T : Frame { foreach (Frame f in frame_list) { T tf = f as T; if (tf != null) yield return tf; } } /// /// Gets all frames with a of type /// with a specified identifier contained in the current /// instance. /// /// /// The type of object, derived from , /// to return from in the current instance. /// /// /// A object containing the /// identifier of the frames to return. /// /// /// A object enumerating /// through the frames. /// /// /// is . /// /// /// is not exactly four bytes long. /// public IEnumerable GetFrames (ByteVector ident) where T : Frame { if (ident == null) throw new ArgumentNullException ("ident"); if (ident.Count != 4) throw new ArgumentException ( "Identifier must be four bytes long.", "ident"); foreach (Frame f in frame_list) { T tf = f as T; if (tf != null && f.FrameId.Equals (ident)) yield return tf; } } /// /// Adds a frame to the current instance. /// /// /// A object to add to the current /// instance. /// /// /// is . /// public void AddFrame (Frame frame) { if (frame == null) throw new ArgumentNullException ("frame"); frame_list.Add (frame); } /// /// Replaces an existing frame with a new one in the list /// contained in the current instance, or adds a new one if /// the existing one is not contained. /// /// /// A object to be replaced. /// /// /// A object to add to the current /// instance. /// /// /// or is . /// public void ReplaceFrame (Frame oldFrame, Frame newFrame) { if (oldFrame == null) throw new ArgumentNullException ("oldFrame"); if (newFrame == null) throw new ArgumentNullException ("newFrame"); if (oldFrame == newFrame) return; int i = frame_list.IndexOf (oldFrame); if (i >= 0) frame_list [i] = newFrame; else frame_list.Add (newFrame); } /// /// Removes a specified frame from the current instance. /// /// /// A object to remove from the current /// instance. /// /// /// is . /// public void RemoveFrame (Frame frame) { if (frame == null) throw new ArgumentNullException ("frame"); if (frame_list.Contains (frame)) frame_list.Remove (frame); } /// /// Removes all frames with a specified identifier from the /// current instance. /// /// /// A object containing the /// identifier of the frames to remove. /// /// /// is . /// /// /// is not exactly four bytes long. /// public void RemoveFrames (ByteVector ident) { if (ident == null) throw new ArgumentNullException ("ident"); if (ident.Count != 4) throw new ArgumentException ( "Identifier must be four bytes long.", "ident"); for (int i = frame_list.Count - 1; i >= 0; i --) if (frame_list [i].FrameId.Equals (ident)) frame_list.RemoveAt (i); } /// /// Sets the text for a specified Text Information Frame. /// /// /// A object containing the /// identifier of the frame to set the data for. /// /// /// A containing the text to set for /// the specified frame, or to unset /// the value. /// /// /// is . /// /// /// is not exactly four bytes long. /// public void SetTextFrame (ByteVector ident, params string [] text) { if (ident == null) throw new ArgumentNullException ("ident"); if (ident.Count != 4) throw new ArgumentException ( "Identifier must be four bytes long.", "ident"); bool empty = true; if (text != null) for (int i = 0; empty && i < text.Length; i ++) if (!string.IsNullOrEmpty (text [i])) empty = false; if (empty) { RemoveFrames (ident); return; } TextInformationFrame frame = TextInformationFrame.Get (this, ident, true); frame.Text = text; frame.TextEncoding = DefaultEncoding; } /// /// Sets the text for a specified Text Information Frame. /// /// /// A object containing the /// identifier of the frame to set the data for. /// /// /// A object containing the /// text to set for the specified frame, or to unset the value. /// /// /// is . /// /// /// is not exactly four bytes long. /// [Obsolete("Use SetTextFrame(ByteVector,String[])")] public void SetTextFrame (ByteVector ident, StringCollection text) { if (text == null || text.Count == 0) RemoveFrames (ident); else SetTextFrame (ident, text.ToArray ()); } /// /// Sets the numeric values for a specified Text Information /// Frame. /// /// /// A object containing the /// identifier of the frame to set the data for. /// /// /// A value containing the number to /// store. /// /// /// A value representing a total which /// is a part of, or zero if /// is not part of a set. /// /// /// If both and are equal to zero, the value will be /// cleared. If is zero, by itself will be stored. Otherwise, the /// values will be stored as "/". /// /// /// is . /// /// /// is not exactly four bytes long. /// public void SetNumberFrame (ByteVector ident, uint number, uint count) { if (ident == null) throw new ArgumentNullException ("ident"); if (ident.Count != 4) throw new ArgumentException ( "Identifier must be four bytes long.", "ident"); if (number == 0 && count == 0) { RemoveFrames (ident); } else if (count != 0) { SetTextFrame (ident, string.Format ( CultureInfo.InvariantCulture, "{0}/{1}", number, count)); } else { SetTextFrame (ident, number.ToString ( CultureInfo.InvariantCulture)); } } /// /// Renders the current instance as a raw ID3v2 tag. /// /// /// A object containing the /// rendered tag. /// /// /// By default, tags will be rendered in the version they /// were loaded in, and new tags using the version specified /// by . If is , /// all tags will be rendered in using the version specified /// by , except for tags with /// footers, which must be in version 4. /// public ByteVector Render () { // We need to render the "tag data" first so that we // have to correct size to render in the tag's header. // The "tag data" (everything that is included in // Header.TagSize) includes the extended header, frames // and padding, but does not include the tag's header or // footer. bool has_footer = (header.Flags & HeaderFlags.FooterPresent) != 0; bool unsynchAtFrameLevel = (header.Flags & HeaderFlags.Unsynchronisation) != 0 && Version >= 4; bool unsynchAtTagLevel = (header.Flags & HeaderFlags.Unsynchronisation) != 0 && Version < 4; header.MajorVersion = has_footer ? (byte) 4 : Version; ByteVector tag_data = new ByteVector (); // TODO: Render the extended header. header.Flags &= ~HeaderFlags.ExtendedHeader; // Loop through the frames rendering them and adding // them to the tag_data. foreach (Frame frame in frame_list) { if (unsynchAtFrameLevel) frame.Flags |= FrameFlags.Unsynchronisation; if ((frame.Flags & FrameFlags.TagAlterPreservation) != 0) continue; try { tag_data.Add (frame.Render ( header.MajorVersion)); } catch (NotImplementedException) { } } // Add unsyncronization bytes if necessary. if (unsynchAtTagLevel) SynchData.UnsynchByteVector (tag_data); // Compute the amount of padding, and append that to // tag_data. if (!has_footer) tag_data.Add (new ByteVector ((int) ((tag_data.Count < header.TagSize) ? (header.TagSize - tag_data.Count) : 1024))); // Set the tag size. header.TagSize = (uint) tag_data.Count; tag_data.Insert (0, header.Render ()); if (has_footer) tag_data.Add (new Footer (header).Render ()); return tag_data; } #endregion #region Public Properties /// /// Gets and sets the header flags applied to the current /// instance. /// /// /// A bitwise combined value /// containing flags applied to the current instance. /// public HeaderFlags Flags { get {return header.Flags;} set {header.Flags = value;} } /// /// Gets and sets the ID3v2 version of the current instance. /// /// /// A value specifying the ID3v2 version /// of the current instance. /// /// /// is less than 2 or more than 4. /// public byte Version { get { return ForceDefaultVersion ? DefaultVersion : header.MajorVersion; } set { if (value < 2 || value > 4) throw new ArgumentOutOfRangeException ( "value", "Version must be 2, 3, or 4"); header.MajorVersion = value; } } #endregion #region Public Static Properties /// /// Gets and sets the ISO-639-2 language code to use when /// searching for and storing language specific values. /// /// /// A object containing an ISO-639-2 /// language code fto use when searching for and storing /// language specific values. /// /// /// If the language is unknown, " " is the appropriate /// filler. /// public static string Language { get {return language;} set { language = (value == null || value.Length < 3) ? " " : value.Substring (0,3); } } /// /// Gets and sets the the default version to use when /// creating new tags. /// /// /// A value specifying the default ID3v2 /// version. The default version for this library is 3. /// /// /// If is , all tags will be rendered with this /// version. /// /// /// is less than 2 or more than 4. /// public static byte DefaultVersion { get {return default_version;} set { if (value < 2 || value > 4) throw new ArgumentOutOfRangeException ( "value", "Version must be 2, 3, or 4"); default_version = value; } } /// /// Gets and sets whether or not to save all tags in the /// default version rather than their original version. /// /// /// If , tags will be saved in /// rather than their original /// format, with the exception of tags with footers, which /// will be saved in version 4. /// public static bool ForceDefaultVersion { get {return force_default_version;} set {force_default_version = value;} } /// /// Gets and sets the encoding to use when creating new /// frames. /// /// /// A value specifying the encoding /// to use when creating new frames. /// public static StringType DefaultEncoding { get {return default_string_type;} set {default_string_type = value;} } /// /// Gets and sets whether or not to render all frames with /// the default encoding rather than their original encoding. /// /// /// If , fames will be rendered in /// rather than their original /// encoding. /// public static bool ForceDefaultEncoding { get {return force_default_string_type;} set {force_default_string_type = value;} } /// /// Gets and sets whether or not to use ID3v1 style numeric /// genres when possible. /// /// /// A value specifying whether or not to /// use genres with numeric values when possible. /// /// /// If , TagLib# will try looking up /// the numeric genre code when storing the value. For /// ID3v2.2 and ID3v2.3, "Rock" would be stored as "(17)" and /// for ID3v2.4 it would be stored as "17". /// public static bool UseNumericGenres { get {return use_numeric_genres;} set {use_numeric_genres = value;} } #endregion #region Protected Methods /// /// Populates the current instance be reading in a tag from /// a specified position in a specified file. /// /// /// A object to read the tag from. /// /// /// A value specifying the seek position /// at which to read the tag. /// /// /// is . /// /// /// is less than 0 or greater /// than the size of the file. /// protected void Read (File file, long position) { if (file == null) throw new ArgumentNullException ("file"); file.Mode = File.AccessMode.Read; if (position < 0 || position > file.Length - Header.Size) throw new ArgumentOutOfRangeException ( "position"); file.Seek (position); header = new Header (file.ReadBlock ((int) Header.Size)); // If the tag size is 0, then this is an invalid tag. // Tags must contain at least one frame. if(header.TagSize == 0) return; Parse (file.ReadBlock ((int) header.TagSize)); } /// /// Populates the current instance by parsing the contents of /// a raw ID3v2 tag, minus the header. /// /// /// A object containing the content /// of an ID3v2 tag, minus the header. /// /// /// This method must only be called after the internal /// header has been read from the file, otherwise the data /// cannot be parsed correctly. /// protected void Parse (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); // If the entire tag is marked as unsynchronized, and this tag // is version id3v2.3 or lower, resynchronize it. bool fullTagUnsynch = (header.MajorVersion < 4) && ((header.Flags & HeaderFlags.Unsynchronisation) != 0); if (fullTagUnsynch) SynchData.ResynchByteVector (data); int frame_data_position = 0; int frame_data_length = data.Count; // Check for the extended header. if ((header.Flags & HeaderFlags.ExtendedHeader) != 0) { extended_header = new ExtendedHeader (data, header.MajorVersion); if (extended_header.Size <= data.Count) { frame_data_position += (int) extended_header.Size; frame_data_length -= (int) extended_header.Size; } } // Parse the frames. TDRC, TDAT, and TIME will be needed // for post-processing, so check for them as they are // loaded. TextInformationFrame tdrc = null; TextInformationFrame tyer = null; TextInformationFrame tdat = null; TextInformationFrame time = null; while (frame_data_position < frame_data_length - FrameHeader.Size (header.MajorVersion)) { // If the next data is position is 0, assume // that we've hit the padding portion of the // frame data. if(data [frame_data_position] == 0) break; Frame frame = null; try { frame = FrameFactory.CreateFrame (data, ref frame_data_position, header.MajorVersion, fullTagUnsynch); } catch (NotImplementedException) { continue; } if(frame == null) break; // Only add frames that contain data. if (frame.Size == 0) continue; AddFrame (frame); // If the tag is version 4, no post-processing // is needed. if (header.MajorVersion == 4) continue; // Load up the first instance of each, for // post-processing. if (tdrc == null && frame.FrameId.Equals (FrameType.TDRC)) { tdrc = frame as TextInformationFrame; } else if (tyer == null && frame.FrameId.Equals (FrameType.TYER)) { tyer = frame as TextInformationFrame; } else if (tdat == null && frame.FrameId.Equals (FrameType.TDAT)) { tdat = frame as TextInformationFrame; } else if (time == null && frame.FrameId.Equals (FrameType.TIME)) { time = frame as TextInformationFrame; } } // Try to fill out the date/time of the TDRC frame. Can't do that if no TDRC // frame exists, or if there is no TDAT frame, or if TDRC already has the date. if (tdrc == null || tdat == null || tdrc.ToString ().Length > 4) { return; } string year = tdrc.ToString (); if (year.Length != 4) return; // Start with the year already in TDRC, then add the TDAT and TIME if available StringBuilder tdrc_text = new StringBuilder (); tdrc_text.Append (year); // Add the date if (tdat != null) { string tdat_text = tdat.ToString (); if (tdat_text.Length == 4) { tdrc_text.Append ("-").Append (tdat_text, 0, 2) .Append ("-").Append (tdat_text, 2, 2); // Add the time if (time != null) { string time_text = time.ToString (); if (time_text.Length == 4) tdrc_text.Append ("T").Append (time_text, 0, 2) .Append (":").Append (time_text, 2, 2); RemoveFrames (FrameType.TIME); } } RemoveFrames (FrameType.TDAT); } tdrc.Text = new string [] { tdrc_text.ToString () }; } #endregion #region Private Methods // TODO: These should become public some day. /// /// Gets the text value from a specified Text Information /// Frame. /// /// /// A object containing the frame /// identifier of the Text Information Frame to get the value /// from. /// /// /// A object containing the text of the /// specified frame, or if no value /// was found. /// private string GetTextAsString (ByteVector ident) { TextInformationFrame frame = TextInformationFrame.Get ( this, ident, false); string result = frame == null ? null : frame.ToString (); return string.IsNullOrEmpty (result) ? null : result; } /// /// Gets the text values from a specified Text Information /// Frame. /// /// /// A object containing the frame /// identifier of the Text Information Frame to get the value /// from. /// /// /// A containing the text of the /// specified frame, or an empty array if no values were /// found. /// private string [] GetTextAsArray (ByteVector ident) { TextInformationFrame frame = TextInformationFrame.Get ( this, ident, false); return frame == null ? new string [0] : frame.Text; } /// /// Gets an integer value from a "/" delimited list in a /// specified Text Information Frame. /// /// /// A object containing the frame /// identifier of the Text Information Frame to read from. /// /// /// A value specifying the index in the /// integer list of the value to return. /// /// /// A value read from the list in the /// frame, or 0 if the value wasn't found. /// private uint GetTextAsUInt32 (ByteVector ident, int index) { string text = GetTextAsString (ident); if (text == null) return 0; string [] values = text.Split (new char [] {'/'}, index + 2); if (values.Length < index + 1) return 0; uint result; if (uint.TryParse (values [index], out result)) return result; return 0; } /// /// Gets a TXXX frame via reference of the description field /// /// String containing the description field /// UserTextInformationFrame (TXXX) that corresponds to the description private string GetUserTextAsString (string description){ //Gets the TXXX frame, frame will be null if nonexistant UserTextInformationFrame frame = UserTextInformationFrame.Get ( this, description, false); //TXXX frames support multivalue strings, join them up and return //only the text from the frame. string result = frame == null ? null : string.Join (";",frame.Text); return string.IsNullOrEmpty (result) ? null : result; } /// /// Creates and/or sets a UserTextInformationFrame (TXXX) with the given /// description and text. /// /// String containing the Description field for the /// TXXX frame /// String containing the Text field for the TXXX frame private void SetUserTextAsString(string description, string text) { //Get the TXXX frame, create a new one if needed UserTextInformationFrame frame = UserTextInformationFrame.Get( this, description, true); if (!string.IsNullOrEmpty(text)) { frame.Text = text.Split(';'); } else { //Text string is null or empty, delete the frame, prevent empties RemoveFrame(frame); } } /// /// Gets the text from a particular UFID frame, referenced by the owner field /// /// String containing the "Owner" data /// String containing the text from the UFID frame, or null private string GetUfidText(string owner) { //Get the UFID frame, frame will be null if nonexistant UniqueFileIdentifierFrame frame = UniqueFileIdentifierFrame.Get( this, owner, false); //If the frame existed: frame.Identifier is a bytevector, get a string string result = frame == null ? null : frame.Identifier.ToString(); return string.IsNullOrEmpty (result) ? null : result; } /// /// Creates and/or sets the text for a UFID frame, referenced by owner /// /// String containing the Owner field /// String containing the text to set for the frame private void SetUfidText(string owner, string text) { //Get a UFID frame, create if necessary UniqueFileIdentifierFrame frame = UniqueFileIdentifierFrame.Get( this, owner, true); //If we have a real string, convert to ByteVector and apply to frame if (!string.IsNullOrEmpty(text)) { ByteVector identifier = ByteVector.FromString(text, StringType.UTF8); frame.Identifier = identifier; } else { //String was null or empty, remove the frame to prevent empties RemoveFrame(frame); } } /// /// Moves a specified frame so it is the first of its type in /// the tag. /// /// /// A object to make the first of its /// type. /// private void MakeFirstOfType (Frame frame) { ByteVector type = frame.FrameId; Frame swapping = null; for (int i = 0; i < frame_list.Count; i ++) { if (swapping == null) { if (frame_list [i].FrameId.Equals (type)) swapping = frame; else continue; } Frame tmp = frame_list [i]; frame_list [i] = swapping; swapping = tmp; if (swapping == frame) return; } if (swapping != null) frame_list.Add (swapping); } #endregion #region IEnumerable /// /// Gets an enumerator for enumerating through the frames. /// /// /// A for /// enumerating through the frames. /// public IEnumerator GetEnumerator () { return frame_list.GetEnumerator (); } IEnumerator IEnumerable.GetEnumerator () { return frame_list.GetEnumerator (); } #endregion #region TagLib.Tag /// /// Gets the tag types contained in the current instance. /// /// /// Always . /// public override TagTypes TagTypes { get {return TagTypes.Id3v2;} } /// /// Gets and sets the title for the media described by the /// current instance. /// /// /// A object containing the title for /// the media described by the current instance or if no value is present. /// /// /// This property is implemented using the "TIT2" Text /// Information Frame. /// public override string Title { get {return GetTextAsString (FrameType.TIT2);} set {SetTextFrame (FrameType.TIT2, value);} } /// /// Gets and sets the sort names of the Title of the /// media represented by the current instance. /// /// /// A containing the sort names for /// the Title of the media described by the current instance, /// or null if no value is present. /// /// /// This property is implemented using the "TSOT" Text /// Information Frame. /// public override string TitleSort { get {return GetTextAsString (FrameType.TSOT);} set {SetTextFrame (FrameType.TSOT, value);} } /// /// Gets and sets the performers or artists who performed in /// the media described by the current instance. /// /// /// A containing the performers or /// artists who performed in the media described by the /// current instance or an empty array if no value is /// present. /// /// /// This property is implemented using the "TPE1" Text /// Information Frame. /// public override string [] Performers { get {return GetTextAsArray (FrameType.TPE1);} set {SetTextFrame (FrameType.TPE1, value);} } /// /// Gets and sets the sort names of the performers or artists /// who performed in the media described by the current instance. /// /// /// A containing the sort names for /// the performers or artists who performed in the media /// described by the current instance, or an empty array if /// no value is present. /// /// /// This property is implemented using the "TSOP" Text /// Information Frame. http://www.id3.org/id3v2.4.0-frames /// public override string [] PerformersSort { get {return GetTextAsArray (FrameType.TSOP);} set {SetTextFrame (FrameType.TSOP, value);} } /// /// Gets and sets the sort names of the band or artist who is /// credited in the creation of the entire album or collection /// containing the media described by the current instance. /// /// /// A containing the sort names for /// the performers or artists who performed in the media /// described by the current instance, or an empty array if /// no value is present. /// /// /// This property is implemented using the "TSO2" Text /// Information Frame. http://www.id3.org/iTunes /// public override string [] AlbumArtistsSort { get {return GetTextAsArray (FrameType.TSO2);} set {SetTextFrame (FrameType.TSO2, value);} } /// /// Gets and sets the band or artist who is credited in the /// creation of the entire album or collection containing the /// media described by the current instance. /// /// /// A containing the band or artist /// who is credited in the creation of the entire album or /// collection containing the media described by the current /// instance or an empty array if no value is present. /// /// /// This property is implemented using the "TPE2" Text /// Information Frame. /// public override string [] AlbumArtists { get {return GetTextAsArray (FrameType.TPE2);} set {SetTextFrame (FrameType.TPE2, value);} } /// /// Gets and sets the composers of the media represented by /// the current instance. /// /// /// A containing the composers of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This property is implemented using the "TCOM" Text /// Information Frame. /// public override string [] Composers { get {return GetTextAsArray (FrameType.TCOM);} set {SetTextFrame (FrameType.TCOM, value);} } /// /// Gets and sets the sort names of the composers of the /// media represented by the current instance. /// /// /// A containing the sort names for /// the performers or artists who performed in the media /// described by the current instance, or an empty array if /// no value is present. /// /// /// This property is implemented using the "TSOC" Text /// Information Frame. http://www.id3.org/id3v2.4.0-frames /// public override string [] ComposersSort { get {return GetTextAsArray (FrameType.TSOC);} set {SetTextFrame (FrameType.TSOC, value);} } /// /// Gets and sets the album of the media represented by the /// current instance. /// /// /// A object containing the album of /// the media represented by the current instance or if no value is present. /// /// /// This property is implemented using the "TALB" Text /// Information Frame. /// public override string Album { get {return GetTextAsString (FrameType.TALB);} set {SetTextFrame (FrameType.TALB, value);} } /// /// Gets and sets the sort names of the Album title of the /// media represented by the current instance. /// /// /// A containing the sort names for /// the Title in the media described by the current instance, /// or null if no value is present. /// /// /// This property is implemented using the "TSOA" Text /// Information Frame. http://www.id3.org/id3v2.4.0-frames /// public override string AlbumSort { get {return GetTextAsString (FrameType.TSOA);} set {SetTextFrame (FrameType.TSOA, value);} } /// /// Gets and sets a user comment on the media represented by /// the current instance. /// /// /// A object containing user comments /// on the media represented by the current instance or if no value is present. /// /// /// This property is implemented using the "COMM" Comments /// Frame with an empty description and the language /// specified by . /// public override string Comment { get { CommentsFrame f = CommentsFrame.GetPreferred (this, String.Empty, Language); return f != null ? f.ToString () : null; } set { CommentsFrame frame; if (string.IsNullOrEmpty (value)) { while ((frame = CommentsFrame .GetPreferred (this, string.Empty, Language)) != null) RemoveFrame (frame); return; } frame = CommentsFrame.Get (this, String.Empty, Language, true); frame.Text = value; frame.TextEncoding = DefaultEncoding; MakeFirstOfType (frame); } } /// /// Gets and sets the genres of the media represented by the /// current instance. /// /// /// A containing the genres of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This property is implemented using the "TCON" Text /// Information Frame. /// public override string [] Genres { get { string [] text = GetTextAsArray (FrameType.TCON); if (text.Length == 0) return text; List list = new List (); foreach (string genre in text) { if (string.IsNullOrEmpty (genre)) continue; // The string may just be a genre // number. string genre_from_index = TagLib.Genres.IndexToAudio ( genre); if (genre_from_index != null) list.Add (genre_from_index); else list.Add (genre); } return list.ToArray (); } set { if (value == null || !use_numeric_genres) { SetTextFrame (FrameType.TCON, value); return; } // Clone the array so changes made won't effect // the passed array. value = (string []) value.Clone (); for (int i = 0; i < value.Length; i ++) { int index = TagLib.Genres.AudioToIndex ( value [i]); if (index != 255) value [i] = index.ToString ( CultureInfo.InvariantCulture); } SetTextFrame (FrameType.TCON, value); } } /// /// Gets and sets the year that the media represented by the /// current instance was recorded. /// /// /// A containing the year that the media /// represented by the current instance was created or zero /// if no value is present. /// /// /// This property is implemented using the "TDRC" Text /// Information Frame. If a value greater than 9999 is set, /// this property will be cleared. /// public override uint Year { get { string text = GetTextAsString (FrameType.TDRC); if (text == null || text.Length < 4) return 0; uint value; if (uint.TryParse (text.Substring (0, 4), out value)) return value; return 0; } set { if (value > 9999) value = 0; SetNumberFrame (FrameType.TDRC, value, 0); } } /// /// Gets and sets the position of the media represented by /// the current instance in its containing album. /// /// /// A containing the position of the /// media represented by the current instance in its /// containing album or zero if not specified. /// /// /// This property is implemented using the "TRCK" Text /// Information Frame. /// public override uint Track { get {return GetTextAsUInt32 (FrameType.TRCK, 0);} set {SetNumberFrame (FrameType.TRCK, value, TrackCount);} } /// /// Gets and sets the number of tracks in the album /// containing the media represented by the current instance. /// /// /// A containing the number of tracks in /// the album containing the media represented by the current /// instance or zero if not specified. /// /// /// This property is implemented using the "TRCK" Text /// Information Frame. /// public override uint TrackCount { get {return GetTextAsUInt32 (FrameType.TRCK, 1);} set {SetNumberFrame (FrameType.TRCK, Track, value);} } /// /// Gets and sets the number of the disc containing the media /// represented by the current instance in the boxed set. /// /// /// A containing the number of the disc /// containing the media represented by the current instance /// in the boxed set. /// /// /// This property is implemented using the "TPOS" Text /// Information Frame. /// public override uint Disc { get {return GetTextAsUInt32 (FrameType.TPOS, 0);} set {SetNumberFrame (FrameType.TPOS, value, DiscCount);} } /// /// Gets and sets the number of discs in the boxed set /// containing the media represented by the current instance. /// /// /// A containing the number of discs in /// the boxed set containing the media represented by the /// current instance or zero if not specified. /// /// /// This property is implemented using the "TPOS" Text /// Information Frame. /// public override uint DiscCount { get {return GetTextAsUInt32 (FrameType.TPOS, 1);} set {SetNumberFrame (FrameType.TPOS, Disc, value);} } /// /// Gets and sets the lyrics or script of the media /// represented by the current instance. /// /// /// A object containing the lyrics or /// script of the media represented by the current instance /// or if no value is present. /// /// /// This property is implemented using the "USLT" /// Unsynchronized Lyrics Frame with an empty description and /// the language specified by . /// public override string Lyrics { get { UnsynchronisedLyricsFrame f = UnsynchronisedLyricsFrame.GetPreferred ( this, string.Empty, Language); return f != null ? f.ToString () : null; } set { UnsynchronisedLyricsFrame frame; if (string.IsNullOrEmpty (value)) { while ((frame = UnsynchronisedLyricsFrame .GetPreferred (this, string.Empty, Language)) != null) RemoveFrame (frame); return; } frame = UnsynchronisedLyricsFrame.Get (this, String.Empty, Language, true); frame.Text = value; frame.TextEncoding = DefaultEncoding; } } /// /// Gets and sets the grouping on the album which the media /// in the current instance belongs to. /// /// /// A object containing the grouping on /// the album which the media in the current instance belongs /// to or if no value is present. /// /// /// This property is implemented using the "TIT1" Text /// Information Frame. /// public override string Grouping { get {return GetTextAsString (FrameType.TIT1);} set {SetTextFrame (FrameType.TIT1, value);} } /// /// Gets and sets the number of beats per minute in the audio /// of the media represented by the current instance. /// /// /// A containing the number of beats per /// minute in the audio of the media represented by the /// current instance, or zero if not specified. /// /// /// This property is implemented using the "TBPM" Text /// Information Frame. /// public override uint BeatsPerMinute { get { string text = GetTextAsString (FrameType.TBPM); if (text == null) return 0; double result; if (double.TryParse (text, out result) && result >= 0.0) return (uint) Math.Round (result); return 0; } set {SetNumberFrame (FrameType.TBPM, value, 0);} } /// /// Gets and sets the conductor or director of the media /// represented by the current instance. /// /// /// A object containing the conductor /// or director of the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "TPE3" Text /// Information Frame. /// public override string Conductor { get {return GetTextAsString (FrameType.TPE3);} set {SetTextFrame (FrameType.TPE3, value);} } /// /// Gets and sets the copyright information for the media /// represented by the current instance. /// /// /// A object containing the copyright /// information for the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "TCOP" Text /// Information Frame. /// public override string Copyright { get {return GetTextAsString (FrameType.TCOP);} set {SetTextFrame (FrameType.TCOP, value);} } /// /// Gets and sets the MusicBrainz ArtistID /// /// /// A containing the MusicBrainz /// ArtistID for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "TXXX:MusicBrainz Artist Id" frame. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzArtistId { get {return GetUserTextAsString ("MusicBrainz Artist Id");} set {SetUserTextAsString ("MusicBrainz Artist Id",value);} } /// /// Gets and sets the MusicBrainz ReleaseID /// /// /// A containing the MusicBrainz /// ReleaseID for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "TXXX:MusicBrainz Album Id" frame. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseId { get {return GetUserTextAsString ("MusicBrainz Album Id");} set {SetUserTextAsString ("MusicBrainz Album Id",value);} } /// /// Gets and sets the MusicBrainz ReleaseArtistID /// /// /// A containing the MusicBrainz /// ReleaseArtistID for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "TXXX:MusicBrainz Album Artist Id" frame. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseArtistId { get {return GetUserTextAsString ("MusicBrainz Album Artist Id");} set {SetUserTextAsString ("MusicBrainz Album Artist Id",value);} } /// /// Gets and sets the MusicBrainz TrackID /// /// /// A containing the MusicBrainz /// TrackID for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "UFID:http://musicbrainz.org" frame. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzTrackId { get { return GetUfidText ("http://musicbrainz.org");} set {SetUfidText ("http://musicbrainz.org", value);} } /// /// Gets and sets the MusicBrainz DiscID /// /// /// A containing the MusicBrainz /// DiscID for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "TXXX:MusicBrainz Disc Id" frame. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzDiscId { get {return GetUserTextAsString ("MusicBrainz Disc Id");} set {SetUserTextAsString ("MusicBrainz Disc Id",value);} } /// /// Gets and sets the MusicIP PUID /// /// /// A containing the MusicIP PUID /// for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "TXXX:MusicIP PUID" frame. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicIpId { get {return GetUserTextAsString ("MusicIP PUID");} set {SetUserTextAsString ("MusicIP PUID",value);} } /// /// Gets and sets the Amazon ID (ASIN) /// /// /// A containing the Amazon Id /// for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "TXXX:ASIN" frame. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string AmazonId { get {return GetUserTextAsString ("ASIN");} set {SetUserTextAsString ("ASIN",value);} } /// /// Gets and sets the MusicBrainz ReleaseStatus /// /// /// A containing the MusicBrainz /// ReleaseStatus for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "TXXX:MusicBrainz Album Status" frame. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseStatus { get {return GetUserTextAsString ("MusicBrainz Album Status");} set {SetUserTextAsString ("MusicBrainz Album Status",value);} } /// /// Gets and sets the MusicBrainz ReleaseType /// /// /// A containing the MusicBrainz /// ReleaseType for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "TXXX:MusicBrainz Album Type" frame. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseType { get {return GetUserTextAsString ("MusicBrainz Album Type");} set {SetUserTextAsString ("MusicBrainz Album Type",value);} } /// /// Gets and sets the MusicBrainz ReleaseCountry /// /// /// A containing the MusicBrainz /// ReleaseCountry for the media described by the current /// instance, or null if no value is present. /// /// /// This property is implemented using the "TXXX:MusicBrainz Album Release Country" frame. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseCountry { get {return GetUserTextAsString ("MusicBrainz Album Release Country");} set {SetUserTextAsString ("MusicBrainz Album Release Country",value);} } /// /// Gets and sets a collection of pictures associated with /// the media represented by the current instance. /// /// /// A containing a collection of /// pictures associated with the media represented by the /// current instance or an empty array if none are present. /// /// /// This property is implemented using the "APIC" Attached /// Picture Frame. /// public override IPicture [] Pictures { get { return new List ( GetFrames ( FrameType.APIC)).ToArray (); } set { RemoveFrames(FrameType.APIC); if(value == null || value.Length == 0) return; foreach(IPicture picture in value) { AttachedPictureFrame frame = picture as AttachedPictureFrame; if (frame == null) frame = new AttachedPictureFrame ( picture); AddFrame (frame); } } } /// /// Gets whether or not the current instance is empty. /// /// /// if the current instance does not /// any values. Otherwise . /// public override bool IsEmpty { get {return frame_list.Count == 0;} } /// /// Clears the values stored in the current instance. /// public override void Clear () { frame_list.Clear (); } /// /// Gets and sets whether or not the album described by the /// current instance is a compilation. /// /// /// A value indicating whether or not the /// album described by the current instance is a compilation. /// /// /// This property is implemented using the "TCMP" Text /// Information Frame to provide support for a feature of the /// Apple iPod and iTunes products. /// public bool IsCompilation { get { string val = GetTextAsString (FrameType.TCMP); return !string.IsNullOrEmpty (val) && val != "0"; } set {SetTextFrame (FrameType.TCMP, value ? "1" : null);} } /// /// Copies the values from the current instance to another /// , optionally overwriting /// existing values. /// /// /// A object containing the target /// tag to copy values to. /// /// /// A specifying whether or not to copy /// values over existing one. /// /// /// If is of type a complete copy of all values /// will be performed. Otherwise, only standard values will /// be copied. /// /// /// is . /// public override void CopyTo (TagLib.Tag target, bool overwrite) { if (target == null) throw new ArgumentNullException ("target"); TagLib.Id3v2.Tag match = target as TagLib.Id3v2.Tag; if (match == null) { base.CopyTo (target, overwrite); return; } List frames = new List (frame_list); while (frames.Count > 0) { ByteVector ident = frames [0].FrameId; bool copy = true; if (overwrite) { match.RemoveFrames (ident); } else { foreach (Frame f in match.frame_list) if (f.FrameId.Equals (ident)) { copy = false; break; } } for (int i = 0; i < frames.Count;) { if (frames [i].FrameId.Equals (ident)) { if (copy) match.frame_list.Add ( frames [i].Clone ()); frames.RemoveAt (i); } else { i ++; } } } } #endregion #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to the current /// instance. /// public Tag Clone () { Tag tag = new Tag (); tag.header = header; if (tag.extended_header != null) tag.extended_header = extended_header.Clone (); foreach (Frame frame in frame_list) tag.frame_list.Add (frame.Clone ()); return tag; } object ICloneable.Clone () { return Clone (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/Footer.cs0000644000175000017500000001767011462100402022721 0ustar00rubenruben00000000000000// // Footer.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // id3v2header.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2002,2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Id3v2 { /// /// This structure provides a representation of an ID3v2 tag footer /// which can be read from and written to disk. /// public struct Footer { #region Private Fields /// /// Contains the tag's major version. /// private byte major_version; /// /// Contains the tag's version revision. /// private byte revision_number; /// /// Contains tag's flags. /// private HeaderFlags flags; /// /// Contains the tag size. /// private uint tag_size; #endregion #region Public Fields /// /// The size of a ID3v2 footer. /// public const uint Size = 10; /// /// The identifier used to recognize a ID3v2 footer. /// /// /// "3DI" /// public static readonly ReadOnlyByteVector FileIdentifier = "3DI"; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading it from raw footer data. /// /// /// A object containing the raw /// data to build the new instance from. /// /// /// is . /// /// /// is smaller than , does not begin with , contains invalid flag data, /// or contains invalid size data. /// public Footer (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); if (data.Count < Size) throw new CorruptFileException ( "Provided data is smaller than object size."); if (!data.StartsWith (FileIdentifier)) throw new CorruptFileException ( "Provided data does not start with the file identifier"); major_version = data [3]; revision_number = data [4]; flags = (HeaderFlags) data [5]; if (major_version == 2 && ((int) flags & 127) != 0) throw new CorruptFileException ( "Invalid flags set on version 2 tag."); if (major_version == 3 && ((int) flags & 15) != 0) throw new CorruptFileException ( "Invalid flags set on version 3 tag."); if (major_version == 4 && ((int) flags & 7) != 0) throw new CorruptFileException ( "Invalid flags set on version 4 tag."); for (int i = 6; i < 10; i ++) if (data [i] >= 128) throw new CorruptFileException ( "One of the bytes in the header was greater than the allowed 128."); tag_size = SynchData.ToUInt (data.Mid (6, 4)); } /// /// Constructs and intializes a new instance of by reading in the contents of the header /// object used for the same tag. /// /// /// A object to base the new instance /// off of. /// public Footer (Header header) { major_version = header.MajorVersion; revision_number = header.RevisionNumber; flags = header.Flags | HeaderFlags.FooterPresent; tag_size = header.TagSize; } #endregion #region Public Properties /// /// Gets and sets the major version of the tag described by /// the current instance. /// /// /// A value specifying the ID3v2 version /// of tag described by the current instance. /// /// /// When the version is set, unsupported header flags will /// automatically be removed from the tag. /// /// /// is not 4. /// public byte MajorVersion { get { return major_version == 0 ? Tag.DefaultVersion : major_version; } set { if (value != 4) throw new ArgumentException ( "Version unsupported."); major_version = value; } } /// /// Gets and sets the version revision number of the tag /// represented by the current instance. /// /// /// A value containing the version /// revision number of the tag represented by the current /// instance. /// /// /// This value should always be zeroed. A non-zero value /// indicates an experimental or new version of the format /// which may not be completely understood by the current /// implementation. Some software may refuse to read tags /// with a non-zero value. /// public byte RevisionNumber { get {return revision_number;} set {revision_number = value;} } /// /// Gets and sets the flags applied to the current instance. /// /// /// A bitwise combined value /// containing the flags applied to the current instance. /// /// /// contains a flag not supported /// by the the ID3v2 version of the current instance. /// public HeaderFlags Flags { get {return flags;} set { if (0 != (value & (HeaderFlags.ExtendedHeader | HeaderFlags.ExperimentalIndicator)) && MajorVersion < 3) throw new ArgumentException ( "Feature only supported in version 2.3+", "value"); if (0 != (value & HeaderFlags.FooterPresent) && MajorVersion < 3) throw new ArgumentException ( "Feature only supported in version 2.4+", "value"); flags = value; } } /// /// Gets and sets the size of the tag described by the /// current instance, minus the header and footer. /// /// /// A value containing the size of the /// tag described by the current instance. /// public uint TagSize { get {return tag_size;} set {tag_size = value;} } /// /// Gets the complete size of the tag described by the /// current instance, including the header and footer. /// /// /// A value containing the complete size /// of the tag described by the current instance. /// public uint CompleteTagSize { get {return TagSize + Header.Size + Size;} } #endregion #region Public Methods /// /// Renders the current instance as a raw ID3v2 header. /// /// /// A object containing the /// rendered header. /// public ByteVector Render () { ByteVector v = new ByteVector (); v.Add (FileIdentifier); v.Add (MajorVersion); v.Add (RevisionNumber); v.Add ((byte)flags); v.Add (SynchData.FromUInt (TagSize)); return v; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Id3v2/FrameTypes.cs0000644000175000017500000001023511462100402023530 0ustar00rubenruben00000000000000// // FrameTypes.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Id3v2 { /// /// provides references to different frame /// types used by the library. /// /// /// This class is used to severely reduce the number of times /// these types are created in , /// greatly improving the speed at which warm files are read. It is, /// however, not necessary for external users to use this class. While /// the library may use GetTextAsString (FrameType.TIT2); an /// external user could use tag.GetTextAsString ("TIT2"); with /// the same result. /// internal static class FrameType { public static readonly ReadOnlyByteVector APIC = "APIC"; public static readonly ReadOnlyByteVector COMM = "COMM"; public static readonly ReadOnlyByteVector EQUA = "EQUA"; public static readonly ReadOnlyByteVector GEOB = "GEOB"; public static readonly ReadOnlyByteVector MCDI = "MCDI"; public static readonly ReadOnlyByteVector PCNT = "PCNT"; public static readonly ReadOnlyByteVector POPM = "POPM"; public static readonly ReadOnlyByteVector PRIV = "PRIV"; public static readonly ReadOnlyByteVector RVA2 = "RVA2"; public static readonly ReadOnlyByteVector RVAD = "RVAD"; public static readonly ReadOnlyByteVector SYLT = "SYLT"; public static readonly ReadOnlyByteVector TALB = "TALB"; public static readonly ReadOnlyByteVector TBPM = "TBPM"; public static readonly ReadOnlyByteVector TCOM = "TCOM"; public static readonly ReadOnlyByteVector TCON = "TCON"; public static readonly ReadOnlyByteVector TCOP = "TCOP"; public static readonly ReadOnlyByteVector TCMP = "TCMP"; public static readonly ReadOnlyByteVector TDRC = "TDRC"; public static readonly ReadOnlyByteVector TDAT = "TDAT"; public static readonly ReadOnlyByteVector TEXT = "TEXT"; public static readonly ReadOnlyByteVector TIT1 = "TIT1"; public static readonly ReadOnlyByteVector TIT2 = "TIT2"; public static readonly ReadOnlyByteVector TIME = "TIME"; public static readonly ReadOnlyByteVector TOLY = "TOLY"; public static readonly ReadOnlyByteVector TOPE = "TOPE"; public static readonly ReadOnlyByteVector TPE1 = "TPE1"; public static readonly ReadOnlyByteVector TPE2 = "TPE2"; public static readonly ReadOnlyByteVector TPE3 = "TPE3"; public static readonly ReadOnlyByteVector TPE4 = "TPE4"; public static readonly ReadOnlyByteVector TPOS = "TPOS"; public static readonly ReadOnlyByteVector TRCK = "TRCK"; public static readonly ReadOnlyByteVector TRDA = "TRDA"; public static readonly ReadOnlyByteVector TSIZ = "TSIZ"; public static readonly ReadOnlyByteVector TSOA = "TSOA"; // Album Title Sort Frame public static readonly ReadOnlyByteVector TSO2 = "TSO2"; // Album Artist Sort Frame public static readonly ReadOnlyByteVector TSOC = "TSOC"; // Composer Sort Frame public static readonly ReadOnlyByteVector TSOP = "TSOP"; // Performer Sort Frame public static readonly ReadOnlyByteVector TSOT = "TSOT"; // Track Title Sort Frame public static readonly ReadOnlyByteVector TXXX = "TXXX"; public static readonly ReadOnlyByteVector TYER = "TYER"; public static readonly ReadOnlyByteVector UFID = "UFID"; public static readonly ReadOnlyByteVector USER = "USER"; public static readonly ReadOnlyByteVector USLT = "USLT"; } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ogg/0000777000175000017500000000000011503407416020765 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ogg/Codecs/0000777000175000017500000000000011503407416022165 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ogg/Codecs/Vorbis.cs0000644000175000017500000002314011462100402023741 0ustar00rubenruben00000000000000// // Vorbis.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Ogg.Codecs { /// /// This class extends and implements to provide support for processing Ogg /// Vorbis bitstreams. /// public class Vorbis : Codec, IAudioCodec { #region Private Static Fields /// /// Contains the file identifier. /// private static ByteVector id = "vorbis"; #endregion #region Private Fields /// /// Contains the header packet. /// private HeaderPacket header; /// /// Contains the comment data. /// private ByteVector comment_data; #endregion #region Constructors /// /// Constructs and initializes a new instance of . /// private Vorbis () { } #endregion #region Public Methods /// /// Reads a Ogg packet that has been encountered in the /// stream. /// /// /// A object containing a packet to /// be read by the current instance. /// /// /// A value containing the index of the /// packet in the stream. /// /// /// if the codec has read all the /// necessary packets for the stream and does not need to be /// called again, typically once the Xiph comment has been /// found. Otherwise . /// /// /// is . /// /// /// is less than zero. /// /// /// The data does not conform to the specificiation for the /// codec represented by the current instance. /// public override bool ReadPacket (ByteVector packet, int index) { if (packet == null) throw new ArgumentNullException ("packet"); if (index < 0) throw new ArgumentOutOfRangeException ("index", "index must be at least zero."); int type = PacketType (packet); if (type != 1 && index == 0) throw new CorruptFileException ( "Stream does not begin with vorbis header."); if (comment_data == null) { if (type == 1) header = new HeaderPacket (packet); else if (type == 3) comment_data = packet.Mid (7); else return true; } return comment_data != null; } /// /// Computes the duration of the stream using the first and /// last granular positions of the stream. /// /// /// A value containing the first granular /// position of the stream. /// /// /// A value containing the last granular /// position of the stream. /// /// /// A value containing the duration /// of the stream. /// public override TimeSpan GetDuration (long firstGranularPosition, long lastGranularPosition) { return header.sample_rate == 0 ? TimeSpan.Zero : TimeSpan.FromSeconds ((double) (lastGranularPosition - firstGranularPosition) / (double) header.sample_rate); } /// /// Replaces the comment packet in a collection of packets /// with the rendered version of a Xiph comment or inserts a /// comment packet if the stream lacks one. /// /// /// A object containing /// a collection of packets. /// /// /// A object to store the rendered /// version of in . /// /// /// or is . /// public override void SetCommentPacket (ByteVectorCollection packets, XiphComment comment) { if (packets == null) throw new ArgumentNullException ("packets"); if (comment == null) throw new ArgumentNullException ("comment"); ByteVector data = new ByteVector ((byte) 0x03); data.Add (id); data.Add (comment.Render (true)); if (packets.Count > 1 && PacketType (packets [1]) == 0x03) packets [1] = data; else packets.Insert (1, data); } #endregion #region Public Properties /// /// Gets the bitrate of the audio represented by the current /// instance. /// /// /// A value containing a bitrate of the /// audio represented by the current instance. /// public int AudioBitrate { get { return (int) ((float)header.bitrate_nominal / 1000f + 0.5); } } /// /// Gets the sample rate of the audio represented by the /// current instance. /// /// /// A value containing the sample rate of /// the audio represented by the current instance. /// public int AudioSampleRate { get {return (int) header.sample_rate;} } /// /// Gets the number of channels in the audio represented by /// the current instance. /// /// /// A value containing the number of /// channels in the audio represented by the current /// instance. /// public int AudioChannels { get {return (int) header.channels;} } /// /// Gets the types of media represented by the current /// instance. /// /// /// Always . /// public override MediaTypes MediaTypes { get {return MediaTypes.Audio;} } /// /// Gets the raw Xiph comment data contained in the codec. /// /// /// A object containing a raw Xiph /// comment or if none was found. /// public override ByteVector CommentData { get {return comment_data;} } /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public override string Description { get { return string.Format ( "Vorbis Version {0} Audio", header.vorbis_version); } } #endregion #region Public Static Methods /// /// Implements the delegate to /// provide support for recognizing a Vorbis stream from the /// header packet. /// /// /// A object containing the stream /// header packet. /// /// /// A object containing a codec capable /// of parsing the stream of if the /// stream is not a Vorbis stream. /// public static Codec FromPacket (ByteVector packet) { return (PacketType (packet) == 1) ? new Vorbis () : null; } #endregion #region Private Static Methods /// /// Gets the packet type for a specified Vorbis packet. /// /// /// A object containing a Vorbis /// packet. /// /// /// A value containing the packet type or /// -1 if the packet is invalid. /// private static int PacketType (ByteVector packet) { if (packet.Count <= id.Count) return -1; for (int i = 0; i < id.Count; i ++) if (packet [i + 1] != id [i]) return -1; return packet [0]; } #endregion /// /// This structure represents a Vorbis header packet. /// private struct HeaderPacket { public uint sample_rate; public uint channels; public uint vorbis_version; public uint bitrate_maximum; public uint bitrate_nominal; public uint bitrate_minimum; public HeaderPacket (ByteVector data) { vorbis_version = data.Mid(7, 4).ToUInt (false); channels = data [11]; sample_rate = data.Mid(12, 4).ToUInt (false); bitrate_maximum = data.Mid(16, 4).ToUInt (false); bitrate_nominal = data.Mid(20, 4).ToUInt (false); bitrate_minimum = data.Mid(24, 4).ToUInt (false); } } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ogg/Codecs/Theora.cs0000644000175000017500000002466711462100402023736 0ustar00rubenruben00000000000000// // Theora.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Ogg.Codecs { /// /// This class extends and implements to provide support for processing Ogg /// Theora bitstreams. /// public class Theora : Codec, IVideoCodec { #region Private Static Fields /// /// Contains the file identifier. /// private static ByteVector id = "theora"; #endregion #region Private Fields /// /// Contains the header packet. /// private HeaderPacket header; /// /// Contains the comment data. /// private ByteVector comment_data; #endregion #region Constructors /// /// Constructs and initializes a new instance of . /// private Theora () { } #endregion #region Public Methods /// /// Reads a Ogg packet that has been encountered in the /// stream. /// /// /// A object containing a packet to /// be read by the current instance. /// /// /// A value containing the index of the /// packet in the stream. /// /// /// if the codec has read all the /// necessary packets for the stream and does not need to be /// called again, typically once the Xiph comment has been /// found. Otherwise . /// /// /// is . /// /// /// is less than zero. /// /// /// The data does not conform to the specificiation for the /// codec represented by the current instance. /// public override bool ReadPacket (ByteVector packet, int index) { if (packet == null) throw new ArgumentNullException ("packet"); if (index < 0) throw new ArgumentOutOfRangeException ("index", "index must be at least zero."); int type = PacketType (packet); if (type != 0x80 && index == 0) throw new CorruptFileException ( "Stream does not begin with theora header."); if (comment_data == null) { if (type == 0x80) header = new HeaderPacket (packet); else if (type == 0x81) comment_data = packet.Mid (7); else return true; } return comment_data != null; } /// /// Computes the duration of the stream using the first and /// last granular positions of the stream. /// /// /// A value containing the first granular /// position of the stream. /// /// /// A value containing the last granular /// position of the stream. /// /// /// A value containing the duration /// of the stream. /// public override TimeSpan GetDuration (long firstGranularPosition, long lastGranularPosition) { return TimeSpan.FromSeconds ( header.GranuleTime (lastGranularPosition) - header.GranuleTime (firstGranularPosition)); } /// /// Replaces the comment packet in a collection of packets /// with the rendered version of a Xiph comment or inserts a /// comment packet if the stream lacks one. /// /// /// A object containing /// a collection of packets. /// /// /// A object to store the rendered /// version of in . /// /// /// or is . /// public override void SetCommentPacket (ByteVectorCollection packets, XiphComment comment) { if (packets == null) throw new ArgumentNullException ("packets"); if (comment == null) throw new ArgumentNullException ("comment"); ByteVector data = new ByteVector ((byte) 0x81); data.Add (id); data.Add (comment.Render (true)); if (packets.Count > 1 && PacketType (packets [1]) == 0x81) packets [1] = data; else packets.Insert (1, data); } #endregion #region Public Properties /// /// Gets the width of the video represented by the current /// instance. /// /// /// A value containing the width of the /// video represented by the current instance. /// public int VideoWidth { get {return header.width;} } /// /// Gets the height of the video represented by the current /// instance. /// /// /// A value containing the height of the /// video represented by the current instance. /// public int VideoHeight { get {return header.height;} } /// /// Gets the types of media represented by the current /// instance. /// /// /// Always . /// public override MediaTypes MediaTypes { get {return MediaTypes.Video;} } /// /// Gets the raw Xiph comment data contained in the codec. /// /// /// A object containing a raw Xiph /// comment or if none was found. /// public override ByteVector CommentData { get {return comment_data;} } /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public override string Description { get { return string.Format ( "Theora Version {0}.{1} Video", header.major_version, header.minor_version); } } #endregion #region Public Static Methods /// /// Implements the delegate to /// provide support for recognizing a Theora stream from the /// header packet. /// /// /// A object containing the stream /// header packet. /// /// /// A object containing a codec capable /// of parsing the stream of if the /// stream is not a Theora stream. /// public static Codec FromPacket (ByteVector packet) { return (PacketType (packet) == 0x80) ? new Theora () : null; } #endregion #region Private Static Methods /// /// Gets the packet type for a specified Theora packet. /// /// /// A object containing a Theora /// packet. /// /// /// A value containing the packet type or /// -1 if the packet is invalid. /// private static int PacketType (ByteVector packet) { if (packet.Count <= id.Count || packet [0] < 0x80) return -1; for (int i = 0; i < id.Count; i ++) if (packet [i + 1] != id [i]) return -1; return packet [0]; } #endregion /// /// This structure represents a Theora header packet. /// private struct HeaderPacket { public byte major_version; public byte minor_version; public byte revision_version; public int width; public int height; public int fps_numerator; public int fps_denominator; public int keyframe_granule_shift; public HeaderPacket (ByteVector data) { major_version = data [7]; minor_version = data [8]; revision_version = data [9]; // width = data.Mid (10, 2).ToShort () << 4; // height = data.Mid (12, 2).ToShort () << 4; width = (int) data.Mid (14, 3).ToUInt (); // Frame Width. height = (int) data.Mid (17, 3).ToUInt (); // Frame Height. // Offset X. // Offset Y. fps_numerator = (int) data.Mid (22, 4).ToUInt (); fps_denominator = (int) data.Mid (26, 4).ToUInt (); // Aspect Numerator. // Aspect Denominator. // Colorspace. // Target bitrate. ushort last_bits = data.Mid (40, 2).ToUShort (); keyframe_granule_shift = (last_bits >> 5) & 0x1F; } /// /// Converts an absolute granular position into a /// seconds. /// /// /// A value containing the /// absolute granular position. /// /// /// A value containing the time /// at in /// seconds. /// /// Many thanks to the good people at /// irc://irc.freenode.net#theora for making this /// code a reality. /// public double GranuleTime (long granularPosition) { long iframe = granularPosition >> keyframe_granule_shift; long pframe = granularPosition - (iframe << keyframe_granule_shift); return (iframe + pframe) * ((double) fps_denominator / (double) fps_numerator); } } } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ogg/Codec.cs0000644000175000017500000002211711462100402022315 0ustar00rubenruben00000000000000// // Codec.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Ogg { /// /// This abstract class implements to provide /// support for processing packets from an Ogg logical bitstream. /// /// /// Unsupported Ogg codecs can be added by creating child classes and /// registering them using . /// /// /// public abstract class Codec : ICodec { #region Public Delegates /// /// Represents a method capable of checking an Ogg header /// packet to see it is matches a given codec. /// /// /// A object containing an Ogg /// header packet. /// /// /// A object capable of processing the /// stream from which the packet was generated; otherwise /// . /// /// /// In order to add support for a new Ogg codec in /// TagLib#, a derivative class of needs /// to be created. The class then needs to be added to the /// codec detection system by creating a and registering it with . /// A method implementing /// should read to determine if /// it's subclass can handle the data. If it can, it should /// return a new instance of that class, but in no way act /// upon the data. If the class cannot be used to read the /// packet, indicates to the system /// that it needs to try anther codec provider. /// /// /// The following example would check for a Speex /// packet and return a Speex codec: /// /// Codec.AddCodecProvider (delegate (ByteVector packet) { /// return packet.StartsWith ("Speex ") ? new MySpeexCodec () : null; /// }); /// /// public delegate Codec CodecProvider (ByteVector packet); #endregion #region Private Static Fields /// /// Contains registered codec providers. /// private static List providers = new List (); #endregion #region Private Static Methods /// /// Determines the correct codec to use for a stream header /// packet. /// /// /// A object containing the first /// packet of an Ogg logical bitstream. /// /// /// A object capable of handling /// and subsequent packets from /// the same stream. /// /// /// No registered codec capable of processing could be found. /// /// /// This method will first use /// delegates registered with /// and then attempt to use the built-in codecs. /// public static Codec GetCodec (ByteVector packet) { Codec c = null; foreach (CodecProvider p in providers) { c = p (packet); if (c != null) return c; } c = Codecs.Vorbis.FromPacket (packet); if (c != null) return c; c = Codecs.Theora.FromPacket (packet); if (c != null) return c; throw new UnsupportedFormatException ("Unknown codec."); } /// /// Adds a codec /// /// /// A /// /// /// A delegate is used to add /// support for new subclasses in . /// /// public static void AddCodecProvider (CodecProvider provider) { providers.Insert (0, provider); } #endregion #region Private Properties /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public abstract string Description {get;} /// /// Gets the types of media represented by the current /// instance. /// /// /// A bitwise combined containing /// the types of media represented by the current instance. /// public abstract MediaTypes MediaTypes {get;} /// /// Gets the raw Xiph comment data contained in the codec. /// /// /// A object containing a raw Xiph /// comment or if none was found. /// public abstract ByteVector CommentData {get;} /// /// Gets the duration of the media represented by the current /// instance. /// /// /// Always . /// /// /// In order to determine the duration of an Ogg stream, the /// first and last granular positions will be passed to . /// public TimeSpan Duration { get {return TimeSpan.Zero;} } #endregion #region Private Methods /// /// Reads a Ogg packet that has been encountered in the /// stream. /// /// /// A object containing a packet to /// be read by the current instance. /// /// /// A value containing the index of the /// packet in the stream. /// /// /// if the codec has read all the /// necessary packets for the stream and does not need to be /// called again, typically once the Xiph comment has been /// found. Otherwise . /// /// /// is . /// /// /// is less than zero. /// /// /// The data does not conform to the specificiation for the /// codec represented by the current instance. /// public abstract bool ReadPacket (ByteVector packet, int index); /// /// Computes the duration of the stream using the first and /// last granular positions of the stream. /// /// /// A value containing the first granular /// position of the stream. /// /// /// A value containing the last granular /// position of the stream. /// /// /// A value containing the duration /// of the stream. /// public abstract TimeSpan GetDuration (long firstGranularPosition, long lastGranularPosition); /// /// Replaces the comment packet in a collection of packets /// with the rendered version of a Xiph comment or inserts a /// comment packet if the stream lacks one. /// /// /// A object containing /// a collection of packets. /// /// /// A object to store the rendered /// version of in . /// /// /// or is . /// public abstract void SetCommentPacket (ByteVectorCollection packets, XiphComment comment); #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ogg/GroupedComment.cs0000644000175000017500000011255211462100402024233 0ustar00rubenruben00000000000000// // GroupedComment.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections.Generic; namespace TagLib.Ogg { /// /// This class combines a collection of /// objects so that properties can be read from each but are only set /// to the first comment of the file. /// public class GroupedComment : Tag { #region Private Fields /// /// Contains a mapping between stream serial numbers and /// comments. /// private Dictionary comment_hash; /// /// Contains comments in the order they are added. /// private List tags; #endregion #region Constructors /// /// Constructs and initializes a new instance of with now contents. /// public GroupedComment () : base () { comment_hash = new Dictionary (); tags = new List (); } /// /// Gets an enumeration of the comments in the current /// instance, in the order they were added. /// /// /// A object enumerating through the objects contained in the current instance. /// public IEnumerable Comments { get {return tags;} } /// /// Gets a comment in the current instance for a specified /// stream. /// /// /// A value containing the serial number /// of the stream of the comment to get. /// /// /// A with the matching serial /// number. /// public XiphComment GetComment (uint streamSerialNumber) { return comment_hash [streamSerialNumber]; } /// /// Adds a Xiph comment to the current instance. /// /// /// A value containing the serial number /// of the stream containing the comment. /// /// /// A object to add to the current /// instance. /// public void AddComment (uint streamSerialNumber, XiphComment comment) { comment_hash.Add (streamSerialNumber, comment); tags.Add (comment); } /// /// Adds a Xiph comment to the current instance. /// /// /// A value containing the serial number /// of the stream containing the comment. /// /// /// A object containing the raw Xiph /// comment to add to the current instance. /// public void AddComment (uint streamSerialNumber, ByteVector data) { AddComment (streamSerialNumber, new XiphComment (data)); } #endregion #region TagLib.Tag /// /// Gets the tag types contained in the current instance. /// /// /// A bitwise combined /// containing the tag types contained in the current /// instance. /// /// /// This value contains a bitwise combined value from all the /// child tags. /// /// public override TagTypes TagTypes { get { TagTypes types = TagTypes.None; foreach (XiphComment tag in tags) if (tag != null) types |= tag.TagTypes; return types; } } /// /// Gets and sets the title for the media described by the /// current instance. /// /// /// A object containing the title for /// the media described by the current instance or if no value is present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non- value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string Title { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.Title; if (value != null && value.Length > 0) return value; } return null; } set { if (tags.Count > 0) tags[0].Title = value; } } /// /// Gets and sets the sort names for the individual track title of /// the media described by the current instance. /// /// /// A containing the sort name /// for the track title of the media described by the current /// instance or null if no value is present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non-empty value is /// returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string TitleSort { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.TitleSort; if (value != null && value.Length > 0) return value; } return null; } set {if (tags.Count > 0) tags [0].TitleSort = value;} } /// /// Gets and sets the performers or artists who performed in /// the media described by the current instance. /// /// /// A array containing the performers or /// artists who performed in the media described by the /// current instance or an empty array if no value is /// present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non-empty value is /// returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string[] Performers { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string[] value = tag.Performers; if (value != null && value.Length > 0) return value; } return new string[] { }; } set { if (tags.Count > 0) tags[0].Performers = value; } } /// /// Gets and sets the sort names of the performers or artists /// who performed in the media described by the current instance. /// /// /// A containing the sort names for /// the performers or artists who performed in the media /// described by the current instance, or an empty array if /// no value is present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non-empty value is /// returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string [] PerformersSort { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string[] value = tag.PerformersSort; if (value != null && value.Length > 0) return value; } return new string[] { }; } set {if (tags.Count > 0) tags [0].PerformersSort = value;} } /// /// Gets and sets the band or artist who is credited in the /// creation of the entire album or collection containing the /// media described by the current instance. /// /// /// A array containing the band or artist /// who is credited in the creation of the entire album or /// collection containing the media described by the current /// instance or an empty array if no value is present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non-empty value is /// returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string[] AlbumArtists { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string[] value = tag.AlbumArtists; if (value != null && value.Length > 0) return value; } return new string[] { }; } set { if (tags.Count > 0) tags[0].AlbumArtists = value; } } /// /// Gets and sets the sort names for the band or artist who /// is credited in the creation of the entire album or /// collection containing the media described by the /// current instance. /// /// /// A containing the sort names /// for the band or artist who is credited in the creation /// of the entire album or collection containing the media /// described by the current instance or an empty array if /// no value is present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non-empty value is /// returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string[] AlbumArtistsSort { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string[] value = tag.AlbumArtistsSort; if (value != null && value.Length > 0) return value; } return new string[] { }; } set {if (tags.Count > 0) tags [0].AlbumArtistsSort = value;} } /// /// Gets and sets the composers of the media represented by /// the current instance. /// /// /// A array containing the composers of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non-empty value is /// returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string[] Composers { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string[] value = tag.Composers; if (value != null && value.Length > 0) return value; } return new string[] { }; } set { if (tags.Count > 0) tags[0].Composers = value; } } /// /// Gets and sets the sort names for the composer of /// the media described by the current instance. /// /// /// A containing the sort names /// for the composer of the media described by the current /// instance or an empty array if no value is present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non-empty value is /// returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string [] ComposersSort { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string[] value = tag.ComposersSort; if (value != null && value.Length > 0) return value; } return new string[] { }; } set {if (tags.Count > 0) tags [0].ComposersSort = value;} } /// /// Gets and sets the album of the media represented by the /// current instance. /// /// /// A object containing the album of /// the media represented by the current instance or if no value is present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non- value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string Album { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.Album; if (value != null && value.Length > 0) return value; } return null; } set { if (tags.Count > 0) tags[0].Album = value; } } /// /// Gets and sets the sort names for the album title of /// the media described by the current instance. /// /// /// A containing the sort names /// for the album title of the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non-empty value is /// returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string AlbumSort { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.AlbumSort; if (value != null && value.Length > 0) return value; } return null; } set {if (tags.Count > 0) tags [0].AlbumSort = value;} } /// /// Gets and sets a user comment on the media represented by /// the current instance. /// /// /// A object containing user comments /// on the media represented by the current instance or if no value is present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non- value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string Comment { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.Comment; if (value != null && value.Length > 0) return value; } return null; } set { if (tags.Count > 0) tags[0].Comment = value; } } /// /// Gets and sets the genres of the media represented by the /// current instance. /// /// /// A array containing the genres of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non-empty value is /// returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string[] Genres { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string[] value = tag.Genres; if (value != null && value.Length > 0) return value; } return new string[] { }; } set { if (tags.Count > 0) tags[0].Genres = value; } } /// /// Gets and sets the year that the media represented by the /// current instance was recorded. /// /// /// A containing the year that the media /// represented by the current instance was created or zero /// if no value is present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non- value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override uint Year { get { foreach (XiphComment tag in tags) if (tag != null && tag.Year != 0) return tag.Year; return 0; } set { if (tags.Count > 0) tags[0].Year = value; } } /// /// Gets and sets the position of the media represented by /// the current instance in its containing album. /// /// /// A containing the position of the /// media represented by the current instance in its /// containing album or zero if not specified. /// /// /// When getting the value, the child comments are /// looped through in order and the first non-zero value is /// returned. /// When setting the value, it is stored in the first /// comment. /// /// public override uint Track { get { foreach (XiphComment tag in tags) if (tag != null && tag.Track != 0) return tag.Track; return 0; } set { if (tags.Count > 0) tags[0].Track = value; } } /// /// Gets and sets the number of tracks in the album /// containing the media represented by the current instance. /// /// /// A containing the number of tracks in /// the album containing the media represented by the current /// instance or zero if not specified. /// /// /// When getting the value, the child comments are /// looped through in order and the first non-zero value is /// returned. /// When setting the value, it is stored in the first /// comment. /// /// public override uint TrackCount { get { foreach (XiphComment tag in tags) if (tag != null && tag.TrackCount != 0) return tag.TrackCount; return 0; } set { if (tags.Count > 0) tags[0].TrackCount = value; } } /// /// Gets and sets the number of the disc containing the media /// represented by the current instance in the boxed set. /// /// /// A containing the number of the disc /// containing the media represented by the current instance /// in the boxed set. /// /// /// When getting the value, the child comments are /// looped through in order and the first non-zero value is /// returned. /// When setting the value, it is stored in the first /// comment. /// /// public override uint Disc { get { foreach (XiphComment tag in tags) if (tag != null && tag.Disc != 0) return tag.Disc; return 0; } set { if (tags.Count > 0) tags[0].Disc = value; } } /// /// Gets and sets the number of discs in the boxed set /// containing the media represented by the current instance. /// /// /// A containing the number of discs in /// the boxed set containing the media represented by the /// current instance or zero if not specified. /// /// /// When getting the value, the child comments are /// looped through in order and the first non-zero value is /// returned. /// When setting the value, it is stored in the first /// comment. /// /// public override uint DiscCount { get { foreach (XiphComment tag in tags) if (tag != null && tag.DiscCount != 0) return tag.DiscCount; return 0; } set { if (tags.Count > 0) tags[0].DiscCount = value; } } /// /// Gets and sets the lyrics or script of the media /// represented by the current instance. /// /// /// A object containing the lyrics or /// script of the media represented by the current instance /// or if no value is present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non- value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string Lyrics { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.Lyrics; if (value != null && value.Length > 0) return value; } return null; } set { if (tags.Count > 0) tags[0].Lyrics = value; } } /// /// Gets and sets the grouping on the album which the media /// in the current instance belongs to. /// /// /// A object containing the grouping on /// the album which the media in the current instance belongs /// to or if no value is present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non- value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string Grouping { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.Grouping; if (value != null && value.Length > 0) return value; } return null; } set { if (tags.Count > 0) tags[0].Grouping = value; } } /// /// Gets and sets the number of beats per minute in the audio /// of the media represented by the current instance. /// /// /// A containing the number of beats per /// minute in the audio of the media represented by the /// current instance, or zero if not specified. /// /// /// When getting the value, the child comments are /// looped through in order and the first non-zero value is /// returned. /// When setting the value, it is stored in the first /// comment. /// /// public override uint BeatsPerMinute { get { foreach (XiphComment tag in tags) if (tag != null && tag.BeatsPerMinute != 0) return tag.BeatsPerMinute; return 0; } set { if (tags.Count > 0) tags[0].BeatsPerMinute = value; } } /// /// Gets and sets the conductor or director of the media /// represented by the current instance. /// /// /// A object containing the conductor /// or director of the media represented by the current /// instance or if no value present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non- value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string Conductor { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.Conductor; if (value != null && value.Length > 0) return value; } return null; } set { if (tags.Count > 0) tags[0].Conductor = value; } } /// /// Gets and sets the copyright information for the media /// represented by the current instance. /// /// /// A object containing the copyright /// information for the media represented by the current /// instance or if no value present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non- value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string Copyright { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.Copyright; if (value != null && value.Length > 0) return value; } return null; } set { if (tags.Count > 0) tags[0].Copyright = value; } } /// /// Gets and sets the MusicBrainz Artist ID. /// /// /// A containing the MusicBrainz /// ArtistID for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child comments are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string MusicBrainzArtistId { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.MusicBrainzArtistId; if (value != null && value.Length > 0) return value; } return null; } set {if (tags.Count > 0) tags [0].MusicBrainzArtistId = value;} } /// /// Gets and sets the MusicBrainz Release ID. /// /// /// A containing the MusicBrainz /// ReleaseID for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child comments are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string MusicBrainzReleaseId { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.MusicBrainzReleaseId; if (value != null && value.Length > 0) return value; } return null; } set {if (tags.Count > 0) tags [0].MusicBrainzReleaseId = value;} } /// /// Gets and sets the MusicBrainz Release Artist ID. /// /// /// A containing the MusicBrainz /// ReleaseArtistID for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child comments are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string MusicBrainzReleaseArtistId { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.MusicBrainzReleaseArtistId; if (value != null && value.Length > 0) return value; } return null; } set {if (tags.Count > 0) tags [0].MusicBrainzReleaseArtistId = value;} } /// /// Gets and sets the MusicBrainz Track ID. /// /// /// A containing the MusicBrainz /// TrackID for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child comments are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string MusicBrainzTrackId { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.MusicBrainzTrackId; if (value != null && value.Length > 0) return value; } return null; } set {if (tags.Count > 0) tags [0].MusicBrainzTrackId = value;} } /// /// Gets and sets the MusicBrainz Disc ID. /// /// /// A containing the MusicBrainz /// DiscID for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child comments are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string MusicBrainzDiscId { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.MusicBrainzDiscId; if (value != null && value.Length > 0) return value; } return null; } set {if (tags.Count > 0) tags [0].MusicBrainzDiscId = value;} } /// /// Gets and sets the MusicIP PUID. /// /// /// A containing the MusicIP PUID /// for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child comments are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string MusicIpId { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.MusicIpId; if (value != null && value.Length > 0) return value; } return null; } set {if (tags.Count > 0) tags [0].MusicIpId = value;} } /// /// Gets and sets the Amazon ID. /// /// /// A containing the Amazon ID /// for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child comments are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string AmazonId { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.AmazonId; if (value != null && value.Length > 0) return value; } return null; } set {if (tags.Count > 0) tags [0].AmazonId = value;} } /// /// Gets and sets the MusicBrainz Release Status. /// /// /// A containing the MusicBrainz /// Release Status for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child comments are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string MusicBrainzReleaseStatus { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.MusicBrainzReleaseStatus; if (value != null && value.Length > 0) return value; } return null; } set {if (tags.Count > 0) tags [0].MusicBrainzReleaseStatus = value;} } /// /// Gets and sets the MusicBrainz Release Type. /// /// /// A containing the MusicBrainz /// Release Type for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child comments are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string MusicBrainzReleaseType { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.MusicBrainzReleaseType; if (value != null && value.Length > 0) return value; } return null; } set {if (tags.Count > 0) tags [0].MusicBrainzReleaseType = value;} } /// /// Gets and sets the MusicBrainz Release Country. /// /// /// A containing the MusicBrainz /// Release Country for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child comments are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in the first /// comment. /// /// public override string MusicBrainzReleaseCountry { get { foreach (XiphComment tag in tags) { if (tag == null) continue; string value = tag.MusicBrainzReleaseCountry; if (value != null && value.Length > 0) return value; } return null; } set {if (tags.Count > 0) tags [0].MusicBrainzReleaseCountry = value;} } /// /// Gets and sets a collection of pictures associated with /// the media represented by the current instance. /// /// /// A containing a collection of /// pictures associated with the media represented by the /// current instance or an empty array if none are present. /// /// /// When getting the value, the child comments are /// looped through in order and the first non-empty value is /// returned. /// When setting the value, it is stored in the first /// comment. /// /// public override IPicture [] Pictures { get { IPicture [] output = new IPicture [0]; foreach (XiphComment tag in tags) if (tag != null && output.Length == 0) output = tag.Pictures; return output; } set {if (tags.Count > 0) tags [0].Pictures = value;} } /// /// Gets whether or not the current instance is empty. /// /// /// if all the comments tags are /// empty; otherwise . /// /// public override bool IsEmpty { get { foreach (XiphComment tag in tags) if (!tag.IsEmpty) return false; return true; } } /// /// Clears all of the child tags. /// public override void Clear () { foreach (XiphComment tag in tags) tag.Clear (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ogg/File.cs0000644000175000017500000003056511462100402022165 0ustar00rubenruben00000000000000// // File.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // oggfile.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections.Generic; using System; namespace TagLib.Ogg { /// /// This class extends to provide tagging /// and properties support for Ogg files. /// [SupportedMimeType("taglib/ogg", "ogg")] [SupportedMimeType("taglib/oga", "oga")] [SupportedMimeType("taglib/ogv", "ogv")] [SupportedMimeType("application/ogg")] [SupportedMimeType("application/x-ogg")] [SupportedMimeType("audio/vorbis")] [SupportedMimeType("audio/x-vorbis")] [SupportedMimeType("audio/x-vorbis+ogg")] [SupportedMimeType("audio/ogg")] [SupportedMimeType("audio/x-ogg")] [SupportedMimeType("video/ogg")] [SupportedMimeType("video/x-ogm+ogg")] [SupportedMimeType("video/x-theora+ogg")] [SupportedMimeType("video/x-theora")] public class File : TagLib.File { #region Private Fields /// /// Contains the tags for the file. /// private GroupedComment tag; /// /// Contains the media properties. /// private Properties properties; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : this (new File.LocalFileAbstraction (path), propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system with an average read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : this (path, ReadStyle.Average) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction) { Mode = AccessMode.Read; try { tag = new GroupedComment (); Read (propertiesStyle); TagTypesOnDisk = TagTypes; } finally { Mode = AccessMode.Closed; } } /// /// Constructs and initializes a new instance of for a specified file abstraction with an /// average read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// public File (File.IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) { } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { Mode = AccessMode.Write; try { long end; List pages = new List (); Dictionary streams = ReadStreams (pages, out end); Dictionary paginators = new Dictionary (); List> new_pages = new List> (); Dictionary shifts = new Dictionary (); foreach (Page page in pages) { uint id = page.Header.StreamSerialNumber; if (!paginators.ContainsKey (id)) paginators.Add (id, new Paginator ( streams [id].Codec)); paginators [id].AddPage (page); } foreach (uint id in paginators.Keys) { paginators [id].SetComment ( tag.GetComment (id)); int shift; new_pages.Add (new List ( paginators [id] .Paginate (out shift))); shifts.Add (id, shift); } ByteVector output = new ByteVector (); bool empty; do { empty = true; foreach (List stream_pages in new_pages) { if (stream_pages.Count == 0) continue; output.Add (stream_pages [0].Render ()); stream_pages.RemoveAt (0); if (stream_pages.Count != 0) empty = false; } } while (!empty); Insert (output, 0, end); InvariantStartPosition = output.Count; InvariantEndPosition = Length; TagTypesOnDisk = TagTypes; Page.OverwriteSequenceNumbers (this, output.Count, shifts); } finally { Mode = AccessMode.Closed; } } /// /// Removes a set of tag types from the current instance. /// /// /// A bitwise combined value /// containing tag types to be removed from the file. /// /// /// In order to remove all tags from a file, pass as . /// public override void RemoveTags (TagLib.TagTypes types) { if ((types & TagLib.TagTypes.Xiph) != TagLib.TagTypes.None) tag.Clear (); } /// /// Gets a tag of a specified type from the current instance, /// optionally creating a new tag if possible. /// /// /// A value indicating the /// type of tag to read. /// /// /// A value specifying whether or not to /// try and create the tag if one is not found. /// /// /// A object containing the tag that was /// found in or added to the current instance. If no /// matching tag was found and none was created, is returned. /// public override TagLib.Tag GetTag (TagLib.TagTypes type, bool create) { if (type == TagLib.TagTypes.Xiph) foreach (XiphComment comment in tag.Comments) return comment; return null; } #endregion #region Public Properties /// /// Gets a abstract representation of all tags stored in the /// current instance. /// /// /// A object representing all tags /// stored in the current instance. /// public override Tag Tag { get {return tag;} } /// /// Gets the media properties of the file represented by the /// current instance. /// /// /// A object containing the /// media properties of the file represented by the current /// instance. /// public override TagLib.Properties Properties { get {return properties;} } #endregion #region Private Methods /// /// Reads the file with a specified read style. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// private void Read (ReadStyle propertiesStyle) { long end; Dictionary streams = ReadStreams (null, out end); List codecs = new List (); InvariantStartPosition = end; InvariantEndPosition = Length; foreach (uint id in streams.Keys) { tag.AddComment (id, streams [id].Codec.CommentData); codecs.Add (streams [id].Codec); } if (propertiesStyle == ReadStyle.None) return; PageHeader last_header = LastPageHeader; TimeSpan duration = streams [last_header .StreamSerialNumber].GetDuration ( last_header.AbsoluteGranularPosition); properties = new Properties (duration, codecs); } /// /// Reads the file until all streams have finished their /// property and tagging data. /// /// /// A /// object to be filled with objects as /// they are read, or if the pages /// are not to be stored. /// /// /// A value reference to be updated to /// the postion of the first page not read by the current /// instance. /// /// /// A object containing stream serial numbers as the keys /// objects as the values. /// private Dictionary ReadStreams (List pages, out long end) { Dictionary streams = new Dictionary (); List active_streams = new List (); long position = 0; do { Bitstream stream = null; Page page = new Page (this, position); if ((page.Header.Flags & PageFlags.FirstPageOfStream) != 0) { stream = new Bitstream (page); streams.Add (page.Header .StreamSerialNumber, stream); active_streams.Add (stream); } if (stream == null) stream = streams [ page.Header.StreamSerialNumber]; if (active_streams.Contains (stream) && stream.ReadPage (page)) active_streams.Remove (stream); if (pages != null) pages.Add (page); position += page.Size; } while (active_streams.Count > 0); end = position; return streams; } #endregion #region Private Properties /// /// Gets the last page header in the file. /// /// /// A object containing the last /// page header in the file. /// /// /// The last page header is used to determine the last /// absolute granular position of a stream so the duration /// can be calculated. /// private PageHeader LastPageHeader { get { long last_page_header_offset = RFind ("OggS"); if (last_page_header_offset < 0) throw new CorruptFileException ( "Could not find last header."); return new PageHeader (this, last_page_header_offset); } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ogg/PageHeader.cs0000644000175000017500000003642011462100402023267 0ustar00rubenruben00000000000000// // PageHeader.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // oggpageheader.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Ogg { /// /// Indicates the special properties of a . /// [Flags] public enum PageFlags : byte { /// /// The page is a normal page. /// None = 0, /// /// The first packet of the page is continued from the /// previous page. /// FirstPacketContinued = 1, /// /// The page is the first page of the stream. /// FirstPageOfStream = 2, /// /// The page is the last page of the stream. /// LastPageOfStream = 4 } /// /// This structure provides a representation of an Ogg page header. /// public struct PageHeader { #region Private Propertis /// /// Contains the sizes of the packets contained in the /// current instance. /// private List packet_sizes; /// /// Contains the OGG version. /// private byte version; /// /// Contains the page flags. /// private PageFlags flags; /// /// Contains the page absolute granular postion. /// private ulong absolute_granular_position; /// /// Contains the stream serial number of the page. /// private uint stream_serial_number; /// /// Contains the page sequence number. /// private uint page_sequence_number; /// /// Contains the header size on disk. /// private uint size; /// /// Contains the data size on disk. /// private uint data_size; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a given serial number, page /// number, and flags. /// /// /// A value containing the serial number /// for the stream containing the page described by the new /// instance. /// /// /// A value containing the index of the /// page described by the new instance in the stream. /// /// /// A object containing the flags /// that apply to the page described by the new instance. /// public PageHeader (uint streamSerialNumber, uint pageNumber, PageFlags flags) { version = 0; this.flags = flags; absolute_granular_position = 0; stream_serial_number = streamSerialNumber; page_sequence_number = pageNumber; size = 0; data_size = 0; packet_sizes = new List (); if (pageNumber == 0 && (flags & PageFlags.FirstPacketContinued) == 0) this.flags |= PageFlags.FirstPageOfStream; } /// /// Constructs and initializes a new instance of by reading a raw Ogg page header /// from a specified position in a specified file. /// /// /// A object containing the file from /// which the contents of the new instance are to be read. /// /// /// A value specify at what position to /// read. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// /// /// The Ogg identifier could not be found at the correct /// location. /// public PageHeader (File file, long position) { if (file == null) throw new ArgumentNullException ("file"); if (position < 0 || position > file.Length - 27) throw new ArgumentOutOfRangeException ( "position"); file.Seek (position); // An Ogg page header is at least 27 bytes, so we'll go // ahead and read that much and then get the rest when // we're ready for it. ByteVector data = file.ReadBlock (27); if (data.Count < 27 || !data.StartsWith ("OggS")) throw new CorruptFileException ( "Error reading page header"); version = data [4]; this.flags = (PageFlags) data [5]; absolute_granular_position = data.Mid(6, 8).ToULong ( false); stream_serial_number = data.Mid(14, 4).ToUInt (false); page_sequence_number = data.Mid(18, 4).ToUInt (false); // Byte number 27 is the number of page segments, which // is the only variable length portion of the page // header. After reading the number of page segments // we'll then read in the coresponding data for this // count. int page_segment_count = data [26]; ByteVector page_segments = file.ReadBlock (page_segment_count); // Another sanity check. if (page_segment_count < 1 || page_segments.Count != page_segment_count) throw new CorruptFileException ( "Incorrect number of page segments"); // The base size of an Ogg page 27 bytes plus the number // of lacing values. size = (uint)(27 + page_segment_count); packet_sizes = new List (); int packet_size = 0; data_size = 0; for (int i = 0; i < page_segment_count; i++) { data_size += page_segments [i]; packet_size += page_segments [i]; if (page_segments [i] < 255) { packet_sizes.Add (packet_size); packet_size = 0; } } if (packet_size > 0) packet_sizes.Add (packet_size); } /// /// Constructs and initializes a new instance of by copying the values from another /// instance, offsetting the page number and applying new /// flags. /// /// /// A object to copy the values /// from. /// /// /// A value specifying how much to offset /// the page sequence number in the new instance. /// /// /// A value specifying the flags to /// use in the new instance. /// public PageHeader (PageHeader original, uint offset, PageFlags flags) { version = original.version; this.flags = flags; absolute_granular_position = original.absolute_granular_position; stream_serial_number = original.stream_serial_number; page_sequence_number = original.page_sequence_number + offset; size = original.size; data_size = original.data_size; packet_sizes = new List (); if (page_sequence_number == 0 && (flags & PageFlags.FirstPacketContinued) == 0) this.flags |= PageFlags.FirstPageOfStream; } #endregion #region Public Properties /// /// Gets and sets the sizes for the packets in the page /// described by the current instance. /// /// /// A containing the packet sizes. /// public int [] PacketSizes { get {return packet_sizes.ToArray ();} set { packet_sizes.Clear (); packet_sizes.AddRange (value); } } /// /// Gets the flags for the page described by the current /// instance. /// /// /// A value containing the page /// flags. /// public PageFlags Flags { get {return flags;} } /// /// Gets the absolute granular position of the page described /// by the current instance. /// /// /// A value containing the absolute /// granular position of the page. /// public long AbsoluteGranularPosition { get {return (long) absolute_granular_position;} } /// /// Gets the sequence number of the page described by the /// current instance. /// /// /// A value containing the sequence /// number of the page. /// public uint PageSequenceNumber { get {return page_sequence_number;} } /// /// Gets the serial number of stream that the page described /// by the current instance belongs to. /// /// /// A value containing the stream serial /// number. /// public uint StreamSerialNumber { get {return stream_serial_number;} } /// /// Gets the size of the header as it appeared on disk. /// /// /// A value containing the header size. /// public uint Size { get {return size;} } /// /// Gets the size of the data portion of the page described /// by the current instance as it appeared on disk. /// /// /// A value containing the data size. /// public uint DataSize { get {return data_size;} } #endregion #region Public Methods /// /// Renders the current instance as a raw Ogg page header. /// /// /// A object containing the /// rendered version of the current instance. /// public ByteVector Render () { ByteVector data = new ByteVector (); data.Add ("OggS"); data.Add (version); // stream structure version data.Add ((byte) flags); data.Add (ByteVector.FromULong ( absolute_granular_position, false)); data.Add (ByteVector.FromUInt ( stream_serial_number, false)); data.Add (ByteVector.FromUInt ( (uint) page_sequence_number, false)); data.Add (new ByteVector (4, 0)); // checksum, to be filled in later. ByteVector page_segments = LacingValues; data.Add ((byte) page_segments.Count); data.Add (page_segments); return data; } #endregion #region Private Properties /// /// Gets the rendered lacing values for the current instance. /// /// /// A object containing the /// rendered lacing values. /// private ByteVector LacingValues { get { ByteVector data = new ByteVector (); int [] sizes = PacketSizes; for (int i = 0; i < sizes.Length; i ++) { // The size of a packet in an Ogg page // is indicated by a series of "lacing // values" where the sum of the values // is the packet size in bytes. Each of // these values is a byte. A value of // less than 255 (0xff) indicates the // end of the packet. int quot = sizes [i] / 255; int rem = sizes [i] % 255; for (int j = 0; j < quot; j++) data.Add ((byte) 255); if (i < sizes.Length - 1 || (packet_sizes [i] % 255) != 0) data.Add ((byte) rem); } return data; } } #endregion #region IEquatable /// /// Generates a hash code for the current instance. /// /// /// A value containing the hash code for /// the current instance. /// public override int GetHashCode () { unchecked { return (int) (LacingValues.GetHashCode () ^ version ^ (int) flags ^ (int) absolute_granular_position ^ stream_serial_number ^ page_sequence_number ^ size ^ data_size); } } /// /// Checks whether or not the current instance is equal to /// another object. /// /// /// A to compare to the current /// instance. /// /// /// A value indicating whether or not the /// current instance is equal to . /// /// public override bool Equals (object other) { if (!(other is PageHeader)) return false; return Equals ((PageHeader) other); } /// /// Checks whether or not the current instance is equal to /// another instance of . /// /// /// A object to compare to the /// current instance. /// /// /// A value indicating whether or not the /// current instance is equal to . /// /// public bool Equals (PageHeader other) { return packet_sizes == other.packet_sizes && version == other.version && flags == other.flags && absolute_granular_position == other.absolute_granular_position && stream_serial_number == other.stream_serial_number && page_sequence_number == other.page_sequence_number && size == other.size && data_size == other.data_size; } /// /// Gets whether or not two instances of are equal to eachother. /// /// /// A object to compare. /// /// /// A object to compare. /// /// /// if is /// equal to . Otherwise, . /// public static bool operator == (PageHeader first, PageHeader second) { return first.Equals (second); } /// /// Gets whether or not two instances of differ. /// /// /// A object to compare. /// /// /// A object to compare. /// /// /// if is /// unequal to . Otherwise, . /// public static bool operator != (PageHeader first, PageHeader second) { return !first.Equals (second); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ogg/XiphComment.cs0000644000175000017500000010725211462100402023537 0ustar00rubenruben00000000000000// // XiphComment.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // xiphcomment.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections; using System.Collections.Generic; using System.Globalization; namespace TagLib.Ogg { /// /// This class extends and implements to provide /// support for reading and writing Xiph comments. /// public class XiphComment : TagLib.Tag, IEnumerable { #region Private Fields /// /// Contains the comment fields. /// private Dictionary field_list = new Dictionary (); /// /// Contains the ventor ID. /// private string vendor_id; /// /// Contains the field identifier to use for . /// private string comment_field = "DESCRIPTION"; #endregion #region Constructors /// /// Constructs and initializes a new instance of with no contents. /// public XiphComment () { } /// /// Constructs and initializes a new instance of by reading the contents of a raw /// Xiph Comment from a object. /// /// /// A object containing a raw Xiph /// comment. /// /// /// is . /// public XiphComment (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); Parse (data); } #endregion #region Public Methods /// /// Gets the field data for a given field identifier. /// /// /// A object containing the field /// identifier. /// /// /// A containing the field data or an /// empty array if the field was not found. /// /// /// is . /// public string [] GetField (string key) { if (key == null) throw new ArgumentNullException ("key"); key = key.ToUpper (CultureInfo.InvariantCulture); if (!field_list.ContainsKey (key)) return new string [0]; return (string []) field_list [key].Clone (); } /// /// Gets the first field for a given field identifier. /// /// /// A object containing the field /// identifier. /// /// /// A containing the field data or if the field was not found. /// /// /// is . /// public string GetFirstField (string key) { if (key == null) throw new ArgumentNullException ("key"); string [] values = GetField (key); return (values.Length > 0) ? values [0] : null; } /// /// Sets the contents of a specified field to a number. /// /// /// A object containing the field /// identifier. /// /// /// A value to set the field to. /// /// /// is . /// public void SetField (string key, uint number) { if (key == null) throw new ArgumentNullException ("key"); if (number == 0) RemoveField (key); else SetField (key, number.ToString ( CultureInfo.InvariantCulture)); } /// /// Sets the contents of a specified field to the contents of /// a . /// /// /// A object containing the field /// identifier. /// /// /// A containing the values to store /// in the current instance. /// /// /// is . /// public void SetField (string key, params string [] values) { if (key == null) throw new ArgumentNullException ("key"); key = key.ToUpper (CultureInfo.InvariantCulture); if (values == null || values.Length == 0) { RemoveField (key); return; } List result = new List (); foreach (string text in values) if (text != null && text.Trim ().Length != 0) result.Add (text); if (result.Count == 0) RemoveField (key); else if (field_list.ContainsKey (key)) field_list [key] = result.ToArray (); else field_list.Add (key, result.ToArray ()); } /// /// Removes a field and all its values from the current /// instance. /// /// /// A object containing the field /// identifier. /// /// /// is . /// public void RemoveField (string key) { if (key == null) throw new ArgumentNullException ("key"); key = key.ToUpper (CultureInfo.InvariantCulture); field_list.Remove (key); } /// /// Renders the current instance as a raw Xiph comment, /// optionally adding a framing bit. /// /// /// If , a framing bit will be added to /// the end of the content. /// /// /// A object containing the rendered /// version of the current instance. /// public ByteVector Render (bool addFramingBit) { ByteVector data = new ByteVector (); // Add the vendor ID length and the vendor ID. It's // important to use the length of the data(String::UTF8) // rather than the lenght of the the string since this // is UTF8 text and there may be more characters in the // data than in the UTF16 string. ByteVector vendor_data = ByteVector.FromString ( vendor_id, StringType.UTF8); data.Add (ByteVector.FromUInt ((uint) vendor_data.Count, false)); data.Add (vendor_data); // Add the number of fields. data.Add (ByteVector.FromUInt (FieldCount, false)); foreach (KeyValuePair entry in field_list) { // And now iterate over the values of the // current list. foreach (string value in entry.Value) { ByteVector field_data = ByteVector.FromString ( entry.Key, StringType.UTF8); field_data.Add ((byte) '='); field_data.Add (ByteVector.FromString ( value, StringType.UTF8)); data.Add (ByteVector.FromUInt ((uint) field_data.Count, false)); data.Add (field_data); } } // Append the "framing bit". if (addFramingBit) data.Add ((byte) 1); return data; } #endregion #region Public Properties /// /// Gets the number of fields contained in the current /// instance. /// /// /// A value containing the number of /// fields in the current instance. /// public uint FieldCount { get { uint count = 0; foreach (string [] values in field_list.Values) count += (uint) values.Length; return count; } } /// /// Gets the vendor ID for the current instance. /// /// /// A object containing the vendor ID /// for current instance. /// public string VendorId { get {return vendor_id;} } #endregion #region Protected Methods /// /// Populates and initializes a new instance of by reading the contents of a raw /// Xiph Comment from a object. /// /// /// A object containing a raw Xiph /// comment. /// /// /// is . /// protected void Parse (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); // The first thing in the comment data is the vendor ID // length, followed by a UTF8 string with the vendor ID. int pos = 0; int vendor_length = (int) data.Mid (pos, 4) .ToUInt (false); pos += 4; vendor_id = data.ToString (StringType.UTF8, pos, vendor_length); pos += vendor_length; // Next the number of fields in the comment vector. int comment_fields = (int) data.Mid (pos, 4) .ToUInt (false); pos += 4; for(int i = 0; i < comment_fields; i++) { // Each comment field is in the format // "KEY=value" in a UTF8 string and has 4 bytes // before the text starts that gives the length. int comment_length = (int) data.Mid (pos, 4) .ToUInt (false); pos += 4; string comment = data.ToString (StringType.UTF8, pos, comment_length); pos += comment_length; int comment_separator_position = comment .IndexOf ('='); if (comment_separator_position < 0) continue; string key = comment.Substring (0, comment_separator_position) .ToUpper ( CultureInfo.InvariantCulture); string value = comment.Substring ( comment_separator_position + 1); string [] values; if (field_list.TryGetValue (key, out values)) { Array.Resize (ref values, values.Length + 1); values [values.Length - 1] = value; field_list [key] = values; } else { SetField (key, value); } } } #endregion #region IEnumerable /// /// Gets an enumerator for enumerating through the the field /// identifiers. /// /// /// A for /// enumerating through the field identifiers. /// public IEnumerator GetEnumerator () { return field_list.Keys.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return field_list.Keys.GetEnumerator(); } #endregion #region TagLib.Tag /// /// Gets the tag types contained in the current instance. /// /// /// Always . /// public override TagTypes TagTypes { get {return TagTypes.Xiph;} } /// /// Gets and sets the title for the media described by the /// current instance. /// /// /// A object containing the title for /// the media described by the current instance or if no value is present. /// /// /// This property is implemented using the "TITLE" field. /// public override string Title { get {return GetFirstField ("TITLE");} set {SetField ("TITLE", value);} } /// /// Gets and sets the sort names for the Track Title of /// the media described by the current instance. /// /// /// A containing the sort name of /// the Track Title of the media described by the current /// instance or null if no value is present. /// /// /// This property is implemented using the "TITLESORT" /// field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string TitleSort { get {return GetFirstField ("TITLESORT");} set {SetField ("TITLESORT", value);} } /// /// Gets and sets the performers or artists who performed in /// the media described by the current instance. /// /// /// A containing the performers or /// artists who performed in the media described by the /// current instance or an empty array if no value is /// present. /// /// /// This property is implemented using the "ARTIST" field. /// public override string [] Performers { get {return GetField ("ARTIST");} set {SetField ("ARTIST", value);} } /// /// Gets and sets the sort names of the performers or artists /// who performed in the media described by the current instance. /// /// /// A containing the sort names for /// the performers or artists who performed in the media /// described by the current instance, or an empty array if /// no value is present. /// /// /// This property is implemented using the "ARTISTSORT" field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string [] PerformersSort { get {return GetField ("ARTISTSORT");} set {SetField ("ARTISTSORT", value);} } /// /// Gets and sets the band or artist who is credited in the /// creation of the entire album or collection containing the /// media described by the current instance. /// /// /// A containing the band or artist /// who is credited in the creation of the entire album or /// collection containing the media described by the current /// instance or an empty array if no value is present. /// /// /// This property is implemented using the "ALBUMARTIST" /// field. /// public override string [] AlbumArtists { get { // First try to get AlbumArtist, if that comment is not present try: // ENSEMBLE: set by TAG & RENAME // ALBUM ARTIST: set by The GodFather string[] value = GetField("ALBUMARTIST"); if (value != null && value.Length > 0) return value; value = GetField("ALBUM ARTIST"); if (value != null && value.Length > 0) return value; return GetField ("ENSEMBLE"); } set {SetField ("ALBUMARTIST", value);} } /// /// Gets and sets the sort names for the band or artist who /// is credited in the creation of the entire album or /// collection containing the media described by the /// current instance. /// /// /// A containing the sort names /// for the band or artist who is credited in the creation /// of the entire album or collection containing the media /// described by the current instance or an empty array if /// no value is present. /// /// /// This property is implemented using the "ALBUMARTISTSORT" /// field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string [] AlbumArtistsSort { get {return GetField ("ALBUMARTISTSORT");} set {SetField ("ALBUMARTISTSORT", value);} } /// /// Gets and sets the composers of the media represented by /// the current instance. /// /// /// A containing the composers of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This property is implemented using the "COMPOSER" field. /// public override string [] Composers { get {return GetField ("COMPOSER");} set {SetField ("COMPOSER", value);} } /// /// Gets and sets the sort names for the composers of /// the media described by the current instance. /// /// /// A containing the sort names /// for the composer of the media described by the current /// instance or an empty array if no value is present. /// /// /// This property is implemented using the "COMPOSERSORT" /// field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string [] ComposersSort { get {return GetField ("COMPOSERSORT");} set {SetField ("COMPOSERSORT", value);} } /// /// Gets and sets the album of the media represented by the /// current instance. /// /// /// A object containing the album of /// the media represented by the current instance or if no value is present. /// /// /// This property is implemented using the "ALBUM" field. /// public override string Album { get {return GetFirstField ("ALBUM");} set {SetField ("ALBUM", value);} } /// /// Gets and sets the sort names for the Album Title of /// the media described by the current instance. /// /// /// A containing the sort name of /// the Album Title of the media described by the current /// instance or null if no value is present. /// /// /// This property is implemented using the "ALBUMSORT" /// field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string AlbumSort { get {return GetFirstField ("ALBUMSORT");} set {SetField ("ALBUMSORT", value);} } /// /// Gets and sets a user comment on the media represented by /// the current instance. /// /// /// A object containing user comments /// on the media represented by the current instance or if no value is present. /// /// /// This property is implemented using the "COMMENT" or /// "DESCRIPTION" field, preferring "DESCRIPTION" but using /// "COMMENT" if that is the field used by the comment. /// public override string Comment { get { string value = GetFirstField (comment_field); if (value != null || comment_field == "COMMENT") return value; comment_field = "COMMENT"; return GetFirstField (comment_field); } set {SetField (comment_field, value);} } /// /// Gets and sets the genres of the media represented by the /// current instance. /// /// /// A containing the genres of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This property is implemented using the "GENRE" field. /// public override string [] Genres { get {return GetField ("GENRE");} set {SetField ("GENRE", value);} } /// /// Gets and sets the year that the media represented by the /// current instance was recorded. /// /// /// A containing the year that the media /// represented by the current instance was created or zero /// if no value is present. /// /// /// This property is implemented using the "DATE" field. If a /// value greater than 9999 is set, this property will be /// cleared. /// public override uint Year { get { string text = GetFirstField ("DATE"); uint value; return (text != null && uint.TryParse ( text.Length > 4 ? text.Substring (0, 4) : text, out value)) ? value : 0; } set {SetField ("DATE", value);} } /// /// Gets and sets the position of the media represented by /// the current instance in its containing album. /// /// /// A containing the position of the /// media represented by the current instance in its /// containing album or zero if not specified. /// /// /// This property is implemented using the "TRACKNUMER" /// field. /// public override uint Track { get { string text = GetFirstField ("TRACKNUMBER"); string [] values; uint value; if (text != null && (values = text.Split ('/')) .Length > 0 && uint.TryParse ( values [0], out value)) return value; return 0; } set { SetField ("TRACKTOTAL", TrackCount); SetField ("TRACKNUMBER", value); } } /// /// Gets and sets the number of tracks in the album /// containing the media represented by the current instance. /// /// /// A containing the number of tracks in /// the album containing the media represented by the current /// instance or zero if not specified. /// /// /// This property is implemented using the "TRACKTOTAL" field /// but is capable of reading from "TRACKNUMBER" if the total /// is stored in {track}/{count} format. /// public override uint TrackCount { get { string text; string [] values; uint value; if ((text = GetFirstField ("TRACKTOTAL")) != null && uint.TryParse (text, out value)) return value; if ((text = GetFirstField ("TRACKNUMBER")) != null && (values = text.Split ('/')) .Length > 1 && uint.TryParse ( values [1], out value)) return value; return 0; } set {SetField ("TRACKTOTAL", value);} } /// /// Gets and sets the number of the disc containing the media /// represented by the current instance in the boxed set. /// /// /// A containing the number of the disc /// containing the media represented by the current instance /// in the boxed set. /// /// /// This property is implemented using the "DISCNUMBER" /// field. /// public override uint Disc { get { string text = GetFirstField ("DISCNUMBER"); string [] values; uint value; if (text != null && (values = text.Split ('/')) .Length > 0 && uint.TryParse ( values [0], out value)) return value; return 0; } set { SetField ("DISCTOTAL", DiscCount); SetField ("DISCNUMBER", value); } } /// /// Gets and sets the number of discs in the boxed set /// containing the media represented by the current instance. /// /// /// A containing the number of discs in /// the boxed set containing the media represented by the /// current instance or zero if not specified. /// /// /// This property is implemented using the "DISCTOTAL" field /// but is capable of reading from "DISCNUMBER" if the total /// is stored in {disc}/{count} format. /// public override uint DiscCount { get { string text; string [] values; uint value; if ((text = GetFirstField ("DISCTOTAL")) != null && uint.TryParse (text, out value)) return value; if ((text = GetFirstField ("DISCNUMBER")) != null && (values = text.Split ('/')) .Length > 1 && uint.TryParse ( values [1], out value)) return value; return 0; } set {SetField ("DISCTOTAL", value);} } /// /// Gets and sets the lyrics or script of the media /// represented by the current instance. /// /// /// A object containing the lyrics or /// script of the media represented by the current instance /// or if no value is present. /// /// /// This property is implemented using the "LYRICS" field. /// public override string Lyrics { get {return GetFirstField ("LYRICS");} set {SetField ("LYRICS", value);} } /// /// Gets and sets the grouping on the album which the media /// in the current instance belongs to. /// /// /// A object containing the grouping on /// the album which the media in the current instance belongs /// to or if no value is present. /// /// /// This property is implemented using the "GROUPING" field. /// public override string Grouping { get {return GetFirstField ("GROUPING");} set {SetField ("GROUPING", value);} } /// /// Gets and sets the number of beats per minute in the audio /// of the media represented by the current instance. /// /// /// A containing the number of beats per /// minute in the audio of the media represented by the /// current instance, or zero if not specified. /// /// /// This property is implemented using the "TEMPO" field. /// public override uint BeatsPerMinute { get { string text = GetFirstField ("TEMPO"); double value; return (text != null && double.TryParse (text, out value) && value > 0) ? (uint) Math.Round (value) : 0; } set {SetField ("TEMPO", value);} } /// /// Gets and sets the conductor or director of the media /// represented by the current instance. /// /// /// A object containing the conductor /// or director of the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "CONDUCTOR" field. /// public override string Conductor { get {return GetFirstField ("CONDUCTOR");} set {SetField ("CONDUCTOR", value);} } /// /// Gets and sets the copyright information for the media /// represented by the current instance. /// /// /// A object containing the copyright /// information for the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "COPYRIGHT" field. /// public override string Copyright { get {return GetFirstField ("COPYRIGHT");} set {SetField ("COPYRIGHT", value);} } /// /// Gets and sets the MusicBrainz Artist ID for the media /// represented by the current instance. /// /// /// A object containing the MusicBrainz /// ArtistID for the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "MUSICBRAINZ_ARTISTID" field. /// public override string MusicBrainzArtistId { get {return GetFirstField ("MUSICBRAINZ_ARTISTID");} set {SetField ("MUSICBRAINZ_ARTISTID", value);} } /// /// Gets and sets the MusicBrainz Release ID for the media /// represented by the current instance. /// /// /// A object containing the MusicBrainz /// ReleaseID for the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "MUSICBRAINZ_ALBUMID" field. /// public override string MusicBrainzReleaseId { get {return GetFirstField ("MUSICBRAINZ_ALBUMID");} set {SetField ("MUSICBRAINZ_ALBUMID", value);} } /// /// Gets and sets the MusicBrainz Release Artist ID for the media /// represented by the current instance. /// /// /// A object containing the MusicBrainz /// ReleaseArtistID for the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "MUSICBRAINZ_ALBUMARTISTID" field. /// public override string MusicBrainzReleaseArtistId { get {return GetFirstField ("MUSICBRAINZ_ALBUMARTISTID");} set {SetField ("MUSICBRAINZ_ALBUMARTISTID", value);} } /// /// Gets and sets the MusicBrainz Track ID for the media /// represented by the current instance. /// /// /// A object containing the MusicBrainz /// TrackID for the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "MUSICBRAINZ_TRACKID" field. /// public override string MusicBrainzTrackId { get {return GetFirstField ("MUSICBRAINZ_TRACKID");} set {SetField ("MUSICBRAINZ_TRACKID", value);} } /// /// Gets and sets the MusicBrainz Disc ID for the media /// represented by the current instance. /// /// /// A object containing the MusicBrainz /// DiscID for the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "MUSICBRAINZ_DISCID" field. /// public override string MusicBrainzDiscId { get {return GetFirstField ("MUSICBRAINZ_DISCID");} set {SetField ("MUSICBRAINZ_DISCID", value);} } /// /// Gets and sets the MusicIP PUID for the media /// represented by the current instance. /// /// /// A object containing the MusicIP PUID /// for the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "MUSICIP_PUID" field. /// public override string MusicIpId { get {return GetFirstField ("MUSICIP_PUID");} set {SetField ("MUSICIP_PUID", value);} } /// /// Gets and sets the Amazon ID for the media /// represented by the current instance. /// /// /// A object containing the AmazonID /// for the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "ASIN" field. /// public override string AmazonId { get {return GetFirstField ("ASIN");} set {SetField ("ASIN", value);} } /// /// Gets and sets the MusicBrainz Release Status for the media /// represented by the current instance. /// /// /// A object containing the MusicBrainz /// ReleaseStatus for the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "MUSICBRAINZ_ALBUMSTATUS" field. /// public override string MusicBrainzReleaseStatus { get {return GetFirstField ("MUSICBRAINZ_ALBUMSTATUS");} set {SetField ("MUSICBRAINZ_ALBUMSTATUS", value);} } /// /// Gets and sets the MusicBrainz Release Type for the media /// represented by the current instance. /// /// /// A object containing the MusicBrainz /// ReleaseType for the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "MUSICBRAINZ_ALBUMTYPE" field. /// public override string MusicBrainzReleaseType { get {return GetFirstField ("MUSICBRAINZ_ALBUMTYPE");} set {SetField ("MUSICBRAINZ_ALBUMTYPE", value);} } /// /// Gets and sets the MusicBrainz Release Country for the media /// represented by the current instance. /// /// /// A object containing the MusicBrainz /// ReleaseCountry for the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "RELEASECOUNTRY" field. /// public override string MusicBrainzReleaseCountry { get {return GetFirstField ("RELEASECOUNTRY");} set {SetField ("RELEASECOUNTRY", value);} } /// /// Gets and sets a collection of pictures associated with /// the media represented by the current instance. /// /// /// A containing a collection of /// pictures associated with the media represented by the /// current instance or an empty array if none are present. /// /// /// This property is implemented using the COVERART /// field. /// public override IPicture [] Pictures { get { string[] covers = GetField ("COVERART"); IPicture[] pictures = new Picture[covers.Length]; for (int ii = 0; ii < covers.Length; ii++) { ByteVector data = new ByteVector (Convert.FromBase64String (covers[ii])); pictures[ii] = new Picture (data); } return pictures; } set { string[] covers = new string[value.Length]; for (int ii = 0; ii < value.Length; ii++) { IPicture old = value[ii]; covers[ii] = Convert.ToBase64String (old.Data.Data); } SetField ("COVERART", covers); } } /// /// Gets and sets whether or not the album described by the /// current instance is a compilation. /// /// /// A value indicating whether or not the /// album described by the current instance is a compilation. /// /// /// This property is implemented using the "COMPILATION" field. /// public bool IsCompilation { get { string text; int value; if ((text = GetFirstField ("COMPILATION")) != null && int.TryParse (text, out value)) { return value == 1; } return false; } set { if (value) { SetField ("COMPILATION", "1"); } else { RemoveField ("COMPILATION"); } } } /// /// Gets whether or not the current instance is empty. /// /// /// if the current instance does not /// any values. Otherwise . /// public override bool IsEmpty { get { foreach (string [] values in field_list.Values) if (values.Length != 0) return false; return true; } } /// /// Clears the values stored in the current instance. /// public override void Clear () { field_list.Clear (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ogg/Page.cs0000644000175000017500000002063211462100402022154 0ustar00rubenruben00000000000000// // PageHeader.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // oggpage.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections.Generic; using System; namespace TagLib.Ogg { /// /// This class provides a representation of an Ogg page. /// public class Page { #region Private Properties /// /// Contains the page header. /// private PageHeader header; /// /// Contains the packets. /// private ByteVectorCollection packets; #endregion #region Constructors /// /// Constructs and intializes a new instance of with a specified header and no packets. /// /// /// A object to use as the header of /// the new instance. /// protected Page (PageHeader header) { this.header = header; packets = new ByteVectorCollection (); } /// /// Constructs and initializes a new instance of by reading a raw Ogg page from a specified /// position in a specified file. /// /// /// A object containing the file from /// which the contents of the new instance are to be read. /// /// /// A value specify at what position to /// read. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// /// /// The Ogg identifier could not be found at the correct /// location. /// public Page (File file, long position) : this (new PageHeader (file, position)) { file.Seek (position + header.Size); foreach (int packet_size in header.PacketSizes) packets.Add (file.ReadBlock (packet_size)); } /// /// Constructs and initializes a new instance of with a specified header and packets. /// /// /// A object containing /// packets to use for the new instance. /// /// /// A object to use as the header of /// the new instance. /// /// /// is . /// public Page (ByteVectorCollection packets, PageHeader header) : this (header) { if (packets == null) throw new ArgumentNullException ("packets"); this.packets = new ByteVectorCollection (packets); List packet_sizes = new List (); // Build a page from the list of packets. foreach (ByteVector v in packets) packet_sizes.Add (v.Count); header.PacketSizes = packet_sizes.ToArray (); } #endregion #region Public Methods /// /// Renders the current instance as a raw Ogg page. /// /// /// A object containing the /// rendered version of the current instance. /// public ByteVector Render () { ByteVector data = header.Render (); foreach (ByteVector v in packets) data.Add (v); // Compute and set the checksum for the Ogg page. The // checksum is taken over the entire page with the 4 // bytes reserved for the checksum zeroed and then // inserted in bytes 22-25 of the page header. ByteVector checksum = ByteVector.FromUInt ( data.Checksum, false); for (int i = 0; i < 4; i++) data [i + 22] = checksum [i]; return data; } #endregion #region Public Properties /// /// Gets the header of the current instance. /// /// /// A object that applies to the /// current instance. /// public PageHeader Header { get {return header;} } /// /// Gets the packets contained in the current instance. /// /// /// A containing the packets /// contained in the current instance. /// public ByteVector[] Packets { get {return packets.ToArray ();} } /// /// Gets the total size of the current instance as it /// appeared on disk. /// /// /// A value containing the size of the /// page, including the header, as it appeared on disk. /// public uint Size { get {return header.Size + header.DataSize;} } #endregion #region Public Static Methods /// /// Overwrites all page headers in a file starting at a /// specified position, shifting the page sequence numbers /// a set amount. /// /// /// A object containing the file to /// update. /// /// /// A value specify at what position to /// start updating. /// /// /// A object where the key is the serial number of the /// stream to update and the value is the amount to offset /// the page sequence numbers in the stream. /// /// /// or is . /// /// /// When the number of pages in a stream changes, all /// subsequent pages in the stream need to have their page /// sequence number update in order to remain valid. /// Additionally, when the page sequence number changes, the /// page needs to have its checksum recomputed. This makes /// for a costly recalculation if large comment data is /// added. /// public static void OverwriteSequenceNumbers (File file, long position, IDictionary shiftTable) { if (file == null) throw new ArgumentNullException ("file"); if (shiftTable == null) throw new ArgumentNullException ("shiftTable"); // Check to see if there are no changes to be made. bool done = true; foreach (KeyValuePair pair in shiftTable) if (pair.Value != 0) { done = false; break; } // If the file is fine, quit. if (done) return; while (position < file.Length - 27) { PageHeader header = new PageHeader (file, position); int size = (int) (header.Size + header.DataSize); if (shiftTable.ContainsKey (header.StreamSerialNumber) && shiftTable [header.StreamSerialNumber] != 0) { file.Seek (position); ByteVector page_data = file.ReadBlock (size); ByteVector new_data = ByteVector.FromUInt ( (uint)(header.PageSequenceNumber + shiftTable [header.StreamSerialNumber]), false); for (int i = 18; i < 22; i ++) page_data [i] = new_data [i - 18]; for (int i = 22; i < 26; i++) page_data [i] = 0; new_data.Add (ByteVector.FromUInt ( page_data.Checksum, false)); file.Seek (position + 18); file.WriteBlock (new_data); } position += size; } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ogg/Bitstream.cs0000644000175000017500000001417111462100402023233 0ustar00rubenruben00000000000000// // Bitstream.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Ogg { /// /// This class accepts a sequence of pages belonging to a single /// logical bitstream, processes them, and extracts the tagging and /// media information. /// public class Bitstream { #region Private Fields /// /// Contains the last packet of the previous page in case it /// is continued in the next frame. /// private ByteVector previous_packet; /// /// Contains the index of the next packet to be processed. /// private int packet_index; /// /// Contains the codec object used to process pages. /// private Codec codec; /// /// Contains the absolute granular position of the first /// page. /// private long first_absolute_granular_position; #endregion #region Constructors /// /// Constructs and initializes a new instance of capable of processing a specified /// page. /// /// /// The first object of the stream to be /// processed by the new instance. /// /// /// The constructor only sets the new instance up to read the /// packet, but doesn't actually read it. /// /// /// is . /// /// /// No registered codec capable of processing could be found. /// public Bitstream (Page page) { if (page == null) throw new ArgumentNullException ("page"); // Assume that the first packet is completely enclosed. // This should be sufficient for codec recognition. codec = Codec.GetCodec (page.Packets [0]); first_absolute_granular_position = page.Header.AbsoluteGranularPosition; } #endregion #region Public Methods /// /// Reads the next logical page in the stream. /// /// /// The next logical object in the /// stream. /// /// /// if the codec has read all the /// necessary packets for the stream and does not need to be /// called again, typically once the Xiph comment has been /// found. Otherwise . /// /// /// is . /// public bool ReadPage (Page page) { if (page == null) throw new ArgumentNullException ("page"); ByteVector[] packets = page.Packets; for (int i = 0; i < packets.Length; i ++) { if ((page.Header.Flags & PageFlags.FirstPacketContinued) == 0 && previous_packet != null) { if (ReadPacket (previous_packet)) return true; previous_packet = null; } ByteVector packet = packets [i]; // If we're at the first packet of the page, and // we're continuing an old packet, combine the // old with the new. if (i == 0 && (page.Header.Flags & PageFlags.FirstPacketContinued) != 0 && previous_packet != null) { previous_packet.Add (packet); packet = previous_packet; } previous_packet = null; if (i == packets.Length - 1) { // If we're at the last packet of the // page, store it. previous_packet = new ByteVector (packet); } else if (ReadPacket (packet)) { // Otherwise, we need to process it. return true; } } return false; } /// /// Gets the duration of the stream represented by the /// current instance. /// /// /// A value containing the absolute /// granular position of the last page in the bitstream. /// /// /// A object containing the duration /// of the stream represented by the current instance. /// public TimeSpan GetDuration (long lastAbsoluteGranularPosition) { return codec.GetDuration ( first_absolute_granular_position, lastAbsoluteGranularPosition); } #endregion #region Public Properties /// /// Gets the codec object used to interpret the stream /// represented by the current instance. /// /// /// The object used by the current /// instance. /// public Codec Codec { get {return codec;} } #endregion #region Public Properties /// /// Sents a packet to the codec processor to read it. /// /// /// A object containing the next /// packet in the stream. /// /// /// if the codec has read all the /// necessary packets for the stream and does not need to be /// called again, typically once the Xiph comment has been /// found. Otherwise . /// private bool ReadPacket (ByteVector packet) { return codec.ReadPacket (packet, packet_index++); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ogg/Paginator.cs0000644000175000017500000001640011462100402023222 0ustar00rubenruben00000000000000// // Paginator.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // oggpage.cpp from TagLib // // Copyright (C) 2006-2007 Brian Nickel // Copyright (C) 2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Ogg { /// /// This class accepts a sequence of pages for a single Ogg stream, /// accepts changes, and produces a new sequence of pages to write to /// disk. /// public class Paginator { #region Private Fields /// /// Contains the packets to paginate. /// private ByteVectorCollection packets = new ByteVectorCollection (); /// /// Contains the first page header. /// private PageHeader? first_page_header = null; /// /// Contains the codec to use. /// private Codec codec; /// /// contains the number of pages read. /// private int pages_read = 0; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a given /// object. /// /// /// A object to use when processing /// packets. /// public Paginator (Codec codec) { this.codec = codec; } #endregion #region Public Methods /// /// Adds the next page to the current instance. /// /// /// The next object found in the stream. /// public void AddPage (Page page) { pages_read ++; if (first_page_header == null) first_page_header = page.Header; if (page.Packets.Length == 0) return; ByteVector[] page_packets = page.Packets; for (int i = 0; i < page_packets.Length; i ++) { if ((page.Header.Flags & PageFlags .FirstPacketContinued) != 0 && i == 0 && packets.Count > 0) packets [packets.Count - 1].Add (page_packets [0]); else packets.Add (page_packets [i]); } } /// /// Stores a Xiph comment in the codec-specific comment /// packet. /// /// /// A object to store in the /// comment packet. /// public void SetComment (XiphComment comment) { codec.SetCommentPacket (packets, comment); } /// /// Repaginates the pages passed into the current instance to /// handle changes made to the Xiph comment. /// /// /// A containing the new page /// collection. /// [Obsolete("Use Paginator.Paginate(out int)")] public Page [] Paginate () { int dummy; return Paginate (out dummy); } /// /// Repaginates the pages passed into the current instance to /// handle changes made to the Xiph comment. /// /// /// A value reference containing the /// the difference between the number of pages returned and /// the number of pages that were added to the class. /// /// /// A containing the new page /// collection. /// public Page [] Paginate (out int change) { // Ogg Pagination: Welcome to sucksville! // If you don't understand this, you're not alone. // It is confusing as Hell. // TODO: Document this method, in the mean time, there // is always http://xiph.org/ogg/doc/framing.html if (pages_read == 0) { change = 0; return new Page [0]; } int count = pages_read; ByteVectorCollection packets = new ByteVectorCollection ( this.packets); PageHeader first_header = (PageHeader) first_page_header; List pages = new List (); uint index = 0; bool bos = first_header.PageSequenceNumber == 0; if (bos) { pages.Add (new Page (new ByteVectorCollection (packets [0]), first_header)); index ++; packets.RemoveAt (0); count --; } int lacing_per_page = 0xfc; if (count > 0) { int total_lacing_bytes = 0; for (int i = 0; i < packets.Count; i ++) total_lacing_bytes += GetLacingValueLength ( packets, i); lacing_per_page = Math.Min (total_lacing_bytes / count + 1, lacing_per_page); } int lacing_bytes_used = 0; ByteVectorCollection page_packets = new ByteVectorCollection (); bool first_packet_continued = false; while (packets.Count > 0) { int packet_bytes = GetLacingValueLength (packets, 0); int remaining = lacing_per_page - lacing_bytes_used; bool whole_packet = packet_bytes <= remaining; if (whole_packet) { page_packets.Add (packets [0]); lacing_bytes_used += packet_bytes; packets.RemoveAt (0); } else { page_packets.Add (packets [0].Mid (0, remaining * 0xff)); packets [0] = packets [0].Mid (remaining * 0xff); lacing_bytes_used += remaining; } if (lacing_bytes_used == lacing_per_page) { pages.Add (new Page (page_packets, new PageHeader (first_header, index, first_packet_continued ? PageFlags.FirstPacketContinued : PageFlags.None))); page_packets = new ByteVectorCollection (); lacing_bytes_used = 0; index ++; count --; first_packet_continued = !whole_packet; } } if (page_packets.Count > 0) { pages.Add (new Page (page_packets, new PageHeader ( first_header.StreamSerialNumber, index, first_packet_continued ? PageFlags.FirstPacketContinued : PageFlags.None))); index ++; count --; } change = -count; return pages.ToArray (); } #endregion #region Private Methods /// /// Gets the number of lacing value bytes that would be /// required for a given packet. /// /// /// A object containing /// the packet. /// /// /// A value containing the index of the /// packet to compute. /// /// /// A value containing the number of bytes /// needed to store the length. /// private static int GetLacingValueLength (ByteVectorCollection packets, int index) { int size = packets [index].Count; return size / 0xff + ((index + 1 < packets.Count || size % 0xff > 0) ? 1 : 0); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpc/0000777000175000017500000000000011503407416020770 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpc/File.cs0000644000175000017500000002151511462100402022163 0ustar00rubenruben00000000000000// // File.cs: Provides tagging and properties support for MusePack files. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // mpcfile.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2004 by Allan Sandfeld Jensen (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.MusePack { /// /// This class extends to /// provide tagging and properties support for MusePack files. /// /// /// A will be added automatically to /// any file that doesn't contain one. This change does not effect /// the file and can be reversed using the following method: /// file.RemoveTags (file.TagTypes & ~file.TagTypesOnDisk); /// [SupportedMimeType("taglib/mpc", "mpc")] [SupportedMimeType("taglib/mp+", "mp+")] [SupportedMimeType("taglib/mpp", "mpp")] [SupportedMimeType("audio/x-musepack")] public class File : TagLib.NonContainer.File { #region Private Fields /// /// Contains the block with the audio header. /// private ByteVector header_block = null; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : base (path, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system with an average read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : base (path) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified file abstraction with an /// average read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// public File (File.IFileAbstraction abstraction) : base (abstraction) { } #endregion #region Public Methods /// /// Gets a tag of a specified type from the current instance, /// optionally creating a new tag if possible. /// /// /// A value indicating the /// type of tag to read. /// /// /// A value specifying whether or not to /// try and create the tag if one is not found. /// /// /// A object containing the tag that was /// found in or added to the current instance. If no /// matching tag was found and none was created, is returned. /// /// /// If a is added to the /// current instance, it will be placed at the start of the /// file. On the other hand, /// will be added to the end of /// the file. All other tag types will be ignored. /// public override TagLib.Tag GetTag (TagTypes type, bool create) { Tag t = (Tag as TagLib.NonContainer.Tag).GetTag (type); if (t != null || !create) return t; switch (type) { case TagTypes.Id3v1: return EndTag.AddTag (type, Tag); case TagTypes.Id3v2: return StartTag.AddTag (type, Tag); case TagTypes.Ape: return EndTag.AddTag (type, Tag); default: return null; } } #endregion #region Protected Methods /// /// Reads format specific information at the start of the /// file. /// /// /// A value containing the seek position /// at which the tags end and the media data begins. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// protected override void ReadStart (long start, ReadStyle propertiesStyle) { if (header_block != null && propertiesStyle == ReadStyle.None) return; Seek (start); header_block = ReadBlock ( (int) StreamHeader.Size); } /// /// Reads format specific information at the end of the /// file. /// /// /// A value containing the seek position /// at which the media data ends and the tags begin. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// protected override void ReadEnd (long end, ReadStyle propertiesStyle) { // Make sure we have an APE tag. GetTag (TagTypes.Ape, true); } /// /// Reads the audio properties from the file represented by /// the current instance. /// /// /// A value containing the seek position /// at which the tags end and the media data begins. /// /// /// A value containing the seek position /// at which the media data ends and the tags begin. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// A object describing the /// media properties of the file represented by the current /// instance. /// protected override Properties ReadProperties (long start, long end, ReadStyle propertiesStyle) { StreamHeader header = new StreamHeader (header_block, end - start); return new Properties (TimeSpan.Zero, header); } #endregion } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpc/StreamHeader.cs0000644000175000017500000002332011462100402023644 0ustar00rubenruben00000000000000// // StreamHeader.cs: Provides support for reading MusePack audio properties. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // mpcproperties.cpp from TagLib // // Copyright (C) 2006-2007 Brian Nickel // Copyright (C) 2004 by Allan Sandfeld Jensen (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.MusePack { /// /// This struct implements to provide /// support for reading MusePack audio properties. /// public struct StreamHeader : IAudioCodec { #region Constants private static ushort [] sftable = {44100, 48000, 37800, 32000}; #endregion #region Private Fields /// /// Contains the number of bytes in the stream. /// private long stream_length; /// /// Contains the MusePack version. /// private int version; /// /// Contains additional header information. /// private uint header_data; /// /// Contains the sample rate of the stream. /// private int sample_rate; /// /// Contains the number of frames in the stream. /// private uint frames; #endregion #region Public Static Fields /// /// The size of a MusePack header. /// public const uint Size = 56; /// /// The identifier used to recognize a WavPack file. /// /// /// "MP+" /// public static readonly ReadOnlyByteVector FileIdentifier = "MP+"; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified header block and /// stream length. /// /// /// A object containing the stream /// header data. /// /// /// A value containing the length of the /// MusePAck stream in bytes. /// /// /// is . /// /// /// does not begin with or is less than bytes long. /// public StreamHeader (ByteVector data, long streamLength) { if (data == null) throw new ArgumentNullException ("data"); if (!data.StartsWith (FileIdentifier)) throw new CorruptFileException ( "Data does not begin with identifier."); if (data.Count < Size) throw new CorruptFileException ( "Insufficient data in stream header"); stream_length = streamLength; version = data [3] & 15; if (version >= 7) { frames = data.Mid (4, 4).ToUInt (false); uint flags = data.Mid (8, 4).ToUInt (false); sample_rate = sftable [(int) (((flags >> 17) & 1) * 2 + ((flags >> 16) & 1))]; header_data = 0; } else { header_data = data.Mid (0, 4).ToUInt (false); version = (int) ((header_data >> 11) & 0x03ff); sample_rate = 44100; frames = data.Mid (4, version >= 5 ? 4 : 2).ToUInt (false); } } #endregion #region Public Properties /// /// Gets the duration of the media represented by the current /// instance. /// /// /// A containing the duration of the /// media represented by the current instance. /// public TimeSpan Duration { get { if (sample_rate <= 0 && stream_length <= 0) return TimeSpan.Zero; return TimeSpan.FromSeconds ( (double) (frames * 1152 - 576) / (double) sample_rate + 0.5); } } /// /// Gets the types of media represented by the current /// instance. /// /// /// Always . /// public MediaTypes MediaTypes { get {return MediaTypes.Audio;} } /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public string Description { get {return string.Format ( System.Globalization.CultureInfo.InvariantCulture, "MusePack Version {0} Audio", Version);} } /// /// Gets the bitrate of the audio represented by the current /// instance. /// /// /// A value containing a bitrate of the /// audio represented by the current instance. /// public int AudioBitrate { get { if (header_data != 0) return (int) ((header_data >> 23) & 0x01ff); return (int) (Duration > TimeSpan.Zero ? ((stream_length * 8L) / Duration.TotalSeconds) / 1000 : 0); } } /// /// Gets the sample rate of the audio represented by the /// current instance. /// /// /// A value containing the sample rate of /// the audio represented by the current instance. /// public int AudioSampleRate { get {return sample_rate;} } /// /// Gets the number of channels in the audio represented by /// the current instance. /// /// /// A value containing the number of /// channels in the audio represented by the current /// instance. /// public int AudioChannels { get {return 2;} } /// /// Gets the WavPack version of the audio represented by the /// current instance. /// /// /// A value containing the WavPack version /// of the audio represented by the current instance. /// public int Version { get {return version;} } #endregion #region IEquatable /// /// Generates a hash code for the current instance. /// /// /// A value containing the hash code for /// the current instance. /// public override int GetHashCode () { unchecked { return (int) (header_data ^ sample_rate ^ frames ^ version); } } /// /// Checks whether or not the current instance is equal to /// another object. /// /// /// A to compare to the current /// instance. /// /// /// A value indicating whether or not the /// current instance is equal to . /// /// public override bool Equals (object other) { if (!(other is StreamHeader)) return false; return Equals ((StreamHeader) other); } /// /// Checks whether or not the current instance is equal to /// another instance of . /// /// /// A object to compare to the /// current instance. /// /// /// A value indicating whether or not the /// current instance is equal to . /// /// public bool Equals (StreamHeader other) { return header_data == other.header_data && sample_rate == other.sample_rate && version == other.version && frames == other.frames; } /// /// Gets whether or not two instances of are equal to eachother. /// /// /// A object to compare. /// /// /// A object to compare. /// /// /// if is /// equal to . Otherwise, . /// public static bool operator == (StreamHeader first, StreamHeader second) { return first.Equals (second); } /// /// Gets whether or not two instances of differ. /// /// /// A object to compare. /// /// /// A object to compare. /// /// /// if is /// unequal to . Otherwise, . /// public static bool operator != (StreamHeader first, StreamHeader second) { return !first.Equals (second); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/UnsupportedFormatException.cs0000644000175000017500000001174711462100402026153 0ustar00rubenruben00000000000000// // UnsupportedFormatException.cs: // // Author: // Aaron Bockover (abockover@novell.com) // // Original Source: // Entagged# // // Copyright (C) 2005-2006 Novell, Inc. // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Runtime.Serialization; namespace TagLib { /// /// This class extends and is used to /// indicate that a file or tag is stored in an unsupported format /// and cannot be read or written by the current implementation. /// /// /// Catching an exception when creating a . /// /// using System; /// using TagLib; /// /// public class ExceptionTest /// { /// public static void Main () /// { /// try { /// File file = File.Create ("myfile.flv"); // Not supported, YET! /// } catch (UnsupportedFormatException e) { /// Console.WriteLine ("That file format is not supported: {0}", e.ToString ()); /// } /// } /// } /// /// /// #using <System.dll> /// #using <taglib-sharp.dll> /// /// using System; /// using TagLib; /// /// void main () /// { /// try { /// File file = File::Create ("myfile.flv"); // Not supported, YET! /// } catch (UnsupportedFormatException^ e) { /// Console::WriteLine ("That file format is not supported: {0}", e); /// } /// } /// /// /// Imports System /// Imports TagLib /// /// Public Class ExceptionTest /// Public Shared Sub Main () /// Try /// file As File = File.Create ("myfile.flv") ' Not supported, YET! /// Catch e As UnsupportedFormatException /// Console.WriteLine ("That file format is not supported: {0}", e.ToString ()); /// End Try /// End Sub /// End Class /// /// /// import System /// import TagLib /// /// try: /// file As File = File.Create ("myfile.flv") # Not supported, YET! /// catch e as UnsupportedFormatException: /// Console.WriteLine ("That file format is not supported: {0}", e.ToString ()); /// /// [Serializable] public class UnsupportedFormatException : Exception { /// /// Constructs and initializes a new instance of with a specified /// message. /// /// /// A containing a message explaining /// the reason for the exception. /// public UnsupportedFormatException (string message) : base(message) { } /// /// Constructs and initializes a new instance of with the default /// values. /// public UnsupportedFormatException () : base() { } /// /// Constructs and initializes a new instance of with a specified /// message containing a specified exception. /// /// /// A containing a message explaining /// the reason for the exception. /// /// /// A object to be contained in the /// new exception. For example, previously caught exception. /// public UnsupportedFormatException (string message, Exception innerException) : base (message, innerException) { } /// /// Constructs and initializes a new instance of from a specified /// serialization info and streaming context. /// /// /// A object containing the /// serialized data to be used for the new instance. /// /// /// A object containing the /// streaming context information for the new instance. /// /// /// This constructor is implemented because implements the interface. /// protected UnsupportedFormatException (SerializationInfo info, StreamingContext context) : base(info, context) { } } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/CorruptFileException.cs0000644000175000017500000001202711462100402024700 0ustar00rubenruben00000000000000// // CorruptFileException.cs: // // Author: // Aaron Bockover (abockover@novell.com) // // Original Source: // Entagged# // // Copyright (C) 2006 Novell, Inc. // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Runtime.Serialization; namespace TagLib { /// /// This class extends and is used to /// indicate that a file or tag is corrupt. /// /// /// This exception will be thrown if invalid data interferes with the /// reading of the file or tag. One common example is in the (legal) /// downloading of media files with BitTorrent, in which case large /// portions of the file will contain zeroed bytes. /// /// /// Catching an exception when creating a . /// /// using System; /// using TagLib; /// /// public class ExceptionTest /// { /// public static void Main () /// { /// try { /// File file = File.Create ("partial.mp3"); // Partial download. /// } catch (CorruptFileException e) { /// Console.WriteLine ("That file is corrupt: {0}", e.ToString ()); /// } /// } /// } /// /// /// #using <System.dll> /// #using <taglib-sharp.dll> /// /// using System; /// using TagLib; /// /// void main () /// { /// try { /// File file = File::Create ("partial.mp3"); // Partial download. /// } catch (CorruptFileException^ e) { /// Console::WriteLine ("That file is corrupt: {0}", e); /// } /// } /// /// /// Imports System /// Imports TagLib /// /// Public Class ExceptionTest /// Public Shared Sub Main () /// Try /// file As File = File.Create ("partial.mp3") ' Partial download. /// Catch e As CorruptFileException /// Console.WriteLine ("That file is corrupt: {0}", e.ToString ()); /// End Try /// End Sub /// End Class /// /// /// import System /// import TagLib /// /// try: /// file As File = File.Create ("partial.mp3") # Partial download. /// catch e as CorruptFileException: /// Console.WriteLine ("That file is corrupt: {0}", e.ToString ()); /// /// [Serializable] public class CorruptFileException : Exception { /// /// Constructs and initializes a new instance of with a specified /// message. /// /// /// A containing a message explaining /// the reason for the exception. /// public CorruptFileException (string message) : base(message) { } /// /// Constructs and initializes a new instance of with the default /// values. /// public CorruptFileException () : base() { } /// /// Constructs and initializes a new instance of with a specified /// message containing a specified exception. /// /// /// A containing a message explaining /// the reason for the exception. /// /// /// A object to be contained in the /// new exception. For example, previously caught exception. /// public CorruptFileException (string message, Exception innerException) : base (message, innerException) { } /// /// Constructs and initializes a new instance of from a specified /// serialization info and streaming context. /// /// /// A object containing the /// serialized data to be used for the new instance. /// /// /// A object containing the /// streaming context information for the new instance. /// /// /// This constructor is implemented because implements the interface. /// protected CorruptFileException (SerializationInfo info, StreamingContext context) : base(info, context) { } } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/ICodec.cs0000644000175000017500000001630411470571657021742 0ustar00rubenruben00000000000000// // ICodec.cs: Provides ICodec, IAudioCodec, and IVideoCodec interfaces. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; namespace TagLib { /// /// Indicates the types of media represented by a or object. /// /// /// These values can be bitwise combined to represent multiple media /// types. /// [Flags] public enum MediaTypes { /// /// No media is present. /// None = 0, /// /// Audio is present. /// Audio = 1, /// /// Video is present. /// Video = 2, /// /// A Photo is present. /// Photo = 3, } /// /// This interface provides basic information, common to all media /// codecs. /// public interface ICodec { /// /// Gets the duration of the media represented by the current /// instance. /// /// /// A containing the duration of the /// media represented by the current instance. /// TimeSpan Duration {get;} /// /// Gets the types of media represented by the current /// instance. /// /// /// A bitwise combined containing /// the types of media represented by the current instance. /// MediaTypes MediaTypes {get;} /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// string Description {get;} } /// /// This interface inherits to provide /// information about an audio codec. /// /// /// When dealing with a , if contains , it is safe to assume that the object also inherits and can be recast without issue. /// public interface IAudioCodec : ICodec { /// /// Gets the bitrate of the audio represented by the current /// instance. /// /// /// A value containing a bitrate of the /// audio represented by the current instance. /// int AudioBitrate {get;} /// /// Gets the sample rate of the audio represented by the /// current instance. /// /// /// A value containing the sample rate of /// the audio represented by the current instance. /// int AudioSampleRate {get;} /// /// Gets the number of channels in the audio represented by /// the current instance. /// /// /// A value containing the number of /// channels in the audio represented by the current /// instance. /// int AudioChannels {get;} } /// /// This interface provides information specific /// to lossless audio codecs. /// public interface ILosslessAudioCodec { /// /// Gets the number of bits per sample in the audio /// represented by the current instance. /// /// /// A value containing the number of bits /// per sample in the audio represented by the current /// instance. /// int BitsPerSample {get;} } /// /// This interface inherits to provide /// information about a video codec. /// /// /// When dealing with a , if contains , it is safe to assume that the object also inherits and can be recast without issue. /// public interface IVideoCodec : ICodec { /// /// Gets the width of the video represented by the current /// instance. /// /// /// A value containing the width of the /// video represented by the current instance. /// int VideoWidth {get;} /// /// Gets the height of the video represented by the current /// instance. /// /// /// A value containing the height of the /// video represented by the current instance. /// int VideoHeight {get;} } /// /// This interface inherits to provide /// information about a photo. /// /// /// When dealing with a , if contains , it is safe to assume that the object also inherits and can be recast without issue. /// public interface IPhotoCodec : ICodec { /// /// Gets the width of the photo represented by the current /// instance. /// /// /// A value containing the width of the /// photo represented by the current instance. /// int PhotoWidth {get;} /// /// Gets the height of the photo represented by the current /// instance. /// /// /// A value containing the height of the /// photo represented by the current instance. /// int PhotoHeight {get;} /// /// Gets the (format specific) quality indicator of the photo /// represented by the current instance. /// /// /// A value indicating the quality. A value /// 0 means that there was no quality indicator for the format /// or the file. /// int PhotoQuality {get;} } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg/0000777000175000017500000000000011503407420021134 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg/File.cs0000644000175000017500000005071311462100402022336 0ustar00rubenruben00000000000000// // File.cs: Provides tagging and properties support for MPEG-1, MPEG-2, and // MPEG-2.5 audio files. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg { /// /// Indicates the type of marker found in a MPEG file. /// public enum Marker { /// /// An invalid marker. /// Corrupt = -1, /// /// A zero value marker. /// Zero = 0, /// /// A marker indicating a system sync packet. /// SystemSyncPacket = 0xBA, /// /// A marker indicating a video sync packet. /// VideoSyncPacket = 0xB3, /// /// A marker indicating a system packet. /// SystemPacket = 0xBB, /// /// A marker indicating a padding packet. /// PaddingPacket = 0xBE, /// /// A marker indicating a audio packet. /// AudioPacket = 0xC0, /// /// A marker indicating a video packet. /// VideoPacket = 0xE0, /// /// A marker indicating the end of a stream. /// EndOfStream = 0xB9 } /// /// This class extends to /// provide tagging and properties support for MPEG-1, MPEG-2, and /// MPEG-2.5 video files. /// /// /// A and will be added automatically to any /// file that doesn't contain one. This change does not effect the /// file until it is saved and can be reversed using the following /// method: /// file.RemoveTags (file.TagTypes & ~file.TagTypesOnDisk); /// [SupportedMimeType("taglib/mpg", "mpg")] [SupportedMimeType("taglib/mpeg", "mpeg")] [SupportedMimeType("taglib/mpe", "mpe")] [SupportedMimeType("taglib/mpv2", "mpv2")] [SupportedMimeType("taglib/m2v", "m2v")] [SupportedMimeType("video/x-mpg")] [SupportedMimeType("video/mpeg")] public class File : TagLib.NonContainer.File { #region Private Static Fields private static readonly ByteVector MarkerStart = new byte [] {0, 0, 1}; #endregion #region Private Fields /// /// Contains the MPEG version. /// private Version version; /// /// Contains the first audio header. /// private AudioHeader audio_header; /// /// Contains the first video header. /// private VideoHeader video_header; /// /// Indicates whether or not audio was found. /// private bool video_found = false; /// /// Indicates whether or not video was found. /// private bool audio_found = false; /// /// Contains the start time of the file. /// private double? start_time = null; /// /// Contains the end time of the file. /// private double end_time; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : base (path, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system with an average read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : base (path) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified file abstraction with an /// average read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// public File (File.IFileAbstraction abstraction) : base (abstraction) { } #endregion #region Public Methods /// /// Gets a tag of a specified type from the current instance, /// optionally creating a new tag if possible. /// /// /// A value indicating the /// type of tag to read. /// /// /// A value specifying whether or not to /// try and create the tag if one is not found. /// /// /// A object containing the tag that was /// found in or added to the current instance. If no /// matching tag was found and none was created, is returned. /// /// /// If a is added to the /// current instance, it will be placed at the start of the /// file. On the other hand, /// will be added to the end of /// the file. All other tag types will be ignored. /// public override TagLib.Tag GetTag (TagTypes type, bool create) { Tag t = (Tag as TagLib.NonContainer.Tag).GetTag (type); if (t != null || !create) return t; switch (type) { case TagTypes.Id3v1: return EndTag.AddTag (type, Tag); case TagTypes.Id3v2: return EndTag.AddTag (type, Tag); case TagTypes.Ape: return EndTag.AddTag (type, Tag); default: return null; } } #endregion #region Protected Methods /// /// Reads format specific information at the start of the /// file. /// /// /// A value containing the seek position /// at which the tags end and the media data begins. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// protected override void ReadStart (long start, ReadStyle propertiesStyle) { if (propertiesStyle == ReadStyle.None) return; FindMarker (ref start, Marker.SystemSyncPacket); ReadSystemFile (start); } /// /// Reads format specific information at the end of the /// file. /// /// /// A value containing the seek position /// at which the media data ends and the tags begin. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// protected override void ReadEnd (long end, ReadStyle propertiesStyle) { // Make sure we have ID3v1 and ID3v2 tags. GetTag (TagTypes.Id3v1, true); GetTag (TagTypes.Id3v2, true); if (propertiesStyle == ReadStyle.None || start_time == null) return; RFindMarker (ref end, Marker.SystemSyncPacket); end_time = ReadTimestamp (end + 4); } /// /// Reads the audio properties from the file represented by /// the current instance. /// /// /// A value containing the seek position /// at which the tags end and the media data begins. /// /// /// A value containing the seek position /// at which the media data ends and the tags begin. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// A object describing the /// media properties of the file represented by the current /// instance. /// protected override Properties ReadProperties (long start, long end, ReadStyle propertiesStyle) { TimeSpan duration = start_time == null ? TimeSpan.Zero : TimeSpan.FromSeconds ( end_time - (double) start_time); return new Properties (duration, video_header, audio_header); } /// /// Gets the marker at a specified position. /// /// /// A value specifying the postion in the /// file represented by the current instance at which to /// read. /// /// /// A value containing the type of /// marker found at the specified position. /// /// /// A valid marker does not exist at the specified position. /// protected Marker GetMarker (long position) { Seek (position); ByteVector identifier = ReadBlock (4); if (identifier.Count == 4 && identifier.StartsWith ( MarkerStart)) return (Marker) identifier [3]; throw new CorruptFileException ( "Invalid marker at position " + position); } /// /// Finds the next marker starting at a specified position. /// /// /// A value reference specifying the /// position at which to start searching. This value /// is updated to the position of the found marker. /// /// /// A value containing the type of /// marker found at the specified position. /// /// /// A valid marker could not be found. /// protected Marker FindMarker (ref long position) { position = Find (MarkerStart, position); if (position < 0) throw new CorruptFileException ( "Marker not found"); return GetMarker (position); } /// /// Finds the next marker of a specified type, starting at a /// specified position. /// /// /// A value reference specifying the /// position at which to start searching. This value /// is updated to the position of the found marker. /// /// /// A value specifying the type of /// marker to search for. /// /// /// A value containing the type of /// marker found at the specified position. This value will /// be identical to . /// /// /// A valid marker could not be found. /// protected Marker FindMarker (ref long position, Marker marker) { ByteVector packet = new ByteVector (MarkerStart); packet.Add ((byte) marker); position = Find (packet, position); if (position < 0) throw new CorruptFileException ( "Marker not found"); return GetMarker (position); } /// /// Finds the previous marker of a specified type, starting /// at a specified position. /// /// /// A value reference specifying the /// position at which to start searching. This value /// is updated to the position of the found marker. /// /// /// A value specifying the type of /// marker to search for. /// /// /// A value containing the type of /// marker found at the specified position. This value will /// be identical to . /// /// /// A valid marker could not be found. /// protected Marker RFindMarker (ref long position, Marker marker) { ByteVector packet = new ByteVector (MarkerStart); packet.Add ((byte) marker); position = RFind (packet, position); if (position < 0) throw new CorruptFileException ( "Marker not found"); return GetMarker (position); } /// /// Reads the contents of the file as a system file, starting /// at a specified position. /// /// /// A value specifying the postion in the /// file represented by the current instance at which to /// start reading. /// /// /// This method will stop when it has read both an audio and /// a video header, or once it's read 100 packets. This is to /// prevent the entire file from being read if it lacks one /// type of stream. /// protected void ReadSystemFile (long position) { int sanity_limit = 100; for (int i = 0; i < sanity_limit && (start_time == null || !audio_found || !video_found); i ++) { Marker marker = FindMarker (ref position); switch (marker) { case Marker.SystemSyncPacket: ReadSystemSyncPacket (ref position); break; case Marker.SystemPacket: case Marker.PaddingPacket: Seek (position + 4); position += ReadBlock (2).ToUShort () + 6; break; case Marker.VideoPacket: ReadVideoPacket (ref position); break; case Marker.AudioPacket: ReadAudioPacket (ref position); break; case Marker.EndOfStream: return; default: position += 4; break; } } } #endregion #region Private Methods /// /// Reads an audio packet, assigning the audio header and /// advancing the position to the next packet position. /// /// /// A value reference specifying the /// position at which to start reading the packet. This value /// is updated to the position of the next packet. /// void ReadAudioPacket (ref long position) { Seek (position + 4); int length = ReadBlock (2).ToUShort (); if (!audio_found) audio_found = AudioHeader.Find ( out audio_header, this, position + 15, length - 9); position += length; } /// /// Reads a video packet, assigning the video header and /// advancing the position to the next packet position. /// /// /// A value reference specifying the /// position at which to start reading the packet. This value /// is updated to the position of the next packet. /// void ReadVideoPacket (ref long position) { Seek (position + 4); int length = ReadBlock (2).ToUShort (); long offset = position + 6; while (!video_found && offset < position + length) if (FindMarker (ref offset) == Marker.VideoSyncPacket) { video_header = new VideoHeader (this, offset + 4); video_found = true; } else { // advance the offset by 6 bytes, so the next iteration of the // loop won't find the same marker and get stuck. 6 bytes because findMarker is a // generic find that could get both PES packets and Stream packets, the smallest // posible pes packet with a size =0 would be 6 bytes. offset += 6; } position += length; } /// /// Reads a system sync packet, filling in version /// information and the first timestamp value, advancing the /// position to the next packet position. /// /// /// A value reference specifying the /// position at which to start reading the packet. If the /// method is called without exception, this is updated to /// the position of the next packet. /// /// /// The MPEG version contained in the packet is unknown. /// void ReadSystemSyncPacket (ref long position) { int packet_size = 0; Seek (position + 4); byte version_info = ReadBlock (1) [0]; if ((version_info & 0xF0) == 0x20) { version = Version.Version1; packet_size = 12; } else if ((version_info & 0xC0) == 0x40) { version = Version.Version2; Seek (position + 13); packet_size = 14 + (ReadBlock (1) [0] & 0x07); } else throw new UnsupportedFormatException ( "Unknown MPEG version."); if (start_time == null) start_time = ReadTimestamp (position + 4); position += packet_size; } /// /// Reads an MPEG timestamp from a specified position in the /// file represented by the current instance. /// /// /// A value containing the position in /// the file at which to read. This should be immediately /// following a system sync packet marker. /// /// /// A value containing the read time in /// seconds. /// private double ReadTimestamp (long position) { double high; uint low; Seek (position); if (version == Version.Version1) { ByteVector data = ReadBlock (5); high = (double) ((data [0] >> 3) & 0x01); low = ((uint)((data [0] >> 1) & 0x03) << 30) | (uint) (data [1] << 22) | (uint)((data [2] >> 1) << 15) | (uint) (data [3] << 7) | (uint) (data [4] << 1); } else { ByteVector data = ReadBlock (6); high = (double) ((data [0] & 0x20) >> 5); low = ((uint) ((data [0] & 0x18) >> 3) << 30) | (uint) ((data [0] & 0x03) << 28) | (uint) (data [1] << 20) | (uint) ((data [2] & 0xF8) << 12) | (uint) ((data [2] & 0x03) << 13) | (uint) (data [3] << 5) | (uint) (data [4] >> 3); } return (((high * 0x10000) * 0x10000) + low) / 90000.0; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg/AudioFile.cs0000644000175000017500000002322511462100402023316 0ustar00rubenruben00000000000000// // AudioFile.cs: Provides tagging and properties support for MPEG-1, MPEG-2, and // MPEG-2.5 audio files. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // mpegfile.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2002, 2003 by Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg { /// /// This class extends to /// provide tagging and properties support for MPEG-1, MPEG-2, and /// MPEG-2.5 audio files. /// /// /// A and will be added automatically to any /// file that doesn't contain one. This change does not effect the /// file until it is saved and can be reversed using the following /// method: /// file.RemoveTags (file.TagTypes & ~file.TagTypesOnDisk); /// [SupportedMimeType("taglib/mp3", "mp3")] [SupportedMimeType("audio/x-mp3")] [SupportedMimeType("application/x-id3")] [SupportedMimeType("audio/mpeg")] [SupportedMimeType("audio/x-mpeg")] [SupportedMimeType("audio/x-mpeg-3")] [SupportedMimeType("audio/mpeg3")] [SupportedMimeType("audio/mp3")] [SupportedMimeType("taglib/m2a", "m2a")] [SupportedMimeType("taglib/mp2", "mp2")] [SupportedMimeType("taglib/mp1", "mp1")] [SupportedMimeType("audio/x-mp2")] [SupportedMimeType("audio/x-mp1")] public class AudioFile : TagLib.NonContainer.File { #region Private Fields /// /// Contains the first audio header. /// private AudioHeader first_header; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local /// file system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public AudioFile (string path, ReadStyle propertiesStyle) : base (path, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local /// file system with an average read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public AudioFile (string path) : base (path) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public AudioFile (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified file abstraction with /// an average read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// public AudioFile (File.IFileAbstraction abstraction) : base (abstraction) { } #endregion #region Public Methods /// /// Gets a tag of a specified type from the current instance, /// optionally creating a new tag if possible. /// /// /// A value indicating the /// type of tag to read. /// /// /// A value specifying whether or not to /// try and create the tag if one is not found. /// /// /// A object containing the tag that was /// found in or added to the current instance. If no /// matching tag was found and none was created, is returned. /// /// /// If a is added to the /// current instance, it will be placed at the start of the /// file. On the other hand, /// will be added to the end of /// the file. All other tag types will be ignored. /// public override TagLib.Tag GetTag (TagTypes type, bool create) { Tag t = (Tag as TagLib.NonContainer.Tag).GetTag (type); if (t != null || !create) return t; switch (type) { case TagTypes.Id3v1: return EndTag.AddTag (type, Tag); case TagTypes.Id3v2: return StartTag.AddTag (type, Tag); case TagTypes.Ape: return EndTag.AddTag (type, Tag); default: return null; } } #endregion #region Protected Methods /// /// Reads format specific information at the start of the /// file. /// /// /// A value containing the seek position /// at which the tags end and the media data begins. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// This method only searches for an audio header in the /// first 16384 bytes of code to avoid searching forever in /// corrupt files. /// protected override void ReadStart (long start, ReadStyle propertiesStyle) { // Only check the first 16 bytes so we're not stuck // reading a bad file forever. if (propertiesStyle != ReadStyle.None && !AudioHeader.Find (out first_header, this, start, 0x4000)) throw new CorruptFileException ( "MPEG audio header not found."); } /// /// Reads format specific information at the end of the /// file. /// /// /// A value containing the seek position /// at which the media data ends and the tags begin. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// protected override void ReadEnd (long end, ReadStyle propertiesStyle) { // Make sure we have ID3v1 and ID3v2 tags. GetTag (TagTypes.Id3v1, true); GetTag (TagTypes.Id3v2, true); } /// /// Reads the audio properties from the file represented by /// the current instance. /// /// /// A value containing the seek position /// at which the tags end and the media data begins. /// /// /// A value containing the seek position /// at which the media data ends and the tags begin. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// A object describing the /// media properties of the file represented by the current /// instance. /// protected override Properties ReadProperties (long start, long end, ReadStyle propertiesStyle) { first_header.SetStreamLength (end - start); return new Properties (TimeSpan.Zero, first_header); } #endregion } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg/XingHeader.cs0000644000175000017500000001330511462100402023471 0ustar00rubenruben00000000000000// // XingHeader.cs: Provides information about a variable bitrate MPEG audio // stream. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // xingheader.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2003 by Ismael Orenstein (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections; using System; namespace TagLib.Mpeg { /// /// This structure provides information about a variable bitrate MPEG /// audio stream. /// public struct XingHeader { #region Private Fields /// /// Contains the frame count. /// private uint frames; /// /// Contains the stream size. /// private uint size; /// /// Indicates that a physical Xing header is present. /// private bool present; #endregion #region Public Fields /// /// Contains te Xing identifier. /// /// /// "Xing" /// public static readonly ReadOnlyByteVector FileIdentifier = "Xing"; /// /// An empty and unset Xing header. /// public static readonly XingHeader Unknown = new XingHeader (0, 0); #endregion #region Constructors /// /// Constructs and initializes a new instance of with a specified frame count and /// size. /// /// /// A value specifying the frame count of /// the audio represented by the new instance. /// /// /// A value specifying the stream size of /// the audio represented by the new instance. /// private XingHeader (uint frame, uint size) { this.frames = frame; this.size = size; this.present = false; } /// /// Constructs and initializes a new instance of by reading its raw contents. /// /// /// A object containing the raw /// Xing header. /// /// /// is . /// /// /// does not start with . /// public XingHeader (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); // Check to see if a valid Xing header is available. if (!data.StartsWith (FileIdentifier)) throw new CorruptFileException ( "Not a valid Xing header"); int position = 8; if ((data [7] & 0x01) != 0) { frames = data.Mid (position, 4).ToUInt (); position += 4; } else frames = 0; if ((data [7] & 0x02) != 0) { size = data.Mid (position, 4).ToUInt (); position += 4; } else size = 0; present = true; } #endregion #region Public Properties /// /// Gets the total number of frames in the file, as indicated /// by the current instance. /// /// /// A value containing the number of /// frames in the file, or 0 if not specified. /// public uint TotalFrames { get {return frames;} } /// /// Gets the total size of the file, as indicated by the /// current instance. /// /// /// A value containing the total size of /// the file, or 0 if not specified. /// public uint TotalSize { get {return size;} } /// /// Gets whether or not a physical Xing header is present in /// the file. /// /// /// A value indicating whether or not the /// current instance represents a physical Xing header. /// public bool Present { get {return present;} } #endregion #region Public Static Methods /// /// Gets the offset at which a Xing header would appear in an /// MPEG audio packet based on the version and channel mode. /// /// /// A value specifying the version of /// the MPEG audio packet. /// /// /// A value specifying the channel /// mode of the MPEG audio packet. /// /// /// A value indicating the offset in an /// MPEG audio packet at which the Xing header would appear. /// public static int XingHeaderOffset (Version version, ChannelMode channelMode) { bool single_channel = channelMode == ChannelMode.SingleChannel; if (version == Version.Version1) return single_channel ? 0x15 : 0x24; else return single_channel ? 0x0D : 0x15; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg/VBRIHeader.cs0000644000175000017500000001235611462100402023333 0ustar00rubenruben00000000000000// // VBRIHeader.cs: Provides information about a variable bitrate MPEG audio // stream encoded with the Fraunhofer Encoder. // // Author: // Helmut Wahrmann // // Original Source: // XingHeader.cs // // Copyright (C) 2007 Helmut Wahrmann // Copyright (C) 2005-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections; using System; namespace TagLib.Mpeg { /// /// This structure provides information about a variable bitrate MPEG /// audio stream encoded by the Fraunhofer Encoder. /// public struct VBRIHeader { #region Private Fields /// /// Contains the frame count. /// private uint frames; /// /// Contains the stream size. /// private uint size; /// /// Indicates that a physical VBRI header is present. /// private bool present; #endregion #region Public Fields /// /// Contains te VBRI identifier. /// /// /// "VBRI" /// public static readonly ReadOnlyByteVector FileIdentifier = "VBRI"; /// /// An empty and unset VBRI header. /// public static readonly VBRIHeader Unknown = new VBRIHeader (0, 0); #endregion #region Constructors /// /// Constructs and initializes a new instance of with a specified frame count and /// size. /// /// /// A value specifying the frame count of /// the audio represented by the new instance. /// /// /// A value specifying the stream size of /// the audio represented by the new instance. /// private VBRIHeader (uint frame, uint size) { this.frames = frame; this.size = size; this.present = false; } /// /// Constructs and initializes a new instance of by reading its raw contents. /// /// /// A object containing the raw /// VBRI header. /// /// /// is . /// /// /// does not start with . /// public VBRIHeader (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); // Check to see if a valid VBRI header is available. if (!data.StartsWith (FileIdentifier)) throw new CorruptFileException ( "Not a valid VBRI header"); // Size starts at Position 10 int position = 10; size = data.Mid(position, 4).ToUInt(); position += 4; // The number of Frames are found at Posistion 14 frames = data.Mid(position, 4).ToUInt(); position += 4; present = true; } #endregion #region Public Properties /// /// Gets the total number of frames in the file, as indicated /// by the current instance. /// /// /// A value containing the number of /// frames in the file, or 0 if not specified. /// public uint TotalFrames { get {return frames;} } /// /// Gets the total size of the file, as indicated by the /// current instance. /// /// /// A value containing the total size of /// the file, or 0 if not specified. /// public uint TotalSize { get {return size;} } /// /// Gets whether or not a physical VBRI header is present in /// the file. /// /// /// A value indicating whether or not the /// current instance represents a physical VBRI header. /// public bool Present { get {return present;} } #endregion #region Public Static Methods /// /// Gets the offset at which a VBRI header would appear in an /// MPEG audio packet. /// Always 32 bytes after the end of the first MPEG Header. /// /// /// A value indicating the offset in an /// MPEG audio packet at which the VBRI header would appear. /// public static int VBRIHeaderOffset () { // A VBRI header always appears 32 bytes after the end // of the first MPEG Header. So it's position 36 (0x24). return 0x24; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg/AudioHeader.cs0000644000175000017500000005222111470571657023654 0ustar00rubenruben00000000000000// // AudioHeader.cs: Provides information about an MPEG audio stream. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // mpegheader.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2003 by Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg { #region Enums /// /// Indicates the MPEG version of a file or stream. /// public enum Version { /// /// Unknown version. /// Unknown = -1, /// /// MPEG-1 /// Version1 = 0, /// /// MPEG-2 /// Version2 = 1, /// /// MPEG-2.5 /// Version25 = 2 } /// /// Indicates the MPEG audio channel mode of a file or stream. /// public enum ChannelMode { /// /// Stereo /// Stereo = 0, /// /// Joint Stereo /// JointStereo = 1, /// /// Dual Channel Mono /// DualChannel = 2, /// /// Single Channel Mono /// SingleChannel = 3 } #endregion /// /// This structure implements and provides /// information about an MPEG audio stream. /// public struct AudioHeader : IAudioCodec { #region Private Static Value Arrays /// /// Contains a sample rate table for MPEG audio. /// private static readonly int [,] sample_rates = new int [3,4] { {44100, 48000, 32000, 0}, // Version 1 {22050, 24000, 16000, 0}, // Version 2 {11025, 12000, 8000, 0} // Version 2.5 }; /// /// Contains a block size table for MPEG audio. /// private static readonly int [,] block_size = new int [3,4] { {0, 384, 1152, 1152}, // Version 1 {0, 384, 1152, 576}, // Version 2 {0, 384, 1152, 576} // Version 2.5 }; /// /// Contains a bitrate table for MPEG audio. /// private static readonly int [,,] bitrates = new int [2,3,16] { { // Version 1 {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1}, // layer 1 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1}, // layer 2 {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1} // layer 3 }, { // Version 2 or 2.5 {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, -1}, // layer 1 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1}, // layer 2 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1} // layer 3 } }; #endregion #region Private Properties /// /// Contains the header flags. /// private uint flags; /// /// Contains the audio stream length. /// private long stream_length; /// /// Contains the associated Xing header. /// private XingHeader xing_header; /// /// Contains the associated VBRI header. /// private VBRIHeader vbri_header; /// /// Contains the audio stream duration. /// private TimeSpan duration; #endregion #region Public Fields /// /// An empty and unset header. /// public static readonly AudioHeader Unknown = new AudioHeader (0, 0, XingHeader.Unknown, VBRIHeader.Unknown); #endregion #region Constructors /// /// Constructs and initializes a new instance of by populating it with specified /// values. /// /// /// A value specifying flags for the new /// instance. /// /// /// A value specifying the stream length /// of the new instance. /// /// /// A object representing the Xing /// header associated with the new instance. /// /// /// A object representing the VBRI /// header associated with the new instance. /// private AudioHeader (uint flags, long streamLength, XingHeader xingHeader, VBRIHeader vbriHeader) { this.flags = flags; this.stream_length = streamLength; this.xing_header = xingHeader; this.vbri_header = vbriHeader; this.duration = TimeSpan.Zero; } /// /// Constructs and initializes a new instance of by reading its contents from a /// object and its Xing Header from /// the appropriate location in the specified file. /// /// /// A object containing the header /// to read. /// /// /// A object to read the Xing /// header from. /// /// /// A value indicating the position in /// at which the header begins. /// /// /// is less than 4 bytes long, /// does not begin with a MPEG audio synch, has a negative /// bitrate, or has a sample rate of zero. /// private AudioHeader (ByteVector data, TagLib.File file, long position) { this.duration = TimeSpan.Zero; stream_length = 0; if (data.Count < 4) throw new CorruptFileException ( "Insufficient header length."); if (data [0] != 0xFF) throw new CorruptFileException ( "First byte did not match MPEG synch."); // Checking bits from high to low: // // First 3 bits MUST be set. Bits 4 and 5 can // be 00, 10, or 11 but not 01. One or more of // bits 6 and 7 must be set. Bit 8 can be // anything. if ((data [1] & 0xE6) <= 0xE0 || (data [1] & 0x18) == 0x08) throw new CorruptFileException ( "Second byte did not match MPEG synch."); flags = data.ToUInt (); if (((flags >> 12) & 0x0F) == 0x0F) throw new CorruptFileException ( "Header uses invalid bitrate index."); if (((flags >> 10) & 0x03) == 0x03) throw new CorruptFileException ( "Invalid sample rate."); xing_header = XingHeader.Unknown; vbri_header = VBRIHeader.Unknown; // Check for a Xing header that will help us in // gathering information about a VBR stream. file.Seek (position + XingHeader.XingHeaderOffset ( Version, ChannelMode)); ByteVector xing_data = file.ReadBlock (16); if (xing_data.Count == 16 && xing_data.StartsWith ( XingHeader.FileIdentifier)) xing_header = new XingHeader (xing_data); if (xing_header.Present) return; // A Xing header could not be found, next chec for a // Fraunhofer VBRI header. file.Seek (position + VBRIHeader.VBRIHeaderOffset ()); // Only get the first 24 bytes of the Header. // We're not interested in the TOC entries. ByteVector vbri_data = file.ReadBlock (24); if (vbri_data.Count == 24 && vbri_data.StartsWith(VBRIHeader.FileIdentifier)) vbri_header = new VBRIHeader (vbri_data); } #endregion #region Public Properties /// /// Gets the MPEG version used to encode the audio /// represented by the current instance. /// /// /// A value indicating the MPEG /// version used to encode the audio represented by the /// current instance. /// public Version Version { get { switch ((flags >> 19) & 0x03) { case 0: return Version.Version25; case 2: return Version.Version2; default: return Version.Version1; } } } /// /// Gets the MPEG audio layer used to encode the audio /// represented by the current instance. /// /// /// A value indicating the MPEG audio /// layer used to encode the audio represented by the current /// instance. /// public int AudioLayer { get { switch ((flags >> 17) & 0x03) { case 1: return 3; case 2: return 2; default: return 1; } } } /// /// Gets the bitrate of the audio represented by the current /// instance. /// /// /// A value containing a bitrate of the /// audio represented by the current instance. /// public int AudioBitrate { get { if (xing_header.TotalSize > 0 && duration > TimeSpan.Zero) return (int) Math.Round ((( (XingHeader.TotalSize * 8L) / duration.TotalSeconds) / 1000.0)); if (vbri_header.TotalSize > 0 && duration > TimeSpan.Zero) return (int)Math.Round((( (VBRIHeader.TotalSize * 8L) / duration.TotalSeconds) / 1000.0)); return bitrates [ Version == Version.Version1 ? 0 : 1, AudioLayer > 0 ? AudioLayer - 1 : 0, (int) (flags >> 12) & 0x0F]; } } /// /// Gets the sample rate of the audio represented by the /// current instance. /// /// /// A value containing the sample rate of /// the audio represented by the current instance. /// public int AudioSampleRate { get { return sample_rates [(int) Version, (int) (flags >> 10) & 0x03]; } } /// /// Gets the number of channels in the audio represented by /// the current instance. /// /// /// A value containing the number of /// channels in the audio represented by the current /// instance. /// public int AudioChannels { get {return ChannelMode == ChannelMode.SingleChannel ? 1 : 2;} } /// /// Gets the length of the frames in the audio represented by /// the current instance. /// /// /// A value containing the length of the /// frames in the audio represented by the current instance. /// public int AudioFrameLength { get { switch (AudioLayer) { case 1: return 48000 * AudioBitrate / AudioSampleRate + (IsPadded ? 4 : 0); case 2: return 144000 * AudioBitrate / AudioSampleRate + (IsPadded ? 1 : 0); case 3: if (Version == Version.Version1) goto case 2; return 72000 * AudioBitrate / AudioSampleRate + (IsPadded ? 1 : 0); default: return 0; } } } /// /// Gets the duration of the media represented by the current /// instance. /// /// /// A containing the duration of the /// media represented by the current instance. /// /// /// If is equal to and has not been called, this value /// will not be correct. /// If is equal to and has not been called, this value /// will not be correct. /// public TimeSpan Duration { get { if (duration > TimeSpan.Zero) return duration; if (xing_header.TotalFrames > 0) { // Read the length and the bitrate from // the Xing header. double time_per_frame = (double) block_size [(int) Version, AudioLayer] / (double) AudioSampleRate; duration = TimeSpan.FromSeconds ( time_per_frame * XingHeader.TotalFrames); } else if (vbri_header.TotalFrames > 0) { // Read the length and the bitrate from // the VBRI header. double time_per_frame = (double) block_size [ (int) Version, AudioLayer] / (double) AudioSampleRate; duration = TimeSpan.FromSeconds ( Math.Round (time_per_frame * VBRIHeader.TotalFrames)); } else if (AudioFrameLength > 0 && AudioBitrate > 0) { // Since there was no valid Xing or VBRI // header found, we hope that we're in a // constant bitrate file. int frames = (int) (stream_length / AudioFrameLength + 1); duration = TimeSpan.FromSeconds ( (double) (AudioFrameLength * frames) / (double) (AudioBitrate * 125) + 0.5); } return duration; } } /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public string Description { get { System.Text.StringBuilder builder = new System.Text.StringBuilder (); builder.Append ("MPEG Version "); switch (Version) { case Version.Version1: builder.Append ("1"); break; case Version.Version2: builder.Append ("2"); break; case Version.Version25: builder.Append ("2.5"); break; } builder.Append (" Audio, Layer "); builder.Append (AudioLayer); if (xing_header.Present || vbri_header.Present) builder.Append (" VBR"); return builder.ToString (); } } /// /// Gets the types of media represented by the current /// instance. /// /// /// Always . /// public MediaTypes MediaTypes { get {return MediaTypes.Audio;} } /// /// Gets whether or not the audio represented by the current /// instance is protected. /// /// /// A value indicating whether or not the /// audio represented by the current instance is protected. /// public bool IsProtected { get {return ((flags >>16) & 1) == 0;} } /// /// Gets whether or not the audio represented by the current /// instance is padded. /// /// /// A value indicating whether or not the /// audio represented by the current instance is padded. /// public bool IsPadded { get {return ((flags >> 9) & 1) == 1;} } /// /// Gets whether or not the audio represented by the current /// instance is copyrighted. /// /// /// A value indicating whether or not the /// audio represented by the current instance is copyrighted. /// public bool IsCopyrighted { get {return ((flags >> 3) & 1) == 1;} } /// /// Gets whether or not the audio represented by the current /// instance is original. /// /// /// A value indicating whether or not the /// audio represented by the current instance is original. /// public bool IsOriginal { get {return ((flags >> 2) & 1) == 1;} } /// /// Gets the MPEG audio channel mode of the audio represented /// by the current instance. /// /// /// A value indicating the MPEG /// audio channel mode of the audio represented by the /// current instance. /// public ChannelMode ChannelMode { get {return (ChannelMode) ((flags >> 14) & 0x03);} } /// /// Gets the Xing header found in the audio represented by /// the current instance. /// /// /// A object containing the Xing /// header found in the audio represented by the current /// instance, or if no /// header was found. /// public XingHeader XingHeader { get {return xing_header;} } /// /// Gets the VBRI header found in the audio represented by /// the current instance. /// /// /// A object containing the VBRI /// header found in the audio represented by the current /// instance, or if no /// header was found. /// public VBRIHeader VBRIHeader { get {return vbri_header;} } #endregion #region Public Methods /// /// Sets the length of the audio stream represented by the /// current instance. /// /// /// A value specifying the length in /// bytes of the audio stream represented by the current /// instance. /// /// /// The this value has been set, will /// return an incorrect value. /// public void SetStreamLength (long streamLength) { this.stream_length = streamLength; // Force the recalculation of duration if it depends on // the stream length. if (xing_header.TotalFrames == 0 || vbri_header.TotalFrames == 0) duration = TimeSpan.Zero; } #endregion #region Public Static Methods /// /// Searches for an audio header in a starting at a specified position and searching through /// a specified number of bytes. /// /// /// A object in which the found /// header will be stored. /// /// /// A object to search. /// /// /// A value specifying the seek position /// in at which to start searching. /// /// /// A value specifying the maximum number /// of bytes to search before aborting. /// /// /// A value indicating whether or not a /// header was found. /// /// /// is . /// public static bool Find (out AudioHeader header, TagLib.File file, long position, int length) { if (file == null) throw new ArgumentNullException ("file"); long end = position + length; header = AudioHeader.Unknown; file.Seek (position); ByteVector buffer = file.ReadBlock (3); if (buffer.Count < 3) return false; do { file.Seek (position + 3); buffer = buffer.Mid (buffer.Count - 3); buffer.Add (file.ReadBlock ( (int) File.BufferSize)); for (int i = 0; i < buffer.Count - 3 && (length < 0 || position + i < end); i++) if (buffer [i] == 0xFF && buffer [i + 1] > 0xE0) try { header = new AudioHeader ( buffer.Mid (i, 4), file, position + i); return true; } catch (CorruptFileException) { } position += File.BufferSize; } while (buffer.Count > 3 && (length < 0 || position < end)); return false; } /// /// Searches for an audio header in a starting at a specified position and searching to the /// end of the file. /// /// /// A object in which the found /// header will be stored. /// /// /// A object to search. /// /// /// A value specifying the seek position /// in at which to start searching. /// /// /// A value indicating whether or not a /// header was found. /// /// /// Searching to the end of the file can be very, very slow /// especially for corrupt or non-MPEG files. It is /// recommended to use /// instead. /// public static bool Find (out AudioHeader header, TagLib.File file, long position) { return Find (out header, file, position, -1); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Mpeg/VideoHeader.cs0000644000175000017500000001237411462100402023637 0ustar00rubenruben00000000000000// // VideoHeader.cs: Provides information about an MPEG video stream. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Mpeg { /// /// This structure implements and provides /// information about an MPEG video stream. /// public struct VideoHeader : IVideoCodec { #region Private Static Fields /// /// Contains frame rate values. /// private static readonly double[] frame_rates = new double[9] { 0, 24000d/1001d, 24, 25, 30000d/1001d, 30, 50, 60000d/1001d, 60 }; #endregion #region Private Fields /// /// Contains the video width. /// int width; /// /// Contains the video height. /// int height; /// /// Contains the index in of the /// video frame rate. /// int frame_rate_index; /// /// Contains the video bitrate. /// int bitrate; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading it from a specified /// location in a specified file. /// /// /// A object to read from. /// /// /// A value indicating the position in /// at which the header begins. /// /// /// is . /// /// /// Insufficient data could be read for the header. /// public VideoHeader (TagLib.File file, long position) { if (file == null) throw new ArgumentNullException ("file"); file.Seek (position); ByteVector data = file.ReadBlock (7); if (data.Count < 7) throw new CorruptFileException ( "Insufficient data in header."); width = data.Mid (0, 2).ToUShort () >> 4; height = data.Mid (1, 2).ToUShort () & 0x0FFF; frame_rate_index = data [3] & 0x0F; bitrate = (int) ((data.Mid (4, 3).ToUInt () >> 6) & 0x3FFFF); } #endregion #region Public Properties /// /// Gets the duration of the media represented by the current /// instance. /// /// /// Always . /// public TimeSpan Duration { get {return TimeSpan.Zero;} } /// /// Gets the types of media represented by the current /// instance. /// /// /// Always . /// public MediaTypes MediaTypes { get {return MediaTypes.Video;} } /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public string Description { get {return "MPEG Video";} } /// /// Gets the width of the video represented by the current /// instance. /// /// /// A value containing the width of the /// video represented by the current instance. /// public int VideoWidth { get {return width;} } /// /// Gets the height of the video represented by the current /// instance. /// /// /// A value containing the height of the /// video represented by the current instance. /// public int VideoHeight { get {return height;} } /// /// Gets the frame rate of the video represented by the /// current instance. /// /// /// A value containing the frame rate /// of the video represented by the current instance. /// public double VideoFrameRate { get { return frame_rate_index < 9 ? frame_rates [frame_rate_index] : 0; } } /// /// Gets the bitrate of the video represented by the current /// instance. /// /// /// A value containing a bitrate of the /// video represented by the current instance. /// public int VideoBitrate { get {return bitrate;} } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Tag.cs0000644000175000017500000012712311470571657021331 0ustar00rubenruben00000000000000// // Tag.cs: This abstract class provides generic access to standard tag // features. All tag types will extend this class. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // tag.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2003 Scott Wheeler // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib { /// /// Indicates the tag types used by a file. /// [Flags] public enum TagTypes : uint { /// /// No tag types. /// None = 0x00000000, /// /// Xiph's Vorbis Comment /// Xiph = 0x00000001, /// /// ID3v1 Tag /// Id3v1 = 0x00000002, /// /// ID3v2 Tag /// Id3v2 = 0x00000004, /// /// APE Tag /// Ape = 0x00000008, /// /// Apple's ILST Tag Format /// Apple = 0x00000010, /// /// ASF Tag /// Asf = 0x00000020, /// /// Standard RIFF INFO List Tag /// RiffInfo = 0x00000040, /// /// RIFF Movie ID List Tag /// MovieId = 0x00000080, /// /// DivX Tag /// DivX = 0x00000100, /// /// FLAC Metadata Blocks Tag /// FlacMetadata = 0x00000200, /// /// TIFF IFD Tag /// TiffIFD = 0x00000400, /// /// XMP Tag /// XMP = 0x00000800, /// /// Jpeg Comment Tag /// JpegComment = 0x00001000, /// /// Gif Comment Tag /// GifComment = 0x00002000, /// /// native PNG keywords /// Png = 0x00004000, /// /// All tag types. /// AllTags = 0xFFFFFFFF } /// /// This abstract class provides generic access to standard tag /// features. All tag types will extend this class. /// /// /// Because not every tag type supports the same features, it may be /// useful to check that the value is stored by re-reading the /// property after it is stored. /// public abstract class Tag { /// /// Gets the tag types contained in the current instance. /// /// /// A bitwise combined /// containing the tag types contained in the current /// instance. /// /// /// For a standard tag, the value should be intuitive. For /// example, objects have a /// value of . However, /// for tags of type may /// contain multiple or no types. /// public abstract TagTypes TagTypes {get;} /// /// Gets and sets the title for the media described by the /// current instance. /// /// /// A object containing the title for /// the media described by the current instance or if no value is present. /// /// /// The title is most commonly the name of the song or /// episode or a movie title. For example, "Daydream /// Believer" (a song by the Monkies), "Space Seed" (an /// episode of Star Trek), or "Harold and Kumar Go To White /// Castle" (a movie). /// public virtual string Title { get {return null;} set {} } /// /// Gets and sets the sort name for the title of the media /// described by the current instance. /// /// /// A object containing the sort name for /// the title of the media described by the current instance or if no value is present. /// /// /// Possibly used to sort compilations, or episodic content. /// public virtual string TitleSort { get {return null;} set {} } /// /// Gets and sets the performers or artists who performed in /// the media described by the current instance. /// /// /// A containing the performers or /// artists who performed in the media described by the /// current instance or an empty array if no value is /// present. /// /// /// This field is most commonly called "Artists" in /// media applications and should be used to represent each /// of the artists appearing in the media. It can be simple /// in theform of "The Beatles", or more complicated in the /// form of "John Lennon, Paul McCartney, George Harrison, /// Pete Best", depending on the preferences of the listener /// and the degree to which they organize their media /// collection. /// As the preference of the user may vary, /// applications should not try to limit the user in what /// choice they may make. /// public virtual string [] Performers { get {return new string [] {};} set {} } /// /// Gets and sets the sort names of the performers or artists /// who performed in the media described by the current instance. /// /// /// A containing the sort names for /// the performers or artists who performed in the media /// described by the current instance, or an empty array if /// no value is present. /// /// /// This is used to provide more control over how tracks /// are sorted. Typical uses are to skip common prefixes or /// sort by last name. For example, "The Beatles" might be /// sorted as "Beatles, The". /// /// public virtual string [] PerformersSort { get {return new string [] {};} set {} } /// /// Gets and sets the band or artist who is credited in the /// creation of the entire album or collection containing the /// media described by the current instance. /// /// /// A containing the band or artist /// who is credited in the creation of the entire album or /// collection containing the media described by the current /// instance or an empty array if no value is present. /// /// /// This field is typically optional but aids in the /// sorting of compilations or albums with multiple artists. /// For example, if an album has several artists, sorting by /// artist will split up the album and sorting by album will /// split up albums by the same artist. Having a single album /// artist for an entire album will solve this /// problem. /// As this value is to be used as a sorting key, it /// should be used with less variation than . Where performers can be broken into /// muliple artist it is best to stick with a single band /// name. For example, "The Beatles". /// public virtual string [] AlbumArtists { get {return new string [] {};} set {} } /// /// Gets and sets the sort names for the band or artist who /// is credited in the creation of the entire album or /// collection containing the media described by the /// current instance. /// /// /// A containing the sort names /// for the band or artist who is credited in the creation /// of the entire album or collection containing the media /// described by the current instance or an empty array if /// no value is present. /// /// /// This field is typically optional but aids in the /// sorting of compilations or albums with multiple artists. /// For example, if an album has several artists, sorting by /// artist will split up the album and sorting by album will /// split up albums by the same artist. Having a single album /// artist for an entire album will solve this /// problem. /// As this value is to be used as a sorting key, it /// should be used with less variation than . Where performers can be broken into /// muliple artist it is best to stick with a single band /// name. For example, "Beatles, The". /// public virtual string [] AlbumArtistsSort { get {return new string [] {};} set {} } /// /// Gets and sets the composers of the media represented by /// the current instance. /// /// /// A containing the composers of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This field represents the composers, song writers, /// script writers, or persons who claim authorship of the /// media. /// public virtual string [] Composers { get {return new string [] {};} set {} } /// /// Gets and sets the sort names for the composers of the /// media represented by the current instance. /// /// /// A containing the sort names /// for the composers of the media represented by the /// current instance or an empty array if no value is present. /// /// /// This field is typically optional but aids in the /// sorting of compilations or albums with multiple Composers. /// /// As this value is to be used as a sorting key, it /// should be used with less variation than . Where performers can be broken into /// muliple artist it is best to stick with a single composer. /// For example, "McCartney, Paul". /// public virtual string [] ComposersSort { get {return new string [] {};} set {} } /// /// Gets and sets the album of the media represented by the /// current instance. /// /// /// A object containing the album of /// the media represented by the current instance or if no value is present. /// /// /// This field represents the name of the album the /// media belongs to. In the case of a boxed set, it should /// be the name of the entire set rather than the individual /// disc. /// For example, "Rubber Soul" (an album by the /// Beatles), "The Sopranos: Complete First Season" (a boxed /// set of TV episodes), or "Back To The Future Trilogy" (a /// boxed set of movies). /// public virtual string Album { get {return null;} set {} } /// /// Gets and sets the sort names for the Album Title of the /// media represented by the current instance. /// /// /// A containing the sort names /// for the Album Title of the media represented by the /// current instance or an empty array if no value is present. /// /// /// This field is typically optional but aids in the /// sorting of compilations or albums with Similar Titles. /// /// public virtual string AlbumSort { get {return null;} set {} } /// /// Gets and sets a user comment on the media represented by /// the current instance. /// /// /// A object containing user comments /// on the media represented by the current instance or if no value is present. /// /// /// This field should be used to store user notes and /// comments. There is no constraint on what text can be /// stored here, but it should not contain program /// information. /// Because this field contains notes that the user /// might think of while listening to the media, it may be /// useful for an application to make this field easily /// accessible, perhaps even including it in the main /// interface. /// public virtual string Comment { get {return null;} set {} } /// /// Gets and sets the genres of the media represented by the /// current instance. /// /// /// A containing the genres of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This field represents genres that apply to the song /// or album. This is often used for filtering media. /// A list of common audio genres as popularized by /// ID3v1, are stored in . /// Additionally, contains video /// genres as used by DivX. /// public virtual string [] Genres { get {return new string [] {};} set {} } /// /// Gets and sets the year that the media represented by the /// current instance was recorded. /// /// /// A containing the year that the media /// represented by the current instance was created or zero /// if no value is present. /// /// /// Years greater than 9999 cannot be stored by most /// tagging formats and will be cleared if a higher value is /// set. /// Some tagging formats store higher precision dates /// which will be truncated when this property is set. Format /// specific implementations are necessary access the higher /// precision values. /// public virtual uint Year { get {return 0;} set {} } /// /// Gets and sets the position of the media represented by /// the current instance in its containing album. /// /// /// A containing the position of the /// media represented by the current instance in its /// containing album or zero if not specified. /// /// /// This value should be the same as is listed on the /// album cover and no more than if is non-zero. /// public virtual uint Track { get {return 0;} set {} } /// /// Gets and sets the number of tracks in the album /// containing the media represented by the current instance. /// /// /// A containing the number of tracks in /// the album containing the media represented by the current /// instance or zero if not specified. /// /// /// If non-zero, this value should be at least equal to /// . If is zero, /// this value should also be zero. /// public virtual uint TrackCount { get {return 0;} set {} } /// /// Gets and sets the number of the disc containing the media /// represented by the current instance in the boxed set. /// /// /// A containing the number of the disc /// containing the media represented by the current instance /// in the boxed set. /// /// /// This value should be the same as is number that /// appears on the disc. For example, if the disc is the /// first of three, the value should be 1. It should /// be no more than if is non-zero. /// public virtual uint Disc { get {return 0;} set {} } /// /// Gets and sets the number of discs in the boxed set /// containing the media represented by the current instance. /// /// /// A containing the number of discs in /// the boxed set containing the media represented by the /// current instance or zero if not specified. /// /// /// If non-zero, this value should be at least equal to /// . If is zero, /// this value should also be zero. /// public virtual uint DiscCount { get {return 0;} set {} } /// /// Gets and sets the lyrics or script of the media /// represented by the current instance. /// /// /// A object containing the lyrics or /// script of the media represented by the current instance /// or if no value is present. /// /// /// This field contains a plain text representation of /// the lyrics or scripts with line breaks and whitespace /// being the only formatting marks. /// Some formats support more advances lyrics, like /// synchronized lyrics, but those must be accessed using /// format specific implementations. /// public virtual string Lyrics { get {return null;} set {} } /// /// Gets and sets the grouping on the album which the media /// in the current instance belongs to. /// /// /// A object containing the grouping on /// the album which the media in the current instance belongs /// to or if no value is present. /// /// /// This field contains a non-physical grouping to /// which the track belongs. In classical music, this could /// be a movement. It could also be parts of a series like /// "Introduction", "Closing Remarks", etc. /// public virtual string Grouping { get {return null;} set {} } /// /// Gets and sets the number of beats per minute in the audio /// of the media represented by the current instance. /// /// /// A containing the number of beats per /// minute in the audio of the media represented by the /// current instance, or zero if not specified. /// /// /// This field is useful for DJ's who are trying to /// match songs. It should be calculated from the audio or /// pulled from a database. /// public virtual uint BeatsPerMinute { get {return 0;} set {} } /// /// Gets and sets the conductor or director of the media /// represented by the current instance. /// /// /// A object containing the conductor /// or director of the media represented by the current /// instance or if no value present. /// /// /// This field is most useful for organizing classical /// music and movies. /// public virtual string Conductor { get {return null;} set {} } /// /// Gets and sets the copyright information for the media /// represented by the current instance. /// /// /// A object containing the copyright /// information for the media represented by the current /// instance or if no value present. /// /// /// This field should be used for storing copyright /// information. It may be useful to show this information /// somewhere in the program while the media is /// playing. /// Players should not support editing this field, but /// media creation tools should definitely allow /// modification. /// public virtual string Copyright { get {return null;} set {} } /// /// Gets and sets the MusicBrainz Artist ID of the media represented by /// the current instance. /// /// /// A containing the MusicBrainz ArtistID of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This field represents the MusicBrainz ArtistID, and is used /// to uniquely identify a particular Artist of the track. /// public virtual string MusicBrainzArtistId { get { return null; } set {} } /// /// Gets and sets the MusicBrainz Release ID of the media represented by /// the current instance. /// /// /// A containing the MusicBrainz ReleaseID of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This field represents the MusicBrainz ReleaseID, and is used /// to uniquely identify a particular Release to which this track belongs. /// public virtual string MusicBrainzReleaseId { get { return null; } set {} } /// /// Gets and sets the MusicBrainz Release Artist ID of the media represented by /// the current instance. /// /// /// A containing the MusicBrainz ReleaseArtistID of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This field represents the MusicBrainz Release ArtistID, and is used /// to uniquely identify a particular Album Artist credited with the Album. /// public virtual string MusicBrainzReleaseArtistId { get { return null; } set {} } /// /// Gets and sets the MusicBrainz Track ID of the media represented by /// the current instance. /// /// /// A containing the MusicBrainz TrackID of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This field represents the MusicBrainz TrackID, and is used /// to uniquely identify a particular track. /// public virtual string MusicBrainzTrackId { get { return null; } set {} } /// /// Gets and sets the MusicBrainz Disc ID of the media represented by /// the current instance. /// /// /// A containing the MusicBrainz DiscID of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This field represents the MusicBrainz DiscID, and is used /// to uniquely identify the particular Released Media associated with /// this track. /// public virtual string MusicBrainzDiscId { get { return null; } set {} } /// /// Gets and sets the MusicIP PUID of the media represented by /// the current instance. /// /// /// A containing the MusicIP PUID of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This field represents the MusicIP PUID, and is an acoustic /// fingerprint identifier. It Identifies what this track "Sounds Like". /// public virtual string MusicIpId { get { return null; } set {} } /// /// Gets and sets the Amazon ID of the media represented by /// the current instance. /// /// /// A containing the AmazonID of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This field represents the AmazonID, and is used /// to identify the particular track or album in the Amazon Catalog. /// public virtual string AmazonId { get { return null; } set {} } /// /// Gets and sets the MusicBrainz Release Status of the media represented by /// the current instance. /// /// /// A containing the MusicBrainz ReleaseStatus of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This field represents the MusicBrainz ReleaseStatus, and is used /// to describes how 'official' a Release is. Common Status are: Official, Promotion, /// Bootleg, Pseudo-release. /// public virtual string MusicBrainzReleaseStatus { get { return null; } set {} } /// /// Gets and sets the MusicBrainz Release Type of the media represented by /// the current instance. /// /// /// A containing the MusicBrainz ReleaseType of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This field represents the MusicBrainz ReleaseType, that describes /// what kind of release a Release is.. Common Status are: Single, Album, /// EP, Compilation, Soundtrack, SpokenWord, Interview, Audiobook, Live, Remix, /// and Other. Careful thought must be given when using this field to decide if /// a particular track "Is a Compilation". /// public virtual string MusicBrainzReleaseType { get { return null; } set {} } /// /// Gets and sets the MusicBrainz Release Country of the media represented by /// the current instance. /// /// /// A containing the MusicBrainz ReleaseCountry of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This field represents the MusicBrainz ReleaseCountry, that describes /// the country in which an album was released. Note that the ReleaseCountry /// of an album is not necessarily the country in which it was produced. The /// label itself will typically be more relevant. eg, a release on "Foo Records UK" /// that has "Made in Austria" printed on it, will likely be a UK release. /// public virtual string MusicBrainzReleaseCountry { get { return null; } set {} } /// /// Gets and sets a collection of pictures associated with /// the media represented by the current instance. /// /// /// A containing a collection of /// pictures associated with the media represented by the /// current instance or an empty array if none are present. /// /// /// Typically, this value is used to store an album /// cover or icon to use for the file, but it is capable of /// holding any type of image, including pictures of the /// band, the recording studio, the concert, etc. /// public virtual IPicture [] Pictures { get {return new Picture [] {};} set {} } /// /// Gets and sets the same value as . /// /// /// The same value as . /// /// /// This property exists to aleviate confusion. Use for track artists and for album artists. /// [Obsolete("For album artists use AlbumArtists. For track artists, use Performers")] public virtual string [] Artists { get {return Performers;} set {Performers = value;} } /// /// Gets the same value as . /// /// /// The same value as . /// /// /// This property exists to aleviate confusion. Use for track artists and for album artists. /// [Obsolete("For album artists use FirstAlbumArtist. For track artists, use FirstPerformer")] public string FirstArtist { get {return FirstPerformer;} } /// /// Gets the first value contained in . /// /// /// The first object in , or is it /// contains no values. /// /// /// This property is provided for convenience. Use to set the value. /// public string FirstAlbumArtist { get {return FirstInGroup(AlbumArtists);} } /// /// Gets the first value contained in . /// /// /// The first object in , or is it /// contains no values. /// /// /// This property is provided for convenience. Use to set the value. /// public string FirstAlbumArtistSort { get {return FirstInGroup(AlbumArtistsSort);} } /// /// Gets the first value contained in . /// /// /// The first object in , or is it /// contains no values. /// /// /// This property is provided for convenience. Use to set the value. /// public string FirstPerformer { get {return FirstInGroup(Performers);} } /// /// Gets the first value contained in . /// /// /// The first object in , or is it /// contains no values. /// /// /// This property is provided for convenience. Use to set the value. /// public string FirstPerformerSort { get {return FirstInGroup(PerformersSort);} } /// /// Gets the first value contained in . /// /// /// The first object in , or is it /// contains no values. /// /// /// This property is provided for convenience. Use to set the value. /// public string FirstComposerSort { get {return FirstInGroup(ComposersSort);} } /// /// Gets the first value contained in . /// /// /// The first object in , or is it /// contains no values. /// /// /// This property is provided for convenience. Use to set the value. /// public string FirstComposer { get {return FirstInGroup(Composers);} } /// /// Gets the first value contained in . /// /// /// The first object in , or is it /// contains no values. /// /// /// This property is provided for convenience. Use to set the value. /// public string FirstGenre { get {return FirstInGroup(Genres);} } /// /// Gets the same value as . /// /// /// The same value as . /// /// /// This property exists to aleviate confusion. Use for track artists and for album artists. /// [Obsolete("For album artists use JoinedAlbumArtists. For track artists, use JoinedPerformers")] public string JoinedArtists { get {return JoinedPerformers;} } /// /// Gets a semicolon separated string containing the values /// in . /// /// /// A semicolon separated object /// containing the values in . /// /// /// This property is provided for convenience. Use to set the value. /// public string JoinedAlbumArtists { get {return JoinGroup(AlbumArtists);} } /// /// Gets a semicolon separated string containing the values /// in . /// /// /// A semicolon separated object /// containing the values in . /// /// /// This property is provided for convenience. Use to set the value. /// public string JoinedPerformers { get {return JoinGroup(Performers);} } /// /// Gets a semicolon separated string containing the values /// in . /// /// /// A semicolon separated object /// containing the values in . /// /// /// This property is provided for convenience. Use to set the value. /// public string JoinedPerformersSort { get {return JoinGroup(PerformersSort);} } /// /// Gets a semicolon separated string containing the values /// in . /// /// /// A semicolon separated object /// containing the values in . /// /// /// This property is provided for convenience. Use to set the value. /// public string JoinedComposers { get {return JoinGroup(Composers);} } /// /// Gets a semicolon separated string containing the values /// in . /// /// /// A semicolon separated object /// containing the values in . /// /// /// This property is provided for convenience. Use to set the value. /// public string JoinedGenres { get {return JoinGroup(Genres);} } /// /// Gets the first string in an array. /// /// /// A to get the first string from. /// /// /// The first object contained in /// , or if /// the array is or empty. /// private static string FirstInGroup(string [] group) { return group == null || group.Length == 0 ? null : group [0]; } /// /// Joins a array of strings into a single, semicolon /// separated, string. /// /// /// A containing values to combine. /// /// /// A semicolon separated object /// containing the values from . /// private static string JoinGroup (string [] group) { if (group == null) return null; return string.Join ("; ", group); } /// /// Gets whether or not the current instance is empty. /// /// /// if the current instance does not /// any values. Otherwise . /// /// /// In the default implementation, this checks the values /// supported by , but it may be extended /// by child classes to support other values. /// public virtual bool IsEmpty { get { return IsNullOrLikeEmpty (Title) && IsNullOrLikeEmpty (Grouping) && IsNullOrLikeEmpty (AlbumArtists) && IsNullOrLikeEmpty (Performers) && IsNullOrLikeEmpty (Composers) && IsNullOrLikeEmpty (Conductor) && IsNullOrLikeEmpty (Copyright) && IsNullOrLikeEmpty (Album) && IsNullOrLikeEmpty (Comment) && IsNullOrLikeEmpty (Genres) && Year == 0 && BeatsPerMinute == 0 && Track == 0 && TrackCount == 0 && Disc == 0 && DiscCount == 0; } } /// /// Clears the values stored in the current instance. /// /// /// The clearing procedure is format specific and should /// clear all values. /// public abstract void Clear (); /// /// Copies all standard values from one tag to another, /// optionally overwriting existing values. /// /// /// A object containing the source tag to /// copy the values from. /// /// /// A object containing the target tag to /// copy values to. /// /// /// A specifying whether or not to copy /// values over existing one. /// /// /// This method only copies the most basic values, /// those contained in this class, between tags. To copy /// format specific tags, or additional details, additional /// implementations need to be applied. For example, copying /// from one to another: /// foreach (TagLib.Id3v2.Frame frame in old_tag) /// new_tag.AddFrame (frame); /// /// /// or /// is . /// [Obsolete("Use Tag.CopyTo(Tag,bool)")] public static void Duplicate (Tag source, Tag target, bool overwrite) { if (source == null) throw new ArgumentNullException ("source"); if (target == null) throw new ArgumentNullException ("target"); source.CopyTo (target, overwrite); } /// /// Copies the values from the current instance to another /// , optionally overwriting /// existing values. /// /// /// A object containing the target tag to /// copy values to. /// /// /// A specifying whether or not to copy /// values over existing one. /// /// /// This method only copies the most basic values when /// copying between different tag formats, however, if /// is of the same type as the /// current instance, more advanced copying may be done. /// For example, will copy /// all of its frames to another tag. /// /// /// is . /// public virtual void CopyTo (Tag target, bool overwrite) { if (target == null) throw new ArgumentNullException ("target"); if (overwrite || IsNullOrLikeEmpty (target.Title)) target.Title = Title; if (overwrite || IsNullOrLikeEmpty (target.AlbumArtists)) target.AlbumArtists = AlbumArtists; if (overwrite || IsNullOrLikeEmpty (target.Performers)) target.Performers = Performers; if (overwrite || IsNullOrLikeEmpty (target.Composers)) target.Composers = Composers; if (overwrite || IsNullOrLikeEmpty (target.Album)) target.Album = Album; if (overwrite || IsNullOrLikeEmpty (target.Comment)) target.Comment = Comment; if (overwrite || IsNullOrLikeEmpty (target.Genres)) target.Genres = Genres; if (overwrite || target.Year == 0) target.Year = Year; if (overwrite || target.Track == 0) target.Track = Track; if (overwrite || target.TrackCount == 0) target.TrackCount = TrackCount; if (overwrite || target.Disc == 0) target.Disc = Disc; if (overwrite || target.DiscCount == 0) target.DiscCount = DiscCount; if (overwrite || target.BeatsPerMinute == 0) target.BeatsPerMinute = BeatsPerMinute; if (overwrite || IsNullOrLikeEmpty (target.Grouping)) target.Grouping = Grouping; if (overwrite || IsNullOrLikeEmpty (target.Conductor)) target.Conductor = Conductor; if (overwrite || IsNullOrLikeEmpty (target.Copyright)) target.Copyright = Copyright; } /// /// Checks if a is or contains only whitespace characters. /// /// /// A object to check. /// /// /// if the string is or contains only whitespace /// characters. Otherwise . /// private static bool IsNullOrLikeEmpty (string value) { return value == null || value.Trim ().Length == 0; } /// /// Checks if all the strings in the array return with or if the array is /// or is empty. /// /// /// A to check the contents of. /// /// /// if the array is or empty, or all elements return for . Otherwise . /// private static bool IsNullOrLikeEmpty (string [] value) { if (value == null) return true; foreach (string s in value) if (!IsNullOrLikeEmpty (s)) return false; return true; } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/ByteVector.cs0000644000175000017500000023576711470571657022722 0ustar00rubenruben00000000000000// // ByteVector.cs: represents and performs operations on variable length list of // bytes. // // Author: // Brian Nickel (brian.nickel@gmail.com) // Aaron Bockover (abockover@novell.com) // // Original Source: // tbytevector.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2006 Novell, Inc. // Copyright (C) 2002-2004 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections; using System.Collections.Generic; using System.Text; namespace TagLib { /// /// Specifies the text encoding used when converting between a and a . /// /// /// This enumeration is used by and . /// public enum StringType { /// /// The string is to be Latin-1 encoded. /// Latin1 = 0, /// /// The string is to be UTF-16 encoded. /// UTF16 = 1, /// /// The string is to be UTF-16BE encoded. /// UTF16BE = 2, /// /// The string is to be UTF-8 encoded. /// UTF8 = 3, /// /// The string is to be UTF-16LE encoded. /// UTF16LE = 4 } /// /// This class represents and performs operations on variable length /// list of elements. /// public class ByteVector : IList, IComparable { #region Private Static Fields /// /// Contains values to use in CRC calculation. /// private static uint [] crc_table = new uint[256] { 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 }; /// /// Specifies whether or not to use a broken Latin-1 /// behavior. /// private static bool use_broken_latin1 = false; /// /// Contains a one byte text delimiter. /// private static readonly ReadOnlyByteVector td1 = new ReadOnlyByteVector ((int)1); /// /// Contains a two byte text delimiter. /// private static readonly ReadOnlyByteVector td2 = new ReadOnlyByteVector ((int)2); /// /// Contains the last generic UTF-16 encoding read. /// /// /// When reading a collection of UTF-16 strings, sometimes /// only the first one will contain the BOM. In that case, /// this field will inform the file what encoding to use for /// the second string. /// private static System.Text.Encoding last_utf16_encoding = System.Text.Encoding.Unicode; #endregion #region Private Fields /// /// Contains the internal byte list. /// private List data = new List(); #endregion #region Constructors /// /// Constructs and initializes a new instance of with a length of zero. /// public ByteVector () { } /// /// Constructs and initializes a new instance of by copying the values from another /// instance. /// /// /// A object containing the bytes /// to be stored in the new instance. /// public ByteVector (ByteVector vector) { if (vector != null) this.data.AddRange (vector); } /// /// Constructs and initializes a new instance of by copying the values from a /// specified . /// /// /// A containing the bytes to be stored /// in the new instance. /// public ByteVector (params byte [] data) { if (data != null) this.data.AddRange (data); } /// /// Constructs and initializes a new instance of by copying a specified number of /// values from a specified . /// /// /// A containing the bytes to be stored /// in the new instance. /// /// /// A value specifying the number of bytes /// to be copied to the new instance. /// /// /// is less than zero or greater /// than the length of the data. /// public ByteVector (byte [] data, int length) { if (length > data.Length) throw new ArgumentOutOfRangeException ("length", "Length exceeds size of data."); if (length < 0) throw new ArgumentOutOfRangeException ("length", "Length is less than zero."); if (length == data.Length) { this.data.AddRange (data); } else { byte [] array = new byte[length]; System.Array.Copy (data, 0, array, 0, length); this.data.AddRange (array); } } /// /// Constructs and initializes a new instance of of specified size containing bytes /// with a zeroed value. /// /// /// A value specifying the number of bytes /// to be stored in the new instance. /// /// /// Each element of the new instance will have a value of /// 0x00. to fill /// a new instance with a specified value. /// /// /// is less than zero. /// public ByteVector (int size) : this (size, 0) { } /// /// Constructs and initializes a new instance of of specified size containing bytes /// of a specified value. /// /// /// A value specifying the number of bytes /// to be stored in the new instance. /// /// /// A value specifying the value to be /// stored in the new instance. /// /// /// is less than zero. /// public ByteVector (int size, byte value) { if (size < 0) throw new ArgumentOutOfRangeException ("size", "Size is less than zero."); if(size == 0) return; byte [] data = new byte [size]; for (int i = 0; i < size; i ++) data[i] = value; this.data.AddRange (data); } #endregion #region Public Properties /// /// Gets the data stored in the current instance. /// /// /// A containing the data stored in the /// current instance. /// public byte [] Data { get {return this.data.ToArray();} } /// /// Gets whether or not the current instance is empty. /// /// /// A value indicating whether or not the /// current instance is empty. /// public bool IsEmpty { get {return this.data.Count == 0;} } /// /// Gets the CRC-32 checksum of the current instance. /// /// /// A value containing the CRC-32 checksum /// of the current instance. /// public uint Checksum { get { uint sum = 0; foreach(byte b in this.data) sum = (sum << 8) ^ crc_table [((sum >> 24) & 0xFF) ^ b]; return sum; } } #endregion #region Public Static Properties /// /// Gets and sets whether or not to use a broken behavior for /// Latin-1 strings, common to ID3v1 and ID3v2 tags. /// /// /// if the broken behavior is to be /// used. Otherwise, . /// /// /// Many media players and taggers incorrectly treat /// Latin-1 fields as "default encoding" fields. As such, a /// tag may end up with Windows-1250 encoded text. While this /// problem would be apparent when moving a file from one /// computer to another, it would not be apparent on the /// original machine. By setting this property to , your program will behave like Windows /// Media Player and others, who read tags with this broken /// behavior. /// Please note that TagLib# stores tag data in Unicode /// formats at every possible instance to avoid these /// problems in tags it has written. /// public static bool UseBrokenLatin1Behavior { get {return use_broken_latin1;} set {use_broken_latin1 = value;} } #endregion #region Public Methods /// /// Creates a new instance of /// containing a specified range of elements from the current /// instance. /// /// /// A value specifying the index at which /// to start copying elements from the current instance. /// /// /// A value specifying the number of /// elements to copy from the current instance. /// /// /// is less than zero or /// greater than or equal to . OR /// is less than zero or greater /// than the amount of available data. /// public ByteVector Mid (int startIndex, int length) { if (startIndex < 0 || startIndex > Count) throw new ArgumentOutOfRangeException ( "startIndex"); if (length < 0 || startIndex + length > Count) throw new ArgumentOutOfRangeException ( "length"); if (length == 0) return new ByteVector (); if(startIndex + length > this.data.Count) length = this.data.Count - startIndex; byte [] data = new byte [length]; this.data.CopyTo (startIndex, data, 0, length); return data; } /// /// Creates a new instance of /// containing elements from the current instance starting /// from a specified point. /// /// /// A value specifying the index at which /// to start copying elements from the current instance. /// /// /// is less than zero or greater /// than or equal to . /// public ByteVector Mid (int index) { return Mid(index, Count - index); } /// /// Finds the first byte-aligned occurance of a pattern in /// the current instance, starting at a specified position. /// /// /// A object containing the pattern /// to search for in the current instance. /// /// /// A value specifying the index in the /// current instance at which to start searching. /// /// /// A value specifying the byte alignment /// of the pattern to search for, relative to . /// /// /// A value containing the index at which /// was found in the current /// instance, or -1 if the pattern was not found. The /// difference between the position and will be divisible by . /// /// /// is . /// /// /// is less than zero or /// is less than 1. /// public int Find (ByteVector pattern, int offset, int byteAlign) { if (pattern == null) throw new ArgumentNullException ("pattern"); if (offset < 0) throw new ArgumentOutOfRangeException ( "offset", "offset must be at least 0."); if (byteAlign < 1) throw new ArgumentOutOfRangeException ( "byteAlign", "byteAlign must be at least 1."); if (pattern.Count > Count - offset) return -1; // Let's go ahead and special case a pattern of size one // since that's common and easy to make fast. if (pattern.Count == 1) { byte p = pattern [0]; for (int i = offset; i < this.data.Count; i += byteAlign) if (this.data [i] == p) return i; return -1; } int [] last_occurrence = new int [256]; for (int i = 0; i < 256; ++i) last_occurrence [i] = pattern.Count; for (int i = 0; i < pattern.Count - 1; ++i) last_occurrence [pattern [i]] = pattern.Count - i - 1; for (int i = pattern.Count - 1 + offset; i < this.data.Count; i += last_occurrence [this.data [i]]) { int iBuffer = i; int iPattern = pattern.Count - 1; while(iPattern >= 0 && this.data [iBuffer] == pattern [iPattern]) { --iBuffer; --iPattern; } if (-1 == iPattern && (iBuffer + 1 - offset) % byteAlign == 0) return iBuffer + 1; } return -1; } /// /// Finds the first occurance of a pattern in the current /// instance, starting at a specified position. /// /// /// A object containing the pattern /// to search for in the current instance. /// /// /// A value specifying the index in the /// current instance at which to start searching. /// /// /// A value containing the index at which /// was found in the current /// instance, or -1 if the pattern was not found. /// /// /// is . /// /// /// is less than zero. /// public int Find(ByteVector pattern, int offset) { return Find(pattern, offset, 1); } /// /// Finds the first occurance of a pattern in the current /// instance. /// /// /// A object containing the pattern /// to search for in the current instance. /// /// /// A value containing the index at which /// was found in the current /// instance, or -1 if the pattern was not found. /// /// /// is . /// public int Find(ByteVector pattern) { return Find(pattern, 0, 1); } /// /// Finds the last byte-aligned occurance of a pattern in /// the current instance, starting before a specified /// position. /// /// /// A object containing the pattern /// to search for in the current instance. /// /// /// A value specifying the index in the /// current instance at which to start searching. /// /// /// A value specifying the byte alignment /// of the pattern to search for, relative to . /// /// /// A value containing the index at which /// was found in the current /// instance, or -1 if the pattern was not found. The /// difference between the position and will be divisible by . /// /// /// is . /// /// /// is less than zero. /// public int RFind (ByteVector pattern, int offset, int byteAlign) { if (pattern == null) throw new ArgumentNullException ("pattern"); if (offset < 0) throw new ArgumentOutOfRangeException ( "offset"); if (pattern.Count == 0 || pattern.Count > Count - offset) return -1; // Let's go ahead and special case a pattern of size one // since that's common and easy to make fast. if (pattern.Count == 1) { byte p = pattern [0]; for (int i = Count - offset - 1; i >= 0; i -= byteAlign) if (this.data [i] == p) return i; return -1; } int [] first_occurrence = new int [256]; for (int i = 0; i < 256; ++i) first_occurrence [i] = pattern.Count; for (int i = pattern.Count - 1; i > 0; --i) first_occurrence [pattern [i]] = i; for (int i = Count - offset - pattern.Count; i >= 0; i -= first_occurrence [this.data [i]]) if ((offset - i) % byteAlign == 0 && ContainsAt (pattern, i)) return i; return -1; } /// /// Finds the last occurance of a pattern in the current /// instance, starting before a specified position. /// /// /// A object containing the pattern /// to search for in the current instance. /// /// /// A value specifying the index in the /// current instance at which to start searching. /// /// /// A value containing the index at which /// was found in the current /// instance, or -1 if the pattern was not found. /// /// /// is . /// /// /// is less than zero. /// public int RFind(ByteVector pattern, int offset) { return RFind (pattern, offset, 1); } /// /// Finds the last occurance of a pattern in the current /// instance. /// /// /// A object containing the pattern /// to search for in the current instance. /// /// /// A value containing the index at which /// was found in the current /// instance, or -1 if the pattern was not found. /// /// /// is . /// public int RFind(ByteVector pattern) { return RFind(pattern, 0, 1); } /// /// Checks whether or not a pattern appears at a specified /// position in the current instance. /// /// /// A object containing the pattern /// to check for in the current instance. /// /// /// A value specifying the offset in the /// current instance at which to check for the pattern. /// /// /// A value specifying the position in /// at which to start checking. /// /// /// A value specifying the number of bytes /// in to compare. /// /// /// if the pattern was found at the /// specified position. Otherwise, . /// /// /// is . /// public bool ContainsAt (ByteVector pattern, int offset, int patternOffset, int patternLength) { if (pattern == null) throw new ArgumentNullException ("pattern"); if(pattern.Count < patternLength) { patternLength = pattern.Count; } // do some sanity checking -- all of these things are // needed for the search to be valid if (patternLength > this.data.Count || offset >= this.data.Count || patternOffset >= pattern.Count || patternLength <= 0 || offset < 0) return false; // loop through looking for a mismatch for (int i = 0; i < patternLength - patternOffset; i++) if (this.data[i + offset] != pattern [i + patternOffset]) return false; return true; } /// /// Checks whether or not a pattern appears at a specified /// position in the current instance. /// /// /// A object containing the pattern /// to check for in the current instance. /// /// /// A value specifying the offset in the /// current instance at which to check for the pattern. /// /// /// A value specifying the position in /// at which to start checking. /// /// /// if the pattern was found at the /// specified position. Otherwise, . /// /// /// is . /// public bool ContainsAt (ByteVector pattern, int offset, int patternOffset) { return ContainsAt (pattern, offset, patternOffset, int.MaxValue); } /// /// Checks whether or not a pattern appears at a specified /// position in the current instance. /// /// /// A object containing the pattern /// to check for in the current instance. /// /// /// A value specifying the offset in the /// current instance at which to check for the pattern. /// /// /// if the pattern was found at the /// specified position. Otherwise, . /// /// /// is . /// public bool ContainsAt (ByteVector pattern, int offset) { return ContainsAt (pattern, offset, 0); } /// /// Checks whether or not a pattern appears at the beginning /// of the current instance. /// /// /// A object containing the pattern /// to check for in the current instance. /// /// /// if the pattern was found at the /// beginning of the current instance. Otherwise, . /// /// /// is . /// public bool StartsWith (ByteVector pattern) { return ContainsAt (pattern, 0); } /// /// Checks whether or not a pattern appears at the end of the /// current instance. /// /// /// A object containing the pattern /// to check for in the current instance. /// /// /// if the pattern was found at the /// end of the current instance. Otherwise, . /// /// /// is . /// public bool EndsWith (ByteVector pattern) { if (pattern == null) throw new ArgumentNullException ("pattern"); return ContainsAt (pattern, this.data.Count - pattern.Count); } /// /// Checks whether or not the current instance ends with part /// of a pattern. /// /// /// A object containing the pattern /// to search for in the current instance. /// /// /// A value containing the index at which /// a partial match was located, or -1 if no match was found. /// /// /// This function is useful for checking for patterns /// across multiple buffers. /// public int EndsWithPartialMatch (ByteVector pattern) { if (pattern == null) throw new ArgumentNullException ("pattern"); if(pattern.Count > this.data.Count) { return -1; } int start_index = this.data.Count - pattern.Count; // try to match the last n-1 bytes from the vector // (where n is the pattern size) -- continue trying to // match n-2, n-3...1 bytes for(int i = 1; i < pattern.Count; i++) { if (ContainsAt (pattern, start_index + i, 0, pattern.Count - i)) { return start_index + i; } } return -1; } /// /// Adds the contents of another /// object to the end of the current instance. /// /// /// A object containing data to add /// to the end of the current instance. /// /// /// The current instance is read-only. /// public void Add (ByteVector data) { if (IsReadOnly) throw new NotSupportedException ( "Cannot edit readonly objects."); if(data != null) { this.data.AddRange(data); } } /// /// Adds the contents of an array to the end of the current /// instance. /// /// /// A containing data to add to the end /// of the current instance. /// /// /// The current instance is read-only. /// public void Add (byte [] data) { if (IsReadOnly) throw new NotSupportedException ( "Cannot edit readonly objects."); if(data != null) this.data.AddRange(data); } /// /// Inserts the contents of another /// object into the current instance. /// /// /// A value specifying the index at which /// to insert the data. /// /// /// A object containing data to /// insert into the current instance. /// /// /// The current instance is read-only. /// public void Insert (int index, ByteVector data) { if (IsReadOnly) throw new NotSupportedException ( "Cannot edit readonly objects."); if (data != null) this.data.InsertRange (index, data); } /// /// Inserts the contents of an array to insert into the /// current instance. /// /// /// A value specifying the index at which /// to insert the data. /// /// /// A containing data to insert into the /// current instance. /// /// /// The current instance is read-only. /// public void Insert (int index, byte [] data) { if (IsReadOnly) throw new NotSupportedException ( "Cannot edit readonly objects."); if (data != null) this.data.InsertRange (index, data); } /// /// Resizes the current instance. /// /// /// A value specifying the new size of the /// current instance. /// /// /// A object containing the padding byte /// to use if the current instance is growing. /// /// /// The current instance. /// /// /// The current instance is read-only. /// public ByteVector Resize (int size, byte padding) { if (IsReadOnly) throw new NotSupportedException ( "Cannot edit readonly objects."); if (this.data.Count > size) this.data.RemoveRange (size, this.data.Count - size); while (this.data.Count < size) this.data.Add (padding); return this; } /// /// Resizes the current instance. /// /// /// A value specifying the new size of the /// current instance. /// /// /// The current instance. /// /// /// If the current instance grows, the added bytes are filled /// with '0'. Use to specify /// the padding byte. /// /// /// The current instance is read-only. /// /// public ByteVector Resize (int size) { return Resize (size, 0); } /// /// Removes a range of data from the current instance. /// /// /// A value specifying the index at which /// to start removing data. /// /// /// A value specifying the number of bytes /// to remove. /// /// /// The current instance is read-only. /// public void RemoveRange (int index, int count) { if (IsReadOnly) throw new NotSupportedException ( "Cannot edit readonly objects."); this.data.RemoveRange (index, count); } #endregion #region Conversions /// /// Converts an first four bytes of the current instance to /// a value. /// /// /// if the most significant byte /// appears first (big endian format), or if the least significant byte appears /// first (little endian format). /// /// /// A value containing the value read from /// the current instance. /// public int ToInt (bool mostSignificantByteFirst) { int ret = 0; int last = Count > 4 ? 3 : Count - 1; for (int i = 0; i <= last; i++) { int offset = mostSignificantByteFirst ? last-i : i; ret |= (int) this[i] << (offset * 8); } return ret; } /// /// Converts an first four bytes of the current instance to /// a value using big-endian format. /// /// /// A value containing the value read from /// the current instance. /// public int ToInt () { return ToInt (true); } /// /// Converts an first four bytes of the current instance to /// a value. /// /// /// if the most significant byte /// appears first (big endian format), or if the least significant byte appears /// first (little endian format). /// /// /// A value containing the value read from /// the current instance. /// public uint ToUInt (bool mostSignificantByteFirst) { uint sum = 0; int last = Count > 4 ? 3 : Count - 1; for (int i = 0; i <= last; i++) { int offset = mostSignificantByteFirst ? last-i : i; sum |= (uint) this[i] << (offset * 8); } return sum; } /// /// Converts an first four bytes of the current instance to /// a value using big-endian format. /// /// /// A value containing the value read from /// the current instance. /// public uint ToUInt () { return ToUInt (true); } /// /// Converts an first two bytes of the current instance to a /// value. /// /// /// if the most significant byte /// appears first (big endian format), or if the least significant byte appears /// first (little endian format). /// /// /// A value containing the value read /// from the current instance. /// public ushort ToUShort (bool mostSignificantByteFirst) { ushort sum = 0; int last = Count > 2 ? 1 : Count - 1; for (int i = 0; i <= last; i++) { int offset = mostSignificantByteFirst ? last-i : i; sum |= (ushort)(this[i] << (offset * 8)); } return sum; } /// /// Converts an first two bytes of the current instance to /// a value using big-endian format. /// /// /// A value containing the value read /// from the current instance. /// public ushort ToUShort () { return ToUShort (true); } /// /// Converts an first eight bytes of the current instance to /// a value. /// /// /// if the most significant byte /// appears first (big endian format), or if the least significant byte appears /// first (little endian format). /// /// /// A value containing the value read /// from the current instance. /// public ulong ToULong (bool mostSignificantByteFirst) { ulong sum = 0; int last = Count > 8 ? 7 : Count - 1; for(int i = 0; i <= last; i++) { int offset = mostSignificantByteFirst ? last-i : i; sum |= (ulong) this[i] << (offset * 8); } return sum; } /// /// Converts an first eight bytes of the current instance to /// a value using big-endian format. /// /// /// A value containing the value read /// from the current instance. /// public ulong ToULong () { return ToULong (true); } /// /// Converts a portion of the current instance to a object using a specified encoding. /// /// /// A value indicating the encoding /// to use when converting to a object. /// /// /// A value specify the index in the /// current instance at which to start converting. /// /// /// A value specify the number of bytes to /// convert. /// /// /// A object containing the converted /// text. /// /// /// is less than zero or greater /// than the total number of bytes, or is less than zero or greater than the number of bytes /// after . /// public string ToString (StringType type, int offset, int count) { if (offset < 0 || offset > Count) throw new ArgumentOutOfRangeException ("offset"); if (count < 0 || count + offset > Count) throw new ArgumentOutOfRangeException ("count"); ByteVector bom = type == StringType.UTF16 && this.data.Count - offset > 1 ? Mid (offset, 2) : null; string s = StringTypeToEncoding (type, bom) .GetString (Data, offset, count); // UTF16 BOM if(s.Length != 0 && (s[0] == 0xfffe || s[0] == 0xfeff)) return s.Substring (1); return s; } /// /// Converts all data after a specified index in the current /// instance to a object using a /// specified encoding. /// /// /// A value indicating the encoding /// to use when converting to a object. /// /// /// A value specify the index in the /// current instance at which to start converting. /// /// /// A object containing the converted /// text. /// /// /// is less than zero or greater /// than the total number of bytes. /// [Obsolete ("Use ToString(StringType,int,int)")] public string ToString (StringType type, int offset) { return ToString (type, offset, Count - offset); } /// /// Converts the current instance into a /// object using a specified encoding. /// /// /// A object containing the converted /// text. /// public string ToString (StringType type) { return ToString (type, 0, Count); } /// /// Converts the current instance into a /// object using a UTF-8 encoding. /// /// /// A object containing the converted /// text. /// public override string ToString () { return ToString (StringType.UTF8); } /// /// Converts the current instance into a starting at a specified offset and using a specified /// encoding, assuming the values are nil separated. /// /// /// A value indicating the encoding /// to use when converting to a object. /// /// /// A value specify the index in the /// current instance at which to start converting. /// /// /// A containing the converted text. /// public string[] ToStrings (StringType type, int offset) { return ToStrings (type, offset, int.MaxValue); } /// /// Converts the current instance into a starting at a specified offset and using a specified /// encoding, assuming the values are nil separated and /// limiting it to a specified number of items. /// /// /// A value indicating the encoding /// to use when converting to a object. /// /// /// A value specify the index in the /// current instance at which to start converting. /// /// /// A value specifying a limit to the /// number of strings to create. Once the limit has been /// reached, the last string will be filled by the remainder /// of the data. /// /// /// A containing the converted text. /// public string[] ToStrings (StringType type, int offset, int count) { int chunk = 0; int position = offset; List list = new List (); ByteVector separator = TextDelimiter (type); int align = separator.Count; while (chunk < count && position < Count) { int start = position; if (chunk + 1 == count) { position = offset + count; } else { position = Find (separator, start, align); if (position < 0) position = Count; } int length = position - start; if (length == 0) { list.Add (string.Empty); } else { string s = ToString (type, start, length); if (s.Length != 0 && (s[0] == 0xfffe || s[0] == 0xfeff)) { // UTF16 BOM s = s.Substring (1); } list.Add (s); } position += align; } return list.ToArray (); } #endregion #region Operators /// /// Determines whether two specified objects are equal. /// /// /// A to compare. /// /// /// A to compare. /// /// /// if and contain the same /// data; otherwise, . /// public static bool operator== (ByteVector first, ByteVector second) { bool fnull = (object) first == null; bool snull = (object) second == null; if (fnull && snull) return true; else if (fnull || snull) return false; return first.Equals (second); } /// /// Determines whether two specified objects differ. /// /// /// A to compare. /// /// /// A to compare. /// /// /// if and contain different /// data; otherwise, . /// public static bool operator!= (ByteVector first, ByteVector second) { return !(first == second); } /// /// Determines whether or not one /// is less than another. /// /// /// A to compare. /// /// /// A to compare. /// /// /// if is less than ; otherwise, /// . /// /// /// or /// is . /// public static bool operator< (ByteVector first, ByteVector second) { if (first == null) throw new ArgumentNullException ("first"); if (second == null) throw new ArgumentNullException ("second"); return first.CompareTo (second) < 0; } /// /// Determines whether or not one /// is less than or equal to another. /// /// /// A to compare. /// /// /// A to compare. /// /// /// if is less than or equal to ; /// otherwise, . /// /// /// or /// is . /// public static bool operator<= (ByteVector first, ByteVector second) { if (first == null) throw new ArgumentNullException ("first"); if (second == null) throw new ArgumentNullException ("second"); return first.CompareTo (second) <= 0; } /// /// Determines whether or not one /// is greater than another. /// /// /// A to compare. /// /// /// A to compare. /// /// /// if is greater than ; otherwise, /// . /// /// /// or /// is . /// public static bool operator> (ByteVector first, ByteVector second) { if (first == null) throw new ArgumentNullException ("first"); if (second == null) throw new ArgumentNullException ("second"); return first.CompareTo (second) > 0; } /// /// Determines whether or not one /// is greater than or equal to another. /// /// /// A to compare. /// /// /// A to compare. /// /// /// if is greater than or equal to ; otherwise, . /// /// /// or /// is . /// public static bool operator>= (ByteVector first, ByteVector second) { if (first == null) throw new ArgumentNullException ("first"); if (second == null) throw new ArgumentNullException ("second"); return first.CompareTo (second) >= 0; } /// /// Creates a new object by adding /// two objects together. /// /// /// A to combine. /// /// /// A to combine. /// /// /// A new instance of with the /// contents of followed by the /// contents of . /// public static ByteVector operator+ (ByteVector first, ByteVector second) { ByteVector sum = new ByteVector(first); sum.Add(second); return sum; } /// /// Converts a to a new object. /// /// /// A to convert. /// /// /// A new instance of containing /// . /// public static implicit operator ByteVector (byte value) { return new ByteVector (value); } /// /// Converts a to a new object. /// /// /// A to convert. /// /// /// A new instance of containing /// the contents of . /// public static implicit operator ByteVector (byte [] value) { return new ByteVector (value); } /// /// Converts a to a new object. /// /// /// A to convert. /// /// /// A new instance of containing /// the UTF-8 encoded contents of . /// public static implicit operator ByteVector (string value) { return ByteVector.FromString (value, StringType.UTF8); } #endregion #region Static Conversions /// /// Converts a value into a data representation. /// /// /// A value to convert into bytes. /// /// /// if the most significant byte is /// to appear first (big endian format), or if the least significant byte is to /// appear first (little endian format). /// /// /// A object containing the encoded /// representation of . /// public static ByteVector FromInt (int value, bool mostSignificantByteFirst) { ByteVector vector = new ByteVector(); for(int i = 0; i < 4; i++) { int offset = mostSignificantByteFirst ? 3-i : i; vector.Add ((byte)(value >> (offset * 8) & 0xFF)); } return vector; } /// /// Converts an value into a big-endian data representation. /// /// /// A value to convert into bytes. /// /// /// A object containing the encoded /// representation of . /// public static ByteVector FromInt (int value) { return FromInt (value, true); } /// /// Converts an unsigned value into a data representation. /// /// /// A value to convert into bytes. /// /// /// if the most significant byte is /// to appear first (big endian format), or if the least significant byte is to /// appear first (little endian format). /// /// /// A object containing the encoded /// representation of . /// public static ByteVector FromUInt (uint value, bool mostSignificantByteFirst) { ByteVector vector = new ByteVector(); for(int i = 0; i < 4; i++) { int offset = mostSignificantByteFirst ? 3-i : i; vector.Add ((byte)(value >> (offset * 8) & 0xFF)); } return vector; } /// /// Converts an unsigned value into a big-endian data /// representation. /// /// /// A value to convert into bytes. /// /// /// A object containing the encoded /// representation of . /// public static ByteVector FromUInt (uint value) { return FromUInt(value, true); } /// /// Converts an unsigned value into a data representation. /// /// /// A value to convert into bytes. /// /// /// if the most significant byte is /// to appear first (big endian format), or if the least significant byte is to /// appear first (little endian format). /// /// /// A object containing the encoded /// representation of . /// public static ByteVector FromUShort (ushort value, bool mostSignificantByteFirst) { ByteVector vector = new ByteVector(); for(int i = 0; i < 2; i++) { int offset = mostSignificantByteFirst ? 1-i : i; vector.Add ((byte)(value >> (offset * 8) & 0xFF)); } return vector; } /// /// Converts an unsigned value into a big-endian data /// representation. /// /// /// A value to convert into bytes. /// /// /// A object containing the encoded /// representation of . /// public static ByteVector FromUShort(ushort value) { return FromUShort (value, true); } /// /// Converts an unsigned value into a data representation. /// /// /// A value to convert into bytes. /// /// /// if the most significant byte is /// to appear first (big endian format), or if the least significant byte is to /// appear first (little endian format). /// /// /// A object containing the encoded /// representation of . /// public static ByteVector FromULong (ulong value, bool mostSignificantByteFirst) { ByteVector vector = new ByteVector(); for(int i = 0; i < 8; i++) { int offset = mostSignificantByteFirst ? 7-i : i; vector.Add ((byte)(value >> (offset * 8) & 0xFF)); } return vector; } /// /// Converts an unsigned value into a big-endian data /// representation. /// /// /// A value to convert into bytes. /// /// /// A object containing the encoded /// representation of . /// public static ByteVector FromULong(ulong value) { return FromULong(value, true); } /// /// Converts an string into a encoded data representation. /// /// /// A object containing the text to /// convert. /// /// /// A value specifying the encoding /// to use when converting the text. /// /// /// A value specifying the number of /// characters in to encoded. /// /// /// A object containing the encoded /// representation of . /// public static ByteVector FromString (string text, StringType type, int length) { ByteVector data = new ByteVector (); if (type == StringType.UTF16) data.Add (new byte [] {0xff, 0xfe}); if (text == null || text.Length == 0) return data; if (text.Length > length) text = text.Substring (0, length); data.Add (StringTypeToEncoding (type, data) .GetBytes (text)); return data; } /// /// Converts an string into a encoded data representation. /// /// /// A object containing the text to /// convert. /// /// /// A value specifying the encoding /// to use when converting the text. /// /// /// A object containing the encoded /// representation of . /// public static ByteVector FromString(string text, StringType type) { return FromString(text, type, Int32.MaxValue); } /// /// Converts an string into a encoded data representation. /// /// /// A object containing the text to /// convert. /// /// /// A value specifying the number of /// characters in to encoded. /// /// /// A object containing the encoded /// representation of . /// public static ByteVector FromString(string text, int length) { return FromString(text, StringType.UTF8, length); } /// /// Converts an string into a encoded data representation. /// /// /// A object containing the text to /// convert. /// /// /// A object containing the encoded /// representation of . /// [Obsolete("Use FromString(string,StringType)")] public static ByteVector FromString(string text) { return FromString (text, StringType.UTF8); } /// /// Creates a new instance of by /// reading in the contents of a specified file. /// /// /// A object containing the path of the /// file to read. /// /// /// A object containing the contents /// of the specified file. /// /// /// is . /// public static ByteVector FromPath (string path) { byte [] tmp_out; return FromPath (path, out tmp_out, false); } /// /// Creates a new instance of by /// reading in the contents of a specified file. /// /// /// A object containing the path of the /// file to read. /// /// /// A reference to be filled with the /// first data chunk from the read file. /// /// /// A value specifying whether or not to /// copy the first chunk of the file into . /// /// /// A object containing the contents /// of the specified file. /// /// /// is . /// internal static ByteVector FromPath (string path, out byte [] firstChunk, bool copyFirstChunk) { if (path == null) throw new ArgumentNullException ("path"); return FromFile (new File.LocalFileAbstraction (path), out firstChunk, copyFirstChunk); } /// /// Creates a new instance of by /// reading in the contents of a specified file abstraction. /// /// /// A object containing /// abstraction of the file to read. /// /// /// A object containing the contents /// of the specified file. /// /// /// is . /// public static ByteVector FromFile (File.IFileAbstraction abstraction) { byte [] tmp_out; return FromFile (abstraction, out tmp_out, false); } /// /// Creates a new instance of by /// reading in the contents of a specified file abstraction. /// /// /// A object containing /// abstraction of the file to read. /// /// /// A reference to be filled with the /// first data chunk from the read file. /// /// /// A value specifying whether or not to /// copy the first chunk of the file into . /// /// /// A object containing the contents /// of the specified file. /// /// /// is . /// internal static ByteVector FromFile (File.IFileAbstraction abstraction, out byte [] firstChunk, bool copyFirstChunk) { if (abstraction == null) throw new ArgumentNullException ("abstraction"); System.IO.Stream stream = abstraction.ReadStream; ByteVector output = FromStream (stream, out firstChunk, copyFirstChunk); abstraction.CloseStream (stream); return output; } /// /// Creates a new instance of by /// reading in the contents of a specified stream. /// /// /// A object containing /// the stream to read. /// /// /// A object containing the contents /// of the specified stream. /// /// /// is . /// public static ByteVector FromStream (System.IO.Stream stream) { byte [] tmp_out; return FromStream (stream, out tmp_out, false); } /// /// Creates a new instance of by /// reading in the contents of a specified stream. /// /// /// A object containing /// the stream to read. /// /// /// A reference to be filled with the /// first data chunk from the read stream. /// /// /// A value specifying whether or not to /// copy the first chunk of the stream into . /// /// /// A object containing the contents /// of the specified stream. /// /// /// is . /// internal static ByteVector FromStream (System.IO.Stream stream, out byte [] firstChunk, bool copyFirstChunk) { ByteVector vector = new ByteVector(); byte [] bytes = new byte[4096]; int read_size = bytes.Length; int bytes_read = 0; bool set_first_chunk = false; firstChunk = null; while (true) { Array.Clear(bytes, 0, bytes.Length); int n = stream.Read(bytes, 0, read_size); vector.Add(bytes); bytes_read += n; if (!set_first_chunk) { if (copyFirstChunk) { if(firstChunk == null || firstChunk.Length != read_size) { firstChunk = new byte [read_size]; } Array.Copy (bytes, 0, firstChunk, 0, n); } set_first_chunk = true; } if ((bytes_read == stream.Length && stream.Length > 0) || (n < read_size && stream.Length <= 0)) { break; } } if (stream.Length > 0 && vector.Count != stream.Length) { vector.Resize ((int)stream.Length); } return vector; } #endregion #region Utilities /// /// Gets the text delimiter for nil separated string lists of /// a specified encoding. /// /// /// A value specifying the encoding /// to use. /// /// /// A object containing the text /// delimiter. /// public static ByteVector TextDelimiter (StringType type) { return type == StringType.UTF16 || type == StringType.UTF16BE || type == StringType.UTF16LE ? td2 : td1; } /// /// Gets the to use for a specified /// encoding. /// /// /// A value specifying encoding to /// use. /// /// /// A object containing the first /// two bytes of the data to convert if equals . /// /// /// A object capable of encoding /// and decoding text with the specified type. /// /// /// is used to determine whether the /// encoding is big or little endian. If it does not contain /// BOM data, the previously used endian format is used. /// private static Encoding StringTypeToEncoding (StringType type, ByteVector bom) { switch(type) { case StringType.UTF16: // If we have a BOM, return the appropriate // encoding. Otherwise, assume we're reading // from a string that was already identified. In // that case, the encoding will be stored as // last_utf16_encoding. if (bom == null) return last_utf16_encoding; if (bom [0] == 0xFF && bom [1] == 0xFE) return last_utf16_encoding = Encoding.Unicode; if (bom [1] == 0xFF && bom [0] == 0xFE) return last_utf16_encoding = Encoding.BigEndianUnicode; return last_utf16_encoding; case StringType.UTF16BE: return Encoding.BigEndianUnicode; case StringType.UTF8: return Encoding.UTF8; case StringType.UTF16LE: return Encoding.Unicode; } if (use_broken_latin1) return Encoding.Default; try { return Encoding.GetEncoding ("latin1"); } catch (ArgumentException) { return Encoding.UTF8; } } #endregion #region System.Object /// /// Determines whether another object is equal to the current /// instance. /// /// /// A to compare to the current /// instance. /// /// /// if is not /// , is of type , and is equal to the current /// instance; otherwise . /// public override bool Equals (object other) { if (!(other is ByteVector)) return false; return Equals ((ByteVector) other); } /// /// Determines whether another /// object is equal to the current instance. /// /// /// A object to compare to the /// current instance. /// /// /// if is not /// and equal to the current instance; /// otherwise . /// public bool Equals (ByteVector other) { return CompareTo (other) == 0; } /// /// Gets the hash value for the current instance. /// /// /// A value equal to the CRC checksum of /// the current instance. /// public override int GetHashCode () { unchecked {return (int) Checksum;} } #endregion #region IComparable /// /// Compares the current instance to another to determine if /// their order. /// /// /// A object to compare to the /// current instance. /// /// /// A which is less than zero if the /// current instance is less than , /// zero if it is equal to , and /// greater than zero if the current instance is greater than /// . /// public int CompareTo (ByteVector other) { if ((object) other == null) throw new ArgumentNullException ("other"); int diff = Count - other.Count; for(int i = 0; diff == 0 && i < Count; i ++) diff = this [i] - other [i]; return diff; } #endregion #region IEnumerable /// /// Gets an enumerator for enumerating through the the bytes /// in the current instance. /// /// /// A for /// enumerating through the contents of the current instance. /// public IEnumerator GetEnumerator() { return this.data.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return this.data.GetEnumerator(); } #endregion #region ICollection /// /// Clears the current instance. /// /// /// The current instance is read-only. /// public void Clear() { if (IsReadOnly) throw new NotSupportedException ("Cannot edit readonly objects."); this.data.Clear(); } /// /// Adds a single byte to the end of the current instance. /// /// /// A to add to the current instance. /// /// /// The current instance is read-only. /// public void Add (byte item) { if (IsReadOnly) throw new NotSupportedException ( "Cannot edit readonly objects."); this.data.Add(item); } /// /// Removes the first occurance of a from /// the current instance. /// /// /// A to remove from the current instance. /// /// /// if the value was removed; /// otherwise the value did not appear in the current /// instance and is returned. /// /// /// The current instance is read-only. /// public bool Remove (byte item) { if (IsReadOnly) throw new NotSupportedException ( "Cannot edit readonly objects."); return this.data.Remove(item); } /// /// Copies the current instance to a /// starting at a specified index. /// /// /// A to copy to. /// /// /// A value indicating the index in /// at which to start copying. /// public void CopyTo (byte [] array, int arrayIndex) { this.data.CopyTo (array, arrayIndex); } /// /// Gets whether or not the current instance contains a /// specified byte. /// /// /// A value to look for in the current /// instance. /// /// /// if the value could be found; /// otherwise . /// public bool Contains (byte item) { return this.data.Contains (item); } /// /// Gets the number of elements in the current instance. /// /// /// A value containing the number of bytes /// in the current instance. /// public int Count { get {return this.data.Count;} } /// /// Gets whether or not the current instance is synchronized. /// /// /// Always . /// public bool IsSynchronized { get {return false;} } /// /// Gets the object that can be used to synchronize the /// current instance. /// /// /// A that can be used to synchronize /// the current instance. /// public object SyncRoot { get {return this;} } #endregion #region IList /// /// Removes the byte at the specified index. /// /// /// A value specifying the position at /// which to remove a byte. /// /// /// The current instance is read-only. /// public void RemoveAt (int index) { if (IsReadOnly) throw new NotSupportedException ( "Cannot edit readonly objects."); this.data.RemoveAt(index); } /// /// Inserts a single byte into the current instance at a // specified index. /// /// /// A value specifying the position at /// which to insert the value. /// /// /// A value to insert into the current /// instance. /// /// /// The current instance is read-only. /// public void Insert (int index, byte item) { if (IsReadOnly) throw new NotSupportedException ( "Cannot edit readonly objects."); this.data.Insert(index, item); } /// /// Gets the index of the first occurance of a value. /// /// /// A to find in the current instance. /// /// /// A value containing the first index /// at which the value was found, or -1 if it was not found. /// public int IndexOf (byte item) { return this.data.IndexOf (item); } /// /// Gets whether or not the current instance is read-only. /// /// /// if the current instance is /// read-only; otherwise . /// public virtual bool IsReadOnly { get {return false;} } /// /// Gets whether or not the current instance has a fixed /// size. /// /// /// if the current instance has a /// fixed size; otherwise . /// public virtual bool IsFixedSize { get {return false;} } /// /// Gets and sets the value as a specified index. /// /// /// The current instance is read-only. /// public byte this[int index] { get {return this.data[index]; } set { if (IsReadOnly) throw new NotSupportedException ( "Cannot edit readonly objects."); data[index] = value; } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/WavPack/0000777000175000017500000000000011503407423021603 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/WavPack/File.cs0000644000175000017500000002147411462100402023004 0ustar00rubenruben00000000000000// // File.cs: Provides tagging and properties support for WavPack files. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // wvfile.cpp from libtunepimp // // Copyright (C) 2006-2007 Brian Nickel // Copyright (C) 2006 by Lukáš Lalinský (Original Implementation) // Copyright (C) 2004 by Allan Sandfeld Jensen (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.WavPack { /// /// This class extends to /// provide tagging and properties support for WavPack files. /// /// /// A will be added automatically to /// any file that doesn't contain one. This change does not effect /// the file and can be reversed using the following method: /// file.RemoveTags (file.TagTypes & ~file.TagTypesOnDisk); /// [SupportedMimeType("taglib/wv", "wv")] [SupportedMimeType("audio/x-wavpack")] public class File : TagLib.NonContainer.File { #region Private Fields /// /// Contains the block with the audio header. /// private ByteVector header_block = null; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : base (path, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system with an average read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : base (path) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified file abstraction with an /// average read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// public File (File.IFileAbstraction abstraction) : base (abstraction) { } #endregion #region Public Methods /// /// Gets a tag of a specified type from the current instance, /// optionally creating a new tag if possible. /// /// /// A value indicating the /// type of tag to read. /// /// /// A value specifying whether or not to /// try and create the tag if one is not found. /// /// /// A object containing the tag that was /// found in or added to the current instance. If no /// matching tag was found and none was created, is returned. /// /// /// If a is added to the /// current instance, it will be placed at the start of the /// file. On the other hand, /// will be added to the end of /// the file. All other tag types will be ignored. /// public override TagLib.Tag GetTag (TagTypes type, bool create) { Tag t = (Tag as TagLib.NonContainer.Tag).GetTag (type); if (t != null || !create) return t; switch (type) { case TagTypes.Id3v1: return EndTag.AddTag (type, Tag); case TagTypes.Id3v2: return StartTag.AddTag (type, Tag); case TagTypes.Ape: return EndTag.AddTag (type, Tag); default: return null; } } #endregion #region Protected Methods /// /// Reads format specific information at the start of the /// file. /// /// /// A value containing the seek position /// at which the tags end and the media data begins. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// protected override void ReadStart (long start, ReadStyle propertiesStyle) { if (header_block != null && propertiesStyle == ReadStyle.None) return; Seek (start); header_block = ReadBlock ( (int) StreamHeader.Size); } /// /// Reads format specific information at the end of the /// file. /// /// /// A value containing the seek position /// at which the media data ends and the tags begin. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// protected override void ReadEnd (long end, ReadStyle propertiesStyle) { // Make sure we have an APE tag. GetTag (TagTypes.Ape, true); } /// /// Reads the audio properties from the file represented by /// the current instance. /// /// /// A value containing the seek position /// at which the tags end and the media data begins. /// /// /// A value containing the seek position /// at which the media data ends and the tags begin. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// A object describing the /// media properties of the file represented by the current /// instance. /// protected override Properties ReadProperties (long start, long end, ReadStyle propertiesStyle) { StreamHeader header = new StreamHeader (header_block, end - start); return new Properties (TimeSpan.Zero, header); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/WavPack/StreamHeader.cs0000644000175000017500000002414111462100402024463 0ustar00rubenruben00000000000000// // StreamHeader.cs: Provides support for reading WavPack audio properties. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // wvproperties.cpp from libtunepimp // // Copyright (C) 2006-2007 Brian Nickel // Copyright (C) 2006 by Lukáš Lalinský (Original Implementation) // Copyright (C) 2004 by Allan Sandfeld Jensen (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.WavPack { /// /// This struct implements to provide /// support for reading WavPack audio properties. /// public struct StreamHeader : IAudioCodec, ILosslessAudioCodec, IEquatable { #region Constants private static readonly uint [] sample_rates = new uint [] { 6000, 8000, 9600, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000, 192000}; private const int BYTES_STORED = 3; private const int MONO_FLAG = 4; private const int SHIFT_LSB = 13; private const long SHIFT_MASK = (0x1fL << SHIFT_LSB); private const int SRATE_LSB = 23; private const long SRATE_MASK = (0xfL << SRATE_LSB); #endregion #region Private Fields /// /// Contains the number of bytes in the stream. /// private long stream_length; /// /// Contains the WavPack version. /// private ushort version; /// /// Contains the flags. /// private uint flags; /// /// Contains the sample count. /// private uint samples; #endregion #region Public Static Fields /// /// The size of a WavPack header. /// public const uint Size = 32; /// /// The identifier used to recognize a WavPack file. /// /// /// "wvpk" /// public static readonly ReadOnlyByteVector FileIdentifier = "wvpk"; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified header block and /// stream length. /// /// /// A object containing the stream /// header data. /// /// /// A value containing the length of the /// WavPack stream in bytes. /// /// /// is . /// /// /// does not begin with or is less than bytes long. /// public StreamHeader (ByteVector data, long streamLength) { if (data == null) throw new ArgumentNullException ("data"); if (!data.StartsWith (FileIdentifier)) throw new CorruptFileException ( "Data does not begin with identifier."); if (data.Count < Size) throw new CorruptFileException ( "Insufficient data in stream header"); stream_length = streamLength; version = data.Mid (8, 2).ToUShort (false); flags = data.Mid (24, 4).ToUInt (false); samples = data.Mid (12, 4).ToUInt (false); } #endregion #region Public Properties /// /// Gets the duration of the media represented by the current /// instance. /// /// /// A containing the duration of the /// media represented by the current instance. /// public TimeSpan Duration { get { return AudioSampleRate > 0 ? TimeSpan.FromSeconds ((double) samples / (double) AudioSampleRate + 0.5) : TimeSpan.Zero; } } /// /// Gets the types of media represented by the current /// instance. /// /// /// Always . /// public MediaTypes MediaTypes { get {return MediaTypes.Audio;} } /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public string Description { get {return string.Format ( System.Globalization.CultureInfo.InvariantCulture, "WavPack Version {0} Audio", Version);} } /// /// Gets the bitrate of the audio represented by the current /// instance. /// /// /// A value containing a bitrate of the /// audio represented by the current instance. /// public int AudioBitrate { get { return (int) (Duration > TimeSpan.Zero ? ((stream_length * 8L) / Duration.TotalSeconds) / 1000 : 0); } } /// /// Gets the sample rate of the audio represented by the /// current instance. /// /// /// A value containing the sample rate of /// the audio represented by the current instance. /// public int AudioSampleRate { get { return (int) (sample_rates [ (flags & SRATE_MASK) >> SRATE_LSB]); } } /// /// Gets the number of channels in the audio represented by /// the current instance. /// /// /// A value containing the number of /// channels in the audio represented by the current /// instance. /// public int AudioChannels { get {return ((flags & MONO_FLAG) != 0) ? 1 : 2;} } /// /// Gets the WavPack version of the audio represented by the /// current instance. /// /// /// A value containing the WavPack version /// of the audio represented by the current instance. /// public int Version { get {return version;} } /// /// Gets the number of bits per sample in the audio /// represented by the current instance. /// /// /// A value containing the number of bits /// per sample in the audio represented by the current /// instance. /// public int BitsPerSample { get { return (int) (((flags & BYTES_STORED) + 1) * 8 - ((flags & SHIFT_MASK) >> SHIFT_LSB)); } } #endregion #region IEquatable /// /// Generates a hash code for the current instance. /// /// /// A value containing the hash code for /// the current instance. /// public override int GetHashCode () { unchecked { return (int) (flags ^ samples ^ version); } } /// /// Checks whether or not the current instance is equal to /// another object. /// /// /// A to compare to the current /// instance. /// /// /// A value indicating whether or not the /// current instance is equal to . /// /// public override bool Equals (object other) { if (!(other is StreamHeader)) return false; return Equals ((StreamHeader) other); } /// /// Checks whether or not the current instance is equal to /// another instance of . /// /// /// A object to compare to the /// current instance. /// /// /// A value indicating whether or not the /// current instance is equal to . /// /// public bool Equals (StreamHeader other) { return flags == other.flags && samples == other.samples && version == other.version; } /// /// Gets whether or not two instances of are equal to eachother. /// /// /// The first object to compare. /// /// /// The second object to compare. /// /// /// if is /// equal to . Otherwise, . /// public static bool operator == (StreamHeader first, StreamHeader second) { return first.Equals (second); } /// /// Gets whether or not two instances of are unequal to eachother. /// /// /// The first object to compare. /// /// /// The second object to compare. /// /// /// if is /// unequal to . Otherwise, . /// public static bool operator != (StreamHeader first, StreamHeader second) { return !first.Equals (second); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Image/0000777000175000017500000000000011503407417021274 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Image/NoMetadata/0000777000175000017500000000000011503407417023311 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Image/NoMetadata/File.cs0000644000175000017500000001417111503404514024512 0ustar00rubenruben00000000000000// // File.cs: Provides an empty wrapper for files that don't support metadata. // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Image.NoMetadata { /// /// This class extends to provide tagging /// some sort of support for files that don't support metadata. You /// obviously can't write to them, but you can populate an XMP tag, for /// sidecar purposes. /// [SupportedMimeType("taglib/bmp", "bmp")] [SupportedMimeType("image/x-MS-bmp")] [SupportedMimeType("image/x-bmp")] [SupportedMimeType("taglib/ppm", "ppm")] [SupportedMimeType("taglib/pgm", "pgm")] [SupportedMimeType("taglib/pbm", "pbm")] [SupportedMimeType("taglib/pnm", "pnm")] [SupportedMimeType("image/x-portable-pixmap")] [SupportedMimeType("image/x-portable-graymap")] [SupportedMimeType("image/x-portable-bitmap")] [SupportedMimeType("image/x-portable-anymap")] [SupportedMimeType("taglib/pcx", "pcx")] [SupportedMimeType("image/x-pcx")] [SupportedMimeType("taglib/svg", "svg")] [SupportedMimeType("taglib/svgz", "svgz")] [SupportedMimeType("image/svg+xml")] [SupportedMimeType("taglib/kdc", "kdc")] // FIXME: Not supported yet! [SupportedMimeType("taglib/orf", "orf")] // FIXME: Not supported yet! [SupportedMimeType("taglib/srf", "srf")] // FIXME: Not supported yet! [SupportedMimeType("taglib/crw", "crw")] // FIXME: Not supported yet! [SupportedMimeType("taglib/mrw", "mrw")] // FIXME: Not supported yet! [SupportedMimeType("taglib/raf", "raf")] // FIXME: Not supported yet! [SupportedMimeType("taglib/x3f", "x3f")] // FIXME: Not supported yet! public class File : TagLib.Image.File { #region public Properties /// /// Gets the media properties of the file represented by the /// current instance. /// /// /// A object containing the /// media properties of the file represented by the current /// instance. /// public override TagLib.Properties Properties { get { return null; } } /// /// Indicates if tags can be written back to the current file or not /// /// /// A which is true if tags can be written to the /// current file, otherwise false. /// public override bool Writeable { get { return false; } } #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : this (new File.LocalFileAbstraction (path), propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : this (path, ReadStyle.Average) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction) { ImageTag = new CombinedImageTag (TagTypes.XMP); } /// /// Constructs and initializes a new instance of for a specified file abstraction. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// protected File (IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) { } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { throw new NotSupportedException (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Image/ImageOrientation.cs0000644000175000017500000000443011470571657025071 0ustar00rubenruben00000000000000// // ImageOrientation.cs: Enum for the orientation of an image // // Author: // Paul Lange (palango@gmx.de) // // Copyright (C) 2009 Paul Lange // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA using System; namespace TagLib.Image { /** 1 2 3 4 5 6 7 8 888888 888888 88 88 8888888888 88 88 8888888888 88 88 88 88 88 88 88 88 88 88 88 88 8888 8888 8888 8888 88 8888888888 8888888888 88 88 88 88 88 88 88 888888 888888 t-l t-r b-r b-l l-t r-t r-b l-b **/ /// /// Describes the orientation of an image. /// Values are viewed in terms of rows and columns. /// public enum ImageOrientation : uint { /// /// No value is known. /// None = 0, /// /// No need to do any transformations. /// TopLeft = 1, /// /// Mirror image vertically. /// TopRight = 2, /// /// Rotate image 180 degrees. /// BottomRight = 3, /// /// Mirror image horizontally /// BottomLeft = 4, /// /// Mirror image horizontally and rotate 90 degrees clockwise. /// LeftTop = 5, /// /// Rotate image 90 degrees clockwise. /// RightTop = 6, /// /// Mirror image vertically and rotate 90 degrees clockwise. /// RightBottom = 7, /// /// Rotate image 270 degrees clockwise. /// LeftBottom = 8 } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Image/Codec.cs0000644000175000017500000001005711470571657022652 0ustar00rubenruben00000000000000// // Codec.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Image { /// /// A photo codec. Contains basic photo details. /// public abstract class Codec : IPhotoCodec { #region Properties /// /// Gets the duration of the media represented by the current /// instance. /// /// /// A containing the duration of the /// media represented by the current instance. /// public TimeSpan Duration { get { return TimeSpan.Zero; } } /// /// Gets the types of media represented by the current /// instance. /// /// /// A bitwise combined containing /// the types of media represented by the current instance. /// public MediaTypes MediaTypes { get { return MediaTypes.Photo; } } /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public abstract string Description { get; } /// /// Gets the width of the photo represented by the current /// instance. /// /// /// A value containing the width of the /// photo represented by the current instance. /// public int PhotoWidth { get; protected set; } /// /// Gets the height of the photo represented by the current /// instance. /// /// /// A value containing the height of the /// photo represented by the current instance. /// public int PhotoHeight { get; protected set; } /// /// Gets the (format specific) quality indicator of the photo /// represented by the current instance. /// /// /// A value indicating the quality. A value /// 0 means that there was no quality indicator for the format /// or the file. /// public int PhotoQuality { get; protected set; } #endregion #region Constructors /// /// Constructs a new with the given width /// and height. /// /// /// The width of the photo. /// /// /// The height of the photo. /// /// /// A new instance. /// public Codec (int width, int height) : this (width, height, 0) { } /// /// Constructs a new with the given width /// and height. /// /// /// The width of the photo. /// /// /// The height of the photo. /// /// /// The quality indicator for the photo, if the format supports it. /// /// /// A new instance. /// public Codec (int width, int height, int quality) { PhotoWidth = width; PhotoHeight = height; PhotoQuality = quality; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Image/File.cs0000644000175000017500000001444111470571657022515 0ustar00rubenruben00000000000000// // File.cs: Base class for Image types. // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2009 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using TagLib.Jpeg; using TagLib.Gif; using TagLib.IFD; using TagLib.Xmp; using TagLib.Png; namespace TagLib.Image { /// /// This class extends to provide basic /// functionality common to all image types. /// public abstract class File : TagLib.File { private CombinedImageTag image_tag; #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// protected File (string path) : base (path) { } /// /// Constructs and initializes a new instance of for a specified file abstraction. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// protected File (IFileAbstraction abstraction) : base (abstraction) { } #endregion #region Public Properties /// /// Gets a abstract representation of all tags stored in the /// current instance. /// /// /// A object representing all tags /// stored in the current instance. /// public override Tag Tag { get { return ImageTag; } } /// /// Gets a abstract representation of all tags stored in the /// current instance. /// /// /// A object /// representing all image tags stored in the current instance. /// public CombinedImageTag ImageTag { get { return image_tag; } protected set { image_tag = value; } } #endregion #region Public Methods /// /// The method creates all tags which are allowed for the current /// instance of the image file. This method can be used to ensure, /// that all tags are in place and properties can be safely used /// to set values. /// public void EnsureAvailableTags () { foreach (TagTypes type in Enum.GetValues (typeof (TagTypes))) { if ((type & ImageTag.AllowedTypes) != 0x00 && type != TagTypes.AllTags) GetTag (type, true); } } /// /// Removes a set of tag types from the current instance. /// /// /// A bitwise combined value /// containing tag types to be removed from the file. /// /// /// In order to remove all tags from a file, pass as . /// public override void RemoveTags (TagLib.TagTypes types) { List to_delete = new List (); foreach (ImageTag tag in ImageTag.AllTags) { if ((tag.TagTypes & types) == tag.TagTypes) to_delete.Add (tag); } foreach (ImageTag tag in to_delete) ImageTag.RemoveTag (tag); } /// /// Gets a tag of a specified type from the current instance, /// optionally creating a new tag if possible. /// /// /// A value indicating the /// type of tag to read. /// /// /// A value specifying whether or not to /// try and create the tag if one is not found. /// /// /// A object containing the tag that was /// found in or added to the current instance. If no /// matching tag was found and none was created, is returned. /// public override TagLib.Tag GetTag (TagLib.TagTypes type, bool create) { foreach (Tag tag in ImageTag.AllTags) { if ((tag.TagTypes & type) == type) return tag; } if (!create || (type & ImageTag.AllowedTypes) == 0) return null; ImageTag new_tag = null; switch (type) { case TagTypes.JpegComment: new_tag = new JpegCommentTag (); break; case TagTypes.GifComment: new_tag = new GifCommentTag (); break; case TagTypes.Png: new_tag = new PngTag (); break; case TagTypes.TiffIFD: new_tag = new IFDTag (); break; case TagTypes.XMP: new_tag = new XmpTag (); break; } if (new_tag != null) { ImageTag.AddTag (new_tag); return new_tag; } throw new NotImplementedException (String.Format ("Adding tag of type {0} not supported!", type)); } /// /// Copies metadata from the given file.. /// /// /// File to copy metadata from. /// public void CopyFrom (TagLib.Image.File file) { EnsureAvailableTags (); var from_tag = file.ImageTag; var to_tag = ImageTag; foreach (var prop in typeof (TagLib.Image.ImageTag).GetProperties ()) { if (!prop.CanWrite || prop.Name == "TagTypes") continue; var value = prop.GetValue (from_tag, null); prop.SetValue (to_tag, value, null); } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Image/ImageTag.cs0000644000175000017500000001450311470571657023313 0ustar00rubenruben00000000000000// // ImageTag.cs: This abstract class extends the Tag class by basic Image // properties. // // Author: // Mike Gemuende (mike@gemuende.de) // Paul Lange (palango@gmx.de) // // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Image { /// /// A class to abstract the image tags. It extends the /// class and adds some image specific propties. /// public abstract class ImageTag : Tag { #region Public Properties /// /// Gets or sets the keywords for the image described /// by the current instance. /// /// /// A containing the keywords of the /// current instace. /// public virtual string[] Keywords { get { return new string [] {}; } set {} } /// /// Gets or sets the rating for the image described /// by the current instance. /// /// /// A containing the rating of the /// current instace. /// public virtual uint? Rating { get { return null; } set {} } /// /// Gets or sets the time when the image, the current instance /// belongs to, was taken. /// /// /// A with the time the image was taken. /// public virtual DateTime? DateTime { get { return null; } set {} } /// /// Gets or sets the orientation of the image described /// by the current instance. /// /// /// A containing the orientation of the /// image /// public virtual ImageOrientation Orientation { get { return ImageOrientation.None; } set {} } /// /// Gets or sets the software the image, the current instance /// belongs to, was created with. /// /// /// A containing the name of the /// software the current instace was created with. /// public virtual string Software { get { return null; } set {} } /// /// Gets or sets the latitude of the GPS coordinate the current /// image was taken. /// /// /// A with the latitude ranging from -90.0 /// to +90.0 degrees. /// public virtual double? Latitude { get { return null; } set {} } /// /// Gets or sets the longitude of the GPS coordinate the current /// image was taken. /// /// /// A with the longitude ranging from -180.0 /// to +180.0 degrees. /// public virtual double? Longitude { get { return null; } set {} } /// /// Gets or sets the altitude of the GPS coordinate the current /// image was taken. The unit is meter. /// /// /// A with the altitude. A positive value /// is above sea level, a negative one below sea level. The unit is meter. /// public virtual double? Altitude { get { return null; } set {} } /// /// Gets the exposure time the image, the current instance belongs /// to, was taken with. /// /// /// A with the exposure time in seconds. /// public virtual double? ExposureTime { get { return null; } set {} } /// /// Gets the FNumber the image, the current instance belongs /// to, was taken with. /// /// /// A with the FNumber. /// public virtual double? FNumber { get { return null; } set {} } /// /// Gets the ISO speed the image, the current instance belongs /// to, was taken with. /// /// /// A with the ISO speed as defined in ISO 12232. /// public virtual uint? ISOSpeedRatings { get { return null; } set {} } /// /// Gets the focal length the image, the current instance belongs /// to, was taken with. /// /// /// A with the focal length in millimeters. /// public virtual double? FocalLength { get { return null; } set {} } /// /// Gets the focal length the image, the current instance belongs /// to, was taken with, assuming a 35mm film camera. /// /// /// A with the focal length in 35mm equivalent in millimeters. /// public virtual uint? FocalLengthIn35mmFilm { get { return null; } set {} } /// /// Gets the manufacture of the recording equipment the image, the /// current instance belongs to, was taken with. /// /// /// A with the manufacture name. /// public virtual string Make { get { return null; } set {} } /// /// Gets the model name of the recording equipment the image, the /// current instance belongs to, was taken with. /// /// /// A with the model name. /// public virtual string Model { get { return null; } set {} } /// /// Gets or sets the creator of the image. /// /// /// A with the name of the creator. /// public virtual string Creator { get { return null; } set {} } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Image/CombinedImageTag.cs0000644000175000017500000003465211470571657024763 0ustar00rubenruben00000000000000// // CombinedImageTag.cs: The class provides an abstraction to combine // ImageTags. // // Author: // Mike Gemuende (mike@gemuende.de) // Paul Lange (palango@gmx.de) // // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using TagLib.IFD; using TagLib.Xmp; namespace TagLib.Image { /// /// Combines some instance to behave as one. /// public class CombinedImageTag : ImageTag { #region Private Fields /// /// Direct access to the Exif (IFD) tag (if any) /// public IFDTag Exif { get; private set; } /// /// Direct access to the Xmp tag (if any) /// public XmpTag Xmp { get; private set; } /// /// Other image tags available in this tag. /// public List OtherTags { get; private set; } /// /// Stores the types of the tags, which are allowed for /// the current instance. /// internal TagTypes AllowedTypes { get; private set; } /// /// Returns all image tags in this tag, with XMP /// and Exif first. /// public List AllTags { get { if (all_tags == null) { all_tags = new List (); if (Xmp != null) all_tags.Add (Xmp); if (Exif != null) all_tags.Add (Exif); all_tags.AddRange (OtherTags); } return all_tags; } } private List all_tags = null; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a restriction on the /// allowed tag types contained in this combined tag. /// /// /// A value, which restricts the /// types of metadata that can be contained in this /// combined tag. /// public CombinedImageTag (TagTypes allowed_types) { AllowedTypes = allowed_types; OtherTags = new List (); } #endregion #region Protected Methods internal void AddTag (ImageTag tag) { if ((tag.TagTypes & AllowedTypes) != tag.TagTypes) throw new Exception (String.Format ("Attempted to add {0} to an image, but the only allowed types are {1}", tag.TagTypes, AllowedTypes)); if (tag is IFDTag) Exif = tag as IFDTag; else if (tag is XmpTag) Xmp = tag as XmpTag; else OtherTags.Add (tag); all_tags = null; } internal void RemoveTag (ImageTag tag) { if (tag is IFDTag) Exif = null; else if (tag is XmpTag) Xmp = null; else OtherTags.Remove (tag); all_tags = null; } #endregion #region Public Methods (Tag) /// /// Gets the tag types contained in the current instance. /// /// /// A bitwise combined /// containing the tag types contained in the current /// instance. /// public override TagTypes TagTypes { get { TagTypes types = TagTypes.None; foreach (ImageTag tag in AllTags) types |= tag.TagTypes; return types; } } /// /// Clears all of the child tags. /// public override void Clear () { foreach (ImageTag tag in AllTags) tag.Clear (); } #endregion #region Public Properties (ImageTag) /// /// Gets or sets the keywords for the image described /// by the current instance. /// /// /// A containing the keywords of the /// current instace. /// public override string[] Keywords { get { foreach (ImageTag tag in AllTags) { string[] value = tag.Keywords; if (value != null && value.Length > 0) return value; } return new string[] {}; } set { foreach (ImageTag tag in AllTags) tag.Keywords = value; } } /// /// Gets or sets the rating for the image described /// by the current instance. /// /// /// A containing the rating of the /// current instace. /// public override uint? Rating { get { foreach (ImageTag tag in AllTags) { uint? value = tag.Rating; if (value != null) return value; } return null; } set { foreach (ImageTag tag in AllTags) tag.Rating = value; } } /// /// Gets or sets the time when the image, the current instance /// belongs to, was taken. /// /// /// A with the time the image was taken. /// public override DateTime? DateTime { get { foreach (ImageTag tag in AllTags) { DateTime? value = tag.DateTime; if (value != null) return value; } return null; } set { foreach (ImageTag tag in AllTags) tag.DateTime = value; } } /// /// Gets or sets the orientation of the image described /// by the current instance. /// /// /// A containing the orienatation of the /// image /// public override ImageOrientation Orientation { get { foreach (ImageTag tag in AllTags) { ImageOrientation value = tag.Orientation; if ((uint) value >= 1U && (uint) value <= 8U) return value; } return ImageOrientation.None; } set { foreach (ImageTag tag in AllTags) tag.Orientation = value; } } /// /// Gets or sets the software the image, the current instance /// belongs to, was created with. /// /// /// A containing the name of the /// software the current instace was created with. /// public override string Software { get { foreach (ImageTag tag in AllTags) { string value = tag.Software; if (!string.IsNullOrEmpty(value)) return value; } return null; } set { foreach (ImageTag tag in AllTags) tag.Software = value; } } /// /// Gets or sets the latitude of the GPS coordinate the current /// image was taken. /// /// /// A with the latitude ranging from -90.0 /// to +90.0 degrees. /// public override double? Latitude { get { foreach (ImageTag tag in AllTags) { double? value = tag.Latitude; if (value != null) return value; } return null; } set { foreach (ImageTag tag in AllTags) tag.Latitude = value; } } /// /// Gets or sets the longitude of the GPS coordinate the current /// image was taken. /// /// /// A with the longitude ranging from -180.0 /// to +180.0 degrees. /// public override double? Longitude { get { foreach (ImageTag tag in AllTags) { double? value = tag.Longitude; if (value != null) return value; } return null; } set { foreach (ImageTag tag in AllTags) tag.Longitude = value; } } /// /// Gets or sets the altitude of the GPS coordinate the current /// image was taken. The unit is meter. /// /// /// A with the altitude. A positive value /// is above sea level, a negative one below sea level. The unit is meter. /// public override double? Altitude { get { foreach (ImageTag tag in AllTags) { double? value = tag.Altitude; if (value != null) return value; } return null; } set { foreach (ImageTag tag in AllTags) tag.Altitude = value; } } /// /// Gets the exposure time the image, the current instance belongs /// to, was taken with. /// /// /// A with the exposure time in seconds. /// public override double? ExposureTime { get { foreach (ImageTag tag in AllTags) { double? value = tag.ExposureTime; if (value != null) return value; } return null; } set { foreach (ImageTag tag in AllTags) tag.ExposureTime = value; } } /// /// Gets the FNumber the image, the current instance belongs /// to, was taken with. /// /// /// A with the FNumber. /// public override double? FNumber { get { foreach (ImageTag tag in AllTags) { double? value = tag.FNumber; if (value != null) return value; } return null; } set { foreach (ImageTag tag in AllTags) tag.FNumber = value; } } /// /// Gets the ISO speed the image, the current instance belongs /// to, was taken with. /// /// /// A with the ISO speed as defined in ISO 12232. /// public override uint? ISOSpeedRatings { get { foreach (ImageTag tag in AllTags) { uint? value = tag.ISOSpeedRatings; if (value != null) return value; } return null; } set { foreach (ImageTag tag in AllTags) tag.ISOSpeedRatings = value; } } /// /// Gets the focal length the image, the current instance belongs /// to, was taken with. /// /// /// A with the focal length in millimeters. /// public override double? FocalLength { get { foreach (ImageTag tag in AllTags) { double? value = tag.FocalLength; if (value != null) return value; } return null; } set { foreach (ImageTag tag in AllTags) tag.FocalLength = value; } } /// /// Gets the focal length the image, the current instance belongs /// to, was taken with, assuming a 35mm film camera. /// /// /// A with the focal length in 35mm equivalent in millimeters. /// public override uint? FocalLengthIn35mmFilm { get { foreach (ImageTag tag in AllTags) { uint? value = tag.FocalLengthIn35mmFilm; if (value != null) return value; } return null; } set { foreach (ImageTag tag in AllTags) tag.FocalLengthIn35mmFilm = value; } } /// /// Gets the manufacture of the recording equipment the image, the /// current instance belongs to, was taken with. /// /// /// A with the manufacture name. /// public override string Make { get { foreach (ImageTag tag in AllTags) { string value = tag.Make; if (!string.IsNullOrEmpty(value)) return value; } return null; } set { foreach (ImageTag tag in AllTags) tag.Make = value; } } /// /// Gets the model name of the recording equipment the image, the /// current instance belongs to, was taken with. /// /// /// A with the model name. /// public override string Model { get { foreach (ImageTag tag in AllTags) { string value = tag.Model; if (!string.IsNullOrEmpty(value)) return value; } return null; } set { foreach (ImageTag tag in AllTags) tag.Model = value; } } /// /// Gets or sets the creator of the image. /// /// /// A with the name of the creator. /// public override string Creator { get { foreach (ImageTag tag in AllTags) { string value = tag.Creator; if (! string.IsNullOrEmpty (value)) return value; } return null; } set { foreach (ImageTag tag in AllTags) tag.Creator = value; } } #endregion #region Public Properties (Tag) /// /// Gets and sets the title for the media described by the /// current instance. /// /// /// A object containing the title for /// the media described by the current instance or if no value is present. /// public override string Title { get { foreach (ImageTag tag in AllTags) { string value = tag.Title; if (! string.IsNullOrEmpty (value)) return value; } return null; } set { foreach (ImageTag tag in AllTags) tag.Title = value; } } /// /// Gets and sets a user comment on the media represented by /// the current instance. /// /// /// A object containing user comments /// on the media represented by the current instance or if no value is present. /// public override string Comment { get { foreach (ImageTag tag in AllTags) { string value = tag.Comment; if (! string.IsNullOrEmpty (value)) return value; } return String.Empty; } set { foreach (ImageTag tag in AllTags) tag.Comment = value; } } /// /// Gets and sets the copyright information for the media /// represented by the current instance. /// /// /// A object containing the copyright /// information for the media represented by the current /// instance or if no value present. /// public override string Copyright { get { foreach (ImageTag tag in AllTags) { string value = tag.Copyright; if (! string.IsNullOrEmpty (value)) return value; } return null; } set { foreach (ImageTag tag in AllTags) tag.Copyright = value; } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Image/ImageBlockFile.cs0000644000175000017500000002236411470571657024436 0ustar00rubenruben00000000000000// // ImageBlockFile.cs: Base class for Images files which are organized // which are organized as blocks. // // Author: // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2010 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Image { /// /// Some image file formats are organized as a sequence of mostly /// independent data blocks whose order can be changed. Metadata is /// stored in some of those blocks and when metadata is saved, often the /// same task remains: Delete some blocks which contain metadata and /// overwrite some blocks with other metadata. /// This class extends to provide this /// functionality. Blocks can be marked as metadata and when metadata is /// saved their space is used or they are deleted. /// public abstract class ImageBlockFile : TagLib.Image.File { /// /// This class represents a metadata block to overwrite. /// private class MetadataBlock { /// /// The start index /// public long Start { get; set; } /// /// The length of the block /// public long Length { get; set; } /// /// Constructor /// /// /// A with the start of the block /// /// /// A with the length of the block /// public MetadataBlock (long start, long length) { if (start < 0) throw new ArgumentOutOfRangeException ("start"); if (length < 0) throw new ArgumentOutOfRangeException ("length"); Start = start; Length = length; } /// /// Constructor. Creates a new instance with an empty block /// public MetadataBlock () : this (0, 0) {} /// /// Checks if the given block overlaps with this instance. /// /// /// A with the block to check /// overlapping. /// /// /// A which is true, if the given /// block overlapps with the current instance. /// /// /// Overlapping means here also that blocks directly follow. /// public bool OverlapsWith (MetadataBlock block) { if (block.Start >= Start && block.Start <= Start + Length) return true; if (Start >= block.Start && Start <= block.Start + block.Length) return true; return false; } /// /// Adds the given block to the current instance, if this is possible. /// /// /// A with the block to add. /// public void Add (MetadataBlock block) { if (block.Start >= Start && block.Start <= Start + Length) { Length = Math.Max (Length, block.Start + block.Length - Start); return; } if (Start >= block.Start && Start <= block.Start + block.Length) { Length = Math.Max (block.Length, Start + Length - block.Start); Start = block.Start; return; } throw new ArgumentException (String.Format ("blocks do not overlap: {0} and {1}", this, block)); } /// /// Checks, if the one block is before the other. That means, /// if the current instance ends before the given block starts. /// /// /// A to compare with. /// /// /// A which is true if the current /// instance is before the given block. /// public bool Before (MetadataBlock block) { return (Start + Length < block.Start); } /// /// Provides a readable for /// the current instance. /// /// /// A representing the current /// instance. /// public override string ToString () { return string.Format("[MetadataBlock: Start={0}, Length={1}]", Start, Length); } } /// /// An odered list of the metadata blocks. The blocks do not overlap. /// private List metadata_blocks = new List (); /// /// Adds a range to be treated as metadata. /// /// /// A with the start index of the metadata block /// /// /// A with the length of the metadata block /// protected void AddMetadataBlock (long start, long length) { MetadataBlock new_block = new MetadataBlock (start, length); // We keep the list sorted and unique. Therefore, we add the new block to // the list and join overlapping blocks if necessary. // iterate through all existing blocks. for (int i = 0; i < metadata_blocks.Count; i++) { var block = metadata_blocks[i]; // if one block overlaps with the new one, join them. if (new_block.OverlapsWith (block)) { block.Add (new_block); // Since we joined two blocks, they may overlap with // other blocks which follows in the list. Therfore, // we iterate through the tail of the list and join // blocks which are now contained. i++; while (i < metadata_blocks.Count) { var next_block = metadata_blocks[i]; if (block.OverlapsWith (next_block)) { block.Add (next_block); metadata_blocks.Remove (next_block); } else { return; } } return; // if the new block is 'smaller' than the one in the list, // just add it to the list. } else if (new_block.Before (block)) { metadata_blocks.Insert (i, new_block); return; } } // if the new block is 'bigger' than all other blocks, at it to the end. metadata_blocks.Add (new_block); } /// /// Saves the given data at the given position. All metadata blocks are /// either deleted or overwritten. /// /// /// A with the metadata to write. /// /// /// A with the index to save the metadata at. /// protected void SaveMetadata (ByteVector data, long start) { long new_start = 0; // this ensures that the block with the start index is contained. AddMetadataBlock (start, 0); // start iterating through the metadata block from the end, // because deleting such blocks do not affect the smaller indices. for (int i = metadata_blocks.Count - 1; i >= 0; i--) { var block = metadata_blocks[i]; // this is the block to save the metadata in if (block.Start <= start && block.Start + block.Length >= start) { // the metadata is saved starting at the beginning of the block, // because the bytes will be removed. Insert (data, block.Start, block.Length); new_start = block.Start; } else { // remove block Insert ("", block.Start, block.Length); // update start of the metadata block, if metadata was written // before, i.e. we have removed a block which is before the saved // metadata if (block.Start < start) new_start -= block.Length; } } // and reset the metadata blocks // (there is now just one block contained) metadata_blocks.Clear (); AddMetadataBlock (new_start, data.Count); } #region Constructors /// /// Constructs and initializes a new instance for a specified /// path in the local file system. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// protected ImageBlockFile (string path) : base (path) { } /// /// Constructs and initializes a new instance for a specified /// file abstraction. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// protected ImageBlockFile (IFileAbstraction abstraction) : base (abstraction) { } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Genres.cs0000644000175000017500000002242711462100402022013 0ustar00rubenruben00000000000000// // Genres.cs: Provides convenience functions for converting between String // genres and their respective audio and video indices as used by several // formats. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // id3v1genres.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2002 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections; using System; namespace TagLib { /// /// This static class provides convenience functions for converting /// between genres and their respective audio /// and video indices as used by several formats. /// public static class Genres { /// /// Contains a list of ID3v1 audio generes. /// private static readonly string [] audio = { "Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", "Other", "Pop", "R&B", "Rap", "Reggae", "Rock", "Techno", "Industrial", "Alternative", "Ska", "Death Metal", "Pranks", "Soundtrack", "Euro-Techno", "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk", "Fusion", "Trance", "Classical", "Instrumental", "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "Alternative Rock", "Bass", "Soul", "Punk", "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", "Ethnic", "Gothic", "Darkwave", "Techno-Industrial", "Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy", "Cult", "Gangsta", "Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native American", "Cabaret", "New Wave", "Psychedelic", "Rave", "Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk", "Acid Jazz", "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk", "Folk/Rock", "National Folk", "Swing", "Fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass", "Avantgarde", "Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", "Big Band", "Chorus", "Easy Listening", "Acoustic", "Humour", "Speech", "Chanson", "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus", "Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba", "Folklore", "Ballad", "Power Ballad", "Rhythmic Soul", "Freestyle", "Duet", "Punk Rock", "Drum Solo", "A Cappella", "Euro-House", "Dance Hall", "Goa", "Drum & Bass", "Club-House", "Hardcore", "Terror", "Indie", "BritPop", "Negerpunk", "Polsk Punk", "Beat", "Christian Gangsta Rap", "Heavy Metal", "Black Metal", "Crossover", "Contemporary Christian", "Christian Rock", "Merengue", "Salsa", "Thrash Metal", "Anime", "Jpop", "Synthpop" }; /// /// Contains a list of DivX audio generes. /// private static readonly string [] video = new string [] { "Action", "Action/Adventure", "Adult", "Adventure", "Catastrophe", "Child's", "Claymation", "Comedy", "Concert", "Documentary", "Drama", "Eastern", "Entertaining", "Erotic", "Extremal Sport", "Fantasy", "Fashion", "Historical", "Horror", "Horror/Mystic", "Humor", "Indian", "Informercial", "Melodrama", "Military & War", "Music Video", "Musical", "Mystery", "Nature", "Political Satire", "Popular Science", "Psychological Thriller", "Religion", "Science Fiction", "Scifi Action", "Slapstick", "Splatter", "Sports", "Thriller", "Western" }; /// /// Gets a list of standard audio generes. /// /// /// A containing standard audio /// genres. /// /// /// The genres are stored in the same order and with the same /// values as in the ID3v1 format. /// public static string [] Audio { get {return (string []) audio.Clone ();} } /// /// Gets a list of standard video generes. /// /// /// A containing standard video /// genres. /// /// /// The genres are stored in the same order and with the same /// values as in the DivX format. /// public static string [] Video { get {return (string []) video.Clone ();} } /// /// Gets the genre index for a specified audio genre. /// /// /// A object containing the name of the /// genre to look up. /// /// /// A value containing the index of the /// genre in the audio array or 255 if it could not be found. /// public static byte AudioToIndex (string name) { for (byte i = 0; i < audio.Length; i ++) if (name == audio [i]) return i; return 255; } /// /// Gets the genre index for a specified video genre. /// /// /// A object containing the name of the /// genre to look up. /// /// /// A value containing the index of the /// genre in the video array or 255 if it could not be found. /// public static byte VideoToIndex (string name) { for (byte i = 0; i < video.Length; i ++) if (name == video [i]) return i; return 255; } /// /// Gets the audio genre from its index in the array. /// /// /// A value containing the index to /// aquire the genre from. /// /// /// A object containing the audio genre /// found at the index, or if it does /// not exist. /// public static string IndexToAudio (byte index) { return (index < audio.Length) ? audio [index] : null; } /// /// Gets the video genre from its index in the array. /// /// /// A value containing the index to /// aquire the genre from. /// /// /// A object containing the video genre /// found at the index, or if it does /// not exist. /// public static string IndexToVideo (byte index) { return (index < video.Length) ? video [index] : null; } /// /// Gets the audio genre from its index in the array. /// /// /// A object, either in the format /// "(123)" or "123". /// /// /// A object containing the audio genre /// found at the index, or if it does /// not exist. /// public static string IndexToAudio (string text) { return IndexToAudio (StringToByte (text)); } /// /// Gets the video genre from its index in the array. /// /// /// A object, either in the format /// "(123)" or "123". /// /// /// A object containing the video genre /// found at the index, or if it does /// not exist. /// public static string IndexToVideo (string text) { return IndexToVideo (StringToByte (text)); } /// /// Converts a string, either in the format "(123)" or /// "123" into a byte or equal numeric value. /// /// /// A object, either in the format /// "(123)" or "123", to be converted. /// /// /// A value containing the numeric value /// of or 255 if no numeric value /// could be extracted. /// private static byte StringToByte (string text) { byte value; int last_pos; if (text != null && text.Length > 2 && text [0] == '(' && (last_pos = text.IndexOf (')')) != -1 && byte.TryParse (text.Substring (1, last_pos - 1), out value)) return value; if (text != null && byte.TryParse (text, out value)) return value; return 255; } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Png/0000777000175000017500000000000011503407416020775 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Png/Codec.cs0000644000175000017500000000327711470571657022362 0ustar00rubenruben00000000000000// // Codec.cs: // // Author: // Mike Gemuende (mike@gemuende.be) // // Copyright (C) 2010 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Png { /// /// A Png photo codec. Contains basic photo details. /// public class Codec : Image.Codec { /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public override string Description { get { return "PNG File"; } } /// /// Constructs a new with the given width /// and height. /// /// /// The width of the photo. /// /// /// The height of the photo. /// /// /// A new instance. /// public Codec (int width, int height) : base (width, height) {} } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Png/File.cs0000644000175000017500000006133511470571657022223 0ustar00rubenruben00000000000000// // File.cs: Provides tagging for PNG files // // Author: // Mike Gemuende (mike@gemuende.be) // // Copyright (C) 2010 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using TagLib; using TagLib.Image; using TagLib.Xmp; namespace TagLib.Png { /// /// This class extends to provide tagging /// for PNG image files. /// /// /// This implementation is based on http://www.w3.org/TR/PNG /// [SupportedMimeType("taglib/png", "png")] [SupportedMimeType("image/png")] public class File : TagLib.Image.ImageBlockFile { #region GIF specific constants /// /// The PNG Header every png file starts with. /// private readonly byte [] HEADER = new byte [] {137, 80, 78, 71, 13, 10, 26, 10}; /// /// byte sequence to indicate a IHDR Chunk /// private readonly byte [] IHDR_CHUNK_TYPE = new byte [] {73, 72, 68, 82}; /// /// byte sequence to indicate a IEND Chunk /// private readonly byte [] IEND_CHUNK_TYPE = new byte [] {73, 69, 78, 68}; /// /// byte sequence to indicate a iTXt Chunk /// private readonly byte [] iTXt_CHUNK_TYPE = new byte [] {105, 84, 88, 116}; /// /// byte sequence to indicate a tEXt Chunk /// private readonly byte [] tEXt_CHUNK_TYPE = new byte [] {116, 69, 88, 116}; /// /// byte sequence to indicate a zTXt Chunk /// private readonly byte [] zTXt_CHUNK_TYPE = new byte [] {122, 84, 88, 116}; /// /// header of a iTXt which contains XMP data. /// private readonly byte [] XMP_CHUNK_HEADER = new byte [] { // Keyword ("XML:com.adobe.xmp") 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, // Null Separator 0x00, // Compression Flag 0x00, // Compression Method 0x00, // Language Tag Null Separator 0x00, // Translated Keyword Null Separator 0x00 }; #endregion #region private fields /// /// The height of the image /// private int height; /// /// The width of the image /// private int width; /// /// The Properties of the image /// private Properties properties; #endregion #region public Properties /// /// Gets the media properties of the file represented by the /// current instance. /// /// /// A object containing the /// media properties of the file represented by the current /// instance. /// public override TagLib.Properties Properties { get { return properties; } } #endregion #region constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : this (new File.LocalFileAbstraction (path), propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : this (path, ReadStyle.Average) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction) { Read (propertiesStyle); } /// /// Constructs and initializes a new instance of for a specified file abstraction. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// protected File (IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) { } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { Mode = AccessMode.Write; try { SaveMetadata (); TagTypesOnDisk = TagTypes; } finally { Mode = AccessMode.Closed; } } #endregion #region private methods /// /// Reads the information from file with a specified read style. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// private void Read (ReadStyle propertiesStyle) { Mode = AccessMode.Read; try { ImageTag = new CombinedImageTag (TagTypes.XMP | TagTypes.Png); ValidateHeader (); ReadMetadata (); TagTypesOnDisk = TagTypes; if (propertiesStyle != ReadStyle.None) properties = ExtractProperties (); } finally { Mode = AccessMode.Closed; } } /// /// Validates the header of a PNG file. Therfore, the current position to /// read must be the start of the file. /// private void ValidateHeader () { ByteVector data = ReadBlock (8); if (data.Count != 8) throw new CorruptFileException ("Unexpected end of header"); if (! data.Equals (new ByteVector (HEADER))) throw new CorruptFileException ("PNG Header was expected"); } /// /// Reads the length of data of a chunk from the current position /// /// /// A with the length of data. /// /// /// The length is stored in a 4-byte unsigned integer in the file, /// but due to the PNG specification this value does not exceed /// 2^31-1 and can therfore be safely returned as an signed integer. /// This prevents unsafe casts for using the length as parameter /// for other methods. /// private int ReadChunkLength () { ByteVector data = ReadBlock (4); if (data.Count != 4) throw new CorruptFileException ("Unexpected end of Chunk Length"); uint length = data.ToUInt (true); if (length > Int32.MaxValue) throw new CorruptFileException ("PNG limits the Chunk Length to 2^31-1"); return (int) length; } /// /// Reads the type of a chunk from the current position. /// /// /// A with 4 bytes containing the type of /// the Chunk. /// private ByteVector ReadChunkType () { ByteVector data = ReadBlock (4); if (data.Count != 4) throw new CorruptFileException ("Unexpected end of Chunk Type"); return data; } /// /// Reads the CRC value for a chunk from the current position. /// /// /// A with 4 bytes with the CRC value. /// private ByteVector ReadCRC () { ByteVector data = ReadBlock (4); if (data.Count != 4) throw new CorruptFileException ("Unexpected end of CRC"); return data; } /// /// Reads the whole Chunk data starting from the current position. /// /// /// A with the length of the Chunk Data. /// /// /// A with the Chunk Data which is read. /// private ByteVector ReadChunkData (int data_length) { ByteVector data = ReadBlock (data_length); if (data.Count != data_length) throw new CorruptFileException (String.Format ("Chunk Data of Length {0} expected", data_length)); return data; } /// /// Reads a null terminated string from the given data from given position. /// /// /// A with teh data to read the string from /// /// /// A with the index to start reading /// /// /// A with the index of the null byte /// /// /// A with the read string. The null byte /// is not included. /// private string ReadTerminatedString (ByteVector data, int start_index, out int terminator_index) { if (start_index >= data.Count) throw new CorruptFileException ("Unexpected End of Data"); terminator_index = data.Find ("\0", start_index); if (terminator_index < 0) throw new CorruptFileException ("Cannot find string terminator"); return data.Mid (start_index, terminator_index - start_index).ToString (); } /// /// Reads a null terminated keyword from he given data from given position. /// /// /// A with teh data to read the string from /// /// /// A with the index to start reading /// /// /// A with the index of the null byte /// /// /// A with the read keyword. The null byte /// is not included. /// private string ReadKeyword (ByteVector data, int start_index, out int terminator_index) { string keyword = ReadTerminatedString (data, start_index, out terminator_index); if (String.IsNullOrEmpty (keyword)) throw new CorruptFileException ("Keyword cannot be empty"); return keyword; } /// /// Skips the Chunk Data and CRC Data. The read position must be at the /// beginning of the Chunk data. /// /// /// A with the length of the chunk data read /// before. /// private void SkipChunkData (int data_size) { long position = Tell; if (position + data_size >= Length) throw new CorruptFileException (String.Format ("Chunk Data of Length {0} expected", data_size)); Seek (Tell + data_size); ReadCRC (); } /// /// Reads the whole metadata from file. The current position must be set to /// the first Chunk which is contained in the file. /// private void ReadMetadata () { int data_length = ReadChunkLength (); ByteVector type = ReadChunkType (); // File should start with a header chunk if (! type.StartsWith (IHDR_CHUNK_TYPE)) throw new CorruptFileException ( String.Format ("IHDR Chunk was expected, but Chunk {0} was found", type.ToString ())); ReadIHDRChunk (data_length); // Read all following chunks while (true) { data_length = ReadChunkLength (); type = ReadChunkType (); if (type.StartsWith (IEND_CHUNK_TYPE)) return; else if (type.StartsWith (iTXt_CHUNK_TYPE)) ReadiTXtChunk (data_length); else if (type.StartsWith (tEXt_CHUNK_TYPE)) ReadtEXtChunk (data_length); else if (type.StartsWith (zTXt_CHUNK_TYPE)) ReadzTXtChunk (data_length); else SkipChunkData (data_length); } } /// /// Reads the IHDR Chunk from file and extracts some image information /// like width and height. The current position must be set to the start /// of the Chunk Data. /// /// /// A with the length of the Chunk Data. /// private void ReadIHDRChunk (int data_length) { // IHDR Chunk // // 4 Bytes Width // 4 Bytes Height // 1 Byte Bit depth // 1 Byte Colour type // 1 Byte Compression method // 1 Byte Filter method // 1 Byte Interlace method // // Followed by 4 Bytes CRC data if (data_length != 13) throw new CorruptFileException ("IHDR chunk data length must be 13"); ByteVector data = ReadChunkData (data_length); CheckCRC (IHDR_CHUNK_TYPE, data, ReadCRC ()); // The PNG specification limits the size of 4-byte unsigned integers to 2^31-1. // That allows us to safely cast them to an signed integer. uint width = data.Mid (0, 4).ToUInt (true); uint height = data.Mid (4, 4).ToUInt (true); if (width > Int32.MaxValue || height > Int32.MaxValue) throw new CorruptFileException ("PNG limits width and heigth to 2^31-1"); this.width = (int) width; this.height = (int) height; } /// /// Reads an iTXt Chunk from file. The current position must be set /// to the start of the Chunk Data. Such a Chunk may contain XMP data /// or translated keywords. /// /// /// A with the length of the Chunk Data. /// private void ReadiTXtChunk (int data_length) { long position = Tell; // iTXt Chunk // // N Bytes Keyword // 1 Byte Null Separator // 1 Byte Compression Flag (0 for uncompressed data) // 1 Byte Compression Method // N Bytes Language Tag // 1 Byte Null Separator // N Bytes Translated Keyword // 1 Byte Null Terminator // N Bytes Txt // // Followed by 4 Bytes CRC data ByteVector data = ReadChunkData (data_length); CheckCRC (iTXt_CHUNK_TYPE, data, ReadCRC ()); // handle XMP, which has a fixed header if (data.StartsWith (XMP_CHUNK_HEADER)) { ImageTag.AddTag (new XmpTag (data.Mid (XMP_CHUNK_HEADER.Length).ToString (StringType.UTF8), this)); AddMetadataBlock (position - 8, data_length + 8 + 4); return; } int terminator_index; string keyword = ReadKeyword (data, 0, out terminator_index); if (terminator_index + 2 >= data_length) throw new CorruptFileException ("Compression Flag and Compression Method byte expected"); byte compression_flag = data[terminator_index + 1]; byte compression_method = data[terminator_index + 2]; //string language = ReadTerminatedString (data, terminator_index + 3, out terminator_index); //string translated_keyword = ReadTerminatedString (data, terminator_index + 1, out terminator_index); ByteVector txt_data = data.Mid (terminator_index + 1); if (compression_flag != 0x00) { txt_data = Decompress (compression_method, txt_data); // ignore unknown compression methods if (txt_data == null) return; } string value = txt_data.ToString (); PngTag png_tag = GetTag (TagTypes.Png, true) as PngTag; if (png_tag.GetKeyword (keyword) == null) png_tag.SetKeyword (keyword, value); AddMetadataBlock (position - 8, data_length + 8 + 4); } /// /// Reads an tEXt Chunk from file. The current position must be set /// to the start of the Chunk Data. Such a Chunk contains plain /// keywords. /// /// /// A with the length of the Chunk Data. /// private void ReadtEXtChunk (int data_length) { long position = Tell; // tEXt Chunk // // N Bytes Keyword // 1 Byte Null Separator // N Bytes Txt // // Followed by 4 Bytes CRC data ByteVector data = ReadChunkData (data_length); CheckCRC (tEXt_CHUNK_TYPE, data, ReadCRC ()); int keyword_terminator; string keyword = ReadKeyword (data, 0, out keyword_terminator); string value = data.Mid (keyword_terminator + 1).ToString (); PngTag png_tag = GetTag (TagTypes.Png, true) as PngTag; if (png_tag.GetKeyword (keyword) == null) png_tag.SetKeyword (keyword, value); AddMetadataBlock (position - 8, data_length + 8 + 4); } /// /// Reads an zTXt Chunk from file. The current position must be set /// to the start of the Chunk Data. Such a Chunk contains compressed /// keywords. /// /// /// A with the length of the Chunk Data. /// /// /// The Chunk may also contain compressed Exif data which is written /// by other tools. But, since the PNG specification does not support /// Exif data, we ignore it here. /// private void ReadzTXtChunk (int data_length) { long position = Tell; // zTXt Chunk // // N Bytes Keyword // 1 Byte Null Separator // 1 Byte Compression Method // N Bytes Txt // // Followed by 4 Bytes CRC data ByteVector data = ReadChunkData (data_length); CheckCRC (zTXt_CHUNK_TYPE, data, ReadCRC ()); int terminator_index; string keyword = ReadKeyword (data, 0, out terminator_index); if (terminator_index + 1 >= data_length) throw new CorruptFileException ("Compression Method byte expected"); byte compression_method = data[terminator_index + 1]; ByteVector plain_data = Decompress (compression_method, data.Mid (terminator_index + 2)); // ignore unknown compression methods if (plain_data == null) return; string value = plain_data.ToString (); PngTag png_tag = GetTag (TagTypes.Png, true) as PngTag; if (png_tag.GetKeyword (keyword) == null) png_tag.SetKeyword (keyword, value); AddMetadataBlock (position - 8, data_length + 8 + 4); } /// /// Save the metadata to file. /// private void SaveMetadata () { ByteVector metadata_chunks = new ByteVector (); metadata_chunks.Add (RenderXMPChunk ()); metadata_chunks.Add (RenderKeywordChunks ()); // Metadata is stored after the PNG header and the IDHR chunk. SaveMetadata (metadata_chunks, HEADER.Length + 13 + 4 + 4 + 4); } /// /// Creates a Chunk containing the XMP data. /// /// /// A with the XMP data chunk /// or if no XMP data is contained. /// private ByteVector RenderXMPChunk () { // Check, if XmpTag is contained XmpTag xmp = ImageTag.Xmp; if (xmp == null) return null; ByteVector chunk = new ByteVector (); // render the XMP data itself ByteVector xmp_data = xmp.Render (); // TODO check uint size. chunk.Add (ByteVector.FromUInt ((uint) xmp_data.Count + (uint) XMP_CHUNK_HEADER.Length)); chunk.Add (iTXt_CHUNK_TYPE); chunk.Add (XMP_CHUNK_HEADER); chunk.Add (xmp_data); chunk.Add (ComputeCRC (iTXt_CHUNK_TYPE, XMP_CHUNK_HEADER, xmp_data)); return chunk; } /// /// Creates a list of Chunks containing the PNG keywords /// /// /// A with the list of chunks, or /// or if no PNG Keywords are contained. /// private ByteVector RenderKeywordChunks () { // Check, if PngTag is contained PngTag png_tag = GetTag (TagTypes.Png, true) as PngTag; if (png_tag == null) return null; ByteVector chunks = new ByteVector (); foreach (KeyValuePair keyword in png_tag) { ByteVector data = new ByteVector (); data.Add (keyword.Key); data.Add ("\0"); data.Add (keyword.Value); chunks.Add (ByteVector.FromUInt ((uint) data.Count)); chunks.Add (tEXt_CHUNK_TYPE); chunks.Add (data); chunks.Add (ComputeCRC (tEXt_CHUNK_TYPE, data)); } return chunks; } /// /// Attempts to extract the media properties of the main /// photo. /// /// /// A object with a best effort guess /// at the right values. When no guess at all can be made, /// is returned. /// private Properties ExtractProperties () { if (width > 0 && height > 0) return new Properties (TimeSpan.Zero, new Codec (width, height)); return null; } #endregion #region Utility Stuff /// /// Checks the CRC for a Chunk. /// /// /// A whith the Chunk type /// /// /// A with the Chunk data. /// /// /// A with the read CRC data. /// private static void CheckCRC (ByteVector chunk_type, ByteVector chunk_data, ByteVector crc_data) { ByteVector computed_crc = ComputeCRC (chunk_type, chunk_data); if (computed_crc != crc_data) throw new CorruptFileException ( String.Format ("CRC check failed for {0} Chunk (expected: 0x{1:X4}, read: 0x{2:X4}", chunk_type.ToString (), computed_crc.ToUInt (), crc_data.ToUInt ())); } /// /// Computes a 32bit CRC for the given data. /// /// /// A with data to compute /// the CRC for. /// /// /// A with 4 bytes (32bit) containing the CRC. /// private static ByteVector ComputeCRC (params ByteVector [] datas) { uint crc = 0xFFFFFFFF; if (crc_table == null) BuildCRCTable (); foreach (var data in datas) { foreach (byte b in data) { crc = crc_table[(crc ^ b) & 0xFF] ^ (crc >> 8); } } // Invert return ByteVector.FromUInt (crc ^ 0xFFFFFFFF); } /// /// Table for faster computation of CRC. /// private static uint[] crc_table; /// /// Initializes the CRC Table. /// private static void BuildCRCTable () { uint polynom = 0xEDB88320; crc_table = new uint [256]; for (int i = 0; i < 256; i++) { uint c = (uint) i; for (int k = 0; k < 8; k++) { if ((c & 0x00000001) != 0x00) c = polynom ^ (c >> 1); else c = c >> 1; } crc_table[i] = c; } } private static ByteVector Inflate (ByteVector data) { #if HAVE_SHARPZIPLIB using (System.IO.MemoryStream out_stream = new System.IO.MemoryStream ()) { ICSharpCode.SharpZipLib.Zip.Compression.Inflater inflater = new ICSharpCode.SharpZipLib.Zip.Compression.Inflater (); inflater.SetInput (data.Data); byte [] buffer = new byte [1024]; int written_bytes; while ((written_bytes = inflater.Inflate (buffer)) > 0) out_stream.Write (buffer, 0, written_bytes); return new ByteVector (out_stream.ToArray ()); } #else return null; #endif } private static ByteVector Decompress (byte compression_method, ByteVector compressed_data) { // there is currently just one compression method specified // for PNG. switch (compression_method) { case 0: return Inflate (compressed_data); default: return null; } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Png/PngTag.cs0000644000175000017500000001644011470571657022521 0ustar00rubenruben00000000000000// // PngTag.cs: // // Author: // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2010 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections; using System.Collections.Generic; using TagLib.Image; namespace TagLib.Png { /// /// Native Png Keywords /// public class PngTag : ImageTag, IEnumerable { #region defined PNG keywords /// /// Short (one line) title or caption for image /// public static readonly string TITLE = "Title"; /// /// Name of image's creator /// public static readonly string AUTHOR = "Author"; /// /// Description of image (possibly long) /// public static readonly string DESCRIPTION = "Description"; /// /// Copyright notice /// public static readonly string COPYRIGHT = "Copyright"; /// /// Time of original image creation /// public static readonly string CREATION_TIME = "Creation Time"; /// /// Software used to create the image /// public static readonly string SOFTWARE = "Software"; /// /// Legal disclaimer /// public static readonly string DISCLAIMER = "Disclaimer"; /// /// Warning of nature of content /// public static readonly string WARNING = "Warning"; /// /// Device used to create the image /// public static readonly string SOURCE = "Source"; /// /// Miscellaneous comment /// public static readonly string COMMENT = "Comment"; #endregion #region Private Fieds /// /// Store the keywords with their values /// private Dictionary keyword_store = new Dictionary (); #endregion #region Constructors /// /// Constructor. /// public PngTag () { } #endregion #region Public Properties /// /// Gets or sets the comment for the image described /// by the current instance. /// /// /// A containing the comment of the /// current instace. /// /// /// We use here both keywords Description and Comment of the /// PNG specification to store the comment. /// public override string Comment { get { string description = GetKeyword (DESCRIPTION); if (! String.IsNullOrEmpty (description)) return description; return GetKeyword (COMMENT); } set { SetKeyword (DESCRIPTION, value); SetKeyword (COMMENT, value); } } /// /// Gets and sets the title for the media described by the /// current instance. /// /// /// A object containing the title for /// the media described by the current instance or if no value is present. /// public override string Title { get { return GetKeyword (TITLE); } set { SetKeyword (TITLE, value); } } /// /// Gets or sets the creator of the image. /// /// /// A with the name of the creator. /// public override string Creator { get { return GetKeyword (AUTHOR); } set { SetKeyword (AUTHOR, value); } } /// /// Gets and sets the copyright information for the media /// represented by the current instance. /// /// /// A object containing the copyright /// information for the media represented by the current /// instance or if no value present. /// public override string Copyright { get { return GetKeyword (COPYRIGHT); } set { SetKeyword (COPYRIGHT, value); } } /// /// Gets or sets the software the image, the current instance /// belongs to, was created with. /// /// /// A containing the name of the /// software the current instace was created with. /// public override string Software { get { return GetKeyword (SOFTWARE); } set { SetKeyword (SOFTWARE, value); } } /// /// Gets or sets the time when the image, the current instance /// belongs to, was taken. /// /// /// A with the time the image was taken. /// public override DateTime? DateTime { get { DateTime ret; string date = GetKeyword (CREATION_TIME); if (System.DateTime.TryParse (date, out ret)) return ret; return null; } set { string date = null; if (value != null) { // Creation Date is stored in RFC 822 for PNG date = value.Value.ToString ("R"); } SetKeyword (CREATION_TIME, date); } } #endregion #region Public Methods /// /// Sets a keyword of to the given value. /// /// /// A with the keyword to set. /// /// /// A with the value. /// public void SetKeyword (string keyword, string value) { if (String.IsNullOrEmpty (keyword)) throw new ArgumentException ("keyword is null or empty"); keyword_store.Remove (keyword); if (value != null) { keyword_store.Add (keyword, value); } } /// /// Gets a value of a keyword. /// /// /// A with the keyword to get the value for. /// /// /// A with the value or /// if the keyword is not contained. /// public string GetKeyword (string keyword) { string ret = null; keyword_store.TryGetValue (keyword, out ret); return ret; } /// /// Gets the tag types contained in the current instance. /// /// /// Always . /// public override TagTypes TagTypes { get { return TagTypes.Png; } } /// /// Clears the values stored in the current instance. /// public override void Clear () { keyword_store.Clear (); } /// /// Returns an enumerator to enumerate all keywords. /// /// /// A to enumerate /// the keywords. /// public IEnumerator GetEnumerator () { return keyword_store.GetEnumerator (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/StringList.cs0000644000175000017500000001155711462100402022674 0ustar00rubenruben00000000000000// // StringList.cs: This class extends ListBase for a collection // of string objects. // // Author: // Brian Nickel (brian.nickel@gmail.com) // Aaron Bockover (abockover@novell.com) // // Copyright (C) 2006 Novell, Inc. // Copyright (C) 2005-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Runtime.InteropServices; namespace TagLib { /// /// This class extends for a collection of /// objects. /// [ComVisible(false)] public class StringCollection : ListBase { /// /// Constructs and initializes a new instance of with no contents. /// public StringCollection () { } /// /// Constructs and initializes a new instance of with the contents of another /// instance. /// /// /// A object whose values are /// to be added to the new instance. /// public StringCollection (StringCollection values) { Add (values); } /// /// Constructs and initializes a new instance of with the contents of a /// specified array. /// /// /// A whose values are to be added to /// the new instance. /// public StringCollection (params string [] values) { Add (values); } /// /// Constructs and initializes a new instance of by converting a collection of /// objects to strings with a /// specified encoding. /// /// /// A object containing /// values to convert and add to the new instance. /// /// /// A specifying what encoding to /// use when converting the data to strings. /// public StringCollection (ByteVectorCollection vectorList, StringType type) { foreach (ByteVector vector in vectorList) Add (vector.ToString (type)); } /// /// Constructs and initializes a new instance of by converting a collection of /// objects to strings using the /// UTF-8 encoding. /// /// /// A object containing /// values to convert and add to the new instance. /// public StringCollection(ByteVectorCollection vectorList) : this (vectorList, StringType.UTF8) { } /// /// Splits a single into a using a pattern. /// /// /// A object to split. /// /// /// A object containing a pattern to /// use to split . /// /// /// A object containing the /// split values. /// /// /// or /// is . /// public static StringCollection Split (string value, string pattern) { if (value == null) throw new ArgumentNullException ("value"); if (pattern == null) throw new ArgumentNullException ("pattern"); StringCollection list = new StringCollection (); int previous_position = 0; int position = value.IndexOf (pattern, 0); int pattern_length = pattern.Length; while (position != -1) { list.Add (value.Substring (previous_position, position - previous_position)); previous_position = position + pattern_length; position = value.IndexOf (pattern, previous_position); } list.Add (value.Substring (previous_position)); return list; } } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Gif/0000777000175000017500000000000011503407417020757 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Gif/Codec.cs0000644000175000017500000000327711470571657022343 0ustar00rubenruben00000000000000// // Codec.cs: // // Author: // Mike Gemuende (mike@gemuende.be) // // Copyright (C) 2010 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Gif { /// /// A Gif photo codec. Contains basic photo details. /// public class Codec : Image.Codec { /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public override string Description { get { return "GIF File"; } } /// /// Constructs a new with the given width /// and height. /// /// /// The width of the photo. /// /// /// The height of the photo. /// /// /// A new instance. /// public Codec (int width, int height) : base (width, height) {} } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Gif/File.cs0000644000175000017500000006061211470571657022201 0ustar00rubenruben00000000000000// // File.cs: Provides tagging for GIF files // // Author: // Mike Gemuende (mike@gemuende.be) // // Copyright (C) 2010 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.IO; using TagLib; using TagLib.Image; using TagLib.Xmp; namespace TagLib.Gif { /// /// This class extends to provide tagging /// and property support for Gif files. /// [SupportedMimeType("taglib/gif", "gif")] [SupportedMimeType("image/gif")] public class File : TagLib.Image.ImageBlockFile { #region GIF specific constants /// /// Gif file signature which occurs at the begin of the file /// protected static readonly string SIGNATURE = "GIF"; /// /// String which is used to indicate version the gif file format version 87a /// protected static readonly string VERSION_87A = "87a"; /// /// String which is used to indicate version the gif file format version 89a /// protected static readonly string VERSION_89A = "89a"; /// /// Application Extension Identifier for an XMP Block /// private static readonly string XMP_IDENTIFIER = "XMP Data"; /// /// Application Authentication Extension Code for an XMP Block /// private static readonly string XMP_AUTH_CODE = "XMP"; /// /// The Magic Trailer for XMP Data /// /// /// The storage of XMP data in GIF does not follow the GIF specification. According to the /// specification, extension data is stored in so-called sub-blocks, which start with a length /// byte which specifies the number of data bytes contained in the sub block. So a block can at /// most contain 256 data bytes. After a sub-block, the next sub-block begins. The sequence ends, /// when a sub-block starts with 0. So readers, which are not aware of the XMP data not following /// this scheme, will get confused by the XMP data. To fix this, this trailer is added to the end. /// It has a length of 258 bytes, so that it is ensured that a reader which tries to skip the /// XMP data reads one of this bytes as length of a sub-block. But, each byte points with its length /// to the last one. Therefoe, independent of the byte, the reader reads as sub-block length, it is /// redirected to the last byte of the trailer and therfore to the end of the XMP data. /// private static readonly byte [] XMP_MAGIC_TRAILER = new byte [] { 0x01, 0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8, 0xF7, 0xF6, 0xF5, 0xF4, 0xF3, 0xF2, 0xF1, 0xF0, 0xEF, 0xEE, 0xED, 0xEC, 0xEB, 0xEA, 0xE9, 0xE8, 0xE7, 0xE6, 0xE5, 0xE4, 0xE3, 0xE2, 0xE1, 0xE0, 0xDF, 0xDE, 0xDD, 0xDC, 0xDB, 0xDA, 0xD9, 0xD8, 0xD7, 0xD6, 0xD5, 0xD4, 0xD3, 0xD2, 0xD1, 0xD0, 0xCF, 0xCE, 0xCD, 0xCC, 0xCB, 0xCA, 0xC9, 0xC8, 0xC7, 0xC6, 0xC5, 0xC4, 0xC3, 0xC2, 0xC1, 0xC0, 0xBF, 0xBE, 0xBD, 0xBC, 0xBB, 0xBA, 0xB9, 0xB8, 0xB7, 0xB6, 0xB5, 0xB4, 0xB3, 0xB2, 0xB1, 0xB0, 0xAF, 0xAE, 0xAD, 0xAC, 0xAB, 0xAA, 0xA9, 0xA8, 0xA7, 0xA6, 0xA5, 0xA4, 0xA3, 0xA2, 0xA1, 0xA0, 0x9F, 0x9E, 0x9D, 0x9C, 0x9B, 0x9A, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 0x8F, 0x8E, 0x8D, 0x8C, 0x8B, 0x8A, 0x89, 0x88, 0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7D, 0x7C, 0x7B, 0x7A, 0x79, 0x78, 0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x70, 0x6F, 0x6E, 0x6D, 0x6C, 0x6B, 0x6A, 0x69, 0x68, 0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0x61, 0x60, 0x5F, 0x5E, 0x5D, 0x5C, 0x5B, 0x5A, 0x59, 0x58, 0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, 0x4F, 0x4E, 0x4D, 0x4C, 0x4B, 0x4A, 0x49, 0x48, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40, 0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2F, 0x2E, 0x2D, 0x2C, 0x2B, 0x2A, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20, 0x1F, 0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00 }; #endregion #region private fields /// /// The width of the image /// private int width; /// /// The height of the image /// private int height; /// /// The Properties of the image /// private Properties properties; /// /// The version of the file format /// private string version; /// /// The start of the first block in file after the header. /// private long start_of_blocks = -1; #endregion #region public Properties /// /// Gets the media properties of the file represented by the /// current instance. /// /// /// A object containing the /// media properties of the file represented by the current /// instance. /// public override TagLib.Properties Properties { get { return properties; } } #endregion #region constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : this (new File.LocalFileAbstraction (path), propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : this (path, ReadStyle.Average) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction) { Read (propertiesStyle); } /// /// Constructs and initializes a new instance of for a specified file abstraction. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// protected File (IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) { } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { Mode = AccessMode.Write; try { SaveMetadata (); TagTypesOnDisk = TagTypes; } finally { Mode = AccessMode.Closed; } } #endregion #region Private Methods /// /// Reads the information from file with a specified read style. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// private void Read (ReadStyle propertiesStyle) { Mode = AccessMode.Read; try { ImageTag = new CombinedImageTag (TagTypes.XMP | TagTypes.GifComment); ReadHeader (); ReadMetadata (); TagTypesOnDisk = TagTypes; if (propertiesStyle != ReadStyle.None) properties = ExtractProperties (); } finally { Mode = AccessMode.Closed; } } /// /// Reads a single byte form file. This is needed often for Gif files. /// /// /// A with the read data. /// private byte ReadByte () { ByteVector data = ReadBlock (1); if (data.Count != 1) throw new CorruptFileException ("Unexpected end of file"); return data[0]; } /// /// Reads the Header and the Logical Screen Descriptor of the GIF file and, /// if there is one, skips the global color table. It also extracts the /// image width and height from it. /// private void ReadHeader () { // The header consists of: // // 3 Bytes Signature // 3 Bytes Version // // The Logical Screen Descriptor of: // // 2 Bytes Width (little endian) // 2 Bytes Height (little endian) // 1 Byte Screen and Color Map (packed field) // 1 Byte Background Color // 1 Byte Aspect Ratio // // Whereas the bits of the packed field contains some special information. ByteVector data = ReadBlock (13); if (data.Count != 13) throw new CorruptFileException ("Unexpected end of Header"); if (data.Mid (0, 3).ToString () != SIGNATURE) throw new CorruptFileException (String.Format ("Expected a GIF signature at start of file, but found: {0}", data.Mid (0, 3).ToString ())); // We do not care about the version here, because we can read both versions in the same way. // We just care when writing metadata, that, if necessary, the version is increased to 89a. var read_version = data.Mid (3, 3).ToString (); if (read_version == VERSION_87A || read_version == VERSION_89A) version = read_version; else throw new UnsupportedFormatException ( String.Format ("Only GIF versions 87a and 89a are currently supported, but not: {0}", read_version)); // Read Image Size (little endian) width = data.Mid (6, 2).ToUShort (false); height = data.Mid (8, 2).ToUShort (false); // Skip optional global color table SkipColorTable (data [10]); } /// /// Reads the metadata from file. The current position must point to the /// start of the first block after the Header and Logical Screen /// Descriptor (and, if there is one, the Global Color Table) /// private void ReadMetadata () { start_of_blocks = Tell; // Read Blocks until end of file is reached. while (true) { byte identifier = ReadByte (); switch (identifier) { case 0x2c: SkipImage (); break; case 0x21: ReadExtensionBlock (); break; case 0x3B: return; default: throw new CorruptFileException ( String.Format ("Do not know what to do with byte 0x{0:X2} at the beginning of a block ({1}).", identifier, Tell - 1)); } } } /// /// Reads an Extension Block at the current position. The current position must /// point to the 2nd byte of the comment block. (The other byte is usually /// read before to identify the comment block) /// private void ReadExtensionBlock () { // Extension Block // // 1 Byte Extension Introducer (0x21) // 1 Byte Extension Identifier // .... // // Note, the Extension Introducer was read before to // identify the Extension Block. Therefore, it has not // to be handled here. byte identifier = ReadByte (); switch (identifier) { case 0xFE: ReadCommentBlock (); break; case 0xFF: ReadApplicationExtensionBlock (); break; // Control Extension Block, ... case 0xF9: // ... Plain Text Extension ... case 0x01: // ... and all other unknown blocks can be skipped by just // reading sub-blocks. default: SkipSubBlocks (); break; } } /// /// Reads an Application Extension Block at the current position. The current /// position must point to the 3rd byte of the comment block. (The other 2 bytes /// are usually read before to identify the comment block) /// private void ReadApplicationExtensionBlock () { // Application Extension Block // // 1 Byte Extension Introducer (0x21) // 1 Byte Application Extension Label (0xFF) // 1 Byte Block Size (0x0B - 11) // 8 Bytes Application Identifier // 3 Bytes Application Auth. Code // N Bytes Application Data (sub blocks) // 1 Byte Block Terminator (0x00) // // Note, the first 2 bytes are still read to identify the Comment Block. // Therefore, we only need to read the sub blocks and extract the data. long position = Tell; ByteVector data = ReadBlock (12); if (data.Count != 12) throw new CorruptFileException (""); // Contains XMP data if (data.Mid (1, 8) == XMP_IDENTIFIER && data.Mid (9, 3) == XMP_AUTH_CODE) { // XMP Data is not organized in sub-blocks // start of xmp data long data_start = Tell; // start of trailer start // FIXME: Since File.Find is still buggy, the following call does not work to find the end of the // XMP data. Therfore, we use here a different way for now. //long xmp_trailer_start = Find (new ByteVector (0x00), data_start); // Since searching just one byte is save, we search for the end of the xmp trailer which // consists of two 0x00 bytes and compute the expected start. long xmp_trailer_start = Find (new byte [] {0x00}, data_start) - XMP_MAGIC_TRAILER.Length + 2; Seek (data_start, SeekOrigin.Begin); if (xmp_trailer_start <= data_start) throw new CorruptFileException ("No End of XMP data found"); // length of xmp data int data_length = (int) (xmp_trailer_start - data_start); ByteVector xmp_data = ReadBlock (data_length); ImageTag.AddTag (new XmpTag (xmp_data.ToString (StringType.UTF8), this)); // 2 bytes where read before AddMetadataBlock (position - 2, 14 + data_length + XMP_MAGIC_TRAILER.Length); // set position behind the XMP block Seek (xmp_trailer_start + XMP_MAGIC_TRAILER.Length, SeekOrigin.Begin); } else { SkipSubBlocks (); } } /// /// Reads a Comment Block at the current position. The current position must /// point to the 3rd byte of the comment block. (The other 2 bytes are usually /// read before to identify the comment block) /// private void ReadCommentBlock () { long position = Tell; // Comment Extension // // 1 Byte Extension Introducer (0x21) // 1 Byte Comment Label (0xFE) // N Bytes Comment Data (Sub Blocks) // 1 Byte Block Terminator (0x00) // // Note, the first 2 bytes are still read to identify the Comment Block. // Therefore, we only need to read the sub blocks and extract the data. string comment = ReadSubBlocks (); // Only add the tag, if no one is still contained. if ((TagTypes & TagTypes.GifComment) == 0x00) { ImageTag.AddTag (new GifCommentTag (comment)); // 2 bytes where read before AddMetadataBlock (position - 2, Tell - position + 2); } } /// /// Skips the color table if there is one /// /// /// A with the packed data which is /// contained Logical Screen Descriptor or in the Image Descriptor. /// /// /// The data contained in the packed data is different for the Logical /// Screen Descriptor and for the Image Descriptor. But fortunately, /// the bits which are used do identifying the exitstance and the size /// of the color table are at the same position. /// private void SkipColorTable (byte packed_data) { // Packed Field (Information with Bit 0 is LSB) // // Bit 0-2 Size of Color Table // Bit 3-6 Other stuff // Bit 7 (Local|Global) Color Table Flag // // We are interested in Bit 7 which indicates if a global color table is // present or not and the Bits 0-2 which indicate the size of the color // table. if ((packed_data & 0x80) == 0x80) { // 2^(size + 1) for each color. int table_size = 3 * (1 << ((packed_data & 0x07) + 1)); // and simply skip the color table ByteVector color_table = ReadBlock (table_size); if (color_table.Count != table_size) throw new CorruptFileException ("Unexpected end of Color Table"); } } /// /// Skip over the image data at the current position. The current position must /// point to 2nd byte of the Image Descriptor. (First byte is usually read before /// to identify the image descriptor.) /// private void SkipImage () { // Image Descriptor // // 1 Byte Separator (0x2C) // 2 Bytes Image Left Position (little endian) // 2 Bytes Image Right Position (little endian) // 2 Bytes Image Witdh (little endian) // 2 Bytes Image Height (little endian) // 1 Byte Packed Data // // Note, the Separator was read before to identify the Image Block // Therefore, we only need to read 9 bytes here. ByteVector data = ReadBlock (9); if (data.Count != 9) throw new CorruptFileException ("Unexpected end of Image Descriptor"); // Skip an optional local color table SkipColorTable (data [8]); // Image Data // // 1 Byte LZW Minimum Code Size // N Bytes Image Data (Sub-Blocks) // // Before the image data, one byte for LZW encoding information is used. // This byte is read first, then the sub-blocks are skipped. ReadBlock (1); SkipSubBlocks (); } /// /// Reads a sequence of sub-blocks from the current position and concatenates the data /// from the sub-blocks to a string. The current position must point to the size-byte /// of the first subblock to skip. /// /// /// A with the data contained in the sub-blocks. /// private string ReadSubBlocks () { // Sub Block // Starts with one byte with the number of data bytes // following. The last sub block is terminated by length 0 System.Text.StringBuilder builder = new System.Text.StringBuilder (); byte length = 0; do { if (length >= 0) builder.Append (ReadBlock (length).ToString ()); // read new length byte length = ReadByte (); // The sub-blocks are terminated with 0 } while (length != 0); return builder.ToString (); } /// /// Skips over a sequence of sub-blocks from the current position in the file. /// The current position must point to the size-byte of the first subblock to skip. /// private void SkipSubBlocks () { // Sub Block // Starts with one byte with the number of data bytes // following. The last sub block is terminated by length 0 byte length = 0; do { if (Tell + length >= Length) throw new CorruptFileException ("Unexpected end of Sub-Block"); // Seek to end of sub-block and update the position Seek (Tell + length, SeekOrigin.Begin); // read new length byte length = ReadByte (); // The sub-blocks are terminated with 0 } while (length != 0); } /// /// Save the metadata to file. /// private void SaveMetadata () { ByteVector comment_block = RenderGifCommentBlock (); ByteVector xmp_block = RenderXMPBlock (); // If we write metadata and the version is not 89a, bump the format version // because application extension blocks and comment extension blocks are // specified in 89a. // If we do not write metadata or if metadata is deleted, we do not care // about the version, because it may be wrong before. if (comment_block != null && xmp_block != null && version != VERSION_89A) { Insert (VERSION_89A, 3, VERSION_89A.Length); } // now, only metadata is stored at the beginning of the file, and we can overwrite it. ByteVector metadata_blocks = new ByteVector (); metadata_blocks.Add (comment_block); metadata_blocks.Add (xmp_block); SaveMetadata (metadata_blocks, start_of_blocks); } /// /// Renders the XMP data to a Application Extension Block which can be /// embedded in a Gif file. /// /// /// A with the Application Extension Block for the /// XMP data, or if the file does not have XMP data. /// private ByteVector RenderXMPBlock () { // Check, if XmpTag is contained XmpTag xmp = ImageTag.Xmp; if (xmp == null) return null; ByteVector xmp_data = new ByteVector (); // Add Extension Introducer (0x21), Application Extension Label (0xFF) and // the Block Size (0x0B xmp_data.Add (new byte [] {0x21, 0xFF, 0x0B}); // Application Identifier and Appl. Auth. Code xmp_data.Add (XMP_IDENTIFIER); xmp_data.Add (XMP_AUTH_CODE); // Add XMP data and Magic Trailer // For XMP, we do not need to store the data in sub-blocks, therfore we // can just add the whole rendered data. (The trailer fixes this) xmp_data.Add (xmp.Render ()); xmp_data.Add (XMP_MAGIC_TRAILER); return xmp_data; } /// /// Renders the Gif Comment to a Comment Extension Block which can be /// embedded in a Gif file. /// /// /// A with the Comment Extension Block for the /// Gif Comment, or if the file does not have /// a Gif Comment. /// private ByteVector RenderGifCommentBlock () { // Check, if GifCommentTag is contained GifCommentTag comment_tag = GetTag (TagTypes.GifComment) as GifCommentTag; if (comment_tag == null) return null; string comment = comment_tag.Comment; if (comment == null) return null; ByteVector comment_data = new ByteVector (); // Add Extension Introducer (0x21) and Comment Label (0xFE) comment_data.Add (new byte [] {0x21, 0xFE}); // Add data of comment in sub-blocks of max length 256. ByteVector comment_bytes = new ByteVector (comment); byte block_max = 255; for (int start = 0; start < comment_bytes.Count; start += block_max) { byte block_length = (byte) Math.Min (comment_bytes.Count - start, block_max); comment_data.Add (block_length); comment_data.Add (comment_bytes.Mid (start, block_length)); } comment_data.Add (new byte [] {0x00}); return comment_data; } /// /// Attempts to extract the media properties of the main /// photo. /// /// /// A object with a best effort guess /// at the right values. When no guess at all can be made, /// is returned. /// private Properties ExtractProperties () { if (width > 0 && height > 0) return new Properties (TimeSpan.Zero, new Codec (width, height)); return null; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Gif/GifCommentTag.cs0000644000175000017500000000450211470571657024002 0ustar00rubenruben00000000000000// // GifCommentTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2010 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using TagLib.Image; namespace TagLib.Gif { /// /// Contains the Gif comment. /// public class GifCommentTag : ImageTag { #region Constructors /// /// Constructor. /// /// /// The value of the comment. /// public GifCommentTag (string value) { Value = value; } /// /// Constructor. Creates a new empty comment. /// public GifCommentTag () { Value = null; } #endregion #region Public Properties /// /// The value of the comment represented by the current instance. /// public string Value { get; set; } /// /// Gets or sets the comment for the image described /// by the current instance. /// /// /// A containing the comment of the /// current instace. /// public override string Comment { get { return Value; } set { Value = value; } } #endregion #region Public Methods /// /// Gets the tag types contained in the current instance. /// /// /// Always . /// public override TagTypes TagTypes { get { return TagTypes.GifComment; } } /// /// Clears the values stored in the current instance. /// public override void Clear () { Value = null; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Picture.cs0000644000175000017500000002710711462100402022203 0ustar00rubenruben00000000000000// // Picture.cs: Provides IPicture and Picture. // // Author: // Aaron Bockover (abockover@novell.com) // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // attachedpictureframe.cpp from TagLib // // Copyright (C) 2006 Novell, Inc. // Copyright (C) 2007 Brian Nickel // Copyright (C) 2004 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib { /// /// Specifies the type of content appearing in the picture. /// public enum PictureType { /// /// The picture is of a type other than those specified. /// Other = 0x00, /// /// The picture is a 32x32 PNG image that should be used when /// displaying the file in a browser. /// FileIcon = 0x01, /// /// The picture is of an icon different from . /// OtherFileIcon = 0x02, /// /// The picture is of the front cover of the album. /// FrontCover = 0x03, /// /// The picture is of the back cover of the album. /// BackCover = 0x04, /// /// The picture is of a leaflet page including with the /// album. /// LeafletPage = 0x05, /// /// The picture is of the album or disc itself. /// Media = 0x06, // Image from the album itself /// /// The picture is of the lead artist or soloist. /// LeadArtist = 0x07, /// /// The picture is of the artist or performer. /// Artist = 0x08, /// /// The picture is of the conductor. /// Conductor = 0x09, /// /// The picture is of the band or orchestra. /// Band = 0x0A, /// /// The picture is of the composer. /// Composer = 0x0B, /// /// The picture is of the lyricist or text writer. /// Lyricist = 0x0C, /// /// The picture is of the recording location or studio. /// RecordingLocation = 0x0D, /// /// The picture is one taken during the track's recording. /// DuringRecording = 0x0E, /// /// The picture is one taken during the track's performance. /// DuringPerformance = 0x0F, /// /// The picture is a capture from a movie screen. /// MovieScreenCapture = 0x10, /// /// The picture is of a large, colored fish. /// ColoredFish = 0x11, /// /// The picture is an illustration related to the track. /// Illustration = 0x12, /// /// The picture contains the logo of the band or performer. /// BandLogo = 0x13, /// /// The picture is the logo of the publisher or record /// company. /// PublisherLogo = 0x14 } /// /// This interface provides generic information about a picture, /// including its contents, as used by various formats. /// public interface IPicture { /// /// Gets and sets the mime-type of the picture data /// stored in the current instance. /// /// /// A object containing the mime-type /// of the picture data stored in the current instance. /// string MimeType {get; set;} /// /// Gets and sets the type of content visible in the picture /// stored in the current instance. /// /// /// A containing the type of /// content visible in the picture stored in the current /// instance. /// PictureType Type {get; set;} /// /// Gets and sets a description of the picture stored in the /// current instance. /// /// /// A object containing a description /// of the picture stored in the current instance. /// string Description {get; set;} /// /// Gets and sets the picture data stored in the current /// instance. /// /// /// A object containing the picture /// data stored in the current instance. /// ByteVector Data {get; set;} } /// /// This class implements and provides /// mechanisms for loading pictures from files. /// public class Picture : IPicture { #region Private Fields /// /// Contains the mime-type. /// private string mime_type; /// /// Contains the content type. /// private PictureType type; /// /// Contains the description. /// private string description; /// /// Contains the picture data. /// private ByteVector data; #endregion #region Constructors /// /// Constructs and initializes a new instance of with no data or values. /// public Picture () { } /// /// Constructs and initializes a new instance of by reading in the contents of a /// specified file. /// /// /// A object containing the path of the /// file to read. /// /// /// is . /// public Picture (string path) { if (path == null) throw new ArgumentNullException ("path"); Data = ByteVector.FromPath (path); FillInMimeFromData (); Description = path; } /// /// Constructs and initializes a new instance of by reading in the contents of a /// specified file abstraction. /// /// /// A object containing /// abstraction of the file to read. /// /// /// is . /// public Picture (File.IFileAbstraction abstraction) { if (abstraction == null) throw new ArgumentNullException ("abstraction"); Data = ByteVector.FromFile (abstraction); FillInMimeFromData (); Description = abstraction.Name; } /// /// Constructs and initializes a new instance of by using the contents of a object. /// /// /// A object containing picture data /// to use. /// /// /// is . /// public Picture (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); Data = new ByteVector (data); FillInMimeFromData (); } #endregion #region Public Static Methods /// /// Creates a new , populating it with /// the contents of a file. /// /// /// A object containing the path to a /// file to read the picture from. /// /// /// A new object containing the /// contents of the file and with a mime-type guessed from /// the file's contents. /// [Obsolete("Use Picture(string filename) constructor instead.")] public static Picture CreateFromPath (string filename) { return new Picture (filename); } /// /// Creates a new , populating it with /// the contents of a file. /// /// /// A object containing /// the file abstraction to read the picture from. /// /// /// A new object containing the /// contents of the file and with a mime-type guessed from /// the file's contents. /// [Obsolete("Use Picture(File.IFileAbstraction abstraction) constructor instead.")] public static Picture CreateFromFile (File.IFileAbstraction abstraction) { return new Picture (abstraction); } #endregion #region Public Properties /// /// Gets and sets the mime-type of the picture data /// stored in the current instance. /// /// /// A object containing the mime-type /// of the picture data stored in the current instance. /// public string MimeType { get { return mime_type; } set { mime_type = value; } } /// /// Gets and sets the type of content visible in the picture /// stored in the current instance. /// /// /// A containing the type of /// content visible in the picture stored in the current /// instance. /// public PictureType Type { get { return type; } set { type = value; } } /// /// Gets and sets a description of the picture stored in the /// current instance. /// /// /// A object containing a description /// of the picture stored in the current instance. /// public string Description { get { return description; } set { description = value; } } /// /// Gets and sets the picture data stored in the current /// instance. /// /// /// A object containing the picture /// data stored in the current instance. /// public ByteVector Data { get { return data; } set { data = value; } } #endregion #region Private Methods /// /// Fills in the mime type of the current instance by reading /// the first few bytes of the file. If the format cannot be /// identified, it assumed to be a JPEG file. /// private void FillInMimeFromData () { string mimetype = "image/jpeg"; string ext = "jpg"; if (Data.Count >= 4 && (Data[1] == 'P' && Data[2] == 'N' && Data[3] == 'G')) { mimetype = "image/png"; ext = "png"; } else if (Data.Count >= 3 && (Data[0] == 'G' && Data[1] == 'I' && Data[2] == 'F')) { mimetype = "image/gif"; ext = "gif"; } else if (Data.Count >= 2 && (Data[0] == 'B' && Data[1] == 'M')) { mimetype = "image/bmp"; ext = "bmp"; } MimeType = mimetype; Type = PictureType.FrontCover; Description = "cover." + ext; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/ReadOnlyByteVector.cs0000644000175000017500000001453311462100402024313 0ustar00rubenruben00000000000000// // ReadOnlyByteVector.cs: This class extends ByteVector" to provide an // immutable version. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // namespace TagLib { /// /// This class extends to provide an /// immutable version. /// public sealed class ReadOnlyByteVector : ByteVector { #region Constructors /// /// Constructs and initializes a new instance of with no contents. /// public ReadOnlyByteVector () : base () { } /// /// Constructs and initializes a new instance of of a specified length filled /// with bytes of a specified value. /// /// /// A specifying the number of bytes to /// add to the new instance. /// /// /// A specifying the value to use for the /// bytes added to the new instance. /// public ReadOnlyByteVector (int size, byte value) : base (size, value) { } /// /// Constructs and initializes a new instance of of a specified length filled /// with bytes with a value of zero. /// /// /// A specifying the number of bytes to /// add to the new instance. /// /// /// To specify the value to fill the new instance with, /// use . /// public ReadOnlyByteVector (int size) : this (size, 0) { } /// /// Constructs and initializes a new instance of by copying the contents from /// another instance. /// /// /// A object to copy the values /// from. /// public ReadOnlyByteVector (ByteVector vector) : base (vector) { } /// /// Constructs and initializes a new instance of by copying a specified /// number of bytes from an array. /// /// /// A to copy values from. /// /// /// A specifying the number of bytes to /// copy. /// /// /// If copying the entire contents of an array, use /// . /// public ReadOnlyByteVector (byte [] data, int length) : base (data, length) { } /// /// Constructs and initializes a new instance of by copying the contents of a /// specified array. /// /// /// A to copy values from. /// /// /// To copy only part of the array, use . /// public ReadOnlyByteVector (params byte [] data) : base (data) { } #endregion #region Operators /// /// Implicitly converts a to a new /// . /// /// /// A object to convert. /// /// /// A equivalent to /// . /// public static implicit operator ReadOnlyByteVector (byte value) { return new ReadOnlyByteVector (value); } /// /// Implicitly converts a to a new /// . /// /// /// A object to convert. /// /// /// A equivalent to /// . /// public static implicit operator ReadOnlyByteVector (byte [] value) { return new ReadOnlyByteVector (value); } /// /// Implicitly converts a object to a /// new using the UTF-8 /// encoding. /// /// /// A object to convert. /// /// /// A equivalent to /// . /// public static implicit operator ReadOnlyByteVector (string value) { return new ReadOnlyByteVector (ByteVector.FromString ( value, StringType.UTF8)); } #endregion #region IList /// /// Gets whether or not the current instance is read-only. /// /// /// Always . /// public override bool IsReadOnly { get {return true;} } /// /// Gets whether or not the current instance is fixed size. /// /// /// Always . /// public override bool IsFixedSize { get {return true;} } #endregion } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Asf/0000777000175000017500000000000011503407416020762 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Asf/Guid.cs0000644000175000017500000000731511462100402022170 0ustar00rubenruben00000000000000// // Guid.cs: Provides common GUID values used by ASF Objects. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Asf { /// /// This static class contains common /// values used by ASF Objects. /// public static class Guid { /// /// Indicates that an object is a . /// public static readonly System.Guid AsfContentDescriptionObject = new System.Guid ("75B22633-668E-11CF-A6D9-00AA0062CE6C"); /// /// Indicates that an object is a . /// public static readonly System.Guid AsfExtendedContentDescriptionObject = new System.Guid ("D2D0A440-E307-11D2-97F0-00A0C95EA850"); /// /// Indicates that an object is a . /// public static readonly System.Guid AsfFilePropertiesObject = new System.Guid ("8CABDCA1-A947-11CF-8EE4-00C00C205365"); /// /// Indicates that an object is a . /// public static readonly System.Guid AsfHeaderExtensionObject = new System.Guid ("5FBF03B5-A92E-11CF-8EE3-00C00C205365"); /// /// Indicates that an object is a . /// public static readonly System.Guid AsfHeaderObject = new System.Guid ("75B22630-668E-11CF-A6D9-00AA0062CE6C"); /// /// Indicates that an object is a . /// public static readonly System.Guid AsfMetadataLibraryObject = new System.Guid ("44231C94-9498-49D1-A141-1D134E457054"); /// /// Indicates that an object is a . /// public static readonly System.Guid AsfPaddingObject = new System.Guid ("1806D474-CADF-4509-A4BA-9AABCB96AAE8"); /// /// Indicates that an object is a . /// public static readonly System.Guid AsfStreamPropertiesObject = new System.Guid ("B7DC0791-A9B7-11CF-8EE6-00C00C205365"); /// /// Indicates that a /// contains information about an audio stream. /// public static readonly System.Guid AsfAudioMedia = new System.Guid ("F8699E40-5B4D-11CF-A8FD-00805F5C442B"); /// /// Indicates that a /// contains information about an video stream. /// public static readonly System.Guid AsfVideoMedia = new System.Guid ("BC19EFC0-5B4D-11CF-A8FD-00805F5C442B"); /// /// Indicates a placeholder portion of a file is correctly /// encoded. /// public static readonly System.Guid AsfReserved1 = new System.Guid ("ABD3D211-A9BA-11cf-8EE6-00C00C205365"); } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Asf/HeaderExtensionObject.cs0000644000175000017500000001160311462100402025507 0ustar00rubenruben00000000000000// // HeaderExtensionObject.cs: Provides a representation of an ASF Header // Extension object which can be read from and written to disk. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections.Generic; using System; namespace TagLib.Asf { /// /// This class extends to provide a /// representation of an ASF Header Extension object which can be /// read from and written to disk. /// public class HeaderExtensionObject : Object { #region Private Fields /// /// Contains the child objects. /// private List children = new List (); #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading the contents /// from a specified position in a specified file. /// /// /// A object containing the file from /// which the contents of the new instance are to be read. /// /// /// A value specify at what position to /// read the object. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// /// /// The object read from disk does not have the correct GUID /// or contents. /// public HeaderExtensionObject (Asf.File file, long position) : base (file, position) { if (!Guid.Equals (Asf.Guid.AsfHeaderExtensionObject)) throw new CorruptFileException ( "Object GUID incorrect."); if (file.ReadGuid () != Asf.Guid.AsfReserved1) throw new CorruptFileException ( "Reserved1 GUID expected."); if (file.ReadWord () != 6) throw new CorruptFileException ( "Invalid reserved WORD. Expected '6'."); uint size_remaining = file.ReadDWord (); position += 0x170 / 8; while (size_remaining > 0) { Object obj = file.ReadObject (position); position += (long) obj.OriginalSize; size_remaining -= (uint) obj.OriginalSize; children.Add (obj); } } #endregion #region Public Properties /// /// Gets the child objects contained in the current instance. /// /// /// A object enumerating /// through the children of the current instance. /// public IEnumerable Children { get {return children;} } #endregion #region Public Methods /// /// Renders the current instance as a raw ASF object. /// /// /// A object containing the /// rendered version of the current instance. /// public override ByteVector Render () { ByteVector output = new ByteVector (); foreach (Object child in children) output.Add (child.Render ()); output.Insert (0, RenderDWord ((uint) output.Count)); output.Insert (0, RenderWord (6)); output.Insert (0, Asf.Guid.AsfReserved1.ToByteArray ()); return Render (output); } /// /// Adds a child object to the current instance. /// /// /// A object to add to the current /// instance. /// public void AddObject (Object obj) { children.Add (obj); } /// /// Adds a child unique child object to the current instance, /// replacing and existing child if present. /// /// /// A object to add to the current /// instance. /// public void AddUniqueObject (Object obj) { for (int i = 0; i < children.Count; i ++) if (((Object) children [i]).Guid == obj.Guid) { children [i] = obj; return; } children.Add (obj); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Asf/File.cs0000644000175000017500000003062411462100402022156 0ustar00rubenruben00000000000000// // File.cs: Provides tagging and properties support for Microsoft's ASF files. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Asf { /// /// This class extends to provide tagging /// and properties support for Microsoft's ASF files. /// [SupportedMimeType("taglib/wma", "wma")] [SupportedMimeType("taglib/wmv", "wmv")] [SupportedMimeType("taglib/asf", "asf")] [SupportedMimeType("audio/x-ms-wma")] [SupportedMimeType("audio/x-ms-asf")] [SupportedMimeType("video/x-ms-asf")] public class File : TagLib.File { #region Private Fields /// /// Contains the file's tag. /// private Asf.Tag asf_tag = null; /// /// Contains the file's properties. /// private Properties properties = null; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : base (path) { Read (propertiesStyle); } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system with an average read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : this (path, ReadStyle.Average) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction) { Read (propertiesStyle); } /// /// Constructs and initializes a new instance of for a specified file abstraction with an /// average read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// public File (File.IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) { } #endregion #region Public Properties /// /// Gets a abstract representation of all tags stored in the /// current instance. /// /// /// A object representing all tags /// stored in the current instance. /// public override TagLib.Tag Tag { get {return asf_tag;} } /// /// Gets the media properties of the file represented by the /// current instance. /// /// /// A object containing the /// media properties of the file represented by the current /// instance. /// public override TagLib.Properties Properties { get {return properties;} } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { Mode = AccessMode.Write; try { HeaderObject header = new HeaderObject (this, 0); if (asf_tag == null) { header.RemoveContentDescriptors (); TagTypesOnDisk &= ~ TagTypes.Asf; } else { TagTypesOnDisk |= TagTypes.Asf; header.AddUniqueObject ( asf_tag.ContentDescriptionObject); header.AddUniqueObject ( asf_tag.ExtendedContentDescriptionObject); header.Extension.AddUniqueObject ( asf_tag.MetadataLibraryObject); } ByteVector output = header.Render (); long diff = output.Count - (long) header.OriginalSize; Insert (output, 0, (long) header.OriginalSize); InvariantStartPosition += diff; InvariantEndPosition += diff; } finally { Mode = AccessMode.Closed; } } /// /// Gets a tag of a specified type from the current instance, /// optionally creating a new tag if possible. /// /// /// A value indicating the /// type of tag to read. /// /// /// A value specifying whether or not to /// try and create the tag if one is not found. /// /// /// A object containing the tag that was /// found in or added to the current instance. If no /// matching tag was found and none was created, is returned. /// public override TagLib.Tag GetTag (TagTypes type, bool create) { if (type == TagTypes.Asf) return asf_tag; return null; } /// /// Removes a set of tag types from the current instance. /// /// /// A bitwise combined value /// containing tag types to be removed from the file. /// /// /// In order to remove all tags from a file, pass as . /// public override void RemoveTags (TagTypes types) { if ((types & TagTypes.Asf) == TagTypes.Asf) asf_tag.Clear (); } /// /// Reads a 2-byte WORD from the current instance. /// /// /// A value containing the WORD read /// from the current instance. /// public ushort ReadWord () { return ReadBlock (2).ToUShort (false); } /// /// Reads a 4-byte DWORD from the current instance. /// /// /// A value containing the DWORD read /// from the current instance. /// public uint ReadDWord () { return ReadBlock (4).ToUInt (false); } /// /// Reads a 8-byte QWORD from the current instance. /// /// /// A value containing the QWORD read /// from the current instance. /// public ulong ReadQWord () { return ReadBlock (8).ToULong (false); } /// /// Reads a 16-byte GUID from the current instance. /// /// /// A value containing the GUID /// read from the current instance. /// public System.Guid ReadGuid () { return new System.Guid (ReadBlock (16).Data); } /// /// Reads a Unicode (UTF-16LE) string of specified length /// from the current instance. /// /// /// A value specifying the number of bytes /// to read. This should always be an even number. /// /// /// A object containing the Unicode /// string read from the current instance. /// public string ReadUnicode (int length) { ByteVector data = ReadBlock (length); string output = data.ToString (StringType.UTF16LE); int i = output.IndexOf ('\0'); return (i >= 0) ? output.Substring (0, i) : output; } /// /// Reads a collection of objects from the current instance. /// /// /// A value specifying the number of /// objects to read. /// /// /// A value specifying the seek position /// at which to start reading. /// /// /// A new object enumerating /// through the objects read from the /// current instance. /// public IEnumerable ReadObjects (uint count, long position) { for (int i = 0; i < (int) count; i ++) { Object obj = ReadObject (position); position += (long) obj.OriginalSize; yield return obj; } } /// /// Reads a from the current instance. /// /// /// A value specifying the seek position /// at which to start reading. /// /// /// A new object of appropriate type as /// read from the current instance. /// public Object ReadObject (long position) { Seek (position); System.Guid id = ReadGuid (); if (id.Equals (Guid.AsfFilePropertiesObject)) return new FilePropertiesObject (this, position); if (id.Equals (Guid.AsfStreamPropertiesObject)) return new StreamPropertiesObject (this, position); if (id.Equals (Guid.AsfContentDescriptionObject)) return new ContentDescriptionObject (this, position); if (id.Equals ( Guid.AsfExtendedContentDescriptionObject)) return new ExtendedContentDescriptionObject ( this, position); if (id.Equals (Guid.AsfPaddingObject)) return new PaddingObject (this, position); if (id.Equals (Guid.AsfHeaderExtensionObject)) return new HeaderExtensionObject (this, position); if (id.Equals (Guid.AsfMetadataLibraryObject)) return new MetadataLibraryObject (this, position); return new UnknownObject (this, position); } #endregion #region Private Methods /// /// Reads the contents of the current instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// private void Read (ReadStyle propertiesStyle) { Mode = AccessMode.Read; try { HeaderObject header = new HeaderObject (this, 0); if (header.HasContentDescriptors) TagTypesOnDisk |= TagTypes.Asf; asf_tag = new Asf.Tag (header); InvariantStartPosition = (long) header.OriginalSize; InvariantEndPosition = Length; if (propertiesStyle != ReadStyle.None) properties = header.Properties; } finally { Mode = AccessMode.Closed; } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Asf/PaddingObject.cs0000644000175000017500000000746211462100402024000 0ustar00rubenruben00000000000000// // PaddingObject.cs: Provides a representation of an ASF Padding object which // can be read from and written to disk. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Asf { /// /// This class extends to provide a /// representation of an ASF Padding object which can be read from /// and written to disk. /// public class PaddingObject : Object { #region Private Fields /// /// Contains the size of the current instance. /// private ulong size; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading the contents from a /// specified position in a specified file. /// /// /// A object containing the file from /// which the contents of the new instance are to be read. /// /// /// A value specify at what position to /// read the object. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// /// /// The object read from disk does not have the correct GUID /// or smaller than the minimum size. /// public PaddingObject (Asf.File file, long position) : base (file, position) { if (!Guid.Equals (Asf.Guid.AsfPaddingObject)) throw new CorruptFileException ( "Object GUID incorrect."); if (OriginalSize < 24) throw new CorruptFileException ( "Object size too small."); size = OriginalSize; } /// /// Constructs and initializes a new instance of of a specified size. /// /// /// A value specifying the number of /// bytes the new instance is to take up on disk. /// public PaddingObject (uint size) : base (Asf.Guid.AsfPaddingObject) { this.size = size; } #endregion #region Prublic Properties /// /// Gets and sets the number of bytes the current instance /// will take up on disk. /// /// /// A value containing the size of the /// current instance on disk. /// public ulong Size { get {return size;} set {size = value;} } #endregion #region Public Methods /// /// Renders the current instance as a raw ASF object. /// /// /// A object containing the /// rendered version of the current instance. /// public override ByteVector Render () { return Render (new ByteVector ((int) (size - 24))); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Asf/ExtendedContentDescriptionObject.cs0000644000175000017500000002016511462100402027724 0ustar00rubenruben00000000000000// // ExtendedContentDescriptionObject.cs: Provides a representation of an ASF // Extended Content Description object which can be read from and written to // disk. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Asf { /// /// This class extends to provide a /// representation of an ASF Extended Content Description object /// which can be read from and written to disk. /// public class ExtendedContentDescriptionObject : Object, IEnumerable { #region Private Fields /// /// Contains the content descriptors. /// private List descriptors = new List (); #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading the /// contents from a specified position in a specified file. /// /// /// A object containing the file from /// which the contents of the new instance are to be read. /// /// /// A value specify at what position to /// read the object. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// /// /// The object read from disk does not have the correct GUID /// or smaller than the minimum size. /// public ExtendedContentDescriptionObject (Asf.File file, long position) : base (file, position) { if (!Guid.Equals ( Asf.Guid.AsfExtendedContentDescriptionObject)) throw new CorruptFileException ( "Object GUID incorrect."); if (OriginalSize < 26) throw new CorruptFileException ( "Object size too small."); ushort count = file.ReadWord (); for (ushort i = 0; i < count; i ++) AddDescriptor (new ContentDescriptor (file)); } /// /// Constructs and initializes a new instance of with no /// contents. /// public ExtendedContentDescriptionObject () : base (Asf.Guid.AsfExtendedContentDescriptionObject) { } #endregion #region Public Properties /// /// Gets whether or not the current instance is empty. /// /// /// if the current instance doesn't /// contain any objects. /// Otherwise . /// public bool IsEmpty { get {return descriptors.Count == 0;} } #endregion #region Public Methods /// /// Renders the current instance as a raw ASF object. /// /// /// A object containing the /// rendered version of the current instance. /// public override ByteVector Render () { ByteVector output = new ByteVector (); ushort count = 0; foreach (ContentDescriptor desc in descriptors) { count ++; output.Add (desc.Render ()); } return Render (RenderWord (count) + output); } /// /// Removes all descriptors with a given name from the /// current instance. /// /// /// A object containing the name of the /// descriptors to be removed. /// public void RemoveDescriptors (string name) { for (int i = descriptors.Count - 1; i >= 0; i --) if (name == descriptors [i].Name) descriptors.RemoveAt (i); } /// /// Gets all descriptors with any of a collection of names /// from the current instance. /// /// /// A containing the names of the /// descriptors to be retrieved. /// /// /// is . /// /// /// A object enumerating /// through the objects /// retrieved from the current instance. /// public IEnumerable GetDescriptors (params string [] names) { if (names == null) throw new ArgumentNullException ("names"); foreach (string name in names) foreach (ContentDescriptor desc in descriptors) if (desc.Name == name) yield return desc; } /// /// Adds a descriptor to the current instance. /// /// /// A object to add to the /// current instance. /// /// /// is . /// public void AddDescriptor (ContentDescriptor descriptor) { if (descriptor == null) throw new ArgumentNullException ("descriptor"); descriptors.Add (descriptor); } /// /// Sets the a collection of desciptors for a given name, /// removing the existing matching records. /// /// /// A object containing the name of the /// descriptors to be added. /// /// /// A containing /// descriptors to add to the new instance. /// /// /// is . /// /// /// All added entries in /// should match but it is not /// verified by the method. The descriptors will be added /// with their own names and not the one provided in this /// method, which are used for removing existing values and /// determining where to position the new objects. /// public void SetDescriptors (string name, params ContentDescriptor [] descriptors) { if (name == null) throw new ArgumentNullException ("name"); int position = this.descriptors.Count; for (int i = this.descriptors.Count - 1; i >= 0; i --) { if (name == this.descriptors [i].Name) { this.descriptors.RemoveAt (i); position = i; } } this.descriptors.InsertRange (position, descriptors); } #endregion #region IEnumerable /// /// Gets an enumerator for enumerating through the content /// descriptors. /// /// /// A for /// enumerating through the content descriptors. /// public IEnumerator GetEnumerator () { return descriptors.GetEnumerator (); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () { return descriptors.GetEnumerator (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Asf/MetadataLibraryObject.cs0000644000175000017500000002202411462100402025466 0ustar00rubenruben00000000000000// // MetadataLibraryObject.cs: Provides a representation of an ASF Metadata // Library object which can be read from and written to disk. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Asf { /// /// This class extends to provide a /// representation of an ASF Metadata Library object which can be /// read from and written to disk. /// public class MetadataLibraryObject : Object, IEnumerable { #region Private Fields /// /// Contains the description records. /// private List records = new List (); #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading the contents /// from a specified position in a specified file. /// /// /// A object containing the file from /// which the contents of the new instance are to be read. /// /// /// A value specify at what position to /// read the object. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// /// /// The object read from disk does not have the correct GUID /// or smaller than the minimum size. /// public MetadataLibraryObject (Asf.File file, long position) : base (file, position) { if (!Guid.Equals (Asf.Guid.AsfMetadataLibraryObject)) throw new CorruptFileException ( "Object GUID incorrect."); if (OriginalSize < 26) throw new CorruptFileException ( "Object size too small."); ushort count = file.ReadWord (); for (ushort i = 0; i < count; i ++) { DescriptionRecord rec = new DescriptionRecord ( file); AddRecord (rec); } } /// /// Constructs and initializes a new instance of with no contents. /// public MetadataLibraryObject () : base (Asf.Guid.AsfMetadataLibraryObject) { } #endregion #region Public Properties /// /// Gets whether or not the current instance is empty. /// /// /// if the current instance doesn't /// contain any objects. /// Otherwise . /// public bool IsEmpty { get {return records.Count == 0;} } #endregion #region Public Methods /// /// Renders the current instance as a raw ASF object. /// /// /// A object containing the /// rendered version of the current instance. /// public override ByteVector Render () { ByteVector output = new ByteVector (); ushort count = 0; foreach (DescriptionRecord rec in records) { count ++; output.Add (rec.Render ()); } return Render (RenderWord (count) + output); } /// /// Removes all records with a given language, stream, and /// name from the current instance. /// /// /// A value containing the language /// list index of the records to be removed. /// /// /// A value containing the stream /// number of the records to be removed. /// /// /// A object containing the name of the /// records to be removed. /// public void RemoveRecords (ushort languageListIndex, ushort streamNumber, string name) { for (int i = records.Count - 1; i >= 0; i --) { DescriptionRecord rec = records [i]; if (rec.LanguageListIndex == languageListIndex && rec.StreamNumber == streamNumber && rec.Name == name) records.RemoveAt (i); } } /// /// Gets all records with a given language, stream, and any /// of a collection of names from the current instance. /// /// /// A value containing the language /// list index of the records to be retrieved. /// /// /// A value containing the stream /// number of the records to be retrieved. /// /// /// A containing the names of the /// records to be retrieved. /// /// /// A object enumerating /// through the objects /// retrieved from the current instance. /// public IEnumerable GetRecords (ushort languageListIndex, ushort streamNumber, params string [] names) { foreach (DescriptionRecord rec in records) { if (rec.LanguageListIndex != languageListIndex || rec.StreamNumber != streamNumber) continue; foreach (string name in names) if (rec.Name == name) yield return rec; } } /// /// Adds a record to the current instance. /// /// /// A object to add to the /// current instance. /// public void AddRecord (DescriptionRecord record) { records.Add (record); } /// /// Sets the a collection of records for a given language, /// stream, and name, removing the existing matching records. /// /// /// A value containing the language /// list index of the records to be added. /// /// /// A value containing the stream /// number of the records to be added. /// /// /// A object containing the name of the /// records to be added. /// /// /// A containing records /// to add to the new instance. /// /// /// All added entries in should /// match , and but /// it is not verified by the method. The records will be /// added with their own values and not those provided in /// this method, which are used for removing existing values /// and determining where to position the new object. /// public void SetRecords (ushort languageListIndex, ushort streamNumber, string name, params DescriptionRecord [] records) { int position = this.records.Count; for (int i = this.records.Count - 1; i >= 0; i --) { DescriptionRecord rec = this.records [i]; if (rec.LanguageListIndex == languageListIndex && rec.StreamNumber == streamNumber && rec.Name == name) { this.records.RemoveAt (i); position = i; } } this.records.InsertRange (position, records); } #endregion #region IEnumerable /// /// Gets an enumerator for enumerating through the /// description records. /// /// /// A for /// enumerating through the description records. /// public IEnumerator GetEnumerator () { return records.GetEnumerator (); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () { return records.GetEnumerator (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Asf/UnknownObject.cs0000644000175000017500000000570611462100402024070 0ustar00rubenruben00000000000000// // UnknownObject.cs: Provides a simple and generic representation of an object // not identified by TagLib# so that its contents may be preserved. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Asf { /// /// This class extends to provide a /// representation of an unknown object which can be read from and /// written to disk. /// public class UnknownObject : Object { #region Private Fields private ByteVector data; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading the contents from a /// specified position in a specified file. /// /// /// A object containing the file from /// which the contents of the new instance are to be read. /// /// /// A value specify at what position to /// read the object. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// public UnknownObject (Asf.File file, long position) : base (file, position) { data = file.ReadBlock ((int) (OriginalSize - 24)); } #endregion #region Public Properties /// /// Gets and sets the data contained in the current instance. /// /// /// A object containing the data /// contained in the current instance. /// public ByteVector Data { get {return data;} set {data = value;} } #endregion #region Public Methods /// /// Renders the current instance as a raw ASF object. /// /// /// A object containing the /// rendered version of the current instance. /// public override ByteVector Render () { return Render (data); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Asf/Tag.cs0000644000175000017500000012237311462100402022015 0ustar00rubenruben00000000000000// // Tag.cs: Provides a representation of an ASF tag which can be read from and // written to disk. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2005-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using System.Globalization; namespace TagLib.Asf { /// /// This class extends to provide a /// representation of an ASF tag which can be read from and written /// to disk. /// public class Tag : TagLib.Tag, IEnumerable { #region Private Fields /// /// Contains the content description object. /// private ContentDescriptionObject description = new ContentDescriptionObject (); /// /// Contains the extended content description object. /// private ExtendedContentDescriptionObject ext_description = new ExtendedContentDescriptionObject (); /// /// Contains the metadata library object. /// private MetadataLibraryObject metadata_library = new MetadataLibraryObject (); #endregion #region Constructors /// /// Constructs and initializes a new instance of with no contents. /// public Tag () { } /// /// Constructs and initializes a new instance of using the children of a object. /// /// /// A object whose children are /// are to be used by the new instance. /// /// /// is . /// public Tag (HeaderObject header) { if (header == null) throw new ArgumentNullException ("header"); foreach (Object child in header.Children) { if (child is ContentDescriptionObject) description = child as ContentDescriptionObject; if (child is ExtendedContentDescriptionObject) ext_description = child as ExtendedContentDescriptionObject; } foreach (Object child in header.Extension.Children) if (child is MetadataLibraryObject) metadata_library = child as MetadataLibraryObject; } #endregion #region Public Properties /// /// Gets the ASF Content Description object used by the /// current instance. /// /// /// A object /// containing the ASF Content Description object used by the /// current instance. /// public ContentDescriptionObject ContentDescriptionObject { get {return description;} } /// /// Gets the ASF Extended Content Description object used by /// the current instance. /// /// /// A object /// containing the ASF Extended Content Description object /// used by the current instance. /// public ExtendedContentDescriptionObject ExtendedContentDescriptionObject { get {return ext_description;} } /// /// Gets the ASF Metadata Library object used by the current /// instance. /// /// /// A object containing /// the ASF Metadata Library object used by the current /// instance. /// public MetadataLibraryObject MetadataLibraryObject { get {return metadata_library;} } #endregion #region Public Methods /// /// Gets the string contained in a specific descriptor in the /// current instance. /// /// /// A containing the names of the /// descriptors to look for the value in. /// /// /// is . /// /// /// A object containing the contents of /// the first descriptor found in the current instance. /// public string GetDescriptorString (params string [] names) { if (names == null) throw new ArgumentNullException ("names"); foreach (ContentDescriptor desc in GetDescriptors (names)) { if (desc == null || desc.Type != DataType.Unicode) continue; string value = desc.ToString (); if (value != null) return value; } return null; } /// /// Gets the strings contained in a specific descriptor in /// the current instance. /// /// /// A containing the names of the /// descriptors to look for the value in. /// /// /// is . /// /// /// A object containing the contents of /// the first descriptor found in the current instance as /// split by ';'. /// public string [] GetDescriptorStrings (params string [] names) { if (names == null) throw new ArgumentNullException ("names"); return SplitAndClean (GetDescriptorString (names)); } /// /// Sets the string for a collection of descriptors in the /// current instance. /// /// /// A object containing the value to /// store, or to clear the value. /// /// /// A containing the names in which /// the value would be expected. For example, "WM/AlbumTitle" /// and "Album". /// /// /// is . /// /// /// The value will be stored in the first value in and the rest will be cleared. /// public void SetDescriptorString (string value, params string [] names) { if (names == null) throw new ArgumentNullException ("names"); int index = 0; if (value != null && value.Trim ().Length != 0) { SetDescriptors (names [0], new ContentDescriptor (names [0], value)); index ++; } for (; index < names.Length; index ++) RemoveDescriptors (names [index]); } /// /// Sets the strings for a collection of descriptors in the /// current instance. /// /// /// A containing the value to store, /// or to clear the value. /// /// /// A containing the names in which /// the value would be expected. For example, "WM/AlbumTitle" /// and "Album". /// /// /// is . /// /// /// The value will be stored in the first value in and the rest will be cleared. /// public void SetDescriptorStrings (string [] value, params string [] names) { if (names == null) throw new ArgumentNullException ("names"); SetDescriptorString (String.Join ("; ", value), names); } /// /// Removes all descriptors with a specified name from the /// current instance. /// /// /// A object containing the name of the /// descriptor to remove from the current instance. /// /// /// is . /// public void RemoveDescriptors (string name) { if (name == null) throw new ArgumentNullException ("name"); ext_description.RemoveDescriptors (name); } /// /// Gets all descriptors with any of a collection of names /// from the current instance. /// /// /// A containing the names of the /// descriptors to be retrieved. /// /// /// is . /// /// /// A object enumerating /// through the objects /// retrieved from the current instance. /// public IEnumerable GetDescriptors (params string [] names) { if (names == null) throw new ArgumentNullException ("names"); return ext_description.GetDescriptors (names); } /// /// Sets the a collection of desciptors for a given name, /// removing the existing matching records. /// /// /// A object containing the name of the /// descriptors to be added. /// /// /// A containing /// descriptors to add to the new instance. /// /// /// is . /// /// /// All added entries in /// should match but it is not /// verified by the method. The descriptors will be added /// with their own names and not the one provided in this /// method, which are used for removing existing values and /// determining where to position the new objects. /// public void SetDescriptors (string name, params ContentDescriptor [] descriptors) { if (name == null) throw new ArgumentNullException ("name"); ext_description.SetDescriptors (name, descriptors); } /// /// Adds a descriptor to the current instance. /// /// /// A object to add to the /// current instance. /// /// /// is . /// public void AddDescriptor (ContentDescriptor descriptor) { if (descriptor == null) throw new ArgumentNullException ("descriptor"); ext_description.AddDescriptor (descriptor); } #endregion #region Private Static Methods /// /// Converts a raw ASF picture into an object. /// /// /// A object containing raw ASF /// picture data. /// /// /// A object to read from the raw /// data. /// private static IPicture PictureFromData (ByteVector data) { if (data.Count < 9) return null; int offset = 0; Picture p = new Picture (); // Get the picture type: p.Type = (PictureType) data [offset]; offset += 1; // Get the picture size: int size = (int) data.Mid (offset, 4).ToUInt (false); offset += 4; // Get the mime-type: int found = data.Find (ByteVector.TextDelimiter ( StringType.UTF16LE), offset, 2); if (found < 0) return null; p.MimeType = data.ToString (StringType.UTF16LE, offset, found - offset); offset = found + 2; // Get the description: found = data.Find (ByteVector.TextDelimiter ( StringType.UTF16LE), offset, 2); if (found < 0) return null; p.Description = data.ToString (StringType.UTF16LE, offset, found - offset); offset = found + 2; p.Data = data.Mid (offset, size); return p; } /// /// Converts a object into raw ASF /// picture data. /// /// /// A object to convert. /// /// /// A object containing raw ASF /// picture data. /// private static ByteVector PictureToData (IPicture picture) { ByteVector v = new ByteVector ((byte) picture.Type); v.Add (Object.RenderDWord ((uint) picture.Data.Count)); v.Add (Object.RenderUnicode (picture.MimeType)); v.Add (Object.RenderUnicode (picture.Description)); v.Add (picture.Data); return v; } /// /// Splits a string into a collection of strings by ';'. /// /// /// A object containing the text to /// split. /// /// /// A containing the split text. /// private static string [] SplitAndClean (string s) { if (s == null || s.Trim ().Length == 0) return new string [0]; string [] result = s.Split (';'); for (int i = 0; i < result.Length; i ++) result [i] = result [i].Trim (); return result; } #endregion #region IEnumerable /// /// Gets an enumerator for enumerating through the content /// descriptors. /// /// /// A for /// enumerating through the content descriptors. /// public IEnumerator GetEnumerator () { return ext_description.GetEnumerator (); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () { return ext_description.GetEnumerator (); } #endregion #region TagLib.Tag /// /// Gets the tag types contained in the current instance. /// /// /// Always . /// public override TagTypes TagTypes { get {return TagTypes.Asf;} } /// /// Gets and sets the title for the media described by the /// current instance. /// /// /// A object containing the title for /// the media described by the current instance or if no value is present. /// /// /// This property is implemented using the title stored in /// the ASF Content Description Object. /// public override string Title { get {return description.Title;} set {description.Title = value;} } /// /// Gets and sets the sort names for the Track Title of /// the media described by the current instance. /// /// /// A containing the sort name of /// the Track Title of the media described by the current /// instance or null if no value is present. /// /// /// This property is implemented using the "WM/TitleSortOrder" /// field. /// http://msdn.microsoft.com/en-us/library/aa386866(VS.85).aspx /// public override string TitleSort { get { return GetDescriptorString ("WM/TitleSortOrder"); } set { SetDescriptorString (value, "WM/TitleSortOrder"); } } /// /// Gets and sets the performers or artists who performed in /// the media described by the current instance. /// /// /// A containing the performers or /// artists who performed in the media described by the /// current instance or an empty array if no value is /// present. /// /// /// This property is implemented using the author stored in /// the ASF Content Description Object. /// public override string [] Performers { get {return SplitAndClean (description.Author);} set {description.Author = string.Join ("; ", value);} } /// /// Gets and sets the sort names of the performers or artists /// who performed in the media described by the current instance. /// /// /// A containing the sort names for /// the performers or artists who performed in the media /// described by the current instance, or an empty array if /// no value is present. /// /// /// This property is implemented using the "WM/ArtistSortOrder" field. /// http://msdn.microsoft.com/en-us/library/aa386866(VS.85).aspx /// public override string [] PerformersSort { get { return GetDescriptorStrings ("WM/ArtistSortOrder"); } set { SetDescriptorStrings (value, "WM/ArtistSortOrder"); } } /// /// Gets and sets the band or artist who is credited in the /// creation of the entire album or collection containing the /// media described by the current instance. /// /// /// A containing the band or artist /// who is credited in the creation of the entire album or /// collection containing the media described by the current /// instance or an empty array if no value is present. /// /// /// This property is implemented using the "WM/AlbumArtist" /// and "AlbumArtist" Content Descriptors. /// public override string [] AlbumArtists { get { return GetDescriptorStrings ("WM/AlbumArtist", "AlbumArtist"); } set { SetDescriptorStrings (value, "WM/AlbumArtist", "AlbumArtist"); } } /// /// Gets and sets the sort names for the band or artist who /// is credited in the creation of the entire album or /// collection containing the media described by the /// current instance. /// /// /// A containing the sort names /// for the band or artist who is credited in the creation /// of the entire album or collection containing the media /// described by the current instance or an empty array if /// no value is present. /// /// /// This property is implemented using the "WM/AlbumArtistSortOrder" /// field. /// http://msdn.microsoft.com/en-us/library/aa386866(VS.85).aspx /// public override string [] AlbumArtistsSort { get { return GetDescriptorStrings ("WM/AlbumArtistSortOrder"); } set { SetDescriptorStrings (value, "WM/AlbumArtistSortOrder"); } } /// /// Gets and sets the composers of the media represented by /// the current instance. /// /// /// A containing the composers of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This property is implemented using the "WM/Composer" /// and "Composer" Content Descriptors. /// public override string [] Composers { get { return GetDescriptorStrings ("WM/Composer", "Composer"); } set { SetDescriptorStrings (value, "WM/Composer", "Composer"); } } /// /// Gets and sets the album of the media represented by the /// current instance. /// /// /// A object containing the album of /// the media represented by the current instance or if no value is present. /// /// /// This property is implemented using the "WM/AlbumTitle" /// and "Album" Content Descriptors. /// public override string Album { get { return GetDescriptorString ("WM/AlbumTitle", "Album"); } set { SetDescriptorString (value, "WM/AlbumTitle", "Album"); } } /// /// Gets and sets the sort names for the Album Title of /// the media described by the current instance. /// /// /// A containing the sort name of /// the Album Title of the media described by the current /// instance or null if no value is present. /// /// /// This property is implemented using the "WM/AlbumSortOrder" /// field. /// http://msdn.microsoft.com/en-us/library/aa386866(VS.85).aspx /// public override string AlbumSort { get { return GetDescriptorString ("WM/AlbumSortOrder"); } set { SetDescriptorString (value, "WM/AlbumSortOrder"); } } /// /// Gets and sets a user comment on the media represented by /// the current instance. /// /// /// A object containing user comments /// on the media represented by the current instance or if no value is present. /// /// /// This property is implemented using the description stored /// in the ASF Content Description Object. /// public override string Comment { get {return description.Description;} set {description.Description = value;} } /// /// Gets and sets the genres of the media represented by the /// current instance. /// /// /// A containing the genres of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This property is implemented using the "WM/Genre", /// "WM/GenreID", and "Genre" Content Descriptors. /// public override string [] Genres { get { string value = GetDescriptorString ("WM/Genre", "WM/GenreID", "Genre"); if (value == null || value.Trim ().Length == 0) return new string [] {}; string [] result = value.Split (';'); for (int i = 0; i < result.Length; i ++) { string genre = result [i].Trim (); byte genre_id; int closing = genre.IndexOf (')'); if (closing > 0 && genre[0] == '(' && byte.TryParse (genre.Substring ( 1, closing - 1), out genre_id)) genre = TagLib.Genres .IndexToAudio (genre_id); result [i] = genre; } return result; } set { SetDescriptorString (String.Join ("; ", value), "WM/Genre", "Genre", "WM/GenreID"); } } /// /// Gets and sets the year that the media represented by the /// current instance was recorded. /// /// /// A containing the year that the media /// represented by the current instance was created or zero /// if no value is present. /// /// /// This property is implemented using the "WM/Year" Content /// Descriptor. /// public override uint Year { get { string text = GetDescriptorString ("WM/Year"); if (text == null || text.Length < 4) return 0; uint value; if (uint.TryParse (text.Substring (0, 4), NumberStyles.Integer, CultureInfo.InvariantCulture, out value)) return value; return 0; } set { if (value == 0) { RemoveDescriptors ("WM/Year"); return; } SetDescriptorString ( value.ToString ( CultureInfo.InvariantCulture), "WM/Year"); } } /// /// Gets and sets the position of the media represented by /// the current instance in its containing album. /// /// /// A containing the position of the /// media represented by the current instance in its /// containing album or zero if not specified. /// /// /// This property is implemented using the "WM/TrackNumber" /// Content Descriptor. /// public override uint Track { get { foreach (ContentDescriptor desc in GetDescriptors ("WM/TrackNumber")) { uint value = desc.ToDWord (); if (value != 0) return value; } return 0; } set { if (value == 0) RemoveDescriptors ("WM/TrackNumber"); else SetDescriptors ("WM/TrackNumber", new ContentDescriptor ( "WM/TrackNumber", value)); } } /// /// Gets and sets the number of tracks in the album /// containing the media represented by the current instance. /// /// /// A containing the number of tracks in /// the album containing the media represented by the current /// instance or zero if not specified. /// /// /// This property is implemented using the "TrackTotal" /// Content Descriptor. /// public override uint TrackCount { get { foreach (ContentDescriptor desc in GetDescriptors ("TrackTotal")) { uint value = desc.ToDWord (); if (value != 0) return value; } return 0; } set { if (value == 0) RemoveDescriptors ("TrackTotal"); else SetDescriptors ("TrackTotal", new ContentDescriptor ( "TrackTotal", value)); } } /// /// Gets and sets the number of the disc containing the media /// represented by the current instance in the boxed set. /// /// /// A containing the number of the disc /// containing the media represented by the current instance /// in the boxed set. /// /// /// This property is implemented using the "WM/PartOfSet" /// Content Descriptor. /// public override uint Disc { get { string text = GetDescriptorString ( "WM/PartOfSet"); if (text == null) return 0; string [] texts = text.Split ('/'); uint value; if (texts.Length < 1) return 0; return uint.TryParse (texts [0], NumberStyles.Integer, CultureInfo.InvariantCulture, out value) ? value : 0; } set { uint count = DiscCount; if (value == 0 && count == 0) { RemoveDescriptors ("WM/PartOfSet"); return; } if (count != 0) { SetDescriptorString (string.Format ( CultureInfo.InvariantCulture, "{0}/{1}", value, count), "WM/PartOfSet"); return; } SetDescriptorString (value.ToString ( CultureInfo.InvariantCulture), "WM/PartOfSet"); } } /// /// Gets and sets the number of discs in the boxed set /// containing the media represented by the current instance. /// /// /// A containing the number of discs in /// the boxed set containing the media represented by the /// current instance or zero if not specified. /// /// /// This property is implemented using the "WM/PartOfSet" /// Content Descriptor. /// public override uint DiscCount { get { string text = GetDescriptorString ( "WM/PartOfSet"); if (text == null) return 0; string [] texts = text.Split ('/'); uint value; if (texts.Length < 2) return 0; return uint.TryParse (texts [1], NumberStyles.Integer, CultureInfo.InvariantCulture, out value) ? value : 0; } set { uint disc = Disc; if (disc == 0 && value == 0) { RemoveDescriptors ("WM/PartOfSet"); return; } if (value != 0) { SetDescriptorString (string.Format ( CultureInfo.InvariantCulture, "{0}/{1}", disc, value), "WM/PartOfSet"); return; } SetDescriptorString (disc.ToString ( CultureInfo.InvariantCulture), "WM/PartOfSet"); } } /// /// Gets and sets the lyrics or script of the media /// represented by the current instance. /// /// /// A object containing the lyrics or /// script of the media represented by the current instance /// or if no value is present. /// /// /// This property is implemented using the "WM/Lyrics" /// Content Descriptor. /// public override string Lyrics { get {return GetDescriptorString ("WM/Lyrics");} set {SetDescriptorString (value, "WM/Lyrics");} } /// /// Gets and sets the grouping on the album which the media /// in the current instance belongs to. /// /// /// A object containing the grouping on /// the album which the media in the current instance belongs /// to or if no value is present. /// /// /// This property is implemented using the /// "WM/ContentGroupDescription" Content Descriptor. /// public override string Grouping { get { return GetDescriptorString ( "WM/ContentGroupDescription"); } set { SetDescriptorString (value, "WM/ContentGroupDescription"); } } /// /// Gets and sets the number of beats per minute in the audio /// of the media represented by the current instance. /// /// /// A containing the number of beats per /// minute in the audio of the media represented by the /// current instance, or zero if not specified. /// /// /// This property is implemented using the /// "WM/BeatsPerMinute" Content Descriptor. /// public override uint BeatsPerMinute { get { foreach (ContentDescriptor desc in GetDescriptors ("WM/BeatsPerMinute")) { uint value = desc.ToDWord (); if (value != 0) return value; } return 0; } set { if (value == 0) { RemoveDescriptors ("WM/BeatsPerMinute"); return; } SetDescriptors ("WM/BeatsPerMinute", new ContentDescriptor ( "WM/BeatsPerMinute", value)); } } /// /// Gets and sets the conductor or director of the media /// represented by the current instance. /// /// /// A object containing the conductor /// or director of the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "WM/Conductor" /// Content Descriptor. /// public override string Conductor { get {return GetDescriptorString ("WM/Conductor");} set {SetDescriptorString (value, "WM/Conductor");} } /// /// Gets and sets the copyright information for the media /// represented by the current instance. /// /// /// A object containing the copyright /// information for the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the copyright stored /// in the ASF Content Description Object. /// public override string Copyright { get {return description.Copyright;} set {description.Copyright = value;} } /// /// Gets and sets the MusicBrainz Artist ID of /// the media described by the current instance. /// /// /// A containing the MusicBrainz /// ArtistID for the media described by the current /// instance or null if no value is present. /// /// /// This property is implemented using the "MusicBrainz/Artist Id" /// field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzArtistId { get {return GetDescriptorString ("MusicBrainz/Artist Id");} set {SetDescriptorString (value, "MusicBrainz/Artist Id");} } /// /// Gets and sets the MusicBrainz Release ID of /// the media described by the current instance. /// /// /// A containing the MusicBrainz /// ReleaseID for the media described by the current /// instance or null if no value is present. /// /// /// This property is implemented using the "MusicBrainz/Album Id" /// field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseId { get {return GetDescriptorString ("MusicBrainz/Album Id");} set {SetDescriptorString (value, "MusicBrainz/Album Id");} } /// /// Gets and sets the MusicBrainz Release Artist ID of /// the media described by the current instance. /// /// /// A containing the MusicBrainz /// ReleaseArtistID for the media described by the current /// instance or null if no value is present. /// /// /// This property is implemented using the "MusicBrainz/Album Artist Id" /// field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseArtistId { get {return GetDescriptorString ("MusicBrainz/Album Artist Id");} set {SetDescriptorString (value, "MusicBrainz/Album Artist Id");} } /// /// Gets and sets the MusicBrainz Track ID of /// the media described by the current instance. /// /// /// A containing the MusicBrainz /// TrackID for the media described by the current /// instance or null if no value is present. /// /// /// This property is implemented using the "MusicBrainz/Track Id" /// field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzTrackId { get {return GetDescriptorString ("MusicBrainz/Track Id");} set {SetDescriptorString (value, "MusicBrainz/Track Id");} } /// /// Gets and sets the MusicBrainz Disc ID of /// the media described by the current instance. /// /// /// A containing the MusicBrainz /// DiscID for the media described by the current /// instance or null if no value is present. /// /// /// This property is implemented using the "MusicBrainz/Disc Id" /// field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzDiscId { get {return GetDescriptorString ("MusicBrainz/Disc Id");} set {SetDescriptorString (value, "MusicBrainz/Disc Id");} } /// /// Gets and sets the MusicIP PUID of /// the media described by the current instance. /// /// /// A containing the MusicIPPUID /// for the media described by the current instance or /// null if no value is present. /// /// /// This property is implemented using the "MusicIP/PUID" /// field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicIpId { get {return GetDescriptorString ("MusicIP/PUID");} set {SetDescriptorString (value, "MusicIP/PUID");} } // // Gets and sets the AmazonID of // the media described by the current instance. // // // A containing the AmazonID // for the media described by the current instance or // null if no value is present. // // // A definition on where to store the ASIN for // Windows Media is not currently defined // //public override string AmazonId { // get { return null; } // set {} //} /// /// Gets and sets the MusicBrainz Release Status of /// the media described by the current instance. /// /// /// A containing the MusicBrainz /// ReleaseStatus for the media described by the current /// instance or null if no value is present. /// /// /// This property is implemented using the "MusicBrainz/Album Status" /// field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseStatus { get {return GetDescriptorString ("MusicBrainz/Album Status");} set {SetDescriptorString (value, "MusicBrainz/Album Status");} } /// /// Gets and sets the MusicBrainz Release Type of /// the media described by the current instance. /// /// /// A containing the MusicBrainz /// ReleaseType for the media described by the current /// instance or null if no value is present. /// /// /// This property is implemented using the "MusicBrainz/Album Type" /// field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseType { get {return GetDescriptorString ("MusicBrainz/Album Type");} set {SetDescriptorString (value, "MusicBrainz/Album Type");} } /// /// Gets and sets the MusicBrainz Release Country of /// the media described by the current instance. /// /// /// A containing the MusicBrainz /// ReleaseCountry for the media described by the current /// instance or null if no value is present. /// /// /// This property is implemented using the "MusicBrainz/Album Release Country" /// field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseCountry { get {return GetDescriptorString ("MusicBrainz/Album Release Country");} set {SetDescriptorString (value, "MusicBrainz/Album Release Country");} } /// /// Gets and sets a collection of pictures associated with /// the media represented by the current instance. /// /// /// A containing a collection of /// pictures associated with the media represented by the /// current instance or an empty array if none are present. /// /// /// This property is implemented using the "WM/Picture" /// Content Descriptor and Description Record. /// public override IPicture [] Pictures { get { List l = new List (); foreach (ContentDescriptor descriptor in GetDescriptors ("WM/Picture")) { IPicture p = PictureFromData ( descriptor.ToByteVector ()); if (p != null) l.Add (p); } foreach (DescriptionRecord record in metadata_library.GetRecords (0, 0, "WM/Picture")) { IPicture p = PictureFromData ( record.ToByteVector ()); if (p != null) l.Add (p); } return l.ToArray (); } set { if (value == null || value.Length == 0) { RemoveDescriptors ("WM/Picture"); metadata_library.RemoveRecords (0, 0, "WM/Picture"); return; } List pics = new List (); bool big_pics = false; foreach (IPicture pic in value) { ByteVector data = PictureToData (pic); pics.Add (data); if (data.Count > 0xFFFF) big_pics = true; } if (big_pics) { DescriptionRecord [] records = new DescriptionRecord [pics.Count]; for (int i = 0; i < pics.Count; i ++) records [i] = new DescriptionRecord ( 0, 0, "WM/Picture", pics [i]); RemoveDescriptors ("WM/Picture"); metadata_library.SetRecords (0, 0, "WM/Picture", records); } else { ContentDescriptor [] descs = new ContentDescriptor [pics.Count]; for (int i = 0; i < pics.Count; i ++) descs [i] = new ContentDescriptor ( "WM/Picture", pics [i]); metadata_library.RemoveRecords (0, 0, "WM/Picture"); SetDescriptors ("WM/Picture", descs); } } } /// /// Gets whether or not the current instance is empty. /// /// /// if the current instance does not /// any values. Otherwise . /// public override bool IsEmpty { get { return description.IsEmpty && ext_description.IsEmpty; } } /// /// Clears the values stored in the current instance. /// public override void Clear () { description = new ContentDescriptionObject (); ext_description = new ExtendedContentDescriptionObject (); metadata_library.RemoveRecords (0, 0, "WM/Picture"); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Asf/ContentDescriptor.cs0000644000175000017500000003045711462100402024754 0ustar00rubenruben00000000000000// // ContentDescriptor.cs: Provides a representation of an ASF Content Descriptor // to be used in combination with ExtendedContentDescriptionObject. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Asf { /// /// Indicates the type of data stored in a or /// object. /// public enum DataType { /// /// The descriptor contains Unicode (UTF-16LE) text. /// Unicode = 0, /// /// The descriptor contains binary data. /// Bytes = 1, /// /// The descriptor contains a boolean value. /// Bool = 2, /// /// The descriptor contains a 4-byte DWORD value. /// DWord = 3, /// /// The descriptor contains a 8-byte QWORD value. /// QWord = 4, /// /// The descriptor contains a 2-byte WORD value. /// Word = 5, /// /// The descriptor contains a 16-byte GUID value. /// Guid = 6 } /// /// This class provides a representation of an ASF Content /// Descriptor to be used in combination with . /// public class ContentDescriptor { #region Private Fields /// /// Contains the data type. /// private DataType type = DataType.Unicode; /// /// Contains the descriptor name. /// private string name = null; /// /// Contains the string value. /// private string strValue = null; /// /// Contains the byte value. /// private ByteVector byteValue = null; /// /// Contains the long value. /// private ulong longValue = 0; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a specified name and /// and value. /// /// /// A object containing the name of the /// new instance. /// /// /// A object containing the value for /// the new instance. /// public ContentDescriptor (string name, string value) { this.name = name; this.strValue = value; } /// /// Constructs and initializes a new instance of with a specified name and /// and value. /// /// /// A object containing the name of the /// new instance. /// /// /// A object containing the value /// for the new instance. /// public ContentDescriptor (string name, ByteVector value) { this.name = name; this.type = DataType.Bytes; this.byteValue = new ByteVector (value); } /// /// Constructs and initializes a new instance of with a specified name and /// and value. /// /// /// A object containing the name of the /// new instance. /// /// /// A value containing the value /// for the new instance. /// public ContentDescriptor (string name, uint value) { this.name = name; this.type = DataType.DWord; this.longValue = value; } /// /// Constructs and initializes a new instance of with a specified name and /// and value. /// /// /// A object containing the name of the /// new instance. /// /// /// A value containing the value /// for the new instance. /// public ContentDescriptor (string name, ulong value) { this.name = name; this.type = DataType.QWord; this.longValue = value; } /// /// Constructs and initializes a new instance of with a specified name and /// and value. /// /// /// A object containing the name of the /// new instance. /// /// /// A value containing the value /// for the new instance. /// public ContentDescriptor (string name, ushort value) { this.name = name; this.type = DataType.Word; this.longValue = value; } /// /// Constructs and initializes a new instance of with a specified name and /// and value. /// /// /// A object containing the name of the /// new instance. /// /// /// A value containing the value /// for the new instance. /// public ContentDescriptor (string name, bool value) { this.name = name; this.type = DataType.Bool; this.longValue = value ? 1uL : 0; } /// /// Constructs and initializes a new instance of by reading its contents from /// a file. /// /// /// A object to read the raw ASF /// Description Record from. /// /// /// is . /// /// /// A valid descriptor could not be read. /// /// /// must be at a seek position at /// which the descriptor can be read. /// protected internal ContentDescriptor (Asf.File file) { if (file == null) throw new ArgumentNullException ("file"); if (!Parse (file)) throw new CorruptFileException ( "Failed to parse content descriptor."); } #endregion #region Public Properties /// /// Gets the name of the current instance. /// /// /// A object containing the name of the /// current instance. /// public string Name { get {return name;} } /// /// Gets the type of data contained in the current instance. /// /// /// A value indicating type of data /// contained in the current instance. /// public DataType Type { get {return type;} } #endregion #region Public Methods /// /// Gets a string representation of the current instance. /// /// /// A object containing the value of /// the current instance. /// public override string ToString () { if (type == DataType.Unicode) return strValue; if (type == DataType.Bytes) return byteValue.ToString (StringType.UTF16LE); return longValue.ToString (); } /// /// Gets the binary contents of the current instance. /// /// /// A object containing the /// contents of the current instance, or if is unequal to . /// public ByteVector ToByteVector () { return byteValue; } /// /// Gets the boolean value contained in the current instance. /// /// /// A value containing the value of the /// current instance. /// public bool ToBool () { return longValue != 0; } /// /// Gets the DWORD value contained in the current instance. /// /// /// A value containing the value of the /// current instance. /// public uint ToDWord () { uint value; if (type == DataType.Unicode && strValue != null && uint.TryParse (strValue, out value)) return value; return (uint) longValue; } /// /// Gets the QWORD value contained in the current instance. /// /// /// A value containing the value of the /// current instance. /// public ulong ToQWord () { ulong value; if (type == DataType.Unicode && strValue != null && ulong.TryParse (strValue, out value)) return value; return longValue; } /// /// Gets the WORD value contained in the current instance. /// /// /// A value containing the value of the /// current instance. /// public ushort ToWord () { ushort value; if (type == DataType.Unicode && strValue != null && ushort.TryParse (strValue, out value)) return value; return (ushort) longValue; } /// /// Renders the current instance as a raw ASF Description /// Record. /// /// /// A object containing the /// rendered version of the current instance. /// public ByteVector Render () { ByteVector value = null; switch (type) { case DataType.Unicode: value = Object.RenderUnicode (strValue); break; case DataType.Bytes: value = byteValue; break; case DataType.Bool: case DataType.DWord: value = Object.RenderDWord ((uint) longValue); break; case DataType.QWord: value = Object.RenderQWord (longValue); break; case DataType.Word: value = Object.RenderWord ((ushort) longValue); break; default: return null; } ByteVector name = Object.RenderUnicode (this.name); ByteVector output = new ByteVector (); output.Add (Object.RenderWord ((ushort) name.Count)); output.Add (name); output.Add (Object.RenderWord ((ushort) type)); output.Add (Object.RenderWord ((ushort) value.Count)); output.Add (value); return output; } #endregion #region Protected Methods /// /// Populates the current instance by reading in the contents /// from a file. /// /// /// A object to read the raw ASF /// Content Descriptor from. /// /// /// if the data was read correctly. /// Otherwise . /// protected bool Parse (Asf.File file) { int name_count = file.ReadWord (); name = file.ReadUnicode (name_count); type = (DataType) file.ReadWord (); int value_count = file.ReadWord (); switch (type) { case DataType.Word: longValue = file.ReadWord (); break; case DataType.Bool: longValue = file.ReadDWord (); break; case DataType.DWord: longValue = file.ReadDWord (); break; case DataType.QWord: longValue = file.ReadQWord (); break; case DataType.Unicode: strValue = file.ReadUnicode (value_count); break; case DataType.Bytes: byteValue = file.ReadBlock (value_count); break; default: return false; } return true; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Asf/ContentDescriptionObject.cs0000644000175000017500000001734111462100402026245 0ustar00rubenruben00000000000000// // ContentDescriptionObject.cs: Provides a representation of an ASF Content // Description object which can be read from and written to disk. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Asf { /// /// This class extends to provide a /// representation of an ASF Content Description object which can be /// read from and written to disk. /// public class ContentDescriptionObject : Object { #region Private Fields /// /// Contains the media title. /// private string title = string.Empty; /// /// Contains the author/performer. /// private string author = string.Empty; /// /// Contains the copyright information. /// private string copyright = string.Empty; /// /// Contains the description of the media. /// private string description = string.Empty; /// /// Contains the rating of the media. /// private string rating = string.Empty; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading the /// contents from a specified position in a specified file. /// /// /// A object containing the file from /// which the contents of the new instance are to be read. /// /// /// A value specify at what position to /// read the object. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// /// /// The object read from disk does not have the correct GUID /// or smaller than the minimum size. /// public ContentDescriptionObject (Asf.File file, long position) : base (file, position) { if (Guid != Asf.Guid.AsfContentDescriptionObject) throw new CorruptFileException ( "Object GUID incorrect."); if (OriginalSize < 34) throw new CorruptFileException ( "Object size too small."); ushort title_length = file.ReadWord (); ushort author_length = file.ReadWord (); ushort copyright_length = file.ReadWord (); ushort description_length = file.ReadWord (); ushort rating_length = file.ReadWord (); title = file.ReadUnicode (title_length); author = file.ReadUnicode (author_length); copyright = file.ReadUnicode (copyright_length); description = file.ReadUnicode (description_length); rating = file.ReadUnicode (rating_length); } /// /// Constructs and initializes a new instance of with no contents. /// public ContentDescriptionObject () : base (Asf.Guid.AsfContentDescriptionObject) { } #endregion #region Public Region /// /// Gets and sets the title of the media described by the /// current instance. /// /// /// A object containing the title of /// the media or if it is not set. /// public string Title { get {return title.Length == 0 ? null : title;} set { title = string.IsNullOrEmpty (value) ? string.Empty : value; } } /// /// Gets and sets the author or performer of the media /// described by the current instance. /// /// /// A object containing the author of /// the media or if it is not set. /// public string Author { get {return author.Length == 0 ? null : author;} set { author = string.IsNullOrEmpty (value) ? string.Empty : value; } } /// /// Gets and sets the copyright information for the media /// described by the current instance. /// /// /// A object containing the copyright /// information for the media or if /// it is not set. /// public string Copyright { get {return copyright.Length == 0 ? null : copyright;} set { copyright = string.IsNullOrEmpty (value) ? string.Empty : value; } } /// /// Gets and sets the description of the media described by /// the current instance. /// /// /// A object containing a description /// of the media or if it is not set. /// public string Description { get { return description.Length == 0 ? null : description; } set { description = string.IsNullOrEmpty (value) ? string.Empty : value; } } /// /// Gets and sets the rating of the media described by the /// current instance. /// /// /// A object containing a rating of the /// media or if it is not set. /// public string Rating { get {return rating.Length == 0 ? null : rating;} set { rating = string.IsNullOrEmpty (value) ? string.Empty : value; } } /// /// Gets whether or not the current instance is empty. /// /// /// if all the values are cleared. /// Otherwise . /// public bool IsEmpty { get { return title.Length == 0 && author.Length == 0 && copyright.Length == 0 && description.Length == 0 && rating.Length == 0; } } #endregion #region Public Region /// /// Renders the current instance as a raw ASF object. /// /// /// A object containing the /// rendered version of the current instance. /// public override ByteVector Render () { ByteVector title_bytes = RenderUnicode (title); ByteVector author_bytes = RenderUnicode (author); ByteVector copyright_bytes = RenderUnicode (copyright); ByteVector description_bytes = RenderUnicode (description); ByteVector rating_bytes = RenderUnicode (rating); ByteVector output = RenderWord ((ushort) title_bytes.Count); output.Add (RenderWord ((ushort) author_bytes.Count)); output.Add (RenderWord ((ushort) copyright_bytes.Count)); output.Add (RenderWord ((ushort) description_bytes.Count)); output.Add (RenderWord ((ushort) rating_bytes.Count)); output.Add (title_bytes); output.Add (author_bytes); output.Add (copyright_bytes); output.Add (description_bytes); output.Add (rating_bytes); return Render (output); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Asf/HeaderObject.cs0000644000175000017500000001646511462100402023625 0ustar00rubenruben00000000000000// // HeaderObject.cs: Provides a representation of an ASF Header object which can // be read from and written to disk. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Asf { /// /// This class extends to provide a /// representation of an ASF Header object which can be read from and /// written to disk. /// public class HeaderObject : Object { #region Private Fields /// /// Contains the reserved header data. /// private ByteVector reserved; /// /// Contains the child objects. /// private List children; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading the contents from a /// specified position in a specified file. /// /// /// A object containing the file from /// which the contents of the new instance are to be read. /// /// /// A value specify at what position to /// read the object. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// /// /// The object read from disk does not have the correct GUID /// or smaller than the minimum size. /// public HeaderObject (Asf.File file, long position) : base (file, position) { if (!Guid.Equals (Asf.Guid.AsfHeaderObject)) throw new CorruptFileException ( "Object GUID incorrect."); if (OriginalSize < 26) throw new CorruptFileException ( "Object size too small."); children = new List (); uint child_count = file.ReadDWord (); reserved = file.ReadBlock (2); children.AddRange (file.ReadObjects (child_count, file.Tell)); } #endregion #region Public Properties /// /// Gets the header extension object contained in the /// current instance. /// /// /// A object containing /// the header extension object. /// public HeaderExtensionObject Extension { get { foreach (Object child in children) if (child is HeaderExtensionObject) return child as HeaderExtensionObject; return null; } } /// /// Gets the child objects contained in the current instance. /// /// /// A object enumerating /// through the children of the current instance. /// public IEnumerable Children { get {return children;} } /// /// Gets the media properties contained within the current /// instance. /// /// /// A object containing the media /// properties of the current instance. /// public Properties Properties { get { TimeSpan duration = TimeSpan.Zero; List codecs = new List (); foreach (Object obj in Children) { FilePropertiesObject fpobj = obj as FilePropertiesObject; if (fpobj != null) { duration = fpobj.PlayDuration - new TimeSpan((long) fpobj.Preroll); continue; } StreamPropertiesObject spobj = obj as StreamPropertiesObject; if (spobj != null) { codecs.Add (spobj.Codec); continue; } } return new Properties (duration, codecs); } } /// /// Gets whether or not the current instance contains either /// type of content descriptiors. /// /// /// if the current instance contains /// a or a . Otherwise /// . /// public bool HasContentDescriptors { get { foreach (Asf.Object child in children) if (child.Guid == Asf.Guid.AsfContentDescriptionObject || child.Guid == Asf.Guid.AsfExtendedContentDescriptionObject) return true; return false; } } #endregion #region Public Methods /// /// Renders the current instance as a raw ASF object. /// /// /// A object containing the /// rendered version of the current instance. /// public override ByteVector Render () { ByteVector output = new ByteVector (); uint child_count = 0; foreach (Object child in children) if (child.Guid != Asf.Guid.AsfPaddingObject) { output.Add (child.Render ()); child_count ++; } long size_diff = (long) output.Count + 30 - (long) OriginalSize; if (size_diff != 0) { PaddingObject obj = new PaddingObject ((uint) (size_diff > 0 ? 4096 : - size_diff)); output.Add (obj.Render ()); child_count ++; } output.Insert (0, reserved); output.Insert (0, RenderDWord (child_count)); return Render (output); } /// /// Adds a child object to the current instance. /// /// /// A object to add to the current /// instance. /// public void AddObject (Object obj) { children.Add (obj); } /// /// Adds a child unique child object to the current instance, /// replacing and existing child if present. /// /// /// A object to add to the current /// instance. /// public void AddUniqueObject (Object obj) { for (int i = 0; i < children.Count; i ++) if (children [i].Guid == obj.Guid) { children [i] = obj; return; } children.Add (obj); } /// /// Removes the content description objects from the current /// instance. /// public void RemoveContentDescriptors () { for (int i = children.Count - 1; i >= 0; i --) if (children [i].Guid == Asf.Guid.AsfContentDescriptionObject || children [i].Guid == Asf.Guid.AsfExtendedContentDescriptionObject) children.RemoveAt (i); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Asf/Object.cs0000644000175000017500000001500211462100402022476 0ustar00rubenruben00000000000000// // Object.cs: Provides a basic representation of an ASF object which can be read // from and written to disk. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Asf { /// /// This abstract class provides a basic representation of an ASF /// object which can be read from and written to disk. /// public abstract class Object { #region Private Fields /// /// Contains the GUID of the object. /// private System.Guid id; /// /// Contains the size of the object on disk. /// private ulong size; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading the contents from a /// specified position in a specified file. /// /// /// A object containing the file from /// which the contents of the new instance are to be read. /// /// /// A value specify at what position to /// read the object. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// protected Object (Asf.File file, long position) { if (file == null) throw new ArgumentNullException ("file"); if (position < 0 || position > file.Length - 24) throw new ArgumentOutOfRangeException ( "position"); file.Seek (position); id = file.ReadGuid (); size = file.ReadQWord (); } /// /// Constructs and initializes a new instance of with a specified GUID. /// /// /// A value containing the GUID to /// use for the new instance. /// protected Object (System.Guid guid) { id = guid; } #endregion #region Public Properties /// /// Gets the GUID for the current instance. /// /// /// A object containing the GUID /// of the current instance. /// public System.Guid Guid { get {return id;} } /// /// Gets the original size of the current instance. /// /// /// A value containing the size of the /// current instance as it originally appeared on disk. /// public ulong OriginalSize { get {return size;} } #endregion #region Public Methods /// /// Renders the current instance as a raw ASF object. /// /// /// A object containing the /// rendered version of the current instance. /// /// public abstract ByteVector Render (); #endregion #region Public Static Methods /// /// Renders a Unicode (wide) string. /// /// /// A object containing the text to /// render. /// /// /// A object containing the /// rendered value. /// public static ByteVector RenderUnicode (string value) { ByteVector v = ByteVector.FromString (value, StringType.UTF16LE); v.Add (RenderWord (0)); return v; } /// /// Renders a 4-byte DWORD. /// /// /// A value containing the DWORD to /// render. /// /// /// A object containing the /// rendered value. /// public static ByteVector RenderDWord (uint value) { return ByteVector.FromUInt (value, false); } /// /// Renders a 8-byte QWORD. /// /// /// A value containing the QWORD to /// render. /// /// /// A object containing the /// rendered value. /// public static ByteVector RenderQWord (ulong value) { return ByteVector.FromULong (value, false); } /// /// Renders a 2-byte WORD. /// /// /// A value containing the WORD to /// render. /// /// /// A object containing the /// rendered value. /// public static ByteVector RenderWord (ushort value) { return ByteVector.FromUShort (value, false); } #endregion #region Protected Methods /// /// Renders the current instance as a raw ASF object /// containing specified data. /// /// /// A object containing the data to /// contained in the rendered version of the current /// instance. /// /// /// A object containing the /// rendered version of the current instance. /// /// /// Child classes implementing should /// render their contents and then send the data through this /// method to produce the final output. /// protected ByteVector Render (ByteVector data) { ulong length = (ulong) ((data != null ? data.Count : 0) + 24); ByteVector v = id.ToByteArray (); v.Add (RenderQWord (length)); v.Add (data); return v; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Asf/FilePropertiesObject.cs0000644000175000017500000002147111462100402025362 0ustar00rubenruben00000000000000// // FilePropertiesObject.cs: Provides a representation of an ASF File Properties // object which can be read from and written to disk. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Asf { /// /// This class extends to provide a /// representation of an ASF File Properties object which can be read /// from and written to disk. /// public class FilePropertiesObject : Object { #region Private Fields /// /// Contains the GUID for the file. /// private System.Guid file_id; /// /// Contains the file size. /// private ulong file_size; /// /// Contains the creation date. /// private ulong creation_date; /// /// Contains the packet count. /// private ulong data_packets_count; /// /// Contains the play duration. /// private ulong play_duration; /// /// Contains the send duration. /// private ulong send_duration; /// /// Contains the preroll. /// private ulong preroll; /// /// Contains the file flags. /// private uint flags; /// /// Contains the minimum packet size. /// private uint minimum_data_packet_size; /// /// Contains the maxximum packet size. /// private uint maximum_data_packet_size; /// /// Contains the maximum bitrate of the file. /// private uint maximum_bitrate; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading the contents /// from a specified position in a specified file. /// /// /// A object containing the file from /// which the contents of the new instance are to be read. /// /// /// A value specify at what position to /// read the object. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// /// /// The object read from disk does not have the correct GUID /// or smaller than the minimum size. /// public FilePropertiesObject (Asf.File file, long position) : base (file, position) { if (!Guid.Equals (Asf.Guid.AsfFilePropertiesObject)) throw new CorruptFileException ( "Object GUID incorrect."); if (OriginalSize < 104) throw new CorruptFileException ( "Object size too small."); file_id = file.ReadGuid (); file_size = file.ReadQWord (); creation_date = file.ReadQWord (); data_packets_count = file.ReadQWord (); send_duration = file.ReadQWord (); play_duration = file.ReadQWord (); preroll = file.ReadQWord (); flags = file.ReadDWord (); minimum_data_packet_size = file.ReadDWord (); maximum_data_packet_size = file.ReadDWord (); maximum_bitrate = file.ReadDWord (); } #endregion #region Public Properties /// /// Gets the GUID for the file described by the current /// instance. /// /// /// A value containing the GUID /// for the file described by the current instance. /// public System.Guid FileId { get {return file_id;} } /// /// Gets the size of the file described by the current /// instance. /// /// /// A value containing the size of the /// file described by the current instance. /// public ulong FileSize { get {return file_size;} } /// /// Gets the creation date of the file described by the /// current instance. /// /// /// A value containing the creation /// date of the file described by the current instance. /// public DateTime CreationDate { get {return new DateTime ((long)creation_date);} } /// /// Gets the number of data packets in the file described by /// the current instance. /// /// /// A value containing the number of /// data packets in the file described by the current /// instance. /// public ulong DataPacketsCount { get {return data_packets_count;} } /// /// Gets the play duration of the file described by the /// current instance. /// /// /// A value containing the play /// duration of the file described by the current instance. /// public TimeSpan PlayDuration { get {return new TimeSpan ((long)play_duration);} } /// /// Gets the send duration of the file described by the /// current instance. /// /// /// A value containing the send /// duration of the file described by the current instance. /// public TimeSpan SendDuration { get {return new TimeSpan ((long)send_duration);} } /// /// Gets the pre-roll of the file described by the current /// instance. /// /// /// A value containing the pre-roll of /// the file described by the current instance. /// public ulong Preroll { get {return preroll;} } /// /// Gets the flags of the file described by the current /// instance. /// /// /// A value containing the flags of the /// file described by the current instance. /// public uint Flags { get {return flags;} } /// /// Gets the minimum data packet size of the file described /// by the current instance. /// /// /// A value containing the minimum data /// packet size of the file described by the current /// instance. /// public uint MinimumDataPacketSize { get {return minimum_data_packet_size;} } /// /// Gets the maximum data packet size of the file described /// by the current instance. /// /// /// A value containing the maximum data /// packet size of the file described by the current /// instance. /// public uint MaximumDataPacketSize { get {return maximum_data_packet_size;} } /// /// Gets the maximum bitrate of the file described by the /// current instance. /// /// /// A value containing the maximum /// bitrate of the file described by the current instance. /// public uint MaximumBitrate { get {return maximum_bitrate;} } #endregion #region Public Methods /// /// Renders the current instance as a raw ASF object. /// /// /// A object containing the /// rendered version of the current instance. /// public override ByteVector Render () { ByteVector output = file_id.ToByteArray (); output.Add (RenderQWord (file_size)); output.Add (RenderQWord (creation_date)); output.Add (RenderQWord (data_packets_count)); output.Add (RenderQWord (send_duration)); output.Add (RenderQWord (play_duration)); output.Add (RenderQWord (preroll)); output.Add (RenderDWord (flags)); output.Add (RenderDWord (minimum_data_packet_size)); output.Add (RenderDWord (maximum_data_packet_size)); output.Add (RenderDWord (maximum_bitrate)); return Render (output); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Asf/DescriptionRecord.cs0000644000175000017500000004244211462100402024722 0ustar00rubenruben00000000000000// // DescriptionRecord.cs: Provides a representation of an ASF Description Record // to be used in combination with MetadataLibaryObject. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Asf { /// /// This class provides a representation of an ASF Description Record /// to be used in combination with . /// public class DescriptionRecord { #region Private Fields /// /// Contains the data type. /// private DataType type = DataType.Unicode; /// /// Contains the language list index. /// private ushort lang_list_index = 0; /// /// Contains the stream number. /// private ushort stream_number = 0; /// /// Contains the record name. /// private string name = null; /// /// Contains the string value. /// private string strValue = null; /// /// Contains the byte value. /// private ByteVector byteValue = null; /// /// Contains the long value. /// private ulong longValue = 0; /// /// Contains the GUID value. /// private System.Guid guidValue = System.Guid.Empty; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a specified language, /// stream, name, and value. /// /// /// A value containing the language /// list index of the new instance. /// /// /// A value containing the stream /// number of the new instance. /// /// /// A object containing the name of the /// new instance. /// /// /// A object containing the value for /// the new instance. /// public DescriptionRecord (ushort languageListIndex, ushort streamNumber, string name, string value) { this.lang_list_index = languageListIndex; this.stream_number = streamNumber; this.name = name; this.strValue = value; } /// /// Constructs and initializes a new instance of with a specified language, /// stream, name, and value. /// /// /// A value containing the language /// list index of the new instance. /// /// /// A value containing the stream /// number of the new instance. /// /// /// A object containing the name of the /// new instance. /// /// /// A object containing the value /// for the new instance. /// public DescriptionRecord (ushort languageListIndex, ushort streamNumber, string name, ByteVector value) { this.lang_list_index = languageListIndex; this.stream_number = streamNumber; this.name = name; this.type = DataType.Bytes; this.byteValue = new ByteVector (value); } /// /// Constructs and initializes a new instance of with a specified language, /// stream, name, and value. /// /// /// A value containing the language /// list index of the new instance. /// /// /// A value containing the stream /// number of the new instance. /// /// /// A object containing the name of the /// new instance. /// /// /// A value containing the value /// for the new instance. /// public DescriptionRecord (ushort languageListIndex, ushort streamNumber, string name, uint value) { this.lang_list_index = languageListIndex; this.stream_number = streamNumber; this.name = name; this.type = DataType.DWord; this.longValue = value; } /// /// Constructs and initializes a new instance of with a specified language, /// stream, name, and value. /// /// /// A value containing the language /// list index of the new instance. /// /// /// A value containing the stream /// number of the new instance. /// /// /// A object containing the name of the /// new instance. /// /// /// A value containing the value /// for the new instance. /// public DescriptionRecord (ushort languageListIndex, ushort streamNumber, string name, ulong value) { this.lang_list_index = languageListIndex; this.stream_number = streamNumber; this.name = name; this.type = DataType.QWord; this.longValue = value; } /// /// Constructs and initializes a new instance of with a specified language, /// stream, name, and value. /// /// /// A value containing the language /// list index of the new instance. /// /// /// A value containing the stream /// number of the new instance. /// /// /// A object containing the name of the /// new instance. /// /// /// A value containing the value /// for the new instance. /// public DescriptionRecord (ushort languageListIndex, ushort streamNumber, string name, ushort value) { this.lang_list_index = languageListIndex; this.stream_number = streamNumber; this.name = name; this.type = DataType.Word; this.longValue = value; } /// /// Constructs and initializes a new instance of with a specified language, /// stream, name, and value. /// /// /// A value containing the language /// list index of the new instance. /// /// /// A value containing the stream /// number of the new instance. /// /// /// A object containing the name of the /// new instance. /// /// /// A value containing the value /// for the new instance. /// public DescriptionRecord (ushort languageListIndex, ushort streamNumber, string name, bool value) { this.lang_list_index = languageListIndex; this.stream_number = streamNumber; this.name = name; this.type = DataType.Bool; this.longValue = value ? 1uL : 0; } /// /// Constructs and initializes a new instance of with a specified language, /// stream, name, and value. /// /// /// A value containing the language /// list index of the new instance. /// /// /// A value containing the stream /// number of the new instance. /// /// /// A object containing the name of the /// new instance. /// /// /// A value containing the value /// for the new instance. /// public DescriptionRecord (ushort languageListIndex, ushort streamNumber, string name, System.Guid value) { this.lang_list_index = languageListIndex; this.stream_number = streamNumber; this.name = name; this.type = DataType.Guid; this.guidValue = value; } /// /// Constructs and initializes a new instance of by reading its contents from /// a file. /// /// /// A object to read the raw ASF /// Description Record from. /// /// /// is . /// /// /// A valid record could not be read. /// /// /// must be at a seek position at /// which the record can be read. /// protected internal DescriptionRecord (Asf.File file) { if (file == null) throw new ArgumentNullException ("file"); if (!Parse (file)) throw new CorruptFileException ( "Failed to parse description record."); } #endregion #region Public Properties /// /// Gets the index of the language associated with the /// current instance. /// /// /// A value containing the index of the /// language associated with the current instance. /// public ushort LanguageListIndex { get {return lang_list_index;} } /// /// Gets the index of the stream associated with the current /// instance. /// /// /// A value containing the index of the /// stream associated with the current instance. /// public ushort StreamNumber { get {return stream_number;} } /// /// Gets the name of the current instance. /// /// /// A object containing the name of the /// current instance. /// public string Name { get {return name;} } /// /// Gets the type of data contained in the current instance. /// /// /// A value indicating type of data /// contained in the current instance. /// public DataType Type { get {return type;} } #endregion #region Public Methods /// /// Gets a string representation of the current instance. /// /// /// A object containing the value of /// the current instance. /// public override string ToString () { if (type == DataType.Unicode) return strValue; if (type == DataType.Bytes) return byteValue.ToString (StringType.UTF16LE); return longValue.ToString (); } /// /// Gets the binary contents of the current instance. /// /// /// A object containing the /// contents of the current instance, or if is unequal to . /// public ByteVector ToByteVector () { return byteValue; } /// /// Gets the boolean value contained in the current instance. /// /// /// A value containing the value of the /// current instance. /// public bool ToBool () { return longValue != 0; } /// /// Gets the DWORD value contained in the current instance. /// /// /// A value containing the value of the /// current instance. /// public uint ToDWord () { uint value; if (type == DataType.Unicode && strValue != null && uint.TryParse (strValue, out value)) return value; return (uint) longValue; } /// /// Gets the QWORD value contained in the current instance. /// /// /// A value containing the value of the /// current instance. /// public ulong ToQWord () { ulong value; if (type == DataType.Unicode && strValue != null && ulong.TryParse (strValue, out value)) return value; return longValue; } /// /// Gets the WORD value contained in the current instance. /// /// /// A value containing the value of the /// current instance. /// public ushort ToWord () { ushort value; if (type == DataType.Unicode && strValue != null && ushort.TryParse (strValue, out value)) return value; return (ushort) longValue; } /// /// Gets the GUID value contained in the current instance. /// /// /// A value containing the value /// of the current instance. /// public System.Guid ToGuid () { return guidValue; } /// /// Renders the current instance as a raw ASF Description /// Record. /// /// /// A object containing the /// rendered version of the current instance. /// public ByteVector Render () { ByteVector value = null; switch (type) { case DataType.Unicode: value = Object.RenderUnicode (strValue); break; case DataType.Bytes: value = byteValue; break; case DataType.Bool: case DataType.DWord: value = Object.RenderDWord ((uint) longValue); break; case DataType.QWord: value = Object.RenderQWord (longValue); break; case DataType.Word: value = Object.RenderWord ((ushort) longValue); break; case DataType.Guid: value = guidValue.ToByteArray (); break; default: return null; } ByteVector name = Object.RenderUnicode (this.name); ByteVector output = new ByteVector (); output.Add (Object.RenderWord (lang_list_index)); output.Add (Object.RenderWord (stream_number)); output.Add (Object.RenderWord ((ushort) name.Count)); output.Add (Object.RenderWord ((ushort) type)); output.Add (Object.RenderDWord ((uint) value.Count)); output.Add (name); output.Add (value); return output; } #endregion #region Protected Methods /// /// Populates the current instance by reading in the contents /// from a file. /// /// /// A object to read the raw ASF /// Description Record from. /// /// /// if the data was read correctly. /// Otherwise . /// protected bool Parse (Asf.File file) { // Field name Field type Size (bits) // Language List Index WORD 16 // Stream Number WORD 16 // Name Length WORD 16 // Data Type WORD 16 // Data Length DWORD 32 // Name WCHAR varies // Data See below varies lang_list_index = file.ReadWord (); stream_number = file.ReadWord (); ushort name_length = file.ReadWord (); type = (DataType) file.ReadWord (); int data_length = (int) file.ReadDWord (); name = file.ReadUnicode (name_length); switch (type) { case DataType.Word: longValue = file.ReadWord (); break; case DataType.Bool: case DataType.DWord: longValue = file.ReadDWord (); break; case DataType.QWord: longValue = file.ReadQWord (); break; case DataType.Unicode: strValue = file.ReadUnicode (data_length); break; case DataType.Bytes: byteValue = file.ReadBlock (data_length); break; case DataType.Guid: guidValue = file.ReadGuid (); break; default: return false; } return true; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Asf/StreamPropertiesObject.cs0000644000175000017500000001710711462100402025737 0ustar00rubenruben00000000000000// // StreamPropertiesObject.cs: Provides a representation of an ASF Stream // Properties object which can be read from and written to disk. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2006-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Text; namespace TagLib.Asf { /// /// This class extends to provide a /// representation of an ASF Stream Properties object which can be /// read from and written to disk. /// public class StreamPropertiesObject : Object { #region Private Fields /// /// Contains the stream type GUID. /// private System.Guid stream_type; /// /// Contains the error correction type GUID. /// private System.Guid error_correction_type; /// /// Contains the time offset of the stream. /// private ulong time_offset; /// /// Contains the stream flags. /// private ushort flags; /// /// Contains the reserved data. /// private uint reserved; /// /// Contains the type specific data. /// private ByteVector type_specific_data; /// /// Contains the error correction data. /// private ByteVector error_correction_data; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading the contents from a /// specified position in a specified file. /// /// /// A object containing the file from /// which the contents of the new instance are to be read. /// /// /// A value specify at what position to /// read the object. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// /// /// The object read from disk does not have the correct GUID /// or smaller than the minimum size. /// public StreamPropertiesObject (Asf.File file, long position) : base (file, position) { if (!Guid.Equals (Asf.Guid.AsfStreamPropertiesObject)) throw new CorruptFileException ( "Object GUID incorrect."); if (OriginalSize < 78) throw new CorruptFileException ( "Object size too small."); stream_type = file.ReadGuid (); error_correction_type = file.ReadGuid (); time_offset = file.ReadQWord (); int type_specific_data_length = (int) file.ReadDWord (); int error_correction_data_length = (int) file.ReadDWord (); flags = file.ReadWord (); reserved = file.ReadDWord (); type_specific_data = file.ReadBlock (type_specific_data_length); error_correction_data = file.ReadBlock (error_correction_data_length); } #endregion #region Public Properties /// /// Gets the codec information contained in the current /// instance. /// /// /// A object containing the codec /// information read from or /// if the data could not be decoded. /// public ICodec Codec { get { if (stream_type == Asf.Guid.AsfAudioMedia) return new Riff.WaveFormatEx ( type_specific_data, 0); if (stream_type == Asf.Guid.AsfVideoMedia) return new TagLib.Riff.BitmapInfoHeader ( type_specific_data, 11); return null; } } /// /// Gets the stream type GUID of the current instance. /// /// /// A object containing the stream /// type GUID of the current instance. /// public System.Guid StreamType { get {return stream_type;} } /// /// Gets the error correction type GUID of the current /// instance. /// /// /// A object containing the error /// correction type GUID of the current instance. /// public System.Guid ErrorCorrectionType { get {return error_correction_type;} } /// /// Gets the time offset at which the stream described by the /// current instance begins. /// /// /// A value containing the time /// offset at which the stream described by the current /// instance begins. /// public TimeSpan TimeOffset { get {return new TimeSpan ((long)time_offset);} } /// /// Gets the flags that apply to the current instance. /// /// /// A value containing the flags that /// apply to the current instance. /// public ushort Flags { get {return flags;} } /// /// Gets the type specific data contained in the current /// instance. /// /// /// A object containing the type /// specific data contained in the current instance. /// /// /// The contents of this value are dependant on the type /// contained in . /// public ByteVector TypeSpecificData { get {return type_specific_data;} } /// /// Gets the error correction data contained in the current /// instance. /// /// /// A object containing the error /// correction data contained in the current instance. /// /// /// The contents of this value are dependant on the type /// contained in . /// public ByteVector ErrorCorrectionData { get {return error_correction_data;} } #endregion #region Public Methods /// /// Renders the current instance as a raw ASF object. /// /// /// A object containing the /// rendered version of the current instance. /// public override ByteVector Render () { ByteVector output = stream_type.ToByteArray (); output.Add (error_correction_type.ToByteArray ()); output.Add (RenderQWord (time_offset)); output.Add (RenderDWord ((uint) type_specific_data.Count)); output.Add (RenderDWord ((uint) error_correction_data.Count)); output.Add (RenderWord (flags)); output.Add (RenderDWord (reserved)); output.Add (type_specific_data); output.Add (error_correction_data); return Render (output); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Flac/0000777000175000017500000000000011503407417021117 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Flac/File.cs0000644000175000017500000004777311462100402022327 0ustar00rubenruben00000000000000// // File.cs: Provides tagging and properties support for Xiph's Flac audio files. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // flacfile.cpp from TagLib // // Copyright (C) 2006-2007 Brian Nickel // Copyright (C) 2003-2004 Allan Sandfeld Jensen (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Flac { /// /// This class extends to /// provide tagging and properties support for Xiph's Flac audio /// files. /// /// /// A will be added /// automatically to any file that doesn't contain one. This change /// does not effect the physical file until is /// called and can be reversed using the following method: /// file.RemoveTags (file.TagTypes & ~file.TagTypesOnDisk); /// [SupportedMimeType("taglib/flac", "flac")] [SupportedMimeType("audio/x-flac")] [SupportedMimeType("application/x-flac")] [SupportedMimeType("audio/flac")] public class File : TagLib.NonContainer.File { #region Private Fields /// /// Contains the Flac metadata tag. /// private Metadata metadata = null; /// /// Contains the combination of all file tags. /// private CombinedTag tag = null; /// /// Contains the Flac header block. /// private ByteVector header_block = null; /// /// Contains the stream start position. /// private long stream_start = 0; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : base (path, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system with an average read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : base (path) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified file abstraction with an /// average read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// public File (File.IFileAbstraction abstraction) : base (abstraction) { } #endregion #region Public Properties /// /// Gets a abstract representation of all tags stored in the /// current instance. /// /// /// A object representing all tags /// stored in the current instance. /// public override TagLib.Tag Tag { get {return tag;} } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { Mode = AccessMode.Write; try { // Update the tags at the beginning of the file. long metadata_start = StartTag.Write (); long metadata_end; // Get all the blocks, but don't read the data for ones // we're filling with stored data. IList old_blocks = ReadBlocks (ref metadata_start, out metadata_end, BlockMode.Blacklist, BlockType.XiphComment, BlockType.Picture); // Create new vorbis comments is they don't exist. GetTag (TagTypes.Xiph, true); // Create new blocks and add the basics. List new_blocks = new List (); new_blocks.Add (old_blocks [0]); // Add blocks we don't deal with from the file. foreach (Block block in old_blocks) if (block.Type != BlockType.StreamInfo && block.Type != BlockType.XiphComment && block.Type != BlockType.Picture && block.Type != BlockType.Padding) new_blocks.Add (block); new_blocks.Add (new Block (BlockType.XiphComment, (GetTag (TagTypes.Xiph, true) as Ogg.XiphComment).Render (false))); foreach (IPicture picture in metadata.Pictures) { if (picture == null) continue; new_blocks.Add (new Block (BlockType.Picture, new Picture (picture).Render ())); } // Get the length of the blocks. long length = 0; foreach (Block block in new_blocks) length += block.TotalSize; // Find the padding size to avoid trouble. If that fails // make some. long padding_size = metadata_end - metadata_start - BlockHeader.Size - length; if (padding_size < 0) padding_size = 1024 * 4; // Add a padding block. if (padding_size != 0) new_blocks.Add (new Block (BlockType.Padding, new ByteVector ((int) padding_size))); // Render the blocks. ByteVector block_data = new ByteVector (); for (int i = 0; i < new_blocks.Count; i ++) block_data.Add (new_blocks [i].Render ( i == new_blocks.Count - 1)); // Update the blocks. Insert (block_data, metadata_start, metadata_end - metadata_start); // Update the tags at the end of the file. EndTag.Write (); TagTypesOnDisk = TagTypes; } finally { Mode = AccessMode.Closed; } } /// /// Gets a tag of a specified type from the current instance, /// optionally creating a new tag if possible. /// /// /// A value indicating the /// type of tag to read. /// /// /// A value specifying whether or not to /// try and create the tag if one is not found. /// /// /// A object containing the tag that was /// found in or added to the current instance. If no /// matching tag was found and none was created, is returned. /// public override TagLib.Tag GetTag (TagTypes type, bool create) { switch (type) { case TagTypes.Xiph: return metadata.GetComment (create, tag); case TagTypes.FlacMetadata: return metadata; } Tag t = (base.Tag as TagLib.NonContainer.Tag).GetTag (type); if (t != null || !create) return t; switch (type) { case TagTypes.Id3v1: return EndTag.AddTag (type, Tag); case TagTypes.Id3v2: return StartTag.AddTag (type, Tag); case TagTypes.Ape: return EndTag.AddTag (type, Tag); default: return null; } } /// /// Removes a set of tag types from the current instance. /// /// /// A bitwise combined value /// containing tag types to be removed from the file. /// /// /// In order to remove all tags from a file, pass as . /// public override void RemoveTags (TagTypes types) { if ((types & TagTypes.Xiph) != 0) metadata.RemoveComment (); if ((types & TagTypes.FlacMetadata) != 0) metadata.Clear (); base.RemoveTags (types); } #endregion #region Protected Methods /// /// Reads format specific information at the start of the /// file. /// /// /// A value containing the seek position /// at which the tags end and the media data begins. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// protected override void ReadStart (long start, ReadStyle propertiesStyle) { long end; IList blocks = ReadBlocks (ref start, out end, BlockMode.Whitelist, BlockType.StreamInfo, BlockType.XiphComment, BlockType.Picture); metadata = new Metadata (blocks); TagTypesOnDisk |= metadata.TagTypes; if (propertiesStyle != ReadStyle.None) { // Check that the first block is a // METADATA_BLOCK_STREAMINFO. if (blocks.Count == 0 || blocks [0].Type != BlockType.StreamInfo) throw new CorruptFileException ( "FLAC stream does not begin with StreamInfo."); // The stream exists from the end of the last // block to the end of the file. stream_start = end; header_block = blocks [0].Data; } } /// /// Reads format specific information at the end of the /// file. /// /// /// A value containing the seek position /// at which the media data ends and the tags begin. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// protected override void ReadEnd (long end, ReadStyle propertiesStyle) { tag = new CombinedTag (metadata, base.Tag); GetTag (TagTypes.Xiph, true); } /// /// Reads the audio properties from the file represented by /// the current instance. /// /// /// A value containing the seek position /// at which the tags end and the media data begins. /// /// /// A value containing the seek position /// at which the media data ends and the tags begin. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// A object describing the /// media properties of the file represented by the current /// instance. /// protected override Properties ReadProperties (long start, long end, ReadStyle propertiesStyle) { StreamHeader header = new StreamHeader (header_block, end - stream_start); return new Properties (TimeSpan.Zero, header); } #endregion #region Private Methods /// /// Indicates whether or not the block types passed into /// are to be white-listed or /// black-listed. /// private enum BlockMode { /// /// All block types except those provided are to be /// returned. /// Blacklist, /// /// Only those block types provides should be /// returned. /// Whitelist } /// /// Reads all metadata blocks starting from the current /// instance, starting at a specified position. /// /// /// A value reference specifying the /// position at which to start searching for the blocks. This /// will be updated to the position of the first block. /// /// /// A value reference updated to the /// position at which the last block ends. /// /// /// A value indicating whether to /// white-list or black-list the contents of . /// /// /// A containing the types to look /// for or not look for as specified by . /// /// /// A object containing the blocks /// read from the current instance. /// /// /// "fLaC" could not be found. /// private IList ReadBlocks (ref long start, out long end, BlockMode mode, params BlockType[] types) { List blocks = new List (); long start_position = Find ("fLaC", start); if (start_position < 0) throw new CorruptFileException ( "FLAC stream not found at starting position."); end = start = start_position + 4; Seek (start); BlockHeader header; do { header = new BlockHeader (ReadBlock ((int) BlockHeader.Size)); bool found = false; foreach (BlockType type in types) if (header.BlockType == type) { found = true; break; } if ((mode == BlockMode.Whitelist && found) || (mode == BlockMode.Blacklist && !found)) blocks.Add (new Block (header, ReadBlock ((int) header.BlockSize))); else Seek (header.BlockSize, System.IO.SeekOrigin.Current); end += header.BlockSize + BlockHeader.Size; } while (!header.IsLastBlock); return blocks; } #endregion } /// /// This class extends to provide support /// for reading and writing FLAC metadata boxes. /// /// /// At this point, only Xiph Comments and pictures are supported. /// public class Metadata : CombinedTag { /// /// Contains the pictures. /// private List pictures = new List(); /// /// Constructs and initializes a new instance of using a collection of blocks. /// /// /// A object containing objects to use in the new instance. /// /// /// is . /// [Obsolete("Use Metadata(IEnumerable)")] public Metadata (List blocks) : this (blocks as IEnumerable) { } /// /// Constructs and initializes a new instance of using a collection of blocks. /// /// /// A object enumerating objects to use in the new instance. /// /// /// is . /// public Metadata (IEnumerable blocks) { if (blocks == null) throw new ArgumentNullException ("blocks"); foreach (Block block in blocks) { if (block.Data.Count == 0) continue; if (block.Type == BlockType.XiphComment) AddTag (new Ogg.XiphComment (block.Data)); else if (block.Type == BlockType.Picture) pictures.Add (new Picture (block.Data)); } } /// /// Gets the first Xiph comment stored in the current /// instance, optionally creating one if necessary. /// /// /// A value indicating whether or not a /// comment should be added if one cannot be found. /// /// /// A object containing the source tag to /// copy the values from, or to not /// copy values. /// /// /// A object containing the /// tag that was found in or added to the current instance. /// If no matching tag was found and none was created, is returned. /// public Ogg.XiphComment GetComment (bool create, Tag copy) { foreach (Tag t in Tags) if (t is Ogg.XiphComment) return t as Ogg.XiphComment; if (!create) return null; Ogg.XiphComment c = new Ogg.XiphComment (); if (copy != null) copy.CopyTo (c, true); AddTag (c); return c; } /// /// Removes all child Xiph Comments from the current /// instance. /// public void RemoveComment () { Ogg.XiphComment c; while ((c = GetComment (false, null)) != null) RemoveTag (c); } /// /// Gets the tag types contained in the current instance. /// /// /// A bitwise combined value /// containing the tag types stored in the current instance. /// public override TagTypes TagTypes { get {return TagTypes.FlacMetadata | base.TagTypes;} } /// /// Gets and sets a collection of pictures associated with /// the media represented by the current instance. /// /// /// A containing a collection of /// pictures associated with the media represented by the /// current instance or an empty array if none are present. /// public override IPicture[] Pictures { get {return pictures.ToArray ();} set { pictures.Clear (); if (value != null) pictures.AddRange (value); } } /// /// Clears the values stored in the current instance. /// public override void Clear () { pictures.Clear (); } } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Flac/BlockHeader.cs0000644000175000017500000001220311462100402023567 0ustar00rubenruben00000000000000// // BlockHeader.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections.Generic; using System; namespace TagLib.Flac { /// /// Specifies the contents of a Flac block in . /// public enum BlockType { /// /// The block contains stream information. /// StreamInfo = 0, /// /// The block contains padding. /// Padding, /// /// The block contains application data. /// Application, /// /// The block contains seek table. /// SeekTable, /// /// The block contains a Xipp comment. /// XiphComment, /// /// The block contains a cue sheet. /// CueSheet, /// /// The block contains a picture. /// Picture } /// /// This structure provides a representation of a Flac metadata block /// header structure. /// public struct BlockHeader { /// /// Contains the block type. /// private BlockType block_type; /// /// Indicates whether or not this is the last metadata block. /// private bool is_last_block; /// /// Contains the block size. /// private uint block_size; /// /// The size of a block header. /// public const uint Size = 4; /// /// Constructs and initializes a new instance of by reading a raw header from a object. /// /// /// A object containing a raw /// block header. /// /// /// is . /// /// /// contains less than 4 bytes. /// public BlockHeader (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); if (data.Count < Size) throw new CorruptFileException ( "Not enough data in Flac header."); block_type = (BlockType) (data[0] & 0x7f); is_last_block = (data[0] & 0x80) != 0; block_size = data.Mid (1,3).ToUInt (); } /// /// Constructs and initializes a new instance of for a specified block type and size. /// /// /// A value describing the contents /// of the block. /// /// /// A value containing the block data /// size minus the size of the header. /// public BlockHeader (BlockType type, uint blockSize) { block_type = type; is_last_block = false; block_size = blockSize; } /// /// Renderes the current instance as a raw Flac block header. /// /// /// A value specifying whether or not the /// header is the last header of the file. /// /// /// A object containing the /// rendered header. /// public ByteVector Render (bool isLastBlock) { ByteVector data = ByteVector.FromUInt (block_size); data [0] = (byte)(block_type + (isLastBlock ? 0x80 : 0)); return data; } /// /// Gets the type of block described by the current instance. /// /// /// A value describing the block /// type. /// public BlockType BlockType { get {return block_type;} } /// /// Gets whether or not the block is the last in the file. /// /// /// if the block is the last in the /// file; otherwise . /// public bool IsLastBlock { get {return is_last_block;} } /// /// Gets the size of the block described by the current /// instance, minus the block header. /// /// /// A value containing the size of the /// block, minus the header. /// public uint BlockSize { get {return block_size;} } } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Flac/Block.cs0000644000175000017500000001266511462100402022472 0ustar00rubenruben00000000000000// // Block.cs: Represents a Flac metadata block. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.Flac { /// /// This class represents a Flac metadata block. /// public class Block { #region Private Fields /// /// Contains the block header. /// private BlockHeader header; /// /// Contains the block data. /// private ByteVector data; #endregion #region Constructors /// /// Constructs and initializes a new instance of with a specified header and internal /// data. /// /// /// A object containing the /// header to use for the new instance. /// /// /// A object containing the data /// to be contained in the new instance. /// /// /// is . /// /// /// The size of does not match the /// size specified in . /// public Block (BlockHeader header, ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); if (header.BlockSize != data.Count) throw new CorruptFileException ( "Data count not equal to block size."); this.header = header; this.data = data; } /// /// Constructs and initializes a new instance of with of a specified type and internal /// data. /// /// /// A value indicating the type of /// data stored in . /// /// /// A object containing the data /// to be contained in the new instance. /// /// /// is . /// public Block (BlockType type, ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); header = new BlockHeader (type, (uint) data.Count); this.data = data; } #endregion #region Public Properties /// /// Gets the type of data contained in the current instance. /// /// /// A value indicating the type of /// data contained in . /// public BlockType Type { get {return header.BlockType;} } /// /// Gets whether or not the block represented by the current /// instance is the last metadata block in the Flac stream. /// /// /// if the block represented by the /// current instance was the last one to appear in the file /// and is followed immediately by the audio data, or if another block appears after the /// current one or the block was not read from disk. /// public bool IsLastBlock { get {return header.IsLastBlock;} } /// /// Gets the size of the data contained in the current /// instance. /// public uint DataSize { get {return header.BlockSize;} } /// /// Gets the total size of the block represented by the /// current instance as it appears on disk. /// public uint TotalSize { get {return DataSize + BlockHeader.Size;} } /// /// Gets the data contained in the current instance. /// /// /// A object containing the data /// stored in the current instance. /// public ByteVector Data { get {return data;} } #endregion #region Public Methods /// /// Renders the current instance as a raw Flac metadata /// block. /// /// /// A value indicating whether or not the /// block is to be marked as the last metadata block. /// /// /// A object containing the /// rendered version of the current instance. /// public ByteVector Render (bool isLastBlock) { if (this.data == null) throw new InvalidOperationException ( "Cannot render empty blocks."); ByteVector data = header.Render (isLastBlock); data.Add (this.data); return data; } #endregion } }f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Flac/Picture.cs0000644000175000017500000002067211462100402023050 0ustar00rubenruben00000000000000// // Picture.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Flac { /// /// This class implements to provide support /// for reading and writing Flac picture metadata. /// public class Picture : IPicture { #region Private Fields /// /// Contains the picture type. /// private PictureType type; /// /// Contains the mime-type. /// private string mime_type; /// /// Contains the description. /// private string description; /// /// Contains the width. /// private int width = 0; /// /// Contains the height. /// private int height = 0; /// /// Contains the color depth. /// private int color_depth = 0; /// /// Contains the number of indexed colors. /// private int indexed_colors = 0; /// /// Contains the picture data. /// private ByteVector picture_data; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading the contents of a raw Flac /// image structure. /// /// /// A object containing the raw /// Flac image. /// /// /// is . /// /// /// contains less than 32 bytes. /// public Picture (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); if (data.Count < 32) throw new CorruptFileException ( "Data must be at least 32 bytes long"); int pos = 0; type = (PictureType) data.Mid (pos, 4).ToUInt (); pos += 4; int mimetype_length = (int) data.Mid (pos, 4).ToUInt (); pos += 4; mime_type = data.ToString (StringType.Latin1, pos, mimetype_length); pos += mimetype_length; int description_length = (int) data.Mid (pos, 4) .ToUInt (); pos += 4; description = data.ToString (StringType.UTF8, pos, description_length); pos += description_length; width = (int) data.Mid (pos, 4).ToUInt (); pos += 4; height = (int) data.Mid (pos, 4).ToUInt (); pos += 4; color_depth = (int) data.Mid (pos, 4).ToUInt (); pos += 4; indexed_colors = (int) data.Mid (pos, 4).ToUInt (); pos += 4; int data_length = (int) data.Mid (pos, 4).ToUInt (); pos += 4; picture_data = data.Mid (pos, data_length); } /// /// Constructs and initializes a new instance of by copying the properties of a object. /// /// /// A object to use for the new /// instance. /// /// /// is . /// public Picture (IPicture picture) { if (picture == null) throw new ArgumentNullException ("picture"); type = picture.Type; mime_type = picture.MimeType; description = picture.Description; picture_data = picture.Data; TagLib.Flac.Picture flac_picture = picture as TagLib.Flac.Picture; if (flac_picture == null) return; width = flac_picture.Width; height = flac_picture.Height; color_depth = flac_picture.ColorDepth; indexed_colors = flac_picture.IndexedColors; } #endregion #region Public Methods /// /// Renders the current instance as a raw Flac picture. /// /// /// A object containing the /// rendered version of the current instance. /// public ByteVector Render () { ByteVector data = new ByteVector (); data.Add (ByteVector.FromUInt ((uint) Type)); ByteVector mime_data = ByteVector.FromString (MimeType, StringType.Latin1); data.Add (ByteVector.FromUInt ((uint) mime_data.Count)); data.Add (mime_data); ByteVector decription_data = ByteVector.FromString ( Description, StringType.UTF8); data.Add (ByteVector.FromUInt ((uint) decription_data.Count)); data.Add (decription_data); data.Add (ByteVector.FromUInt ((uint) Width)); data.Add (ByteVector.FromUInt ((uint) Height)); data.Add (ByteVector.FromUInt ((uint) ColorDepth)); data.Add (ByteVector.FromUInt ((uint) IndexedColors)); data.Add (ByteVector.FromUInt ((uint) Data.Count)); data.Add (Data); return data; } #endregion #region Public Properties /// /// Gets and sets the mime-type of the picture data /// stored in the current instance. /// /// /// A object containing the mime-type /// of the picture data stored in the current instance. /// public string MimeType { get {return mime_type;} set {mime_type = value;} } /// /// Gets and sets the type of content visible in the picture /// stored in the current instance. /// /// /// A containing the type of /// content visible in the picture stored in the current /// instance. /// public PictureType Type { get {return type;} set {type = value;} } /// /// Gets and sets a description of the picture stored in the /// current instance. /// /// /// A object containing a description /// of the picture stored in the current instance. /// public string Description { get {return description;} set {description = value;} } /// /// Gets and sets the picture data stored in the current /// instance. /// /// /// A object containing the picture /// data stored in the current instance. /// public ByteVector Data { get {return picture_data;} set {picture_data = value;} } /// /// Gets and sets the width of the picture in the current /// instance. /// /// /// A value containing width of the /// picture stored in the current instance. /// public int Width { get {return width;} set {width = value;} } /// /// Gets and sets the height of the picture in the current /// instance. /// /// /// A value containing height of the /// picture stored in the current instance. /// public int Height { get {return height;} set {height = value;} } /// /// Gets and sets the color depth of the picture in the /// current instance. /// /// /// A value containing color depth of the /// picture stored in the current instance. /// public int ColorDepth { get {return color_depth;} set {color_depth = value;} } /// /// Gets and sets the number of indexed colors in the picture /// in the current instance. /// /// /// A value containing number of indexed /// colors in the picture, or zero if the picture is not /// stored in an indexed format. /// public int IndexedColors { get {return indexed_colors;} set {indexed_colors = value;} } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Flac/StreamHeader.cs0000644000175000017500000001444511462100402024002 0ustar00rubenruben00000000000000// // StreamHeader.cs: // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // flagproperties.cpp from TagLib // // Copyright (C) 2006-2007 Brian Nickel // Copyright (C) 2003 Allan Sandfeld Jensen (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections; using System; namespace TagLib.Flac { /// /// This structure implements and provides /// information about a Flac audio stream. /// public struct StreamHeader : IAudioCodec, ILosslessAudioCodec { #region Private Properties /// /// Contains the flags. /// private uint flags; /// /// Contains the low portion of the length. /// private uint low_length; /// /// Contains the stream length. /// private long stream_length; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading a raw stream header /// structure and using the stream length. /// /// /// A object containing the raw /// stream header. /// /// /// A value containing the length of the /// stream. /// /// /// is . /// /// /// contains less than 18 bytes. /// public StreamHeader (ByteVector data, long streamLength) { if (data == null) throw new ArgumentNullException ("data"); if (data.Count < 18) throw new CorruptFileException ( "Not enough data in FLAC header."); this.stream_length = streamLength; this.flags = data.Mid (10, 4).ToUInt (true); low_length = data.Mid (14, 4).ToUInt (true); } #endregion #region Public Properties /// /// Gets the duration of the media represented by the current /// instance. /// /// /// A containing the duration of the /// media represented by the current instance. /// public TimeSpan Duration { get { return (AudioSampleRate > 0 && stream_length > 0) ? TimeSpan.FromSeconds ( (double) low_length / (double) AudioSampleRate + (double) HighLength) : TimeSpan.Zero; } } /// /// Gets the bitrate of the audio represented by the current /// instance. /// /// /// A value containing a bitrate of the /// audio represented by the current instance. /// public int AudioBitrate { get { return (int) (Duration > TimeSpan.Zero ? ((stream_length * 8L) / Duration.TotalSeconds) / 1000 : 0); } } /// /// Gets the sample rate of the audio represented by the /// current instance. /// /// /// A value containing the sample rate of /// the audio represented by the current instance. /// public int AudioSampleRate { get {return (int) (flags >> 12);} } /// /// Gets the number of channels in the audio represented by /// the current instance. /// /// /// A value containing the number of /// channels in the audio represented by the current /// instance. /// public int AudioChannels { get {return (int) (((flags >> 9) & 7) + 1);} } /// /// Gets the types of media represented by the current /// instance. /// /// /// Always . /// public MediaTypes MediaTypes { get {return MediaTypes.Audio;} } /// /// Gets the sample width of the audio represented by the /// current instance. /// /// /// A value containing the sample width of /// the audio represented by the current instance. /// [Obsolete ("This property is depreciated, use BitsPerSample instead")] public int AudioSampleWidth { get {return BitsPerSample;} } /// /// Gets the number of bits per sample in the audio /// represented by the current instance. /// /// /// A value containing the number of bits /// per sample in the audio represented by the current /// instance. /// public int BitsPerSample { get {return (int) (((flags >> 4) & 31) + 1);} } /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public string Description { get {return "Flac Audio";} } #endregion #region Private Properties /// /// Gets a high portion of the length of the audio /// represented by the current instance. /// /// /// A value containing the high portion /// of the length. /// private uint HighLength { get { // The last 4 bits are the most significant 4 // bits for the 36 bit stream length in samples. // (Audio files measured in days) return (uint) (AudioSampleRate > 0 ? (((flags & 0xf) << 28) / AudioSampleRate) << 4 : 0); } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/CombinedTag.cs0000644000175000017500000011552411462100402022745 0ustar00rubenruben00000000000000// // CombinedTag.cs: Combines a collection of tags so that they behave as one. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Copyright (C) 2005-2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections.Generic; namespace TagLib { /// /// This class combines a collection of tags so that they behave as /// one. /// public class CombinedTag : Tag { #region Private Fields /// /// Contains tags to be combined. /// private List tags; #endregion #region Constructors /// /// Constructs and initializes a new instance of with no internal tags. /// /// /// You can set the tags in the new instance later using /// . /// public CombinedTag () { this.tags = new List (); } /// /// Constructs and initializes a new instance of with a specified collection of /// tags. /// /// /// A containing a collection of tags to /// combine in the new instance. /// public CombinedTag (params Tag [] tags) { this.tags = new List (tags); } #endregion #region Public Properties /// /// Gets the tags combined in the current instance. /// /// /// A containing the tags combined in /// the current instance. /// public virtual Tag [] Tags { get {return tags.ToArray ();} } #endregion #region Public Methods /// /// Sets the child tags to combine in the current instance. /// /// /// A containing the tags to combine. /// public void SetTags (params Tag [] tags) { this.tags.Clear (); this.tags.AddRange (tags); } #endregion #region Protected Methods /// /// Inserts a tag into the collection of tags in the current /// instance. /// /// /// A value specifying the index at which /// to insert the tag. /// /// /// A object to insert into the collection /// of tags. /// /// /// is less than zero or greater /// than the count. /// protected void InsertTag (int index, Tag tag) { this.tags.Insert (index, tag); } /// /// Adds a tag at the end of the collection of tags in the /// current instance. /// /// /// A object to add to the collection of /// tags. /// protected void AddTag (Tag tag) { this.tags.Add (tag); } /// /// Removes a specified tag from the collection in the /// current instance. /// /// /// A object to remove from the /// collection. /// protected void RemoveTag (Tag tag) { this.tags.Remove (tag); } /// /// Clears the tag collection in the current instance. /// protected void ClearTags () { this.tags.Clear (); } #endregion #region Overrides /// /// Gets the tag types contained in the current instance. /// /// /// A bitwise combined /// containing the tag types contained in the current /// instance. /// /// /// This value contains a bitwise combined value from all the /// child tags. /// /// public override TagTypes TagTypes { get { TagTypes types = TagTypes.None; foreach (Tag tag in tags) if (tag != null) types |= tag.TagTypes; return types; } } /// /// Gets and sets the title for the media described by the /// current instance. /// /// /// A object containing the title for /// the media described by the current instance or if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string Title { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.Title; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.Title = value; } } /// /// Gets and sets the performers or artists who performed in /// the media described by the current instance. /// /// /// A containing the performers or /// artists who performed in the media described by the /// current instance or an empty array if no value is /// present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string [] Performers { get { foreach (Tag tag in tags) { if (tag == null) continue; string [] value = tag.Performers; if (value != null && value.Length > 0) return value; } return new string [] {}; } set { foreach (Tag tag in tags) if (tag != null) tag.Performers = value; } } /// /// Gets and sets the sort names of the performers or artists /// who performed in the media described by the current instance. /// /// /// A containing the sort names for /// the performers or artists who performed in the media /// described by the current instance, or an empty array if /// no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string[] PerformersSort { get { foreach (Tag tag in tags) { if (tag == null) continue; string[] value = tag.PerformersSort; if (value != null && value.Length > 0) return value; } return new string[] { }; } set { foreach (Tag tag in tags) if (tag != null) tag.PerformersSort = value; } } /// /// Gets and sets the sort names for the band or artist who /// is credited in the creation of the entire album or /// collection containing the media described by the /// current instance. /// /// /// A containing the sort names /// for the band or artist who is credited in the creation /// of the entire album or collection containing the media /// described by the current instance or an empty array if /// no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string[] AlbumArtistsSort { get { foreach (Tag tag in tags) { if (tag == null) continue; string[] value = tag.AlbumArtistsSort; if (value != null && value.Length > 0) return value; } return new string[] { }; } set { foreach (Tag tag in tags) if (tag != null) tag.AlbumArtistsSort = value; } } /// /// Gets and sets the band or artist who is credited in the /// creation of the entire album or collection containing the /// media described by the current instance. /// /// /// A containing the band or artist /// who is credited in the creation of the entire album or /// collection containing the media described by the current /// instance or an empty array if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string [] AlbumArtists { get { foreach (Tag tag in tags) { if (tag == null) continue; string [] value = tag.AlbumArtists; if (value != null && value.Length > 0) return value; } return new string [] {}; } set { foreach (Tag tag in tags) if (tag != null) tag.AlbumArtists = value; } } /// /// Gets and sets the composers of the media represented by /// the current instance. /// /// /// A containing the composers of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string [] Composers { get { foreach (Tag tag in tags) { if (tag == null) continue; string [] value = tag.Composers; if (value != null && value.Length > 0) return value; } return new string [] {}; } set { foreach (Tag tag in tags) if (tag != null) tag.Composers = value; } } /// /// Gets and sets the sort names for the composer of the /// media described by the current instance. /// /// /// A containing the sort names /// for the composers of the media described by the /// current instance or an empty array if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string[] ComposersSort { get { foreach (Tag tag in tags) { if (tag == null) continue; string[] value = tag.ComposersSort; if (value != null && value.Length > 0) return value; } return new string[] { }; } set { foreach (Tag tag in tags) if (tag != null) tag.ComposersSort = value; } } /// /// Gets and sets the sort names for the Track Title of the /// media described by the current instance. /// /// /// A containing the sort names /// for the Track Title of the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string TitleSort { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.TitleSort; if (value != null && value.Length > 0) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.TitleSort = value; } } /// /// Gets and sets the sort names for the Album Title of the /// media described by the current instance. /// /// /// A containing the sort names /// for the Title of the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string AlbumSort { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.AlbumSort; if (value != null && value.Length > 0) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.AlbumSort = value; } } /// /// Gets and sets the album of the media represented by the /// current instance. /// /// /// A object containing the album of /// the media represented by the current instance or if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string Album { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.Album; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.Album = value; } } /// /// Gets and sets a user comment on the media represented by /// the current instance. /// /// /// A object containing user comments /// on the media represented by the current instance or if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string Comment { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.Comment; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.Comment = value; } } /// /// Gets and sets the genres of the media represented by the /// current instance. /// /// /// A containing the genres of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string [] Genres { get { foreach (Tag tag in tags) { if (tag == null) continue; string [] value = tag.Genres; if (value != null && value.Length > 0) return value; } return new string [] {}; } set { foreach (Tag tag in tags) if (tag != null) tag.Genres = value; } } /// /// Gets and sets the year that the media represented by the /// current instance was recorded. /// /// /// A containing the year that the media /// represented by the current instance was created or zero /// if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non-zero value is /// returned. /// When setting the value, it is stored in each child /// tag. /// /// public override uint Year { get { foreach (Tag tag in tags) { if (tag == null) continue; uint value = tag.Year; if (value != 0) return value; } return 0; } set { foreach (Tag tag in tags) if (tag != null) tag.Year = value; } } /// /// Gets and sets the position of the media represented by /// the current instance in its containing album. /// /// /// A containing the position of the /// media represented by the current instance in its /// containing album or zero if not specified. /// /// /// When getting the value, the child tags are looped /// through in order and the first non-zero value is /// returned. /// When setting the value, it is stored in each child /// tag. /// /// public override uint Track { get { foreach (Tag tag in tags) { if (tag == null) continue; uint value = tag.Track; if (value != 0) return value; } return 0; } set { foreach (Tag tag in tags) if (tag != null) tag.Track = value; } } /// /// Gets and sets the number of tracks in the album /// containing the media represented by the current instance. /// /// /// A containing the number of tracks in /// the album containing the media represented by the current /// instance or zero if not specified. /// /// /// When getting the value, the child tags are looped /// through in order and the first non-zero value is /// returned. /// When setting the value, it is stored in each child /// tag. /// /// public override uint TrackCount { get { foreach (Tag tag in tags) { if (tag == null) continue; uint value = tag.TrackCount; if (value != 0) return value; } return 0; } set { foreach (Tag tag in tags) if (tag != null) tag.TrackCount = value; } } /// /// Gets and sets the number of the disc containing the media /// represented by the current instance in the boxed set. /// /// /// A containing the number of the disc /// containing the media represented by the current instance /// in the boxed set. /// /// /// When getting the value, the child tags are looped /// through in order and the first non-zero value is /// returned. /// When setting the value, it is stored in each child /// tag. /// /// public override uint Disc { get { foreach (Tag tag in tags) { if (tag == null) continue; uint value = tag.Disc; if (value != 0) return value; } return 0; } set { foreach (Tag tag in tags) if (tag != null) tag.Disc = value; } } /// /// Gets and sets the number of discs in the boxed set /// containing the media represented by the current instance. /// /// /// A containing the number of discs in /// the boxed set containing the media represented by the /// current instance or zero if not specified. /// /// /// When getting the value, the child tags are looped /// through in order and the first non-zero value is /// returned. /// When setting the value, it is stored in each child /// tag. /// /// public override uint DiscCount { get { foreach (Tag tag in tags) { if (tag == null) continue; uint value = tag.DiscCount; if (value != 0) return value; } return 0; } set { foreach (Tag tag in tags) if (tag != null) tag.DiscCount = value; } } /// /// Gets and sets the lyrics or script of the media /// represented by the current instance. /// /// /// A object containing the lyrics or /// script of the media represented by the current instance /// or if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string Lyrics { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.Lyrics; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.Lyrics = value; } } /// /// Gets and sets the grouping on the album which the media /// in the current instance belongs to. /// /// /// A object containing the grouping on /// the album which the media in the current instance belongs /// to or if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string Grouping { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.Grouping; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.Grouping = value; } } /// /// Gets and sets the number of beats per minute in the audio /// of the media represented by the current instance. /// /// /// A containing the number of beats per /// minute in the audio of the media represented by the /// current instance, or zero if not specified. /// /// /// When getting the value, the child tags are looped /// through in order and the first non-zero value is /// returned. /// When setting the value, it is stored in each child /// tag. /// /// public override uint BeatsPerMinute { get { foreach (Tag tag in tags) { if (tag == null) continue; uint value = tag.BeatsPerMinute; if (value != 0) return value; } return 0; } set { foreach (Tag tag in tags) if (tag != null) tag.BeatsPerMinute = value; } } /// /// Gets and sets the conductor or director of the media /// represented by the current instance. /// /// /// A object containing the conductor /// or director of the media represented by the current /// instance or if no value present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string Conductor { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.Conductor; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.Conductor = value; } } /// /// Gets and sets the copyright information for the media /// represented by the current instance. /// /// /// A object containing the copyright /// information for the media represented by the current /// instance or if no value present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string Copyright { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.Copyright; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.Copyright = value; } } /// /// Gets and sets the MusicBrainz Artist ID. /// /// /// A containing the MusicBrainz /// ArtistID for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string MusicBrainzArtistId { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.MusicBrainzArtistId; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.MusicBrainzArtistId = value; } } /// /// Gets and sets the MusicBrainz Release ID. /// /// /// A containing the MusicBrainz /// ReleaseID for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string MusicBrainzReleaseId { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.MusicBrainzReleaseId; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.MusicBrainzReleaseId = value; } } /// /// Gets and sets the MusicBrainz Release Artist ID. /// /// /// A containing the MusicBrainz /// ReleaseArtistID for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string MusicBrainzReleaseArtistId { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.MusicBrainzReleaseArtistId; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.MusicBrainzReleaseArtistId = value; } } /// /// Gets and sets the MusicBrainz Track ID. /// /// /// A containing the MusicBrainz /// TrackID for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string MusicBrainzTrackId { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.MusicBrainzTrackId; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.MusicBrainzTrackId = value; } } /// /// Gets and sets the MusicBrainz Disc ID. /// /// /// A containing the MusicBrainz /// DiscID for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string MusicBrainzDiscId { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.MusicBrainzDiscId; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.MusicBrainzDiscId = value; } } /// /// Gets and sets the MusicIP PUID. /// /// /// A containing the MusicIP PUID /// for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string MusicIpId { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.MusicIpId; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.MusicIpId = value; } } /// /// Gets and sets the Amazon ID. /// /// /// A containing the Amazon Id /// for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string AmazonId { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.AmazonId; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.AmazonId = value; } } /// /// Gets and sets the MusicBrainz Release Status. /// /// /// A containing the MusicBrainz /// ReleaseStatus for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string MusicBrainzReleaseStatus { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.MusicBrainzReleaseStatus; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.MusicBrainzReleaseStatus = value; } } /// /// Gets and sets the MusicBrainz Release Type. /// /// /// A containing the MusicBrainz /// ReleaseType for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string MusicBrainzReleaseType { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.MusicBrainzReleaseType; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.MusicBrainzReleaseType = value; } } /// /// Gets and sets the MusicBrainz Release Country. /// /// /// A containing the MusicBrainz /// ReleaseCountry for the media described by the /// current instance or null if no value is present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override string MusicBrainzReleaseCountry { get { foreach (Tag tag in tags) { if (tag == null) continue; string value = tag.MusicBrainzReleaseCountry; if (value != null) return value; } return null; } set { foreach (Tag tag in tags) if (tag != null) tag.MusicBrainzReleaseCountry = value; } } /// /// Gets and sets a collection of pictures associated with /// the media represented by the current instance. /// /// /// A containing a collection of /// pictures associated with the media represented by the /// current instance or an empty array if none are present. /// /// /// When getting the value, the child tags are looped /// through in order and the first non- /// and non-empty value is returned. /// When setting the value, it is stored in each child /// tag. /// /// public override IPicture [] Pictures { get { foreach(Tag tag in tags) { if (tag == null) continue; IPicture [] value = tag.Pictures; if (value != null && value.Length > 0) return value; } return base.Pictures; } set { foreach(Tag tag in tags) if(tag != null) tag.Pictures = value; } } /// /// Gets whether or not the current instance is empty. /// /// /// if all the child tags are empty. /// Otherwise . /// /// public override bool IsEmpty { get { foreach (Tag tag in tags) if (tag.IsEmpty) return true; return false; } } /// /// Clears all of the child tags. /// public override void Clear () { foreach (Tag tag in tags) tag.Clear (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/0000777000175000017500000000000011503407422020650 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/IFDTag.cs0000644000175000017500000004315011470571657022253 0ustar00rubenruben00000000000000// // IFDTag.cs: Basic Tag-class to handle an IFD (Image File Directory) with // its image-tags. // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // Paul Lange (palango@gmx.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using System.IO; using TagLib.Image; using TagLib.IFD.Entries; using TagLib.IFD.Tags; namespace TagLib.IFD { /// /// Contains the metadata for one IFD (Image File Directory). /// public class IFDTag : ImageTag { #region Private Fields /// /// A reference to the Exif IFD (which can be found by following the /// pointer in IFD0, ExifIFD tag). This variable should not be used /// directly, use the property instead. /// private IFDStructure exif_ifd = null; /// /// A reference to the GPS IFD (which can be found by following the /// pointer in IFD0, GPSIFD tag). This variable should not be used /// directly, use the property instead. /// private IFDStructure gps_ifd = null; #endregion #region Public Properties /// /// The IFD structure referenced by the current instance /// public IFDStructure Structure { get; private set; } /// /// The Exif IFD. Will create one if the file doesn't alread have it. /// /// /// Note how this also creates an empty IFD for exif, even if /// you don't set a value. That's okay, empty nested IFDs get ignored /// when rendering. /// public IFDStructure ExifIFD { get { if (exif_ifd == null) { var entry = Structure.GetEntry (0, IFDEntryTag.ExifIFD) as SubIFDEntry; if (entry == null) { exif_ifd = new IFDStructure (); entry = new SubIFDEntry ((ushort) IFDEntryTag.ExifIFD, (ushort) IFDEntryType.Long, 1, exif_ifd); Structure.SetEntry (0, entry); } exif_ifd = entry.Structure; } return exif_ifd; } } /// /// The GPS IFD. Will create one if the file doesn't alread have it. /// /// /// Note how this also creates an empty IFD for GPS, even if /// you don't set a value. That's okay, empty nested IFDs get ignored /// when rendering. /// public IFDStructure GPSIFD { get { if (gps_ifd == null) { var entry = Structure.GetEntry (0, IFDEntryTag.GPSIFD) as SubIFDEntry; if (entry == null) { gps_ifd = new IFDStructure (); entry = new SubIFDEntry ((ushort) IFDEntryTag.GPSIFD, (ushort) IFDEntryType.Long, 1, gps_ifd); Structure.SetEntry (0, entry); } gps_ifd = entry.Structure; } return gps_ifd; } } /// /// Gets the tag types contained in the current instance. /// /// /// Always . /// public override TagTypes TagTypes { get { return TagTypes.TiffIFD; } } #endregion #region Constructors /// /// Constructor. Creates an empty IFD tag. Can be populated manually, or via /// . /// public IFDTag () { Structure = new IFDStructure (); } #endregion #region Public Methods /// /// Clears the values stored in the current instance. /// public override void Clear () { throw new NotImplementedException (); } #endregion #region Metadata fields /// /// Gets or sets the comment for the image described /// by the current instance. /// /// /// A containing the comment of the /// current instace. /// public override string Comment { get { var comment_entry = ExifIFD.GetEntry (0, (ushort) ExifEntryTag.UserComment) as UserCommentIFDEntry; if (comment_entry == null) { var description = Structure.GetEntry (0, IFDEntryTag.ImageDescription) as StringIFDEntry; return description == null ? null : description.Value; } return comment_entry.Value; } set { if (value == null) { ExifIFD.RemoveTag (0, (ushort) ExifEntryTag.UserComment); Structure.RemoveTag (0, (ushort) IFDEntryTag.ImageDescription); return; } ExifIFD.SetEntry (0, new UserCommentIFDEntry ((ushort) ExifEntryTag.UserComment, value)); Structure.SetEntry (0, new StringIFDEntry ((ushort) IFDEntryTag.ImageDescription, value)); } } /// /// Gets and sets the copyright information for the media /// represented by the current instance. /// /// /// A object containing the copyright /// information for the media represented by the current /// instance or if no value present. /// public override string Copyright { get { return Structure.GetStringValue (0, (ushort) IFDEntryTag.Copyright); } set { if (value == null) { Structure.RemoveTag (0, (ushort) IFDEntryTag.Copyright); return; } Structure.SetEntry (0, new StringIFDEntry ((ushort) IFDEntryTag.Copyright, value)); } } /// /// Gets or sets the creator of the image. /// /// /// A with the name of the creator. /// public override string Creator { get { return Structure.GetStringValue (0, (ushort) IFDEntryTag.Artist); } set { Structure.SetStringValue (0, (ushort) IFDEntryTag.Artist, value); } } /// /// Gets or sets the software the image, the current instance /// belongs to, was created with. /// /// /// A containing the name of the /// software the current instace was created with. /// public override string Software { get { return Structure.GetStringValue (0, (ushort) IFDEntryTag.Software); } set { Structure.SetStringValue (0, (ushort) IFDEntryTag.Software, value); } } /// /// Gets or sets the time when the image, the current instance /// belongs to, was taken. /// /// /// A with the time the image was taken. /// public override DateTime? DateTime { get { return DateTimeOriginal; } set { DateTimeOriginal = value; } } /// /// The time of capturing. /// /// /// A with the time of capturing. /// public DateTime? DateTimeOriginal { get { return ExifIFD.GetDateTimeValue (0, (ushort) ExifEntryTag.DateTimeOriginal); } set { if (value == null) { ExifIFD.RemoveTag (0, (ushort) ExifEntryTag.DateTimeOriginal); return; } ExifIFD.SetDateTimeValue (0, (ushort) ExifEntryTag.DateTimeOriginal, value.Value); } } /// /// The time of digitization. /// /// /// A with the time of digitization. /// public DateTime? DateTimeDigitized { get { return ExifIFD.GetDateTimeValue (0, (ushort) ExifEntryTag.DateTimeDigitized); } set { if (value == null) { ExifIFD.RemoveTag (0, (ushort) ExifEntryTag.DateTimeDigitized); return; } ExifIFD.SetDateTimeValue (0, (ushort) ExifEntryTag.DateTimeDigitized, value.Value); } } /// /// Gets or sets the latitude of the GPS coordinate the current /// image was taken. /// /// /// A with the latitude ranging from -90.0 /// to +90.0 degrees. /// public override double? Latitude { get { var gps_ifd = GPSIFD; var degree_entry = gps_ifd.GetEntry (0, (ushort) GPSEntryTag.GPSLatitude) as RationalArrayIFDEntry; var degree_ref = gps_ifd.GetStringValue (0, (ushort) GPSEntryTag.GPSLatitudeRef); if (degree_entry == null || degree_ref == null) return null; Rational [] values = degree_entry.Values; if (values.Length != 3) return null; double deg = values[0] + values[1] / 60.0d + values[2] / 3600.0d; if (degree_ref == "S") deg *= -1.0d; return Math.Max (Math.Min (deg, 90.0d), -90.0d); } set { var gps_ifd = GPSIFD; if (value == null) { gps_ifd.RemoveTag (0, (ushort) GPSEntryTag.GPSLatitudeRef); gps_ifd.RemoveTag (0, (ushort) GPSEntryTag.GPSLatitude); return; } double angle = value.Value; if (angle < -90.0d || angle > 90.0d) throw new ArgumentException ("value"); InitGpsDirectory (); gps_ifd.SetStringValue (0, (ushort) GPSEntryTag.GPSLatitudeRef, angle < 0 ? "S" : "N"); var entry = new RationalArrayIFDEntry ((ushort) GPSEntryTag.GPSLatitude, DegreeToRationals (Math.Abs (angle))); gps_ifd.SetEntry (0, entry); } } /// /// Gets or sets the longitude of the GPS coordinate the current /// image was taken. /// /// /// A with the longitude ranging from -180.0 /// to +180.0 degrees. /// public override double? Longitude { get { var gps_ifd = GPSIFD; var degree_entry = gps_ifd.GetEntry (0, (ushort) GPSEntryTag.GPSLongitude) as RationalArrayIFDEntry; var degree_ref = gps_ifd.GetStringValue (0, (ushort) GPSEntryTag.GPSLongitudeRef); if (degree_entry == null || degree_ref == null) return null; Rational [] values = degree_entry.Values; if (values.Length != 3) return null; double deg = values[0] + values[1] / 60.0d + values[2] / 3600.0d; if (degree_ref == "W") deg *= -1.0d; return Math.Max (Math.Min (deg, 180.0d), -180.0d); } set { var gps_ifd = GPSIFD; if (value == null) { gps_ifd.RemoveTag (0, (ushort) GPSEntryTag.GPSLongitudeRef); gps_ifd.RemoveTag (0, (ushort) GPSEntryTag.GPSLongitude); return; } double angle = value.Value; if (angle < -180.0d || angle > 180.0d) throw new ArgumentException ("value"); InitGpsDirectory (); gps_ifd.SetStringValue (0, (ushort) GPSEntryTag.GPSLongitudeRef, angle < 0 ? "W" : "E"); var entry = new RationalArrayIFDEntry ((ushort) GPSEntryTag.GPSLongitude, DegreeToRationals (Math.Abs (angle))); gps_ifd.SetEntry (0, entry); } } /// /// Gets or sets the altitude of the GPS coordinate the current /// image was taken. The unit is meter. /// /// /// A with the altitude. A positive value /// is above sea level, a negative one below sea level. The unit is meter. /// public override double? Altitude { get { var gps_ifd = GPSIFD; var altitude = gps_ifd.GetRationalValue (0, (ushort) GPSEntryTag.GPSAltitude); var ref_entry = gps_ifd.GetByteValue (0, (ushort) GPSEntryTag.GPSAltitudeRef); if (altitude == null || ref_entry == null) return null; if (ref_entry.Value == 1) altitude *= -1.0d; return altitude; } set { var gps_ifd = GPSIFD; if (value == null) { gps_ifd.RemoveTag (0, (ushort) GPSEntryTag.GPSAltitudeRef); gps_ifd.RemoveTag (0, (ushort) GPSEntryTag.GPSAltitude); return; } double altitude = value.Value; InitGpsDirectory (); gps_ifd.SetByteValue (0, (ushort) GPSEntryTag.GPSAltitudeRef, (byte)(altitude < 0 ? 1 : 0)); gps_ifd.SetRationalValue (0, (ushort) GPSEntryTag.GPSAltitude, Math.Abs (altitude)); } } /// /// Gets the exposure time the image, the current instance belongs /// to, was taken with. /// /// /// A with the exposure time in seconds. /// public override double? ExposureTime { get { return ExifIFD.GetRationalValue (0, (ushort) ExifEntryTag.ExposureTime); } set { ExifIFD.SetRationalValue (0, (ushort) ExifEntryTag.ExposureTime, value.HasValue ? (double) value : 0); } } /// /// Gets the FNumber the image, the current instance belongs /// to, was taken with. /// /// /// A with the FNumber. /// public override double? FNumber { get { return ExifIFD.GetRationalValue (0, (ushort) ExifEntryTag.FNumber); } set { ExifIFD.SetRationalValue (0, (ushort) ExifEntryTag.FNumber, value.HasValue ? (double) value : 0); } } /// /// Gets the ISO speed the image, the current instance belongs /// to, was taken with. /// /// /// A with the ISO speed as defined in ISO 12232. /// public override uint? ISOSpeedRatings { get { return ExifIFD.GetLongValue (0, (ushort) ExifEntryTag.ISOSpeedRatings); } set { ExifIFD.SetLongValue (0, (ushort) ExifEntryTag.ISOSpeedRatings, value.HasValue ? (uint) value : 0); } } /// /// Gets the focal length the image, the current instance belongs /// to, was taken with. /// /// /// A with the focal length in millimeters. /// public override double? FocalLength { get { return ExifIFD.GetRationalValue (0, (ushort) ExifEntryTag.FocalLength); } set { ExifIFD.SetRationalValue (0, (ushort) ExifEntryTag.FocalLength, value.HasValue ? (double) value : 0); } } /// /// Gets the focal length the image, the current instance belongs /// to, was taken with, assuming a 35mm film camera. /// /// /// A with the focal length in 35mm equivalent in millimeters. /// public override uint? FocalLengthIn35mmFilm { get { return ExifIFD.GetLongValue (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm); } set { if (value.HasValue) { ExifIFD.SetLongValue (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm, (uint) value); } else { ExifIFD.RemoveTag (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm); } } } /// /// Gets or sets the orientation of the image described /// by the current instance. /// /// /// A containing the orientation of the /// image /// public override ImageOrientation Orientation { get { var orientation = Structure.GetLongValue (0, (ushort) IFDEntryTag.Orientation); if (orientation.HasValue) return (ImageOrientation) orientation; return ImageOrientation.None; } set { if ((uint) value < 1U || (uint) value > 8U) { Structure.RemoveTag (0, (ushort) IFDEntryTag.Orientation); return; } Structure.SetLongValue (0, (ushort) IFDEntryTag.Orientation, (uint) value); } } /// /// Gets the manufacture of the recording equipment the image, the /// current instance belongs to, was taken with. /// /// /// A with the manufacture name. /// public override string Make { get { return Structure.GetStringValue (0, (ushort) IFDEntryTag.Make); } set { Structure.SetStringValue (0, (ushort) IFDEntryTag.Make, value); } } /// /// Gets the model name of the recording equipment the image, the /// current instance belongs to, was taken with. /// /// /// A with the model name. /// public override string Model { get { return Structure.GetStringValue (0, (ushort) IFDEntryTag.Model); } set { Structure.SetStringValue (0, (ushort) IFDEntryTag.Model, value); } } #endregion #region Private Methods /// /// Initilazies the GPS IFD with some basic entries. /// private void InitGpsDirectory () { GPSIFD.SetStringValue (0, (ushort) GPSEntryTag.GPSVersionID, "2 0 0 0"); GPSIFD.SetStringValue (0, (ushort) GPSEntryTag.GPSMapDatum, "WGS-84"); } /// /// Converts a given (positive) angle value to three rationals like they /// are used to store an angle for GPS data. /// /// /// A between 0.0d and 180.0d with the angle /// in degrees /// /// /// A representing the same angle by degree, minutes /// and seconds of the angle. /// private Rational[] DegreeToRationals (double angle) { if (angle < 0.0 || angle > 180.0) throw new ArgumentException ("angle"); uint deg = (uint) Math.Floor (angle); uint min = (uint) ((angle - Math.Floor (angle)) * 60.0); uint sec = (uint) ((angle - Math.Floor (angle) - (min / 60.0)) * 360000000.0); Rational[] rationals = new Rational [] { new Rational (deg, 1), new Rational (min, 1), new Rational (sec, 100000) }; return rationals; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Makernotes/0000777000175000017500000000000011503407422022760 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Makernotes/Nikon3MakernoteReader.cs0000644000175000017500000001101611470571657027453 0ustar00rubenruben00000000000000// // Nikon3MakernoteReader.cs: Reads Nikon Makernotes. // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using TagLib.IFD.Entries; using TagLib.IFD.Tags; namespace TagLib.IFD.Makernotes { /// /// This class contains Nikon3 makernote specific reading logic. /// public class Nikon3MakernoteReader : IFDReader { #region Constructors /// /// Constructor. Reads an IFD from given file, using the given endianness. /// /// /// A to read from. /// /// /// A , it must be true, if the data of the IFD should be /// read as bigendian, otherwise false. /// /// /// A that will be populated. /// /// /// A value describing the base were the IFD offsets /// refer to. E.g. in Jpegs the IFD are located in an Segment and the offsets /// inside the IFD refer from the beginning of this segment. So must contain the beginning of the segment. /// /// /// A value with the beginning of the IFD relative to /// . /// /// /// A value with maximal possible offset. This is to limit /// the size of the possible data; /// public Nikon3MakernoteReader (File file, bool is_bigendian, IFDStructure structure, long base_offset, uint ifd_offset, uint max_offset) : base (file, is_bigendian, structure, base_offset, ifd_offset, max_offset) { } #endregion #region Protected Methods /// /// Try to parse the given IFD entry, used to discover format-specific entries. /// /// /// A with the tag of the entry. /// /// /// A with the type of the entry. /// /// /// A with the data count of the entry. /// /// /// A with the base offset which every offsets in the /// IFD are relative to. /// /// /// A with the offset of the entry. /// /// /// A with the given parameters, or null if none was parsed, after /// which the normal TIFF parsing is used. /// protected override IFDEntry ParseIFDEntry (ushort tag, ushort type, uint count, long base_offset, uint offset) { if (tag == (ushort) Nikon3MakerNoteEntryTag.Preview) { // SubIFD with Preview Image // The entry itself is usually a long // TODO: handle JPEGInterchangeFormat and JPEGInterchangeFormatLength correctly // The preview field contains a long with an offset to an IFD // that contains the preview image. We need to be careful // though: this IFD does not contain a valid next-offset // pointer. For this reason, we only read the first IFD and // ignore the rest (which is preview image data, directly // starting after the IFD entries). type = (ushort) IFDEntryType.IFD; IFDStructure ifd_structure = new IFDStructure (); IFDReader reader = CreateSubIFDReader (file, is_bigendian, ifd_structure, base_offset, offset, max_offset); reader.Read (1); return new SubIFDEntry (tag, type, (uint) ifd_structure.Directories.Length, ifd_structure); } return base.ParseIFDEntry (tag, type, count, base_offset, offset); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/IFDRenderer.cs0000644000175000017500000002140211470571657023302 0ustar00rubenruben00000000000000// // IFDRenderer.cs: Outputs an IFD structure into TIFF IFD bytes. // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using TagLib.IFD.Entries; namespace TagLib.IFD { /// /// This class contains all the IFD rendering code. /// public class IFDRenderer { #region Private Fields /// /// The IFD structure that will be rendered. /// private readonly IFDStructure structure; /// /// If IFD should be encoded in BigEndian or not. /// private readonly bool is_bigendian; /// /// A value with the offset of the /// current IFD. All offsets inside the IFD must be adjusted /// according to this given offset. /// private readonly uint ifd_offset; #endregion #region Constructors /// /// Constructor. Will render the given IFD structure. /// /// /// If IFD should be encoded in BigEndian or not. /// /// /// The IFD structure that will be rendered. /// /// /// A value with the offset of the /// current IFD. All offsets inside the IFD must be adjusted /// according to this given offset. /// public IFDRenderer (bool is_bigendian, IFDStructure structure, uint ifd_offset) { this.is_bigendian = is_bigendian; this.structure = structure; this.ifd_offset = ifd_offset; } #endregion #region Public Methods /// /// Renders the current instance to a . /// /// /// A containing the rendered IFD. /// public ByteVector Render () { ByteVector ifd_data = new ByteVector (); uint current_offset = ifd_offset; var directories = structure.directories; for (int index = 0; index < directories.Count; index++) { ByteVector data = RenderIFD (directories [index], current_offset, index == directories.Count - 1); current_offset += (uint) data.Count; ifd_data.Add (data); } return ifd_data; } #endregion #region Private Methods /// /// Renders the IFD to an ByteVector where the offset of the IFD /// itself is and all offsets /// contained in the IFD are adjusted accroding it. /// /// /// A with the directory to render. /// /// /// A with the offset of the IFD /// /// /// A which is true, if the IFD is /// the last one, i.e. the offset to the next IFD, which is /// stored inside the IFD, is 0. If the value is false, the /// offset to the next IFD is set that it starts directly after /// the current one. /// /// /// A with the rendered IFD. /// private ByteVector RenderIFD (IFDDirectory directory, uint ifd_offset, bool last) { if (directory.Count > (int)UInt16.MaxValue) throw new Exception (String.Format ("Directory has too much entries: {0}", directory.Count)); // Remove empty SUB ifds. var tags = new List (directory.Keys); foreach (var tag in tags) { var entry = directory [tag]; if (entry is SubIFDEntry && (entry as SubIFDEntry).ChildCount == 0) { directory.Remove (tag); } } ushort entry_count = (ushort) directory.Count; // ifd_offset + size of entry_count + entries + next ifd offset uint data_offset = ifd_offset + 2 + 12 * (uint) entry_count + 4; // store the entries itself ByteVector entry_data = new ByteVector (); // store the data referenced by the entries ByteVector offset_data = new ByteVector (); entry_data.Add (ByteVector.FromUShort (entry_count, is_bigendian)); foreach (IFDEntry entry in directory.Values) RenderEntryData (entry, entry_data, offset_data, data_offset); if (last) entry_data.Add ("\0\0\0\0"); else entry_data.Add (ByteVector.FromUInt ((uint) (data_offset + offset_data.Count), is_bigendian)); if (data_offset - ifd_offset != entry_data.Count) throw new Exception (String.Format ("Expected IFD data size was {0} but is {1}", data_offset - ifd_offset, entry_data.Count)); entry_data.Add (offset_data); return entry_data; } #endregion #region Protected Methods /// /// Adds the data of a single entry to . /// /// /// A to add the entry to. /// /// /// A with the tag of the entry. /// /// /// A with the type of the entry. /// /// /// A with the data count of the entry, /// /// /// A with the offset field of the entry. /// protected void RenderEntry (ByteVector entry_data, ushort tag, ushort type, uint count, uint offset) { entry_data.Add (ByteVector.FromUShort (tag, is_bigendian)); entry_data.Add (ByteVector.FromUShort (type, is_bigendian)); entry_data.Add (ByteVector.FromUInt (count, is_bigendian)); entry_data.Add (ByteVector.FromUInt (offset, is_bigendian)); } /// /// Renders a complete entry together with the data. The entry itself /// is stored in and the data of the /// entry is stored in if it cannot be /// stored in the offset. This method is called for every of this IFD and can be overwritten in subclasses /// to provide special behavior. /// /// /// A with the entry to render. /// /// /// A to add the entry to. /// /// /// A to add the entry data to if it cannot be /// stored in the offset field. /// /// /// A with the offset, were the data of the /// entries starts. It is needed to adjust the offsets of the entries /// itself. /// protected virtual void RenderEntryData (IFDEntry entry, ByteVector entry_data, ByteVector offset_data, uint data_offset) { ushort tag = (ushort) entry.Tag; uint offset = (uint) (data_offset + offset_data.Count); ushort type; uint count; ByteVector data = entry.Render (is_bigendian, offset, out type, out count); // store data in offset, if it is smaller than 4 byte if (data.Count <= 4) { while (data.Count < 4) data.Add ("\0"); offset = data.ToUInt (is_bigendian); data = null; } // preserve word boundary of offsets if (data != null && data.Count % 2 != 0) data.Add ("\0"); RenderEntry (entry_data, tag, type, count, offset); offset_data.Add (data); } /// /// Constructs a new IFD Renderer used to render a . /// /// /// If IFD should be encoded in BigEndian or not. /// /// /// The IFD structure that will be rendered. /// /// /// A value with the offset of the /// current IFD. All offsets inside the IFD must be adjusted /// according to this given offset. /// protected virtual IFDRenderer CreateSubRenderer (bool is_bigendian, IFDStructure structure, uint ifd_offset) { return new IFDRenderer (is_bigendian, structure, ifd_offset); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/0000777000175000017500000000000011503407422021546 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/CanonMakerNoteEntryTag.cs0000644000175000017500000001057611470571657026443 0ustar00rubenruben00000000000000// // CanonMakerNoteEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009-2010 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Label tags for Canon Makernote. /// Based on http://www.burren.cx/david/canon.html and http://www.exiv2.org/tags-canon.html /// public enum CanonMakerNoteEntryTag : ushort { /// /// Unknown field at tag 0x0000. (Hex: 0x0000) /// Unknown0 = 0, /// /// Camera Settings. (Hex: 0x0001) /// CameraSettings = 1, /// /// Focal Length. (Hex: 0x0002) /// FocalLength = 2, /// /// Unknown field at tag 0x0000. (Hex: 0x0003) /// Unknown3 = 3, /// /// Shot Information. (Hex: 0x0004) /// ShotInfo = 4, /// /// Panorama. (Hex: 0x0005) /// Panorama = 5, /// /// Image Type. (Hex: 0x0006) /// ImageType = 6, /// /// Firmware Version. (Hex: 0x0007) /// FirmwareVersion = 7, /// /// Image Number. (Hex: 0x0008) /// ImageNumber = 8, /// /// Owner Name. (Hex: 0x0009) /// OwnerName = 9, /// /// Serial Number. (Hex: 0x000C) /// SerialNumber = 12, /// /// Unknown field at tag 0x0000. (Hex: 0x000D) /// Unknown13 = 13, /// /// Custom Functions. (Hex: 0x000F) /// CustomFunctions = 15, /// /// Model ID. (Hex: 0x0010) /// ModelID = 16, /// /// Picture Info. (Hex: 0x0012) /// PictureInfo = 18, /// /// Serial Number Format. (Hex: 0x0015) /// SerialNumberFormat = 21, /// /// Canon File Info. (Hex: 0x0093) /// CanonFileInfo = 147, /// /// Lens Model. (Hex: 0x0095) /// LensModel = 149, /// /// Serial Info. (Hex: 0x0096) /// SerialInfo = 150, /// /// Processing Info. (Hex: 0x00A0) /// ProcessingInfo = 160, /// /// White Balance Table. (Hex: 0x00A9) /// WhiteBalanceTable = 169, /// /// Measured Color. (Hex: 0x00AA) /// MeasuredColor = 170, /// /// Color Space. (Hex: 0x00B4) /// ColorSpace = 180, /// /// Sensor Info. (Hex: 0x00E0) /// SensorInfo = 224, /// /// Black Level. (Hex: 0x4008) /// BlackLevel = 16392, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/NikonLensData3EntryTag.cs0000644000175000017500000000554111470571657026350 0ustar00rubenruben00000000000000// // NikonLensData3EntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Nikon lens data entry tags. /// Based on: /// http://exiv2.org/tags-nikon.html /// public enum NikonLensData3EntryTag : ushort { /// /// Version. (Hex: 0X0000) /// Version = 0, /// /// Exit pupil position. (Hex: 0X0004) /// ExitPupilPosition = 4, /// /// AF aperture. (Hex: 0X0005) /// AFAperture = 5, /// /// Focus position. (Hex: 0X0008) /// FocusPosition = 8, /// /// Focus distance. (Hex: 0X000A) /// FocusDistance = 10, /// /// Focal length. (Hex: 0X000B) /// FocalLength = 11, /// /// Lens ID number. (Hex: 0X000C) /// LensIDNumber = 12, /// /// Lens F-stops. (Hex: 0X000D) /// LensFStops = 13, /// /// Min focal length. (Hex: 0X000E) /// MinFocalLength = 14, /// /// Max focal length. (Hex: 0X000F) /// MaxFocalLength = 15, /// /// Max aperture at min focal length. (Hex: 0X0010) /// MaxApertureAtMinFocal = 16, /// /// Max aperture at max focal length. (Hex: 0X0011) /// MaxApertureAtMaxFocal = 17, /// /// MCU version. (Hex: 0X0012) /// MCUVersion = 18, /// /// Effective max aperture. (Hex: 0X0013) /// EffectiveMaxAperture = 19, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/NikonPreviewMakerNoteEntryTag.cs0000644000175000017500000000576711470571657030033 0ustar00rubenruben00000000000000// // NikonPreviewMakerNoteEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009-2010 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Nikon makernote preview image tags /// The preview image is contained in a sub-IFD stored by the tag /// Nikon3MakerNoteEntryTag.Preview. /// Based on: /// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#PreviewImage /// public enum NikonPreviewMakerNoteEntryTag : ushort { /// /// Compression scheme used on the image data. (Hex: 0x0103) /// http://www.awaresystems.be/imaging/tiff/tifftags/compression.html /// Compression = 259, /// /// The number of pixels per ResolutionUnit in the ImageWidth direction. (Hex: 0x011A) /// http://www.awaresystems.be/imaging/tiff/tifftags/xresolution.html /// XResolution = 282, /// /// The number of pixels per ResolutionUnit in the ImageLength direction. (Hex: 0x011B) /// http://www.awaresystems.be/imaging/tiff/tifftags/yresolution.html /// YResolution = 283, /// /// The unit of measurement for XResolution and YResolution. (Hex: 0x0128) /// http://www.awaresystems.be/imaging/tiff/tifftags/resolutionunit.html /// ResolutionUnit = 296, /// /// Start of the preview image data. (Hex: 0x0201) /// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#PreviewImage /// PreviewImageStart = 513, /// /// Length of the preview image data. (Hex: 0x0202) /// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#PreviewImage /// PreviewImageLength = 514, /// /// Specifies the positioning of subsampled chrominance components relative to luminance samples. (Hex: 0x0213) /// http://www.awaresystems.be/imaging/tiff/tifftags/ycbcrpositioning.html /// YCbCrPositioning = 531 } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/CanonPictureInfoEntryTag.cs0000644000175000017500000000345111470571657026777 0ustar00rubenruben00000000000000// // CanonPictureInfoEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Label tags for Canon Picture Info. /// Based on http://www.exiv2.org/tags-canon.html /// public enum CanonPictureInfoEntryTag : ushort { /// /// Image width. (Hex: 0X0002) /// ImageWidth = 2, /// /// Image height. (Hex: 0X0003) /// ImageHeight = 3, /// /// Image width (as shot). (Hex: 0X0004) /// ImageWidthAsShot = 4, /// /// Image height (as shot). (Hex: 0X0005) /// ImageHeightAsShot = 5, /// /// AF points used. (Hex: 0X0016) /// AFPointsUsed = 22, /// /// AF points used (20D). (Hex: 0X001A) /// AFPointsUsed20D = 26, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/NikonPictureControlEntryTag.cs0000644000175000017500000000522311470571657027543 0ustar00rubenruben00000000000000// // NikonPictureControlEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Nikon picture control entry tags. /// Based on: /// http://exiv2.org/tags-nikon.html /// public enum NikonPictureControlEntryTag : ushort { /// /// Version. (Hex: 0X0000) /// Version = 0, /// /// Name. (Hex: 0X0004) /// Name = 4, /// /// Base. (Hex: 0X0018) /// Base = 24, /// /// Adjust. (Hex: 0X0030) /// Adjust = 48, /// /// Quick adjust. (Hex: 0X0031) /// QuickAdjust = 49, /// /// Sharpness. (Hex: 0X0032) /// Sharpness = 50, /// /// Contrast. (Hex: 0X0033) /// Contrast = 51, /// /// Brightness. (Hex: 0X0034) /// Brightness = 52, /// /// Saturation. (Hex: 0X0035) /// Saturation = 53, /// /// Hue adjustment. (Hex: 0X0036) /// HueAdjustment = 54, /// /// Filter effect. (Hex: 0X0037) /// FilterEffect = 55, /// /// Toning effect. (Hex: 0X0038) /// ToningEffect = 56, /// /// Toning saturation. (Hex: 0X0039) /// ToningSaturation = 57, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/NikonShotInfoEntryTag.cs0000644000175000017500000000423711470571657026324 0ustar00rubenruben00000000000000// // NikonShotInfoEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Nikon shot info entry tags. /// Based on: /// http://exiv2.org/tags-nikon.html /// public enum NikonShotInfoEntryTag : ushort { /// /// Version. (Hex: 0X0000) /// Version = 0, /// /// Shutter count 1. (Hex: 0X006A) /// ShutterCount1 = 106, /// /// Deleted image count. (Hex: 0X006E) /// DeletedImageCount = 110, /// /// Vibration reduction. (Hex: 0X0075) /// VibrationReduction = 117, /// /// . (Hex: 0X0082) /// VibrationReduction1 = 130, /// /// Shutter count 2. (Hex: 0X0157) /// ShutterCount2 = 343, /// /// Vibration reduction 2. (Hex: 0X01AE) /// VibrationReduction2 = 430, /// /// ISO. (Hex: 0X0256) /// ISO = 598, /// /// Shutter count. (Hex: 0X0276) /// ShutterCount = 630, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/GPSEntryTag.cs0000644000175000017500000002243511470571657024225 0ustar00rubenruben00000000000000// // GPSEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009-2010 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Entry tags occuring in the GPS IFD /// The complete overview can be obtained at: /// http://www.awaresystems.be/imaging/tiff.html /// public enum GPSEntryTag : ushort { /// /// Indicates the version of GPSInfoIFD. (Hex: 0x0000) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsversionid.html /// GPSVersionID = 0, /// /// Indicates whether the latitude is north or south latitude. (Hex: 0x0001) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpslatituderef.html /// GPSLatitudeRef = 1, /// /// Indicates the latitude. (Hex: 0x0002) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpslatitude.html /// GPSLatitude = 2, /// /// Indicates whether the longitude is east or west longitude. (Hex: 0x0003) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpslongituderef.html /// GPSLongitudeRef = 3, /// /// Indicates the longitude. (Hex: 0x0004) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpslongitude.html /// GPSLongitude = 4, /// /// Indicates the altitude used as the reference altitude. (Hex: 0x0005) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsaltituderef.html /// GPSAltitudeRef = 5, /// /// Indicates the altitude based on the reference in GPSAltitudeRef. (Hex: 0x0006) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsaltitude.html /// GPSAltitude = 6, /// /// Indicates the time as UTC (Coordinated Universal Time). (Hex: 0x0007) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpstimestamp.html /// GPSTimeStamp = 7, /// /// Indicates the GPS satellites used for measurements. (Hex: 0x0008) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpssatellites.html /// GPSSatellites = 8, /// /// Indicates the status of the GPS receiver when the image is recorded. (Hex: 0x0009) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsstatus.html /// GPSStatus = 9, /// /// Indicates the GPS measurement mode. (Hex: 0x000A) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsmeasuremode.html /// GPSMeasureMode = 10, /// /// Indicates the GPS DOP (data degree of precision). (Hex: 0x000B) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsdop.html /// GPSDOP = 11, /// /// Indicates the unit used to express the GPS receiver speed of movement. (Hex: 0x000C) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsspeedref.html /// GPSSpeedRef = 12, /// /// Indicates the speed of GPS receiver movement. (Hex: 0x000D) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsspeed.html /// GPSSpeed = 13, /// /// Indicates the reference for giving the direction of GPS receiver movement. (Hex: 0x000E) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpstrackref.html /// GPSTrackRef = 14, /// /// Indicates the direction of GPS receiver movement. (Hex: 0x000F) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpstrack.html /// GPSTrack = 15, /// /// Indicates the reference for giving the direction of the image when it is captured. (Hex: 0x0010) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsimgdirectionref.html /// GPSImgDirectionRef = 16, /// /// Indicates the direction of the image when it was captured. (Hex: 0x0011) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsimgdirection.html /// GPSImgDirection = 17, /// /// Indicates the geodetic survey data used by the GPS receiver. (Hex: 0x0012) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsmapdatum.html /// GPSMapDatum = 18, /// /// Indicates whether the latitude of the destination point is north or south latitude. (Hex: 0x0013) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsdestlatituderef.html /// GPSDestLatitudeRef = 19, /// /// Indicates the latitude of the destination point. (Hex: 0x0014) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsdestlatitude.html /// GPSDestLatitude = 20, /// /// Indicates whether the longitude of the destination point is east or west longitude. (Hex: 0x0015) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsdestlongituderef.html /// GPSDestLongitudeRef = 21, /// /// Indicates the longitude of the destination point. (Hex: 0x0016) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsdestlongitude.html /// GPSDestLongitude = 22, /// /// Indicates the reference used for giving the bearing to the destination point. (Hex: 0x0017) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsdestbearingref.html /// GPSDestBearingRef = 23, /// /// Indicates the bearing to the destination point. (Hex: 0x0018) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsdestbearing.html /// GPSDestBearing = 24, /// /// Indicates the unit used to express the distance to the destination point. (Hex: 0x0019) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsdestdistanceref.html /// GPSDestDistanceRef = 25, /// /// Indicates the distance to the destination point. (Hex: 0x001A) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsdestdistance.html /// GPSDestDistance = 26, /// /// A character string recording the name of the method used for location finding. (Hex: 0x001B) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsprocessingmethod.html /// GPSProcessingMethod = 27, /// /// A character string recording the name of the GPS area. (Hex: 0x001C) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsareainformation.html /// GPSAreaInformation = 28, /// /// A character string recording date and time information relative to UTC (Coordinated Universal Time). (Hex: 0x001D) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsdatestamp.html /// GPSDateStamp = 29, /// /// Indicates whether differential correction is applied to the GPS receiver. (Hex: 0x001E) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps/gpsdifferential.html /// GPSDifferential = 30, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/NikonVibrationReductionEntryTag.cs0000644000175000017500000000243511470571657030403 0ustar00rubenruben00000000000000// // NikonVibrationReductionEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Nikon vibration reduction entry tags. /// Based on: /// http://exiv2.org/tags-nikon.html /// public enum NikonVibrationReductionEntryTag : ushort { /// /// Version. (Hex: 0X0000) /// Version = 0, /// /// Vibration reduction. (Hex: 0X0004) /// VibrationReduction = 4, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/Nikon3MakerNoteEntryTag.cs0000644000175000017500000003123511470571657026541 0ustar00rubenruben00000000000000// // Nikon3MakerNoteEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Nikon format 3 makernote tags. /// Based on http://www.exiv2.org/tags-nikon.html and /// http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html /// public enum Nikon3MakerNoteEntryTag : ushort { /// /// Makernote version. (Hex: 0x0001) /// Version = 1, /// /// ISO speed setting. (Hex: 0X0002) /// ISOSpeed = 2, /// /// Color mode. (Hex: 0X0003) /// ColorMode = 3, /// /// Image quality setting. (Hex: 0X0004) /// Quality = 4, /// /// White balance. (Hex: 0X0005) /// WhiteBalance = 5, /// /// Image sharpening setting. (Hex: 0X0006) /// Sharpening = 6, /// /// Focus mode. (Hex: 0X0007) /// Focus = 7, /// /// Flash setting. (Hex: 0X0008) /// FlashSetting = 8, /// /// Flash device. (Hex: 0X0009) /// FlashDevice = 9, /// /// Unknown. (Hex: 0X000A) /// Unknown10 = 10, /// /// White balance bias. (Hex: 0X000B) /// WhiteBalanceBias = 11, /// /// WB RB levels. (Hex: 0X000C) /// WB_RBLevels = 12, /// /// Program shift. (Hex: 0X000D) /// ProgramShift = 13, /// /// Exposure difference. (Hex: 0X000E) /// ExposureDiff = 14, /// /// ISO selection. (Hex: 0X000F) /// ISOSelection = 15, /// /// Data dump. (Hex: 0X0010) /// DataDump = 16, /// /// Offset to an IFD containing a preview image. (Hex: 0x0011) /// Preview = 17, /// /// Flash compensation setting. (Hex: 0X0012) /// FlashComp = 18, /// /// ISO setting. (Hex: 0X0013) /// ISOSettings = 19, /// /// Image boundary. (Hex: 0X0016) /// ImageBoundary = 22, /// /// Unknown. (Hex: 0X0017) /// Unknown23 = 23, /// /// Flash bracket compensation applied. (Hex: 0X0018) /// FlashBracketComp = 24, /// /// AE bracket compensation applied. (Hex: 0X0019) /// ExposureBracketComp = 25, /// /// Image processing. (Hex: 0X001A) /// ImageProcessing = 26, /// /// Crop high speed. (Hex: 0X001B) /// CropHiSpeed = 27, /// /// Serial Number. (Hex: 0X001D) /// SerialNumber = 29, /// /// Color space. (Hex: 0X001E) /// ColorSpace = 30, /// /// VR info. (Hex: 0X001F) /// VRInfo = 31, /// /// Image authentication. (Hex: 0X0020) /// ImageAuthentication = 32, /// /// ActiveD-lighting. (Hex: 0X0022) /// ActiveDLighting = 34, /// /// Picture control. (Hex: 0X0023) /// PictureControl = 35, /// /// World time. (Hex: 0X0024) /// WorldTime = 36, /// /// ISO info. (Hex: 0X0025) /// ISOInfo = 37, /// /// Vignette control. (Hex: 0X002A) /// VignetteControl = 42, /// /// Image adjustment setting. (Hex: 0X0080) /// ImageAdjustment = 128, /// /// Tone compensation. (Hex: 0X0081) /// ToneComp = 129, /// /// Auxiliary lens (adapter). (Hex: 0X0082) /// AuxiliaryLens = 130, /// /// Lens type. (Hex: 0X0083) /// LensType = 131, /// /// Lens. (Hex: 0X0084) /// Lens = 132, /// /// Manual focus distance. (Hex: 0X0085) /// FocusDistance = 133, /// /// Digital zoom setting. (Hex: 0X0086) /// DigitalZoom = 134, /// /// Mode of flash used. (Hex: 0X0087) /// FlashMode = 135, /// /// AF info. (Hex: 0X0088) /// AFInfo = 136, /// /// Shooting mode. (Hex: 0X0089) /// ShootingMode = 137, /// /// Auto bracket release. (Hex: 0X008A) /// AutoBracketRelease = 138, /// /// Lens FStops. (Hex: 0X008B) /// LensFStops = 139, /// /// Contrast curve. (Hex: 0X008C) /// ContrastCurve = 140, /// /// Color hue. (Hex: 0X008D) /// ColorHue = 141, /// /// Scene mode. (Hex: 0X008F) /// SceneMode = 143, /// /// Light source. (Hex: 0X0090) /// LightSource = 144, /// /// Shot info. (Hex: 0X0091) /// ShotInfo = 145, /// /// Hue adjustment. (Hex: 0X0092) /// HueAdjustment = 146, /// /// NEF compression. (Hex: 0X0093) /// NEFCompression = 147, /// /// Saturation. (Hex: 0X0094) /// Saturation = 148, /// /// Noise reduction. (Hex: 0X0095) /// NoiseReduction = 149, /// /// Linearization table. (Hex: 0X0096) /// LinearizationTable = 150, /// /// Color balance. (Hex: 0X0097) /// ColorBalance = 151, /// /// Lens data settings. (Hex: 0X0098) /// LensData = 152, /// /// Raw image center. (Hex: 0X0099) /// RawImageCenter = 153, /// /// Sensor pixel size. (Hex: 0X009A) /// SensorPixelSize = 154, /// /// Unknown. (Hex: 0X009B) /// Unknown155 = 155, /// /// Scene assist. (Hex: 0X009C) /// SceneAssist = 156, /// /// Retouch history. (Hex: 0X009E) /// RetouchHistory = 158, /// /// Unknown. (Hex: 0X009F) /// Unknown159 = 159, /// /// Camera serial number, usually starts with "NO= ". (Hex: 0X00A0) /// SerialNO = 160, /// /// Image data size. (Hex: 0X00A2) /// ImageDataSize = 162, /// /// Unknown. (Hex: 0X00A3) /// Unknown163 = 163, /// /// Image count. (Hex: 0X00A5) /// ImageCount = 165, /// /// Deleted image count. (Hex: 0X00A6) /// DeletedImageCount = 166, /// /// Number of shots taken by camera. (Hex: 0X00A7) /// ShutterCount = 167, /// /// Flash info. (Hex: 0X00A8) /// FlashInfo = 168, /// /// Image optimization. (Hex: 0X00A9) /// ImageOptimization = 169, /// /// Saturation. (Hex: 0X00AA) /// Saturation2 = 170, /// /// Program variation. (Hex: 0X00AB) /// VariProgram = 171, /// /// Image stabilization. (Hex: 0X00AC) /// ImageStabilization = 172, /// /// AF response. (Hex: 0X00AD) /// AFResponse = 173, /// /// Multi exposure. (Hex: 0X00B0) /// MultiExposure = 176, /// /// High ISO Noise Reduction. (Hex: 0X00B1) /// HighISONoiseReduction = 177, /// /// Toning effect. (Hex: 0X00B3) /// ToningEffect = 179, /// /// AF info 2. (Hex: 0X00B7) /// AFInfo2 = 183, /// /// File info. (Hex: 0X00B8) /// FileInfo = 184, /// /// PrintIM information. (Hex: 0X0E00) /// PrintIM = 3584, /// /// Capture data. (Hex: 0X0E01) /// CaptureData = 3585, /// /// Capture version. (Hex: 0X0E09) /// CaptureVersion = 3593, /// /// Capture offsets. (Hex: 0X0E0E) /// CaptureOffsets = 3598, /// /// Scan IFD. (Hex: 0X0E10) /// ScanIFD = 3600, /// /// ICC profile. (Hex: 0X0E1D) /// ICCProfile = 3613, /// /// Capture output. (Hex: 0X0E1E) /// CaptureOutput = 3614, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/OlympusMakerNoteEntryTag.cs0000644000175000017500000002324711470571657027054 0ustar00rubenruben00000000000000// // OlympusMakerNoteEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Olympus makernote tags. /// Based on http://www.exiv2.org/tags-olympus.html /// public enum OlympusMakerNoteEntryTag : ushort { /// /// Thumbnail image. (Hex: 0X0100) /// ThumbnailImage = 256, /// /// Picture taking mode. (Hex: 0X0200) /// SpecialMode = 512, /// /// Image quality setting. (Hex: 0X0201) /// Quality = 513, /// /// Macro mode. (Hex: 0X0202) /// Macro = 514, /// /// Black and white mode. (Hex: 0X0203) /// BWMode = 515, /// /// Digital zoom ratio. (Hex: 0X0204) /// DigitalZoom = 516, /// /// Focal plane diagonal. (Hex: 0X0205) /// FocalPlaneDiagonal = 517, /// /// Lens distortion parameters. (Hex: 0X0206) /// LensDistortionParams = 518, /// /// Software firmware version. (Hex: 0X0207) /// FirmwareVersion = 519, /// /// ASCII format data such as [PictureInfo]. (Hex: 0X0208) /// PictureInfo = 520, /// /// Camera ID data. (Hex: 0X0209) /// CameraID = 521, /// /// Pre-capture frames. (Hex: 0X0300) /// PreCaptureFrames = 768, /// /// One touch white balance. (Hex: 0X0302) /// OneTouchWB = 770, /// /// Serial number. (Hex: 0X0404) /// SerialNumber = 1028, /// /// PrintIM information. (Hex: 0X0E00) /// PrintIM = 3584, /// /// Various camera settings 1. (Hex: 0X0F00) /// DataDump1 = 3840, /// /// Various camera settings 2. (Hex: 0X0F01) /// DataDump2 = 3841, /// /// Shutter speed value. (Hex: 0X1000) /// ShutterSpeed = 4096, /// /// ISO speed value. (Hex: 0X1001) /// ISOSpeed = 4097, /// /// Aperture value. (Hex: 0X1002) /// ApertureValue = 4098, /// /// Brightness value. (Hex: 0X1003) /// Brightness = 4099, /// /// Flash mode. (Hex: 0X1004) /// FlashMode = 4100, /// /// Flash device. (Hex: 0X1005) /// FlashDevice = 4101, /// /// Exposure compensation value. (Hex: 0X1006) /// Bracket = 4102, /// /// Sensor temperature. (Hex: 0X1007) /// SensorTemperature = 4103, /// /// Lens temperature. (Hex: 0X1008) /// LensTemperature = 4104, /// /// Focus mode. (Hex: 0X100B) /// FocusMode = 4107, /// /// Manual focus distance. (Hex: 0X100C) /// FocusDistance = 4108, /// /// Zoom step count. (Hex: 0X100D) /// Zoom = 4109, /// /// Macro focus step count. (Hex: 0X100E) /// MacroFocus = 4110, /// /// Sharpness factor. (Hex: 0X100F) /// SharpnessFactor = 4111, /// /// Flash charge level. (Hex: 0X1010) /// FlashChargeLevel = 4112, /// /// Color matrix. (Hex: 0X1011) /// ColorMatrix = 4113, /// /// Black level. (Hex: 0X1012) /// BlackLevel = 4114, /// /// White balance mode. (Hex: 0X1015) /// WhiteBalance = 4117, /// /// Red balance. (Hex: 0X1017) /// RedBalance = 4119, /// /// Blue balance. (Hex: 0X1018) /// BlueBalance = 4120, /// /// Serial number 2. (Hex: 0X101A) /// SerialNumber2 = 4122, /// /// Flash exposure compensation. (Hex: 0X1023) /// FlashBias = 4131, /// /// External flash bounce. (Hex: 0X1026) /// ExternalFlashBounce = 4134, /// /// External flash zoom. (Hex: 0X1027) /// ExternalFlashZoom = 4135, /// /// External flash mode. (Hex: 0X1028) /// ExternalFlashMode = 4136, /// /// Contrast setting. (Hex: 0X1029) /// Contrast = 4137, /// /// Sharpness factor. (Hex: 0X102A) /// SharpnessFactor2 = 4138, /// /// Color control. (Hex: 0X102B) /// ColorControl = 4139, /// /// Valid bits. (Hex: 0X102C) /// ValidBits = 4140, /// /// Coring filter. (Hex: 0X102D) /// CoringFilter = 4141, /// /// Image width. (Hex: 0X102E) /// ImageWidth = 4142, /// /// Image height. (Hex: 0X102F) /// ImageHeight = 4143, /// /// Compression ratio. (Hex: 0X1034) /// CompressionRatio = 4148, /// /// Preview image embedded. (Hex: 0X1035) /// Thumbnail = 4149, /// /// Offset of the preview image. (Hex: 0X1036) /// ThumbnailOffset = 4150, /// /// Size of the preview image. (Hex: 0X1037) /// ThumbnailLength = 4151, /// /// CCD scan mode. (Hex: 0X1039) /// CCDScanMode = 4153, /// /// Noise reduction. (Hex: 0X103A) /// NoiseReduction = 4154, /// /// Infinity lens step. (Hex: 0X103B) /// InfinityLensStep = 4155, /// /// Near lens step. (Hex: 0X103C) /// NearLensStep = 4156, /// /// Camera equipment sub-IFD. (Hex: 0X2010) /// Equipment = 8208, /// /// Camera Settings sub-IFD. (Hex: 0X2020) /// CameraSettings = 8224, /// /// Raw development sub-IFD. (Hex: 0X2030) /// RawDevelopment = 8240, /// /// Raw development 2 sub-IFD. (Hex: 0X2031) /// RawDevelopment2 = 8241, /// /// Image processing sub-IFD. (Hex: 0X2040) /// ImageProcessing = 8256, /// /// Focus sub-IFD. (Hex: 0X2050) /// FocusInfo = 8272, /// /// Raw sub-IFD. (Hex: 0X3000) /// RawInfo = 12288, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/SonyMakerNoteEntryTag.cs0000644000175000017500000001530411470571657026327 0ustar00rubenruben00000000000000// // SonyMakerNoteEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Label tags for Sony Makernote. /// Based on http://www.exiv2.org/tags-sony.html /// public enum SonyMakerNoteEntryTag : ushort { /// /// Image quality. (Hex: 0X0102) /// Quality = 258, /// /// Flash exposure compensation in EV. (Hex: 0X0104) /// FlashExposureComp = 260, /// /// Teleconverter Model. (Hex: 0X0105) /// Teleconverter = 261, /// /// White Balance Fine Tune Value. (Hex: 0X0112) /// WhiteBalanceFineTune = 274, /// /// Camera Settings. (Hex: 0X0114) /// CameraSettings = 276, /// /// White balance. (Hex: 0X0115) /// WhiteBalance = 277, /// /// PrintIM information. (Hex: 0X0E00) /// PrintIM = 3584, /// /// Multi Burst Mode. (Hex: 0X1000) /// MultiBurstMode = 4096, /// /// Multi Burst Image Width. (Hex: 0X1001) /// MultiBurstImageWidth = 4097, /// /// Multi Burst Image Height. (Hex: 0X1002) /// MultiBurstImageHeight = 4098, /// /// Panorama. (Hex: 0X1003) /// Panorama = 4099, /// /// Preview Image. (Hex: 0X2001) /// PreviewImage = 8193, /// /// Auto High Definition Range. (Hex: 0X200A) /// AutoHDR = 8202, /// /// Shot Information. (Hex: 0X3000) /// ShotInfo = 12288, /// /// File Format. (Hex: 0XB000) /// FileFormat = 45056, /// /// Sony Model ID. (Hex: 0XB001) /// SonyModelID = 45057, /// /// Color Reproduction. (Hex: 0XB020) /// ColorReproduction = 45088, /// /// Color Temperature. (Hex: 0XB021) /// ColorTemperature = 45089, /// /// Color Compensation Filter: negative is green, positive is magenta. (Hex: 0XB022) /// ColorCompensationFilter = 45090, /// /// Scene Mode. (Hex: 0XB023) /// SceneMode = 45091, /// /// Zone Matching. (Hex: 0XB024) /// ZoneMatching = 45092, /// /// Dynamic Range Optimizer. (Hex: 0XB025) /// DynamicRangeOptimizer = 45093, /// /// Image stabilization. (Hex: 0XB026) /// ImageStabilization = 45094, /// /// Lens identifier. (Hex: 0XB027) /// LensID = 45095, /// /// Minolta MakerNote. (Hex: 0XB028) /// MinoltaMakerNote = 45096, /// /// Color Mode. (Hex: 0XB029) /// ColorMode = 45097, /// /// Full Image Size. (Hex: 0XB02B) /// FullImageSize = 45099, /// /// Preview Image Size. (Hex: 0XB02C) /// PreviewImageSize = 45100, /// /// Macro. (Hex: 0XB040) /// Macro = 45120, /// /// Exposure Mode. (Hex: 0XB041) /// ExposureMode = 45121, /// /// Focus mode. (Hex: 0XB042) /// FocusMode = 45122, /// /// AF Mode. (Hex: 0XB043) /// AFMode = 45123, /// /// AF Illuminator. (Hex: 0XB044) /// AFIlluminator = 45124, /// /// Quality. (Hex: 0XB047) /// Quality2 = 45127, /// /// Flash Level. (Hex: 0XB048) /// FlashLevel = 45128, /// /// Release Mode. (Hex: 0XB049) /// ReleaseMode = 45129, /// /// Shot number in continous burst mode. (Hex: 0XB04A) /// SequenceNumber = 45130, /// /// Anti-Blur. (Hex: 0XB04B) /// AntiBlur = 45131, /// /// Long Exposure Noise Reduction. (Hex: 0XB04E) /// LongExposureNoiseReduction = 45134, /// /// Dynamic Range Optimizer. (Hex: 0XB04F) /// DynamicRangeOptimizer2 = 45135, /// /// Intelligent Auto. (Hex: 0XB052) /// IntelligentAuto = 45138, /// /// White Balance. (Hex: 0XB054) /// WhiteBalance2 = 45140, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/IOPEntryTag.cs0000644000175000017500000000367411470571657024227 0ustar00rubenruben00000000000000// // IOPEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009-2010 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Entry tags occuring in the Interoperability IFD /// The complete overview can be obtained at: /// http://www.awaresystems.be/imaging/tiff.html /// public enum IOPEntryTag : ushort { /// /// Indicates the identification of the Interoperability rule. (Hex: 0x0001) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/interoperability/interoperabilityindex.html /// InteroperabilityIndex = 1, /// /// Interoperability version. (Hex: 0x0002) /// InteroperabilityVersion = 2, /// /// File format of image file. (Hex: 0x1000) /// RelatedImageFileFormat = 4096, /// /// Image Width. (Hex: 0x1001) /// RelatedImageWidth = 4097, /// /// Image Height. (Hex: 0x1002) /// RelatedImageLength = 4098, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/IFDEntryTag.cs0000644000175000017500000012656311470571657024205 0ustar00rubenruben00000000000000// // IFDEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009-2010 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Entry tags occuring in a Tiff IFD, or IFD0 for Jpegs. They are mostly /// defined by the TIFF specification: /// http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf /// The complete overview can be obtained at: /// http://www.awaresystems.be/imaging/tiff.html /// public enum IFDEntryTag : ushort { /// /// A general indication of the kind of data contained in this subfile. (Hex: 0x00FE) /// http://www.awaresystems.be/imaging/tiff/tifftags/newsubfiletype.html /// NewSubfileType = 254, /// /// A general indication of the kind of data contained in this subfile. (Hex: 0x00FF) /// http://www.awaresystems.be/imaging/tiff/tifftags/subfiletype.html /// SubfileType = 255, /// /// The number of columns in the image, i.e., the number of pixels per row. (Hex: 0x0100) /// http://www.awaresystems.be/imaging/tiff/tifftags/imagewidth.html /// ImageWidth = 256, /// /// The number of rows of pixels in the image. (Hex: 0x0101) /// http://www.awaresystems.be/imaging/tiff/tifftags/imagelength.html /// ImageLength = 257, /// /// Number of bits per component. (Hex: 0x0102) /// http://www.awaresystems.be/imaging/tiff/tifftags/bitspersample.html /// BitsPerSample = 258, /// /// Compression scheme used on the image data. (Hex: 0x0103) /// http://www.awaresystems.be/imaging/tiff/tifftags/compression.html /// Compression = 259, /// /// The color space of the image data. (Hex: 0x0106) /// http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html /// PhotometricInterpretation = 262, /// /// For black and white TIFF files that represent shades of gray, the technique used to convert from gray to black and white pixels. (Hex: 0x0107) /// http://www.awaresystems.be/imaging/tiff/tifftags/threshholding.html /// Threshholding = 263, /// /// The width of the dithering or halftoning matrix used to create a dithered or halftoned bilevel file. (Hex: 0x0108) /// http://www.awaresystems.be/imaging/tiff/tifftags/cellwidth.html /// CellWidth = 264, /// /// The length of the dithering or halftoning matrix used to create a dithered or halftoned bilevel file. (Hex: 0x0109) /// http://www.awaresystems.be/imaging/tiff/tifftags/celllength.html /// CellLength = 265, /// /// The logical order of bits within a byte. (Hex: 0x010A) /// http://www.awaresystems.be/imaging/tiff/tifftags/fillorder.html /// FillOrder = 266, /// /// The name of the document from which this image was scanned. (Hex: 0x010D) /// http://www.awaresystems.be/imaging/tiff/tifftags/documentname.html /// DocumentName = 269, /// /// A string that describes the subject of the image. (Hex: 0x010E) /// http://www.awaresystems.be/imaging/tiff/tifftags/imagedescription.html /// ImageDescription = 270, /// /// The scanner manufacturer. (Hex: 0x010F) /// http://www.awaresystems.be/imaging/tiff/tifftags/make.html /// Make = 271, /// /// The scanner model name or number. (Hex: 0x0110) /// http://www.awaresystems.be/imaging/tiff/tifftags/model.html /// Model = 272, /// /// For each strip, the byte offset of that strip. (Hex: 0x0111) /// http://www.awaresystems.be/imaging/tiff/tifftags/stripoffsets.html /// StripOffsets = 273, /// /// The orientation of the image with respect to the rows and columns. (Hex: 0x0112) /// http://www.awaresystems.be/imaging/tiff/tifftags/orientation.html /// Orientation = 274, /// /// The number of components per pixel. (Hex: 0x0115) /// http://www.awaresystems.be/imaging/tiff/tifftags/samplesperpixel.html /// SamplesPerPixel = 277, /// /// The number of rows per strip. (Hex: 0x0116) /// http://www.awaresystems.be/imaging/tiff/tifftags/rowsperstrip.html /// RowsPerStrip = 278, /// /// For each strip, the number of bytes in the strip after compression. (Hex: 0x0117) /// http://www.awaresystems.be/imaging/tiff/tifftags/stripbytecounts.html /// StripByteCounts = 279, /// /// The minimum component value used. (Hex: 0x0118) /// http://www.awaresystems.be/imaging/tiff/tifftags/minsamplevalue.html /// MinSampleValue = 280, /// /// The maximum component value used. (Hex: 0x0119) /// http://www.awaresystems.be/imaging/tiff/tifftags/maxsamplevalue.html /// MaxSampleValue = 281, /// /// The number of pixels per ResolutionUnit in the ImageWidth direction. (Hex: 0x011A) /// http://www.awaresystems.be/imaging/tiff/tifftags/xresolution.html /// XResolution = 282, /// /// The number of pixels per ResolutionUnit in the ImageLength direction. (Hex: 0x011B) /// http://www.awaresystems.be/imaging/tiff/tifftags/yresolution.html /// YResolution = 283, /// /// How the components of each pixel are stored. (Hex: 0x011C) /// http://www.awaresystems.be/imaging/tiff/tifftags/planarconfiguration.html /// PlanarConfiguration = 284, /// /// The name of the page from which this image was scanned. (Hex: 0x011D) /// http://www.awaresystems.be/imaging/tiff/tifftags/pagename.html /// PageName = 285, /// /// X position of the image. (Hex: 0x011E) /// http://www.awaresystems.be/imaging/tiff/tifftags/xposition.html /// XPosition = 286, /// /// Y position of the image. (Hex: 0x011F) /// http://www.awaresystems.be/imaging/tiff/tifftags/yposition.html /// YPosition = 287, /// /// For each string of contiguous unused bytes in a TIFF file, the byte offset of the string. (Hex: 0x0120) /// http://www.awaresystems.be/imaging/tiff/tifftags/freeoffsets.html /// FreeOffsets = 288, /// /// For each string of contiguous unused bytes in a TIFF file, the number of bytes in the string. (Hex: 0x0121) /// http://www.awaresystems.be/imaging/tiff/tifftags/freebytecounts.html /// FreeByteCounts = 289, /// /// The precision of the information contained in the GrayResponseCurve. (Hex: 0x0122) /// http://www.awaresystems.be/imaging/tiff/tifftags/grayresponseunit.html /// GrayResponseUnit = 290, /// /// For grayscale data, the optical density of each possible pixel value. (Hex: 0x0123) /// http://www.awaresystems.be/imaging/tiff/tifftags/grayresponsecurve.html /// GrayResponseCurve = 291, /// /// Options for Group 3 Fax compression (Hex: 0x0124) /// http://www.awaresystems.be/imaging/tiff/tifftags/t4options.html /// T4Options = 292, /// /// Options for Group 4 Fax compression (Hex: 0x0125) /// http://www.awaresystems.be/imaging/tiff/tifftags/t6options.html /// T6Options = 293, /// /// The unit of measurement for XResolution and YResolution. (Hex: 0x0128) /// http://www.awaresystems.be/imaging/tiff/tifftags/resolutionunit.html /// ResolutionUnit = 296, /// /// The page number of the page from which this image was scanned. (Hex: 0x0129) /// http://www.awaresystems.be/imaging/tiff/tifftags/pagenumber.html /// PageNumber = 297, /// /// Describes a transfer function for the image in tabular style. (Hex: 0x012D) /// http://www.awaresystems.be/imaging/tiff/tifftags/transferfunction.html /// TransferFunction = 301, /// /// Name and version number of the software package(s) used to create the image. (Hex: 0x0131) /// http://www.awaresystems.be/imaging/tiff/tifftags/software.html /// Software = 305, /// /// Date and time of image creation. (Hex: 0x0132) /// http://www.awaresystems.be/imaging/tiff/tifftags/datetime.html /// DateTime = 306, /// /// Person who created the image. (Hex: 0x013B) /// http://www.awaresystems.be/imaging/tiff/tifftags/artist.html /// Artist = 315, /// /// The computer and/or operating system in use at the time of image creation. (Hex: 0x013C) /// http://www.awaresystems.be/imaging/tiff/tifftags/hostcomputer.html /// HostComputer = 316, /// /// A mathematical operator that is applied to the image data before an encoding scheme is applied. (Hex: 0x013D) /// http://www.awaresystems.be/imaging/tiff/tifftags/predictor.html /// Predictor = 317, /// /// The chromaticity of the white point of the image. (Hex: 0x013E) /// http://www.awaresystems.be/imaging/tiff/tifftags/whitepoint.html /// WhitePoint = 318, /// /// The chromaticities of the primaries of the image. (Hex: 0x013F) /// http://www.awaresystems.be/imaging/tiff/tifftags/primarychromaticities.html /// PrimaryChromaticities = 319, /// /// A color map for palette color images. (Hex: 0x0140) /// http://www.awaresystems.be/imaging/tiff/tifftags/colormap.html /// ColorMap = 320, /// /// Conveys to the halftone function the range of gray levels within a colorimetrically-specified image that should retain tonal detail. (Hex: 0x0141) /// http://www.awaresystems.be/imaging/tiff/tifftags/halftonehints.html /// HalftoneHints = 321, /// /// The tile width in pixels. This is the number of columns in each tile. (Hex: 0x0142) /// http://www.awaresystems.be/imaging/tiff/tifftags/tilewidth.html /// TileWidth = 322, /// /// The tile length (height) in pixels. This is the number of rows in each tile. (Hex: 0x0143) /// http://www.awaresystems.be/imaging/tiff/tifftags/tilelength.html /// TileLength = 323, /// /// For each tile, the byte offset of that tile, as compressed and stored on disk. (Hex: 0x0144) /// http://www.awaresystems.be/imaging/tiff/tifftags/tileoffsets.html /// TileOffsets = 324, /// /// For each tile, the number of (compressed) bytes in that tile. (Hex: 0x0145) /// http://www.awaresystems.be/imaging/tiff/tifftags/tilebytecounts.html /// TileByteCounts = 325, /// /// Used in the TIFF-F standard, denotes the number of 'bad' scan lines encountered by the facsimile device. (Hex: 0x0146) /// http://www.awaresystems.be/imaging/tiff/tifftags/badfaxlines.html /// BadFaxLines = 326, /// /// Used in the TIFF-F standard, indicates if 'bad' lines encountered during reception are stored in the data, or if 'bad' lines have been replaced by the receiver. (Hex: 0x0147) /// http://www.awaresystems.be/imaging/tiff/tifftags/cleanfaxdata.html /// CleanFaxData = 327, /// /// Used in the TIFF-F standard, denotes the maximum number of consecutive 'bad' scanlines received. (Hex: 0x0148) /// http://www.awaresystems.be/imaging/tiff/tifftags/consecutivebadfaxlines.html /// ConsecutiveBadFaxLines = 328, /// /// Offset to child IFDs. (Hex: 0x014A) /// http://www.awaresystems.be/imaging/tiff/tifftags/subifds.html /// SubIFDs = 330, /// /// The set of inks used in a separated (PhotometricInterpretation=5) image. (Hex: 0x014C) /// http://www.awaresystems.be/imaging/tiff/tifftags/inkset.html /// InkSet = 332, /// /// The name of each ink used in a separated image. (Hex: 0x014D) /// http://www.awaresystems.be/imaging/tiff/tifftags/inknames.html /// InkNames = 333, /// /// The number of inks. (Hex: 0x014E) /// http://www.awaresystems.be/imaging/tiff/tifftags/numberofinks.html /// NumberOfInks = 334, /// /// The component values that correspond to a 0% dot and 100% dot. (Hex: 0x0150) /// http://www.awaresystems.be/imaging/tiff/tifftags/dotrange.html /// DotRange = 336, /// /// A description of the printing environment for which this separation is intended. (Hex: 0x0151) /// http://www.awaresystems.be/imaging/tiff/tifftags/targetprinter.html /// TargetPrinter = 337, /// /// Description of extra components. (Hex: 0x0152) /// http://www.awaresystems.be/imaging/tiff/tifftags/extrasamples.html /// ExtraSamples = 338, /// /// Specifies how to interpret each data sample in a pixel. (Hex: 0x0153) /// http://www.awaresystems.be/imaging/tiff/tifftags/sampleformat.html /// SampleFormat = 339, /// /// Specifies the minimum sample value. (Hex: 0x0154) /// http://www.awaresystems.be/imaging/tiff/tifftags/sminsamplevalue.html /// SMinSampleValue = 340, /// /// Specifies the maximum sample value. (Hex: 0x0155) /// http://www.awaresystems.be/imaging/tiff/tifftags/smaxsamplevalue.html /// SMaxSampleValue = 341, /// /// Expands the range of the TransferFunction. (Hex: 0x0156) /// http://www.awaresystems.be/imaging/tiff/tifftags/transferrange.html /// TransferRange = 342, /// /// Mirrors the essentials of PostScript's path creation functionality. (Hex: 0x0157) /// http://www.awaresystems.be/imaging/tiff/tifftags/clippath.html /// ClipPath = 343, /// /// The number of units that span the width of the image, in terms of integer ClipPath coordinates. (Hex: 0x0158) /// http://www.awaresystems.be/imaging/tiff/tifftags/xclippathunits.html /// XClipPathUnits = 344, /// /// The number of units that span the height of the image, in terms of integer ClipPath coordinates. (Hex: 0x0159) /// http://www.awaresystems.be/imaging/tiff/tifftags/yclippathunits.html /// YClipPathUnits = 345, /// /// Aims to broaden the support for indexed images to include support for any color space. (Hex: 0x015A) /// http://www.awaresystems.be/imaging/tiff/tifftags/indexed.html /// Indexed = 346, /// /// JPEG quantization and/or Huffman tables. (Hex: 0x015B) /// http://www.awaresystems.be/imaging/tiff/tifftags/jpegtables.html /// JPEGTables = 347, /// /// OPI-related. (Hex: 0x015F) /// http://www.awaresystems.be/imaging/tiff/tifftags/opiproxy.html /// OPIProxy = 351, /// /// Used in the TIFF-FX standard to point to an IFD containing tags that are globally applicable to the complete TIFF file. (Hex: 0x0190) /// http://www.awaresystems.be/imaging/tiff/tifftags/globalparametersifd.html /// GlobalParametersIFD = 400, /// /// Used in the TIFF-FX standard, denotes the type of data stored in this file or IFD. (Hex: 0x0191) /// http://www.awaresystems.be/imaging/tiff/tifftags/profiletype.html /// ProfileType = 401, /// /// Used in the TIFF-FX standard, denotes the 'profile' that applies to this file. (Hex: 0x0192) /// http://www.awaresystems.be/imaging/tiff/tifftags/faxprofile.html /// FaxProfile = 402, /// /// Used in the TIFF-FX standard, indicates which coding methods are used in the file. (Hex: 0x0193) /// http://www.awaresystems.be/imaging/tiff/tifftags/codingmethods.html /// CodingMethods = 403, /// /// Used in the TIFF-FX standard, denotes the year of the standard specified by the FaxProfile field. (Hex: 0x0194) /// http://www.awaresystems.be/imaging/tiff/tifftags/versionyear.html /// VersionYear = 404, /// /// Used in the TIFF-FX standard, denotes the mode of the standard specified by the FaxProfile field. (Hex: 0x0195) /// http://www.awaresystems.be/imaging/tiff/tifftags/modenumber.html /// ModeNumber = 405, /// /// Used in the TIFF-F and TIFF-FX standards, holds information about the ITULAB (PhotometricInterpretation = 10) encoding. (Hex: 0x01B1) /// http://www.awaresystems.be/imaging/tiff/tifftags/decode.html /// Decode = 433, /// /// Defined in the Mixed Raster Content part of RFC 2301, is the default color needed in areas where no image is available. (Hex: 0x01B2) /// http://www.awaresystems.be/imaging/tiff/tifftags/defaultimagecolor.html /// DefaultImageColor = 434, /// /// Old-style JPEG compression field. TechNote2 invalidates this part of the specification. (Hex: 0x0200) /// http://www.awaresystems.be/imaging/tiff/tifftags/jpegproc.html /// JPEGProc = 512, /// /// Old-style JPEG compression field. TechNote2 invalidates this part of the specification. (Hex: 0x0201) /// http://www.awaresystems.be/imaging/tiff/tifftags/jpeginterchangeformat.html /// JPEGInterchangeFormat = 513, /// /// Old-style JPEG compression field. TechNote2 invalidates this part of the specification. (Hex: 0x0202) /// http://www.awaresystems.be/imaging/tiff/tifftags/jpeginterchangeformatlength.html /// JPEGInterchangeFormatLength = 514, /// /// Old-style JPEG compression field. TechNote2 invalidates this part of the specification. (Hex: 0x0203) /// http://www.awaresystems.be/imaging/tiff/tifftags/jpegrestartinterval.html /// JPEGRestartInterval = 515, /// /// Old-style JPEG compression field. TechNote2 invalidates this part of the specification. (Hex: 0x0205) /// http://www.awaresystems.be/imaging/tiff/tifftags/jpeglosslesspredictors.html /// JPEGLosslessPredictors = 517, /// /// Old-style JPEG compression field. TechNote2 invalidates this part of the specification. (Hex: 0x0206) /// http://www.awaresystems.be/imaging/tiff/tifftags/jpegpointtransforms.html /// JPEGPointTransforms = 518, /// /// Old-style JPEG compression field. TechNote2 invalidates this part of the specification. (Hex: 0x0207) /// http://www.awaresystems.be/imaging/tiff/tifftags/jpegqtables.html /// JPEGQTables = 519, /// /// Old-style JPEG compression field. TechNote2 invalidates this part of the specification. (Hex: 0x0208) /// http://www.awaresystems.be/imaging/tiff/tifftags/jpegdctables.html /// JPEGDCTables = 520, /// /// Old-style JPEG compression field. TechNote2 invalidates this part of the specification. (Hex: 0x0209) /// http://www.awaresystems.be/imaging/tiff/tifftags/jpegactables.html /// JPEGACTables = 521, /// /// The transformation from RGB to YCbCr image data. (Hex: 0x0211) /// http://www.awaresystems.be/imaging/tiff/tifftags/ycbcrcoefficients.html /// YCbCrCoefficients = 529, /// /// Specifies the subsampling factors used for the chrominance components of a YCbCr image. (Hex: 0x0212) /// http://www.awaresystems.be/imaging/tiff/tifftags/ycbcrsubsampling.html /// YCbCrSubSampling = 530, /// /// Specifies the positioning of subsampled chrominance components relative to luminance samples. (Hex: 0x0213) /// http://www.awaresystems.be/imaging/tiff/tifftags/ycbcrpositioning.html /// YCbCrPositioning = 531, /// /// Specifies a pair of headroom and footroom image data values (codes) for each pixel component. (Hex: 0x0214) /// http://www.awaresystems.be/imaging/tiff/tifftags/referenceblackwhite.html /// ReferenceBlackWhite = 532, /// /// Defined in the Mixed Raster Content part of RFC 2301, used to replace RowsPerStrip for IFDs with variable-sized strips. (Hex: 0x022F) /// http://www.awaresystems.be/imaging/tiff/tifftags/striprowcounts.html /// StripRowCounts = 559, /// /// XML packet containing XMP metadata (Hex: 0x02BC) /// http://www.awaresystems.be/imaging/tiff/tifftags/xmp.html /// XMP = 700, /// /// Rating tag used by Windows (Hex: 0x4746) /// Rating = 18246, /// /// Rating tag used by Windows, value in percent (Hex: 0x4749) /// RatingPercent = 18249, /// /// OPI-related. (Hex: 0x800D) /// http://www.awaresystems.be/imaging/tiff/tifftags/imageid.html /// ImageID = 32781, /// /// Annotation data, as used in 'Imaging for Windows'. (Hex: 0x80A4) /// http://www.awaresystems.be/imaging/tiff/tifftags/wangannotation.html /// WangAnnotation = 32932, /// /// Copyright notice. (Hex: 0x8298) /// http://www.awaresystems.be/imaging/tiff/tifftags/copyright.html /// Copyright = 33432, /// /// Specifies the pixel data format encoding in the Molecular Dynamics GEL file format. (Hex: 0x82A5) /// http://www.awaresystems.be/imaging/tiff/tifftags/mdfiletag.html /// MDFileTag = 33445, /// /// Specifies a scale factor in the Molecular Dynamics GEL file format. (Hex: 0x82A6) /// http://www.awaresystems.be/imaging/tiff/tifftags/mdscalepixel.html /// MDScalePixel = 33446, /// /// Used to specify the conversion from 16bit to 8bit in the Molecular Dynamics GEL file format. (Hex: 0x82A7) /// http://www.awaresystems.be/imaging/tiff/tifftags/mdcolortable.html /// MDColorTable = 33447, /// /// Name of the lab that scanned this file, as used in the Molecular Dynamics GEL file format. (Hex: 0x82A8) /// http://www.awaresystems.be/imaging/tiff/tifftags/mdlabname.html /// MDLabName = 33448, /// /// Information about the sample, as used in the Molecular Dynamics GEL file format. (Hex: 0x82A9) /// http://www.awaresystems.be/imaging/tiff/tifftags/mdsampleinfo.html /// MDSampleInfo = 33449, /// /// Date the sample was prepared, as used in the Molecular Dynamics GEL file format. (Hex: 0x82AA) /// http://www.awaresystems.be/imaging/tiff/tifftags/mdprepdate.html /// MDPrepDate = 33450, /// /// Time the sample was prepared, as used in the Molecular Dynamics GEL file format. (Hex: 0x82AB) /// http://www.awaresystems.be/imaging/tiff/tifftags/mdpreptime.html /// MDPrepTime = 33451, /// /// Units for data in this file, as used in the Molecular Dynamics GEL file format. (Hex: 0x82AC) /// http://www.awaresystems.be/imaging/tiff/tifftags/mdfileunits.html /// MDFileUnits = 33452, /// /// Used in interchangeable GeoTIFF files. (Hex: 0x830E) /// http://www.awaresystems.be/imaging/tiff/tifftags/modelpixelscaletag.html /// ModelPixelScaleTag = 33550, /// /// IPTC (International Press Telecommunications Council) metadata. (Hex: 0x83BB) /// http://www.awaresystems.be/imaging/tiff/tifftags/iptc.html /// IPTC = 33723, /// /// Intergraph Application specific storage. (Hex: 0x847E) /// http://www.awaresystems.be/imaging/tiff/tifftags/ingrpacketdatatag.html /// INGRPacketDataTag = 33918, /// /// Intergraph Application specific flags. (Hex: 0x847F) /// http://www.awaresystems.be/imaging/tiff/tifftags/ingrflagregisters.html /// INGRFlagRegisters = 33919, /// /// Originally part of Intergraph's GeoTIFF tags, but likely understood by IrasB only. (Hex: 0x8480) /// http://www.awaresystems.be/imaging/tiff/tifftags/irasbtransformationmatrix.html /// IrasBTransformationMatrix = 33920, /// /// Originally part of Intergraph's GeoTIFF tags, but now used in interchangeable GeoTIFF files. (Hex: 0x8482) /// http://www.awaresystems.be/imaging/tiff/tifftags/modeltiepointtag.html /// ModelTiepointTag = 33922, /// /// Used in interchangeable GeoTIFF files. (Hex: 0x85D8) /// http://www.awaresystems.be/imaging/tiff/tifftags/modeltransformationtag.html /// ModelTransformationTag = 34264, /// /// Collection of Photoshop 'Image Resource Blocks'. (Hex: 0x8649) /// http://www.awaresystems.be/imaging/tiff/tifftags/photoshop.html /// Photoshop = 34377, /// /// A pointer to the Exif IFD. (Hex: 0x8769) /// http://www.awaresystems.be/imaging/tiff/tifftags/exififd.html /// ExifIFD = 34665, /// /// ICC profile data. (Hex: 0x8773) /// http://www.awaresystems.be/imaging/tiff/tifftags/iccprofile.html /// ICCProfile = 34675, /// /// Defined in the Mixed Raster Content part of RFC 2301, used to denote the particular function of this Image in the mixed raster scheme. (Hex: 0x87AC) /// http://www.awaresystems.be/imaging/tiff/tifftags/imagelayer.html /// ImageLayer = 34732, /// /// Used in interchangeable GeoTIFF files. (Hex: 0x87AF) /// http://www.awaresystems.be/imaging/tiff/tifftags/geokeydirectorytag.html /// GeoKeyDirectoryTag = 34735, /// /// Used in interchangeable GeoTIFF files. (Hex: 0x87B0) /// http://www.awaresystems.be/imaging/tiff/tifftags/geodoubleparamstag.html /// GeoDoubleParamsTag = 34736, /// /// Used in interchangeable GeoTIFF files. (Hex: 0x87B1) /// http://www.awaresystems.be/imaging/tiff/tifftags/geoasciiparamstag.html /// GeoAsciiParamsTag = 34737, /// /// A pointer to the Exif-related GPS Info IFD. (Hex: 0x8825) /// http://www.awaresystems.be/imaging/tiff/tifftags/gpsifd.html /// GPSIFD = 34853, /// /// Used by HylaFAX. (Hex: 0x885C) /// http://www.awaresystems.be/imaging/tiff/tifftags/hylafaxfaxrecvparams.html /// HylaFAXFaxRecvParams = 34908, /// /// Used by HylaFAX. (Hex: 0x885D) /// http://www.awaresystems.be/imaging/tiff/tifftags/hylafaxfaxsubaddress.html /// HylaFAXFaxSubAddress = 34909, /// /// Used by HylaFAX. (Hex: 0x885E) /// http://www.awaresystems.be/imaging/tiff/tifftags/hylafaxfaxrecvtime.html /// HylaFAXFaxRecvTime = 34910, /// /// Used by Adobe Photoshop. (Hex: 0x935C) /// http://www.awaresystems.be/imaging/tiff/tifftags/imagesourcedata.html /// ImageSourceData = 37724, /// /// A pointer to the Exif-related Interoperability IFD. (Hex: 0xA005) /// http://www.awaresystems.be/imaging/tiff/tifftags/interoperabilityifd.html /// InteroperabilityIFD = 40965, /// /// Used by the GDAL library, holds an XML list of name=value 'metadata' values about the image as a whole, and about specific samples. (Hex: 0xA480) /// http://www.awaresystems.be/imaging/tiff/tifftags/gdal_metadata.html /// GDAL_METADATA = 42112, /// /// Used by the GDAL library, contains an ASCII encoded nodata or background pixel value. (Hex: 0xA481) /// http://www.awaresystems.be/imaging/tiff/tifftags/gdal_nodata.html /// GDAL_NODATA = 42113, /// /// Used in the Oce scanning process. (Hex: 0xC427) /// http://www.awaresystems.be/imaging/tiff/tifftags/ocescanjobdescription.html /// OceScanjobDescription = 50215, /// /// Used in the Oce scanning process. (Hex: 0xC428) /// http://www.awaresystems.be/imaging/tiff/tifftags/oceapplicationselector.html /// OceApplicationSelector = 50216, /// /// Used in the Oce scanning process. (Hex: 0xC429) /// http://www.awaresystems.be/imaging/tiff/tifftags/oceidentificationnumber.html /// OceIdentificationNumber = 50217, /// /// Used in the Oce scanning process. (Hex: 0xC42A) /// http://www.awaresystems.be/imaging/tiff/tifftags/oceimagelogiccharacteristics.html /// OceImageLogicCharacteristics = 50218, /// /// Used in IFD 0 of DNG files. (Hex: 0xC612) /// http://www.awaresystems.be/imaging/tiff/tifftags/dngversion.html /// DNGVersion = 50706, /// /// Used in IFD 0 of DNG files. (Hex: 0xC613) /// http://www.awaresystems.be/imaging/tiff/tifftags/dngbackwardversion.html /// DNGBackwardVersion = 50707, /// /// Used in IFD 0 of DNG files. (Hex: 0xC614) /// http://www.awaresystems.be/imaging/tiff/tifftags/uniquecameramodel.html /// UniqueCameraModel = 50708, /// /// Used in IFD 0 of DNG files. (Hex: 0xC615) /// http://www.awaresystems.be/imaging/tiff/tifftags/localizedcameramodel.html /// LocalizedCameraModel = 50709, /// /// Used in Raw IFD of DNG files. (Hex: 0xC616) /// http://www.awaresystems.be/imaging/tiff/tifftags/cfaplanecolor.html /// CFAPlaneColor = 50710, /// /// Used in Raw IFD of DNG files. (Hex: 0xC617) /// http://www.awaresystems.be/imaging/tiff/tifftags/cfalayout.html /// CFALayout = 50711, /// /// Used in Raw IFD of DNG files. (Hex: 0xC618) /// http://www.awaresystems.be/imaging/tiff/tifftags/linearizationtable.html /// LinearizationTable = 50712, /// /// Used in Raw IFD of DNG files. (Hex: 0xC619) /// http://www.awaresystems.be/imaging/tiff/tifftags/blacklevelrepeatdim.html /// BlackLevelRepeatDim = 50713, /// /// Used in Raw IFD of DNG files. (Hex: 0xC61A) /// http://www.awaresystems.be/imaging/tiff/tifftags/blacklevel.html /// BlackLevel = 50714, /// /// Used in Raw IFD of DNG files. (Hex: 0xC61B) /// http://www.awaresystems.be/imaging/tiff/tifftags/blackleveldeltah.html /// BlackLevelDeltaH = 50715, /// /// Used in Raw IFD of DNG files. (Hex: 0xC61C) /// http://www.awaresystems.be/imaging/tiff/tifftags/blackleveldeltav.html /// BlackLevelDeltaV = 50716, /// /// Used in Raw IFD of DNG files. (Hex: 0xC61D) /// http://www.awaresystems.be/imaging/tiff/tifftags/whitelevel.html /// WhiteLevel = 50717, /// /// Used in Raw IFD of DNG files. (Hex: 0xC61E) /// http://www.awaresystems.be/imaging/tiff/tifftags/defaultscale.html /// DefaultScale = 50718, /// /// Used in Raw IFD of DNG files. (Hex: 0xC61F) /// http://www.awaresystems.be/imaging/tiff/tifftags/defaultcroporigin.html /// DefaultCropOrigin = 50719, /// /// Used in Raw IFD of DNG files. (Hex: 0xC620) /// http://www.awaresystems.be/imaging/tiff/tifftags/defaultcropsize.html /// DefaultCropSize = 50720, /// /// Used in IFD 0 of DNG files. (Hex: 0xC621) /// http://www.awaresystems.be/imaging/tiff/tifftags/colormatrix1.html /// ColorMatrix1 = 50721, /// /// Used in IFD 0 of DNG files. (Hex: 0xC622) /// http://www.awaresystems.be/imaging/tiff/tifftags/colormatrix2.html /// ColorMatrix2 = 50722, /// /// Used in IFD 0 of DNG files. (Hex: 0xC623) /// http://www.awaresystems.be/imaging/tiff/tifftags/cameracalibration1.html /// CameraCalibration1 = 50723, /// /// Used in IFD 0 of DNG files. (Hex: 0xC624) /// http://www.awaresystems.be/imaging/tiff/tifftags/cameracalibration2.html /// CameraCalibration2 = 50724, /// /// Used in IFD 0 of DNG files. (Hex: 0xC625) /// http://www.awaresystems.be/imaging/tiff/tifftags/reductionmatrix1.html /// ReductionMatrix1 = 50725, /// /// Used in IFD 0 of DNG files. (Hex: 0xC626) /// http://www.awaresystems.be/imaging/tiff/tifftags/reductionmatrix2.html /// ReductionMatrix2 = 50726, /// /// Used in IFD 0 of DNG files. (Hex: 0xC627) /// http://www.awaresystems.be/imaging/tiff/tifftags/analogbalance.html /// AnalogBalance = 50727, /// /// Used in IFD 0 of DNG files. (Hex: 0xC628) /// http://www.awaresystems.be/imaging/tiff/tifftags/asshotneutral.html /// AsShotNeutral = 50728, /// /// Used in IFD 0 of DNG files. (Hex: 0xC629) /// http://www.awaresystems.be/imaging/tiff/tifftags/asshotwhitexy.html /// AsShotWhiteXY = 50729, /// /// Used in IFD 0 of DNG files. (Hex: 0xC62A) /// http://www.awaresystems.be/imaging/tiff/tifftags/baselineexposure.html /// BaselineExposure = 50730, /// /// Used in IFD 0 of DNG files. (Hex: 0xC62B) /// http://www.awaresystems.be/imaging/tiff/tifftags/baselinenoise.html /// BaselineNoise = 50731, /// /// Used in IFD 0 of DNG files. (Hex: 0xC62C) /// http://www.awaresystems.be/imaging/tiff/tifftags/baselinesharpness.html /// BaselineSharpness = 50732, /// /// Used in Raw IFD of DNG files. (Hex: 0xC62D) /// http://www.awaresystems.be/imaging/tiff/tifftags/bayergreensplit.html /// BayerGreenSplit = 50733, /// /// Used in IFD 0 of DNG files. (Hex: 0xC62E) /// http://www.awaresystems.be/imaging/tiff/tifftags/linearresponselimit.html /// LinearResponseLimit = 50734, /// /// Used in IFD 0 of DNG files. (Hex: 0xC62F) /// http://www.awaresystems.be/imaging/tiff/tifftags/cameraserialnumber.html /// CameraSerialNumber = 50735, /// /// Used in IFD 0 of DNG files. (Hex: 0xC630) /// http://www.awaresystems.be/imaging/tiff/tifftags/lensinfo.html /// LensInfo = 50736, /// /// Used in Raw IFD of DNG files. (Hex: 0xC631) /// http://www.awaresystems.be/imaging/tiff/tifftags/chromablurradius.html /// ChromaBlurRadius = 50737, /// /// Used in Raw IFD of DNG files. (Hex: 0xC632) /// http://www.awaresystems.be/imaging/tiff/tifftags/antialiasstrength.html /// AntiAliasStrength = 50738, /// /// Used in IFD 0 of DNG files. (Hex: 0xC634) /// http://www.awaresystems.be/imaging/tiff/tifftags/dngprivatedata.html /// DNGPrivateData = 50740, /// /// Used in IFD 0 of DNG files. (Hex: 0xC635) /// http://www.awaresystems.be/imaging/tiff/tifftags/makernotesafety.html /// MakerNoteSafety = 50741, /// /// Used in IFD 0 of DNG files. (Hex: 0xC65A) /// http://www.awaresystems.be/imaging/tiff/tifftags/calibrationilluminant1.html /// CalibrationIlluminant1 = 50778, /// /// Used in IFD 0 of DNG files. (Hex: 0xC65B) /// http://www.awaresystems.be/imaging/tiff/tifftags/calibrationilluminant2.html /// CalibrationIlluminant2 = 50779, /// /// Used in Raw IFD of DNG files. (Hex: 0xC65C) /// http://www.awaresystems.be/imaging/tiff/tifftags/bestqualityscale.html /// BestQualityScale = 50780, /// /// Alias Sketchbook Pro layer usage description. (Hex: 0xC660) /// http://www.awaresystems.be/imaging/tiff/tifftags/aliaslayermetadata.html /// AliasLayerMetadata = 50784, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/ExifEntryTag.cs0000644000175000017500000004172111470571657024466 0ustar00rubenruben00000000000000// // ExifEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009-2010 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Entry tags occuring in the Exif IFD /// The complete overview can be obtained at: /// http://www.awaresystems.be/imaging/tiff.html /// public enum ExifEntryTag : ushort { /// /// Contains two values representing the minimum rows and columns /// to define the repeating patterns of the color filter array. /// (Hex: 0x828D) /// CFARepeatPatternDim = 33421, /// /// Contains two values representing the minimum rows and columns /// to define the repeating patterns of the color filter array. /// (Hex: 0x828E) /// CFAPattern = 33422, /// /// Exposure time, given in seconds. (Hex: 0x829A) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/exposuretime.html /// ExposureTime = 33434, /// /// The F number. (Hex: 0x829D) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/fnumber.html /// FNumber = 33437, /// /// The class of the program used by the camera to set exposure when the picture is taken. (Hex: 0x8822) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/exposureprogram.html /// ExposureProgram = 34850, /// /// Indicates the spectral sensitivity of each channel of the camera used. (Hex: 0x8824) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/spectralsensitivity.html /// SpectralSensitivity = 34852, /// /// Indicates the ISO Speed and ISO Latitude of the camera or input device as specified in ISO 12232. (Hex: 0x8827) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/isospeedratings.html /// ISOSpeedRatings = 34855, /// /// Indicates the Opto-Electric Conversion Function (OECF) specified in ISO 14524. (Hex: 0x8828) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/oecf.html /// OECF = 34856, /// /// The version of the supported Exif standard. (Hex: 0x9000) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/exifversion.html /// ExifVersion = 36864, /// /// The date and time when the original image data was generated. (Hex: 0x9003) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/datetimeoriginal.html /// DateTimeOriginal = 36867, /// /// The date and time when the image was stored as digital data. (Hex: 0x9004) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/datetimedigitized.html /// DateTimeDigitized = 36868, /// /// Specific to compressed data; specifies the channels and complements PhotometricInterpretation (Hex: 0x9101) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/componentsconfiguration.html /// ComponentsConfiguration = 37121, /// /// Specific to compressed data; states the compressed bits per pixel. (Hex: 0x9102) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/compressedbitsperpixel.html /// CompressedBitsPerPixel = 37122, /// /// Shutter speed. (Hex: 0x9201) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/shutterspeedvalue.html /// ShutterSpeedValue = 37377, /// /// The lens aperture. (Hex: 0x9202) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/aperturevalue.html /// ApertureValue = 37378, /// /// The value of brightness. (Hex: 0x9203) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/brightnessvalue.html /// BrightnessValue = 37379, /// /// The exposure bias. (Hex: 0x9204) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/exposurebiasvalue.html /// ExposureBiasValue = 37380, /// /// The smallest F number of the lens. (Hex: 0x9205) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/maxaperturevalue.html /// MaxApertureValue = 37381, /// /// The distance to the subject, given in meters. (Hex: 0x9206) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/subjectdistance.html /// SubjectDistance = 37382, /// /// The metering mode. (Hex: 0x9207) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/meteringmode.html /// MeteringMode = 37383, /// /// The kind of light source. (Hex: 0x9208) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/lightsource.html /// LightSource = 37384, /// /// Indicates the status of flash when the image was shot. (Hex: 0x9209) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/flash.html /// Flash = 37385, /// /// The actual focal length of the lens, in mm. (Hex: 0x920A) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/focallength.html /// FocalLength = 37386, /// /// Indicates the location and area of the main subject in the overall scene. (Hex: 0x9214) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/subjectarea.html /// SubjectArea = 37396, /// /// Manufacturer specific information. (Hex: 0x927C) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/makernote.html /// MakerNote = 37500, /// /// Keywords or comments on the image; complements ImageDescription. (Hex: 0x9286) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/usercomment.html /// UserComment = 37510, /// /// A tag used to record fractions of seconds for the DateTime tag. (Hex: 0x9290) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/subsectime.html /// SubsecTime = 37520, /// /// A tag used to record fractions of seconds for the DateTimeOriginal tag. (Hex: 0x9291) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/subsectimeoriginal.html /// SubsecTimeOriginal = 37521, /// /// A tag used to record fractions of seconds for the DateTimeDigitized tag. (Hex: 0x9292) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/subsectimedigitized.html /// SubsecTimeDigitized = 37522, /// /// The Flashpix format version supported by a FPXR file. (Hex: 0xA000) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/flashpixversion.html /// FlashpixVersion = 40960, /// /// The color space information tag is always recorded as the color space specifier. (Hex: 0xA001) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/colorspace.html /// ColorSpace = 40961, /// /// Specific to compressed data; the valid width of the meaningful image. (Hex: 0xA002) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/pixelxdimension.html /// PixelXDimension = 40962, /// /// Specific to compressed data; the valid height of the meaningful image. (Hex: 0xA003) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/pixelydimension.html /// PixelYDimension = 40963, /// /// Used to record the name of an audio file related to the image data. (Hex: 0xA004) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/relatedsoundfile.html /// RelatedSoundFile = 40964, /// /// Indicates the strobe energy at the time the image is captured, as measured in Beam Candle Power Seconds (Hex: 0xA20B) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/flashenergy.html /// FlashEnergy = 41483, /// /// Records the camera or input device spatial frequency table and SFR values in the direction of image width, image height, and diagonal direction, as specified in ISO 12233. (Hex: 0xA20C) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/spatialfrequencyresponse.html /// SpatialFrequencyResponse = 41484, /// /// Indicates the number of pixels in the image width (X) direction per FocalPlaneResolutionUnit on the camera focal plane. (Hex: 0xA20E) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/focalplanexresolution.html /// FocalPlaneXResolution = 41486, /// /// Indicates the number of pixels in the image height (Y) direction per FocalPlaneResolutionUnit on the camera focal plane. (Hex: 0xA20F) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/focalplaneyresolution.html /// FocalPlaneYResolution = 41487, /// /// Indicates the unit for measuring FocalPlaneXResolution and FocalPlaneYResolution. (Hex: 0xA210) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/focalplaneresolutionunit.html /// FocalPlaneResolutionUnit = 41488, /// /// Indicates the location of the main subject in the scene. (Hex: 0xA214) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/subjectlocation.html /// SubjectLocation = 41492, /// /// Indicates the exposure index selected on the camera or input device at the time the image is captured. (Hex: 0xA215) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/exposureindex.html /// ExposureIndex = 41493, /// /// Indicates the image sensor type on the camera or input device. (Hex: 0xA217) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/sensingmethod.html /// SensingMethod = 41495, /// /// Indicates the image source. (Hex: 0xA300) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/filesource.html /// FileSource = 41728, /// /// Indicates the type of scene. (Hex: 0xA301) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/scenetype.html /// SceneType = 41729, /// /// Indicates the color filter array (CFA) geometric pattern of the image sensor when a one-chip color area sensor is used. (Hex: 0xA302) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/cfapattern.html /// CFAPattern2 = 41730, /// /// Indicates the use of special processing on image data, such as rendering geared to output. (Hex: 0xA401) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/customrendered.html /// CustomRendered = 41985, /// /// Indicates the exposure mode set when the image was shot. (Hex: 0xA402) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/exposuremode.html /// ExposureMode = 41986, /// /// Indicates the white balance mode set when the image was shot. (Hex: 0xA403) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/whitebalance.html /// WhiteBalance = 41987, /// /// Indicates the digital zoom ratio when the image was shot. (Hex: 0xA404) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/digitalzoomratio.html /// DigitalZoomRatio = 41988, /// /// Indicates the equivalent focal length assuming a 35mm film camera, in mm. (Hex: 0xA405) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/focallengthin35mmfilm.html /// FocalLengthIn35mmFilm = 41989, /// /// Indicates the type of scene that was shot. (Hex: 0xA406) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/scenecapturetype.html /// SceneCaptureType = 41990, /// /// Indicates the degree of overall image gain adjustment. (Hex: 0xA407) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/gaincontrol.html /// GainControl = 41991, /// /// Indicates the direction of contrast processing applied by the camera when the image was shot. (Hex: 0xA408) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/contrast.html /// Contrast = 41992, /// /// Indicates the direction of saturation processing applied by the camera when the image was shot. (Hex: 0xA409) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/saturation.html /// Saturation = 41993, /// /// Indicates the direction of sharpness processing applied by the camera when the image was shot. (Hex: 0xA40A) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/sharpness.html /// Sharpness = 41994, /// /// This tag indicates information on the picture-taking conditions of a particular camera model. (Hex: 0xA40B) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/devicesettingdescription.html /// DeviceSettingDescription = 41995, /// /// Indicates the distance to the subject. (Hex: 0xA40C) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/subjectdistancerange.html /// SubjectDistanceRange = 41996, /// /// Indicates an identifier assigned uniquely to each image. (Hex: 0xA420) /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/imageuniqueid.html /// ImageUniqueID = 42016, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/NikonWorldTimeEntryTag.cs0000644000175000017500000000261111470571657026473 0ustar00rubenruben00000000000000// // NikonWorldTimeEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Nikon world time entry tags. /// Based on: /// http://exiv2.org/tags-nikon.html /// public enum NikonWorldTimeEntryTag : ushort { /// /// Timezone. (Hex: 0X0000) /// Timezone = 0, /// /// Daylight savings. (Hex: 0X0002) /// DaylightSavings = 2, /// /// Date display format. (Hex: 0X0003) /// DateDisplayFormat = 3, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/PanasonicMakerNoteEntryTag.cs0000644000175000017500000001771711470571657027324 0ustar00rubenruben00000000000000// // PanasonicMakerNoteEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Panasonic makernote tags. /// Based on http://www.exiv2.org/tags-panasonic.html /// public enum PanasonicMakerNoteEntryTag : ushort { /// /// Image Quality. (Hex: 0x0001) /// Quality = 1, /// /// Firmware version. (Hex: 0X0002) /// FirmwareVersion = 2, /// /// White balance setting. (Hex: 0X0003) /// WhiteBalance = 3, /// /// Unknown. (Hex: 0X0004) /// Unknown4 = 4, /// /// Focus mode. (Hex: 0X0007) /// FocusMode = 7, /// /// AF mode. (Hex: 0X000F) /// AFMode = 15, /// /// ISO Speed. (Hex: 0X0017) /// ISO = 23, /// /// Image stabilization. (Hex: 0X001A) /// ImageStabilization = 26, /// /// Macro mode. (Hex: 0X001C) /// Macro = 28, /// /// Shooting mode. (Hex: 0X001F) /// ShootingMode = 31, /// /// Audio. (Hex: 0X0020) /// Audio = 32, /// /// Data dump. (Hex: 0X0021) /// DataDump = 33, /// /// Unknown. (Hex: 0X0022) /// Unknown34 = 34, /// /// White balance adjustment. (Hex: 0X0023) /// WhiteBalanceBias = 35, /// /// Flash bias. (Hex: 0X0024) /// FlashBias = 36, /// /// This number is unique, and contains the date of manufacture, but /// is not the same as the number printed on the camera body. /// (Hex: 0X0025) /// InternalSerialNumber = 37, /// /// Exif version. (Hex: 0X0026) /// ExifVersion = 38, /// /// Unknown. (Hex: 0X0027) /// Unknown39 = 39, /// /// Color effect. (Hex: 0X0028) /// ColorEffect = 40, /// /// Time in 1/100s from when the camera was powered on to when the /// image is written to memory card. (Hex: 0X0029) /// TimeSincePowerOn = 41, /// /// Burst mode. (Hex: 0X002A) /// BurstMode = 42, /// /// Sequence number. (Hex: 0X002B) /// SequenceNumber = 43, /// /// Contrast setting. (Hex: 0X002C) /// Contrast = 44, /// /// Noise reduction. (Hex: 0X002D) /// NoiseReduction = 45, /// /// Self timer. (Hex: 0X002E) /// SelfTimer = 46, /// /// Unknown. (Hex: 0X002F) /// Unknown47 = 47, /// /// Rotation. (Hex: 0X0030) /// Rotation = 48, /// /// Unknown. (Hex: 0X0031) /// Unknown49 = 49, /// /// Color mode. (Hex: 0X0032) /// ColorMode = 50, /// /// Baby (or pet) age. (Hex: 0X0033) /// BabyAge = 51, /// /// Optical zoom mode. (Hex: 0X0034) /// OpticalZoomMode = 52, /// /// Conversion lens. (Hex: 0X0035) /// ConversionLens = 53, /// /// Travel day. (Hex: 0X0036) /// TravelDay = 54, /// /// Contrast. (Hex: 0X0039) /// Contrast2 = 57, /// /// World time location. (Hex: 0X003A) /// WorldTimeLocation = 58, /// /// Program ISO. (Hex: 0X003C) /// ProgramISO = 60, /// /// Saturation. (Hex: 0X0040) /// Saturation = 64, /// /// Sharpness. (Hex: 0X0041) /// Sharpness = 65, /// /// Film mode. (Hex: 0X0042) /// FilmMode = 66, /// /// WB adjust AB. Positive is a shift toward blue. (Hex: 0X0046) /// WBAdjustAB = 70, /// /// WBAdjustGM. Positive is a shift toward green. (Hex: 0X0047) /// WBAdjustGM = 71, /// /// Lens type. (Hex: 0X0051) /// LensType = 81, /// /// Lens serial number. (Hex: 0X0052) /// LensSerialNumber = 82, /// /// Accessory type. (Hex: 0X0053) /// AccessoryType = 83, /// /// PrintIM information. (Hex: 0X0E00) /// PrintIM = 3584, /// /// Unknown. (Hex: 0X4449) /// Unknown17481 = 17481, /// /// MakerNote version. (Hex: 0X8000) /// MakerNoteVersion = 32768, /// /// Scene mode. (Hex: 0X8001) /// SceneMode = 32769, /// /// WB red level. (Hex: 0X8004) /// WBRedLevel = 32772, /// /// WB green level. (Hex: 0X8005) /// WBGreenLevel = 32773, /// /// WB blue level. (Hex: 0X8006) /// WBBlueLevel = 32774, /// /// Baby (or pet) age. (Hex: 0X8010) /// BabyAge2 = 32784, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/NikonIsoInfoEntryTag.cs0000644000175000017500000000276311470571657026143 0ustar00rubenruben00000000000000// // NikonIsoInfoEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Nikon Iso Info entry tags. /// Based on: /// http://exiv2.org/tags-nikon.html /// public enum NikonIsoInfoEntryTag : ushort { /// /// ISO. (Hex: 0X0000) /// ISO = 0, /// /// ISO expansion. (Hex: 0X0004) /// ISOExpansion = 4, /// /// ISO 2. (Hex: 0X0006) /// ISO2 = 6, /// /// ISO expansion 2. (Hex: 0X000A) /// ISOExpansion2 = 10, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/PentaxMakerNoteEntryTag.cs0000644000175000017500000002743111470571657026642 0ustar00rubenruben00000000000000// // PentaxMakerNoteEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Pentax makernote tags. /// Based on http://www.exiv2.org/tags-pentax.html /// public enum PentaxMakerNoteEntryTag : ushort { /// /// Pentax Makernote version. (Hex: 0X0000) /// Version = 0, /// /// Camera shooting mode. (Hex: 0X0001) /// Mode = 1, /// /// Resolution of a preview image. (Hex: 0X0002) /// PreviewResolution = 2, /// /// Size of an IFD containing a preview image. (Hex: 0X0003) /// PreviewLength = 3, /// /// Offset to an IFD containing a preview image. (Hex: 0X0004) /// PreviewOffset = 4, /// /// Pentax model idenfication. (Hex: 0X0005) /// ModelID = 5, /// /// Date. (Hex: 0X0006) /// Date = 6, /// /// Time. (Hex: 0X0007) /// Time = 7, /// /// Image quality settings. (Hex: 0X0008) /// Quality = 8, /// /// Image size settings. (Hex: 0X0009) /// Size = 9, /// /// Flash mode settings. (Hex: 0X000C) /// Flash = 12, /// /// Focus mode settings. (Hex: 0X000D) /// Focus = 13, /// /// Selected AF point. (Hex: 0X000E) /// AFPoint = 14, /// /// AF point in focus. (Hex: 0X000F) /// AFPointInFocus = 15, /// /// Exposure time. (Hex: 0X0012) /// ExposureTime = 18, /// /// F-Number. (Hex: 0X0013) /// FNumber = 19, /// /// ISO sensitivity settings. (Hex: 0X0014) /// ISO = 20, /// /// Exposure compensation. (Hex: 0X0016) /// ExposureCompensation = 22, /// /// MeteringMode. (Hex: 0X0017) /// MeteringMode = 23, /// /// AutoBracketing. (Hex: 0X0018) /// AutoBracketing = 24, /// /// White ballance. (Hex: 0X0019) /// WhiteBallance = 25, /// /// White ballance mode. (Hex: 0X001A) /// WhiteBallanceMode = 26, /// /// Blue color balance. (Hex: 0X001B) /// BlueBalance = 27, /// /// Red color balance. (Hex: 0X001C) /// RedBalance = 28, /// /// FocalLength. (Hex: 0X001D) /// FocalLength = 29, /// /// Digital zoom. (Hex: 0X001E) /// DigitalZoom = 30, /// /// Saturation. (Hex: 0X001F) /// Saturation = 31, /// /// Contrast. (Hex: 0X0020) /// Contrast = 32, /// /// Sharpness. (Hex: 0X0021) /// Sharpness = 33, /// /// Location. (Hex: 0X0022) /// Location = 34, /// /// Home town. (Hex: 0X0023) /// Hometown = 35, /// /// Destination. (Hex: 0X0024) /// Destination = 36, /// /// Whether day saving time is active in home town. (Hex: 0X0025) /// HometownDST = 37, /// /// Whether day saving time is active in destination. (Hex: 0X0026) /// DestinationDST = 38, /// /// DSPFirmwareVersion. (Hex: 0X0027) /// DSPFirmwareVersion = 39, /// /// CPUFirmwareVersion. (Hex: 0X0028) /// CPUFirmwareVersion = 40, /// /// Frame number. (Hex: 0X0029) /// FrameNumber = 41, /// /// Camera calculated light value, includes exposure compensation. (Hex: 0X002D) /// EffectiveLV = 45, /// /// Image processing. (Hex: 0X0032) /// ImageProcessing = 50, /// /// Picture mode. (Hex: 0X0033) /// PictureMode = 51, /// /// Drive mode. (Hex: 0X0034) /// DriveMode = 52, /// /// Color space. (Hex: 0X0037) /// ColorSpace = 55, /// /// Image area offset. (Hex: 0X0038) /// ImageAreaOffset = 56, /// /// Raw image size. (Hex: 0X0039) /// RawImageSize = 57, /// /// Preview image borders. (Hex: 0X003E) /// PreviewImageBorders = 62, /// /// Lens type. (Hex: 0X003F) /// LensType = 63, /// /// Sensitivity adjust. (Hex: 0X0040) /// SensitivityAdjust = 64, /// /// Digital filter. (Hex: 0X0041) /// DigitalFilter = 65, /// /// Camera temperature. (Hex: 0X0047) /// Temperature = 71, /// /// AE lock. (Hex: 0X0048) /// AELock = 72, /// /// Noise reduction. (Hex: 0X0049) /// NoiseReduction = 73, /// /// Flash exposure compensation. (Hex: 0X004D) /// FlashExposureCompensation = 77, /// /// Image tone. (Hex: 0X004F) /// ImageTone = 79, /// /// Colort temperature. (Hex: 0X0050) /// ColorTemperature = 80, /// /// Shake reduction information. (Hex: 0X005C) /// ShakeReduction = 92, /// /// Shutter count. (Hex: 0X005D) /// ShutterCount = 93, /// /// Dynamic range expansion. (Hex: 0X0069) /// DynamicRangeExpansion = 105, /// /// High ISO noise reduction. (Hex: 0X0071) /// HighISONoiseReduction = 113, /// /// AF Adjustment. (Hex: 0X0072) /// AFAdjustment = 114, /// /// Black point. (Hex: 0X0200) /// BlackPoint = 512, /// /// White point. (Hex: 0X0201) /// WhitePoint = 513, /// /// ShotInfo. (Hex: 0X0205) /// ShotInfo = 517, /// /// AEInfo. (Hex: 0X0206) /// AEInfo = 518, /// /// LensInfo. (Hex: 0X0207) /// LensInfo = 519, /// /// FlashInfo. (Hex: 0X0208) /// FlashInfo = 520, /// /// AEMeteringSegments. (Hex: 0X0209) /// AEMeteringSegments = 521, /// /// FlashADump. (Hex: 0X020A) /// FlashADump = 522, /// /// FlashBDump. (Hex: 0X020B) /// FlashBDump = 523, /// /// WB_RGGBLevelsDaylight. (Hex: 0X020D) /// WB_RGGBLevelsDaylight = 525, /// /// WB_RGGBLevelsShade. (Hex: 0X020E) /// WB_RGGBLevelsShade = 526, /// /// WB_RGGBLevelsCloudy. (Hex: 0X020F) /// WB_RGGBLevelsCloudy = 527, /// /// WB_RGGBLevelsTungsten. (Hex: 0X0210) /// WB_RGGBLevelsTungsten = 528, /// /// WB_RGGBLevelsFluorescentD. (Hex: 0X0211) /// WB_RGGBLevelsFluorescentD = 529, /// /// WB_RGGBLevelsFluorescentN. (Hex: 0X0212) /// WB_RGGBLevelsFluorescentN = 530, /// /// WB_RGGBLevelsFluorescentW. (Hex: 0X0213) /// WB_RGGBLevelsFluorescentW = 531, /// /// WB_RGGBLevelsFlash. (Hex: 0X0214) /// WB_RGGBLevelsFlash = 532, /// /// CameraInfo. (Hex: 0X0215) /// CameraInfo = 533, /// /// BatteryInfo. (Hex: 0X0216) /// BatteryInfo = 534, /// /// AFInfo. (Hex: 0X021F) /// AFInfo = 543, /// /// ColorInfo. (Hex: 0X0222) /// ColorInfo = 546, /// /// Serial Number. (Hex: 0X0229) /// SerialNumber = 553, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Tags/CanonFileInfoEntryTag.cs0000644000175000017500000000506211470571657026243 0ustar00rubenruben00000000000000// // CanonFileInfoEntryTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Tags { /// /// Label tags for Canon File Info. /// Based on http://www.exiv2.org/tags-canon.html /// public enum CanonFileInfoEntryTag : ushort { /// /// File Number. (Hex: 0X0001) /// FileNumber = 1, /// /// Bracket Mode. (Hex: 0X0003) /// BracketMode = 3, /// /// Bracket Value. (Hex: 0X0004) /// BracketValue = 4, /// /// Bracket Shot Number. (Hex: 0X0005) /// BracketShotNumber = 5, /// /// Raw Jpg Quality. (Hex: 0X0006) /// RawJpgQuality = 6, /// /// Raw Jpg Size. (Hex: 0X0007) /// RawJpgSize = 7, /// /// Noise Reduction. (Hex: 0X0008) /// NoiseReduction = 8, /// /// WB Bracket Mode. (Hex: 0X0009) /// WBBracketMode = 9, /// /// WB Bracket Value AB. (Hex: 0X000C) /// WBBracketValueAB = 12, /// /// WB Bracket Value GM. (Hex: 0X000D) /// WBBracketValueGM = 13, /// /// Filter Effect. (Hex: 0X000E) /// FilterEffect = 14, /// /// Toning Effect. (Hex: 0X000F) /// ToningEffect = 15, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/0000777000175000017500000000000011503407421022260 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/ThumbnailDataIFDEntry.cs0000644000175000017500000000606411470571657026713 0ustar00rubenruben00000000000000// // ThumbnailDataIFDEntry.cs: // // Author: // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains the data of a Thumbnail. Since the thumbnail is /// referenced by two long entries (offset to the data and length) /// we need to take care of this special case. /// This entry acts as the offset-entry but holds also the /// thumbail data. When rendering the entry, we have to render the /// data but write a long entry. /// public class ThumbnailDataIFDEntry : IFDEntry { #region Properties /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; private set; } /// /// The data of the thumbnail which is stored by the current instance /// public ByteVector Data { get; private set; } #endregion #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A with the thumbnail data to be stored /// public ThumbnailDataIFDEntry (ushort tag, ByteVector data) { Tag = tag; Data = data; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { // the entry is a single long entry where the value is an offset to the data // the offset is automatically updated by the renderer. type = (ushort) IFDEntryType.Long; count = 1; return Data; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/ShortIFDEntry.cs0000644000175000017500000000516411470571657025275 0ustar00rubenruben00000000000000// // ShortIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains a SHORT value. /// public class ShortIFDEntry : IFDEntry { #region Properties /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; private set; } /// /// The value which is stored by the current instance /// public ushort Value { get; private set; } #endregion #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public ShortIFDEntry (ushort tag, ushort value) { Tag = tag; Value = value; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.Short; count = 1; return ByteVector.FromUShort (Value, is_bigendian); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/UserCommentIFDEntry.cs0000644000175000017500000001403111470571657026430 0ustar00rubenruben00000000000000// // UserCommentIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.IFD.Entries { /// /// Contains an ASCII STRING value. /// public class UserCommentIFDEntry : IFDEntry { #region Constant Values /// /// Marker for an ASCII-encoded UserComment tag. /// public static readonly ByteVector COMMENT_ASCII_CODE = new byte[] {0x41, 0x53, 0x43, 0x49, 0x49, 0x00, 0x00, 0x00}; /// /// Marker for a JIS-encoded UserComment tag. /// public static readonly ByteVector COMMENT_JIS_CODE = new byte[] {0x4A, 0x49, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00}; /// /// Marker for a UNICODE-encoded UserComment tag. /// public static readonly ByteVector COMMENT_UNICODE_CODE = new byte[] {0x55, 0x4E, 0x49, 0x43, 0x4F, 0x44, 0x45, 0x00}; /// /// Corrupt marker that seems to be resembling unicode. /// public static readonly ByteVector COMMENT_BAD_UNICODE_CODE = new byte[] {0x55, 0x6E, 0x69, 0x63, 0x6F, 0x64, 0x65, 0x00}; /// /// Marker for a UserComment tag with undefined encoding. /// public static readonly ByteVector COMMENT_UNDEFINED_CODE = new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #endregion #region Properties /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; private set; } /// /// The value which is stored by the current instance /// public string Value { get; private set; } #endregion #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public UserCommentIFDEntry (ushort tag, string value) { Tag = tag; Value = value; } /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// /// /// The file that's currently being parsed, used for reporting corruptions. /// public UserCommentIFDEntry (ushort tag, ByteVector data, TagLib.File file) { Tag = tag; if (data.StartsWith (COMMENT_ASCII_CODE)) { Value = TrimNull (data.ToString (StringType.Latin1, COMMENT_ASCII_CODE.Count, data.Count - COMMENT_ASCII_CODE.Count)); return; } if (data.StartsWith (COMMENT_UNICODE_CODE)) { Value = TrimNull (data.ToString (StringType.UTF8, COMMENT_UNICODE_CODE.Count, data.Count - COMMENT_UNICODE_CODE.Count)); return; } var trimmed = data.ToString ().Trim (); if (trimmed.Length == 0 || trimmed == "\0") { Value = String.Empty; return; } // Some programs like e.g. CanonZoomBrowser inserts just the first 0x00-byte // followed by 7-bytes of trash. if (data.StartsWith ((byte) 0x00) && data.Count >= 8) { // And CanonZoomBrowser fills some trailing bytes of the comment field // with '\0'. So we return only the characters before the first '\0'. int term = data.Find ("\0", 8); if (term != -1) { Value = data.ToString (StringType.Latin1, 8, term - 8); } else { Value = data.ToString (StringType.Latin1, 8, data.Count - 8); } return; } if (data.Data.Length == 0) { Value = String.Empty; return; } // Try to parse anyway int offset = 0; int length = data.Count - offset; // Corruption that starts with a Unicode header and a count byte. if (data.StartsWith (COMMENT_BAD_UNICODE_CODE)) { offset = COMMENT_BAD_UNICODE_CODE.Count; length = data.Count - offset; } file.MarkAsCorrupt ("UserComment with other encoding than Latin1 or Unicode"); Value = TrimNull (data.ToString (StringType.UTF8, offset, length)); } private string TrimNull (string value) { int term = value.IndexOf ('\0'); if (term > -1) value = value.Substring (0, term); return value; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.Undefined; ByteVector data = new ByteVector (); data.Add (COMMENT_UNICODE_CODE); data.Add (ByteVector.FromString (Value, StringType.UTF8)); count = (uint) data.Count; return data; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/SShortIFDEntry.cs0000644000175000017500000000520511470571657025414 0ustar00rubenruben00000000000000// // SShortIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains a Signed SHORT value. /// public class SShortIFDEntry : IFDEntry { #region Properties /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; private set; } /// /// The value which is stored by the current instance /// public short Value { get; private set; } #endregion #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public SShortIFDEntry (ushort tag, short value) { Tag = tag; Value = value; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.SShort; count = 1; return ByteVector.FromUShort ((ushort) Value, is_bigendian); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/LongIFDEntry.cs0000644000175000017500000000515111470571657025071 0ustar00rubenruben00000000000000// // LongIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains a LONG value. /// public class LongIFDEntry : IFDEntry { #region Properties /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; private set; } /// /// The value which is stored by the current instance /// public uint Value { get; private set; } #endregion #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public LongIFDEntry (ushort tag, uint value) { Tag = tag; Value = value; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.Long; count = 1; return ByteVector.FromUInt (Value, is_bigendian); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/UndefinedIFDEntry.cs0000644000175000017500000000522311470571657026073 0ustar00rubenruben00000000000000// // UndefinedIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (miek@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains an Undefined value type, represented by a byte vector /// public class UndefinedIFDEntry : IFDEntry { #region Properties /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; private set; } /// /// The data which is stored by the current instance /// public ByteVector Data { get; private set; } #endregion #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public UndefinedIFDEntry (ushort tag, ByteVector data) { Tag = tag; Data = data; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.Undefined; count = (uint) Data.Count; return Data; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/StringIFDEntry.cs0000644000175000017500000000523211470571657025440 0ustar00rubenruben00000000000000// // StringIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains an ASCII STRING value. /// public class StringIFDEntry : IFDEntry { #region Properties /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; private set; } /// /// The value which is stored by the current instance /// public string Value { get; private set; } #endregion #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public StringIFDEntry (ushort tag, string value) { Tag = tag; Value = value; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.Ascii; ByteVector data = Value; data.Add ("\0"); count = (uint) data.Count; return data; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/ByteIFDEntry.cs0000644000175000017500000000510211470571657025071 0ustar00rubenruben00000000000000// // ByteIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains a byte value /// public class ByteIFDEntry : IFDEntry { #region Properties /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; private set; } /// /// The value which is stored by the current instance /// public byte Value { get; private set; } #endregion #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public ByteIFDEntry (ushort tag, byte value) { Tag = tag; Value = value; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.Byte; count = 1; return Value; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/SLongIFDEntry.cs0000644000175000017500000000516011470571657025214 0ustar00rubenruben00000000000000// // SLongIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains a signed LONG value. /// public class SLongIFDEntry : IFDEntry { #region Properties /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; private set; } /// /// The value which is stored by the current instance /// public int Value { get; private set; } #endregion #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public SLongIFDEntry (ushort tag, int value) { Tag = tag; Value = value; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.SLong; count = 1; return ByteVector.FromInt (Value, is_bigendian); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/SRational.cs0000644000175000017500000001040111470571657024513 0ustar00rubenruben00000000000000// // SRational.cs: A structure to represent signed rational values by a // numerator and a denominator. // // Author: // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.IFD.Entries { /// /// Representation of a signed rational value /// public struct SRational : IFormattable { #region Private Fields /// /// The numerator of the rational value /// private int numerator; /// /// The denominator of the rational value /// private int denominator; #endregion #region Constructor /// /// Creates a new Rational value /// /// /// A with the numerator of the /// rational value /// /// /// A with the denominator of the /// rational value. It must be not 0. /// public SRational (int numerator, int denominator) { if (denominator == 0) throw new ArgumentException ("denominator"); this.numerator = numerator; this.denominator = denominator; } #endregion #region Public Methods /// /// Returns a rational value with reduced nominator and denominator /// /// /// A /// public SRational Reduce () { int den_sign = Math.Sign (Denominator); int gcd = Math.Abs (Denominator); int b = Math.Abs (Numerator); while (b != 0) { int tmp = gcd % b; gcd = b; b = tmp; } return new SRational (den_sign * (Numerator / gcd), Math.Abs (Denominator) / gcd); } /// /// Formatprovider to allow formatting of a value. /// /// /// A . /// /// /// A . /// /// /// A formated according to the given parameter /// public string ToString (string format, IFormatProvider provider) { SRational reduced = Reduce (); return String.Format ("{0}/{1}", reduced.Numerator, reduced.Denominator); } /// /// Converts the value to a . /// /// /// A with the current value. /// public override string ToString () { return String.Format ("{0}", this); } #endregion #region Public Properties /// /// The numerator of the rational value /// public int Numerator { get { return numerator; } set { numerator = value; } } /// /// The denominator of the rational value /// /// /// Cannot be 0. /// public int Denominator { get { return denominator; } set { if (value == 0) throw new ArgumentException ("denominator"); denominator = value; } } #endregion #region Public Static Methods /// /// Cast the value to a . /// /// /// A with the value to cast. /// /// /// A with the double. /// public static implicit operator double (SRational rat) { return (double) rat.Numerator / (double) rat.Denominator; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/SubIFDArrayEntry.cs0000644000175000017500000000507411470571657025726 0ustar00rubenruben00000000000000// // SubIFDArrayEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2010 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; namespace TagLib.IFD.Entries { /// /// Contains the SubIFDs IFD entry. /// public class SubIFDArrayEntry : IFDEntry { /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; set; } /// /// The structures of the IFDs to which this entry points. /// public IFDStructure [] Entries { get; private set; } #region Constructors /// /// Constructor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A set of ifd structures. /// public SubIFDArrayEntry (ushort tag, List entries) { Tag = tag; Entries = entries.ToArray (); } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { throw new NotImplementedException ("Not implemented yet!"); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/SLongArrayIFDEntry.cs0000644000175000017500000000475711470571657026226 0ustar00rubenruben00000000000000// // SLongArrayIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains a SLONG value with a count > 1 /// public class SLongArrayIFDEntry : ArrayIFDEntry { #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public SLongArrayIFDEntry (ushort tag, int [] values) : base (tag) { Values = values; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public override ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.Long; count = (uint) Values.Length; ByteVector data = new ByteVector (); foreach (int value in Values) data.Add (ByteVector.FromInt (value, is_bigendian)); return data; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/ShortArrayIFDEntry.cs0000644000175000017500000000477511470571657026303 0ustar00rubenruben00000000000000// // ShortArrayIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains a SHORT value with a count > 1 /// public class ShortArrayIFDEntry : ArrayIFDEntry { #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public ShortArrayIFDEntry (ushort tag, ushort [] values) : base (tag) { Values = values; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public override ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.Short; count = (uint) Values.Length; ByteVector data = new ByteVector (); foreach (ushort value in Values) data.Add (ByteVector.FromUShort (value, is_bigendian)); return data; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/SRationalIFDEntry.cs0000644000175000017500000000542211470571657026067 0ustar00rubenruben00000000000000// // SRationalIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains a SRATIONAL value. /// public class SRationalIFDEntry : IFDEntry { #region Properties /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; private set; } /// /// The value which is stored by the current instance /// public SRational Value { get; private set; } #endregion #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public SRationalIFDEntry (ushort tag, SRational value) { Tag = tag; Value = value; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.SRational; count = 1; ByteVector data = new ByteVector (); data.Add (ByteVector.FromInt (Value.Numerator, is_bigendian)); data.Add (ByteVector.FromInt (Value.Denominator, is_bigendian)); return data; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/RationalArrayIFDEntry.cs0000644000175000017500000000516111470571657026743 0ustar00rubenruben00000000000000// // RationalArrayIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains a RATIONAL value with a count > 1 /// public class RationalArrayIFDEntry : ArrayIFDEntry { #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public RationalArrayIFDEntry (ushort tag, Rational [] entries) : base (tag) { Values = entries; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public override ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.Rational; count = (uint) Values.Length; ByteVector data = new ByteVector (); foreach (Rational rational in Values) { data.Add (ByteVector.FromUInt (rational.Numerator, is_bigendian)); data.Add (ByteVector.FromUInt (rational.Denominator, is_bigendian)); } return data; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/ByteVectorIFDEntry.cs0000644000175000017500000000521311470571657026257 0ustar00rubenruben00000000000000// // ByteVectorIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains an BYTE value with a count > 1 (byte sequence). /// public class ByteVectorIFDEntry : IFDEntry { #region Properties /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; private set; } /// /// The data which is stored by the current instance /// public ByteVector Data { get; private set; } #endregion #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public ByteVectorIFDEntry (ushort tag, ByteVector data) { Tag = tag; Data = data; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.Byte; count = (uint) Data.Count; return Data; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/SShortArrayIFDEntry.cs0000644000175000017500000000501011470571657026405 0ustar00rubenruben00000000000000// // SShortArrayIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains a SSHORT value with a count > 1 /// public class SShortArrayIFDEntry : ArrayIFDEntry { #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public SShortArrayIFDEntry (ushort tag, short [] values) : base (tag) { Values = values; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public override ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.SShort; count = (uint) Values.Length; ByteVector data = new ByteVector (); foreach (ushort value in Values) data.Add (ByteVector.FromUShort ((ushort) value, is_bigendian)); return data; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/SByteIFDEntry.cs0000644000175000017500000000512711470571657025223 0ustar00rubenruben00000000000000// // SByteIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains a signed byte value /// public class SByteIFDEntry : IFDEntry { #region Properties /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; private set; } /// /// The value which is stored by the current instance /// public sbyte Value { get; private set; } #endregion #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public SByteIFDEntry (ushort tag, sbyte value) { Tag = tag; Value = value; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.SByte; count = 1; return (byte) Value; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/LongArrayIFDEntry.cs0000644000175000017500000000476011470571657026075 0ustar00rubenruben00000000000000// // LongArrayIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains a LONG value with a count > 1 /// public class LongArrayIFDEntry : ArrayIFDEntry { #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public LongArrayIFDEntry (ushort tag, uint [] values) : base (tag) { Values = values; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public override ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.Long; count = (uint) Values.Length; ByteVector data = new ByteVector (); foreach (uint value in Values) data.Add (ByteVector.FromUInt (value, is_bigendian)); return data; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/SRationalArrayIFDEntry.cs0000644000175000017500000000517011470571657027066 0ustar00rubenruben00000000000000// // SRationalArrayIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains a SRATIONAL value with a count > 1 /// public class SRationalArrayIFDEntry : ArrayIFDEntry { #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A to be stored /// public SRationalArrayIFDEntry (ushort tag, SRational [] entries) : base (tag) { Values = entries; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public override ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.SRational; count = (uint) Values.Length; ByteVector data = new ByteVector (); foreach (SRational rational in Values) { data.Add (ByteVector.FromInt (rational.Numerator, is_bigendian)); data.Add (ByteVector.FromInt (rational.Denominator, is_bigendian)); } return data; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/RationalIFDEntry.cs0000644000175000017500000000537411470571657025752 0ustar00rubenruben00000000000000// // RationalIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains a RATIONAL value. /// public class RationalIFDEntry : IFDEntry { #region Properties /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; private set; } /// /// The value which is stored by the current instance /// public Rational Value { get; private set; } #endregion #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A /// public RationalIFDEntry (ushort tag, Rational value) { Tag = tag; Value = value; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.Rational; count = 1; ByteVector data = new ByteVector (); data.Add (ByteVector.FromUInt (Value.Numerator, is_bigendian)); data.Add (ByteVector.FromUInt (Value.Denominator, is_bigendian)); return data; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/SubIFDEntry.cs0000644000175000017500000000657511470571657024736 0ustar00rubenruben00000000000000// // SubIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// Contains a Sub IFD. /// public class SubIFDEntry : IFDEntry { #region Properties /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; private set; } /// /// The type of the IFD entry. /// public ushort Type { get; private set; } /// /// The count of the IFD entry. /// public uint Count { get; private set; } /// /// The structure of the sub-ifd which is stored by the current /// instance /// public IFDStructure Structure { get; private set; } /// /// The number of entries in the entire IFD. /// public int ChildCount { get { int sum = 0; foreach (var directory in Structure.Directories) sum += directory.Count; return sum; } } /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A with the type of the IFD entry. /// /// /// A with the count of the IFD entry. /// /// /// A to be stored /// public SubIFDEntry (ushort tag, ushort type, uint count, IFDStructure structure) { Tag = tag; Type = type; Count = count; Structure = structure; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) Type; count = 1; count = Count; return new IFDRenderer (is_bigendian, Structure, offset).Render (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/StripOffsetsIFDEntry.cs0000644000175000017500000001135411470571657026627 0ustar00rubenruben00000000000000// // StripOffsetsIFDEntry.cs: // // Author: // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.IO; namespace TagLib.IFD.Entries { /// /// Contains the offsets to the image data strips. /// public class StripOffsetsIFDEntry : ArrayIFDEntry { #region Private Fields /// /// Store the strip length to read them before writing. /// private uint[] byte_counts; /// /// The file the offsets belong to /// private File file; #endregion #region Constructors /// /// Constructor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A with the strip offsets. /// /// /// The length of the strips. /// /// /// The file from which the strips will be read. /// public StripOffsetsIFDEntry (ushort tag, uint[] values, uint[] byte_counts, File file) : base (tag) { Values = values; this.byte_counts = byte_counts; this.file = file; if (values.Length != byte_counts.Length) throw new Exception ("strip offsets and strip byte counts do not have the same length"); } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public override ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { // The StripOffsets are an array of offsets, where the image data can be found. // We store the offsets and behind the offsets the image data is stored. Therfore, // the ByteVector data first collects the image data and the offsets itself are // collected by offset_data. Then both are concatenated. ByteVector data = new ByteVector (); ByteVector offset_data = new ByteVector (); // every offset needs 4 byte, we need to reserve the bytes. uint data_offset = offset + (uint) (4 * Values.Length); for (int i = 0; i < Values.Length; i++) { uint new_offset = (uint) (data_offset + data.Count); file.Seek (Values[i], SeekOrigin.Begin); data.Add (file.ReadBlock ((int) byte_counts[i])); // update strip offset data to new offset Values[i] = new_offset; offset_data.Add (ByteVector.FromUInt (new_offset, is_bigendian)); } // If the StripOffsets only consists of one offset, this doesn't work, because this offset // should be stored inside the IFD as a value. But, because of the additional image data, // it is not stored there. We need to fix this, that the offset is adjusted correctly. // Therefore, the offset_data is only added if it contains more than one value. // Then, the offset is set correctly. (However, we need to ensure, that the image data // consists at least of 4 bytes, which is probably the case every time, but to be sure ...) // However, the strip offset in the array must also be adjusted, if the offset_data is ignored. if (Values.Length > 1) data.Insert (0, offset_data); else Values[0] = offset; while (data.Count < 4) data.Add (0x00); // the entry is a single long entry where the value is an offset to the data // the offset is automatically updated by the renderer. type = (ushort) IFDEntryType.Long; count = (uint) Values.Length; return data; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/Rational.cs0000644000175000017500000001024411470571657024375 0ustar00rubenruben00000000000000// // Rational.cs: A structure to represent rational values by a numerator and // a denominator. // // Author: // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.IFD.Entries { /// /// Representation of an unsigned rational value /// public struct Rational : IFormattable { #region Private Fields /// /// The numerator of the rational value /// private uint numerator; /// /// The denominator of the rational value /// private uint denominator; #endregion #region Constructor /// /// Creates a new Rational value /// /// /// A with the numerator of the /// rational value /// /// /// A with the denominator of the /// rational value. It must be not 0. /// public Rational (uint numerator, uint denominator) { if (denominator == 0) throw new ArgumentException ("denominator"); this.numerator = numerator; this.denominator = denominator; } #endregion #region Public Methods /// /// Returns a rational value with reduced nominator and denominator /// /// /// A /// public Rational Reduce () { uint gcd = Denominator; uint b = Numerator; while (b != 0) { uint tmp = gcd % b; gcd = b; b = tmp; } return new Rational (Numerator / gcd, Denominator / gcd); } /// /// Formatprovider to allow formatting of a value. /// /// /// A . /// /// /// A . /// /// /// A formated according to the given parameter /// public string ToString (string format, IFormatProvider provider) { Rational reduced = Reduce (); return String.Format ("{0}/{1}", reduced.Numerator, reduced.Denominator); } /// /// Converts the value to a . /// /// /// A with the current value. /// public override string ToString () { return String.Format ("{0}", this); } #endregion #region Public Properties /// /// The numerator of the rational value /// public uint Numerator { get { return numerator; } set { numerator = value; } } /// /// The denominator of the rational value /// /// /// Cannot be 0. /// public uint Denominator { get { return denominator; } set { if (value == 0) throw new ArgumentException ("denominator"); denominator = value; } } #endregion #region Public Static Methods /// /// Cast the value to a . /// /// /// A with the value to cast. /// /// /// A with the double. /// public static implicit operator double (Rational rat) { return (double) rat.Numerator / (double) rat.Denominator; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/Entries/MakernoteIFDEntry.cs0000644000175000017500000002045311470571657026121 0ustar00rubenruben00000000000000// // MakernoteIFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD.Entries { /// /// An enum to represent the manufactor of the makernote /// The information of the makernote types is from: /// http://exiv2.org/makernote.html /// public enum MakernoteType { /// /// The manufactor could not be determined /// Unknown, /// /// Canon makernote. /// Standard IFD without a special prefix. /// Canon, /// /// Panasonic makernote. /// "Panasonic\0\0\0" prefix and IFD starting at offset 12. /// The next-IFD pointer is missing /// Panasonic, /// /// Leica makernote. /// "LEICA\0\0\0" prefix and IFD starting at offset 10. /// Leica, /// /// Pentax makernote. /// "AOC\0" + 2 unknown bytes as prefix. The IFD starts at /// offset 6. /// Pentax, /// /// Nikon makernote (type 1). /// Standard IFD without a special prefix. /// Nikon1, /// /// Nikon makernote (type 2). /// "Nikon\0" + 2 unknown bytes prefix. The IFD starts at /// offset 8. /// Nikon2, /// /// Nikon makernote (type 3). /// "Nikon\0" + 4 bytes with verison code + Tiff header. /// The IFD starts usually at offset 18. The offsets of the IFD /// are relative to start of the Tiff header (byte 10) /// Nikon3, /// /// Olympus makernote (type 1). /// "OLYMP\0" + 2 unknown bytes as prefix. The IFD starts at /// offset 8. /// Olympus1, /// /// Olympus makernote (type 2) /// "OLYMPUS\0II" + 2 unknown bytes as prefix. The IFD starts at /// offset 12. The offsets of the IFD are relative to the /// beginning of the makernote. /// Olympus2, /// /// Sony makernote (type 1). /// "SONY DSC \0\0\0" as prefix. The IFD starts at offset 12. A /// next-IFD pointer is missing. /// Sony } /// /// Contains a Makernote IFD. /// /// /// Makernote IFDs are mostly of the same form. They start with and /// Manufactor specific prefix indicating the type and contain then /// a IFD structure. /// It must be distinguished, where the offsets in the IFD belongs to. /// For some makernotes the offset refers to the beginning of the /// surrounding metadata IFD structure, for others they refer to the /// start of the makernote. /// In addition the endianess of the makernote can be different to the /// endianess of the surrounding metadata. /// This class takes care about all those things. /// public class MakernoteIFDEntry : IFDEntry { #region Private Fields /// /// Stores the prefix of the makernote /// private ByteVector prefix; /// /// Stores the offset of the IFD contained in makernote /// private uint ifd_offset; /// /// Indicates, if the offsets are relative to the current makernote /// or absolut to the base_offset of the surrounding IFD. /// private bool absolute_offset; /// /// Stores, if the makernote is encoded in big- or little endian. /// If the field is , the endianess of the /// surrounding IFD is used. /// private bool? is_bigendian; #endregion #region Properties /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; private set; } /// /// The type of the makernote the current instance represents /// public MakernoteType MakernoteType { get; private set; } /// /// The pure which is stored by the /// makernote. /// public IFDStructure Structure { get; private set; } #endregion #region Constructors /// /// Construcor. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A with the IFD structure, which is stored by this /// instance /// /// /// A with the type of the makernote. /// /// /// A containing the prefix, which should be rendered /// before the real IFD. /// /// /// A with the offset in addition to the relative /// offsets in the IFD /// /// /// A indicating if the offsets of the IFD are relative /// to the , or absolut to the base offset of the /// surrounding IFD. /// /// /// A indicating if the current IFD is encoded in /// big- or little endian. It it is , the endianess of the /// surrounding IFD is used. /// public MakernoteIFDEntry (ushort tag, IFDStructure structure, MakernoteType makernote_type, ByteVector prefix, uint ifd_offset, bool absolute_offset, bool? is_bigendian) { Tag = tag; Structure = structure; MakernoteType = makernote_type; this.prefix = prefix; this.ifd_offset = ifd_offset; this.absolute_offset = absolute_offset; this.is_bigendian = is_bigendian; } /// /// Constructor. Creates a makernote instance just containing an IFD and /// without any special prefix or offset behavior. /// /// /// A with the tag ID of the entry this instance /// represents /// /// /// A with the IFD structure, which is stored by this /// instance /// /// /// A with the type of the makernote. /// public MakernoteIFDEntry (ushort tag, IFDStructure structure, MakernoteType makernote_type) : this (tag, structure, makernote_type, null, 0, true, null) {} #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count) { type = (ushort) IFDEntryType.Undefined; var renderer = new IFDRenderer (this.is_bigendian ?? is_bigendian, Structure, absolute_offset ? offset + ifd_offset : ifd_offset); ByteVector data = renderer.Render (); data.Insert (0, prefix); count = (uint) data.Count; return data; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/IFDEntryType.cs0000644000175000017500000000506411470571657023505 0ustar00rubenruben00000000000000// // IFDEntryType.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD { /// /// A type indicator, which identifies how the corresponding value /// field should be interpreted. /// public enum IFDEntryType : ushort { /// /// Unknown (shouldn't occur) /// Unknown = 0, /// /// 8-bit unsigned integer. /// Byte = 1, /// /// 8-bit byte that contains a 7-bit ASCII code; the last byte /// must be NUL (binary zero). /// Ascii = 2, /// /// 16-bit (2-byte) unsigned integer. /// Short = 3, /// /// 32-bit (4-byte) unsigned integer. /// Long = 4, /// /// Two LONGs: the first represents the numerator of a /// fraction; the second, the denominator. /// Rational = 5, /// /// An 8-bit signed (twos-complement) integer. /// SByte = 6, /// /// An 8-bit byte that may contain anything, depending on /// the definition of the field. /// Undefined = 7, /// /// A 16-bit (2-byte) signed (twos-complement) integer. /// SShort = 8, /// /// A 32-bit (4-byte) signed (twos-complement) integer. /// SLong = 9, /// /// Two SLONG’s: the first represents the numerator of a /// fraction, the second the denominator. /// SRational = 10, /// /// Single precision (4-byte) IEEE format. /// Float = 11, /// /// Double precision (8-byte) IEEE format. /// Double = 12, /// /// IFD /// IFD = 13 } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/IFDStructure.cs0000644000175000017500000003623711470571657023550 0ustar00rubenruben00000000000000// // IFDStructure.cs: A structure resembling the logical structure of a TIFF IFD // file. This is the same structure as used by Exif. // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // Paul Lange (palango@gmx.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using TagLib.IFD.Entries; using TagLib.IFD.Tags; namespace TagLib.IFD { /// /// This class resembles the structure of a TIFF file. It can either be a /// top-level IFD, or a nested IFD (in the case of Exif). /// public class IFDStructure { #region Private Fields private static readonly string DATETIME_FORMAT = "yyyy:MM:dd HH:mm:ss"; /// /// Contains the IFD directories in this tag. /// internal readonly List directories = new List (); #endregion #region Public Properties /// /// Gets the IFD directories contained in the current instance. /// /// /// An array of instances. /// public IFDDirectory [] Directories { get { return directories.ToArray (); } } #endregion #region Public Methods /// /// Checks, if a value for the given tag is contained in the IFD. /// /// /// A value with the directory index that /// contains the tag. /// /// /// A value with the tag. /// /// /// A , which is true, if the tag is already /// contained in the IFD, otherwise false. /// public bool ContainsTag (int directory, ushort tag) { if (directory >= directories.Count) return false; return directories [directory].ContainsKey (tag); } /// /// Removes a given tag from the IFD. /// /// /// A value with the directory index that /// contains the tag to remove. /// /// /// A value with the tag to remove. /// public void RemoveTag (int directory, ushort tag) { if (ContainsTag (directory, tag)) { directories [directory].Remove (tag); } } /// /// Removes a given tag from the IFD. /// /// /// A value with the directory index that /// contains the tag to remove. /// /// /// A value with the tag to remove. /// public void RemoveTag (int directory, IFDEntryTag entry_tag) { RemoveTag (directory, (ushort) entry_tag); } /// /// Adds an to the IFD, if it is not already /// contained in, it fails otherwise. /// /// /// A value with the directory index that /// should contain the tag that will be added. /// /// /// A to add to the IFD. /// public void AddEntry (int directory, IFDEntry entry) { while (directory >= directories.Count) directories.Add (new IFDDirectory ()); directories [directory].Add (entry.Tag, entry); } /// /// Adds an to the IFD. If it is already contained /// in the IFD, it is overwritten. /// /// /// A value with the directory index that /// contains the tag that will be set. /// /// /// A to add to the IFD. /// public void SetEntry (int directory, IFDEntry entry) { if (ContainsTag (directory, entry.Tag)) RemoveTag (directory, entry.Tag); AddEntry (directory, entry); } /// /// Returns the belonging to the given tag. /// /// /// A with the directory that contains /// the wanted tag. /// /// /// A with the tag to get. /// /// /// A belonging to the given tag, or /// null, if no such tag is contained in the IFD. /// public IFDEntry GetEntry (int directory, ushort tag) { if (!ContainsTag (directory, tag)) return null; return directories [directory] [tag]; } /// /// Returns the belonging to the given tag. /// /// /// A with the directory that contains /// the wanted tag. /// /// /// A with the tag to get. /// /// /// A belonging to the given tag, or /// null, if no such tag is contained in the IFD. /// public IFDEntry GetEntry (int directory, IFDEntryTag entry_tag) { return GetEntry (directory, (ushort) entry_tag); } /// /// Returns the stored in the /// entry defined by . /// /// /// A with the number of the directory /// to search for the entry. /// /// /// A with the tag of the entry /// /// /// A with the value stored in the entry /// or if no such entry is contained or it /// does not contain a value. /// public string GetStringValue (int directory, ushort entry_tag) { var entry = GetEntry (directory, entry_tag); if (entry != null && entry is StringIFDEntry) return (entry as StringIFDEntry).Value; return null; } /// /// Returns a containing the /// stored in the entry defined /// by . /// /// /// A with the number of the directory /// to search for the entry. /// /// /// A with the tag of the entry /// /// /// A containing the /// stored in the entry, or /// if no such entry is contained or it /// does not contain a value. /// public byte? GetByteValue (int directory, ushort entry_tag) { var entry = GetEntry (directory, entry_tag); if (entry != null && entry is ByteIFDEntry) return (entry as ByteIFDEntry).Value; return null; } /// /// Returns a containing the /// stored in the entry defined /// by . /// /// /// A with the number of the directory /// to search for the entry. /// /// /// A with the tag of the entry /// /// /// A containing the /// stored in the entry, or /// if no such entry is contained or it /// does not contain a value. /// public uint? GetLongValue (int directory, ushort entry_tag) { var entry = GetEntry (directory, entry_tag); if (entry is LongIFDEntry) return (entry as LongIFDEntry).Value; if (entry is ShortIFDEntry) return (entry as ShortIFDEntry).Value; return null; } /// /// Returns a containing the /// stored in the entry defined /// by . The entry can be of type /// or /// /// /// /// A with the number of the directory /// to search for the entry. /// /// /// A with the tag of the entry /// /// /// A containing the /// stored in the entry, or /// if no such entry is contained. /// public double? GetRationalValue (int directory, ushort entry_tag) { var entry = GetEntry (directory, entry_tag); if (entry is RationalIFDEntry) return (entry as RationalIFDEntry).Value; if (entry is SRationalIFDEntry) return (entry as SRationalIFDEntry).Value; return null; } /// /// Returns a containing the /// stored in the entry defined /// by . The entry must be of type /// and contain an datestring /// according to the Exif specification. /// /// /// A with the number of the directory /// to search for the entry. /// /// /// A with the tag of the entry /// /// /// A containing the /// stored in the entry, or /// if no such entry is contained or it /// does not contain a valid value. /// public DateTime? GetDateTimeValue (int directory, ushort entry_tag) { string date_string = GetStringValue (directory, entry_tag); try { DateTime date_time = DateTime.ParseExact (date_string, DATETIME_FORMAT, System.Globalization.CultureInfo.InvariantCulture); return date_time; } catch {} return null; } /// /// Adds a to the directory with tag /// given by and value given by /// /// /// A with the number of the directory /// to add the entry to. /// /// /// A with the tag of the entry /// /// /// A with the value to add. If it is /// an possibly already contained entry is removed for given tag. /// public void SetStringValue (int directory, ushort entry_tag, string value) { if (value == null) { RemoveTag (directory, entry_tag); return; } SetEntry (directory, new StringIFDEntry (entry_tag, value)); } /// /// Adds a to the directory with tag /// given by and value given by /// /// /// A with the number of the directory /// to add the entry to. /// /// /// A with the tag of the entry /// /// /// A with the value to add. /// public void SetByteValue (int directory, ushort entry_tag, byte value) { SetEntry (directory, new ByteIFDEntry (entry_tag, value)); } /// /// Adds a to the directory with tag /// given by and value given by /// /// /// A with the number of the directory /// to add the entry to. /// /// /// A with the tag of the entry /// /// /// A with the value to add. /// public void SetLongValue (int directory, ushort entry_tag, uint value) { SetEntry (directory, new LongIFDEntry (entry_tag, value)); } /// /// Adds a to the directory with tag /// given by and value given by /// /// /// A with the number of the directory /// to add the entry to. /// /// /// A with the tag of the entry /// /// /// A with the value to add. It must be possible to /// represent the value by a . /// public void SetRationalValue (int directory, ushort entry_tag, double value) { if (value < 0.0d || value > (double)UInt32.MaxValue) throw new ArgumentException ("value"); uint scale = (value >= 1.0d) ? 1 : UInt32.MaxValue; Rational rational = new Rational ((uint) (scale * value), scale); SetEntry (directory, new RationalIFDEntry (entry_tag, rational)); } /// /// Adds a to the directory with tag /// given by and value given by . /// The value is stored as a date string according to the Exif specification. /// /// /// A with the number of the directory /// to add the entry to. /// /// /// A with the tag of the entry /// /// /// A with the value to add. /// public void SetDateTimeValue (int directory, ushort entry_tag, DateTime value) { string date_string = value.ToString (DATETIME_FORMAT); SetStringValue (directory, entry_tag, date_string); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/IFDDirectory.cs0000644000175000017500000000201111470571657023473 0ustar00rubenruben00000000000000// // IFDDirectory.cs: A dictionary grouping IFDEntries. // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2009 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System.Collections.Generic; namespace TagLib.IFD { /// /// Contains the entries in this IFD. /// public class IFDDirectory : Dictionary { } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/IFDEntry.cs0000644000175000017500000000675411470571657022652 0ustar00rubenruben00000000000000// // IFDEntry.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.IFD { /// /// An IFD entry, which is a key/value pair inside an IFD. /// public interface IFDEntry { #region Properties /// /// The ID of the tag, the current instance belongs to /// ushort Tag { get; } #endregion #region Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count); #endregion } /// /// This class abstracts common stuff for array IFD entries /// public abstract class ArrayIFDEntry : IFDEntry { #region Properties /// /// The ID of the tag, the current instance belongs to /// public ushort Tag { get; private set; } /// /// The values stored by the current instance. /// public T [] Values { get; protected set; } #endregion #region Constructors /// /// Constructor. /// /// /// A with the tag ID of the entry this instance /// represents /// public ArrayIFDEntry (ushort tag) { Tag = tag; } #endregion #region Public Methods /// /// Renders the current instance to a /// /// /// A indicating the endianess for rendering. /// /// /// A with the offset, the data is stored. /// /// /// A the ID of the type, which is rendered /// /// /// A with the count of the values which are /// rendered. /// /// /// A with the rendered data. /// public abstract ByteVector Render (bool is_bigendian, uint offset, out ushort type, out uint count); #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/IFD/IFDReader.cs0000644000175000017500000010015011503366551022724 0ustar00rubenruben00000000000000// // IFDReader.cs: Parses TIFF IFDs and populates an IFD structure. // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.IO; using System.Collections.Generic; using TagLib.IFD.Entries; using TagLib.IFD.Makernotes; using TagLib.IFD.Tags; namespace TagLib.IFD { /// /// This class contains all the IFD reading and parsing code. /// public class IFDReader { #region Private Constants private static readonly string PANASONIC_HEADER = "Panasonic\0\0\0"; private static readonly string PENTAX_HEADER = "AOC\0"; private static readonly string NIKON_HEADER = "Nikon\0"; private static readonly string OLYMPUS1_HEADER = "OLYMP\0"; private static readonly string OLYMPUS2_HEADER = "OLYMPUS\0"; private static readonly string SONY_HEADER = "SONY DSC \0\0\0"; private static readonly string LEICA_HEADER = "LEICA\0\0\0"; #endregion #region Protected Fields /// /// The where this IFD is found in. /// protected readonly File file; /// /// If IFD is encoded in BigEndian or not /// protected readonly bool is_bigendian; /// /// The IFD structure that will be populated /// protected readonly IFDStructure structure; /// /// A value describing the base were the IFD offsets /// refer to. E.g. in Jpegs the IFD are located in an Segment and the offsets /// inside the IFD refer from the beginning of this segment. So base_offset must /// contain the beginning of the segment. /// protected readonly long base_offset; /// /// A value with the beginning of the IFD relative to /// base_offset. /// protected readonly uint ifd_offset; /// /// A with the maximal offset, which should occur in the /// IFD. Greater offsets, would reference beyond the considered data. /// protected readonly uint max_offset; /// /// Whether or not the makernote should be parsed. /// protected bool parse_makernote = true; #endregion /// /// Whether or not the makernote should be parsed. /// internal bool ShouldParseMakernote { get { return parse_makernote; } set { parse_makernote = value; } } #region Constructors /// /// Constructor. Reads an IFD from given file, using the given endianness. /// /// /// A to read from. /// /// /// A , it must be true, if the data of the IFD should be /// read as bigendian, otherwise false. /// /// /// A that will be populated. /// /// /// A value describing the base were the IFD offsets /// refer to. E.g. in Jpegs the IFD are located in an Segment and the offsets /// inside the IFD refer from the beginning of this segment. So must contain the beginning of the segment. /// /// /// A value with the beginning of the IFD relative to /// . /// /// /// A value with maximal possible offset. This is to limit /// the size of the possible data; /// public IFDReader (File file, bool is_bigendian, IFDStructure structure, long base_offset, uint ifd_offset, uint max_offset) { this.file = file; this.is_bigendian = is_bigendian; this.structure = structure; this.base_offset = base_offset; this.ifd_offset = ifd_offset; this.max_offset = max_offset; } #endregion #region Public Methods /// /// Read all IFD segments from the file. /// public void Read () { Read (-1); } /// /// Read IFD segments from the file. /// /// /// The number of IFDs that may be read can be restricted using the count /// parameter. This might be needed for fiels that have invalid next-ifd /// pointers (such as some IFDs in the Nikon Makernote). This condition is /// tested in the Nikon2 unit test, which contains such a file. /// /// /// A with the maximal number of IFDs to read. /// Passing -1 means unlimited. /// public void Read (int count) { if (count == 0) return; uint next_offset = ifd_offset; int i = 0; lock (file) { StartIFDLoopDetect (); do { if (DetectIFDLoop (base_offset + next_offset)) { file.MarkAsCorrupt ("IFD loop detected"); break; } next_offset = ReadIFD (base_offset, next_offset, max_offset); } while (next_offset > 0 && (count == -1 || ++i < count)); StopIFDLoopDetect (); } } #endregion #region Private Methods /// /// Add to the reference count for the IFD loop detection. /// private void StartIFDLoopDetect () { if (!ifd_offsets.ContainsKey (file)) { ifd_offsets[file] = new List (); ifd_loopdetect_refs[file] = 1; } else { ifd_loopdetect_refs[file]++; } } /// /// Attempts to detect whether or not this file has an endless IFD loop. /// /// /// A with the offset at which the next IFD /// can be found. /// /// /// True if we have gone into a loop, false otherwise. /// private bool DetectIFDLoop (long offset) { if (offset == 0) return false; if (ifd_offsets[file].Contains (offset)) return true; ifd_offsets[file].Add (offset); return false; } /// /// End the IFD loop detection, cleanup if we're the last. /// private void StopIFDLoopDetect () { ifd_loopdetect_refs[file]--; if (ifd_loopdetect_refs[file] == 0) { ifd_offsets.Remove (file); ifd_loopdetect_refs.Remove (file); } } private static Dictionary> ifd_offsets = new Dictionary> (); private static Dictionary ifd_loopdetect_refs = new Dictionary (); /// /// Reads an IFD from file at position relative /// to . /// /// /// A with the base offset which every offset /// in IFD is relative to. /// /// /// A with the offset of the IFD relative to /// /// /// /// A with the maximal offset to consider for /// the IFD. /// /// /// A with the offset of the next IFD, the /// offset is also relative to /// private uint ReadIFD (long base_offset, uint offset, uint max_offset) { long length = 0; try { length = file.Length; } catch (Exception) { // Use a safety-value of 4 gigabyte. length = 1073741824L * 4; } if (base_offset + offset > length) { file.MarkAsCorrupt ("Invalid IFD offset"); return 0; } var directory = new IFDDirectory (); file.Seek (base_offset + offset, SeekOrigin.Begin); ushort entry_count = ReadUShort (); if (file.Tell + 12 * entry_count > base_offset + max_offset) { file.MarkAsCorrupt ("Size of entries exceeds possible data size"); return 0; } ByteVector entry_datas = file.ReadBlock (12 * entry_count); uint next_offset = ReadUInt (); for (int i = 0; i < entry_count; i++) { ByteVector entry_data = entry_datas.Mid (i * 12, 12); ushort entry_tag = entry_data.Mid (0, 2).ToUShort (is_bigendian); ushort type = entry_data.Mid (2, 2).ToUShort (is_bigendian); uint value_count = entry_data.Mid (4, 4).ToUInt (is_bigendian); ByteVector offset_data = entry_data.Mid (8, 4); // Even if the value count represents a single bytes it's impossible // for the count plus the base offset to be bigger than the entire file, // ignore this entry and keep going if (value_count + base_offset > max_offset) { file.MarkAsCorrupt("Value count + base offset is greater than the maximum possible offset"); continue; } IFDEntry entry = CreateIFDEntry (entry_tag, type, value_count, base_offset, offset_data, max_offset); if (entry == null) continue; if (directory.ContainsKey (entry.Tag)) directory.Remove (entry.Tag); directory.Add (entry.Tag, entry); } FixupDirectory (base_offset, directory); structure.directories.Add (directory); return next_offset; } /// /// Creates an IFDEntry from the given values. This method is used for /// every entry. Custom parsing can be hooked in by overriding the /// method. /// /// /// A with the tag of the entry. /// /// /// A with the type of the entry. /// /// /// A with the data count of the entry. /// /// /// A with the base offset which every /// offsets in the IFD are relative to. /// /// /// A containing exactly 4 byte with the data /// of the offset of the entry. Since this field isn't interpreted as /// an offset if the data can be directly stored in the 4 byte, we /// pass the to easier interpret it. /// /// /// A with the maximal offset to consider for /// the IFD. /// /// /// A with the given parameter. /// private IFDEntry CreateIFDEntry (ushort tag, ushort type, uint count, long base_offset, ByteVector offset_data, uint max_offset) { uint offset = offset_data.ToUInt (is_bigendian); // Fix the type for the IPTC tag. // From http://www.awaresystems.be/imaging/tiff/tifftags/iptc.html // "Often times, the datatype is incorrectly specified as LONG. " if (tag == (ushort) IFDEntryTag.IPTC && type == (ushort) IFDEntryType.Long) { type = (ushort) IFDEntryType.Byte; } var ifd_entry = ParseIFDEntry (tag, type, count, base_offset, offset); if (ifd_entry != null) return ifd_entry; if (count > 0x10000000) { // Some Nikon files are known to exhibit this corruption (or "feature"). file.MarkAsCorrupt ("Impossibly large item count"); return null; } // then handle the values stored in the offset data itself if (count == 1) { if (type == (ushort) IFDEntryType.Byte) return new ByteIFDEntry (tag, offset_data[0]); if (type == (ushort) IFDEntryType.SByte) return new SByteIFDEntry (tag, (sbyte)offset_data[0]); if (type == (ushort) IFDEntryType.Short) return new ShortIFDEntry (tag, offset_data.Mid (0, 2).ToUShort (is_bigendian)); if (type == (ushort) IFDEntryType.SShort) return new SShortIFDEntry (tag, (short) offset_data.Mid (0, 2).ToUShort (is_bigendian)); if (type == (ushort) IFDEntryType.Long) return new LongIFDEntry (tag, offset_data.ToUInt (is_bigendian)); if (type == (ushort) IFDEntryType.SLong) return new SLongIFDEntry (tag, offset_data.ToInt (is_bigendian)); } if (count == 2) { if (type == (ushort) IFDEntryType.Short) { ushort [] data = new ushort [] { offset_data.Mid (0, 2).ToUShort (is_bigendian), offset_data.Mid (2, 2).ToUShort (is_bigendian) }; return new ShortArrayIFDEntry (tag, data); } if (type == (ushort) IFDEntryType.SShort) { short [] data = new short [] { (short) offset_data.Mid (0, 2).ToUShort (is_bigendian), (short) offset_data.Mid (2, 2).ToUShort (is_bigendian) }; return new SShortArrayIFDEntry (tag, data); } } if (count <= 4) { if (type == (ushort) IFDEntryType.Undefined) return new UndefinedIFDEntry (tag, offset_data.Mid (0, (int)count)); if (type == (ushort) IFDEntryType.Ascii) { string data = offset_data.Mid (0, (int)count).ToString (); int term = data.IndexOf ('\0'); if (term > -1) data = data.Substring (0, term); return new StringIFDEntry (tag, data); } if (type == (ushort) IFDEntryType.Byte) return new ByteVectorIFDEntry (tag, offset_data.Mid (0, (int)count)); } // FIXME: create correct type. if (offset > max_offset) return new UndefinedIFDEntry (tag, new ByteVector ()); // then handle data referenced by the offset file.Seek (base_offset + offset, SeekOrigin.Begin); if (count == 1) { if (type == (ushort) IFDEntryType.Rational) return new RationalIFDEntry (tag, ReadRational ()); if (type == (ushort) IFDEntryType.SRational) return new SRationalIFDEntry (tag, ReadSRational ()); } if (count > 1) { if (type == (ushort) IFDEntryType.Long) { uint [] data = ReadUIntArray (count); return new LongArrayIFDEntry (tag, data); } if (type == (ushort) IFDEntryType.SLong) { int [] data = ReadIntArray (count); return new SLongArrayIFDEntry (tag, data); } if (type == (ushort) IFDEntryType.Rational) { Rational[] entries = new Rational [count]; for (int i = 0; i < count; i++) entries[i] = ReadRational (); return new RationalArrayIFDEntry (tag, entries); } if (type == (ushort) IFDEntryType.SRational) { SRational[] entries = new SRational [count]; for (int i = 0; i < count; i++) entries[i] = ReadSRational (); return new SRationalArrayIFDEntry (tag, entries); } } if (count > 2) { if (type == (ushort) IFDEntryType.Short) { ushort [] data = ReadUShortArray (count); return new ShortArrayIFDEntry (tag, data); } if (type == (ushort) IFDEntryType.SShort) { short [] data = ReadShortArray (count); return new SShortArrayIFDEntry (tag, data); } } if (count > 4) { if (type == (ushort) IFDEntryType.Long) { uint [] data = ReadUIntArray (count); return new LongArrayIFDEntry (tag, data); } if (type == (ushort) IFDEntryType.Byte) { ByteVector data = file.ReadBlock ((int) count); return new ByteVectorIFDEntry (tag, data); } if (type == (ushort) IFDEntryType.Ascii) { string data = ReadAsciiString ((int) count); return new StringIFDEntry (tag, data); } if (tag == (ushort) ExifEntryTag.UserComment) { ByteVector data = file.ReadBlock ((int) count); return new UserCommentIFDEntry (tag, data, file); } if (type == (ushort) IFDEntryType.Undefined) { ByteVector data = file.ReadBlock ((int) count); return new UndefinedIFDEntry (tag, data); } } if (type == (ushort) IFDEntryType.Float) return null; if (type == 0 || type > 12) { // Invalid type file.MarkAsCorrupt ("Invalid item type"); return null; } // TODO: We should ignore unreadable values, erroring for now until we have sufficient coverage. throw new NotImplementedException (String.Format ("Unknown type/count {0}/{1} ({2})", type, count, offset)); } /// /// Reads a 2-byte signed short from the current file. /// /// /// A value containing the short read /// from the current instance. /// private short ReadShort () { return (short) file.ReadBlock (2).ToUShort (is_bigendian); } /// /// Reads a 2-byte unsigned short from the current file. /// /// /// A value containing the short read /// from the current instance. /// private ushort ReadUShort () { return file.ReadBlock (2).ToUShort (is_bigendian); } /// /// Reads a 4-byte int from the current file. /// /// /// A value containing the int read /// from the current instance. /// private int ReadInt () { return file.ReadBlock (4).ToInt (is_bigendian); } /// /// Reads a 4-byte unsigned int from the current file. /// /// /// A value containing the int read /// from the current instance. /// private uint ReadUInt () { return file.ReadBlock (4).ToUInt (is_bigendian); } /// /// Reads a by two following unsigned /// int from the current file. /// /// /// A value created by the read values. /// private Rational ReadRational () { uint numerator = ReadUInt (); uint denominator = ReadUInt (); // correct illegal value if (denominator == 0) { numerator = 0; denominator = 1; } return new Rational (numerator, denominator); } /// /// Reads a by two following unsigned /// int from the current file. /// /// /// A value created by the read values. /// private SRational ReadSRational () { int numerator = ReadInt (); int denominator = ReadInt (); // correct illegal value if (denominator == 0) { numerator = 0; denominator = 1; } return new SRational (numerator, denominator); } /// /// Reads an array of 2-byte shorts from the current file. /// /// /// An array of values containing the /// shorts read from the current instance. /// private ushort [] ReadUShortArray (uint count) { ushort [] data = new ushort [count]; for (int i = 0; i < count; i++) data [i] = ReadUShort (); return data; } /// /// Reads an array of 2-byte signed shorts from the current file. /// /// /// An array of values containing the /// shorts read from the current instance. /// private short [] ReadShortArray (uint count) { short [] data = new short [count]; for (int i = 0; i < count; i++) data [i] = ReadShort (); return data; } /// /// Reads an array of 4-byte int from the current file. /// /// /// An array of values containing the /// shorts read from the current instance. /// private int [] ReadIntArray (uint count) { int [] data = new int [count]; for (int i = 0; i < count; i++) data [i] = ReadInt (); return data; } /// /// Reads an array of 4-byte unsigned int from the current file. /// /// /// An array of values containing the /// shorts read from the current instance. /// private uint [] ReadUIntArray (uint count) { uint [] data = new uint [count]; for (int i = 0; i < count; i++) data [i] = ReadUInt (); return data; } /// /// Reads an ASCII string from the current file. /// /// /// A read from the current instance. /// /// /// The exif standard allows to store multiple string separated /// by '\0' in one ASCII-field. On the other hand some programs /// (e.g. CanonZoomBrowser) fill some ASCII fields by trailing /// '\0's. /// We follow the Adobe practice as described in XMP Specification /// Part 3 (Storeage in Files), and process the ASCII string only /// to the first '\0'. /// private string ReadAsciiString (int count) { string str = file.ReadBlock (count).ToString (); int term = str.IndexOf ('\0'); if (term > -1) str = str.Substring (0, term); return str; } /// /// Performs some fixups to a read . For some /// special cases multiple instances contained /// in the directory are needed. Therfore, we do the fixups after reading the /// whole directory to be sure, all entries are present. /// /// /// A value with the base offset, all offsets in the /// directory refers to. /// /// /// A instance which was read and needs fixes. /// private void FixupDirectory (long base_offset, IFDDirectory directory) { // The following two entries refer to thumbnail data, where one is the offset // to the data and the other is the length. Unnaturally both are used to describe // the data. So it is needed to keep both entries in sync and keep the thumbnail data // for writing it back. // We determine the position of the data, read it and store it in an ThumbnailDataIFDEntry // which replaces the offset-entry to thumbnail data. ushort offset_tag = (ushort) IFDEntryTag.JPEGInterchangeFormat; ushort length_tag = (ushort) IFDEntryTag.JPEGInterchangeFormatLength; if (directory.ContainsKey (offset_tag) && directory.ContainsKey (length_tag)) { var offset_entry = directory [offset_tag] as LongIFDEntry; var length_entry = directory [length_tag] as LongIFDEntry; if (offset_entry != null && length_entry != null) { uint offset = offset_entry.Value; uint length = length_entry.Value; file.Seek (base_offset + offset, SeekOrigin.Begin); ByteVector data = file.ReadBlock ((int) length); directory.Remove (offset_tag); directory.Add (offset_tag, new ThumbnailDataIFDEntry (offset_tag, data)); } } // create a StripOffsetIFDEntry if necessary ushort strip_offsets_tag = (ushort) IFDEntryTag.StripOffsets; ushort strip_byte_counts_tag = (ushort) IFDEntryTag.StripByteCounts; if (directory.ContainsKey (strip_offsets_tag) && directory.ContainsKey (strip_byte_counts_tag)) { uint [] strip_offsets = null; uint [] strip_byte_counts = null; var strip_offsets_entry = directory [strip_offsets_tag]; var strip_byte_counts_entry = directory [strip_byte_counts_tag]; if (strip_offsets_entry is LongIFDEntry) strip_offsets = new uint[] {(strip_offsets_entry as LongIFDEntry).Value}; else if (strip_offsets_entry is LongArrayIFDEntry) strip_offsets = (strip_offsets_entry as LongArrayIFDEntry).Values; if (strip_offsets == null) return; if (strip_byte_counts_entry is LongIFDEntry) strip_byte_counts = new uint[] {(strip_byte_counts_entry as LongIFDEntry).Value}; else if (strip_byte_counts_entry is LongArrayIFDEntry) strip_byte_counts = (strip_byte_counts_entry as LongArrayIFDEntry).Values; if (strip_byte_counts == null) return; directory.Remove (strip_offsets_tag); directory.Add (strip_offsets_tag, new StripOffsetsIFDEntry (strip_offsets_tag, strip_offsets, strip_byte_counts, file)); } } private IFDEntry ParseMakernote (ushort tag, ushort type, uint count, long base_offset, uint offset) { long makernote_offset = base_offset + offset; IFDStructure ifd_structure = new IFDStructure (); // This is the minimum size a makernote should have // The shortest header is PENTAX_HEADER (4) // + IFD entry count (2) // + at least one IFD etry (12) // + next IFD pointer (4) // = 22 .... // we use this number to read a header which is big used // to identify the makernote types int header_size = 18; long length = 0; try { length = file.Length; } catch (Exception) { // Use a safety-value of 4 gigabyte. length = 1073741824L * 4; } if (makernote_offset > length) throw new Exception ("offset to makernote is beyond file size"); if (makernote_offset + header_size > length) throw new Exception ("data is to short to contain a maker note ifd"); // read header file.Seek (makernote_offset, SeekOrigin.Begin); ByteVector header = file.ReadBlock (header_size); if (header.StartsWith (PANASONIC_HEADER)) { IFDReader reader = new IFDReader (file, is_bigendian, ifd_structure, base_offset, offset + 12, max_offset); reader.ReadIFD (base_offset, offset + 12, max_offset); return new MakernoteIFDEntry (tag, ifd_structure, MakernoteType.Panasonic, PANASONIC_HEADER, 12, true, null); } if (header.StartsWith (PENTAX_HEADER)) { IFDReader reader = new IFDReader (file, is_bigendian, ifd_structure, base_offset, offset + 6, max_offset); reader.ReadIFD (base_offset, offset + 6, max_offset); return new MakernoteIFDEntry (tag, ifd_structure, MakernoteType.Pentax, header.Mid (0, 6), 6, true, null); } if (header.StartsWith (OLYMPUS1_HEADER)) { IFDReader reader = new IFDReader (file, is_bigendian, ifd_structure, base_offset, offset + 8, max_offset); reader.Read (); return new MakernoteIFDEntry (tag, ifd_structure, MakernoteType.Olympus1, header.Mid (0, 8), 8, true, null); } if (header.StartsWith (OLYMPUS2_HEADER)) { IFDReader reader = new IFDReader (file, is_bigendian, ifd_structure, makernote_offset, 12, count); reader.Read (); return new MakernoteIFDEntry (tag, ifd_structure, MakernoteType.Olympus2, header.Mid (0, 12), 12, false, null); } if (header.StartsWith (SONY_HEADER)) { IFDReader reader = new IFDReader (file, is_bigendian, ifd_structure, base_offset, offset + 12, max_offset); reader.ReadIFD (base_offset, offset + 12, max_offset); return new MakernoteIFDEntry (tag, ifd_structure, MakernoteType.Sony, SONY_HEADER, 12, true, null); } if (header.StartsWith (NIKON_HEADER)) { ByteVector endian_bytes = header.Mid (10, 2); if (endian_bytes.ToString () == "II" || endian_bytes.ToString () == "MM") { bool makernote_endian = endian_bytes.ToString ().Equals ("MM"); ushort magic = header.Mid (12, 2).ToUShort (is_bigendian); if (magic == 42) { // TODO: the max_offset value is not correct here. However, some nikon files have offsets to a sub-ifd // (preview image) which are not stored with the other makernote data. Therfore, we keep the max_offset // for now. (It is just an upper bound for some checks. So if it is too big, it doesn't matter) var reader = new Nikon3MakernoteReader (file, makernote_endian, ifd_structure, makernote_offset + 10, 8, max_offset - offset - 10); reader.Read (); return new MakernoteIFDEntry (tag, ifd_structure, MakernoteType.Nikon3, header.Mid (0, 18), 8, false, makernote_endian); } } } if (header.StartsWith (LEICA_HEADER)) { IFDReader reader = new IFDReader (file, is_bigendian, ifd_structure, makernote_offset, 8, count); reader.Read (); return new MakernoteIFDEntry (tag, ifd_structure, MakernoteType.Leica, header.Mid (0, 8), 10, false, null); } try { IFDReader reader = new IFDReader (file, is_bigendian, ifd_structure, base_offset, offset, max_offset); reader.Read (); return new MakernoteIFDEntry (tag, ifd_structure, MakernoteType.Canon); } catch { return null; } } #endregion #region Protected Methods /// /// Try to parse the given IFD entry, used to discover format-specific entries. /// /// /// A with the tag of the entry. /// /// /// A with the type of the entry. /// /// /// A with the data count of the entry. /// /// /// A with the base offset which every offsets in the /// IFD are relative to. /// /// /// A with the offset of the entry. /// /// /// A with the given parameters, or null if none was parsed, after /// which the normal TIFF parsing is used. /// protected virtual IFDEntry ParseIFDEntry (ushort tag, ushort type, uint count, long base_offset, uint offset) { if (tag == (ushort) ExifEntryTag.MakerNote && parse_makernote) return ParseMakernote (tag, type, count, base_offset, offset); if (tag == (ushort) IFDEntryTag.SubIFDs) { var entries = new List (); uint [] data; if (count >= 2) { // This is impossible right? if (base_offset + offset > file.Length) { file.MarkAsCorrupt ("Length of SubIFD is too long"); return null; } file.Seek (base_offset + offset, SeekOrigin.Begin); data = ReadUIntArray (count); } else { data = new uint [] { offset }; } foreach (var sub_offset in data) { var sub_structure = new IFDStructure (); var sub_reader = CreateSubIFDReader (file, is_bigendian, sub_structure, base_offset, sub_offset, max_offset); sub_reader.Read (); entries.Add (sub_structure); } return new SubIFDArrayEntry (tag, entries); } IFDStructure ifd_structure = new IFDStructure (); IFDReader reader = CreateSubIFDReader (file, is_bigendian, ifd_structure, base_offset, offset, max_offset); // Sub IFDs are either identified by the IFD-type ... if (type == (ushort) IFDEntryType.IFD) { reader.Read (); return new SubIFDEntry (tag, type, (uint) ifd_structure.Directories.Length, ifd_structure); } // ... or by one of the following tags switch (tag) { case (ushort) IFDEntryTag.ExifIFD: case (ushort) IFDEntryTag.InteroperabilityIFD: case (ushort) IFDEntryTag.GPSIFD: reader.Read (); return new SubIFDEntry (tag, (ushort) IFDEntryType.Long, 1, ifd_structure); default: return null; } } /// /// Create a reader for Sub IFD entries. /// /// /// A to read from. /// /// /// A , it must be true, if the data of the IFD should be /// read as bigendian, otherwise false. /// /// /// A that will be populated. /// /// /// A with the base offset which every offsets in the /// IFD are relative to. /// /// /// A with the offset of the entry. /// /// /// A with the maximal offset to consider for /// the IFD. /// /// /// A which can be used to read the specified sub IFD. /// protected virtual IFDReader CreateSubIFDReader (File file, bool is_bigendian, IFDStructure structure, long base_offset, uint offset, uint max_offset) { return new IFDReader (file, is_bigendian, structure, base_offset, offset, max_offset); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Jpeg/0000777000175000017500000000000011503407417021137 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Jpeg/JpegCommentTag.cs0000644000175000017500000000440011470571657024337 0ustar00rubenruben00000000000000// // JpegCommentTag.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // // Copyright (C) 2009 Ruben Vermeersch // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using TagLib.Image; namespace TagLib.Jpeg { /// /// Contains the JPEG comment. /// public class JpegCommentTag : ImageTag { #region Constructors /// /// Constructor. /// /// /// The value of the comment. /// public JpegCommentTag (string value) { Value = value; } /// /// Constructor. Creates a new empty comment. /// public JpegCommentTag () { Value = null; } #endregion #region Public Properties /// /// The value of the comment represented by the current instance. /// public string Value { get; set; } /// /// Gets or sets the comment for the image described /// by the current instance. /// /// /// A containing the comment of the /// current instace. /// public override string Comment { get { return Value; } set { Value = value; } } #endregion #region Public Methods /// /// Gets the tag types contained in the current instance. /// /// /// Always . /// public override TagTypes TagTypes { get { return TagTypes.JpegComment; } } /// /// Clears the values stored in the current instance. /// public override void Clear () { Value = null; } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Jpeg/Codec.cs0000644000175000017500000000356611470571657022524 0ustar00rubenruben00000000000000// // Codec.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Jpeg { /// /// A Jpeg photo codec. Contains basic photo details. /// public class Codec : Image.Codec { /// /// Gets a text description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// public override string Description { get { return "JFIF File"; } } /// /// Constructs a new with the given width /// and height. /// /// /// The width of the photo. /// /// /// The height of the photo. /// /// /// The quality of the photo. /// /// /// A new instance. /// public Codec (int width, int height, int quality) : base (width, height, quality) {} } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Jpeg/File.cs0000644000175000017500000005134111470571657022360 0ustar00rubenruben00000000000000// // File.cs: Provides tagging for Jpeg files // // Author: // Ruben Vermeersch (ruben@savanne.be) // Mike Gemuende (mike@gemuende.de) // Stephane Delcroix (stephane@delcroix.org) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (C) 2009 Mike Gemuende // Copyright (c) 2009 Stephane Delcroix // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections.Generic; using System.IO; using TagLib.Image; using TagLib.IFD; using TagLib.IFD.Entries; using TagLib.Xmp; namespace TagLib.Jpeg { /// /// This class extends to provide tagging /// and properties support for Jpeg files. /// [SupportedMimeType("taglib/jpg", "jpg")] [SupportedMimeType("taglib/jpeg", "jpeg")] [SupportedMimeType("taglib/jpe", "jpe")] [SupportedMimeType("taglib/jif", "jif")] [SupportedMimeType("taglib/jfif", "jfif")] [SupportedMimeType("taglib/jfi", "jfi")] [SupportedMimeType("image/jpeg")] public class File : TagLib.Image.ImageBlockFile { /// /// The magic bits used to recognize an Exif segment /// private static readonly string EXIF_IDENTIFIER = "Exif\0\0"; /// /// Standard (empty) JFIF header to add, if no one is contained /// private static readonly byte [] BASIC_JFIF_HEADER = new byte [] { // segment maker 0xFF, (byte) Marker.APP0, // segment size 0x00, 0x10, // segment data 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00 }; #region Private Fields /// /// Contains the media properties. /// private Properties properties; /// /// For now, we do not allow to change the jfif header. As long as this is /// the case, the header is kept as it is. /// private ByteVector jfif_header = null; /// /// The image width, as parsed from the Frame /// ushort width; /// /// The image height, as parsed from the Frame /// ushort height; /// /// Quality of the image, stored as we parse the file /// int quality; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : this (new File.LocalFileAbstraction (path), propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : this (path, ReadStyle.Average) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction) { Read (propertiesStyle); } /// /// Constructs and initializes a new instance of for a specified file abstraction. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// protected File (IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) { } #endregion #region Public Properties /// /// Gets the media properties of the file represented by the /// current instance. /// /// /// A object containing the /// media properties of the file represented by the current /// instance. /// public override TagLib.Properties Properties { get { return properties; } } #endregion #region Public Methods /// /// Saves the changes made in the current instance to the /// file it represents. /// public override void Save () { if (!Writeable || PossiblyCorrupt) throw new InvalidOperationException ("File not writeable. Corrupt metadata?"); Mode = AccessMode.Write; try { WriteMetadata (); TagTypesOnDisk = TagTypes; } finally { Mode = AccessMode.Closed; } } #endregion #region Private Methods /// /// Reads the information from file with a specified read style. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// private void Read (ReadStyle propertiesStyle) { Mode = AccessMode.Read; try { ImageTag = new CombinedImageTag (TagTypes.XMP | TagTypes.TiffIFD | TagTypes.JpegComment); ValidateHeader (); ReadMetadata (); TagTypesOnDisk = TagTypes; if (propertiesStyle != ReadStyle.None) properties = ExtractProperties (); } finally { Mode = AccessMode.Closed; } } /// /// Attempts to extract the media properties of the main /// photo. /// /// /// A object with a best effort guess /// at the right values. When no guess at all can be made, /// is returned. /// private Properties ExtractProperties () { if (width > 0 && height > 0) return new Properties (TimeSpan.Zero, new Codec (width, height, quality)); return null; } /// /// Validates if the opened file is actually a JPEG. /// private void ValidateHeader () { ByteVector segment = ReadBlock (2); if (segment.ToUShort () != 0xFFD8) throw new CorruptFileException ("Expected SOI marker at the start of the file."); } /// /// Reads a segment marker for a segment starting at current position. /// The second byte of the marker is returned, since the first is equal /// to 0xFF in every case. /// /// /// A with the second byte of the segment marker. /// private Marker ReadSegmentMarker () { ByteVector segment_header = ReadBlock (2); if (segment_header.Count != 2) throw new CorruptFileException ("Could not read enough bytes for segment maker"); if (segment_header[0] != 0xFF) throw new CorruptFileException ("Start of Segment expected at " + (Tell - 2)); return (Marker)segment_header[1]; } /// /// Reads the size of a segment at the current position. /// /// /// A with the size of the current segment. /// private ushort ReadSegmentSize () { long position = Tell; ByteVector segment_size_bytes = ReadBlock (2); if (segment_size_bytes.Count != 2) throw new CorruptFileException ("Could not read enough bytes to determine segment size"); ushort segment_size = segment_size_bytes.ToUShort (); // the size itself must be contained in the segment size // so the smallest (theoretically) possible number of bytes if 2 if (segment_size < 2) throw new CorruptFileException (String.Format ("Invalid segment size ({0} bytes)", segment_size)); long length = 0; try { length = Length; } catch (Exception) { // Probably not supported by stream. } if (length > 0 && position + segment_size >= length) throw new CorruptFileException ("Segment size exceeds file size"); return segment_size; } /// /// Extracts the metadata from the current file by reading every segment in file. /// Method should be called with read position at first segment marker. /// private void ReadMetadata () { // loop while marker is not EOI and not the data segment while (true) { Marker marker = ReadSegmentMarker (); // we stop parsing when the end of file (EOI) or the begin of the // data segment is reached (SOS) // the second case is a trade-off between tolerant and fast parsing if (marker == Marker.EOI || marker == Marker.SOS) break; long position = Tell; ushort segment_size = ReadSegmentSize (); // segment size contains 2 bytes of the size itself, so the // pure data size is this (and the cast is save) ushort data_size = (ushort) (segment_size - 2); switch (marker) { case Marker.APP0: // possibly JFIF header ReadJFIFHeader (data_size); break; case Marker.APP1: // possibly Exif or Xmp data found ReadAPP1Segment (data_size); break; case Marker.COM: // Comment segment found ReadCOMSegment (data_size); break; case Marker.SOF0: case Marker.SOF1: case Marker.SOF2: case Marker.SOF3: case Marker.SOF9: case Marker.SOF10: case Marker.SOF11: ReadSOFSegment (data_size, marker); break; case Marker.DQT: // Quantization table(s), use it to guess quality ReadDQTSegment (data_size); break; } // set position to next segment and start with next segment marker Seek (position + segment_size, SeekOrigin.Begin); } } /// /// Reads a JFIF header at current position /// private void ReadJFIFHeader (ushort length) { // JFIF header should be contained as first segment // SOI marker + APP0 Marker + segment size = 6 bytes if (Tell != 6) return; if (ReadBlock (5).ToString ().Equals ("JFIF\0")) { // store the JFIF header as it is Seek (2, SeekOrigin.Begin); jfif_header = ReadBlock (length + 2 + 2); AddMetadataBlock (2, length + 2 + 2); } } /// /// Reads an APP1 segment to find EXIF or XMP metadata. /// /// /// The length of the segment that will be read. /// private void ReadAPP1Segment (ushort length) { long position = Tell; ByteVector data = null; // for an Exif segment, the data block consists of 14 bytes of: // * 6 bytes Exif identifier string // * 2 bytes bigendian indication MM (or II) // * 2 bytes Tiff magic number (42) // * 4 bytes offset of the first IFD in this segment // // the last two points are alreay encoded according to // big- or littleendian int exif_header_length = 14; // could be an Exif segment if ((ImageTag.TagTypes & TagLib.TagTypes.TiffIFD) == 0x00 && length >= exif_header_length) { data = ReadBlock (exif_header_length); if (data.Count == exif_header_length && data.Mid (0, 6).ToString ().Equals (EXIF_IDENTIFIER)) { bool is_bigendian = data.Mid (6, 2).ToString ().Equals ("MM"); ushort magic = data.Mid (8, 2).ToUShort (is_bigendian); if (magic != 42) throw new Exception (String.Format ("Invalid TIFF magic: {0}", magic)); uint ifd_offset = data.Mid (10, 4).ToUInt (is_bigendian); var exif = new IFDTag (); var reader = new IFDReader (this, is_bigendian, exif.Structure, position + 6, ifd_offset, (uint) (length - 6)); reader.Read (); ImageTag.AddTag (exif); AddMetadataBlock (position - 4, length + 4); return; } } int xmp_header_length = XmpTag.XAP_NS.Length + 1; // could be an Xmp segment if ((ImageTag.TagTypes & TagLib.TagTypes.XMP) == 0x00 && length >= xmp_header_length) { // if already data is read for determining the Exif segment, // just read the remaining bytes. // NOTE: that (exif_header_length < xmp_header_length) holds if (data == null) data = ReadBlock (xmp_header_length); else data.Add (ReadBlock (xmp_header_length - exif_header_length)); if (data.ToString ().Equals (XmpTag.XAP_NS + "\0")) { ByteVector xmp_data = ReadBlock (length - xmp_header_length); ImageTag.AddTag (new XmpTag (xmp_data.ToString (), this)); AddMetadataBlock (position - 4, length + 4); } } } /// /// Writes the metadata back to file. All metadata is stored in the first segments /// of the file. /// private void WriteMetadata () { // first render all metadata segments to a ByteVector before the // file is touched ... ByteVector data = new ByteVector (); // existing jfif header is retained, otherwise a standard one // is created if (jfif_header != null) data.Add (jfif_header); else data.Add (BASIC_JFIF_HEADER); data.Add (RenderExifSegment ()); data.Add (RenderXMPSegment ()); data.Add (RenderCOMSegment ()); SaveMetadata (data, 2); } /// /// Creates a for the Exif segment of this file /// /// /// A with the whole Exif segment, if exif tags /// exists, otherwise null. /// private ByteVector RenderExifSegment () { // Check, if IFD0 is contained IFDTag exif = ImageTag.Exif; if (exif == null) return null; // first IFD starts at 8 uint first_ifd_offset = 8; // Render IFD0 // FIXME: store endianess and use it here var renderer = new IFDRenderer (true, exif.Structure, first_ifd_offset); ByteVector exif_data = renderer.Render (); uint segment_size = (uint) (first_ifd_offset + exif_data.Count + 2 + 6); // do not render data segments, which cannot fit into the possible segment size if (segment_size > ushort.MaxValue) throw new Exception ("Exif Segment is too big to render"); // Create whole segment ByteVector data = new ByteVector (new byte [] { 0xFF, (byte) Marker.APP1 }); data.Add (ByteVector.FromUShort ((ushort) segment_size)); data.Add ("Exif\0\0"); data.Add (ByteVector.FromString ("MM", StringType.Latin1)); data.Add (ByteVector.FromUShort (42)); data.Add (ByteVector.FromUInt (first_ifd_offset)); // Add ifd data itself data.Add (exif_data); return data; } /// /// Creates a for the Xmp segment of this file /// /// /// A with the whole Xmp segment, if xmp tags /// exists, otherwise null. /// private ByteVector RenderXMPSegment () { // Check, if XmpTag is contained XmpTag xmp = ImageTag.Xmp; if (xmp == null) return null; ByteVector xmp_data = XmpTag.XAP_NS + "\0"; xmp_data.Add (xmp.Render ()); uint segment_size = (uint) (2 + xmp_data.Count); // do not render data segments, which cannot fit into the possible segment size if (segment_size > ushort.MaxValue) throw new Exception ("XMP Segment is too big to render"); // Create whole segment ByteVector data = new ByteVector (new byte [] { 0xFF, (byte) Marker.APP1 }); data.Add (ByteVector.FromUShort ((ushort) segment_size)); data.Add (xmp_data); return data; } /// /// Reads a COM segment to find the JPEG comment. /// /// /// The length of the segment that will be read. /// private void ReadCOMSegment (int length) { if ((ImageTag.TagTypes & TagLib.TagTypes.JpegComment) != 0x00) return; long position = Tell; JpegCommentTag com_tag; if (length == 0) { com_tag = new JpegCommentTag (); } else { ByteVector data = ReadBlock (length); int terminator = data.Find ("\0", 0); if (terminator < 0) com_tag = new JpegCommentTag (data.ToString ()); else com_tag = new JpegCommentTag (data.Mid (0, terminator).ToString ()); } ImageTag.AddTag (com_tag); AddMetadataBlock (position - 4, length + 4); } /// /// Creates a for the comment segment of this file /// /// /// A with the whole comment segment, if a comment tag /// exists, otherwise null. /// private ByteVector RenderCOMSegment () { // check, if Comment is contained JpegCommentTag com_tag = GetTag (TagTypes.JpegComment) as JpegCommentTag; if (com_tag == null) return null; // create comment data ByteVector com_data = ByteVector.FromString (com_tag.Value + "\0", StringType.Latin1); uint segment_size = (uint) (2 + com_data.Count); // do not render data segments, which cannot fit into the possible segment size if (segment_size > ushort.MaxValue) throw new Exception ("Comment Segment is too big to render"); // create segment ByteVector data = new ByteVector (new byte [] { 0xFF, (byte) Marker.COM }); data.Add (ByteVector.FromUShort ((ushort) segment_size)); data.Add (com_data); return data; } /// /// Reads and parse a SOF segment /// /// /// The length of the segment that will be read. /// /// /// The SOFx marker. /// void ReadSOFSegment (int length, Marker marker) { #pragma warning disable 219 // Assigned, never read byte p = ReadBlock (1)[0]; //precision #pragma warning restore 219 //FIXME: according to specs, height could be 0 here, and should be retrieved from the DNL marker height = ReadBlock (2).ToUShort (); width = ReadBlock (2).ToUShort (); } /// /// Reads the DQT Segment, and Guesstimate the image quality from it /// /// /// The length of the segment that will be read /// void ReadDQTSegment (int length) { // See CCITT Rec. T.81 (1992 E), B.2.4.1 (p39) for DQT syntax while (length > 0) { byte pqtq = ReadBlock (1)[0]; length --; byte pq = (byte)(pqtq >> 4); //0 indicates 8-bit Qk, 1 indicates 16-bit Qk byte tq = (byte)(pqtq & 0x0f); //table index; int [] table = null; switch (tq) { case 0: table = Table.StandardLuminanceQuantization; break; case 1: table = Table.StandardChrominanceQuantization; break; } bool allones = true; //check for all-ones tables (q=100) double cumsf = 0.0; //double cumsf2 = 0.0; for (int row = 0; row < 8; row ++) { for (int col = 0; col < 8; col++) { ushort val = ReadBlock (pq == 1 ? 2 : 1).ToUShort (); length -= (pq + 1); if (table != null) { double x = 100.0 * (double)val / (double)table [row*8+col]; //Scaling factor in percent cumsf += x; //cumsf2 += x*x; allones = allones && (val == 1); } } } if (table != null) { double local_q; cumsf /= 64.0; // mean scale factor //cumfs2 /= 64.0; //double variance = cumsf2 - (cumsf * cumsf); if (allones) local_q = 100.0; else if (cumsf <= 100.0) local_q = (200.0 - cumsf) / 2.0; else local_q = 5000.0 / cumsf; quality = Math.Max (quality, (int)local_q); } } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Jpeg/Marker.cs0000644000175000017500000001515111470571657022721 0ustar00rubenruben00000000000000// // Marker.cs: // // Author: // Ruben Vermeersch (ruben@savanne.be) // Stephane Delcroix (stephane@delcroix.org) // // Copyright (C) 2009 Ruben Vermeersch // Copyright (c) 2009 Stephane Delcroix // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.Jpeg { /// /// This enum defines the different markers used in JPEG segments. /// /// See CCITT Rec. T.81 (1992 E), Table B.1 (p.32) /// public enum Marker : byte { /// /// Start Of Frame marker, non-differential, Huffman coding, Baseline DCT /// SOF0 = 0xc0, /// /// Start Of Frame marker, non-differential, Huffman coding, Extended Sequential DCT /// SOF1, /// /// Start Of Frame marker, non-differential, Huffman coding, Progressive DCT /// SOF2, /// /// Start Of Frame marker, non-differential, Huffman coding, Lossless (sequential) /// SOF3, /// /// Start Of Frame marker, differential, Huffman coding, Differential Sequential DCT /// SOF5 = 0xc5, /// /// Start Of Frame marker, differential, Huffman coding, Differential Progressive DCT /// SOF6, /// /// Start Of Frame marker, differential, Huffman coding, Differential Lossless (sequential) /// SOF7, /// /// Reserved for JPG extensions /// JPG, /// /// Start Of Frame marker, non-differential, arithmetic coding, Extended Sequential DCT /// SOF9, /// /// Start Of Frame marker, non-differential, arithmetic coding, Progressive DCT /// SOF10, /// /// Start Of Frame marker, non-differential, arithmetic coding, Lossless (sequential) /// SOF11, /// /// Start Of Frame marker, differential, arithmetic coding, Differential Sequential DCT /// SOF13 = 0xcd, /// /// Start Of Frame marker, differential, arithmetic coding, Differential Progressive DCT /// SOF14, /// /// Start Of Frame marker, differential, arithmetic coding, Differential Lossless (sequential) /// SOF15, /// /// Define Huffman table(s) /// DHT = 0xc4, /// /// Define arithmetic coding conditioning(s) /// DAC = 0xcc, //Restart interval termination with modulo 8 count "m" /// /// Restart /// RST0 = 0xd0, /// /// Restart /// RST1, /// /// Restart /// RST2, /// /// Restart /// RST3, /// /// Restart /// RST4, /// /// Restart /// RST5, /// /// Restart /// RST6, /// /// Restart /// RST7, /// /// Start of Image /// SOI = 0xd8, /// /// End of Image /// EOI, /// /// Start of scan /// SOS, /// /// Define quantization table (s) /// DQT, /// /// Define number of lines /// DNL, /// /// Define restart interval /// DRI, /// /// Define hierarchical progression /// DHP, /// /// Define reference component /// EXP, /// /// Reserved for application segment /// APP0 = 0xe0, /// /// Reserved for application segment /// APP1, /// /// Reserved for application segment /// APP2, /// /// Reserved for application segment /// APP3, /// /// Reserved for application segment /// APP4, /// /// Reserved for application segment /// APP5, /// /// Reserved for application segment /// APP6, /// /// Reserved for application segment /// APP7, /// /// Reserved for application segment /// APP8, /// /// Reserved for application segment /// APP9, /// /// Reserved for application segment /// APP10, /// /// Reserved for application segment /// APP11, /// /// Reserved for application segment /// APP12, /// /// Reserved for application segment /// APP13, /// /// Reserved for application segment /// APP14, /// /// Reserved for application segment /// APP15, /// /// Reserved for JPEG extension /// JPG0 = 0xf0, /// /// Reserved for JPEG extension /// JPG1, /// /// Reserved for JPEG extension /// JPG2, /// /// Reserved for JPEG extension /// JPG3, /// /// Reserved for JPEG extension /// JPG4, /// /// Reserved for JPEG extension /// JPG5, /// /// Reserved for JPEG extension /// JPG6, /// /// Reserved for JPEG extension /// JPG7, /// /// Reserved for JPEG extension /// JPG8, /// /// Reserved for JPEG extension /// JPG9, /// /// Reserved for JPEG extension /// JPG10, /// /// Reserved for JPEG extension /// JPG11, /// /// Reserved for JPEG extension /// JPG12, /// /// Reserved for JPEG extension /// JPG13, /// /// Comment /// COM = 0xfe, } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Jpeg/Table.cs0000644000175000017500000000400011470571657022516 0ustar00rubenruben00000000000000// // TagLib.Jpeg.Table.cs: // // Author: // Stephane Delcroix (stephane@delcroix.org) // // Copyright (c) 2009 Stephane Delcroix // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // namespace TagLib.Jpeg { /// /// Contains static predefined tables and helpers /// public static class Table { /// /// Standard Luminance Quantization table /// /// See CCIT Rec. T.81 (1992 E), K.1 (p143) /// public static int [] StandardLuminanceQuantization = new int [] { 16, 11, 12, 14, 12, 10, 16, 14, 13, 14, 18, 17, 16, 19, 24, 40, 26, 24, 22, 22, 24, 49, 35, 37, 29, 40, 58, 51, 61, 60, 57, 51, 56, 55, 64, 72, 92, 78, 64, 68, 87, 69, 55, 56, 80, 109, 81, 87, 95, 98, 103, 104, 103, 62, 77, 113, 121, 112, 100, 120, 92, 101, 103, 99 }; /// /// Standard Chrominance Quantization table /// /// See CCIT Rec. T.81 (1992 E), K.1 (p143) /// public static int [] StandardChrominanceQuantization = new int [] { 17, 18, 18, 24, 21, 24, 47, 26, 26, 47, 99, 66, 56, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99 }; } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Properties.cs0000644000175000017500000003000211470571657022737 0ustar00rubenruben00000000000000// // Properties.cs: This class implements IAudioCodec and IVideoCodec // and combines codecs to create generic media properties for a file. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // audioproperties.cpp from TagLib // // Copyright (C) 2006,2007 Brian Nickel // Copyright (C) 2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Text; using System.Collections.Generic; namespace TagLib { /// /// This class implements , and /// and combines codecs to create generic media properties /// for a file. /// public class Properties : IAudioCodec, IVideoCodec, IPhotoCodec { #region Private Fields /// /// Contains the codecs. /// private ICodec[] codecs = new ICodec [0]; /// /// Contains the duration. /// private TimeSpan duration = TimeSpan.Zero; #endregion #region Constructors /// /// Constructs and initializes a new instance of with no codecs or duration. /// /// /// This constructor is used when media properties are /// not read. /// public Properties () { } /// /// Constructs and initializes a new instance of with a specified duration and array /// of codecs. /// /// /// A containing the duration of the /// media, or if the duration is /// to be read from the codecs. /// /// /// A containing the codecs to be /// used in the new instance. /// public Properties (TimeSpan duration, params ICodec[] codecs) { this.duration = duration; if (codecs != null) this.codecs = codecs; } /// /// Constructs and initializes a new instance of with a specified duration and /// enumaration of codecs. /// /// /// A containing the duration of the /// media, or if the duration is /// to be read from the codecs. /// /// /// A object containing the /// codec to be used in the new instance. /// public Properties (TimeSpan duration, IEnumerable codecs) { this.duration = duration; if (codecs != null) this.codecs = new List (codecs) .ToArray (); } #endregion #region Public Properties /// /// Gets the codecs contained in the current instance. /// /// /// A object containing the /// objects contained in the current /// instance. /// public IEnumerable Codecs { get {return codecs;} } #endregion #region ICodec /// /// Gets the duration of the media represented by the current /// instance. /// /// /// A containing the duration of the /// media represented by the current instance. /// /// /// If the duration was set in the constructor, that value is /// returned. Otherwise, the longest codec duration is used. /// public TimeSpan Duration { get { TimeSpan duration = this.duration; if (duration != TimeSpan.Zero) return duration; foreach (ICodec codec in codecs) if (codec != null && codec.Duration > duration) duration = codec.Duration; return duration; } } /// /// Gets the types of media represented by the current /// instance. /// /// /// A bitwise combined containing /// the types of media represented by the current instance. /// public MediaTypes MediaTypes { get { MediaTypes types = MediaTypes.None; foreach (ICodec codec in codecs) if (codec != null) types |= codec.MediaTypes; return types; } } /// /// Gets a string description of the media represented by the /// current instance. /// /// /// A object containing a description /// of the media represented by the current instance. /// /// /// The value contains the descriptions of the codecs joined /// by colons. /// public string Description { get { StringBuilder builder = new StringBuilder (); foreach (ICodec codec in codecs) { if (codec == null) continue; if (builder.Length != 0) builder.Append ("; "); builder.Append (codec.Description); } return builder.ToString (); } } #endregion #region IAudioCodec /// /// Gets the bitrate of the audio represented by the current /// instance. /// /// /// A containing the bitrate of the audio /// represented by the current instance. /// /// /// This value is equal to the first non-zero audio bitrate. /// public int AudioBitrate { get { foreach (ICodec codec in codecs) { if (codec == null || (codec.MediaTypes & MediaTypes.Audio) == 0) continue; IAudioCodec audio = codec as IAudioCodec; if (audio != null && audio.AudioBitrate != 0) return audio.AudioBitrate; } return 0; } } /// /// Gets the sample rate of the audio represented by the /// current instance. /// /// /// A containing the sample rate of the /// audio represented by the current instance. /// /// /// This value is equal to the first non-zero audio sample /// rate. /// public int AudioSampleRate { get { foreach (ICodec codec in codecs) { if (codec == null || (codec.MediaTypes & MediaTypes.Audio) == 0) continue; IAudioCodec audio = codec as IAudioCodec; if (audio != null && audio.AudioSampleRate != 0) return audio.AudioSampleRate; } return 0; } } /// /// Gets the number of bits per sample in the audio /// represented by the current instance. /// /// /// A value containing the number of bits /// per sample in the audio represented by the current /// instance. /// /// /// This value is equal to the first non-zero quantization. /// public int BitsPerSample { get { foreach (ICodec codec in codecs) { if (codec == null || (codec.MediaTypes & MediaTypes.Audio) == 0) continue; ILosslessAudioCodec lossless = codec as ILosslessAudioCodec; if (lossless != null && lossless.BitsPerSample != 0) return lossless.BitsPerSample; } return 0; } } /// /// Gets the number of channels in the audio represented by /// the current instance. /// /// /// A object containing the number of /// channels in the audio represented by the current /// instance. /// /// /// This value is equal to the first non-zero audio channel /// count. /// public int AudioChannels { get { foreach (ICodec codec in codecs) { if (codec == null || (codec.MediaTypes & MediaTypes.Audio) == 0) continue; IAudioCodec audio = codec as IAudioCodec; if (audio != null && audio.AudioChannels != 0) return audio.AudioChannels; } return 0; } } #endregion #region IVideoCodec /// /// Gets the width of the video represented by the current /// instance. /// /// /// A containing the width of the video /// represented by the current instance. /// /// /// This value is equal to the first non-zero video width. /// public int VideoWidth { get { foreach (ICodec codec in codecs) { if (codec == null || (codec.MediaTypes & MediaTypes.Video) == 0) continue; IVideoCodec video = codec as IVideoCodec; if (video != null && video.VideoWidth != 0) return video.VideoWidth; } return 0; } } /// /// Gets the height of the video represented by the current /// instance. /// /// /// A containing the height of the video /// represented by the current instance. /// /// /// This value is equal to the first non-zero video height. /// public int VideoHeight { get { foreach (ICodec codec in codecs) { if (codec == null || (codec.MediaTypes & MediaTypes.Video) == 0) continue; IVideoCodec video = codec as IVideoCodec; if (video != null && video.VideoHeight != 0) return video.VideoHeight; } return 0; } } #endregion #region IPhotoCodec /// /// Gets the width of the photo represented by the current /// instance. /// /// /// A value containing the width of the /// photo represented by the current instance. /// public int PhotoWidth { get { foreach (ICodec codec in codecs) { if (codec == null || (codec.MediaTypes & MediaTypes.Photo) == 0) continue; IPhotoCodec photo = codec as IPhotoCodec; if (photo != null && photo.PhotoWidth != 0) return photo.PhotoWidth; } return 0; } } /// /// Gets the height of the photo represented by the current /// instance. /// /// /// A value containing the height of the /// photo represented by the current instance. /// public int PhotoHeight { get { foreach (ICodec codec in codecs) { if (codec == null || (codec.MediaTypes & MediaTypes.Photo) == 0) continue; IPhotoCodec photo = codec as IPhotoCodec; if (photo != null && photo.PhotoHeight != 0) return photo.PhotoHeight; } return 0; } } /// /// Gets the (format specific) quality indicator of the photo /// represented by the current instance. /// /// /// A value indicating the quality. A value /// 0 means that there was no quality indicator for the format /// or the file. /// public int PhotoQuality { get { foreach (ICodec codec in codecs) { if (codec == null || (codec.MediaTypes & MediaTypes.Photo) == 0) continue; IPhotoCodec photo = codec as IPhotoCodec; if (photo != null && photo.PhotoQuality != 0) return photo.PhotoQuality; } return 0; } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ape/0000777000175000017500000000000011503407416020756 5ustar00rubenruben00000000000000f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ape/File.cs0000644000175000017500000002144711462100402022155 0ustar00rubenruben00000000000000// // File.cs: Provides tagging and properties support for Monkey's Audio APE // files. // // Author: // Helmut Wahrmann // // Copyright (C) 2007 Helmut Wahrmann // Copyright (C) 2007 Brian Nickel // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Ape { /// /// This class extends to /// provide tagging and properties support for Monkey's Audio APE /// files. /// /// /// A will be added automatically to /// any file that doesn't contain one. This change does not effect /// the physical file until is called and can be /// reversed using the following method: /// file.RemoveTags (file.TagTypes & ~file.TagTypesOnDisk); /// [SupportedMimeType("taglib/ape", "ape")] [SupportedMimeType("audio/x-ape")] [SupportedMimeType("audio/ape")] [SupportedMimeType("application/x-ape")] public class File : TagLib.NonContainer.File { #region Private Fields /// /// Contains the block with the audio header. /// private ByteVector header_block = null; #endregion #region Constructors /// /// Constructs and initializes a new instance of for a specified path in the local file /// system and specified read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (string path, ReadStyle propertiesStyle) : base (path, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified path in the local file /// system with an average read style. /// /// /// A object containing the path of the /// file to use in the new instance. /// /// /// is . /// public File (string path) : base (path) { } /// /// Constructs and initializes a new instance of for a specified file abstraction and /// specified read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// is . /// public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction, propertiesStyle) { } /// /// Constructs and initializes a new instance of for a specified file abstraction with an /// average read style. /// /// /// A object to use when /// reading from and writing to the file. /// /// /// is . /// public File (File.IFileAbstraction abstraction) : base (abstraction) { } #endregion #region Public Methods /// /// Gets a tag of a specified type from the current instance, /// optionally creating a new tag if possible. /// /// /// A value indicating the /// type of tag to read. /// /// /// A value specifying whether or not to /// try and create the tag if one is not found. /// /// /// A object containing the tag that was /// found in or added to the current instance. If no /// matching tag was found and none was created, is returned. /// /// /// If a is added to the /// current instance, it will be placed at the start of the /// file. On the other hand, /// will be added to the end of /// the file. All other tag types will be ignored. /// public override TagLib.Tag GetTag(TagTypes type, bool create) { TagLib.Tag t = (Tag as TagLib.NonContainer.Tag) .GetTag (type); if (t != null || !create) return t; switch (type) { case TagTypes.Id3v1: return EndTag.AddTag (type, Tag); case TagTypes.Id3v2: return StartTag.AddTag (type, Tag); case TagTypes.Ape: return EndTag.AddTag (type, Tag); default: return null; } } #endregion #region Protected Methods /// /// Reads format specific information at the start of the /// file. /// /// /// A value containing the seek position /// at which the tags end and the media data begins. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// protected override void ReadStart (long start, ReadStyle propertiesStyle) { if (header_block != null && propertiesStyle == ReadStyle.None) return; Seek(start); header_block = ReadBlock ((int)StreamHeader.Size); } /// /// Reads format specific information at the end of the /// file. /// /// /// A value containing the seek position /// at which the media data ends and the tags begin. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// protected override void ReadEnd (long end, ReadStyle propertiesStyle) { // Make sure we have an APE tag. GetTag (TagTypes.Ape, true); } /// /// Reads the audio properties from the file represented by /// the current instance. /// /// /// A value containing the seek position /// at which the tags end and the media data begins. /// /// /// A value containing the seek position /// at which the media data ends and the tags begin. /// /// /// A value specifying at what level /// of accuracy to read the media properties, or to ignore the properties. /// /// /// A object describing the /// media properties of the file represented by the current /// instance. /// protected override Properties ReadProperties (long start, long end, ReadStyle propertiesStyle) { StreamHeader header = new StreamHeader (header_block, end - start); return new Properties(TimeSpan.Zero, header); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ape/Item.cs0000644000175000017500000003441311462100402022171 0ustar00rubenruben00000000000000// // Item.cs: Provides a representation of an APEv2 tag item which can be read // from and written to disk. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // apeitem.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2004 by Allan Sandfeld Jensen (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Ape { /// /// Indicates the type of data stored in a /// object. /// public enum ItemType { /// /// The item contains Unicode text. /// Text = 0, /// /// The item contains binary data. /// Binary = 1, /// /// The item contains a locator (file path/URL) for external /// information. /// Locator = 2 } /// /// This class provides a representation of an APEv2 tag item which /// can be read from and written to disk. /// public class Item : ICloneable { #region Private Fields /// /// Contains the type of data stored in the item. /// private ItemType type = ItemType.Text; /// /// Contains the item key. /// private string key = null; /// /// Contains the item value. /// private ReadOnlyByteVector data = null; /// /// Contains the item text. /// private string [] text = null; /// /// Indicates whether or not the item is read only. /// private bool read_only = false; /// /// Contains the size of the item on disk. /// private int size_on_disk; #endregion #region Constructors /// /// Constructs and initializes a new instance of by reading in a raw APEv2 item. /// /// /// A object containing the item to /// read. /// /// /// A value specifying the offset in /// at which the item data begins. /// /// /// is . /// /// /// is less than zero. /// /// /// A complete item could not be read. /// public Item (ByteVector data, int offset) { if (data == null) throw new ArgumentNullException ("data"); Parse (data, offset); } /// /// Constructs and initializes a new instance of with a specified key and value. /// /// /// A object containing the key to use /// for the current instance. /// /// /// A object containing the value to /// store in the new instance. /// /// /// or is /// . /// public Item (string key, string value) { if (key == null) throw new ArgumentNullException ("key"); if (value == null) throw new ArgumentNullException ("value"); this.key = key; this.text = new string [] {value}; } /// /// Constructs and initializes a new instance of with a specified key and collection of /// values. /// /// /// A object containing the key to use /// for the current instance. /// /// /// A containing the values to store /// in the new instance. /// /// /// or is /// . /// public Item (string key, params string [] value) { if (key == null) throw new ArgumentNullException ("key"); if (value == null) throw new ArgumentNullException ("value"); this.key = key; this.text = (string[]) value.Clone (); } /// /// Constructs and initializes a new instance of with a specified key and collection of /// values. /// /// /// A object containing the key to use /// for the current instance. /// /// /// A object containing the /// values to store in the new instance. /// /// /// or is /// . /// /// [Obsolete("Use Item(string,string[])")] public Item (string key, StringCollection value) { if (key == null) throw new ArgumentNullException ("key"); if (value == null) throw new ArgumentNullException ("value"); this.key = key; this.text = value.ToArray (); } /// /// Constructs and initializes a new instance of with a specified key and raw data. /// /// /// A object containing the key to use /// for the current instance. /// /// /// A object containing the /// values to store in the new instance. /// /// /// This constructor automatically marks the new instance as /// . /// /// /// or is /// . /// /// public Item (string key, ByteVector value) { this.key = key; this.type = ItemType.Binary; data = value as ReadOnlyByteVector; if (data == null) data = new ReadOnlyByteVector (value); } private Item (Item item) { type = item.type; key = item.key; if (item.data != null) data = new ReadOnlyByteVector (item.data); if (item.text != null) text = (string[]) item.text.Clone (); read_only = item.read_only; size_on_disk = item.size_on_disk; } #endregion #region Public Properties /// /// Gets the key used to identify the current instance. /// /// /// A object containing the key used to /// identify the current instance. /// /// /// This value is used for specifying the contents of the /// item in a common and consistant fashion. For example, /// "TITLE" specifies that the item contains the title /// of the track. /// public string Key { get {return key;} } /// /// Gets the binary value stored in the current instance. /// /// /// A object containing the binary /// value stored in the current instance, or if the item contains text. /// public ByteVector Value { get {return (type == ItemType.Binary) ? data : null;} } /// /// Gets the size of the current instance as it last appeared /// on disk. /// /// /// A value containing the size of the /// current instance as it last appeared on disk. /// public int Size { get {return size_on_disk;} } /// /// Gets and sets the type of value contained in the /// current instance. /// /// /// A value indicating the type of /// value contained in the current instance. /// public ItemType Type { get {return type;} set {type = value;} } /// /// Gets and sets whether or not the current instance is /// flagged as read-only on disk. /// /// /// A value indicating whether or not the /// current instance is flagged as read-only on disk. /// public bool ReadOnly { get {return read_only;} set {read_only = value;} } /// /// Gets whether or not the current instance is empty. /// /// /// A value indicating whether or not the /// current instance contains no value. /// public bool IsEmpty { get { if (type != ItemType.Binary) return text == null || text.Length == 0; else return data == null || data.IsEmpty; } } #endregion #region Public Methods /// /// Gets the contents of the current instance as a . /// /// /// A object containing the text /// stored in the current instance, or if the item is empty of contains binary data. /// If the current instance contains multiple string /// values, they will be returned as a comma separated /// value. /// public override string ToString () { if (type == ItemType.Binary || text == null) return null; else return string.Join (", ", text); } /// /// Gets the contents of the current instance as a array. /// /// /// A containing the text stored in /// the current instance, or an empty array if the item /// contains binary data. /// public string [] ToStringArray () { if (type == ItemType.Binary || text == null) return new string [0]; return text; } /// /// Renders the current instance as an APEv2 item. /// /// /// A object containing the /// rendered version of the current instance. /// public ByteVector Render () { uint flags = (uint) ((ReadOnly) ? 1 : 0) | ((uint) Type << 1); if (IsEmpty) return new ByteVector (); ByteVector result = null; if (type == ItemType.Binary) { if (text == null && data != null) result = data; } if (result == null && text != null) { result = new ByteVector (); for (int i = 0; i < text.Length; i ++) { if (i != 0) result.Add ((byte) 0); result.Add (ByteVector.FromString ( text [i], StringType.UTF8)); } } // If no data is stored, don't write the item. if (result == null || result.Count == 0) return new ByteVector (); ByteVector output = new ByteVector (); output.Add (ByteVector.FromUInt ((uint) result.Count, false)); output.Add (ByteVector.FromUInt (flags, false)); output.Add (ByteVector.FromString (key, StringType.UTF8)); output.Add ((byte) 0); output.Add (result); size_on_disk = output.Count; return output; } #endregion #region Protected Methods /// /// Populates the current instance by reading in a raw APEv2 /// item. /// /// /// A object containing the item to /// read. /// /// /// A value specifying the offset in /// at which the item data begins. /// /// /// is . /// /// /// is less than zero. /// /// /// A complete item could not be read. /// protected void Parse (ByteVector data, int offset) { if (data == null) throw new ArgumentNullException ("data"); if (offset < 0) throw new ArgumentOutOfRangeException ("offset"); // 11 bytes is the minimum size for an APE item if(data.Count < offset + 11) throw new CorruptFileException ( "Not enough data for APE Item"); uint value_length = data.Mid (offset, 4).ToUInt (false); uint flags = data.Mid (offset + 4, 4).ToUInt (false); ReadOnly = (flags & 1) == 1; Type = (ItemType) ((flags >> 1) & 3); int pos = data.Find (ByteVector.TextDelimiter ( StringType.UTF8), offset + 8); key = data.ToString (StringType.UTF8, offset + 8, pos - offset - 8); if (value_length > data.Count - pos - 1) throw new CorruptFileException ( "Invalid data length."); size_on_disk = pos + 1 + (int) value_length - offset; if (Type == ItemType.Binary) this.data = new ReadOnlyByteVector ( data.Mid (pos + 1, (int) value_length)); else this.text = data.Mid (pos + 1, (int) value_length).ToStrings ( StringType.UTF8, 0); } #endregion #region ICloneable /// /// Creates a deep copy of the current instance. /// /// /// A new object identical to the current /// instance. /// public Item Clone () { return new Item (this); } object ICloneable.Clone () { return Clone (); } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ape/Tag.cs0000644000175000017500000013502411462100402022006 0ustar00rubenruben00000000000000// // Tag.cs: Provides a representation of an APEv2 tag which can be read from and // written to disk. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // apetag.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2004 Allan Sandfeld Jensen (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; using System.Collections; using System.Collections.Generic; using System.Globalization; namespace TagLib.Ape { /// /// This class extends and implements to provide a representation of an APEv2 /// tag which can be read from and written to disk. /// public class Tag : TagLib.Tag, IEnumerable { #region Private Static Fields /// /// Contains names of picture fields, indexed to correspond /// to their picture item names. /// private static string [] picture_item_names = new string [] { "Cover Art (other)", "Cover Art (icon)", "Cover Art (other icon)", "Cover Art (front)", "Cover Art (back)", "Cover Art (leaflet)", "Cover Art (media)", "Cover Art (lead)", "Cover Art (artist)", "Cover Art (conductor)", "Cover Art (band)", "Cover Art (composer)", "Cover Art (lyricist)", "Cover Art (studio)", "Cover Art (recording)", "Cover Art (performance)", "Cover Art (movie scene)", "Cover Art (colored fish)", "Cover Art (illustration)", "Cover Art (band logo)", "Cover Art (publisher logo)" }; #endregion #region Private Fields /// /// Contains the tag footer. /// private Footer footer = new Footer (); /// /// Contains the items in the tag. /// private List items = new List (); #endregion #region Public Static Properties /// /// Specifies the identifier used find an APEv2 tag in a /// file. /// /// /// "APETAGEX" /// [Obsolete("Use Footer.FileIdentifer")] public static readonly ReadOnlyByteVector FileIdentifier = Footer.FileIdentifier; #endregion #region Constructors /// /// Constructs and initializes a new instance of with no contents. /// public Tag () { } /// /// Constructs and initializes a new instance of by reading the contents from a specified /// position in a specified file. /// /// /// A object containing the file /// from which the contents of the new instance is to be /// read. /// /// /// A value specify at what position to /// read the tag. /// /// /// is . /// /// /// is less than zero or greater /// than the size of the file. /// public Tag (TagLib.File file, long position) { if (file == null) throw new ArgumentNullException ("file"); if (position < 0 || position > file.Length - Footer.Size) throw new ArgumentOutOfRangeException ( "position"); Read (file, position); } /// /// Constructs and initializes a new instance of by reading the contents of a raw tag in a /// specified object. /// /// /// A object containing the raw /// tag. /// /// /// is . /// /// /// is too small to contain a tag, /// has a header where the footer should be, or is smaller /// than the tag it is supposed to contain. /// public Tag (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); if (data.Count < Footer.Size) throw new CorruptFileException ( "Does not contain enough footer data."); footer = new Footer ( data.Mid ((int) (data.Count - Footer.Size))); if (footer.TagSize == 0) throw new CorruptFileException ( "Tag size out of bounds."); // If we've read a header at the end of the block, the // block is invalid. if ((footer.Flags & FooterFlags.IsHeader) != 0) throw new CorruptFileException ( "Footer was actually header."); if (data.Count < footer.TagSize) throw new CorruptFileException ( "Does not contain enough tag data."); Parse (data.Mid ((int) (data.Count - footer.TagSize), (int) (footer.TagSize - Footer.Size))); } #endregion #region Public Properties /// /// Gets and sets whether or not the current instance has a /// header when rendered. /// /// /// A value indicating whether or not the /// current instance has a header when rendered. /// public bool HeaderPresent { get { return (footer.Flags & FooterFlags.HeaderPresent) != 0; } set { if (value) footer.Flags |= FooterFlags.HeaderPresent; else footer.Flags &= ~FooterFlags.HeaderPresent; } } #endregion #region Public Methods /// /// Adds a number to the value stored in a specified item. /// /// /// A object containing the key of the /// item to store the value in. /// /// /// A value containing the number to /// store. /// /// /// A value representing a total which /// is a part of, or zero if /// is not part of a set. /// /// /// If both and are equal to zero, the value will not be /// added. If is zero, by itself will be stored. Otherwise, the /// values will be stored as "/". /// /// /// is . /// public void AddValue (string key, uint number, uint count) { if (key == null) throw new ArgumentNullException ("key"); if (number == 0 && count == 0) return; else if (count != 0) AddValue (key, string.Format ( CultureInfo.InvariantCulture, "{0}/{1}", number, count)); else AddValue (key, number.ToString ( CultureInfo.InvariantCulture)); } /// /// Stores a number in a specified item. /// /// /// A object containing the key of the /// item to store the value in. /// /// /// A value containing the number to /// store. /// /// /// A value representing a total which /// is a part of, or zero if /// is not part of a set. /// /// /// If both and are equal to zero, the value will be /// cleared. If is zero, by itself will be stored. Otherwise, the /// values will be stored as "/". /// /// /// is . /// public void SetValue (string key, uint number, uint count) { if (key == null) throw new ArgumentNullException ("key"); if (number == 0 && count == 0) RemoveItem (key); else if (count != 0) SetValue (key, string.Format ( CultureInfo.InvariantCulture, "{0}/{1}", number, count)); else SetValue (key, number.ToString ( CultureInfo.InvariantCulture)); } /// /// Adds the contents of a to the value /// stored in a specified item. /// /// /// A object containing the key of the /// item to store the value in. /// /// /// A object containing the text to /// add. /// /// /// If is /// or empty, the value will not be added. /// /// /// is . /// public void AddValue (string key, string value) { if (key == null) throw new ArgumentNullException ("key"); if (string.IsNullOrEmpty (value)) return; AddValue (key, new string [] {value}); } /// /// Stores the contents of a in a /// specified item. /// /// /// A object containing the key of the /// item to store the value in. /// /// /// A object containing the text to /// store. /// /// /// If is /// or empty, the value will be cleared. /// /// /// is . /// public void SetValue (string key, string value) { if (key == null) throw new ArgumentNullException ("key"); if (string.IsNullOrEmpty (value)) RemoveItem (key); else SetValue (key, new string [] {value}); } /// /// Adds the contents of a to the /// value stored in a specified item. /// /// /// A object containing the key of the /// item to store the value in. /// /// /// A containing the text to add. /// /// /// If is /// or empty, the value will not be added. /// /// /// is . /// public void AddValue (string key, string [] value) { if (key == null) throw new ArgumentNullException ("key"); if (value == null || value.Length == 0) return; int index = GetItemIndex (key); List values = new List (); if (index >= 0) values.AddRange (items [index].ToStringArray ()); values.AddRange (value); Item item = new Item (key, values.ToArray ()); if (index >= 0) items [index] = item; else items.Add (item); } /// /// Stores the contents of a in a /// specified item. /// /// /// A object containing the key of the /// item to store the value in. /// /// /// A containing the text to store. /// /// /// If is /// or empty, the value will be cleared. /// /// /// is . /// public void SetValue (string key, string [] value) { if (key == null) throw new ArgumentNullException ("key"); if (value == null || value.Length == 0) { RemoveItem (key); return; } Item item = new Item (key, value); int index = GetItemIndex (key); if (index >= 0) items [index] = item; else items.Add (item); } /// /// Gets a specified item from the current instance. /// /// /// A object containing the key of the /// item to get from the current instance. /// /// /// The item with the matching name contained in the current /// instance, or if a matching object /// was not found. /// public Item GetItem (string key) { if (key == null) throw new ArgumentNullException ("key"); StringComparison comparison = StringComparison.InvariantCultureIgnoreCase; foreach (Item item in items) if (key.Equals (item.Key, comparison)) return item; return null; } /// /// Adds an item to the current instance, replacing the /// existing one of the same name. /// /// /// A object to add to the current /// instance. /// public void SetItem (Item item) { if (item == null) throw new ArgumentNullException ("item"); int index = GetItemIndex (item.Key); if (index >= 0) items [index] = item; else items.Add (item); } /// /// Removes the item with a specified key from the current /// instance. /// /// /// A object containing the key of the /// item to remove from the current instance. /// public void RemoveItem (string key) { if (key == null) throw new ArgumentNullException ("key"); StringComparison comparison = StringComparison.InvariantCultureIgnoreCase; for (int i = items.Count - 1; i >= 0; i --) if (key.Equals (items [i].Key, comparison)) items.RemoveAt (i); } /// /// Checks if an item exists. /// /// /// A object containing the key of the /// item to check. /// /// /// Returns if the /// exists - else is returned. /// /// /// is . /// public bool HasItem(string key) { if (key == null) throw new ArgumentNullException("key"); return GetItemIndex(key) >= 0; } /// /// Renders the current instance as a raw APEv2 tag. /// /// /// A object containing the /// rendered tag. /// public ByteVector Render () { ByteVector data = new ByteVector (); uint item_count = 0; foreach (Item item in items) { data.Add (item.Render ()); item_count ++; } footer.ItemCount = item_count; footer.TagSize = (uint) (data.Count + Footer.Size); HeaderPresent = true; data.Insert (0, footer.RenderHeader ()); data.Add (footer.RenderFooter ()); return data; } #endregion #region Protected Methods /// /// Populates the current instance be reading in a tag from /// a specified position in a specified file. /// /// /// A object to read the tag from. /// /// /// A value specifying the seek position /// at which to read the tag. /// /// /// is . /// /// /// is less than 0 or greater /// than the size of the file. /// protected void Read (TagLib.File file, long position) { if (file == null) throw new ArgumentNullException ("file"); file.Mode = File.AccessMode.Read; if (position < 0 || position > file.Length - Footer.Size) throw new ArgumentOutOfRangeException ( "position"); file.Seek (position); footer = new Footer (file.ReadBlock ((int)Footer.Size)); if (footer.TagSize == 0) throw new CorruptFileException ( "Tag size out of bounds."); // If we've read a header, we don't have to seek to read // the content. If we've read a footer, we need to move // back to the start of the tag. if ((footer.Flags & FooterFlags.IsHeader) == 0) file.Seek (position + Footer.Size - footer.TagSize); Parse (file.ReadBlock ((int)(footer.TagSize - Footer.Size))); } /// /// Populates the current instance by parsing the contents of /// a raw APEv2 tag, minus the header and footer. /// /// /// A object containing the content /// of an APEv2 tag, minus the header and footer. /// /// /// This method must only be called after the internal /// footer has been read from the file, otherwise the data /// cannot be parsed correctly. /// protected void Parse (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); int pos = 0; try { // 11 bytes is the minimum size for an APE item for (uint i = 0; i < footer.ItemCount && pos <= data.Count - 11; i++) { Item item = new Item (data, pos); SetItem (item); pos += item.Size; } } catch (CorruptFileException) { // A corrupt item was encountered, considered // the tag finished with what has been read. } } #endregion #region Private Methods /// /// Gets the index of an item in the current instance. /// /// /// A object containing the key to look /// for in the current instance. /// /// /// A value containing the index in at which the item appears, or -1 if the /// item was not found. /// /// /// Keys are compared in a case insensitive manner. /// private int GetItemIndex (string key) { StringComparison comparison = StringComparison.InvariantCultureIgnoreCase; for (int i = 0; i < items.Count; i ++) if (key.Equals (items [i].Key, comparison)) return i; return -1; } /// /// Gets the text value from a specified item. /// /// /// A object containing the key of the /// item to get the value from. /// /// /// A object containing the text of the /// specified frame, or if no value /// was found. /// private string GetItemAsString (string key) { Item item = GetItem (key); return item != null ? item.ToString () : null; } /// /// Gets the text values from a specified item. /// /// /// A object containing the key of the /// item to get the value from. /// /// /// A containing the text of the /// specified frame, or an empty array if no values were /// found. /// private string [] GetItemAsStrings (string key) { Item item = GetItem (key); return item != null ? item.ToStringArray () : new string [0]; } /// /// Gets an integer value from a "/" delimited list in a /// specified item. /// /// /// A object containing the key of the /// item to get the value from. /// /// /// A value specifying the index in the /// integer list of the value to return. /// /// /// A value read from the list in the /// frame, or 0 if the value wasn't found. /// private uint GetItemAsUInt32 (string key, int index) { string text = GetItemAsString (key); if (text == null) return 0; string [] values = text.Split (new char [] {'/'}, index + 2); if (values.Length < index + 1) return 0; uint result; if (uint.TryParse (values [index], out result)) return result; return 0; } #endregion #region IEnumerable /// /// Gets the enumerator for the current instance. /// /// /// A object enumerating through /// the item keys stored in the current instance. /// public IEnumerator GetEnumerator () { foreach (Item item in items) yield return item.Key; } /// /// Gets the enumerator for the current instance. /// /// /// A object enumerating through /// the item keys stored in the current instance. /// IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator (); } #endregion #region TagLib.Tag /// /// Gets the tag types contained in the current instance. /// /// /// Always . /// public override TagTypes TagTypes { get {return TagTypes.Ape;} } /// /// Gets and sets the title for the media described by the /// current instance. /// /// /// A object containing the title for /// the media described by the current instance or if no value is present. /// /// /// This property is implemented using the "Title" item. /// public override string Title { get { return GetItemAsString ("Title"); } set {SetValue ("Title", value);} } /// /// Gets and sets the sort names of the Title of the /// media represented by the current instance. /// /// /// A containing the sort names for /// the Title of the media described by the current instance, /// or null if no value is present. /// /// /// This property is implemented using the "TitleSort" item. /// public override string TitleSort { get { return GetItemAsString ("TitleSort"); } set { SetValue ("TitleSort", value); } } /// /// Gets and sets the performers or artists who performed in /// the media described by the current instance. /// /// /// A containing the performers or /// artists who performed in the media described by the /// current instance or an empty array if no value is /// present. /// /// /// This property is implemented using the "Artist" item. /// public override string [] Performers { get {return GetItemAsStrings ("Artist");} set {SetValue ("Artist", value);} } /// /// Gets and sets the sort names of the performers or artists /// who performed in the media described by the current instance. /// /// /// A array containing the sort names for /// the performers or artists who performed in the media /// described by the current instance, or an empty array if /// no value is present. /// /// /// This property is implemented using the "ArtistSort" field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string[] PerformersSort { get { return GetItemAsStrings ("ArtistSort"); } set { SetValue ("ArtistSort", value); } } /// /// Gets and sets the band or artist who is credited in the /// creation of the entire album or collection containing the /// media described by the current instance. /// /// /// A containing the band or artist /// who is credited in the creation of the entire album or /// collection containing the media described by the current /// instance or an empty array if no value is present. /// /// /// This property is implemented using the "Album Artist" /// item, and "AlbumArtist" as a backup property if it exists. /// public override string [] AlbumArtists { get { string[] list = GetItemAsStrings("Album Artist"); if (list.Length == 0) list = GetItemAsStrings("AlbumArtist"); return list; } set { SetValue("Album Artist", value); // compatibility if (HasItem("AlbumArtist")) SetValue("AlbumArtist", value); } } /// /// Gets and sets the sort names for the band or artist who /// is credited in the creation of the entire album or /// collection containing the media described by the /// current instance. /// /// /// A array containing the sort names /// for the band or artist who is credited in the creation /// of the entire album or collection containing the media /// described by the current instance or an empty array if /// no value is present. /// /// /// This property is implemented using the "AlbumArtistSort" /// field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string[] AlbumArtistsSort { get { return GetItemAsStrings ("AlbumArtistSort"); } set { SetValue ("AlbumArtistSort", value); } } /// /// Gets and sets the composers of the media represented by /// the current instance. /// /// /// A containing the composers of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This property is implemented using the "Composer" item. /// public override string [] Composers { get {return GetItemAsStrings ("Composer");} set {SetValue ("Composer", value);} } /// /// Gets and sets the sort names for the composers of /// the media described by the current instance. /// /// /// A array containing the sort names /// for the composer of the media described by the current /// instance or an empty array if no value is present. /// /// /// This property is implemented using the "ComposerSort" /// field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string[] ComposersSort { get { return GetItemAsStrings ("ComposerSort"); } set { SetValue ("ComposerSort", value); } } /// /// Gets and sets the album of the media represented by the /// current instance. /// /// /// A object containing the album of /// the media represented by the current instance or if no value is present. /// /// /// This property is implemented using the "Album" item. /// public override string Album { get {return GetItemAsString ("Album");} set {SetValue ("Album", value);} } /// /// Gets and sets the sort names for the Album Title of /// the media described by the current instance. /// /// /// A containing the sort name of /// the Album Title of the media described by the current /// instance or null if no value is present. /// /// /// This property is implemented using the "AlbumSort" /// field. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string AlbumSort { get { return GetItemAsString ("AlbumSort"); } set { SetValue ("AlbumSort", value); } } /// /// Gets and sets a user comment on the media represented by /// the current instance. /// /// /// A object containing user comments /// on the media represented by the current instance or if no value is present. /// /// /// This property is implemented using the "Comment" item. /// public override string Comment { get {return GetItemAsString ("Comment");} set {SetValue ("Comment", value);} } /// /// Gets and sets the genres of the media represented by the /// current instance. /// /// /// A containing the genres of the /// media represented by the current instance or an empty /// array if no value is present. /// /// /// This property is implemented using the "Genre" item. /// public override string [] Genres { get {return GetItemAsStrings ("Genre");} set {SetValue ("Genre", value);} } /// /// Gets and sets the year that the media represented by the /// current instance was recorded. /// /// /// A containing the year that the media /// represented by the current instance was created or zero /// if no value is present. /// /// /// This property is implemented using the "Year" item. /// public override uint Year { get { string text = GetItemAsString ("Year"); if (text == null || text.Length == 0) return 0; uint value; if (uint.TryParse (text, out value) || (text.Length >= 4 && uint.TryParse ( text.Substring (0, 4), out value))) return value; return 0; } set {SetValue ("Year", value, 0);} } /// /// Gets and sets the position of the media represented by /// the current instance in its containing album. /// /// /// A containing the position of the /// media represented by the current instance in its /// containing album or zero if not specified. /// /// /// This property is implemented using the "Track" item. /// public override uint Track { get {return GetItemAsUInt32 ("Track", 0);} set {SetValue ("Track", value, TrackCount);} } /// /// Gets and sets the number of tracks in the album /// containing the media represented by the current instance. /// /// /// A containing the number of tracks in /// the album containing the media represented by the current /// instance or zero if not specified. /// /// /// This property is implemented using the "Track" item. /// public override uint TrackCount { get {return GetItemAsUInt32 ("Track", 1);} set {SetValue ("Track", Track, value);} } /// /// Gets and sets the number of the disc containing the media /// represented by the current instance in the boxed set. /// /// /// A containing the number of the disc /// containing the media represented by the current instance /// in the boxed set. /// /// /// This property is implemented using the "Disc" item. /// public override uint Disc { get {return GetItemAsUInt32 ("Disc", 0);} set {SetValue ("Disc", value, DiscCount);} } /// /// Gets and sets the number of discs in the boxed set /// containing the media represented by the current instance. /// /// /// A containing the number of discs in /// the boxed set containing the media represented by the /// current instance or zero if not specified. /// /// /// This property is implemented using the "Disc" item. /// public override uint DiscCount { get {return GetItemAsUInt32 ("Disc", 1);} set {SetValue ("Disc", Disc, value);} } /// /// Gets and sets the lyrics or script of the media /// represented by the current instance. /// /// /// A object containing the lyrics or /// script of the media represented by the current instance /// or if no value is present. /// /// /// This property is implemented using the "Lyrics" item. /// public override string Lyrics { get {return GetItemAsString ("Lyrics");} set {SetValue ("Lyrics", value);} } /// /// Gets and sets the grouping on the album which the media /// in the current instance belongs to. /// /// /// A object containing the grouping on /// the album which the media in the current instance belongs /// to or if no value is present. /// /// /// This property is implemented using the "Grouping" item. /// public override string Grouping { get {return GetItemAsString ("Grouping");} set {SetValue ("Grouping", value);} } /// /// Gets and sets the number of beats per minute in the audio /// of the media represented by the current instance. /// /// /// A containing the number of beats per /// minute in the audio of the media represented by the /// current instance, or zero if not specified. /// /// /// This property is implemented using the "BPM" item. /// public override uint BeatsPerMinute { get { string text = GetItemAsString ("BPM"); if (text == null) return 0; double value; if (double.TryParse (text, out value)) return (uint) Math.Round (value); return 0; } set {SetValue ("BPM", value, 0);} } /// /// Gets and sets the conductor or director of the media /// represented by the current instance. /// /// /// A object containing the conductor /// or director of the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "Conductor" item. /// public override string Conductor { get {return GetItemAsString ("Conductor");} set {SetValue ("Conductor", value);} } /// /// Gets and sets the copyright information for the media /// represented by the current instance. /// /// /// A object containing the copyright /// information for the media represented by the current /// instance or if no value present. /// /// /// This property is implemented using the "Copyright" item. /// public override string Copyright { get {return GetItemAsString ("Copyright");} set {SetValue ("Copyright", value);} } /// /// Gets and sets the MusicBrainz Artist ID of the media /// represented by the current instance. /// /// /// A object containing the MusicBrainz /// ArtistID for the media represented by the current instance /// or if no value is present. /// /// /// This property is implemented using the "MUSICBRAINZ_ARTISTID" item. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzArtistId { get {return GetItemAsString ("MUSICBRAINZ_ARTISTID");} set {SetValue ("MUSICBRAINZ_ARTISTID", value);} } /// /// Gets and sets the MusicBrainz Release ID of the media /// represented by the current instance. /// /// /// A object containing the MusicBrainz /// ReleaseID for the media represented by the current instance /// or if no value is present. /// /// /// This property is implemented using the "MUSICBRAINZ_ALBUMID" item. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseId { get {return GetItemAsString ("MUSICBRAINZ_ALBUMID");} set {SetValue ("MUSICBRAINZ_ALBUMID", value);} } /// /// Gets and sets the MusicBrainz Release Artist ID of the media /// represented by the current instance. /// /// /// A object containing the MusicBrainz /// ReleaseArtistID for the media represented by the current instance /// or if no value is present. /// /// /// This property is implemented using the "MUSICBRAINZ_ALBUMARTISTID" item. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseArtistId { get {return GetItemAsString ("MUSICBRAINZ_ALBUMARTISTID");} set {SetValue ("MUSICBRAINZ_ALBUMARTISTID", value);} } /// /// Gets and sets the MusicBrainz Track ID of the media /// represented by the current instance. /// /// /// A object containing the MusicBrainz /// TrackID for the media represented by the current instance /// or if no value is present. /// /// /// This property is implemented using the "MUSICBRAINZ_TRACKID" item. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzTrackId { get {return GetItemAsString ("MUSICBRAINZ_TRACKID");} set {SetValue ("MUSICBRAINZ_TRACKID", value);} } /// /// Gets and sets the MusicBrainz Disc ID of the media /// represented by the current instance. /// /// /// A object containing the MusicBrainz /// DiscID for the media represented by the current instance /// or if no value is present. /// /// /// This property is implemented using the "MUSICBRAINZ_DISCID" item. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzDiscId { get {return GetItemAsString ("MUSICBRAINZ_DISCID");} set {SetValue ("MUSICBRAINZ_DISCID", value);} } /// /// Gets and sets the MusicIP PUID of the media /// represented by the current instance. /// /// /// A object containing the MusicIPPUID /// for the media represented by the current instance /// or if no value is present. /// /// /// This property is implemented using the "MUSICIP_PUID" item. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicIpId { get {return GetItemAsString ("MUSICIP_PUID");} set {SetValue ("MUSICIP_PUID", value);} } /// /// Gets and sets the Amazon ID of the media /// represented by the current instance. /// /// /// A object containing the AmazonID /// for the media represented by the current instance /// or if no value is present. /// /// /// This property is implemented using the "ASIN" item. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string AmazonId { get {return GetItemAsString ("ASIN");} set {SetValue ("ASIN", value);} } /// /// Gets and sets the MusicBrainz Release Status of the media /// represented by the current instance. /// /// /// A object containing the MusicBrainz /// ReleaseStatus for the media represented by the current instance /// or if no value is present. /// /// /// This property is implemented using the "MUSICBRAINZ_ALBUMSTATUS" item. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseStatus { get {return GetItemAsString ("MUSICBRAINZ_ALBUMSTATUS");} set {SetValue ("MUSICBRAINZ_ALBUMSTATUS", value);} } /// /// Gets and sets the MusicBrainz Release Type of the media /// represented by the current instance. /// /// /// A object containing the MusicBrainz /// ReleaseType for the media represented by the current instance /// or if no value is present. /// /// /// This property is implemented using the "MUSICBRAINZ_ALBUMTYPE" item. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseType { get {return GetItemAsString ("MUSICBRAINZ_ALBUMTYPE");} set {SetValue ("MUSICBRAINZ_ALBUMTYPE", value);} } /// /// Gets and sets the MusicBrainz ReleaseCountry of the media /// represented by the current instance. /// /// /// A object containing the MusicBrainz /// ReleaseCountry for the media represented by the current instance /// or if no value is present. /// /// /// This property is implemented using the "RELEASECOUNTRY" item. /// http://musicbrainz.org/doc/PicardTagMapping /// public override string MusicBrainzReleaseCountry { get {return GetItemAsString ("RELEASECOUNTRY");} set {SetValue ("RELEASECOUNTRY", value);} } /// /// Gets and sets a collection of pictures associated with /// the media represented by the current instance. /// /// /// A containing a collection of /// pictures associated with the media represented by the /// current instance or an empty array if none are present. /// /// /// This property is implemented using the "Cover Art" items /// and supports only one picture per type. /// public override IPicture [] Pictures { get { List pictures = new List (); for (int i = 0; i < picture_item_names.Length; i++) { Item item = GetItem ( picture_item_names [i]); if (item == null || item.Type != ItemType.Binary) continue; int index = item.Value.Find ( ByteVector.TextDelimiter ( StringType.UTF8)); if (index < 0) continue; Picture pic = new Picture ( item.Value.Mid (index + 1)); pic.Description = item.Value .ToString (StringType.UTF8, 0, index); pic.Type = (PictureType) i; pictures.Add (pic); } return pictures.ToArray (); } set { foreach (string item_name in picture_item_names) RemoveItem (item_name); if (value == null || value.Length == 0) return; foreach (IPicture pic in value) { int type = (int) pic.Type; if (type >= picture_item_names.Length) type = 0; string name = picture_item_names [type]; if (GetItem (name) != null) continue; ByteVector data = ByteVector .FromString ( pic.Description, StringType.UTF8); data.Add (ByteVector.TextDelimiter ( StringType.UTF8)); data.Add (pic.Data); SetItem (new Item (name, data)); } } } /// /// Gets whether or not the current instance is empty. /// /// /// if the current instance does not /// any values. Otherwise . /// public override bool IsEmpty { get {return items.Count == 0;} } /// /// Clears the values stored in the current instance. /// public override void Clear () { items.Clear (); } /// /// Copies the values from the current instance to another /// , optionally overwriting /// existing values. /// /// /// A object containing the target /// tag to copy values to. /// /// /// A specifying whether or not to copy /// values over existing one. /// /// /// If is of type a complete copy of all values /// will be performed. Otherwise, only standard values will /// be copied. /// /// /// is . /// public override void CopyTo (TagLib.Tag target, bool overwrite) { if (target == null) throw new ArgumentNullException ("target"); TagLib.Ape.Tag match = target as TagLib.Ape.Tag; if (match == null) { base.CopyTo (target, overwrite); return; } foreach (Item item in items) { if (!overwrite && match.GetItem (item.Key) != null) continue; match.items.Add (item.Clone ()); } } #endregion } } f-spot-0.8.2/lib/TagLib/TagLib/src/TagLib/Ape/Footer.cs0000644000175000017500000002574311462100402022537 0ustar00rubenruben00000000000000// // Footer.cs: Provides a representation of an APEv2 tag footer which can be read // from and written to disk. // // Author: // Brian Nickel (brian.nickel@gmail.com) // // Original Source: // apefooter.cpp from TagLib // // Copyright (C) 2005-2007 Brian Nickel // Copyright (C) 2004 Allan Sandfeld Jensen (Original Implementation) // copyright (C) 2002, 2003 Scott Wheeler (Original Implementation) // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License version // 2.1 as published by the Free Software Foundation. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA // using System; namespace TagLib.Ape { #region Enums /// /// Indicates the flags applied to a object. /// [Flags] public enum FooterFlags : uint { /// /// The tag lacks a footer object. /// FooterAbsent = 0x40000000, /// /// The footer is actually a header. /// IsHeader = 0x20000000, /// /// The tag contains a header. /// HeaderPresent = 0x80000000 } #endregion /// /// This structure provides a representation of an APEv2 tag footer /// which can be read from and written to disk. /// public struct Footer : IEquatable